System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact f7ee204fb549cd4c0b481c0e12c9285cb4f344ca:


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 52 65 74 75 72  he phrase. Retur
1380: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
1390: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
13a0: 6e 20 65 72 72 6f 72 0d 0a 2a 2a 20 20 20 63 6f  n error..**   co
13b0: 64 65 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f  de (i.e. SQLITE_
13c0: 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20 65 72 72  NOMEM) if an err
13d0: 6f 72 20 6f 63 63 75 72 73 2e 0d 0a 2a 2a 0d 0a  or occurs...**..
13e0: 2a 2a 20 20 20 54 68 69 73 20 41 50 49 20 63 61  **   This API ca
13f0: 6e 20 62 65 20 71 75 69 74 65 20 73 6c 6f 77 20  n be quite slow 
1400: 69 66 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  if used with an 
1410: 46 54 53 35 20 74 61 62 6c 65 20 63 72 65 61 74  FTS5 table creat
1420: 65 64 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20  ed with the..** 
1430: 20 20 22 64 65 74 61 69 6c 3d 6e 6f 6e 65 22 20    "detail=none" 
1440: 6f 72 20 22 64 65 74 61 69 6c 3d 63 6f 6c 75 6d  or "detail=colum
1450: 6e 22 20 6f 70 74 69 6f 6e 2e 20 0d 0a 2a 2a 0d  n" option. ..**.
1460: 0a 2a 2a 20 78 52 6f 77 69 64 3a 0d 0a 2a 2a 20  .** xRowid:..** 
1470: 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 72 6f    Returns the ro
1480: 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
1490: 6e 74 20 72 6f 77 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  nt row...**..** 
14a0: 78 54 6f 6b 65 6e 69 7a 65 3a 0d 0a 2a 2a 20 20  xTokenize:..**  
14b0: 20 54 6f 6b 65 6e 69 7a 65 20 74 65 78 74 20 75   Tokenize text u
14c0: 73 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 69 7a  sing the tokeniz
14d0: 65 72 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  er belonging to 
14e0: 74 68 65 20 46 54 53 35 20 74 61 62 6c 65 2e 0d  the FTS5 table..
14f0: 0a 2a 2a 0d 0a 2a 2a 20 78 51 75 65 72 79 50 68  .**..** xQueryPh
1500: 72 61 73 65 28 70 46 74 73 35 2c 20 69 50 68 72  rase(pFts5, iPhr
1510: 61 73 65 2c 20 70 55 73 65 72 44 61 74 61 2c 20  ase, pUserData, 
1520: 78 43 61 6c 6c 62 61 63 6b 29 3a 0d 0a 2a 2a 20  xCallback):..** 
1530: 20 20 54 68 69 73 20 41 50 49 20 66 75 6e 63 74    This API funct
1540: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 71  ion is used to q
1550: 75 65 72 79 20 74 68 65 20 46 54 53 20 74 61 62  uery the FTS tab
1560: 6c 65 20 66 6f 72 20 70 68 72 61 73 65 20 69 50  le for phrase iP
1570: 68 72 61 73 65 0d 0a 2a 2a 20 20 20 6f 66 20 74  hrase..**   of t
1580: 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
1590: 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  . Specifically, 
15a0: 61 20 71 75 65 72 79 20 65 71 75 69 76 61 6c 65  a query equivale
15b0: 6e 74 20 74 6f 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20  nt to:..**..**  
15c0: 20 20 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 66 74       ... FROM ft
15d0: 73 74 61 62 6c 65 20 57 48 45 52 45 20 66 74 73  stable WHERE fts
15e0: 74 61 62 6c 65 20 4d 41 54 43 48 20 24 70 20 4f  table MATCH $p O
15f0: 52 44 45 52 20 42 59 20 72 6f 77 69 64 0d 0a 2a  RDER BY rowid..*
1600: 2a 0d 0a 2a 2a 20 20 20 77 69 74 68 20 24 70 20  *..**   with $p 
1610: 73 65 74 20 74 6f 20 61 20 70 68 72 61 73 65 20  set to a phrase 
1620: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
1630: 65 20 70 68 72 61 73 65 20 69 50 68 72 61 73 65  e phrase iPhrase
1640: 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 20 20 63 75   of the..**   cu
1650: 72 72 65 6e 74 20 71 75 65 72 79 20 69 73 20 65  rrent query is e
1660: 78 65 63 75 74 65 64 2e 20 41 6e 79 20 63 6f 6c  xecuted. Any col
1670: 75 6d 6e 20 66 69 6c 74 65 72 20 74 68 61 74 20  umn filter that 
1680: 61 70 70 6c 69 65 73 20 74 6f 0d 0a 2a 2a 20 20  applies to..**  
1690: 20 70 68 72 61 73 65 20 69 50 68 72 61 73 65 20   phrase iPhrase 
16a0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  of the current q
16b0: 75 65 72 79 20 69 73 20 69 6e 63 6c 75 64 65 64  uery is included
16c0: 20 69 6e 20 24 70 2e 20 46 6f 72 20 65 61 63 68   in $p. For each
16d0: 20 0d 0a 2a 2a 20 20 20 72 6f 77 20 76 69 73 69   ..**   row visi
16e0: 74 65 64 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ted, the callbac
16f0: 6b 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65  k function passe
1700: 64 20 61 73 20 74 68 65 20 66 6f 75 72 74 68 20  d as the fourth 
1710: 61 72 67 75 6d 65 6e 74 20 0d 0a 2a 2a 20 20 20  argument ..**   
1720: 69 73 20 69 6e 76 6f 6b 65 64 2e 20 54 68 65 20  is invoked. The 
1730: 63 6f 6e 74 65 78 74 20 61 6e 64 20 41 50 49 20  context and API 
1740: 6f 62 6a 65 63 74 73 20 70 61 73 73 65 64 20 74  objects passed t
1750: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 0d  o the callback .
1760: 0a 2a 2a 20 20 20 66 75 6e 63 74 69 6f 6e 20 6d  .**   function m
1770: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  ay be used to ac
1780: 63 65 73 73 20 74 68 65 20 70 72 6f 70 65 72 74  cess the propert
1790: 69 65 73 20 6f 66 20 65 61 63 68 20 6d 61 74 63  ies of each matc
17a0: 68 65 64 20 72 6f 77 2e 0d 0a 2a 2a 20 20 20 49  hed row...**   I
17b0: 6e 76 6f 6b 69 6e 67 20 41 70 69 2e 78 55 73 65  nvoking Api.xUse
17c0: 72 44 61 74 61 28 29 20 72 65 74 75 72 6e 73 20  rData() returns 
17d0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f  a copy of the po
17e0: 69 6e 74 65 72 20 70 61 73 73 65 64 20 61 73 20  inter passed as 
17f0: 0d 0a 2a 2a 20 20 20 74 68 65 20 74 68 69 72 64  ..**   the third
1800: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 55 73   argument to pUs
1810: 65 72 44 61 74 61 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  erData...**..** 
1820: 20 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63    If the callbac
1830: 6b 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  k function retur
1840: 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68  ns any value oth
1850: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1860: 4b 2c 20 74 68 65 0d 0a 2a 2a 20 20 20 71 75 65  K, the..**   que
1870: 72 79 20 69 73 20 61 62 61 6e 64 6f 6e 65 64 20  ry is abandoned 
1880: 61 6e 64 20 74 68 65 20 78 51 75 65 72 79 50 68  and the xQueryPh
1890: 72 61 73 65 20 66 75 6e 63 74 69 6f 6e 20 72 65  rase function re
18a0: 74 75 72 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c  turns immediatel
18b0: 79 2e 0d 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  y...**   If the 
18c0: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
18d0: 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2c 20 78  s SQLITE_DONE, x
18e0: 51 75 65 72 79 50 68 72 61 73 65 20 72 65 74 75  QueryPhrase retu
18f0: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0d 0a  rns SQLITE_OK...
1900: 2a 2a 20 20 20 4f 74 68 65 72 77 69 73 65 2c 20  **   Otherwise, 
1910: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1920: 73 20 70 72 6f 70 61 67 61 74 65 64 20 75 70 77  s propagated upw
1930: 61 72 64 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  ards...**..**   
1940: 49 66 20 74 68 65 20 71 75 65 72 79 20 72 75 6e  If the query run
1950: 73 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  s to completion 
1960: 77 69 74 68 6f 75 74 20 69 6e 63 69 64 65 6e 74  without incident
1970: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1980: 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 20 20 20 4f  eturned...**   O
1990: 72 2c 20 69 66 20 73 6f 6d 65 20 65 72 72 6f 72  r, if some error
19a0: 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 74   occurs before t
19b0: 68 65 20 71 75 65 72 79 20 63 6f 6d 70 6c 65 74  he query complet
19c0: 65 73 20 6f 72 20 69 73 20 61 62 6f 72 74 65 64  es or is aborted
19d0: 20 62 79 0d 0a 2a 2a 20 20 20 74 68 65 20 63 61   by..**   the ca
19e0: 6c 6c 62 61 63 6b 2c 20 61 6e 20 53 51 4c 69 74  llback, an SQLit
19f0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1a00: 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a  returned...**..*
1a10: 2a 0d 0a 2a 2a 20 78 53 65 74 41 75 78 64 61 74  *..** xSetAuxdat
1a20: 61 28 70 46 74 73 35 2c 20 70 41 75 78 2c 20 78  a(pFts5, pAux, x
1a30: 44 65 6c 65 74 65 29 0d 0a 2a 2a 0d 0a 2a 2a 20  Delete)..**..** 
1a40: 20 20 53 61 76 65 20 74 68 65 20 70 6f 69 6e 74    Save the point
1a50: 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
1a60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1a70: 20 61 73 20 74 68 65 20 65 78 74 65 6e 73 69 6f   as the extensio
1a80: 6e 20 66 75 6e 63 74 69 6f 6e 73 20 0d 0a 2a 2a  n functions ..**
1a90: 20 20 20 22 61 75 78 69 6c 69 61 72 79 20 64 61     "auxiliary da
1aa0: 74 61 22 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ta". The pointer
1ab0: 20 6d 61 79 20 74 68 65 6e 20 62 65 20 72 65 74   may then be ret
1ac0: 72 69 65 76 65 64 20 62 79 20 74 68 65 20 63 75  rieved by the cu
1ad0: 72 72 65 6e 74 20 6f 72 20 61 6e 79 0d 0a 2a 2a  rrent or any..**
1ae0: 20 20 20 66 75 74 75 72 65 20 69 6e 76 6f 63 61     future invoca
1af0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
1b00: 20 66 74 73 35 20 65 78 74 65 6e 73 69 6f 6e 20   fts5 extension 
1b10: 66 75 6e 63 74 69 6f 6e 20 6d 61 64 65 20 61 73  function made as
1b20: 20 70 61 72 74 20 6f 66 0d 0a 2a 2a 20 20 20 6f   part of..**   o
1b30: 66 20 74 68 65 20 73 61 6d 65 20 4d 41 54 43 48  f the same MATCH
1b40: 20 71 75 65 72 79 20 75 73 69 6e 67 20 74 68 65   query using the
1b50: 20 78 47 65 74 41 75 78 64 61 74 61 28 29 20 41   xGetAuxdata() A
1b60: 50 49 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 45 61  PI...**..**   Ea
1b70: 63 68 20 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e  ch extension fun
1b80: 63 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 63 61 74  ction is allocat
1b90: 65 64 20 61 20 73 69 6e 67 6c 65 20 61 75 78 69  ed a single auxi
1ba0: 6c 69 61 72 79 20 64 61 74 61 20 73 6c 6f 74 20  liary data slot 
1bb0: 66 6f 72 0d 0a 2a 2a 20 20 20 65 61 63 68 20 46  for..**   each F
1bc0: 54 53 20 71 75 65 72 79 20 28 4d 41 54 43 48 20  TS query (MATCH 
1bd0: 65 78 70 72 65 73 73 69 6f 6e 29 2e 20 49 66 20  expression). If 
1be0: 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 75  the extension fu
1bf0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1c00: 64 20 0d 0a 2a 2a 20 20 20 6d 6f 72 65 20 74 68  d ..**   more th
1c10: 61 6e 20 6f 6e 63 65 20 66 6f 72 20 61 20 73 69  an once for a si
1c20: 6e 67 6c 65 20 46 54 53 20 71 75 65 72 79 2c 20  ngle FTS query, 
1c30: 74 68 65 6e 20 61 6c 6c 20 69 6e 76 6f 63 61 74  then all invocat
1c40: 69 6f 6e 73 20 73 68 61 72 65 20 61 20 0d 0a 2a  ions share a ..*
1c50: 2a 20 20 20 73 69 6e 67 6c 65 20 61 75 78 69 6c  *   single auxil
1c60: 69 61 72 79 20 64 61 74 61 20 63 6f 6e 74 65 78  iary data contex
1c70: 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 66 20  t...**..**   If 
1c80: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
1c90: 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 64 61   an auxiliary da
1ca0: 74 61 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20  ta pointer when 
1cb0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1cc0: 0d 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 2c 20  ..**   invoked, 
1cd0: 74 68 65 6e 20 69 74 20 69 73 20 72 65 70 6c 61  then it is repla
1ce0: 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 70  ced by the new p
1cf0: 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 78 44  ointer. If an xD
1d00: 65 6c 65 74 65 20 63 61 6c 6c 62 61 63 6b 0d 0a  elete callback..
1d10: 2a 2a 20 20 20 77 61 73 20 73 70 65 63 69 66 69  **   was specifi
1d20: 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
1d30: 65 20 6f 72 69 67 69 6e 61 6c 20 70 6f 69 6e 74  e original point
1d40: 65 72 2c 20 69 74 20 69 73 20 69 6e 76 6f 6b 65  er, it is invoke
1d50: 64 20 61 74 20 74 68 69 73 0d 0a 2a 2a 20 20 20  d at this..**   
1d60: 70 6f 69 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20  point...**..**  
1d70: 20 54 68 65 20 78 44 65 6c 65 74 65 20 63 61 6c   The xDelete cal
1d80: 6c 62 61 63 6b 2c 20 69 66 20 6f 6e 65 20 69 73  lback, if one is
1d90: 20 73 70 65 63 69 66 69 65 64 2c 20 69 73 20 61   specified, is a
1da0: 6c 73 6f 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74  lso invoked on t
1db0: 68 65 0d 0a 2a 2a 20 20 20 61 75 78 69 6c 69 61  he..**   auxilia
1dc0: 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 20  ry data pointer 
1dd0: 61 66 74 65 72 20 74 68 65 20 46 54 53 35 20 71  after the FTS5 q
1de0: 75 65 72 79 20 68 61 73 20 66 69 6e 69 73 68 65  uery has finishe
1df0: 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 66 20  d...**..**   If 
1e00: 61 6e 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 61  an error (e.g. a
1e10: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29  n OOM condition)
1e20: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1e30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
1e40: 0d 0a 2a 2a 20 20 20 74 68 65 20 61 75 78 69 6c  ..**   the auxil
1e50: 69 61 72 79 20 64 61 74 61 20 69 73 20 73 65 74  iary data is set
1e60: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
1e70: 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
1e80: 6e 65 64 2e 20 49 66 20 74 68 65 0d 0a 2a 2a 20  ned. If the..** 
1e90: 20 20 78 44 65 6c 65 74 65 20 70 61 72 61 6d 65    xDelete parame
1ea0: 74 65 72 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c  ter was not NULL
1eb0: 2c 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  , it is invoked 
1ec0: 6f 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  on the auxiliary
1ed0: 20 64 61 74 61 0d 0a 2a 2a 20 20 20 70 6f 69 6e   data..**   poin
1ee0: 74 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  ter before retur
1ef0: 6e 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 0d 0a 2a  ning...**..**..*
1f00: 2a 20 78 47 65 74 41 75 78 64 61 74 61 28 70 46  * xGetAuxdata(pF
1f10: 74 73 35 2c 20 62 43 6c 65 61 72 29 0d 0a 2a 2a  ts5, bClear)..**
1f20: 0d 0a 2a 2a 20 20 20 52 65 74 75 72 6e 73 20 74  ..**   Returns t
1f30: 68 65 20 63 75 72 72 65 6e 74 20 61 75 78 69 6c  he current auxil
1f40: 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
1f50: 72 20 66 6f 72 20 74 68 65 20 66 74 73 35 20 65  r for the fts5 e
1f60: 78 74 65 6e 73 69 6f 6e 20 0d 0a 2a 2a 20 20 20  xtension ..**   
1f70: 66 75 6e 63 74 69 6f 6e 2e 20 53 65 65 20 74 68  function. See th
1f80: 65 20 78 53 65 74 41 75 78 64 61 74 61 28 29 20  e xSetAuxdata() 
1f90: 6d 65 74 68 6f 64 20 66 6f 72 20 64 65 74 61 69  method for detai
1fa0: 6c 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 66  ls...**..**   If
1fb0: 20 74 68 65 20 62 43 6c 65 61 72 20 61 72 67 75   the bClear argu
1fc0: 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
1fd0: 2c 20 74 68 65 6e 20 74 68 65 20 61 75 78 69 6c  , then the auxil
1fe0: 69 61 72 79 20 64 61 74 61 20 69 73 20 63 6c 65  iary data is cle
1ff0: 61 72 65 64 0d 0a 2a 2a 20 20 20 28 73 65 74 20  ared..**   (set 
2000: 74 6f 20 4e 55 4c 4c 29 20 62 65 66 6f 72 65 20  to NULL) before 
2010: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2020: 74 75 72 6e 73 2e 20 49 6e 20 74 68 69 73 20 63  turns. In this c
2030: 61 73 65 20 74 68 65 20 78 44 65 6c 65 74 65 2c  ase the xDelete,
2040: 0d 0a 2a 2a 20 20 20 69 66 20 61 6e 79 2c 20 69  ..**   if any, i
2050: 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 2e 0d 0a  s not invoked...
2060: 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 78 52 6f 77 43  **..**..** xRowC
2070: 6f 75 6e 74 28 70 46 74 73 35 2c 20 70 6e 52 6f  ount(pFts5, pnRo
2080: 77 29 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 69  w)..**..**   Thi
2090: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
20a0: 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
20b0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
20c0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
20d0: 61 62 6c 65 2e 0d 0a 2a 2a 20 20 20 49 6e 20 6f  able...**   In o
20e0: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
20f0: 73 61 6d 65 20 76 61 6c 75 65 20 74 68 61 74 20  same value that 
2100: 77 6f 75 6c 64 20 62 65 20 72 65 74 75 72 6e 65  would be returne
2110: 64 20 62 79 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  d by:..**..**   
2120: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
2130: 74 28 2a 29 20 46 52 4f 4d 20 66 74 73 74 61 62  t(*) FROM ftstab
2140: 6c 65 3b 0d 0a 2a 2a 0d 0a 2a 2a 20 78 50 68 72  le;..**..** xPhr
2150: 61 73 65 46 69 72 73 74 28 29 0d 0a 2a 2a 20 20  aseFirst()..**  
2160: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2170: 73 20 75 73 65 64 2c 20 61 6c 6f 6e 67 20 77 69  s used, along wi
2180: 74 68 20 74 79 70 65 20 46 74 73 35 50 68 72 61  th type Fts5Phra
2190: 73 65 49 74 65 72 20 61 6e 64 20 74 68 65 20 78  seIter and the x
21a0: 50 68 72 61 73 65 4e 65 78 74 0d 0a 2a 2a 20 20  PhraseNext..**  
21b0: 20 6d 65 74 68 6f 64 2c 20 74 6f 20 69 74 65 72   method, to iter
21c0: 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
21d0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 61 20 73  instances of a s
21e0: 69 6e 67 6c 65 20 71 75 65 72 79 20 70 68 72 61  ingle query phra
21f0: 73 65 20 77 69 74 68 69 6e 0d 0a 2a 2a 20 20 20  se within..**   
2200: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
2210: 20 54 68 69 73 20 69 73 20 74 68 65 20 73 61 6d   This is the sam
2220: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73  e information as
2230: 20 69 73 20 61 63 63 65 73 73 69 62 6c 65 20 76   is accessible v
2240: 69 61 20 74 68 65 0d 0a 2a 2a 20 20 20 78 49 6e  ia the..**   xIn
2250: 73 74 43 6f 75 6e 74 2f 78 49 6e 73 74 20 41 50  stCount/xInst AP
2260: 49 73 2e 20 57 68 69 6c 65 20 74 68 65 20 78 49  Is. While the xI
2270: 6e 73 74 43 6f 75 6e 74 2f 78 49 6e 73 74 20 41  nstCount/xInst A
2280: 50 49 73 20 61 72 65 20 6d 6f 72 65 20 63 6f 6e  PIs are more con
2290: 76 65 6e 69 65 6e 74 0d 0a 2a 2a 20 20 20 74 6f  venient..**   to
22a0: 20 75 73 65 2c 20 74 68 69 73 20 41 50 49 20 6d   use, this API m
22b0: 61 79 20 62 65 20 66 61 73 74 65 72 20 75 6e 64  ay be faster und
22c0: 65 72 20 73 6f 6d 65 20 63 69 72 63 75 6d 73 74  er some circumst
22d0: 61 6e 63 65 73 2e 20 54 6f 20 69 74 65 72 61 74  ances. To iterat
22e0: 65 20 0d 0a 2a 2a 20 20 20 74 68 72 6f 75 67 68  e ..**   through
22f0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 70 68   instances of ph
2300: 72 61 73 65 20 69 50 68 72 61 73 65 2c 20 75 73  rase iPhrase, us
2310: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
2320: 63 6f 64 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  code:..**..**   
2330: 20 20 20 20 46 74 73 35 50 68 72 61 73 65 49 74      Fts5PhraseIt
2340: 65 72 20 69 74 65 72 3b 0d 0a 2a 2a 20 20 20 20  er iter;..**    
2350: 20 20 20 69 6e 74 20 69 43 6f 6c 2c 20 69 4f 66     int iCol, iOf
2360: 66 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72  f;..**       for
2370: 28 70 41 70 69 2d 3e 78 50 68 72 61 73 65 46 69  (pApi->xPhraseFi
2380: 72 73 74 28 70 46 74 73 2c 20 69 50 68 72 61 73  rst(pFts, iPhras
2390: 65 2c 20 26 69 74 65 72 2c 20 26 69 43 6f 6c 2c  e, &iter, &iCol,
23a0: 20 26 69 4f 66 66 29 3b 0d 0a 2a 2a 20 20 20 20   &iOff);..**    
23b0: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 3b 0d         iCol>=0;.
23c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 41  .**           pA
23d0: 70 69 2d 3e 78 50 68 72 61 73 65 4e 65 78 74 28  pi->xPhraseNext(
23e0: 70 46 74 73 2c 20 26 69 74 65 72 2c 20 26 69 43  pFts, &iter, &iC
23f0: 6f 6c 2c 20 26 69 4f 66 66 29 0d 0a 2a 2a 20 20  ol, &iOff)..**  
2400: 20 20 20 20 20 29 7b 0d 0a 2a 2a 20 20 20 20 20       ){..**     
2410: 20 20 20 20 2f 2f 20 41 6e 20 69 6e 73 74 61 6e      // An instan
2420: 63 65 20 6f 66 20 70 68 72 61 73 65 20 69 50 68  ce of phrase iPh
2430: 72 61 73 65 20 61 74 20 6f 66 66 73 65 74 20 69  rase at offset i
2440: 4f 66 66 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 43  Off of column iC
2450: 6f 6c 0d 0a 2a 2a 20 20 20 20 20 20 20 7d 0d 0a  ol..**       }..
2460: 2a 2a 0d 0a 2a 2a 20 20 20 54 68 65 20 46 74 73  **..**   The Fts
2470: 35 50 68 72 61 73 65 49 74 65 72 20 73 74 72 75  5PhraseIter stru
2480: 63 74 75 72 65 20 69 73 20 64 65 66 69 6e 65 64  cture is defined
2490: 20 61 62 6f 76 65 2e 20 41 70 70 6c 69 63 61 74   above. Applicat
24a0: 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0d  ions should not.
24b0: 0a 2a 2a 20 20 20 6d 6f 64 69 66 79 20 74 68 69  .**   modify thi
24c0: 73 20 73 74 72 75 63 74 75 72 65 20 64 69 72 65  s structure dire
24d0: 63 74 6c 79 20 2d 20 69 74 20 73 68 6f 75 6c 64  ctly - it should
24e0: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61 73   only be used as
24f0: 20 73 68 6f 77 6e 20 61 62 6f 76 65 0d 0a 2a 2a   shown above..**
2500: 20 20 20 77 69 74 68 20 74 68 65 20 78 50 68 72     with the xPhr
2510: 61 73 65 46 69 72 73 74 28 29 20 61 6e 64 20 78  aseFirst() and x
2520: 50 68 72 61 73 65 4e 65 78 74 28 29 20 41 50 49  PhraseNext() API
2530: 20 6d 65 74 68 6f 64 73 20 28 61 6e 64 20 62 79   methods (and by
2540: 0d 0a 2a 2a 20 20 20 78 50 68 72 61 73 65 46 69  ..**   xPhraseFi
2550: 72 73 74 43 6f 6c 75 6d 6e 28 29 20 61 6e 64 20  rstColumn() and 
2560: 78 50 68 72 61 73 65 4e 65 78 74 43 6f 6c 75 6d  xPhraseNextColum
2570: 6e 28 29 20 61 73 20 69 6c 6c 75 73 74 72 61 74  n() as illustrat
2580: 65 64 20 62 65 6c 6f 77 29 2e 0d 0a 2a 2a 0d 0a  ed below)...**..
2590: 2a 2a 20 20 20 54 68 69 73 20 41 50 49 20 63 61  **   This API ca
25a0: 6e 20 62 65 20 71 75 69 74 65 20 73 6c 6f 77 20  n be quite slow 
25b0: 69 66 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  if used with an 
25c0: 46 54 53 35 20 74 61 62 6c 65 20 63 72 65 61 74  FTS5 table creat
25d0: 65 64 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20  ed with the..** 
25e0: 20 20 22 64 65 74 61 69 6c 3d 6e 6f 6e 65 22 20    "detail=none" 
25f0: 6f 72 20 22 64 65 74 61 69 6c 3d 63 6f 6c 75 6d  or "detail=colum
2600: 6e 22 20 6f 70 74 69 6f 6e 2e 20 49 66 20 74 68  n" option. If th
2610: 65 20 46 54 53 35 20 74 61 62 6c 65 20 69 73 20  e FTS5 table is 
2620: 63 72 65 61 74 65 64 20 0d 0a 2a 2a 20 20 20 77  created ..**   w
2630: 69 74 68 20 65 69 74 68 65 72 20 22 64 65 74 61  ith either "deta
2640: 69 6c 3d 6e 6f 6e 65 22 20 6f 72 20 22 64 65 74  il=none" or "det
2650: 61 69 6c 3d 63 6f 6c 75 6d 6e 22 20 61 6e 64 20  ail=column" and 
2660: 22 63 6f 6e 74 65 6e 74 3d 22 20 6f 70 74 69 6f  "content=" optio
2670: 6e 20 0d 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 69  n ..**   (i.e. i
2680: 66 20 69 74 20 69 73 20 61 20 63 6f 6e 74 65 6e  f it is a conten
2690: 74 6c 65 73 73 20 74 61 62 6c 65 29 2c 20 74 68  tless table), th
26a0: 65 6e 20 74 68 69 73 20 41 50 49 20 61 6c 77 61  en this API alwa
26b0: 79 73 20 69 74 65 72 61 74 65 73 0d 0a 2a 2a 20  ys iterates..** 
26c0: 20 20 74 68 72 6f 75 67 68 20 61 6e 20 65 6d 70    through an emp
26d0: 74 79 20 73 65 74 20 28 61 6c 6c 20 63 61 6c 6c  ty set (all call
26e0: 73 20 74 6f 20 78 50 68 72 61 73 65 46 69 72 73  s to xPhraseFirs
26f0: 74 28 29 20 73 65 74 20 69 43 6f 6c 20 74 6f 20  t() set iCol to 
2700: 2d 31 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 78 50 68  -1)...**..** xPh
2710: 72 61 73 65 4e 65 78 74 28 29 0d 0a 2a 2a 20 20  raseNext()..**  
2720: 20 53 65 65 20 78 50 68 72 61 73 65 46 69 72 73   See xPhraseFirs
2730: 74 20 61 62 6f 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a  t above...**..**
2740: 20 78 50 68 72 61 73 65 46 69 72 73 74 43 6f 6c   xPhraseFirstCol
2750: 75 6d 6e 28 29 0d 0a 2a 2a 20 20 20 54 68 69 73  umn()..**   This
2760: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 78 50   function and xP
2770: 68 72 61 73 65 4e 65 78 74 43 6f 6c 75 6d 6e 28  hraseNextColumn(
2780: 29 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f  ) are similar to
2790: 20 74 68 65 20 78 50 68 72 61 73 65 46 69 72 73   the xPhraseFirs
27a0: 74 28 29 0d 0a 2a 2a 20 20 20 61 6e 64 20 78 50  t()..**   and xP
27b0: 68 72 61 73 65 4e 65 78 74 28 29 20 41 50 49 73  hraseNext() APIs
27c0: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
27d0: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  . The difference
27e0: 20 69 73 20 74 68 61 74 20 69 6e 73 74 65 61 64   is that instead
27f0: 0d 0a 2a 2a 20 20 20 6f 66 20 69 74 65 72 61 74  ..**   of iterat
2800: 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
2810: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 61 20 70  instances of a p
2820: 68 72 61 73 65 20 69 6e 20 74 68 65 20 63 75 72  hrase in the cur
2830: 72 65 6e 74 20 72 6f 77 2c 20 74 68 65 73 65 0d  rent row, these.
2840: 0a 2a 2a 20 20 20 41 50 49 73 20 61 72 65 20 75  .**   APIs are u
2850: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
2860: 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6f  hrough the set o
2870: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2880: 20 63 75 72 72 65 6e 74 20 72 6f 77 0d 0a 2a 2a   current row..**
2890: 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20     that contain 
28a0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 73 74  one or more inst
28b0: 61 6e 63 65 73 20 6f 66 20 61 20 73 70 65 63 69  ances of a speci
28c0: 66 69 65 64 20 70 68 72 61 73 65 2e 20 46 6f 72  fied phrase. For
28d0: 20 65 78 61 6d 70 6c 65 3a 0d 0a 2a 2a 0d 0a 2a   example:..**..*
28e0: 2a 20 20 20 20 20 20 20 46 74 73 35 50 68 72 61  *       Fts5Phra
28f0: 73 65 49 74 65 72 20 69 74 65 72 3b 0d 0a 2a 2a  seIter iter;..**
2900: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b         int iCol;
2910: 0d 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72 28 70  ..**       for(p
2920: 41 70 69 2d 3e 78 50 68 72 61 73 65 46 69 72 73  Api->xPhraseFirs
2930: 74 43 6f 6c 75 6d 6e 28 70 46 74 73 2c 20 69 50  tColumn(pFts, iP
2940: 68 72 61 73 65 2c 20 26 69 74 65 72 2c 20 26 69  hrase, &iter, &i
2950: 43 6f 6c 29 3b 0d 0a 2a 2a 20 20 20 20 20 20 20  Col);..**       
2960: 20 20 20 20 69 43 6f 6c 3e 3d 30 3b 0d 0a 2a 2a      iCol>=0;..**
2970: 20 20 20 20 20 20 20 20 20 20 20 70 41 70 69 2d             pApi-
2980: 3e 78 50 68 72 61 73 65 4e 65 78 74 43 6f 6c 75  >xPhraseNextColu
2990: 6d 6e 28 70 46 74 73 2c 20 26 69 74 65 72 2c 20  mn(pFts, &iter, 
29a0: 26 69 43 6f 6c 29 0d 0a 2a 2a 20 20 20 20 20 20  &iCol)..**      
29b0: 20 29 7b 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20   ){..**         
29c0: 2f 2f 20 43 6f 6c 75 6d 6e 20 69 43 6f 6c 20 63  // Column iCol c
29d0: 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
29e0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
29f0: 20 70 68 72 61 73 65 20 69 50 68 72 61 73 65 0d   phrase iPhrase.
2a00: 0a 2a 2a 20 20 20 20 20 20 20 7d 0d 0a 2a 2a 0d  .**       }..**.
2a10: 0a 2a 2a 20 20 20 54 68 69 73 20 41 50 49 20 63  .**   This API c
2a20: 61 6e 20 62 65 20 71 75 69 74 65 20 73 6c 6f 77  an be quite slow
2a30: 20 69 66 20 75 73 65 64 20 77 69 74 68 20 61 6e   if used with an
2a40: 20 46 54 53 35 20 74 61 62 6c 65 20 63 72 65 61   FTS5 table crea
2a50: 74 65 64 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a  ted with the..**
2a60: 20 20 20 22 64 65 74 61 69 6c 3d 6e 6f 6e 65 22     "detail=none"
2a70: 20 6f 70 74 69 6f 6e 2e 20 49 66 20 74 68 65 20   option. If the 
2a80: 46 54 53 35 20 74 61 62 6c 65 20 69 73 20 63 72  FTS5 table is cr
2a90: 65 61 74 65 64 20 77 69 74 68 20 65 69 74 68 65  eated with eithe
2aa0: 72 20 0d 0a 2a 2a 20 20 20 22 64 65 74 61 69 6c  r ..**   "detail
2ab0: 3d 6e 6f 6e 65 22 20 22 63 6f 6e 74 65 6e 74 3d  =none" "content=
2ac0: 22 20 6f 70 74 69 6f 6e 20 28 69 2e 65 2e 20 69  " option (i.e. i
2ad0: 66 20 69 74 20 69 73 20 61 20 63 6f 6e 74 65 6e  f it is a conten
2ae0: 74 6c 65 73 73 20 74 61 62 6c 65 29 2c 20 0d 0a  tless table), ..
2af0: 2a 2a 20 20 20 74 68 65 6e 20 74 68 69 73 20 41  **   then this A
2b00: 50 49 20 61 6c 77 61 79 73 20 69 74 65 72 61 74  PI always iterat
2b10: 65 73 20 74 68 72 6f 75 67 68 20 61 6e 20 65 6d  es through an em
2b20: 70 74 79 20 73 65 74 20 28 61 6c 6c 20 63 61 6c  pty set (all cal
2b30: 6c 73 20 74 6f 20 0d 0a 2a 2a 20 20 20 78 50 68  ls to ..**   xPh
2b40: 72 61 73 65 46 69 72 73 74 43 6f 6c 75 6d 6e 28  raseFirstColumn(
2b50: 29 20 73 65 74 20 69 43 6f 6c 20 74 6f 20 2d 31  ) set iCol to -1
2b60: 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 65  )...**..**   The
2b70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 63 63   information acc
2b80: 65 73 73 65 64 20 75 73 69 6e 67 20 74 68 69 73  essed using this
2b90: 20 41 50 49 20 61 6e 64 20 69 74 73 20 63 6f 6d   API and its com
2ba0: 70 61 6e 69 6f 6e 0d 0a 2a 2a 20 20 20 78 50 68  panion..**   xPh
2bb0: 72 61 73 65 46 69 72 73 74 43 6f 6c 75 6d 6e 28  raseFirstColumn(
2bc0: 29 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 6f 62  ) may also be ob
2bd0: 74 61 69 6e 65 64 20 75 73 69 6e 67 20 78 50 68  tained using xPh
2be0: 72 61 73 65 46 69 72 73 74 2f 78 50 68 72 61 73  raseFirst/xPhras
2bf0: 65 4e 65 78 74 0d 0a 2a 2a 20 20 20 28 6f 72 20  eNext..**   (or 
2c00: 78 49 6e 73 74 2f 78 49 6e 73 74 43 6f 75 6e 74  xInst/xInstCount
2c10: 29 2e 20 54 68 65 20 63 68 69 65 66 20 61 64 76  ). The chief adv
2c20: 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 41  antage of this A
2c30: 50 49 20 69 73 20 74 68 61 74 20 69 74 20 69 73  PI is that it is
2c40: 0d 0a 2a 2a 20 20 20 73 69 67 6e 69 66 69 63 61  ..**   significa
2c50: 6e 74 6c 79 20 6d 6f 72 65 20 65 66 66 69 63 69  ntly more effici
2c60: 65 6e 74 20 74 68 61 6e 20 74 68 6f 73 65 20 61  ent than those a
2c70: 6c 74 65 72 6e 61 74 69 76 65 73 20 77 68 65 6e  lternatives when
2c80: 20 75 73 65 64 20 77 69 74 68 0d 0a 2a 2a 20 20   used with..**  
2c90: 20 22 64 65 74 61 69 6c 3d 63 6f 6c 75 6d 6e 22   "detail=column"
2ca0: 20 74 61 62 6c 65 73 2e 20 20 0d 0a 2a 2a 0d 0a   tables.  ..**..
2cb0: 2a 2a 20 78 50 68 72 61 73 65 4e 65 78 74 43 6f  ** xPhraseNextCo
2cc0: 6c 75 6d 6e 28 29 0d 0a 2a 2a 20 20 20 53 65 65  lumn()..**   See
2cd0: 20 78 50 68 72 61 73 65 46 69 72 73 74 43 6f 6c   xPhraseFirstCol
2ce0: 75 6d 6e 20 61 62 6f 76 65 2e 0d 0a 2a 2f 0d 0a  umn above...*/..
2cf0: 73 74 72 75 63 74 20 46 74 73 35 45 78 74 65 6e  struct Fts5Exten
2d00: 73 69 6f 6e 41 70 69 20 7b 0d 0a 20 20 69 6e 74  sionApi {..  int
2d10: 20 69 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20   iVersion;      
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d30: 43 75 72 72 65 6e 74 6c 79 20 61 6c 77 61 79 73  Currently always
2d40: 20 73 65 74 20 74 6f 20 33 20 2a 2f 0d 0a 0d 0a   set to 3 */....
2d50: 20 20 76 6f 69 64 20 2a 28 2a 78 55 73 65 72 44    void *(*xUserD
2d60: 61 74 61 29 28 46 74 73 35 43 6f 6e 74 65 78 74  ata)(Fts5Context
2d70: 2a 29 3b 0d 0a 0d 0a 20 20 69 6e 74 20 28 2a 78  *);....  int (*x
2d80: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 29 28 46 74 73  ColumnCount)(Fts
2d90: 35 43 6f 6e 74 65 78 74 2a 29 3b 0d 0a 20 20 69  5Context*);..  i
2da0: 6e 74 20 28 2a 78 52 6f 77 43 6f 75 6e 74 29 28  nt (*xRowCount)(
2db0: 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 73 71  Fts5Context*, sq
2dc0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e 52  lite3_int64 *pnR
2dd0: 6f 77 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 43  ow);..  int (*xC
2de0: 6f 6c 75 6d 6e 54 6f 74 61 6c 53 69 7a 65 29 28  olumnTotalSize)(
2df0: 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 69 6e  Fts5Context*, in
2e00: 74 20 69 43 6f 6c 2c 20 73 71 6c 69 74 65 33 5f  t iCol, sqlite3_
2e10: 69 6e 74 36 34 20 2a 70 6e 54 6f 6b 65 6e 29 3b  int64 *pnToken);
2e20: 0d 0a 0d 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b  ....  int (*xTok
2e30: 65 6e 69 7a 65 29 28 46 74 73 35 43 6f 6e 74 65  enize)(Fts5Conte
2e40: 78 74 2a 2c 20 0d 0a 20 20 20 20 63 6f 6e 73 74  xt*, ..    const
2e50: 20 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e   char *pText, in
2e60: 74 20 6e 54 65 78 74 2c 20 2f 2a 20 54 65 78 74  t nText, /* Text
2e70: 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0d   to tokenize */.
2e80: 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  .    void *pCtx,
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61     /* Context pa
2eb0: 73 73 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29  ssed to xToken()
2ec0: 20 2a 2f 0d 0a 20 20 20 20 69 6e 74 20 28 2a 78   */..    int (*x
2ed0: 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20 69 6e  Token)(void*, in
2ee0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  t, const char*, 
2ef0: 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 20 20  int, int, int)  
2f00: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b       /* Callback
2f10: 20 2a 2f 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20 69   */..  );....  i
2f20: 6e 74 20 28 2a 78 50 68 72 61 73 65 43 6f 75 6e  nt (*xPhraseCoun
2f30: 74 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 29  t)(Fts5Context*)
2f40: 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 50 68 72 61  ;..  int (*xPhra
2f50: 73 65 53 69 7a 65 29 28 46 74 73 35 43 6f 6e 74  seSize)(Fts5Cont
2f60: 65 78 74 2a 2c 20 69 6e 74 20 69 50 68 72 61 73  ext*, int iPhras
2f70: 65 29 3b 0d 0a 0d 0a 20 20 69 6e 74 20 28 2a 78  e);....  int (*x
2f80: 49 6e 73 74 43 6f 75 6e 74 29 28 46 74 73 35 43  InstCount)(Fts5C
2f90: 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 20 2a 70 6e  ontext*, int *pn
2fa0: 49 6e 73 74 29 3b 0d 0a 20 20 69 6e 74 20 28 2a  Inst);..  int (*
2fb0: 78 49 6e 73 74 29 28 46 74 73 35 43 6f 6e 74 65  xInst)(Fts5Conte
2fc0: 78 74 2a 2c 20 69 6e 74 20 69 49 64 78 2c 20 69  xt*, int iIdx, i
2fd0: 6e 74 20 2a 70 69 50 68 72 61 73 65 2c 20 69 6e  nt *piPhrase, in
2fe0: 74 20 2a 70 69 43 6f 6c 2c 20 69 6e 74 20 2a 70  t *piCol, int *p
2ff0: 69 4f 66 66 29 3b 0d 0a 0d 0a 20 20 73 71 6c 69  iOff);....  sqli
3000: 74 65 33 5f 69 6e 74 36 34 20 28 2a 78 52 6f 77  te3_int64 (*xRow
3010: 69 64 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a  id)(Fts5Context*
3020: 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6c  );..  int (*xCol
3030: 75 6d 6e 54 65 78 74 29 28 46 74 73 35 43 6f 6e  umnText)(Fts5Con
3040: 74 65 78 74 2a 2c 20 69 6e 74 20 69 43 6f 6c 2c  text*, int iCol,
3050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
3060: 2c 20 69 6e 74 20 2a 70 6e 29 3b 0d 0a 20 20 69  , int *pn);..  i
3070: 6e 74 20 28 2a 78 43 6f 6c 75 6d 6e 53 69 7a 65  nt (*xColumnSize
3080: 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20  )(Fts5Context*, 
3090: 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70  int iCol, int *p
30a0: 6e 54 6f 6b 65 6e 29 3b 0d 0a 0d 0a 20 20 69 6e  nToken);....  in
30b0: 74 20 28 2a 78 51 75 65 72 79 50 68 72 61 73 65  t (*xQueryPhrase
30c0: 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20  )(Fts5Context*, 
30d0: 69 6e 74 20 69 50 68 72 61 73 65 2c 20 76 6f 69  int iPhrase, voi
30e0: 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0d 0a 20  d *pUserData,.. 
30f0: 20 20 20 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20     int(*)(const 
3100: 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70 69  Fts5ExtensionApi
3110: 2a 2c 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 76  *,Fts5Context*,v
3120: 6f 69 64 2a 29 0d 0a 20 20 29 3b 0d 0a 20 20 69  oid*)..  );..  i
3130: 6e 74 20 28 2a 78 53 65 74 41 75 78 64 61 74 61  nt (*xSetAuxdata
3140: 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20  )(Fts5Context*, 
3150: 76 6f 69 64 20 2a 70 41 75 78 2c 20 76 6f 69 64  void *pAux, void
3160: 28 2a 78 44 65 6c 65 74 65 29 28 76 6f 69 64 2a  (*xDelete)(void*
3170: 29 29 3b 0d 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ));..  void *(*x
3180: 47 65 74 41 75 78 64 61 74 61 29 28 46 74 73 35  GetAuxdata)(Fts5
3190: 43 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 20 62 43  Context*, int bC
31a0: 6c 65 61 72 29 3b 0d 0a 0d 0a 20 20 69 6e 74 20  lear);....  int 
31b0: 28 2a 78 50 68 72 61 73 65 46 69 72 73 74 29 28  (*xPhraseFirst)(
31c0: 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 69 6e  Fts5Context*, in
31d0: 74 20 69 50 68 72 61 73 65 2c 20 46 74 73 35 50  t iPhrase, Fts5P
31e0: 68 72 61 73 65 49 74 65 72 2a 2c 20 69 6e 74 2a  hraseIter*, int*
31f0: 2c 20 69 6e 74 2a 29 3b 0d 0a 20 20 76 6f 69 64  , int*);..  void
3200: 20 28 2a 78 50 68 72 61 73 65 4e 65 78 74 29 28   (*xPhraseNext)(
3210: 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 46 74  Fts5Context*, Ft
3220: 73 35 50 68 72 61 73 65 49 74 65 72 2a 2c 20 69  s5PhraseIter*, i
3230: 6e 74 20 2a 70 69 43 6f 6c 2c 20 69 6e 74 20 2a  nt *piCol, int *
3240: 70 69 4f 66 66 29 3b 0d 0a 0d 0a 20 20 69 6e 74  piOff);....  int
3250: 20 28 2a 78 50 68 72 61 73 65 46 69 72 73 74 43   (*xPhraseFirstC
3260: 6f 6c 75 6d 6e 29 28 46 74 73 35 43 6f 6e 74 65  olumn)(Fts5Conte
3270: 78 74 2a 2c 20 69 6e 74 20 69 50 68 72 61 73 65  xt*, int iPhrase
3280: 2c 20 46 74 73 35 50 68 72 61 73 65 49 74 65 72  , Fts5PhraseIter
3290: 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 20 20 76 6f 69  *, int*);..  voi
32a0: 64 20 28 2a 78 50 68 72 61 73 65 4e 65 78 74 43  d (*xPhraseNextC
32b0: 6f 6c 75 6d 6e 29 28 46 74 73 35 43 6f 6e 74 65  olumn)(Fts5Conte
32c0: 78 74 2a 2c 20 46 74 73 35 50 68 72 61 73 65 49  xt*, Fts5PhraseI
32d0: 74 65 72 2a 2c 20 69 6e 74 20 2a 70 69 43 6f 6c  ter*, int *piCol
32e0: 29 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 20 0d 0a 2a  );..};..../* ..*
32f0: 2a 20 43 55 53 54 4f 4d 20 41 55 58 49 4c 49 41  * CUSTOM AUXILIA
3300: 52 59 20 46 55 4e 43 54 49 4f 4e 53 0d 0a 2a 2a  RY FUNCTIONS..**
3310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3350: 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a  *******/..../***
3360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a0: 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 43 55 53 54 4f  ******..** CUSTO
33b0: 4d 20 54 4f 4b 45 4e 49 5a 45 52 53 0d 0a 2a 2a  M TOKENIZERS..**
33c0: 0d 0a 2a 2a 20 41 70 70 6c 69 63 61 74 69 6f 6e  ..** Application
33d0: 73 20 6d 61 79 20 61 6c 73 6f 20 72 65 67 69 73  s may also regis
33e0: 74 65 72 20 63 75 73 74 6f 6d 20 74 6f 6b 65 6e  ter custom token
33f0: 69 7a 65 72 20 74 79 70 65 73 2e 20 41 20 74 6f  izer types. A to
3400: 6b 65 6e 69 7a 65 72 20 0d 0a 2a 2a 20 69 73 20  kenizer ..** is 
3410: 72 65 67 69 73 74 65 72 65 64 20 62 79 20 70 72  registered by pr
3420: 6f 76 69 64 69 6e 67 20 66 74 73 35 20 77 69 74  oviding fts5 wit
3430: 68 20 61 20 70 6f 70 75 6c 61 74 65 64 20 69 6e  h a populated in
3440: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 0d 0a  stance of the ..
3450: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  ** following str
3460: 75 63 74 75 72 65 2e 20 41 6c 6c 20 73 74 72 75  ucture. All stru
3470: 63 74 75 72 65 20 6d 65 74 68 6f 64 73 20 6d 75  cture methods mu
3480: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2c 20 73  st be defined, s
3490: 65 74 74 69 6e 67 0d 0a 2a 2a 20 61 6e 79 20 6d  etting..** any m
34a0: 65 6d 62 65 72 20 6f 66 20 74 68 65 20 66 74 73  ember of the fts
34b0: 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 73 74 72 75  5_tokenizer stru
34c0: 63 74 20 74 6f 20 4e 55 4c 4c 20 6c 65 61 64 73  ct to NULL leads
34d0: 20 74 6f 20 75 6e 64 65 66 69 6e 65 64 0d 0a 2a   to undefined..*
34e0: 2a 20 62 65 68 61 76 69 6f 75 72 2e 20 54 68 65  * behaviour. The
34f0: 20 73 74 72 75 63 74 75 72 65 20 6d 65 74 68 6f   structure metho
3500: 64 73 20 61 72 65 20 65 78 70 65 63 74 65 64 20  ds are expected 
3510: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 66  to function as f
3520: 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20  ollows:..**..** 
3530: 78 43 72 65 61 74 65 3a 0d 0a 2a 2a 20 20 20 54  xCreate:..**   T
3540: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3550: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
3560: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
3570: 61 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6e 73 74  a tokenizer inst
3580: 61 6e 63 65 2e 0d 0a 2a 2a 20 20 20 41 20 74 6f  ance...**   A to
3590: 6b 65 6e 69 7a 65 72 20 69 6e 73 74 61 6e 63 65  kenizer instance
35a0: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
35b0: 61 63 74 75 61 6c 6c 79 20 74 6f 6b 65 6e 69 7a  actually tokeniz
35c0: 65 20 74 65 78 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  e text...**..** 
35d0: 20 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75    The first argu
35e0: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
35f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3600: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 28 76  a copy of the (v
3610: 6f 69 64 2a 29 0d 0a 2a 2a 20 20 20 70 6f 69 6e  oid*)..**   poin
3620: 74 65 72 20 70 72 6f 76 69 64 65 64 20 62 79 20  ter provided by 
3630: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
3640: 77 68 65 6e 20 74 68 65 20 66 74 73 35 5f 74 6f  when the fts5_to
3650: 6b 65 6e 69 7a 65 72 20 6f 62 6a 65 63 74 0d 0a  kenizer object..
3660: 2a 2a 20 20 20 77 61 73 20 72 65 67 69 73 74 65  **   was registe
3670: 72 65 64 20 77 69 74 68 20 46 54 53 35 20 28 74  red with FTS5 (t
3680: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
3690: 74 20 74 6f 20 78 43 72 65 61 74 65 54 6f 6b 65  t to xCreateToke
36a0: 6e 69 7a 65 72 28 29 29 2e 20 0d 0a 2a 2a 20 20  nizer()). ..**  
36b0: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20   The second and 
36c0: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20  third arguments 
36d0: 61 72 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  are an array of 
36e0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
36f0: 74 72 69 6e 67 73 0d 0a 2a 2a 20 20 20 63 6f 6e  trings..**   con
3700: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 6f 6b 65  taining the toke
3710: 6e 69 7a 65 72 20 61 72 67 75 6d 65 6e 74 73 2c  nizer arguments,
3720: 20 69 66 20 61 6e 79 2c 20 73 70 65 63 69 66 69   if any, specifi
3730: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ed following the
3740: 0d 0a 2a 2a 20 20 20 74 6f 6b 65 6e 69 7a 65 72  ..**   tokenizer
3750: 20 6e 61 6d 65 20 61 73 20 70 61 72 74 20 6f 66   name as part of
3760: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54   the CREATE VIRT
3770: 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d  UAL TABLE statem
3780: 65 6e 74 20 75 73 65 64 0d 0a 2a 2a 20 20 20 74  ent used..**   t
3790: 6f 20 63 72 65 61 74 65 20 74 68 65 20 46 54 53  o create the FTS
37a0: 35 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a  5 table...**..**
37b0: 20 20 20 54 68 65 20 66 69 6e 61 6c 20 61 72 67     The final arg
37c0: 75 6d 65 6e 74 20 69 73 20 61 6e 20 6f 75 74 70  ument is an outp
37d0: 75 74 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20  ut variable. If 
37e0: 73 75 63 63 65 73 73 66 75 6c 2c 20 28 2a 70 70  successful, (*pp
37f0: 4f 75 74 29 20 0d 0a 2a 2a 20 20 20 73 68 6f 75  Out) ..**   shou
3800: 6c 64 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ld be set to poi
3810: 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 74 6f  nt to the new to
3820: 6b 65 6e 69 7a 65 72 20 68 61 6e 64 6c 65 20 61  kenizer handle a
3830: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0d 0a 2a 2a  nd SQLITE_OK..**
3840: 20 20 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20     returned. If 
3850: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
3860: 20 73 6f 6d 65 20 76 61 6c 75 65 20 6f 74 68 65   some value othe
3870: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
3880: 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 20 20 62 65   should..**   be
3890: 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
38a0: 69 73 20 63 61 73 65 2c 20 66 74 73 35 20 61 73  is case, fts5 as
38b0: 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 66  sumes that the f
38c0: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70  inal value of *p
38d0: 70 4f 75 74 20 0d 0a 2a 2a 20 20 20 69 73 20 75  pOut ..**   is u
38e0: 6e 64 65 66 69 6e 65 64 2e 0d 0a 2a 2a 0d 0a 2a  ndefined...**..*
38f0: 2a 20 78 44 65 6c 65 74 65 3a 0d 0a 2a 2a 20 20  * xDelete:..**  
3900: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3910: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 64 65 6c  s invoked to del
3920: 65 74 65 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20  ete a tokenizer 
3930: 68 61 6e 64 6c 65 20 70 72 65 76 69 6f 75 73 6c  handle previousl
3940: 79 0d 0a 2a 2a 20 20 20 61 6c 6c 6f 63 61 74 65  y..**   allocate
3950: 64 20 75 73 69 6e 67 20 78 43 72 65 61 74 65 28  d using xCreate(
3960: 29 2e 20 46 74 73 35 20 67 75 61 72 61 6e 74 65  ). Fts5 guarante
3970: 65 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  es that this fun
3980: 63 74 69 6f 6e 20 77 69 6c 6c 0d 0a 2a 2a 20 20  ction will..**  
3990: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 78 61 63   be invoked exac
39a0: 74 6c 79 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  tly once for eac
39b0: 68 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  h successful cal
39c0: 6c 20 74 6f 20 78 43 72 65 61 74 65 28 29 2e 0d  l to xCreate()..
39d0: 0a 2a 2a 0d 0a 2a 2a 20 78 54 6f 6b 65 6e 69 7a  .**..** xTokeniz
39e0: 65 3a 0d 0a 2a 2a 20 20 20 54 68 69 73 20 66 75  e:..**   This fu
39f0: 6e 63 74 69 6f 6e 20 69 73 20 65 78 70 65 63 74  nction is expect
3a00: 65 64 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 74  ed to tokenize t
3a10: 68 65 20 6e 54 65 78 74 20 62 79 74 65 20 73 74  he nText byte st
3a20: 72 69 6e 67 20 69 6e 64 69 63 61 74 65 64 20 0d  ring indicated .
3a30: 0a 2a 2a 20 20 20 62 79 20 61 72 67 75 6d 65 6e  .**   by argumen
3a40: 74 20 70 54 65 78 74 2e 20 70 54 65 78 74 20 6d  t pText. pText m
3a50: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
3a60: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e   nul-terminated.
3a70: 20 54 68 65 20 66 69 72 73 74 0d 0a 2a 2a 20 20   The first..**  
3a80: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
3a90: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
3aa0: 6e 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  n is a pointer t
3ab0: 6f 20 61 6e 20 46 74 73 35 54 6f 6b 65 6e 69 7a  o an Fts5Tokeniz
3ac0: 65 72 20 6f 62 6a 65 63 74 0d 0a 2a 2a 20 20 20  er object..**   
3ad0: 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65  returned by an e
3ae0: 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 78  arlier call to x
3af0: 43 72 65 61 74 65 28 29 2e 0d 0a 2a 2a 0d 0a 2a  Create()...**..*
3b00: 2a 20 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61  *   The second a
3b10: 72 67 75 6d 65 6e 74 20 69 6e 64 69 63 61 74 65  rgument indicate
3b20: 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 61  s the reason tha
3b30: 74 20 46 54 53 35 20 69 73 20 72 65 71 75 65 73  t FTS5 is reques
3b40: 74 69 6e 67 0d 0a 2a 2a 20 20 20 74 6f 6b 65 6e  ting..**   token
3b50: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ization of the s
3b60: 75 70 70 6c 69 65 64 20 74 65 78 74 2e 20 54 68  upplied text. Th
3b70: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
3b80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3b90: 67 0d 0a 2a 2a 20 20 20 66 6f 75 72 20 76 61 6c  g..**   four val
3ba0: 75 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 3c  ues:..**..**   <
3bb0: 75 6c 3e 3c 6c 69 3e 20 3c 62 3e 46 54 53 35 5f  ul><li> <b>FTS5_
3bc0: 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d 45 4e  TOKENIZE_DOCUMEN
3bd0: 54 3c 2f 62 3e 20 2d 20 41 20 64 6f 63 75 6d 65  T</b> - A docume
3be0: 6e 74 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  nt is being inse
3bf0: 72 74 65 64 20 69 6e 74 6f 0d 0a 2a 2a 20 20 20  rted into..**   
3c00: 20 20 20 20 20 20 20 20 20 6f 72 20 72 65 6d 6f           or remo
3c10: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 46 54 53  ved from the FTS
3c20: 20 74 61 62 6c 65 2e 20 54 68 65 20 74 6f 6b 65   table. The toke
3c30: 6e 69 7a 65 72 20 69 73 20 62 65 69 6e 67 20 69  nizer is being i
3c40: 6e 76 6f 6b 65 64 20 74 6f 0d 0a 2a 2a 20 20 20  nvoked to..**   
3c50: 20 20 20 20 20 20 20 20 20 64 65 74 65 72 6d 69           determi
3c60: 6e 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 6f  ne the set of to
3c70: 6b 65 6e 73 20 74 6f 20 61 64 64 20 74 6f 20 28  kens to add to (
3c80: 6f 72 20 64 65 6c 65 74 65 20 66 72 6f 6d 29 20  or delete from) 
3c90: 74 68 65 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  the..**         
3ca0: 20 20 20 46 54 53 20 69 6e 64 65 78 2e 0d 0a 2a     FTS index...*
3cb0: 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 69 3e  *..**       <li>
3cc0: 20 3c 62 3e 46 54 53 35 5f 54 4f 4b 45 4e 49 5a   <b>FTS5_TOKENIZ
3cd0: 45 5f 51 55 45 52 59 3c 2f 62 3e 20 2d 20 41 20  E_QUERY</b> - A 
3ce0: 4d 41 54 43 48 20 71 75 65 72 79 20 69 73 20 62  MATCH query is b
3cf0: 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 0d 0a  eing executed ..
3d00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 61 67  **            ag
3d10: 61 69 6e 73 74 20 74 68 65 20 46 54 53 20 69 6e  ainst the FTS in
3d20: 64 65 78 2e 20 54 68 65 20 74 6f 6b 65 6e 69 7a  dex. The tokeniz
3d30: 65 72 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  er is being call
3d40: 65 64 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 0d  ed to tokenize .
3d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 61  .**            a
3d60: 20 62 61 72 65 77 6f 72 64 20 6f 72 20 71 75 6f   bareword or quo
3d70: 74 65 64 20 73 74 72 69 6e 67 20 73 70 65 63 69  ted string speci
3d80: 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  fied as part of 
3d90: 74 68 65 20 71 75 65 72 79 2e 0d 0a 2a 2a 0d 0a  the query...**..
3da0: 2a 2a 20 20 20 20 20 20 20 3c 6c 69 3e 20 3c 62  **       <li> <b
3db0: 3e 28 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f  >(FTS5_TOKENIZE_
3dc0: 51 55 45 52 59 20 7c 20 46 54 53 35 5f 54 4f 4b  QUERY | FTS5_TOK
3dd0: 45 4e 49 5a 45 5f 50 52 45 46 49 58 29 3c 2f 62  ENIZE_PREFIX)</b
3de0: 3e 20 2d 20 53 61 6d 65 20 61 73 0d 0a 2a 2a 20  > - Same as..** 
3df0: 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
3e00: 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 2c 20  TOKENIZE_QUERY, 
3e10: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
3e20: 62 61 72 65 77 6f 72 64 20 6f 72 20 71 75 6f 74  bareword or quot
3e30: 65 64 20 73 74 72 69 6e 67 20 69 73 0d 0a 2a 2a  ed string is..**
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c 6c              foll
3e50: 6f 77 65 64 20 62 79 20 61 20 22 2a 22 20 63 68  owed by a "*" ch
3e60: 61 72 61 63 74 65 72 2c 20 69 6e 64 69 63 61 74  aracter, indicat
3e70: 69 6e 67 20 74 68 61 74 20 74 68 65 20 6c 61 73  ing that the las
3e80: 74 20 74 6f 6b 65 6e 0d 0a 2a 2a 20 20 20 20 20  t token..**     
3e90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 65 64 20         returned 
3ea0: 62 79 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  by the tokenizer
3eb0: 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
3ec0: 20 61 73 20 61 20 74 6f 6b 65 6e 20 70 72 65 66   as a token pref
3ed0: 69 78 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20  ix...**..**     
3ee0: 20 20 3c 6c 69 3e 20 3c 62 3e 46 54 53 35 5f 54    <li> <b>FTS5_T
3ef0: 4f 4b 45 4e 49 5a 45 5f 41 55 58 3c 2f 62 3e 20  OKENIZE_AUX</b> 
3f00: 2d 20 54 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20  - The tokenizer 
3f10: 69 73 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  is being invoked
3f20: 20 74 6f 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20   to ..**        
3f30: 20 20 20 20 73 61 74 69 73 66 79 20 61 6e 20 66      satisfy an f
3f40: 74 73 35 5f 61 70 69 2e 78 54 6f 6b 65 6e 69 7a  ts5_api.xTokeniz
3f50: 65 28 29 20 72 65 71 75 65 73 74 20 6d 61 64 65  e() request made
3f60: 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79   by an auxiliary
3f70: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
3f80: 66 75 6e 63 74 69 6f 6e 2e 20 4f 72 20 61 6e 20  function. Or an 
3f90: 66 74 73 35 5f 61 70 69 2e 78 43 6f 6c 75 6d 6e  fts5_api.xColumn
3fa0: 53 69 7a 65 28 29 20 72 65 71 75 65 73 74 20 6d  Size() request m
3fb0: 61 64 65 20 62 79 20 74 68 65 20 73 61 6d 65 0d  ade by the same.
3fc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6f  .**            o
3fd0: 6e 20 61 20 63 6f 6c 75 6d 6e 73 69 7a 65 3d 30  n a columnsize=0
3fe0: 20 64 61 74 61 62 61 73 65 2e 20 20 0d 0a 2a 2a   database.  ..**
3ff0: 20 20 20 3c 2f 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a     </ul>..**..**
4000: 20 20 20 46 6f 72 20 65 61 63 68 20 74 6f 6b 65     For each toke
4010: 6e 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73  n in the input s
4020: 74 72 69 6e 67 2c 20 74 68 65 20 73 75 70 70 6c  tring, the suppl
4030: 69 65 64 20 63 61 6c 6c 62 61 63 6b 20 78 54 6f  ied callback xTo
4040: 6b 65 6e 28 29 20 6d 75 73 74 0d 0a 2a 2a 20 20  ken() must..**  
4050: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 20 54 68 65   be invoked. The
4060: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4070: 74 6f 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  to it should be 
4080: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f  a copy of the po
4090: 69 6e 74 65 72 0d 0a 2a 2a 20 20 20 70 61 73 73  inter..**   pass
40a0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
40b0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 54 6f   argument to xTo
40c0: 6b 65 6e 69 7a 65 28 29 2e 20 54 68 65 20 74 68  kenize(). The th
40d0: 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 0d 0a  ird and fourth..
40e0: 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 73 20 61  **   arguments a
40f0: 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
4100: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
4110: 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 20 74 65  ing the token te
4120: 78 74 2c 20 61 6e 64 20 74 68 65 0d 0a 2a 2a 20  xt, and the..** 
4130: 20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 74 6f    size of the to
4140: 6b 65 6e 20 69 6e 20 62 79 74 65 73 2e 20 54 68  ken in bytes. Th
4150: 65 20 34 74 68 20 61 6e 64 20 35 74 68 20 61 72  e 4th and 5th ar
4160: 67 75 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20  guments are the 
4170: 62 79 74 65 20 6f 66 66 73 65 74 73 0d 0a 2a 2a  byte offsets..**
4180: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
4190: 62 79 74 65 20 6f 66 20 61 6e 64 20 66 69 72 73  byte of and firs
41a0: 74 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  t byte immediate
41b0: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
41c0: 20 74 65 78 74 20 66 72 6f 6d 0d 0a 2a 2a 20 20   text from..**  
41d0: 20 77 68 69 63 68 20 74 68 65 20 74 6f 6b 65 6e   which the token
41e0: 20 69 73 20 64 65 72 69 76 65 64 20 77 69 74 68   is derived with
41f0: 69 6e 20 74 68 65 20 69 6e 70 75 74 2e 0d 0a 2a  in the input...*
4200: 2a 0d 0a 2a 2a 20 20 20 54 68 65 20 73 65 63 6f  *..**   The seco
4210: 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  nd argument pass
4220: 65 64 20 74 6f 20 74 68 65 20 78 54 6f 6b 65 6e  ed to the xToken
4230: 28 29 20 63 61 6c 6c 62 61 63 6b 20 28 22 74 66  () callback ("tf
4240: 6c 61 67 73 22 29 20 73 68 6f 75 6c 64 0d 0a 2a  lags") should..*
4250: 2a 20 20 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  *   normally be 
4260: 73 65 74 20 74 6f 20 30 2e 20 54 68 65 20 65 78  set to 0. The ex
4270: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
4280: 65 20 74 6f 6b 65 6e 69 7a 65 72 20 73 75 70 70  e tokenizer supp
4290: 6f 72 74 73 20 0d 0a 2a 2a 20 20 20 73 79 6e 6f  orts ..**   syno
42a0: 6e 79 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  nyms. In this ca
42b0: 73 65 20 73 65 65 20 74 68 65 20 64 69 73 63 75  se see the discu
42c0: 73 73 69 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20  ssion below for 
42d0: 64 65 74 61 69 6c 73 2e 0d 0a 2a 2a 0d 0a 2a 2a  details...**..**
42e0: 20 20 20 46 54 53 35 20 61 73 73 75 6d 65 73 20     FTS5 assumes 
42f0: 74 68 65 20 78 54 6f 6b 65 6e 28 29 20 63 61 6c  the xToken() cal
4300: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
4310: 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
4320: 69 6e 20 74 68 65 20 0d 0a 2a 2a 20 20 20 6f 72  in the ..**   or
4330: 64 65 72 20 74 68 61 74 20 74 68 65 79 20 6f 63  der that they oc
4340: 63 75 72 20 77 69 74 68 69 6e 20 74 68 65 20 69  cur within the i
4350: 6e 70 75 74 20 74 65 78 74 2e 0d 0a 2a 2a 0d 0a  nput text...**..
4360: 2a 2a 20 20 20 49 66 20 61 6e 20 78 54 6f 6b 65  **   If an xToke
4370: 6e 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  n() callback ret
4380: 75 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f  urns any value o
4390: 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
43a0: 5f 4f 4b 2c 20 74 68 65 6e 0d 0a 2a 2a 20 20 20  _OK, then..**   
43b0: 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e  the tokenization
43c0: 20 73 68 6f 75 6c 64 20 62 65 20 61 62 61 6e 64   should be aband
43d0: 6f 6e 65 64 20 61 6e 64 20 74 68 65 20 78 54 6f  oned and the xTo
43e0: 6b 65 6e 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  kenize() method 
43f0: 73 68 6f 75 6c 64 0d 0a 2a 2a 20 20 20 69 6d 6d  should..**   imm
4400: 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
4410: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 78 54  a copy of the xT
4420: 6f 6b 65 6e 28 29 20 72 65 74 75 72 6e 20 76 61  oken() return va
4430: 6c 75 65 2e 20 4f 72 2c 20 69 66 20 74 68 65 0d  lue. Or, if the.
4440: 0a 2a 2a 20 20 20 69 6e 70 75 74 20 62 75 66 66  .**   input buff
4450: 65 72 20 69 73 20 65 78 68 61 75 73 74 65 64 2c  er is exhausted,
4460: 20 78 54 6f 6b 65 6e 69 7a 65 28 29 20 73 68 6f   xTokenize() sho
4470: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
4480: 45 5f 4f 4b 2e 20 46 69 6e 61 6c 6c 79 2c 0d 0a  E_OK. Finally,..
4490: 2a 2a 20 20 20 69 66 20 61 6e 20 65 72 72 6f 72  **   if an error
44a0: 20 6f 63 63 75 72 73 20 77 69 74 68 20 74 68 65   occurs with the
44b0: 20 78 54 6f 6b 65 6e 69 7a 65 28 29 20 69 6d 70   xTokenize() imp
44c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 73 65  lementation itse
44d0: 6c 66 2c 20 69 74 0d 0a 2a 2a 20 20 20 6d 61 79  lf, it..**   may
44e0: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 6f 6b   abandon the tok
44f0: 65 6e 69 7a 61 74 69 6f 6e 20 61 6e 64 20 72 65  enization and re
4500: 74 75 72 6e 20 61 6e 79 20 65 72 72 6f 72 20 63  turn any error c
4510: 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 0d 0a  ode other than..
4520: 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  **   SQLITE_OK o
4530: 72 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0d 0a  r SQLITE_DONE...
4540: 2a 2a 0d 0a 2a 2a 20 53 59 4e 4f 4e 59 4d 20 53  **..** SYNONYM S
4550: 55 50 50 4f 52 54 0d 0a 2a 2a 0d 0a 2a 2a 20 20  UPPORT..**..**  
4560: 20 43 75 73 74 6f 6d 20 74 6f 6b 65 6e 69 7a 65   Custom tokenize
4570: 72 73 20 6d 61 79 20 61 6c 73 6f 20 73 75 70 70  rs may also supp
4580: 6f 72 74 20 73 79 6e 6f 6e 79 6d 73 2e 20 43 6f  ort synonyms. Co
4590: 6e 73 69 64 65 72 20 61 20 63 61 73 65 20 69 6e  nsider a case in
45a0: 20 77 68 69 63 68 20 61 0d 0a 2a 2a 20 20 20 75   which a..**   u
45b0: 73 65 72 20 77 69 73 68 65 73 20 74 6f 20 71 75  ser wishes to qu
45c0: 65 72 79 20 66 6f 72 20 61 20 70 68 72 61 73 65  ery for a phrase
45d0: 20 73 75 63 68 20 61 73 20 22 66 69 72 73 74 20   such as "first 
45e0: 70 6c 61 63 65 22 2e 20 55 73 69 6e 67 20 74 68  place". Using th
45f0: 65 20 0d 0a 2a 2a 20 20 20 62 75 69 6c 74 2d 69  e ..**   built-i
4600: 6e 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 20 74 68  n tokenizers, th
4610: 65 20 46 54 53 35 20 71 75 65 72 79 20 27 66 69  e FTS5 query 'fi
4620: 72 73 74 20 2b 20 70 6c 61 63 65 27 20 77 69 6c  rst + place' wil
4630: 6c 20 6d 61 74 63 68 20 69 6e 73 74 61 6e 63 65  l match instance
4640: 73 0d 0a 2a 2a 20 20 20 6f 66 20 22 66 69 72 73  s..**   of "firs
4650: 74 20 70 6c 61 63 65 22 20 77 69 74 68 69 6e 20  t place" within 
4660: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 65 74  the document set
4670: 2c 20 62 75 74 20 6e 6f 74 20 61 6c 74 65 72 6e  , but not altern
4680: 61 74 69 76 65 20 66 6f 72 6d 73 0d 0a 2a 2a 20  ative forms..** 
4690: 20 20 73 75 63 68 20 61 73 20 22 31 73 74 20 70    such as "1st p
46a0: 6c 61 63 65 22 2e 20 49 6e 20 73 6f 6d 65 20 61  lace". In some a
46b0: 70 70 6c 69 63 61 74 69 6f 6e 73 2c 20 69 74 20  pplications, it 
46c0: 77 6f 75 6c 64 20 62 65 20 62 65 74 74 65 72 20  would be better 
46d0: 74 6f 20 6d 61 74 63 68 0d 0a 2a 2a 20 20 20 61  to match..**   a
46e0: 6c 6c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  ll instances of 
46f0: 22 66 69 72 73 74 20 70 6c 61 63 65 22 20 6f 72  "first place" or
4700: 20 22 31 73 74 20 70 6c 61 63 65 22 20 72 65 67   "1st place" reg
4710: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 69 63 68  ardless of which
4720: 20 66 6f 72 6d 0d 0a 2a 2a 20 20 20 74 68 65 20   form..**   the 
4730: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 69  user specified i
4740: 6e 20 74 68 65 20 4d 41 54 43 48 20 71 75 65 72  n the MATCH quer
4750: 79 20 74 65 78 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  y text...**..** 
4760: 20 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65    There are seve
4770: 72 61 6c 20 77 61 79 73 20 74 6f 20 61 70 70 72  ral ways to appr
4780: 6f 61 63 68 20 74 68 69 73 20 69 6e 20 46 54 53  oach this in FTS
4790: 35 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 3c 6f 6c  5:..**..**   <ol
47a0: 3e 3c 6c 69 3e 20 42 79 20 6d 61 70 70 69 6e 67  ><li> By mapping
47b0: 20 61 6c 6c 20 73 79 6e 6f 6e 79 6d 73 20 74 6f   all synonyms to
47c0: 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 2e   a single token.
47d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
47e0: 68 65 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  he ..**         
47f0: 20 20 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20     In the above 
4800: 65 78 61 6d 70 6c 65 2c 20 74 68 69 73 20 6d 65  example, this me
4810: 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 6f 6b  ans that the tok
4820: 65 6e 69 7a 65 72 20 72 65 74 75 72 6e 73 20 74  enizer returns t
4830: 68 65 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  he..**          
4840: 20 20 73 61 6d 65 20 74 6f 6b 65 6e 20 66 6f 72    same token for
4850: 20 69 6e 70 75 74 73 20 22 66 69 72 73 74 22 20   inputs "first" 
4860: 61 6e 64 20 22 31 73 74 22 2e 20 53 61 79 20 74  and "1st". Say t
4870: 68 61 74 20 74 6f 6b 65 6e 20 69 73 20 69 6e 0d  hat token is in.
4880: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 66  .**            f
4890: 61 63 74 20 22 66 69 72 73 74 22 2c 20 73 6f 20  act "first", so 
48a0: 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 75 73  that when the us
48b0: 65 72 20 69 6e 73 65 72 74 73 20 74 68 65 20 64  er inserts the d
48c0: 6f 63 75 6d 65 6e 74 20 22 49 20 77 6f 6e 0d 0a  ocument "I won..
48d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 31 73  **            1s
48e0: 74 20 70 6c 61 63 65 22 20 65 6e 74 72 69 65 73  t place" entries
48f0: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
4900: 65 20 69 6e 64 65 78 20 66 6f 72 20 74 6f 6b 65  e index for toke
4910: 6e 73 20 22 69 22 2c 20 22 77 6f 6e 22 2c 0d 0a  ns "i", "won",..
4920: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 22 66  **            "f
4930: 69 72 73 74 22 20 61 6e 64 20 22 70 6c 61 63 65  irst" and "place
4940: 22 2e 20 49 66 20 74 68 65 20 75 73 65 72 20 74  ". If the user t
4950: 68 65 6e 20 71 75 65 72 69 65 73 20 66 6f 72 20  hen queries for 
4960: 27 31 73 74 20 2b 20 70 6c 61 63 65 27 2c 0d 0a  '1st + place',..
4970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  **            th
4980: 65 20 74 6f 6b 65 6e 69 7a 65 72 20 73 75 62 73  e tokenizer subs
4990: 74 69 74 75 74 65 73 20 22 66 69 72 73 74 22 20  titutes "first" 
49a0: 66 6f 72 20 22 31 73 74 22 20 61 6e 64 20 74 68  for "1st" and th
49b0: 65 20 71 75 65 72 79 20 77 6f 72 6b 73 0d 0a 2a  e query works..*
49c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 20  *            as 
49d0: 65 78 70 65 63 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a  expected...**..*
49e0: 2a 20 20 20 20 20 20 20 3c 6c 69 3e 20 42 79 20  *       <li> By 
49f0: 71 75 65 72 79 69 6e 67 20 74 68 65 20 69 6e 64  querying the ind
4a00: 65 78 20 66 6f 72 20 61 6c 6c 20 73 79 6e 6f 6e  ex for all synon
4a10: 79 6d 73 20 6f 66 20 65 61 63 68 20 71 75 65 72  yms of each quer
4a20: 79 20 74 65 72 6d 0d 0a 2a 2a 20 20 20 20 20 20  y term..**      
4a30: 20 20 20 20 20 20 73 65 70 61 72 61 74 65 6c 79        separately
4a40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
4a50: 77 68 65 6e 20 74 6f 6b 65 6e 69 7a 69 6e 67 20  when tokenizing 
4a60: 71 75 65 72 79 20 74 65 78 74 2c 20 74 68 65 0d  query text, the.
4a70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 74  .**            t
4a80: 6f 6b 65 6e 69 7a 65 72 20 6d 61 79 20 70 72 6f  okenizer may pro
4a90: 76 69 64 65 20 6d 75 6c 74 69 70 6c 65 20 73 79  vide multiple sy
4aa0: 6e 6f 6e 79 6d 73 20 66 6f 72 20 61 20 73 69 6e  nonyms for a sin
4ab0: 67 6c 65 20 74 65 72 6d 20 0d 0a 2a 2a 20 20 20  gle term ..**   
4ac0: 20 20 20 20 20 20 20 20 20 77 69 74 68 69 6e 20           within 
4ad0: 74 68 65 20 64 6f 63 75 6d 65 6e 74 2e 20 46 54  the document. FT
4ae0: 53 35 20 74 68 65 6e 20 71 75 65 72 69 65 73 20  S5 then queries 
4af0: 74 68 65 20 69 6e 64 65 78 20 66 6f 72 20 65 61  the index for ea
4b00: 63 68 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  ch ..**         
4b10: 20 20 20 73 79 6e 6f 6e 79 6d 20 69 6e 64 69 76     synonym indiv
4b20: 69 64 75 61 6c 6c 79 2e 20 46 6f 72 20 65 78 61  idually. For exa
4b30: 6d 70 6c 65 2c 20 66 61 63 65 64 20 77 69 74 68  mple, faced with
4b40: 20 74 68 65 20 71 75 65 72 79 3a 0d 0a 2a 2a 0d   the query:..**.
4b50: 0a 2a 2a 20 20 20 3c 63 6f 64 65 62 6c 6f 63 6b  .**   <codeblock
4b60: 3e 0d 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 4d 41  >..**     ... MA
4b70: 54 43 48 20 27 66 69 72 73 74 20 70 6c 61 63 65  TCH 'first place
4b80: 27 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0d 0a 2a  '</codeblock>..*
4b90: 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  *..**           
4ba0: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 6f   the tokenizer o
4bb0: 66 66 65 72 73 20 62 6f 74 68 20 22 31 73 74 22  ffers both "1st"
4bc0: 20 61 6e 64 20 22 66 69 72 73 74 22 20 61 73 20   and "first" as 
4bd0: 73 79 6e 6f 6e 79 6d 73 20 66 6f 72 20 74 68 65  synonyms for the
4be0: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
4bf0: 66 69 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74  first token in t
4c00: 68 65 20 4d 41 54 43 48 20 71 75 65 72 79 20 61  he MATCH query a
4c10: 6e 64 20 46 54 53 35 20 65 66 66 65 63 74 69 76  nd FTS5 effectiv
4c20: 65 6c 79 20 72 75 6e 73 20 61 20 71 75 65 72 79  ely runs a query
4c30: 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   ..**           
4c40: 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 2a 2a   similar to:..**
4c50: 0d 0a 2a 2a 20 20 20 3c 63 6f 64 65 62 6c 6f 63  ..**   <codebloc
4c60: 6b 3e 0d 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 4d  k>..**     ... M
4c70: 41 54 43 48 20 27 28 66 69 72 73 74 20 4f 52 20  ATCH '(first OR 
4c80: 31 73 74 29 20 70 6c 61 63 65 27 3c 2f 63 6f 64  1st) place'</cod
4c90: 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a 0d 0a 2a 2a 20  eblock>..**..** 
4ca0: 20 20 20 20 20 20 20 20 20 20 20 65 78 63 65 70             excep
4cb0: 74 20 74 68 61 74 2c 20 66 6f 72 20 74 68 65 20  t that, for the 
4cc0: 70 75 72 70 6f 73 65 73 20 6f 66 20 61 75 78 69  purposes of auxi
4cd0: 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2c  liary functions,
4ce0: 20 74 68 65 20 71 75 65 72 79 0d 0a 2a 2a 20 20   the query..**  
4cf0: 20 20 20 20 20 20 20 20 20 20 73 74 69 6c 6c 20            still 
4d00: 61 70 70 65 61 72 73 20 74 6f 20 63 6f 6e 74 61  appears to conta
4d10: 69 6e 20 6a 75 73 74 20 74 77 6f 20 70 68 72 61  in just two phra
4d20: 73 65 73 20 2d 20 22 28 66 69 72 73 74 20 4f 52  ses - "(first OR
4d30: 20 31 73 74 29 22 20 0d 0a 2a 2a 20 20 20 20 20   1st)" ..**     
4d40: 20 20 20 20 20 20 20 62 65 69 6e 67 20 74 72 65         being tre
4d50: 61 74 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  ated as a single
4d60: 20 70 68 72 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a   phrase...**..**
4d70: 20 20 20 20 20 20 20 3c 6c 69 3e 20 42 79 20 61         <li> By a
4d80: 64 64 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 73  dding multiple s
4d90: 79 6e 6f 6e 79 6d 73 20 66 6f 72 20 61 20 73 69  ynonyms for a si
4da0: 6e 67 6c 65 20 74 65 72 6d 20 74 6f 20 74 68 65  ngle term to the
4db0: 20 46 54 53 20 69 6e 64 65 78 2e 0d 0a 2a 2a 20   FTS index...** 
4dc0: 20 20 20 20 20 20 20 20 20 20 20 55 73 69 6e 67             Using
4dd0: 20 74 68 69 73 20 6d 65 74 68 6f 64 2c 20 77 68   this method, wh
4de0: 65 6e 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 64 6f  en tokenizing do
4df0: 63 75 6d 65 6e 74 20 74 65 78 74 2c 20 74 68 65  cument text, the
4e00: 20 74 6f 6b 65 6e 69 7a 65 72 0d 0a 2a 2a 20 20   tokenizer..**  
4e10: 20 20 20 20 20 20 20 20 20 20 70 72 6f 76 69 64            provid
4e20: 65 73 20 6d 75 6c 74 69 70 6c 65 20 73 79 6e 6f  es multiple syno
4e30: 6e 79 6d 73 20 66 6f 72 20 65 61 63 68 20 74 6f  nyms for each to
4e40: 6b 65 6e 2e 20 53 6f 20 74 68 61 74 20 77 68 65  ken. So that whe
4e50: 6e 20 61 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20  n a ..**        
4e60: 20 20 20 20 64 6f 63 75 6d 65 6e 74 20 73 75 63      document suc
4e70: 68 20 61 73 20 22 49 20 77 6f 6e 20 66 69 72 73  h as "I won firs
4e80: 74 20 70 6c 61 63 65 22 20 69 73 20 74 6f 6b 65  t place" is toke
4e90: 6e 69 7a 65 64 2c 20 65 6e 74 72 69 65 73 20 61  nized, entries a
4ea0: 72 65 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  re..**          
4eb0: 20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 46    added to the F
4ec0: 54 53 20 69 6e 64 65 78 20 66 6f 72 20 22 69 22  TS index for "i"
4ed0: 2c 20 22 77 6f 6e 22 2c 20 22 66 69 72 73 74 22  , "won", "first"
4ee0: 2c 20 22 31 73 74 22 20 61 6e 64 0d 0a 2a 2a 20  , "1st" and..** 
4ef0: 20 20 20 20 20 20 20 20 20 20 20 22 70 6c 61 63             "plac
4f00: 65 22 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20  e"...**..**     
4f10: 20 20 20 20 20 20 20 54 68 69 73 20 77 61 79 2c         This way,
4f20: 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 6f 6b   even if the tok
4f30: 65 6e 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20  enizer does not 
4f40: 70 72 6f 76 69 64 65 20 73 79 6e 6f 6e 79 6d 73  provide synonyms
4f50: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
4f60: 77 68 65 6e 20 74 6f 6b 65 6e 69 7a 69 6e 67 20  when tokenizing 
4f70: 71 75 65 72 79 20 74 65 78 74 20 28 69 74 20 73  query text (it s
4f80: 68 6f 75 6c 64 20 6e 6f 74 20 2d 20 74 6f 20 64  hould not - to d
4f90: 6f 20 73 6f 20 77 6f 75 6c 64 20 62 65 0d 0a 2a  o so would be..*
4fa0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 65  *            ine
4fb0: 66 66 69 63 69 65 6e 74 29 2c 20 69 74 20 64 6f  fficient), it do
4fc0: 65 73 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20  esn't matter if 
4fd0: 74 68 65 20 75 73 65 72 20 71 75 65 72 69 65 73  the user queries
4fe0: 20 66 6f 72 20 0d 0a 2a 2a 20 20 20 20 20 20 20   for ..**       
4ff0: 20 20 20 20 20 27 66 69 72 73 74 20 2b 20 70 6c       'first + pl
5000: 61 63 65 27 20 6f 72 20 27 31 73 74 20 2b 20 70  ace' or '1st + p
5010: 6c 61 63 65 27 2c 20 61 73 20 74 68 65 72 65 20  lace', as there 
5020: 61 72 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  are entries in t
5030: 68 65 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  he..**          
5040: 20 20 46 54 53 20 69 6e 64 65 78 20 63 6f 72 72    FTS index corr
5050: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 6f 74  esponding to bot
5060: 68 20 66 6f 72 6d 73 20 6f 66 20 74 68 65 20 66  h forms of the f
5070: 69 72 73 74 20 74 6f 6b 65 6e 2e 0d 0a 2a 2a 20  irst token...** 
5080: 20 20 3c 2f 6f 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20    </ol>..**..** 
5090: 20 20 57 68 65 74 68 65 72 20 69 74 20 69 73 20    Whether it is 
50a0: 70 61 72 73 69 6e 67 20 64 6f 63 75 6d 65 6e 74  parsing document
50b0: 20 6f 72 20 71 75 65 72 79 20 74 65 78 74 2c 20   or query text, 
50c0: 61 6e 79 20 63 61 6c 6c 20 74 6f 20 78 54 6f 6b  any call to xTok
50d0: 65 6e 20 74 68 61 74 0d 0a 2a 2a 20 20 20 73 70  en that..**   sp
50e0: 65 63 69 66 69 65 73 20 61 20 3c 69 3e 74 66 6c  ecifies a <i>tfl
50f0: 61 67 73 3c 2f 69 3e 20 61 72 67 75 6d 65 6e 74  ags</i> argument
5100: 20 77 69 74 68 20 74 68 65 20 46 54 53 35 5f 54   with the FTS5_T
5110: 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 20 62  OKEN_COLOCATED b
5120: 69 74 0d 0a 2a 2a 20 20 20 69 73 20 63 6f 6e 73  it..**   is cons
5130: 69 64 65 72 65 64 20 74 6f 20 73 75 70 70 6c 79  idered to supply
5140: 20 61 20 73 79 6e 6f 6e 79 6d 20 66 6f 72 20 74   a synonym for t
5150: 68 65 20 70 72 65 76 69 6f 75 73 20 74 6f 6b 65  he previous toke
5160: 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0d  n. For example,.
5170: 0a 2a 2a 20 20 20 77 68 65 6e 20 70 61 72 73 69  .**   when parsi
5180: 6e 67 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  ng the document 
5190: 22 49 20 77 6f 6e 20 66 69 72 73 74 20 70 6c 61  "I won first pla
51a0: 63 65 22 2c 20 61 20 74 6f 6b 65 6e 69 7a 65 72  ce", a tokenizer
51b0: 20 74 68 61 74 20 73 75 70 70 6f 72 74 73 0d 0a   that supports..
51c0: 2a 2a 20 20 20 73 79 6e 6f 6e 79 6d 73 20 77 6f  **   synonyms wo
51d0: 75 6c 64 20 63 61 6c 6c 20 78 54 6f 6b 65 6e 28  uld call xToken(
51e0: 29 20 35 20 74 69 6d 65 73 2c 20 61 73 20 66 6f  ) 5 times, as fo
51f0: 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20  llows:..**..**  
5200: 20 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a   <codeblock>..**
5210: 20 20 20 20 20 20 20 78 54 6f 6b 65 6e 28 70 43         xToken(pC
5220: 74 78 2c 20 30 2c 20 22 69 22 2c 20 20 20 20 20  tx, 0, "i",     
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 31 2c 20 20 30 2c 20 20 31 29 3b 0d 0a 2a 2a   1,  0,  1);..**
5250: 20 20 20 20 20 20 20 78 54 6f 6b 65 6e 28 70 43         xToken(pC
5260: 74 78 2c 20 30 2c 20 22 77 6f 6e 22 2c 20 20 20  tx, 0, "won",   
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 33 2c 20 20 32 2c 20 20 35 29 3b 0d 0a 2a 2a   3,  2,  5);..**
5290: 20 20 20 20 20 20 20 78 54 6f 6b 65 6e 28 70 43         xToken(pC
52a0: 74 78 2c 20 30 2c 20 22 66 69 72 73 74 22 2c 20  tx, 0, "first", 
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 35 2c 20 20 36 2c 20 31 31 29 3b 0d 0a 2a 2a   5,  6, 11);..**
52d0: 20 20 20 20 20 20 20 78 54 6f 6b 65 6e 28 70 43         xToken(pC
52e0: 74 78 2c 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43  tx, FTS5_TOKEN_C
52f0: 4f 4c 4f 43 41 54 45 44 2c 20 22 31 73 74 22 2c  OLOCATED, "1st",
5300: 20 33 2c 20 20 36 2c 20 31 31 29 3b 0d 0a 2a 2a   3,  6, 11);..**
5310: 20 20 20 20 20 20 20 78 54 6f 6b 65 6e 28 70 43         xToken(pC
5320: 74 78 2c 20 30 2c 20 22 70 6c 61 63 65 22 2c 20  tx, 0, "place", 
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 20 35 2c 20 31 32 2c 20 31 37 29 3b 0d 0a 2a 2a   5, 12, 17);..**
5350: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a  </codeblock>..**
5360: 0d 0a 2a 2a 20 20 20 49 74 20 69 73 20 61 6e 20  ..**   It is an 
5370: 65 72 72 6f 72 20 74 6f 20 73 70 65 63 69 66 79  error to specify
5380: 20 74 68 65 20 46 54 53 35 5f 54 4f 4b 45 4e 5f   the FTS5_TOKEN_
5390: 43 4f 4c 4f 43 41 54 45 44 20 66 6c 61 67 20 74  COLOCATED flag t
53a0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0d 0a 2a  he first time..*
53b0: 2a 20 20 20 78 54 6f 6b 65 6e 28 29 20 69 73 20  *   xToken() is 
53c0: 63 61 6c 6c 65 64 2e 20 4d 75 6c 74 69 70 6c 65  called. Multiple
53d0: 20 73 79 6e 6f 6e 79 6d 73 20 6d 61 79 20 62 65   synonyms may be
53e0: 20 73 70 65 63 69 66 69 65 64 20 66 6f 72 20 61   specified for a
53f0: 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 0d 0a 2a   single token..*
5400: 2a 20 20 20 62 79 20 6d 61 6b 69 6e 67 20 6d 75  *   by making mu
5410: 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20  ltiple calls to 
5420: 78 54 6f 6b 65 6e 28 46 54 53 35 5f 54 4f 4b 45  xToken(FTS5_TOKE
5430: 4e 5f 43 4f 4c 4f 43 41 54 45 44 29 20 69 6e 20  N_COLOCATED) in 
5440: 73 65 71 75 65 6e 63 65 2e 20 0d 0a 2a 2a 20 20  sequence. ..**  
5450: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   There is no lim
5460: 69 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  it to the number
5470: 20 6f 66 20 73 79 6e 6f 6e 79 6d 73 20 74 68 61   of synonyms tha
5480: 74 20 6d 61 79 20 62 65 20 70 72 6f 76 69 64 65  t may be provide
5490: 64 20 66 6f 72 20 61 0d 0a 2a 2a 20 20 20 73 69  d for a..**   si
54a0: 6e 67 6c 65 20 74 6f 6b 65 6e 2e 0d 0a 2a 2a 0d  ngle token...**.
54b0: 0a 2a 2a 20 20 20 49 6e 20 6d 61 6e 79 20 63 61  .**   In many ca
54c0: 73 65 73 2c 20 6d 65 74 68 6f 64 20 28 31 29 20  ses, method (1) 
54d0: 61 62 6f 76 65 20 69 73 20 74 68 65 20 62 65 73  above is the bes
54e0: 74 20 61 70 70 72 6f 61 63 68 2e 20 49 74 20 64  t approach. It d
54f0: 6f 65 73 20 6e 6f 74 20 61 64 64 20 0d 0a 2a 2a  oes not add ..**
5500: 20 20 20 65 78 74 72 61 20 64 61 74 61 20 74 6f     extra data to
5510: 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 6f   the FTS index o
5520: 72 20 72 65 71 75 69 72 65 20 46 54 53 35 20 74  r require FTS5 t
5530: 6f 20 71 75 65 72 79 20 66 6f 72 20 6d 75 6c 74  o query for mult
5540: 69 70 6c 65 20 74 65 72 6d 73 2c 0d 0a 2a 2a 20  iple terms,..** 
5550: 20 20 73 6f 20 69 74 20 69 73 20 65 66 66 69 63    so it is effic
5560: 69 65 6e 74 20 69 6e 20 74 65 72 6d 73 20 6f 66  ient in terms of
5570: 20 64 69 73 6b 20 73 70 61 63 65 20 61 6e 64 20   disk space and 
5580: 71 75 65 72 79 20 73 70 65 65 64 2e 20 48 6f 77  query speed. How
5590: 65 76 65 72 2c 20 69 74 0d 0a 2a 2a 20 20 20 64  ever, it..**   d
55a0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
55b0: 70 72 65 66 69 78 20 71 75 65 72 69 65 73 20 76  prefix queries v
55c0: 65 72 79 20 77 65 6c 6c 2e 20 49 66 2c 20 61 73  ery well. If, as
55d0: 20 73 75 67 67 65 73 74 65 64 20 61 62 6f 76 65   suggested above
55e0: 2c 20 74 68 65 0d 0a 2a 2a 20 20 20 74 6f 6b 65  , the..**   toke
55f0: 6e 20 22 66 69 72 73 74 22 20 69 73 20 73 75 62  n "first" is sub
5600: 73 74 69 74 75 74 65 64 20 66 6f 72 20 22 31 73  stituted for "1s
5610: 74 22 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 69  t" by the tokeni
5620: 7a 65 72 2c 20 74 68 65 6e 20 74 68 65 20 71 75  zer, then the qu
5630: 65 72 79 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 3c  ery:..**..**   <
5640: 63 6f 64 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a 20 20  codeblock>..**  
5650: 20 20 20 2e 2e 2e 20 4d 41 54 43 48 20 27 31 73     ... MATCH '1s
5660: 2a 27 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0d 0a  *'</codeblock>..
5670: 2a 2a 0d 0a 2a 2a 20 20 20 77 69 6c 6c 20 6e 6f  **..**   will no
5680: 74 20 6d 61 74 63 68 20 64 6f 63 75 6d 65 6e 74  t match document
5690: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74  s that contain t
56a0: 68 65 20 74 6f 6b 65 6e 20 22 31 73 74 22 20 28  he token "1st" (
56b0: 61 73 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  as the tokenizer
56c0: 0d 0a 2a 2a 20 20 20 77 69 6c 6c 20 70 72 6f 62  ..**   will prob
56d0: 61 62 6c 79 20 6e 6f 74 20 6d 61 70 20 22 31 73  ably not map "1s
56e0: 22 20 74 6f 20 61 6e 79 20 70 72 65 66 69 78 20  " to any prefix 
56f0: 6f 66 20 22 66 69 72 73 74 22 29 2e 0d 0a 2a 2a  of "first")...**
5700: 0d 0a 2a 2a 20 20 20 46 6f 72 20 66 75 6c 6c 20  ..**   For full 
5710: 70 72 65 66 69 78 20 73 75 70 70 6f 72 74 2c 20  prefix support, 
5720: 6d 65 74 68 6f 64 20 28 33 29 20 6d 61 79 20 62  method (3) may b
5730: 65 20 70 72 65 66 65 72 72 65 64 2e 20 49 6e 20  e preferred. In 
5740: 74 68 69 73 20 63 61 73 65 2c 20 0d 0a 2a 2a 20  this case, ..** 
5750: 20 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e    because the in
5760: 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  dex contains ent
5770: 72 69 65 73 20 66 6f 72 20 62 6f 74 68 20 22 66  ries for both "f
5780: 69 72 73 74 22 20 61 6e 64 20 22 31 73 74 22 2c  irst" and "1st",
5790: 20 70 72 65 66 69 78 0d 0a 2a 2a 20 20 20 71 75   prefix..**   qu
57a0: 65 72 69 65 73 20 73 75 63 68 20 61 73 20 27 66  eries such as 'f
57b0: 69 2a 27 20 6f 72 20 27 31 73 2a 27 20 77 69 6c  i*' or '1s*' wil
57c0: 6c 20 6d 61 74 63 68 20 63 6f 72 72 65 63 74 6c  l match correctl
57d0: 79 2e 20 48 6f 77 65 76 65 72 2c 20 62 65 63 61  y. However, beca
57e0: 75 73 65 0d 0a 2a 2a 20 20 20 65 78 74 72 61 20  use..**   extra 
57f0: 65 6e 74 72 69 65 73 20 61 72 65 20 61 64 64 65  entries are adde
5800: 64 20 74 6f 20 74 68 65 20 46 54 53 20 69 6e 64  d to the FTS ind
5810: 65 78 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20  ex, this method 
5820: 75 73 65 73 20 6d 6f 72 65 20 73 70 61 63 65 0d  uses more space.
5830: 0a 2a 2a 20 20 20 77 69 74 68 69 6e 20 74 68 65  .**   within the
5840: 20 64 61 74 61 62 61 73 65 2e 0d 0a 2a 2a 0d 0a   database...**..
5850: 2a 2a 20 20 20 4d 65 74 68 6f 64 20 28 32 29 20  **   Method (2) 
5860: 6f 66 66 65 72 73 20 61 20 6d 69 64 70 6f 69 6e  offers a midpoin
5870: 74 20 62 65 74 77 65 65 6e 20 28 31 29 20 61 6e  t between (1) an
5880: 64 20 28 33 29 2e 20 55 73 69 6e 67 20 74 68 69  d (3). Using thi
5890: 73 20 6d 65 74 68 6f 64 2c 0d 0a 2a 2a 20 20 20  s method,..**   
58a0: 61 20 71 75 65 72 79 20 73 75 63 68 20 61 73 20  a query such as 
58b0: 27 31 73 2a 27 20 77 69 6c 6c 20 6d 61 74 63 68  '1s*' will match
58c0: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
58d0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 6c 69 74 65  contain the lite
58e0: 72 61 6c 20 0d 0a 2a 2a 20 20 20 74 6f 6b 65 6e  ral ..**   token
58f0: 20 22 31 73 74 22 2c 20 62 75 74 20 6e 6f 74 20   "1st", but not 
5900: 22 66 69 72 73 74 22 20 28 61 73 73 75 6d 69 6e  "first" (assumin
5910: 67 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20  g the tokenizer 
5920: 69 73 20 6e 6f 74 20 61 62 6c 65 20 74 6f 0d 0a  is not able to..
5930: 2a 2a 20 20 20 70 72 6f 76 69 64 65 20 73 79 6e  **   provide syn
5940: 6f 6e 79 6d 73 20 66 6f 72 20 70 72 65 66 69 78  onyms for prefix
5950: 65 73 29 2e 20 48 6f 77 65 76 65 72 2c 20 61 20  es). However, a 
5960: 6e 6f 6e 2d 70 72 65 66 69 78 20 71 75 65 72 79  non-prefix query
5970: 20 6c 69 6b 65 20 27 31 73 74 27 0d 0a 2a 2a 20   like '1st'..** 
5980: 20 20 77 69 6c 6c 20 6d 61 74 63 68 20 61 67 61    will match aga
5990: 69 6e 73 74 20 22 31 73 74 22 20 61 6e 64 20 22  inst "1st" and "
59a0: 66 69 72 73 74 22 2e 20 54 68 69 73 20 6d 65 74  first". This met
59b0: 68 6f 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hod does not req
59c0: 75 69 72 65 0d 0a 2a 2a 20 20 20 65 78 74 72 61  uire..**   extra
59d0: 20 64 69 73 6b 20 73 70 61 63 65 2c 20 61 73 20   disk space, as 
59e0: 6e 6f 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  no extra entries
59f0: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
5a00: 65 20 46 54 53 20 69 6e 64 65 78 2e 20 0d 0a 2a  e FTS index. ..*
5a10: 2a 20 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  *   On the other
5a20: 20 68 61 6e 64 2c 20 69 74 20 6d 61 79 20 72 65   hand, it may re
5a30: 71 75 69 72 65 20 6d 6f 72 65 20 43 50 55 20 63  quire more CPU c
5a40: 79 63 6c 65 73 20 74 6f 20 72 75 6e 20 4d 41 54  ycles to run MAT
5a50: 43 48 20 71 75 65 72 69 65 73 2c 0d 0a 2a 2a 20  CH queries,..** 
5a60: 20 20 61 73 20 73 65 70 61 72 61 74 65 20 71 75    as separate qu
5a70: 65 72 69 65 73 20 6f 66 20 74 68 65 20 46 54 53  eries of the FTS
5a80: 20 69 6e 64 65 78 20 61 72 65 20 72 65 71 75 69   index are requi
5a90: 72 65 64 20 66 6f 72 20 65 61 63 68 20 73 79 6e  red for each syn
5aa0: 6f 6e 79 6d 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  onym...**..**   
5ab0: 57 68 65 6e 20 75 73 69 6e 67 20 6d 65 74 68 6f  When using metho
5ac0: 64 73 20 28 32 29 20 6f 72 20 28 33 29 2c 20 69  ds (2) or (3), i
5ad0: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
5ae0: 68 61 74 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65  hat the tokenize
5af0: 72 20 6f 6e 6c 79 0d 0a 2a 2a 20 20 20 70 72 6f  r only..**   pro
5b00: 76 69 64 65 20 73 79 6e 6f 6e 79 6d 73 20 77 68  vide synonyms wh
5b10: 65 6e 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 64 6f  en tokenizing do
5b20: 63 75 6d 65 6e 74 20 74 65 78 74 20 28 6d 65 74  cument text (met
5b30: 68 6f 64 20 28 32 29 29 20 6f 72 20 71 75 65 72  hod (2)) or quer
5b40: 79 0d 0a 2a 2a 20 20 20 74 65 78 74 20 28 6d 65  y..**   text (me
5b50: 74 68 6f 64 20 28 33 29 29 2c 20 6e 6f 74 20 62  thod (3)), not b
5b60: 6f 74 68 2e 20 44 6f 69 6e 67 20 73 6f 20 77 69  oth. Doing so wi
5b70: 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  ll not cause any
5b80: 20 65 72 72 6f 72 73 2c 20 62 75 74 20 69 73 0d   errors, but is.
5b90: 0a 2a 2a 20 20 20 69 6e 65 66 66 69 63 69 65 6e  .**   inefficien
5ba0: 74 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20  t...*/..typedef 
5bb0: 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e  struct Fts5Token
5bc0: 69 7a 65 72 20 46 74 73 35 54 6f 6b 65 6e 69 7a  izer Fts5Tokeniz
5bd0: 65 72 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72  er;..typedef str
5be0: 75 63 74 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a  uct fts5_tokeniz
5bf0: 65 72 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  er fts5_tokenize
5c00: 72 3b 0d 0a 73 74 72 75 63 74 20 66 74 73 35 5f  r;..struct fts5_
5c10: 74 6f 6b 65 6e 69 7a 65 72 20 7b 0d 0a 20 20 69  tokenizer {..  i
5c20: 6e 74 20 28 2a 78 43 72 65 61 74 65 29 28 76 6f  nt (*xCreate)(vo
5c30: 69 64 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  id*, const char 
5c40: 2a 2a 61 7a 41 72 67 2c 20 69 6e 74 20 6e 41 72  **azArg, int nAr
5c50: 67 2c 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  g, Fts5Tokenizer
5c60: 20 2a 2a 70 70 4f 75 74 29 3b 0d 0a 20 20 76 6f   **ppOut);..  vo
5c70: 69 64 20 28 2a 78 44 65 6c 65 74 65 29 28 46 74  id (*xDelete)(Ft
5c80: 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 29 3b 0d 0a  s5Tokenizer*);..
5c90: 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 69 7a    int (*xTokeniz
5ca0: 65 29 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  e)(Fts5Tokenizer
5cb0: 2a 2c 20 0d 0a 20 20 20 20 20 20 76 6f 69 64 20  *, ..      void 
5cc0: 2a 70 43 74 78 2c 0d 0a 20 20 20 20 20 20 69 6e  *pCtx,..      in
5cd0: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
5ce0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
5cf0: 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 2a 20 66  TS5_TOKENIZE_* f
5d00: 6c 61 67 73 20 2a 2f 0d 0a 20 20 20 20 20 20 63  lags */..      c
5d10: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 78 74  onst char *pText
5d20: 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20 0d 0a 20  , int nText, .. 
5d30: 20 20 20 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65       int (*xToke
5d40: 6e 29 28 0d 0a 20 20 20 20 20 20 20 20 76 6f 69  n)(..        voi
5d50: 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  d *pCtx,        
5d60: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 32 6e 64 20   /* Copy of 2nd 
5d70: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 54 6f 6b  argument to xTok
5d80: 65 6e 69 7a 65 28 29 20 2a 2f 0d 0a 20 20 20 20  enize() */..    
5d90: 20 20 20 20 69 6e 74 20 74 66 6c 61 67 73 2c 20      int tflags, 
5da0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
5db0: 6f 66 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20  of FTS5_TOKEN_* 
5dc0: 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 20 20 20 20  flags */..      
5dd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
5de0: 6f 6b 65 6e 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  oken, /* Pointer
5df0: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
5e00: 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0d 0a  ining token */..
5e10: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b          int nTok
5e20: 65 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  en,         /* S
5e30: 69 7a 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20  ize of token in 
5e40: 62 79 74 65 73 20 2a 2f 0d 0a 20 20 20 20 20 20  bytes */..      
5e50: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
5e60: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
5e70: 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 77 69  fset of token wi
5e80: 74 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20  thin input text 
5e90: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20  */..        int 
5ea0: 69 45 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  iEnd            
5eb0: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f  /* Byte offset o
5ec0: 66 20 65 6e 64 20 6f 66 20 74 6f 6b 65 6e 20 77  f end of token w
5ed0: 69 74 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74  ithin input text
5ee0: 20 2a 2f 0d 0a 20 20 20 20 20 20 29 0d 0a 20 20   */..      )..  
5ef0: 29 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 20 46 6c 61  );..};..../* Fla
5f00: 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
5f10: 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69  assed as the thi
5f20: 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  rd argument to x
5f30: 54 6f 6b 65 6e 69 7a 65 28 29 20 2a 2f 0d 0a 23  Tokenize() */..#
5f40: 64 65 66 69 6e 65 20 46 54 53 35 5f 54 4f 4b 45  define FTS5_TOKE
5f50: 4e 49 5a 45 5f 51 55 45 52 59 20 20 20 20 20 30  NIZE_QUERY     0
5f60: 78 30 30 30 31 0d 0a 23 64 65 66 69 6e 65 20 46  x0001..#define F
5f70: 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 50 52 45  TS5_TOKENIZE_PRE
5f80: 46 49 58 20 20 20 20 30 78 30 30 30 32 0d 0a 23  FIX    0x0002..#
5f90: 64 65 66 69 6e 65 20 46 54 53 35 5f 54 4f 4b 45  define FTS5_TOKE
5fa0: 4e 49 5a 45 5f 44 4f 43 55 4d 45 4e 54 20 20 30  NIZE_DOCUMENT  0
5fb0: 78 30 30 30 34 0d 0a 23 64 65 66 69 6e 65 20 46  x0004..#define F
5fc0: 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 41 55 58  TS5_TOKENIZE_AUX
5fd0: 20 20 20 20 20 20 20 30 78 30 30 30 38 0d 0a 0d         0x0008...
5fe0: 0a 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 6d  ./* Flags that m
5ff0: 61 79 20 62 65 20 70 61 73 73 65 64 20 62 79 20  ay be passed by 
6000: 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d  the tokenizer im
6010: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 61 63  plementation bac
6020: 6b 20 74 6f 20 46 54 53 35 0d 0a 2a 2a 20 61 73  k to FTS5..** as
6030: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
6040: 65 6e 74 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ent to the suppl
6050: 69 65 64 20 78 54 6f 6b 65 6e 20 63 61 6c 6c 62  ied xToken callb
6060: 61 63 6b 2e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65  ack. */..#define
6070: 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f   FTS5_TOKEN_COLO
6080: 43 41 54 45 44 20 20 20 20 30 78 30 30 30 31 20  CATED    0x0001 
6090: 20 20 20 20 20 2f 2a 20 53 61 6d 65 20 70 6f 73       /* Same pos
60a0: 69 74 69 6f 6e 20 61 73 20 70 72 65 76 2e 20 74  ition as prev. t
60b0: 6f 6b 65 6e 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a  oken */..../*..*
60c0: 2a 20 45 4e 44 20 4f 46 20 43 55 53 54 4f 4d 20  * END OF CUSTOM 
60d0: 54 4f 4b 45 4e 49 5a 45 52 53 0d 0a 2a 2a 2a 2a  TOKENIZERS..****
60e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6120: 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a  *****/..../*****
6130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6170: 2a 2a 2a 2a 0d 0a 2a 2a 20 46 54 53 35 20 45 58  ****..** FTS5 EX
6180: 54 45 4e 53 49 4f 4e 20 52 45 47 49 53 54 52 41  TENSION REGISTRA
6190: 54 49 4f 4e 20 41 50 49 0d 0a 2a 2f 0d 0a 74 79  TION API..*/..ty
61a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 66 74 73  pedef struct fts
61b0: 35 5f 61 70 69 20 66 74 73 35 5f 61 70 69 3b 0d  5_api fts5_api;.
61c0: 0a 73 74 72 75 63 74 20 66 74 73 35 5f 61 70 69  .struct fts5_api
61d0: 20 7b 0d 0a 20 20 69 6e 74 20 69 56 65 72 73 69   {..  int iVersi
61e0: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
61f0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
6200: 6c 79 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  ly always set to
6210: 20 32 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 43 72   2 */....  /* Cr
6220: 65 61 74 65 20 61 20 6e 65 77 20 74 6f 6b 65 6e  eate a new token
6230: 69 7a 65 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 28  izer */..  int (
6240: 2a 78 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65  *xCreateTokenize
6250: 72 29 28 0d 0a 20 20 20 20 66 74 73 35 5f 61 70  r)(..    fts5_ap
6260: 69 20 2a 70 41 70 69 2c 0d 0a 20 20 20 20 63 6f  i *pApi,..    co
6270: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
6280: 0d 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 6f 6e  ..    void *pCon
6290: 74 65 78 74 2c 0d 0a 20 20 20 20 66 74 73 35 5f  text,..    fts5_
62a0: 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65  tokenizer *pToke
62b0: 6e 69 7a 65 72 2c 0d 0a 20 20 20 20 76 6f 69 64  nizer,..    void
62c0: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
62d0: 64 2a 29 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20 2f  d*)..  );....  /
62e0: 2a 20 46 69 6e 64 20 61 6e 20 65 78 69 73 74 69  * Find an existi
62f0: 6e 67 20 74 6f 6b 65 6e 69 7a 65 72 20 2a 2f 0d  ng tokenizer */.
6300: 0a 20 20 69 6e 74 20 28 2a 78 46 69 6e 64 54 6f  .  int (*xFindTo
6310: 6b 65 6e 69 7a 65 72 29 28 0d 0a 20 20 20 20 66  kenizer)(..    f
6320: 74 73 35 5f 61 70 69 20 2a 70 41 70 69 2c 0d 0a  ts5_api *pApi,..
6330: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6340: 7a 4e 61 6d 65 2c 0d 0a 20 20 20 20 76 6f 69 64  zName,..    void
6350: 20 2a 2a 70 70 43 6f 6e 74 65 78 74 2c 0d 0a 20   **ppContext,.. 
6360: 20 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65     fts5_tokenize
6370: 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 0d 0a 20  r *pTokenizer.. 
6380: 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 72 65 61   );....  /* Crea
6390: 74 65 20 61 20 6e 65 77 20 61 75 78 69 6c 69 61  te a new auxilia
63a0: 72 79 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a  ry function */..
63b0: 20 20 69 6e 74 20 28 2a 78 43 72 65 61 74 65 46    int (*xCreateF
63c0: 75 6e 63 74 69 6f 6e 29 28 0d 0a 20 20 20 20 66  unction)(..    f
63d0: 74 73 35 5f 61 70 69 20 2a 70 41 70 69 2c 0d 0a  ts5_api *pApi,..
63e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
63f0: 7a 4e 61 6d 65 2c 0d 0a 20 20 20 20 76 6f 69 64  zName,..    void
6400: 20 2a 70 43 6f 6e 74 65 78 74 2c 0d 0a 20 20 20   *pContext,..   
6410: 20 66 74 73 35 5f 65 78 74 65 6e 73 69 6f 6e 5f   fts5_extension_
6420: 66 75 6e 63 74 69 6f 6e 20 78 46 75 6e 63 74 69  function xFuncti
6430: 6f 6e 2c 0d 0a 20 20 20 20 76 6f 69 64 20 28 2a  on,..    void (*
6440: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29  xDestroy)(void*)
6450: 0d 0a 20 20 29 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a  ..  );..};..../*
6460: 0d 0a 2a 2a 20 45 4e 44 20 4f 46 20 52 45 47 49  ..** END OF REGI
6470: 53 54 52 41 54 49 4f 4e 20 41 50 49 0d 0a 2a 2a  STRATION API..**
6480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64c0: 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 23 69 66 64  *******/....#ifd
64d0: 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0d 0a  ef __cplusplus..
64e0: 7d 20 20 2f 2a 20 65 6e 64 20 6f 66 20 74 68 65  }  /* end of the
64f0: 20 27 65 78 74 65 72 6e 20 22 43 22 27 20 62 6c   'extern "C"' bl
6500: 6f 63 6b 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a  ock */..#endif..
6510: 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 46 54 53  ..#endif /* _FTS
6520: 35 5f 48 20 2a 2f 0d 0a 0d 0a 23 6c 69 6e 65 20  5_H */....#line 
6530: 31 20 22 66 74 73 35 49 6e 74 2e 68 22 0d 0a 2f  1 "fts5Int.h"../
6540: 2a 0d 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  *..** 2014 May 3
6550: 31 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75  1..**..** The au
6560: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
6570: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
6580: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
6590: 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61  n place of..** a
65a0: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
65b0: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
65c0: 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61  g:..**..**    Ma
65d0: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
65e0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20  d not evil...** 
65f0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
6600: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
6610: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
6620: 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a  give others...**
6630: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
6640: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
6650: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
6660: 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a   you give...**..
6670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a  **************..
66c0: 2a 2a 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20  **..*/..#ifndef 
66d0: 5f 46 54 53 35 49 4e 54 5f 48 0d 0a 23 64 65 66  _FTS5INT_H..#def
66e0: 69 6e 65 20 5f 46 54 53 35 49 4e 54 5f 48 0d 0a  ine _FTS5INT_H..
66f0: 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 22 66  ../* #include "f
6700: 74 73 35 2e 68 22 20 2a 2f 0d 0a 23 69 6e 63 6c  ts5.h" */..#incl
6710: 75 64 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e  ude "sqlite3ext.
6720: 68 22 0d 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  h"..SQLITE_EXTEN
6730: 53 49 4f 4e 5f 49 4e 49 54 31 0d 0a 0d 0a 23 69  SION_INIT1....#i
6740: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
6750: 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  >..#include <ass
6760: 65 72 74 2e 68 3e 0d 0a 0d 0a 23 69 66 6e 64 65  ert.h>....#ifnde
6770: 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  f SQLITE_AMALGAM
6780: 41 54 49 4f 4e 0d 0a 0d 0a 74 79 70 65 64 65 66  ATION....typedef
6790: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20   unsigned char  
67a0: 75 38 3b 0d 0a 74 79 70 65 64 65 66 20 75 6e 73  u8;..typedef uns
67b0: 69 67 6e 65 64 20 69 6e 74 20 20 20 75 33 32 3b  igned int   u32;
67c0: 0d 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ..typedef unsign
67d0: 65 64 20 73 68 6f 72 74 20 75 31 36 3b 0d 0a 74  ed short u16;..t
67e0: 79 70 65 64 65 66 20 73 68 6f 72 74 20 69 31 36  ypedef short i16
67f0: 3b 0d 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74  ;..typedef sqlit
6800: 65 33 5f 69 6e 74 36 34 20 69 36 34 3b 0d 0a 74  e3_int64 i64;..t
6810: 79 70 65 64 65 66 20 73 71 6c 69 74 65 33 5f 75  ypedef sqlite3_u
6820: 69 6e 74 36 34 20 75 36 34 3b 0d 0a 0d 0a 23 69  int64 u64;....#i
6830: 66 6e 64 65 66 20 41 72 72 61 79 53 69 7a 65 0d  fndef ArraySize.
6840: 0a 23 20 64 65 66 69 6e 65 20 41 72 72 61 79 53  .# define ArrayS
6850: 69 7a 65 28 78 29 20 28 28 69 6e 74 29 28 73 69  ize(x) ((int)(si
6860: 7a 65 6f 66 28 78 29 20 2f 20 73 69 7a 65 6f 66  zeof(x) / sizeof
6870: 28 78 5b 30 5d 29 29 29 0d 0a 23 65 6e 64 69 66  (x[0])))..#endif
6880: 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 74 65 73 74  ....#define test
6890: 63 61 73 65 28 78 29 0d 0a 23 64 65 66 69 6e 65  case(x)..#define
68a0: 20 41 4c 57 41 59 53 28 78 29 20 31 0d 0a 23 64   ALWAYS(x) 1..#d
68b0: 65 66 69 6e 65 20 4e 45 56 45 52 28 78 29 20 30  efine NEVER(x) 0
68c0: 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 4d 49 4e 28  ....#define MIN(
68d0: 78 2c 79 29 20 28 28 28 78 29 20 3c 20 28 79 29  x,y) (((x) < (y)
68e0: 29 20 3f 20 28 78 29 20 3a 20 28 79 29 29 0d 0a  ) ? (x) : (y))..
68f0: 23 64 65 66 69 6e 65 20 4d 41 58 28 78 2c 79 29  #define MAX(x,y)
6900: 20 28 28 28 78 29 20 3e 20 28 79 29 29 20 3f 20   (((x) > (y)) ? 
6910: 28 78 29 20 3a 20 28 79 29 29 0d 0a 0d 0a 2f 2a  (x) : (y))..../*
6920: 0d 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 66  ..** Constants f
6930: 6f 72 20 74 68 65 20 6c 61 72 67 65 73 74 20 61  or the largest a
6940: 6e 64 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73  nd smallest poss
6950: 69 62 6c 65 20 36 34 2d 62 69 74 20 73 69 67 6e  ible 64-bit sign
6960: 65 64 20 69 6e 74 65 67 65 72 73 2e 0d 0a 2a 2f  ed integers...*/
6970: 0d 0a 23 20 64 65 66 69 6e 65 20 4c 41 52 47 45  ..# define LARGE
6980: 53 54 5f 49 4e 54 36 34 20 20 28 30 78 66 66 66  ST_INT64  (0xfff
6990: 66 66 66 66 66 7c 28 28 28 69 36 34 29 30 78 37  fffff|(((i64)0x7
69a0: 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0d 0a  fffffff)<<32))..
69b0: 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53  # define SMALLES
69c0: 54 5f 49 4e 54 36 34 20 28 28 28 69 36 34 29 2d  T_INT64 (((i64)-
69d0: 31 29 20 2d 20 4c 41 52 47 45 53 54 5f 49 4e 54  1) - LARGEST_INT
69e0: 36 34 29 0d 0a 0d 0a 23 65 6e 64 69 66 0d 0a 0d  64)....#endif...
69f0: 0a 2f 2a 20 54 72 75 6e 63 61 74 65 20 76 65 72  ./* Truncate ver
6a00: 79 20 6c 6f 6e 67 20 74 6f 6b 65 6e 73 20 74 6f  y long tokens to
6a10: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
6a20: 2e 20 48 61 72 64 20 6c 69 6d 69 74 20 69 73 20  . Hard limit is 
6a30: 0d 0a 2a 2a 20 28 36 35 35 33 36 2d 31 2d 31 2d  ..** (65536-1-1-
6a40: 34 2d 39 29 3d 3d 36 35 35 32 31 20 62 79 74 65  4-9)==65521 byte
6a50: 73 2e 20 54 68 65 20 6c 69 6d 69 74 69 6e 67 20  s. The limiting 
6a60: 66 61 63 74 6f 72 20 69 73 20 74 68 65 20 31 36  factor is the 16
6a70: 2d 62 69 74 20 6f 66 66 73 65 74 0d 0a 2a 2a 20  -bit offset..** 
6a80: 66 69 65 6c 64 20 74 68 61 74 20 6f 63 63 75 72  field that occur
6a90: 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
6aa0: 66 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65  f each leaf page
6ab0: 20 28 73 65 65 20 66 74 73 35 5f 69 6e 64 65 78   (see fts5_index
6ac0: 2e 63 29 2e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65  .c). */..#define
6ad0: 20 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f   FTS5_MAX_TOKEN_
6ae0: 53 49 5a 45 20 33 32 37 36 38 0d 0a 0d 0a 2f 2a  SIZE 32768..../*
6af0: 0d 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  ..** Maximum num
6b00: 62 65 72 20 6f 66 20 70 72 65 66 69 78 20 69 6e  ber of prefix in
6b10: 64 65 78 65 73 20 6f 6e 20 73 69 6e 67 6c 65 20  dexes on single 
6b20: 46 54 53 35 20 74 61 62 6c 65 2e 20 54 68 69 73  FTS5 table. This
6b30: 20 6d 75 73 74 20 62 65 0d 0a 2a 2a 20 6c 65 73   must be..** les
6b40: 73 20 74 68 61 6e 20 33 32 2e 20 49 66 20 69 74  s than 32. If it
6b50: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 79 74 68   is set to anyth
6b60: 69 6e 67 20 6c 61 72 67 65 20 74 68 61 6e 20 74  ing large than t
6b70: 68 61 74 2c 20 61 6e 20 23 65 72 72 6f 72 0d 0a  hat, an #error..
6b80: 2a 2a 20 64 69 72 65 63 74 69 76 65 20 69 6e 20  ** directive in 
6b90: 66 74 73 35 5f 69 6e 64 65 78 2e 63 20 77 69 6c  fts5_index.c wil
6ba0: 6c 20 63 61 75 73 65 20 74 68 65 20 62 75 69 6c  l cause the buil
6bb0: 64 20 74 6f 20 66 61 69 6c 2e 0d 0a 2a 2f 0d 0a  d to fail...*/..
6bc0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
6bd0: 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20  _PREFIX_INDEXES 
6be0: 33 31 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 46 54  31....#define FT
6bf0: 53 35 5f 44 45 46 41 55 4c 54 5f 4e 45 41 52 44  S5_DEFAULT_NEARD
6c00: 49 53 54 20 31 30 0d 0a 23 64 65 66 69 6e 65 20  IST 10..#define 
6c10: 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 52 41 4e  FTS5_DEFAULT_RAN
6c20: 4b 20 20 20 20 20 22 62 6d 32 35 22 0d 0a 0d 0a  K     "bm25"....
6c30: 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 61 6e 6b 20  /* Name of rank 
6c40: 61 6e 64 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  and rowid column
6c50: 73 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54  s */..#define FT
6c60: 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45 20 22 72 61  S5_RANK_NAME "ra
6c70: 6e 6b 22 0d 0a 23 64 65 66 69 6e 65 20 46 54 53  nk"..#define FTS
6c80: 35 5f 52 4f 57 49 44 5f 4e 41 4d 45 20 22 72 6f  5_ROWID_NAME "ro
6c90: 77 69 64 22 0d 0a 0d 0a 23 69 66 64 65 66 20 53  wid"....#ifdef S
6ca0: 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 23 20 64  QLITE_DEBUG..# d
6cb0: 65 66 69 6e 65 20 46 54 53 35 5f 43 4f 52 52 55  efine FTS5_CORRU
6cc0: 50 54 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f  PT sqlite3Fts5Co
6cd0: 72 72 75 70 74 28 29 0d 0a 73 74 61 74 69 63 20  rrupt()..static 
6ce0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
6cf0: 6f 72 72 75 70 74 28 76 6f 69 64 29 3b 0d 0a 23  orrupt(void);..#
6d00: 65 6c 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 46  else..# define F
6d10: 54 53 35 5f 43 4f 52 52 55 50 54 20 53 51 4c 49  TS5_CORRUPT SQLI
6d20: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 0d  TE_CORRUPT_VTAB.
6d30: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a  .#endif..../*..*
6d40: 2a 20 54 68 65 20 61 73 73 65 72 74 5f 6e 63 28  * The assert_nc(
6d50: 29 20 6d 61 63 72 6f 20 69 73 20 73 69 6d 69 6c  ) macro is simil
6d60: 61 72 20 74 6f 20 74 68 65 20 61 73 73 65 72 74  ar to the assert
6d70: 28 29 20 6d 61 63 72 6f 2c 20 65 78 63 65 70 74  () macro, except
6d80: 20 74 68 61 74 20 69 74 0d 0a 2a 2a 20 69 73 20   that it..** is 
6d90: 75 73 65 64 20 66 6f 72 20 61 73 73 65 72 74 28  used for assert(
6da0: 29 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  ) conditions tha
6db0: 74 20 61 72 65 20 74 72 75 65 20 6f 6e 6c 79 20  t are true only 
6dc0: 69 66 20 69 74 20 63 61 6e 20 62 65 20 0d 0a 2a  if it can be ..*
6dd0: 2a 20 67 75 72 61 6e 74 65 65 64 20 74 68 61 74  * guranteed that
6de0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
6df0: 20 6e 6f 74 20 63 6f 72 72 75 70 74 2e 0d 0a 2a   not corrupt...*
6e00: 2f 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
6e10: 5f 44 45 42 55 47 0d 0a 65 78 74 65 72 6e 20 69  _DEBUG..extern i
6e20: 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  nt sqlite3_fts5_
6e30: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 3b 0d  may_be_corrupt;.
6e40: 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
6e50: 5f 6e 63 28 78 29 20 61 73 73 65 72 74 28 73 71  _nc(x) assert(sq
6e60: 6c 69 74 65 33 5f 66 74 73 35 5f 6d 61 79 5f 62  lite3_fts5_may_b
6e70: 65 5f 63 6f 72 72 75 70 74 20 7c 7c 20 28 78 29  e_corrupt || (x)
6e80: 29 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69  )..#else..# defi
6e90: 6e 65 20 61 73 73 65 72 74 5f 6e 63 28 78 29 20  ne assert_nc(x) 
6ea0: 61 73 73 65 72 74 28 78 29 0d 0a 23 65 6e 64 69  assert(x)..#endi
6eb0: 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 76 65  f..../*..** A ve
6ec0: 72 73 69 6f 6e 20 6f 66 20 6d 65 6d 63 6d 70 28  rsion of memcmp(
6ed0: 29 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  ) that does not 
6ee0: 63 61 75 73 65 20 61 73 61 6e 20 65 72 72 6f 72  cause asan error
6ef0: 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
6f00: 70 6f 69 6e 74 65 72 0d 0a 2a 2a 20 70 61 72 61  pointer..** para
6f10: 6d 65 74 65 72 73 20 69 73 20 4e 55 4c 4c 20 61  meters is NULL a
6f20: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
6f30: 20 62 79 74 65 73 20 74 6f 20 63 6f 6d 70 61 72   bytes to compar
6f40: 65 20 69 73 20 7a 65 72 6f 2e 0d 0a 2a 2f 0d 0a  e is zero...*/..
6f50: 23 64 65 66 69 6e 65 20 66 74 73 35 4d 65 6d 63  #define fts5Memc
6f60: 6d 70 28 73 31 2c 20 73 32 2c 20 6e 29 20 28 28  mp(s1, s2, n) ((
6f70: 6e 29 3d 3d 30 20 3f 20 30 20 3a 20 6d 65 6d 63  n)==0 ? 0 : memc
6f80: 6d 70 28 28 73 31 29 2c 20 28 73 32 29 2c 20 28  mp((s1), (s2), (
6f90: 6e 29 29 29 0d 0a 0d 0a 2f 2a 20 4d 61 72 6b 20  n)))..../* Mark 
6fa0: 61 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  a function param
6fb0: 65 74 65 72 20 61 73 20 75 6e 75 73 65 64 2c 20  eter as unused, 
6fc0: 74 6f 20 73 75 70 70 72 65 73 73 20 6e 75 69 73  to suppress nuis
6fd0: 61 6e 63 65 20 63 6f 6d 70 69 6c 65 72 0d 0a 2a  ance compiler..*
6fe0: 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a 2f 0d 0a  * warnings. */..
6ff0: 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 50  #ifndef UNUSED_P
7000: 41 52 41 4d 0d 0a 23 20 64 65 66 69 6e 65 20 55  ARAM..# define U
7010: 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20 20  NUSED_PARAM(X)  
7020: 28 76 6f 69 64 29 28 58 29 0d 0a 23 65 6e 64 69  (void)(X)..#endi
7030: 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 55 4e 55  f....#ifndef UNU
7040: 53 45 44 5f 50 41 52 41 4d 32 0d 0a 23 20 64 65  SED_PARAM2..# de
7050: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
7060: 4d 32 28 58 2c 20 59 29 20 20 28 76 6f 69 64 29  M2(X, Y)  (void)
7070: 28 58 29 2c 20 28 76 6f 69 64 29 28 59 29 0d 0a  (X), (void)(Y)..
7080: 23 65 6e 64 69 66 0d 0a 0d 0a 74 79 70 65 64 65  #endif....typede
7090: 66 20 73 74 72 75 63 74 20 46 74 73 35 47 6c 6f  f struct Fts5Glo
70a0: 62 61 6c 20 46 74 73 35 47 6c 6f 62 61 6c 3b 0d  bal Fts5Global;.
70b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
70c0: 46 74 73 35 43 6f 6c 73 65 74 20 46 74 73 35 43  Fts5Colset Fts5C
70d0: 6f 6c 73 65 74 3b 0d 0a 0d 0a 2f 2a 20 49 66 20  olset;..../* If 
70e0: 61 20 4e 45 41 52 28 29 20 63 6c 75 6d 70 20 6f  a NEAR() clump o
70f0: 72 20 70 68 72 61 73 65 20 6d 61 79 20 6f 6e 6c  r phrase may onl
7100: 79 20 6d 61 74 63 68 20 61 20 73 70 65 63 69 66  y match a specif
7110: 69 63 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  ic set of column
7120: 73 2c 20 0d 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  s, ..** then an 
7130: 6f 62 6a 65 63 74 20 6f 66 20 74 68 65 20 66 6f  object of the fo
7140: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20  llowing type is 
7150: 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 74  used to record t
7160: 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
7170: 73 2e 0d 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  s...** Each entr
7180: 79 20 69 6e 20 74 68 65 20 61 69 43 6f 6c 5b 5d  y in the aiCol[]
7190: 20 61 72 72 61 79 20 69 73 20 61 20 63 6f 6c 75   array is a colu
71a0: 6d 6e 20 74 68 61 74 20 6d 61 79 20 62 65 20 6d  mn that may be m
71b0: 61 74 63 68 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  atched...**..** 
71c0: 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 75  This object is u
71d0: 73 65 64 20 62 79 20 66 74 73 35 5f 65 78 70 72  sed by fts5_expr
71e0: 2e 63 20 61 6e 64 20 66 74 73 35 5f 69 6e 64 65  .c and fts5_inde
71f0: 78 2e 63 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74  x.c...*/..struct
7200: 20 46 74 73 35 43 6f 6c 73 65 74 20 7b 0d 0a 20   Fts5Colset {.. 
7210: 20 69 6e 74 20 6e 43 6f 6c 3b 0d 0a 20 20 69 6e   int nCol;..  in
7220: 74 20 61 69 43 6f 6c 5b 31 5d 3b 0d 0a 7d 3b 0d  t aiCol[1];..};.
7230: 0a 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ......./********
7240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7280: 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  **..** Interface
7290: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
72a0: 5f 63 6f 6e 66 69 67 2e 63 2e 20 66 74 73 35 5f  _config.c. fts5_
72b0: 63 6f 6e 66 69 67 2e 63 20 63 6f 6e 74 61 69 6e  config.c contain
72c0: 73 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 0d  s contains code.
72d0: 0a 2a 2a 20 74 6f 20 70 61 72 73 65 20 74 68 65  .** to parse the
72e0: 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
72f0: 64 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20  d to the CREATE 
7300: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74  VIRTUAL TABLE st
7310: 61 74 65 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 0d 0a  atement...*/....
7320: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
7330: 74 73 35 43 6f 6e 66 69 67 20 46 74 73 35 43 6f  ts5Config Fts5Co
7340: 6e 66 69 67 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  nfig;..../*..** 
7350: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
7360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
7370: 75 63 74 75 72 65 20 65 6e 63 6f 64 65 73 20 61  ucture encodes a
7380: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ll information t
7390: 68 61 74 20 63 61 6e 0d 0a 2a 2a 20 62 65 20 67  hat can..** be g
73a0: 6c 65 61 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  leaned from the 
73b0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
73c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0d  ABLE statement..
73d0: 0a 2a 2a 0d 0a 2a 2a 20 41 6e 64 20 61 6c 6c 20  .**..** And all 
73e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 6f 61 64  information load
73f0: 65 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f  ed from the %_co
7400: 6e 66 69 67 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d  nfig table...**.
7410: 0a 2a 2a 20 6e 41 75 74 6f 6d 65 72 67 65 3a 0d  .** nAutomerge:.
7420: 0a 2a 2a 20 20 20 54 68 65 20 6d 69 6e 69 6d 75  .**   The minimu
7430: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  m number of segm
7440: 65 6e 74 73 20 74 68 61 74 20 61 6e 20 61 75 74  ents that an aut
7450: 6f 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f  o-merge operatio
7460: 6e 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 20 20 61  n should..**   a
7470: 74 74 65 6d 70 74 20 74 6f 20 6d 65 72 67 65 20  ttempt to merge 
7480: 74 6f 67 65 74 68 65 72 2e 20 41 20 76 61 6c 75  together. A valu
7490: 65 20 6f 66 20 31 20 73 65 74 73 20 74 68 65 20  e of 1 sets the 
74a0: 6f 62 6a 65 63 74 20 74 6f 20 75 73 65 20 74 68  object to use th
74b0: 65 20 0d 0a 2a 2a 20 20 20 63 6f 6d 70 69 6c 65  e ..**   compile
74c0: 20 74 69 6d 65 20 64 65 66 61 75 6c 74 2e 20 5a   time default. Z
74d0: 65 72 6f 20 64 69 73 61 62 6c 65 73 20 61 75 74  ero disables aut
74e0: 6f 2d 6d 65 72 67 65 20 61 6c 74 6f 67 65 74 68  o-merge altogeth
74f0: 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 7a 43 6f 6e  er...**..** zCon
7500: 74 65 6e 74 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 7a 43  tent:..**..** zC
7510: 6f 6e 74 65 6e 74 52 6f 77 69 64 3a 0d 0a 2a 2a  ontentRowid:..**
7520: 20 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20     The value of 
7530: 74 68 65 20 63 6f 6e 74 65 6e 74 5f 72 6f 77 69  the content_rowi
7540: 64 3d 20 6f 70 74 69 6f 6e 2c 20 69 66 20 6f 6e  d= option, if on
7550: 65 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2e  e was specified.
7560: 20 4f 72 20 0d 0a 2a 2a 20 20 20 74 68 65 20 73   Or ..**   the s
7570: 74 72 69 6e 67 20 22 72 6f 77 69 64 22 20 6f 74  tring "rowid" ot
7580: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 74 65  herwise. This te
7590: 78 74 20 69 73 20 6e 6f 74 20 71 75 6f 74 65 64  xt is not quoted
75a0: 20 2d 20 69 66 20 69 74 20 69 73 0d 0a 2a 2a 20   - if it is..** 
75b0: 20 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f    used as part o
75c0: 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  f an SQL stateme
75d0: 6e 74 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nt it needs to b
75e0: 65 20 71 75 6f 74 65 64 20 61 70 70 72 6f 70 72  e quoted appropr
75f0: 69 61 74 65 6c 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  iately...**..** 
7600: 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74  zContentExprlist
7610: 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 70 7a 45 72 72 6d  :..**..** pzErrm
7620: 73 67 3a 0d 0a 2a 2a 20 20 20 54 68 69 73 20 65  sg:..**   This e
7630: 78 69 73 74 73 20 69 6e 20 6f 72 64 65 72 20 74  xists in order t
7640: 6f 20 61 6c 6c 6f 77 20 74 68 65 20 66 74 73 35  o allow the fts5
7650: 5f 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c 65 20  _index.c module 
7660: 74 6f 20 72 65 74 75 72 6e 20 61 20 0d 0a 2a 2a  to return a ..**
7670: 20 20 20 64 65 63 65 6e 74 20 65 72 72 6f 72 20     decent error 
7680: 6d 65 73 73 61 67 65 20 69 66 20 69 74 20 65 6e  message if it en
7690: 63 6f 75 6e 74 65 72 73 20 61 20 66 69 6c 65 2d  counters a file-
76a0: 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 69  format version i
76b0: 74 20 64 6f 65 73 0d 0a 2a 2a 20 20 20 6e 6f 74  t does..**   not
76c0: 20 75 6e 64 65 72 73 74 61 6e 64 2e 0d 0a 2a 2a   understand...**
76d0: 0d 0a 2a 2a 20 62 43 6f 6c 75 6d 6e 73 69 7a 65  ..** bColumnsize
76e0: 3a 0d 0a 2a 2a 20 20 20 54 72 75 65 20 69 66 20  :..**   True if 
76f0: 74 68 65 20 25 5f 64 6f 63 73 69 7a 65 20 74 61  the %_docsize ta
7700: 62 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 0d  ble is created..
7710: 0a 2a 2a 0d 0a 2a 2a 20 62 50 72 65 66 69 78 49  .**..** bPrefixI
7720: 6e 64 65 78 3a 0d 0a 2a 2a 20 20 20 54 68 69 73  ndex:..**   This
7730: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
7740: 72 20 64 65 62 75 67 67 69 6e 67 2e 20 49 66 20  r debugging. If 
7750: 73 65 74 20 74 6f 20 66 61 6c 73 65 2c 20 61 6e  set to false, an
7760: 79 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  y prefix indexes
7770: 0d 0a 2a 2a 20 20 20 61 72 65 20 69 67 6e 6f 72  ..**   are ignor
7780: 65 64 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69  ed. This value i
7790: 73 20 63 6f 6e 66 69 67 75 72 65 64 20 75 73 69  s configured usi
77a0: 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20  ng:..**..**     
77b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
77c0: 6c 28 74 62 6c 2c 20 72 61 6e 6b 29 20 56 41 4c  l(tbl, rank) VAL
77d0: 55 45 53 28 27 70 72 65 66 69 78 2d 69 6e 64 65  UES('prefix-inde
77e0: 78 27 2c 20 24 62 50 72 65 66 69 78 49 6e 64 65  x', $bPrefixInde
77f0: 78 29 3b 0d 0a 2a 2a 0d 0a 2a 2f 0d 0a 73 74 72  x);..**..*/..str
7800: 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67 20 7b  uct Fts5Config {
7810: 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ..  sqlite3 *db;
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7830: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7840: 68 61 6e 64 6c 65 20 2a 2f 0d 0a 20 20 63 68 61  handle */..  cha
7850: 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7870: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
7880: 20 46 54 53 20 69 6e 64 65 78 20 28 65 2e 67 2e   FTS index (e.g.
7890: 20 22 6d 61 69 6e 22 29 20 2a 2f 0d 0a 20 20 63   "main") */..  c
78a0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
78c0: 2a 20 4e 61 6d 65 20 6f 66 20 46 54 53 20 69 6e  * Name of FTS in
78d0: 64 65 78 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 43  dex */..  int nC
78e0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
78f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7900: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
7910: 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  /..  char **azCo
7920: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7930: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
7940: 61 6d 65 73 20 2a 2f 0d 0a 20 20 75 38 20 2a 61  ames */..  u8 *a
7950: 62 55 6e 69 6e 64 65 78 65 64 3b 20 20 20 20 20  bUnindexed;     
7960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7970: 75 65 20 66 6f 72 20 75 6e 69 6e 64 65 78 65 64  ue for unindexed
7980: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0d 0a 20 20 69   columns */..  i
7990: 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20  nt nPrefix;     
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 65 66  * Number of pref
79c0: 69 78 20 69 6e 64 65 78 65 73 20 2a 2f 0d 0a 20  ix indexes */.. 
79d0: 20 69 6e 74 20 2a 61 50 72 65 66 69 78 3b 20 20   int *aPrefix;  
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 2f 2a 20 53 69 7a 65 73 20 69 6e 20 62 79 74   /* Sizes in byt
7a00: 65 73 20 6f 66 20 6e 50 72 65 66 69 78 20 70 72  es of nPrefix pr
7a10: 65 66 69 78 20 69 6e 64 65 78 65 73 20 2a 2f 0d  efix indexes */.
7a20: 0a 20 20 69 6e 74 20 65 43 6f 6e 74 65 6e 74 3b  .  int eContent;
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a40: 20 20 20 2f 2a 20 41 6e 20 46 54 53 35 5f 43 4f     /* An FTS5_CO
7a50: 4e 54 45 4e 54 20 76 61 6c 75 65 20 2a 2f 0d 0a  NTENT value */..
7a60: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74    char *zContent
7a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7a80: 20 20 2f 2a 20 63 6f 6e 74 65 6e 74 20 74 61 62    /* content tab
7a90: 6c 65 20 2a 2f 20 0d 0a 20 20 63 68 61 72 20 2a  le */ ..  char *
7aa0: 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3b 20 20  zContentRowid;  
7ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 63 6f            /* "co
7ac0: 6e 74 65 6e 74 5f 72 6f 77 69 64 3d 22 20 6f 70  ntent_rowid=" op
7ad0: 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 20 0d 0a  tion value */ ..
7ae0: 20 20 69 6e 74 20 62 43 6f 6c 75 6d 6e 73 69 7a    int bColumnsiz
7af0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7b00: 20 20 2f 2a 20 22 63 6f 6c 75 6d 6e 73 69 7a 65    /* "columnsize
7b10: 3d 22 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20  =" option value 
7b20: 28 64 66 6c 74 3d 3d 31 29 20 2a 2f 0d 0a 20 20  (dflt==1) */..  
7b30: 69 6e 74 20 65 44 65 74 61 69 6c 3b 20 20 20 20  int eDetail;    
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 2f 2a 20 46 54 53 35 5f 44 45 54 41 49 4c 5f 58  /* FTS5_DETAIL_X
7b60: 58 58 20 76 61 6c 75 65 20 2a 2f 0d 0a 20 20 63  XX value */..  c
7b70: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 45 78 70  har *zContentExp
7b80: 72 6c 69 73 74 3b 0d 0a 20 20 46 74 73 35 54 6f  rlist;..  Fts5To
7b90: 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 3b 0d 0a  kenizer *pTok;..
7ba0: 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72    fts5_tokenizer
7bb0: 20 2a 70 54 6f 6b 41 70 69 3b 0d 0a 0d 0a 20 20   *pTokApi;....  
7bc0: 2f 2a 20 56 61 6c 75 65 73 20 6c 6f 61 64 65 64  /* Values loaded
7bd0: 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 66   from the %_conf
7be0: 69 67 20 74 61 62 6c 65 20 2a 2f 0d 0a 20 20 69  ig table */..  i
7bf0: 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20  nt iCookie;     
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c10: 2a 20 49 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  * Incremented wh
7c20: 65 6e 20 25 5f 63 6f 6e 66 69 67 20 69 73 20 6d  en %_config is m
7c30: 6f 64 69 66 69 65 64 20 2a 2f 0d 0a 20 20 69 6e  odified */..  in
7c40: 74 20 70 67 73 7a 3b 20 20 20 20 20 20 20 20 20  t pgsz;         
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c60: 20 41 70 70 72 6f 78 69 6d 61 74 65 20 70 61 67   Approximate pag
7c70: 65 20 73 69 7a 65 20 75 73 65 64 20 69 6e 20 25  e size used in %
7c80: 5f 64 61 74 61 20 2a 2f 0d 0a 20 20 69 6e 74 20  _data */..  int 
7c90: 6e 41 75 74 6f 6d 65 72 67 65 3b 20 20 20 20 20  nAutomerge;     
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 27              /* '
7cb0: 61 75 74 6f 6d 65 72 67 65 27 20 73 65 74 74 69  automerge' setti
7cc0: 6e 67 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 43 72  ng */..  int nCr
7cd0: 69 73 69 73 4d 65 72 67 65 3b 20 20 20 20 20 20  isisMerge;      
7ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
7cf0: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 67 6d  mum allowed segm
7d00: 65 6e 74 73 20 70 65 72 20 6c 65 76 65 6c 20 2a  ents per level *
7d10: 2f 0d 0a 20 20 69 6e 74 20 6e 55 73 65 72 6d 65  /..  int nUserme
7d20: 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rge;            
7d30: 20 20 20 20 20 2f 2a 20 27 75 73 65 72 6d 65 72       /* 'usermer
7d40: 67 65 27 20 73 65 74 74 69 6e 67 20 2a 2f 0d 0a  ge' setting */..
7d50: 20 20 69 6e 74 20 6e 48 61 73 68 53 69 7a 65 3b    int nHashSize;
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65    /* Bytes of me
7d80: 6d 6f 72 79 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  mory for in-memo
7d90: 72 79 20 68 61 73 68 20 2a 2f 0d 0a 20 20 63 68  ry hash */..  ch
7da0: 61 72 20 2a 7a 52 61 6e 6b 3b 20 20 20 20 20 20  ar *zRank;      
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7dc0: 20 4e 61 6d 65 20 6f 66 20 72 61 6e 6b 20 66 75   Name of rank fu
7dd0: 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 63 68 61  nction */..  cha
7de0: 72 20 2a 7a 52 61 6e 6b 41 72 67 73 3b 20 20 20  r *zRankArgs;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e00: 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 72 61 6e  Arguments to ran
7e10: 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 0d  k function */...
7e20: 0a 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c  .  /* If non-NUL
7e30: 4c 2c 20 70 6f 69 6e 74 73 20 74 6f 20 73 71 6c  L, points to sql
7e40: 69 74 65 33 5f 76 74 61 62 2e 62 61 73 65 2e 7a  ite3_vtab.base.z
7e50: 45 72 72 6d 73 67 2e 20 4f 66 74 65 6e 20 4e 55  Errmsg. Often NU
7e60: 4c 4c 2e 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a  LL. */..  char *
7e70: 2a 70 7a 45 72 72 6d 73 67 3b 0d 0a 0d 0a 23 69  *pzErrmsg;....#i
7e80: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7e90: 47 0d 0a 20 20 69 6e 74 20 62 50 72 65 66 69 78  G..  int bPrefix
7ea0: 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
7eb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7ec0: 75 73 65 20 70 72 65 66 69 78 2d 69 6e 64 65 78  use prefix-index
7ed0: 65 73 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 7d  es */..#endif..}
7ee0: 3b 0d 0a 0d 0a 2f 2a 20 43 75 72 72 65 6e 74 20  ;..../* Current 
7ef0: 65 78 70 65 63 74 65 64 20 76 61 6c 75 65 20 6f  expected value o
7f00: 66 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65  f %_config table
7f10: 20 27 76 65 72 73 69 6f 6e 27 20 66 69 65 6c 64   'version' field
7f20: 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54 53   */..#define FTS
7f30: 35 5f 43 55 52 52 45 4e 54 5f 56 45 52 53 49 4f  5_CURRENT_VERSIO
7f40: 4e 20 34 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 46  N 4....#define F
7f50: 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d  TS5_CONTENT_NORM
7f60: 41 4c 20 20 20 30 0d 0a 23 64 65 66 69 6e 65 20  AL   0..#define 
7f70: 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e  FTS5_CONTENT_NON
7f80: 45 20 20 20 20 20 31 0d 0a 23 64 65 66 69 6e 65  E     1..#define
7f90: 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 45 58   FTS5_CONTENT_EX
7fa0: 54 45 52 4e 41 4c 20 32 0d 0a 0d 0a 23 64 65 66  TERNAL 2....#def
7fb0: 69 6e 65 20 46 54 53 35 5f 44 45 54 41 49 4c 5f  ine FTS5_DETAIL_
7fc0: 46 55 4c 4c 20 20 20 20 30 0d 0a 23 64 65 66 69  FULL    0..#defi
7fd0: 6e 65 20 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  ne FTS5_DETAIL_N
7fe0: 4f 4e 45 20 20 20 20 31 0d 0a 23 64 65 66 69 6e  ONE    1..#defin
7ff0: 65 20 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f  e FTS5_DETAIL_CO
8000: 4c 55 4d 4e 53 20 32 0d 0a 0d 0a 0d 0a 0d 0a 73  LUMNS 2........s
8010: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8020: 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65  3Fts5ConfigParse
8030: 28 0d 0a 20 20 20 20 46 74 73 35 47 6c 6f 62 61  (..    Fts5Globa
8040: 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 69 6e  l*, sqlite3*, in
8050: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  t, const char **
8060: 2c 20 46 74 73 35 43 6f 6e 66 69 67 2a 2a 2c 20  , Fts5Config**, 
8070: 63 68 61 72 2a 2a 0d 0a 29 3b 0d 0a 73 74 61 74  char**..);..stat
8080: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
8090: 74 73 35 43 6f 6e 66 69 67 46 72 65 65 28 46 74  ts5ConfigFree(Ft
80a0: 73 35 43 6f 6e 66 69 67 2a 29 3b 0d 0a 0d 0a 73  s5Config*);....s
80b0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
80c0: 33 46 74 73 35 43 6f 6e 66 69 67 44 65 63 6c 61  3Fts5ConfigDecla
80d0: 72 65 56 74 61 62 28 46 74 73 35 43 6f 6e 66 69  reVtab(Fts5Confi
80e0: 67 20 2a 70 43 6f 6e 66 69 67 29 3b 0d 0a 0d 0a  g *pConfig);....
80f0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8100: 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 0d  e3Fts5Tokenize(.
8110: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
8120: 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20  Config,         
8130: 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69     /* FTS5 Confi
8140: 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20  guration object 
8150: 2a 2f 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  */..  int flags,
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 54 4f        /* FTS5_TO
8180: 4b 45 4e 49 5a 45 5f 2a 20 66 6c 61 67 73 20 2a  KENIZE_* flags *
8190: 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
81a0: 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78  *pText, int nTex
81b0: 74 2c 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20  t,   /* Text to 
81c0: 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0d 0a 20 20 76  tokenize */..  v
81d0: 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
81f0: 2a 20 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64  * Context passed
8200: 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20 2a 2f 0d   to xToken() */.
8210: 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29  .  int (*xToken)
8220: 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e  (void*, int, con
8230: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69  st char*, int, i
8240: 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f 2a 20 43  nt, int)    /* C
8250: 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 29 3b 0d 0a  allback */..);..
8260: 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  ..static void sq
8270: 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f 74 65  lite3Fts5Dequote
8280: 28 63 68 61 72 20 2a 7a 29 3b 0d 0a 0d 0a 2f 2a  (char *z);..../*
8290: 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Load the conten
82a0: 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 66  ts of the %_conf
82b0: 69 67 20 74 61 62 6c 65 20 2a 2f 0d 0a 73 74 61  ig table */..sta
82c0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
82d0: 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 46 74  ts5ConfigLoad(Ft
82e0: 73 35 43 6f 6e 66 69 67 2a 2c 20 69 6e 74 29 3b  s5Config*, int);
82f0: 0d 0a 0d 0a 2f 2a 20 53 65 74 20 74 68 65 20 76  ..../* Set the v
8300: 61 6c 75 65 20 6f 66 20 61 20 73 69 6e 67 6c 65  alue of a single
8310: 20 63 6f 6e 66 69 67 20 61 74 74 72 69 62 75 74   config attribut
8320: 65 20 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  e */..static int
8330: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
8340: 69 67 53 65 74 56 61 6c 75 65 28 46 74 73 35 43  igSetValue(Fts5C
8350: 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68  onfig*, const ch
8360: 61 72 2a 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ar*, sqlite3_val
8370: 75 65 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 0d 0a 73  ue*, int*);....s
8380: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8390: 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65  3Fts5ConfigParse
83a0: 52 61 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72 2a  Rank(const char*
83b0: 2c 20 63 68 61 72 2a 2a 2c 20 63 68 61 72 2a 2a  , char**, char**
83c0: 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64  );..../*..** End
83d0: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
83e0: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 63 6f   code in fts5_co
83f0: 6e 66 69 67 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a  nfig.c...*******
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8440: 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ***/..../*******
8450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8490: 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ***..** Interfac
84a0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
84b0: 35 5f 62 75 66 66 65 72 2e 63 2e 0d 0a 2a 2f 0d  5_buffer.c...*/.
84c0: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 42 75 66 66 65 72  .../*..** Buffer
84d0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
84e0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 75 69 6c  incremental buil
84f0: 64 69 6e 67 20 6f 66 20 73 74 72 69 6e 67 20 64  ding of string d
8500: 61 74 61 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65  ata...*/..typede
8510: 66 20 73 74 72 75 63 74 20 46 74 73 35 42 75 66  f struct Fts5Buf
8520: 66 65 72 20 46 74 73 35 42 75 66 66 65 72 3b 0d  fer Fts5Buffer;.
8530: 0a 73 74 72 75 63 74 20 46 74 73 35 42 75 66 66  .struct Fts5Buff
8540: 65 72 20 7b 0d 0a 20 20 75 38 20 2a 70 3b 0d 0a  er {..  u8 *p;..
8550: 20 20 69 6e 74 20 6e 3b 0d 0a 20 20 69 6e 74 20    int n;..  int 
8560: 6e 53 70 61 63 65 3b 0d 0a 7d 3b 0d 0a 0d 0a 73  nSpace;..};....s
8570: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8580: 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
8590: 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72  int*, Fts5Buffer
85a0: 2a 2c 20 75 33 32 29 3b 0d 0a 73 74 61 74 69 63  *, u32);..static
85b0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
85c0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
85d0: 69 6e 74 28 69 6e 74 2a 2c 20 46 74 73 35 42 75  int(int*, Fts5Bu
85e0: 66 66 65 72 2a 2c 20 69 36 34 29 3b 0d 0a 73 74  ffer*, i64);..st
85f0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
8600: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
8610: 64 42 6c 6f 62 28 69 6e 74 2a 2c 20 46 74 73 35  dBlob(int*, Fts5
8620: 42 75 66 66 65 72 2a 2c 20 75 33 32 2c 20 63 6f  Buffer*, u32, co
8630: 6e 73 74 20 75 38 2a 29 3b 0d 0a 73 74 61 74 69  nst u8*);..stati
8640: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
8650: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 53 74  s5BufferAppendSt
8660: 72 69 6e 67 28 69 6e 74 20 2a 2c 20 46 74 73 35  ring(int *, Fts5
8670: 42 75 66 66 65 72 2a 2c 20 63 6f 6e 73 74 20 63  Buffer*, const c
8680: 68 61 72 2a 29 3b 0d 0a 73 74 61 74 69 63 20 76  har*);..static v
8690: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
86a0: 75 66 66 65 72 46 72 65 65 28 46 74 73 35 42 75  ufferFree(Fts5Bu
86b0: 66 66 65 72 2a 29 3b 0d 0a 73 74 61 74 69 63 20  ffer*);..static 
86c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
86d0: 42 75 66 66 65 72 5a 65 72 6f 28 46 74 73 35 42  BufferZero(Fts5B
86e0: 75 66 66 65 72 2a 29 3b 0d 0a 73 74 61 74 69 63  uffer*);..static
86f0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
8700: 35 42 75 66 66 65 72 53 65 74 28 69 6e 74 2a 2c  5BufferSet(int*,
8710: 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69 6e   Fts5Buffer*, in
8720: 74 2c 20 63 6f 6e 73 74 20 75 38 2a 29 3b 0d 0a  t, const u8*);..
8730: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
8740: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
8750: 65 6e 64 50 72 69 6e 74 66 28 69 6e 74 20 2a 2c  endPrintf(int *,
8760: 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 63 68   Fts5Buffer*, ch
8770: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0d  ar *zFmt, ...);.
8780: 0a 0d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  ...static char *
8790: 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e  sqlite3Fts5Mprin
87a0: 74 66 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e  tf(int *pRc, con
87b0: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
87c0: 2e 2e 29 3b 0d 0a 0d 0a 23 64 65 66 69 6e 65 20  ..);....#define 
87d0: 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 78  fts5BufferZero(x
87e0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  )             sq
87f0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
8800: 65 72 6f 28 78 29 0d 0a 23 64 65 66 69 6e 65 20  ero(x)..#define 
8810: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8820: 56 61 72 69 6e 74 28 61 2c 62 2c 63 29 20 73 71  Varint(a,b,c) sq
8830: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
8840: 70 70 65 6e 64 56 61 72 69 6e 74 28 61 2c 62 2c  ppendVarint(a,b,
8850: 63 29 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35  c)..#define fts5
8860: 42 75 66 66 65 72 46 72 65 65 28 61 29 20 20 20  BufferFree(a)   
8870: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8880: 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
8890: 61 29 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35  a)..#define fts5
88a0: 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
88b0: 28 61 2c 62 2c 63 2c 64 29 20 73 71 6c 69 74 65  (a,b,c,d) sqlite
88c0: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
88d0: 64 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 0d 0a  dBlob(a,b,c,d)..
88e0: 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66  #define fts5Buff
88f0: 65 72 53 65 74 28 61 2c 62 2c 63 2c 64 29 20 20  erSet(a,b,c,d)  
8900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
8910: 35 42 75 66 66 65 72 53 65 74 28 61 2c 62 2c 63  5BufferSet(a,b,c
8920: 2c 64 29 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 66  ,d)....#define f
8930: 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 70 52  ts5BufferGrow(pR
8940: 63 2c 70 42 75 66 2c 6e 6e 29 20 28 20 5c 0d 0a  c,pBuf,nn) ( \..
8950: 20 20 28 75 33 32 29 28 28 70 42 75 66 29 2d 3e    (u32)((pBuf)->
8960: 6e 29 20 2b 20 28 75 33 32 29 28 6e 6e 29 20 3c  n) + (u32)(nn) <
8970: 3d 20 28 75 33 32 29 28 28 70 42 75 66 29 2d 3e  = (u32)((pBuf)->
8980: 6e 53 70 61 63 65 29 20 3f 20 30 20 3a 20 5c 0d  nSpace) ? 0 : \.
8990: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
89a0: 42 75 66 66 65 72 53 69 7a 65 28 28 70 52 63 29  BufferSize((pRc)
89b0: 2c 28 70 42 75 66 29 2c 28 6e 6e 29 2b 28 70 42  ,(pBuf),(nn)+(pB
89c0: 75 66 29 2d 3e 6e 29 20 5c 0d 0a 29 0d 0a 0d 0a  uf)->n) \..)....
89d0: 2f 2a 20 57 72 69 74 65 20 61 6e 64 20 64 65 63  /* Write and dec
89e0: 6f 64 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 33  ode big-endian 3
89f0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  2-bit integer va
8a00: 6c 75 65 73 20 2a 2f 0d 0a 73 74 61 74 69 63 20  lues */..static 
8a10: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
8a20: 50 75 74 33 32 28 75 38 2a 2c 20 69 6e 74 29 3b  Put32(u8*, int);
8a30: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
8a40: 69 74 65 33 46 74 73 35 47 65 74 33 32 28 63 6f  ite3Fts5Get32(co
8a50: 6e 73 74 20 75 38 2a 29 3b 0d 0a 0d 0a 23 64 65  nst u8*);....#de
8a60: 66 69 6e 65 20 46 54 53 35 5f 50 4f 53 32 43 4f  fine FTS5_POS2CO
8a70: 4c 55 4d 4e 28 69 50 6f 73 29 20 28 69 6e 74 29  LUMN(iPos) (int)
8a80: 28 69 50 6f 73 20 3e 3e 20 33 32 29 0d 0a 23 64  (iPos >> 32)..#d
8a90: 65 66 69 6e 65 20 46 54 53 35 5f 50 4f 53 32 4f  efine FTS5_POS2O
8aa0: 46 46 53 45 54 28 69 50 6f 73 29 20 28 69 6e 74  FFSET(iPos) (int
8ab0: 29 28 69 50 6f 73 20 26 20 30 78 37 46 46 46 46  )(iPos & 0x7FFFF
8ac0: 46 46 46 29 0d 0a 0d 0a 74 79 70 65 64 65 66 20  FFF)....typedef 
8ad0: 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69  struct Fts5Posli
8ae0: 73 74 52 65 61 64 65 72 20 46 74 73 35 50 6f 73  stReader Fts5Pos
8af0: 6c 69 73 74 52 65 61 64 65 72 3b 0d 0a 73 74 72  listReader;..str
8b00: 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74 52  uct Fts5PoslistR
8b10: 65 61 64 65 72 20 7b 0d 0a 20 20 2f 2a 20 56 61  eader {..  /* Va
8b20: 72 69 61 62 6c 65 73 20 75 73 65 64 20 6f 6e 6c  riables used onl
8b30: 79 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 35  y by sqlite3Fts5
8b40: 50 6f 73 6c 69 73 74 49 74 65 72 58 58 58 28 29  PoslistIterXXX()
8b50: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0d 0a   functions. */..
8b60: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20    const u8 *a;  
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69    /* Position li
8b90: 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  st to iterate th
8ba0: 72 6f 75 67 68 20 2a 2f 0d 0a 20 20 69 6e 74 20  rough */..  int 
8bb0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8bd0: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74  ize of buffer at
8be0: 20 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f   a[] in bytes */
8bf0: 0d 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ..  int i;      
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
8c20: 66 66 73 65 74 20 69 6e 20 61 5b 5d 20 2a 2f 0d  ffset in a[] */.
8c30: 0a 0d 0a 20 20 75 38 20 62 46 6c 61 67 3b 20 20  ...  u8 bFlag;  
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6c 69 65       /* For clie
8c60: 6e 74 20 75 73 65 20 28 61 6e 79 20 63 75 73 74  nt use (any cust
8c70: 6f 6d 20 70 75 72 70 6f 73 65 29 20 2a 2f 0d 0a  om purpose) */..
8c80: 0d 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
8c90: 72 69 61 62 6c 65 73 20 2a 2f 0d 0a 20 20 75 38  riables */..  u8
8ca0: 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20   bEof;          
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8cc0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 61 74 20   Set to true at 
8cd0: 45 4f 46 20 2a 2f 0d 0a 20 20 69 36 34 20 69 50  EOF */..  i64 iP
8ce0: 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
8cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 69 43            /* (iC
8d00: 6f 6c 3c 3c 33 32 29 20 2b 20 69 50 6f 73 20 2a  ol<<32) + iPos *
8d10: 2f 0d 0a 7d 3b 0d 0a 73 74 61 74 69 63 20 69 6e  /..};..static in
8d20: 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  t sqlite3Fts5Pos
8d30: 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 0d  listReaderInit(.
8d40: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  .  const u8 *a, 
8d50: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
8d60: 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 62 75     /* Poslist bu
8d70: 66 66 65 72 20 74 6f 20 69 74 65 72 61 74 65 20  ffer to iterate 
8d80: 74 68 72 6f 75 67 68 20 2a 2f 0d 0a 20 20 46 74  through */..  Ft
8d90: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
8da0: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 2f 2a  *pIter        /*
8db0: 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   Iterator object
8dc0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a   to initialize *
8dd0: 2f 0d 0a 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e  /..);..static in
8de0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  t sqlite3Fts5Pos
8df0: 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 46  listReaderNext(F
8e00: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
8e10: 2a 29 3b 0d 0a 0d 0a 74 79 70 65 64 65 66 20 73  *);....typedef s
8e20: 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73  truct Fts5Poslis
8e30: 74 57 72 69 74 65 72 20 46 74 73 35 50 6f 73 6c  tWriter Fts5Posl
8e40: 69 73 74 57 72 69 74 65 72 3b 0d 0a 73 74 72 75  istWriter;..stru
8e50: 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72  ct Fts5PoslistWr
8e60: 69 74 65 72 20 7b 0d 0a 20 20 69 36 34 20 69 50  iter {..  i64 iP
8e70: 72 65 76 3b 0d 0a 7d 3b 0d 0a 73 74 61 74 69 63  rev;..};..static
8e80: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
8e90: 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
8ea0: 65 6e 64 28 46 74 73 35 42 75 66 66 65 72 2a 2c  end(Fts5Buffer*,
8eb0: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
8ec0: 65 72 2a 2c 20 69 36 34 29 3b 0d 0a 73 74 61 74  er*, i64);..stat
8ed0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
8ee0: 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
8ef0: 70 65 6e 64 28 46 74 73 35 42 75 66 66 65 72 2a  pend(Fts5Buffer*
8f00: 2c 20 69 36 34 2a 2c 20 69 36 34 29 3b 0d 0a 0d  , i64*, i64);...
8f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8f20: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
8f30: 78 74 36 34 28 0d 0a 20 20 63 6f 6e 73 74 20 75  xt64(..  const u
8f40: 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20  8 *a, int n,    
8f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
8f60: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 6f  er containing po
8f70: 73 6c 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20  slist */..  int 
8f80: 2a 70 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pi,            
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8fa0: 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20 77 69  N/OUT: Offset wi
8fb0: 74 68 69 6e 20 61 5b 5d 20 2a 2f 0d 0a 20 20 69  thin a[] */..  i
8fc0: 36 34 20 2a 70 69 4f 66 66 20 20 20 20 20 20 20  64 *piOff       
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8fe0: 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
8ff0: 74 20 6f 66 66 73 65 74 20 2a 2f 0d 0a 29 3b 0d  t offset */..);.
9000: 0a 0d 0a 2f 2a 20 4d 61 6c 6c 6f 63 20 75 74 69  .../* Malloc uti
9010: 6c 69 74 79 20 2a 2f 0d 0a 73 74 61 74 69 63 20  lity */..static 
9020: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 46 74 73  void *sqlite3Fts
9030: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74 20  5MallocZero(int 
9040: 2a 70 52 63 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *pRc, sqlite3_in
9050: 74 36 34 20 6e 42 79 74 65 29 3b 0d 0a 73 74 61  t64 nByte);..sta
9060: 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65  tic char *sqlite
9070: 33 46 74 73 35 53 74 72 6e 64 75 70 28 69 6e 74  3Fts5Strndup(int
9080: 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61   *pRc, const cha
9090: 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29  r *pIn, int nIn)
90a0: 3b 0d 0a 0d 0a 2f 2a 20 43 68 61 72 61 63 74 65  ;..../* Characte
90b0: 72 20 73 65 74 20 74 65 73 74 73 20 28 6c 69 6b  r set tests (lik
90c0: 65 20 69 73 73 70 61 63 65 28 29 2c 20 69 73 61  e isspace(), isa
90d0: 6c 70 68 61 28 29 20 65 74 63 2e 29 20 2a 2f 0d  lpha() etc.) */.
90e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
90f0: 74 65 33 46 74 73 35 49 73 42 61 72 65 77 6f 72  te3Fts5IsBarewor
9100: 64 28 63 68 61 72 20 74 29 3b 0d 0a 0d 0a 0d 0a  d(char t);......
9110: 2f 2a 20 42 75 63 6b 65 74 20 6f 66 20 74 65 72  /* Bucket of ter
9120: 6d 73 20 6f 62 6a 65 63 74 20 75 73 65 64 20 62  ms object used b
9130: 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  y the integrity-
9140: 63 68 65 63 6b 20 69 6e 20 6f 66 66 73 65 74 73  check in offsets
9150: 3d 30 20 6d 6f 64 65 2e 20 2a 2f 0d 0a 74 79 70  =0 mode. */..typ
9160: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
9170: 54 65 72 6d 73 65 74 20 46 74 73 35 54 65 72 6d  Termset Fts5Term
9180: 73 65 74 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74  set;..static int
9190: 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d   sqlite3Fts5Term
91a0: 73 65 74 4e 65 77 28 46 74 73 35 54 65 72 6d 73  setNew(Fts5Terms
91b0: 65 74 2a 2a 29 3b 0d 0a 73 74 61 74 69 63 20 69  et**);..static i
91c0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 54 65  nt sqlite3Fts5Te
91d0: 72 6d 73 65 74 41 64 64 28 46 74 73 35 54 65 72  rmsetAdd(Fts5Ter
91e0: 6d 73 65 74 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73  mset*, int, cons
91f0: 74 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e  t char*, int, in
9200: 74 20 2a 70 62 50 72 65 73 65 6e 74 29 3b 0d 0a  t *pbPresent);..
9210: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
9220: 74 65 33 46 74 73 35 54 65 72 6d 73 65 74 46 72  te3Fts5TermsetFr
9230: 65 65 28 46 74 73 35 54 65 72 6d 73 65 74 2a 29  ee(Fts5Termset*)
9240: 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20  ;..../*..** End 
9250: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
9260: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 62 75 66  code in fts5_buf
9270: 66 65 72 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a  fer.c...********
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 2a 2a 2a 2a 2a 2a  ****************
92b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92c0: 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  **/..../********
92d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9310: 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  **..** Interface
9320: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
9330: 5f 69 6e 64 65 78 2e 63 2e 20 66 74 73 35 5f 69  _index.c. fts5_i
9340: 6e 64 65 78 2e 63 20 63 6f 6e 74 61 69 6e 73 20  ndex.c contains 
9350: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 0d 0a 2a  contains code..*
9360: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
9370: 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
9380: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
9390: 0d 0a 2a 2f 0d 0a 0d 0a 74 79 70 65 64 65 66 20  ..*/....typedef 
93a0: 73 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78  struct Fts5Index
93b0: 20 46 74 73 35 49 6e 64 65 78 3b 0d 0a 74 79 70   Fts5Index;..typ
93c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
93d0: 49 6e 64 65 78 49 74 65 72 20 46 74 73 35 49 6e  IndexIter Fts5In
93e0: 64 65 78 49 74 65 72 3b 0d 0a 0d 0a 73 74 72 75  dexIter;....stru
93f0: 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ct Fts5IndexIter
9400: 20 7b 0d 0a 20 20 69 36 34 20 69 52 6f 77 69 64   {..  i64 iRowid
9410: 3b 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ;..  const u8 *p
9420: 44 61 74 61 3b 0d 0a 20 20 69 6e 74 20 6e 44 61  Data;..  int nDa
9430: 74 61 3b 0d 0a 20 20 75 38 20 62 45 6f 66 3b 0d  ta;..  u8 bEof;.
9440: 0a 7d 3b 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 73  .};....#define s
9450: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
9460: 66 28 78 29 20 28 28 78 29 2d 3e 62 45 6f 66 29  f(x) ((x)->bEof)
9470: 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 56 61 6c 75 65  ..../*..** Value
9480: 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
9490: 66 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75  f the flags argu
94a0: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 49  ment passed to I
94b0: 6e 64 65 78 51 75 65 72 79 28 29 2e 0d 0a 2a 2f  ndexQuery()...*/
94c0: 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 49 4e  ..#define FTS5IN
94d0: 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
94e0: 20 20 20 20 20 30 78 30 30 30 31 20 20 20 2f 2a       0x0001   /*
94f0: 20 50 72 65 66 69 78 20 71 75 65 72 79 20 2a 2f   Prefix query */
9500: 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 49 4e  ..#define FTS5IN
9510: 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 20  DEX_QUERY_DESC  
9520: 20 20 20 20 20 30 78 30 30 30 32 20 20 20 2f 2a       0x0002   /*
9530: 20 44 6f 63 73 20 69 6e 20 64 65 73 63 65 6e 64   Docs in descend
9540: 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20  ing rowid order 
9550: 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
9560: 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
9570: 5f 4e 4f 49 44 58 20 30 78 30 30 30 34 20 20 20  _NOIDX 0x0004   
9580: 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 70 72  /* Do not use pr
9590: 65 66 69 78 20 69 6e 64 65 78 20 2a 2f 0d 0a 23  efix index */..#
95a0: 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58  define FTS5INDEX
95b0: 5f 51 55 45 52 59 5f 53 43 41 4e 20 20 20 20 20  _QUERY_SCAN     
95c0: 20 20 30 78 30 30 30 38 20 20 20 2f 2a 20 53 63    0x0008   /* Sc
95d0: 61 6e 20 71 75 65 72 79 20 28 66 74 73 35 76 6f  an query (fts5vo
95e0: 63 61 62 29 20 2a 2f 0d 0a 0d 0a 2f 2a 20 54 68  cab) */..../* Th
95f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
9600: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
9610: 62 79 20 74 68 65 20 66 74 73 35 5f 69 6e 64 65  by the fts5_inde
9620: 78 2e 63 20 6d 6f 64 75 6c 65 2e 20 54 68 65 79  x.c module. They
9630: 20 61 72 65 0d 0a 2a 2a 20 64 65 66 69 6e 65 64   are..** defined
9640: 20 68 65 72 65 20 6f 6e 6c 79 20 74 6f 20 6d 61   here only to ma
9650: 6b 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 20  ke it easier to 
9660: 61 76 6f 69 64 20 63 6c 61 73 68 65 73 20 77 69  avoid clashes wi
9670: 74 68 20 74 68 65 20 66 6c 61 67 73 0d 0a 2a 2a  th the flags..**
9680: 20 61 62 6f 76 65 2e 20 2a 2f 0d 0a 23 64 65 66   above. */..#def
9690: 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  ine FTS5INDEX_QU
96a0: 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 20 20 30  ERY_SKIPEMPTY  0
96b0: 78 30 30 31 30 0d 0a 23 64 65 66 69 6e 65 20 46  x0010..#define F
96c0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e  TS5INDEX_QUERY_N
96d0: 4f 4f 55 54 50 55 54 20 20 20 30 78 30 30 32 30  OOUTPUT   0x0020
96e0: 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74  ..../*..** Creat
96f0: 65 2f 64 65 73 74 72 6f 79 20 61 6e 20 46 74 73  e/destroy an Fts
9700: 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0d 0a  5Index object...
9710: 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
9720: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
9730: 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67 20 2a  pen(Fts5Config *
9740: 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20 62 43 72  pConfig, int bCr
9750: 65 61 74 65 2c 20 46 74 73 35 49 6e 64 65 78 2a  eate, Fts5Index*
9760: 2a 2c 20 63 68 61 72 2a 2a 29 3b 0d 0a 73 74 61  *, char**);..sta
9770: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
9780: 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74  ts5IndexClose(Ft
9790: 73 35 49 6e 64 65 78 20 2a 70 29 3b 0d 0a 0d 0a  s5Index *p);....
97a0: 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  /*..** Return a 
97b0: 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20  simple checksum 
97c0: 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74  value based on t
97d0: 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 2a  he arguments...*
97e0: 2f 0d 0a 73 74 61 74 69 63 20 75 36 34 20 73 71  /..static u64 sq
97f0: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
9800: 74 72 79 43 6b 73 75 6d 28 0d 0a 20 20 69 36 34  tryCksum(..  i64
9810: 20 69 52 6f 77 69 64 2c 20 0d 0a 20 20 69 6e 74   iRowid, ..  int
9820: 20 69 43 6f 6c 2c 20 0d 0a 20 20 69 6e 74 20 69   iCol, ..  int i
9830: 50 6f 73 2c 20 0d 0a 20 20 69 6e 74 20 69 49 64  Pos, ..  int iId
9840: 78 2c 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x,..  const char
9850: 20 2a 70 54 65 72 6d 2c 0d 0a 20 20 69 6e 74 20   *pTerm,..  int 
9860: 6e 54 65 72 6d 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d  nTerm..);..../*.
9870: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70  .** Argument p p
9880: 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
9890: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66  r containing utf
98a0: 2d 38 20 74 65 78 74 20 74 68 61 74 20 69 73 20  -8 text that is 
98b0: 6e 20 62 79 74 65 73 20 69 6e 20 0d 0a 2a 2a 20  n bytes in ..** 
98c0: 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65  size. Return the
98d0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
98e0: 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68   in the nChar ch
98f0: 61 72 61 63 74 65 72 20 70 72 65 66 69 78 20 6f  aracter prefix o
9900: 66 20 74 68 65 0d 0a 2a 2a 20 62 75 66 66 65 72  f the..** buffer
9910: 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72 65 20  , or 0 if there 
9920: 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 43  are less than nC
9930: 68 61 72 20 63 68 61 72 61 63 74 65 72 73 20 69  har characters i
9940: 6e 20 74 6f 74 61 6c 2e 0d 0a 2a 2f 0d 0a 73 74  n total...*/..st
9950: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
9960: 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  Fts5IndexCharlen
9970: 54 6f 42 79 74 65 6c 65 6e 28 0d 0a 20 20 63 6f  ToBytelen(..  co
9980: 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 0d 0a 20  nst char *p, .. 
9990: 20 69 6e 74 20 6e 42 79 74 65 2c 20 0d 0a 20 20   int nByte, ..  
99a0: 69 6e 74 20 6e 43 68 61 72 0d 0a 29 3b 0d 0a 0d  int nChar..);...
99b0: 0a 2f 2a 0d 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ./*..** Open a n
99c0: 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69  ew iterator to i
99d0: 74 65 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c  terate though al
99e0: 6c 20 72 6f 77 69 64 73 20 74 68 61 74 20 6d 61  l rowids that ma
99f0: 74 63 68 20 74 68 65 20 0d 0a 2a 2a 20 73 70 65  tch the ..** spe
9a00: 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20  cified token or 
9a10: 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0d 0a 2a  token prefix...*
9a20: 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  /..static int sq
9a30: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
9a40: 65 72 79 28 0d 0a 20 20 46 74 73 35 49 6e 64 65  ery(..  Fts5Inde
9a50: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
9a60: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69          /* FTS i
9a70: 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f  ndex to query */
9a80: 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
9a90: 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
9aa0: 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72  en, /* Token (or
9ab0: 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72   prefix) to quer
9ac0: 79 20 66 6f 72 20 2a 2f 0d 0a 20 20 69 6e 74 20  y for */..  int 
9ad0: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9af0: 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
9b00: 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a  _QUERY_X flags *
9b10: 2f 0d 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  /..  Fts5Colset 
9b20: 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
9b30: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68       /* Match th
9b40: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79  ese columns only
9b50: 20 2a 2f 0d 0a 20 20 46 74 73 35 49 6e 64 65 78   */..  Fts5Index
9b60: 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
9b70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
9b80: 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ew iterator obje
9b90: 63 74 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d  ct */..);..../*.
9ba0: 0a 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20  .** The various 
9bb0: 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 6f 70  operations on op
9bc0: 65 6e 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  en token or toke
9bd0: 6e 20 70 72 65 66 69 78 20 69 74 65 72 61 74 6f  n prefix iterato
9be0: 72 73 20 6f 70 65 6e 65 64 0d 0a 2a 2a 20 75 73  rs opened..** us
9bf0: 69 6e 67 20 73 71 6c 69 74 65 33 46 74 73 35 49  ing sqlite3Fts5I
9c00: 6e 64 65 78 51 75 65 72 79 28 29 2e 0d 0a 2a 2f  ndexQuery()...*/
9c10: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
9c20: 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
9c30: 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29  (Fts5IndexIter*)
9c40: 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ;..static int sq
9c50: 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
9c60: 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
9c70: 74 65 72 2a 2c 20 69 36 34 20 69 4d 61 74 63 68  ter*, i64 iMatch
9c80: 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6c 6f  );..../*..** Clo
9c90: 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f  se an iterator o
9ca0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
9cb0: 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
9cc0: 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f  ...*/..static vo
9cd0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  id sqlite3Fts5It
9ce0: 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  erClose(Fts5Inde
9cf0: 78 49 74 65 72 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a  xIter*);..../*..
9d00: 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
9d10: 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
9d20: 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c   fts5vocab modul
9d30: 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 63  e...*/..static c
9d40: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
9d50: 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28 46  e3Fts5IterTerm(F
9d60: 74 73 35 49 6e 64 65 78 49 74 65 72 2a 2c 20 69  ts5IndexIter*, i
9d70: 6e 74 2a 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e  nt*);..static in
9d80: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
9d90: 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e  rNextScan(Fts5In
9da0: 64 65 78 49 74 65 72 2a 29 3b 0d 0a 0d 0a 0d 0a  dexIter*);......
9db0: 2f 2a 0d 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  /*..** Insert or
9dc0: 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20   remove data to 
9dd0: 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  or from the inde
9de0: 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 64  x. Each time a d
9df0: 6f 63 75 6d 65 6e 74 20 69 73 20 0d 0a 2a 2a 20  ocument is ..** 
9e00: 61 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f  added to or remo
9e10: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  ved from the ind
9e20: 65 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ex, this functio
9e30: 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20  n is called one 
9e40: 6f 72 20 6d 6f 72 65 0d 0a 2a 2a 20 74 69 6d 65  or more..** time
9e50: 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 46 6f 72 20 61  s...**..** For a
9e60: 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73  n insert, it mus
9e70: 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  t be called once
9e80: 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
9e90: 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d  in the new docum
9ea0: 65 6e 74 2e 0d 0a 2a 2a 20 49 66 20 74 68 65 20  ent...** If the 
9eb0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64  operation is a d
9ec0: 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62  elete, it must b
9ed0: 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61  e called (at lea
9ee0: 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  st) once for eac
9ef0: 68 0d 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b  h..** unique tok
9f00: 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  en in the docume
9f10: 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20  nt with an iCol 
9f20: 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
9f30: 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0d 0a  zero. The iPos..
9f40: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
9f50: 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c  gnored for a del
9f60: 65 74 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ete...*/..static
9f70: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
9f80: 49 6e 64 65 78 57 72 69 74 65 28 0d 0a 20 20 46  IndexWrite(..  F
9f90: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9fb0: 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65  * Index to write
9fc0: 20 74 6f 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 43   to */..  int iC
9fd0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
9fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
9ff0: 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  umn token appear
a000: 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c  s in (-ve -> del
a010: 65 74 65 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 69  ete) */..  int i
a020: 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Pos,            
a030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
a040: 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20  sition of token 
a050: 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f  within column */
a060: 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
a070: 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
a080: 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20  en  /* Token to 
a090: 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f  add or remove to
a0a0: 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a   or from index *
a0b0: 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  /..);..../*..** 
a0c0: 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 73 75  Indicate that su
a0d0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
a0e0: 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
a0f0: 65 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69  exWrite() pertai
a100: 6e 20 74 6f 0d 0a 2a 2a 20 64 6f 63 75 6d 65 6e  n to..** documen
a110: 74 20 69 44 6f 63 69 64 2e 0d 0a 2a 2f 0d 0a 73  t iDocid...*/..s
a120: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
a130: 33 46 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57  3Fts5IndexBeginW
a140: 72 69 74 65 28 0d 0a 20 20 46 74 73 35 49 6e 64  rite(..  Fts5Ind
a150: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
a160: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
a170: 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  x to write to */
a180: 0d 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65 2c  ..  int bDelete,
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
a1b0: 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e  urrent operation
a1c0: 20 69 73 20 61 20 64 65 6c 65 74 65 20 2a 2f 0d   is a delete */.
a1d0: 0a 20 20 69 36 34 20 69 44 6f 63 69 64 20 20 20  .  i64 iDocid   
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1f0: 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20 61     /* Docid to a
a200: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74  dd or remove dat
a210: 61 20 66 72 6f 6d 20 2a 2f 0d 0a 29 3b 0d 0a 0d  a from */..);...
a220: 0a 2f 2a 0d 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ./*..** Flush an
a230: 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
a240: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
a250: 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68  ash tables to th
a260: 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 2a 2a 20  e database...** 
a270: 41 6c 73 6f 20 63 6c 6f 73 65 20 61 6e 79 20 6f  Also close any o
a280: 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c 65 73  pen blob handles
a290: 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
a2a0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
a2b0: 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78  exSync(Fts5Index
a2c0: 20 2a 70 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20   *p);..../*..** 
a2d0: 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61  Discard any data
a2e0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
a2f0: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
a300: 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69  bles. Do not wri
a310: 74 65 20 69 74 0d 0a 2a 2a 20 74 6f 20 74 68 65  te it..** to the
a320: 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
a330: 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20  ionally, assume 
a340: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
a350: 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0d  s of the %_data.
a360: 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61  .** table may ha
a370: 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69  ve changed on di
a380: 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65  sk. So any in-me
a390: 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25  mory caches of %
a3a0: 5f 64 61 74 61 20 0d 0a 2a 2a 20 72 65 63 6f 72  _data ..** recor
a3b0: 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
a3c0: 69 64 61 74 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61  idated...*/..sta
a3d0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
a3e0: 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b  ts5IndexRollback
a3f0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0d  (Fts5Index *p);.
a400: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 47 65 74 20 6f 72  .../*..** Get or
a410: 20 73 65 74 20 74 68 65 20 22 61 76 65 72 61 67   set the "averag
a420: 65 73 22 20 76 61 6c 75 65 73 2e 0d 0a 2a 2f 0d  es" values...*/.
a430: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a440: 74 65 33 46 74 73 35 49 6e 64 65 78 47 65 74 41  te3Fts5IndexGetA
a450: 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
a460: 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77  x *p, i64 *pnRow
a470: 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65 29 3b 0d  , i64 *anSize);.
a480: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a490: 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
a4a0: 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
a4b0: 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 2a 2c  x *p, const u8*,
a4c0: 20 69 6e 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a   int);..../*..**
a4d0: 20 46 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 65   Functions calle
a4e0: 64 20 62 79 20 74 68 65 20 73 74 6f 72 61 67 65  d by the storage
a4f0: 20 6d 6f 64 75 6c 65 20 61 73 20 70 61 72 74 20   module as part 
a500: 6f 66 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  of integrity-che
a510: 63 6b 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ck...*/..static 
a520: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
a530: 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
a540: 63 6b 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 75  ck(Fts5Index*, u
a550: 36 34 20 63 6b 73 75 6d 29 3b 0d 0a 0d 0a 2f 2a  64 cksum);..../*
a560: 20 0d 0a 2a 2a 20 43 61 6c 6c 65 64 20 64 75 72   ..** Called dur
a570: 69 6e 67 20 76 69 72 74 75 61 6c 20 6d 6f 64 75  ing virtual modu
a580: 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
a590: 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20 55 44  n to register UD
a5a0: 46 20 0d 0a 2a 2a 20 66 74 73 35 5f 64 65 63 6f  F ..** fts5_deco
a5b0: 64 65 28 29 20 77 69 74 68 20 53 51 4c 69 74 65  de() with SQLite
a5c0: 20 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e   ..*/..static in
a5d0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
a5e0: 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  exInit(sqlite3*)
a5f0: 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  ;....static int 
a600: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
a610: 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e  SetCookie(Fts5In
a620: 64 65 78 2a 2c 20 69 6e 74 29 3b 0d 0a 0d 0a 2f  dex*, int);..../
a630: 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  *..** Return the
a640: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
a650: 20 65 6e 74 72 69 65 73 20 72 65 61 64 20 66 72   entries read fr
a660: 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
a670: 62 6c 65 20 62 79 20 0d 0a 2a 2a 20 74 68 69 73  ble by ..** this
a680: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
a690: 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64  e it was created
a6a0: 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
a6b0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
a6c0: 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65  exReads(Fts5Inde
a6d0: 78 20 2a 70 29 3b 0d 0a 0d 0a 73 74 61 74 69 63  x *p);....static
a6e0: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
a6f0: 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35  IndexReinit(Fts5
a700: 49 6e 64 65 78 20 2a 70 29 3b 0d 0a 73 74 61 74  Index *p);..stat
a710: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
a720: 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28  s5IndexOptimize(
a730: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0d 0a  Fts5Index *p);..
a740: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
a750: 65 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65  e3Fts5IndexMerge
a760: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
a770: 6e 74 20 6e 4d 65 72 67 65 29 3b 0d 0a 73 74 61  nt nMerge);..sta
a780: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
a790: 74 73 35 49 6e 64 65 78 52 65 73 65 74 28 46 74  ts5IndexReset(Ft
a7a0: 73 35 49 6e 64 65 78 20 2a 70 29 3b 0d 0a 0d 0a  s5Index *p);....
a7b0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
a7c0: 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43  e3Fts5IndexLoadC
a7d0: 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20  onfig(Fts5Index 
a7e0: 2a 70 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45  *p);..../*..** E
a7f0: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
a800: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
a810: 69 6e 64 65 78 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a  index.c...******
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 2a 2a 2a 2a  ****************
a850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a860: 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a  ****/..../******
a870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a8b0: 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61  ****..** Interfa
a8c0: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
a8d0: 73 35 5f 76 61 72 69 6e 74 2e 63 2e 20 0d 0a 2a  s5_varint.c. ..*
a8e0: 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  /..static int sq
a8f0: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
a900: 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69 67  nt32(const unsig
a910: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32  ned char *p, u32
a920: 20 2a 76 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e   *v);..static in
a930: 74 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  t sqlite3Fts5Get
a940: 56 61 72 69 6e 74 4c 65 6e 28 75 33 32 20 69 56  VarintLen(u32 iV
a950: 61 6c 29 3b 0d 0a 73 74 61 74 69 63 20 75 38 20  al);..static u8 
a960: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
a970: 72 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69 67  rint(const unsig
a980: 6e 65 64 20 63 68 61 72 2a 2c 20 75 36 34 2a 29  ned char*, u64*)
a990: 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ;..static int sq
a9a0: 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
a9b0: 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
a9c0: 20 2a 70 2c 20 75 36 34 20 76 29 3b 0d 0a 0d 0a   *p, u64 v);....
a9d0: 23 64 65 66 69 6e 65 20 66 74 73 35 47 65 74 56  #define fts5GetV
a9e0: 61 72 69 6e 74 33 32 28 61 2c 62 29 20 73 71 6c  arint32(a,b) sql
a9f0: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
aa00: 74 33 32 28 61 2c 28 75 33 32 2a 29 26 62 29 0d  t32(a,(u32*)&b).
aa10: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 47 65 74  .#define fts5Get
aa20: 56 61 72 69 6e 74 20 20 20 20 73 71 6c 69 74 65  Varint    sqlite
aa30: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 0d 0a  3Fts5GetVarint..
aa40: 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 46 61  ..#define fts5Fa
aa50: 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  stGetVarint32(a,
aa60: 20 69 4f 66 66 2c 20 6e 56 61 6c 29 20 7b 20 20   iOff, nVal) {  
aa70: 20 20 20 20 5c 0d 0a 20 20 6e 56 61 6c 20 3d 20      \..  nVal = 
aa80: 28 61 29 5b 69 4f 66 66 2b 2b 5d 3b 20 20 20 20  (a)[iOff++];    
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 5c 0d 0a 20 20 69 66           \..  if
aab0: 28 20 6e 56 61 6c 20 26 20 30 78 38 30 20 29 7b  ( nVal & 0x80 ){
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d                \.
aae0: 0a 20 20 20 20 69 4f 66 66 2d 2d 3b 20 20 20 20  .    iOff--;    
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 5c 0d 0a 20 20 20 20 69 4f 66 66 20 2b     \..    iOff +
ab20: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
ab30: 32 28 26 28 61 29 5b 69 4f 66 66 5d 2c 20 6e 56  2(&(a)[iOff], nV
ab40: 61 6c 29 3b 20 20 20 20 5c 0d 0a 20 20 7d 20 20  al);    \..  }  
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0d 0a               \..
ab80: 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e  }....../*..** En
ab90: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
aba0: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 76  o code in fts5_v
abb0: 61 72 69 6e 74 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a  arint.c...******
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 2a 2a  ****************
abf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac00: 2a 2a 2a 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a  ****/....../****
ac10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac50: 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72  ******..** Inter
ac60: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
ac70: 66 74 73 35 5f 6d 61 69 6e 2e 63 2e 20 0d 0a 2a  fts5_main.c. ..*
ac80: 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 56 69 72 74  /..../*..** Virt
ac90: 75 61 6c 2d 74 61 62 6c 65 20 6f 62 6a 65 63 74  ual-table object
aca0: 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73  ...*/..typedef s
acb0: 74 72 75 63 74 20 46 74 73 35 54 61 62 6c 65 20  truct Fts5Table 
acc0: 46 74 73 35 54 61 62 6c 65 3b 0d 0a 73 74 72 75  Fts5Table;..stru
acd0: 63 74 20 46 74 73 35 54 61 62 6c 65 20 7b 0d 0a  ct Fts5Table {..
ace0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62    sqlite3_vtab b
acf0: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
ad00: 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20    /* Base class 
ad10: 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 63  used by SQLite c
ad20: 6f 72 65 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f  ore */..  Fts5Co
ad30: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20  nfig *pConfig;  
ad40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
ad50: 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 66 69  tual table confi
ad60: 67 75 72 61 74 69 6f 6e 20 2a 2f 0d 0a 20 20 46  guration */..  F
ad70: 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  ts5Index *pIndex
ad80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ad90: 2a 20 46 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  * Full-text inde
ada0: 78 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 73 74 61 74  x */..};....stat
adb0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
adc0: 73 35 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 0d  s5GetTokenizer(.
add0: 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20  .  Fts5Global*, 
ade0: 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
adf0: 2a 61 7a 41 72 67 2c 0d 0a 20 20 69 6e 74 20 6e  *azArg,..  int n
ae00: 41 72 67 2c 0d 0a 20 20 46 74 73 35 54 6f 6b 65  Arg,..  Fts5Toke
ae10: 6e 69 7a 65 72 2a 2a 2c 0d 0a 20 20 66 74 73 35  nizer**,..  fts5
ae20: 5f 74 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0d 0a 20  _tokenizer**,.. 
ae30: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0d 0a 29   char **pzErr..)
ae40: 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 46 74 73 35  ;....static Fts5
ae50: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 74  Table *sqlite3Ft
ae60: 73 35 54 61 62 6c 65 46 72 6f 6d 43 73 72 69 64  s5TableFromCsrid
ae70: 28 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 69 36  (Fts5Global*, i6
ae80: 34 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  4);....static in
ae90: 74 20 73 71 6c 69 74 65 33 46 74 73 35 46 6c 75  t sqlite3Fts5Flu
aea0: 73 68 54 6f 44 69 73 6b 28 46 74 73 35 54 61 62  shToDisk(Fts5Tab
aeb0: 6c 65 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  le*);..../*..** 
aec0: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
aed0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
aee0: 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c...***********
aef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
af00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
af10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
af20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
af30: 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..../***********
af40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
af50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
af60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
af70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d  ***************.
af80: 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
af90: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61   code in fts5_ha
afa0: 73 68 2e 63 2e 20 0d 0a 2a 2f 0d 0a 74 79 70 65  sh.c. ..*/..type
afb0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 48  def struct Fts5H
afc0: 61 73 68 20 46 74 73 35 48 61 73 68 3b 0d 0a 0d  ash Fts5Hash;...
afd0: 0a 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74 65 20 61  ./*..** Create a
afe0: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 66 72 65   hash table, fre
aff0: 65 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0d  e a hash table..
b000: 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
b010: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e  sqlite3Fts5HashN
b020: 65 77 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20  ew(Fts5Config*, 
b030: 46 74 73 35 48 61 73 68 2a 2a 2c 20 69 6e 74 20  Fts5Hash**, int 
b040: 2a 70 6e 53 69 7a 65 29 3b 0d 0a 73 74 61 74 69  *pnSize);..stati
b050: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
b060: 73 35 48 61 73 68 46 72 65 65 28 46 74 73 35 48  s5HashFree(Fts5H
b070: 61 73 68 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63  ash*);....static
b080: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
b090: 48 61 73 68 57 72 69 74 65 28 0d 0a 20 20 46 74  HashWrite(..  Ft
b0a0: 73 35 48 61 73 68 2a 2c 0d 0a 20 20 69 36 34 20  s5Hash*,..  i64 
b0b0: 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b0d0: 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 65 6e  owid for this en
b0e0: 74 72 79 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 43  try */..  int iC
b0f0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
b100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
b110: 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  umn token appear
b120: 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c  s in (-ve -> del
b130: 65 74 65 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 69  ete) */..  int i
b140: 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Pos,            
b150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
b160: 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20  sition of token 
b170: 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f  within column */
b180: 0d 0a 20 20 63 68 61 72 20 62 42 79 74 65 2c 0d  ..  char bByte,.
b190: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
b1a0: 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65  Token, int nToke
b1b0: 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61  n  /* Token to a
b1c0: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20  dd or remove to 
b1d0: 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f  or from index */
b1e0: 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45  ..);..../*..** E
b1f0: 6d 70 74 79 20 28 62 75 74 20 64 6f 20 6e 6f 74  mpty (but do not
b200: 20 64 65 6c 65 74 65 29 20 61 20 68 61 73 68 20   delete) a hash 
b210: 74 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  table...*/..stat
b220: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
b230: 74 73 35 48 61 73 68 43 6c 65 61 72 28 46 74 73  ts5HashClear(Fts
b240: 35 48 61 73 68 2a 29 3b 0d 0a 0d 0a 73 74 61 74  5Hash*);....stat
b250: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
b260: 73 35 48 61 73 68 51 75 65 72 79 28 0d 0a 20 20  s5HashQuery(..  
b270: 46 74 73 35 48 61 73 68 2a 2c 20 20 20 20 20 20  Fts5Hash*,      
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
b2a0: 20 71 75 65 72 79 20 2a 2f 0d 0a 20 20 63 6f 6e   query */..  con
b2b0: 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 20  st char *pTerm, 
b2c0: 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 2f 2a 20  int nTerm,   /* 
b2d0: 51 75 65 72 79 20 74 65 72 6d 20 2a 2f 0d 0a 20  Query term */.. 
b2e0: 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 44 6f   const u8 **ppDo
b2f0: 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  clist,          
b300: 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72   /* OUT: Pointer
b310: 20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20   to doclist for 
b320: 70 54 65 72 6d 20 2a 2f 0d 0a 20 20 69 6e 74 20  pTerm */..  int 
b330: 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20  *pnDoclist      
b340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b350: 55 54 3a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c  UT: Size of docl
b360: 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d  ist in bytes */.
b370: 0a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  .);....static in
b380: 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  t sqlite3Fts5Has
b390: 68 53 63 61 6e 49 6e 69 74 28 0d 0a 20 20 46 74  hScanInit(..  Ft
b3a0: 73 35 48 61 73 68 2a 2c 20 20 20 20 20 20 20 20  s5Hash*,        
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b3c0: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 71   Hash table to q
b3d0: 75 65 72 79 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74  uery */..  const
b3e0: 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e   char *pTerm, in
b3f0: 74 20 6e 54 65 72 6d 20 20 20 20 2f 2a 20 51 75  t nTerm    /* Qu
b400: 65 72 79 20 70 72 65 66 69 78 20 2a 2f 0d 0a 29  ery prefix */..)
b410: 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  ;..static void s
b420: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
b430: 61 6e 4e 65 78 74 28 46 74 73 35 48 61 73 68 2a  anNext(Fts5Hash*
b440: 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  );..static int s
b450: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
b460: 61 6e 45 6f 66 28 46 74 73 35 48 61 73 68 2a 29  anEof(Fts5Hash*)
b470: 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  ;..static void s
b480: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
b490: 61 6e 45 6e 74 72 79 28 46 74 73 35 48 61 73 68  anEntry(Fts5Hash
b4a0: 20 2a 2c 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61   *,..  const cha
b4b0: 72 20 2a 2a 70 7a 54 65 72 6d 2c 20 20 20 20 20  r **pzTerm,     
b4c0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 74         /* OUT: t
b4d0: 65 72 6d 20 28 6e 75 6c 2d 74 65 72 6d 69 6e 61  erm (nul-termina
b4e0: 74 65 64 29 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74  ted) */..  const
b4f0: 20 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c   u8 **ppDoclist,
b500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
b510: 54 3a 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f  T: pointer to do
b520: 63 6c 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20  clist */..  int 
b530: 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20  *pnDoclist      
b540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b550: 55 54 3a 20 73 69 7a 65 20 6f 66 20 64 6f 63 6c  UT: size of docl
b560: 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d  ist in bytes */.
b570: 0a 29 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  .);....../*..** 
b580: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
b590: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
b5a0: 5f 68 61 73 68 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a  _hash.c...******
b5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5f0: 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a  ****/..../******
b600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b640: 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61  ****..** Interfa
b650: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
b660: 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 20 66 74  s5_storage.c. ft
b670: 73 35 5f 73 74 6f 72 61 67 65 2e 63 20 63 6f 6e  s5_storage.c con
b680: 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e 73 20 0d  tains contains .
b690: 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 61 63 63 65  .** code to acce
b6a0: 73 73 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  ss the data stor
b6b0: 65 64 20 69 6e 20 74 68 65 20 25 5f 63 6f 6e 74  ed in the %_cont
b6c0: 65 6e 74 20 61 6e 64 20 25 5f 64 6f 63 73 69 7a  ent and %_docsiz
b6d0: 65 20 74 61 62 6c 65 73 2e 0d 0a 2a 2f 0d 0a 0d  e tables...*/...
b6e0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
b6f0: 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20 30 20 20  MT_SCAN_ASC  0  
b700: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77     /* SELECT row
b710: 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  id, * FROM ... O
b720: 52 44 45 52 20 42 59 20 31 20 41 53 43 20 2a 2f  RDER BY 1 ASC */
b730: 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  ..#define FTS5_S
b740: 54 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20 31 20  TMT_SCAN_DESC 1 
b750: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f      /* SELECT ro
b760: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20  wid, * FROM ... 
b770: 4f 52 44 45 52 20 42 59 20 31 20 44 45 53 43 20  ORDER BY 1 DESC 
b780: 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
b790: 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20 20  _STMT_LOOKUP    
b7a0: 32 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  2     /* SELECT 
b7b0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
b7c0: 2e 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 20  . WHERE rowid=? 
b7d0: 2a 2f 0d 0a 0d 0a 74 79 70 65 64 65 66 20 73 74  */....typedef st
b7e0: 72 75 63 74 20 46 74 73 35 53 74 6f 72 61 67 65  ruct Fts5Storage
b7f0: 20 46 74 73 35 53 74 6f 72 61 67 65 3b 0d 0a 0d   Fts5Storage;...
b800: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
b810: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4f 70  te3Fts5StorageOp
b820: 65 6e 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20  en(Fts5Config*, 
b830: 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 6e 74 2c  Fts5Index*, int,
b840: 20 46 74 73 35 53 74 6f 72 61 67 65 2a 2a 2c 20   Fts5Storage**, 
b850: 63 68 61 72 2a 2a 29 3b 0d 0a 73 74 61 74 69 63  char**);..static
b860: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
b870: 53 74 6f 72 61 67 65 43 6c 6f 73 65 28 46 74 73  StorageClose(Fts
b880: 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0d 0a 73  5Storage *p);..s
b890: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
b8a0: 33 46 74 73 35 53 74 6f 72 61 67 65 52 65 6e 61  3Fts5StorageRena
b8b0: 6d 65 28 46 74 73 35 53 74 6f 72 61 67 65 2a 2c  me(Fts5Storage*,
b8c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
b8d0: 6d 65 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69  me);....static i
b8e0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 44 72  nt sqlite3Fts5Dr
b8f0: 6f 70 41 6c 6c 28 46 74 73 35 43 6f 6e 66 69 67  opAll(Fts5Config
b900: 2a 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  *);..static int 
b910: 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
b920: 65 54 61 62 6c 65 28 46 74 73 35 43 6f 6e 66 69  eTable(Fts5Confi
b930: 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  g*, const char*,
b940: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
b950: 74 2c 20 63 68 61 72 20 2a 2a 29 3b 0d 0a 0d 0a  t, char **);....
b960: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
b970: 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 65 6c  e3Fts5StorageDel
b980: 65 74 65 28 46 74 73 35 53 74 6f 72 61 67 65 20  ete(Fts5Storage 
b990: 2a 70 2c 20 69 36 34 2c 20 73 71 6c 69 74 65 33  *p, i64, sqlite3
b9a0: 5f 76 61 6c 75 65 2a 2a 29 3b 0d 0a 73 74 61 74  _value**);..stat
b9b0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
b9c0: 73 35 53 74 6f 72 61 67 65 43 6f 6e 74 65 6e 74  s5StorageContent
b9d0: 49 6e 73 65 72 74 28 46 74 73 35 53 74 6f 72 61  Insert(Fts5Stora
b9e0: 67 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  ge *p, sqlite3_v
b9f0: 61 6c 75 65 2a 2a 2c 20 69 36 34 2a 29 3b 0d 0a  alue**, i64*);..
ba00: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
ba10: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 64  e3Fts5StorageInd
ba20: 65 78 49 6e 73 65 72 74 28 46 74 73 35 53 74 6f  exInsert(Fts5Sto
ba30: 72 61 67 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  rage *p, sqlite3
ba40: 5f 76 61 6c 75 65 2a 2a 2c 20 69 36 34 29 3b 0d  _value**, i64);.
ba50: 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ...static int sq
ba60: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
ba70: 49 6e 74 65 67 72 69 74 79 28 46 74 73 35 53 74  Integrity(Fts5St
ba80: 6f 72 61 67 65 20 2a 70 29 3b 0d 0a 0d 0a 73 74  orage *p);....st
ba90: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
baa0: 46 74 73 35 53 74 6f 72 61 67 65 53 74 6d 74 28  Fts5StorageStmt(
bab0: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
bac0: 69 6e 74 20 65 53 74 6d 74 2c 20 73 71 6c 69 74  int eStmt, sqlit
bad0: 65 33 5f 73 74 6d 74 2a 2a 2c 20 63 68 61 72 2a  e3_stmt**, char*
bae0: 2a 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  *);..static void
baf0: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
bb00: 61 67 65 53 74 6d 74 52 65 6c 65 61 73 65 28 46  ageStmtRelease(F
bb10: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
bb20: 6e 74 20 65 53 74 6d 74 2c 20 73 71 6c 69 74 65  nt eStmt, sqlite
bb30: 33 5f 73 74 6d 74 2a 29 3b 0d 0a 0d 0a 73 74 61  3_stmt*);....sta
bb40: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
bb50: 74 73 35 53 74 6f 72 61 67 65 44 6f 63 73 69 7a  ts5StorageDocsiz
bb60: 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  e(Fts5Storage *p
bb70: 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 69 6e  , i64 iRowid, in
bb80: 74 20 2a 61 43 6f 6c 29 3b 0d 0a 73 74 61 74 69  t *aCol);..stati
bb90: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
bba0: 35 53 74 6f 72 61 67 65 53 69 7a 65 28 46 74 73  5StorageSize(Fts
bbb0: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74  5Storage *p, int
bbc0: 20 69 43 6f 6c 2c 20 69 36 34 20 2a 70 6e 41 76   iCol, i64 *pnAv
bbd0: 67 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  g);..static int 
bbe0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
bbf0: 67 65 52 6f 77 43 6f 75 6e 74 28 46 74 73 35 53  geRowCount(Fts5S
bc00: 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 20 2a  torage *p, i64 *
bc10: 70 6e 52 6f 77 29 3b 0d 0a 0d 0a 73 74 61 74 69  pnRow);....stati
bc20: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
bc30: 35 53 74 6f 72 61 67 65 53 79 6e 63 28 46 74 73  5StorageSync(Fts
bc40: 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0d 0a 73  5Storage *p);..s
bc50: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
bc60: 33 46 74 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c  3Fts5StorageRoll
bc70: 62 61 63 6b 28 46 74 73 35 53 74 6f 72 61 67 65  back(Fts5Storage
bc80: 20 2a 70 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20   *p);....static 
bc90: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
bca0: 74 6f 72 61 67 65 43 6f 6e 66 69 67 56 61 6c 75  torageConfigValu
bcb0: 65 28 0d 0a 20 20 20 20 46 74 73 35 53 74 6f 72  e(..    Fts5Stor
bcc0: 61 67 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  age *p, const ch
bcd0: 61 72 2a 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ar*, sqlite3_val
bce0: 75 65 2a 2c 20 69 6e 74 0d 0a 29 3b 0d 0a 0d 0a  ue*, int..);....
bcf0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
bd00: 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 65 6c  e3Fts5StorageDel
bd10: 65 74 65 41 6c 6c 28 46 74 73 35 53 74 6f 72 61  eteAll(Fts5Stora
bd20: 67 65 20 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20  ge *p);..static 
bd30: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
bd40: 74 6f 72 61 67 65 52 65 62 75 69 6c 64 28 46 74  torageRebuild(Ft
bd50: 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0d 0a  s5Storage *p);..
bd60: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
bd70: 65 33 46 74 73 35 53 74 6f 72 61 67 65 4f 70 74  e3Fts5StorageOpt
bd80: 69 6d 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67  imize(Fts5Storag
bd90: 65 20 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20 69  e *p);..static i
bda0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
bdb0: 6f 72 61 67 65 4d 65 72 67 65 28 46 74 73 35 53  orageMerge(Fts5S
bdc0: 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 6e  torage *p, int n
bdd0: 4d 65 72 67 65 29 3b 0d 0a 73 74 61 74 69 63 20  Merge);..static 
bde0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
bdf0: 74 6f 72 61 67 65 52 65 73 65 74 28 46 74 73 35  torageReset(Fts5
be00: 53 74 6f 72 61 67 65 20 2a 70 29 3b 0d 0a 0d 0a  Storage *p);....
be10: 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  /*..** End of in
be20: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
be30: 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e  in fts5_storage.
be40: 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c...************
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d  **************/.
be90: 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ...../**********
bea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
beb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bee0: 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  ..** Interface t
bef0: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 65  o code in fts5_e
bf00: 78 70 72 2e 63 2e 20 0d 0a 2a 2f 0d 0a 74 79 70  xpr.c. ..*/..typ
bf10: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
bf20: 45 78 70 72 20 46 74 73 35 45 78 70 72 3b 0d 0a  Expr Fts5Expr;..
bf30: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
bf40: 74 73 35 45 78 70 72 4e 6f 64 65 20 46 74 73 35  ts5ExprNode Fts5
bf50: 45 78 70 72 4e 6f 64 65 3b 0d 0a 74 79 70 65 64  ExprNode;..typed
bf60: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50 61  ef struct Fts5Pa
bf70: 72 73 65 20 46 74 73 35 50 61 72 73 65 3b 0d 0a  rse Fts5Parse;..
bf80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
bf90: 74 73 35 54 6f 6b 65 6e 20 46 74 73 35 54 6f 6b  ts5Token Fts5Tok
bfa0: 65 6e 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72  en;..typedef str
bfb0: 75 63 74 20 46 74 73 35 45 78 70 72 50 68 72 61  uct Fts5ExprPhra
bfc0: 73 65 20 46 74 73 35 45 78 70 72 50 68 72 61 73  se Fts5ExprPhras
bfd0: 65 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75  e;..typedef stru
bfe0: 63 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  ct Fts5ExprNears
bff0: 65 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  et Fts5ExprNears
c000: 65 74 3b 0d 0a 0d 0a 73 74 72 75 63 74 20 46 74  et;....struct Ft
c010: 73 35 54 6f 6b 65 6e 20 7b 0d 0a 20 20 63 6f 6e  s5Token {..  con
c020: 73 74 20 63 68 61 72 20 2a 70 3b 20 20 20 20 20  st char *p;     
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c040: 54 6f 6b 65 6e 20 74 65 78 74 20 28 6e 6f 74 20  Token text (not 
c050: 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 29  NULL terminated)
c060: 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 3b 20 20 20   */..  int n;   
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
c090: 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62 79  f buffer p in by
c0a0: 74 65 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a  tes */..};..../*
c0b0: 20 50 61 72 73 65 20 61 20 4d 41 54 43 48 20 65   Parse a MATCH e
c0c0: 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0d 0a 73  xpression. */..s
c0d0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
c0e0: 33 46 74 73 35 45 78 70 72 4e 65 77 28 0d 0a 20  3Fts5ExprNew(.. 
c0f0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
c100: 6e 66 69 67 2c 20 0d 0a 20 20 69 6e 74 20 69 43  nfig, ..  int iC
c110: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
c120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
c130: 75 6d 6e 20 6f 6e 20 4c 48 53 20 6f 66 20 4d 41  umn on LHS of MA
c140: 54 43 48 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0d  TCH operator */.
c150: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c160: 45 78 70 72 2c 0d 0a 20 20 46 74 73 35 45 78 70  Expr,..  Fts5Exp
c170: 72 20 2a 2a 70 70 4e 65 77 2c 20 0d 0a 20 20 63  r **ppNew, ..  c
c180: 68 61 72 20 2a 2a 70 7a 45 72 72 0d 0a 29 3b 0d  har **pzErr..);.
c190: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 66 6f 72 28 72 63  .../*..** for(rc
c1a0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78   = sqlite3Fts5Ex
c1b0: 70 72 46 69 72 73 74 28 70 45 78 70 72 2c 20 70  prFirst(pExpr, p
c1c0: 49 64 78 2c 20 62 44 65 73 63 29 3b 0d 0a 2a 2a  Idx, bDesc);..**
c1d0: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
c1e0: 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  OK && 0==sqlite3
c1f0: 46 74 73 35 45 78 70 72 45 6f 66 28 70 45 78 70  Fts5ExprEof(pExp
c200: 72 29 3b 0d 0a 2a 2a 20 20 20 20 20 72 63 20 3d  r);..**     rc =
c210: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
c220: 4e 65 78 74 28 70 45 78 70 72 29 0d 0a 2a 2a 20  Next(pExpr)..** 
c230: 29 7b 0d 0a 2a 2a 20 20 20 2f 2f 20 54 68 65 20  ){..**   // The 
c240: 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f  document with ro
c250: 77 69 64 20 69 52 6f 77 69 64 20 6d 61 74 63 68  wid iRowid match
c260: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
c270: 6e 21 0d 0a 2a 2a 20 20 20 69 36 34 20 69 52 6f  n!..**   i64 iRo
c280: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73  wid = sqlite3Fts
c290: 35 45 78 70 72 52 6f 77 69 64 28 70 45 78 70 72  5ExprRowid(pExpr
c2a0: 29 3b 0d 0a 2a 2a 20 7d 0d 0a 2a 2f 0d 0a 73 74  );..** }..*/..st
c2b0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
c2c0: 46 74 73 35 45 78 70 72 46 69 72 73 74 28 46 74  Fts5ExprFirst(Ft
c2d0: 73 35 45 78 70 72 2a 2c 20 46 74 73 35 49 6e 64  s5Expr*, Fts5Ind
c2e0: 65 78 20 2a 70 49 64 78 2c 20 69 36 34 20 69 4d  ex *pIdx, i64 iM
c2f0: 69 6e 2c 20 69 6e 74 20 62 44 65 73 63 29 3b 0d  in, int bDesc);.
c300: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
c310: 74 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28  te3Fts5ExprNext(
c320: 46 74 73 35 45 78 70 72 2a 2c 20 69 36 34 20 69  Fts5Expr*, i64 i
c330: 4d 61 78 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e  Max);..static in
c340: 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
c350: 72 45 6f 66 28 46 74 73 35 45 78 70 72 2a 29 3b  rEof(Fts5Expr*);
c360: 0d 0a 73 74 61 74 69 63 20 69 36 34 20 73 71 6c  ..static i64 sql
c370: 69 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69  ite3Fts5ExprRowi
c380: 64 28 46 74 73 35 45 78 70 72 2a 29 3b 0d 0a 0d  d(Fts5Expr*);...
c390: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
c3a0: 69 74 65 33 46 74 73 35 45 78 70 72 46 72 65 65  ite3Fts5ExprFree
c3b0: 28 46 74 73 35 45 78 70 72 2a 29 3b 0d 0a 0d 0a  (Fts5Expr*);....
c3c0: 2f 2a 20 43 61 6c 6c 65 64 20 64 75 72 69 6e 67  /* Called during
c3d0: 20 73 74 61 72 74 75 70 20 74 6f 20 72 65 67 69   startup to regi
c3e0: 73 74 65 72 20 61 20 55 44 46 20 77 69 74 68 20  ster a UDF with 
c3f0: 53 51 4c 69 74 65 20 2a 2f 0d 0a 73 74 61 74 69  SQLite */..stati
c400: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
c410: 35 45 78 70 72 49 6e 69 74 28 46 74 73 35 47 6c  5ExprInit(Fts5Gl
c420: 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 29  obal*, sqlite3*)
c430: 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  ;....static int 
c440: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50  sqlite3Fts5ExprP
c450: 68 72 61 73 65 43 6f 75 6e 74 28 46 74 73 35 45  hraseCount(Fts5E
c460: 78 70 72 2a 29 3b 0d 0a 73 74 61 74 69 63 20 69  xpr*);..static i
c470: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
c480: 70 72 50 68 72 61 73 65 53 69 7a 65 28 46 74 73  prPhraseSize(Fts
c490: 35 45 78 70 72 2a 2c 20 69 6e 74 20 69 50 68 72  5Expr*, int iPhr
c4a0: 61 73 65 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e  ase);..static in
c4b0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
c4c0: 72 50 6f 73 6c 69 73 74 28 46 74 73 35 45 78 70  rPoslist(Fts5Exp
c4d0: 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75  r*, int, const u
c4e0: 38 20 2a 2a 29 3b 0d 0a 0d 0a 74 79 70 65 64 65  8 **);....typede
c4f0: 66 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73  f struct Fts5Pos
c500: 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 20 46 74  listPopulator Ft
c510: 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74  s5PoslistPopulat
c520: 6f 72 3b 0d 0a 73 74 61 74 69 63 20 46 74 73 35  or;..static Fts5
c530: 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72  PoslistPopulator
c540: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 45 78 70   *sqlite3Fts5Exp
c550: 72 43 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 46  rClearPoslists(F
c560: 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 29 3b 0d  ts5Expr*, int);.
c570: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
c580: 74 65 33 46 74 73 35 45 78 70 72 50 6f 70 75 6c  te3Fts5ExprPopul
c590: 61 74 65 50 6f 73 6c 69 73 74 73 28 0d 0a 20 20  atePoslists(..  
c5a0: 20 20 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46    Fts5Config*, F
c5b0: 74 73 35 45 78 70 72 2a 2c 20 46 74 73 35 50 6f  ts5Expr*, Fts5Po
c5c0: 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 2a 2c  slistPopulator*,
c5d0: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72   int, const char
c5e0: 2a 2c 20 69 6e 74 0d 0a 29 3b 0d 0a 73 74 61 74  *, int..);..stat
c5f0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
c600: 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c  ts5ExprCheckPosl
c610: 69 73 74 73 28 46 74 73 35 45 78 70 72 2a 2c 20  ists(Fts5Expr*, 
c620: 69 36 34 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20  i64);....static 
c630: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
c640: 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65 28 46  xprClonePhrase(F
c650: 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20 46  ts5Expr*, int, F
c660: 74 73 35 45 78 70 72 2a 2a 29 3b 0d 0a 0d 0a 73  ts5Expr**);....s
c670: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
c680: 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43  3Fts5ExprPhraseC
c690: 6f 6c 6c 69 73 74 28 46 74 73 35 45 78 70 72 20  ollist(Fts5Expr 
c6a0: 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38  *, int, const u8
c6b0: 20 2a 2a 2c 20 69 6e 74 20 2a 29 3b 0d 0a 0d 0a   **, int *);....
c6c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
c6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a  ************..**
c6f0: 20 54 68 65 20 66 74 73 35 5f 65 78 70 72 2e 63   The fts5_expr.c
c700: 20 41 50 49 20 61 62 6f 76 65 20 74 68 69 73 20   API above this 
c710: 70 6f 69 6e 74 20 69 73 20 75 73 65 64 20 62 79  point is used by
c720: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2d   the other hand-
c730: 77 72 69 74 74 65 6e 0d 0a 2a 2a 20 43 20 63 6f  written..** C co
c740: 64 65 20 69 6e 20 74 68 69 73 20 6d 6f 64 75 6c  de in this modul
c750: 65 2e 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  e. The interface
c760: 73 20 62 65 6c 6f 77 20 74 68 69 73 20 70 6f 69  s below this poi
c770: 6e 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79  nt are called by
c780: 0d 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 72 20  ..** the parser 
c790: 63 6f 64 65 20 69 6e 20 66 74 73 35 70 61 72 73  code in fts5pars
c7a0: 65 2e 79 2e 20 20 2a 2f 0d 0a 0d 0a 73 74 61 74  e.y.  */....stat
c7b0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
c7c0: 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 46 74  ts5ParseError(Ft
c7d0: 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s5Parse *pParse,
c7e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
c7f0: 74 2c 20 2e 2e 2e 29 3b 0d 0a 0d 0a 73 74 61 74  t, ...);....stat
c800: 69 63 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  ic Fts5ExprNode 
c810: 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73  *sqlite3Fts5Pars
c820: 65 4e 6f 64 65 28 0d 0a 20 20 46 74 73 35 50 61  eNode(..  Fts5Pa
c830: 72 73 65 20 2a 70 50 61 72 73 65 2c 0d 0a 20 20  rse *pParse,..  
c840: 69 6e 74 20 65 54 79 70 65 2c 0d 0a 20 20 46 74  int eType,..  Ft
c850: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4c 65 66  s5ExprNode *pLef
c860: 74 2c 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  t,..  Fts5ExprNo
c870: 64 65 20 2a 70 52 69 67 68 74 2c 0d 0a 20 20 46  de *pRight,..  F
c880: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a  ts5ExprNearset *
c890: 70 4e 65 61 72 0d 0a 29 3b 0d 0a 0d 0a 73 74 61  pNear..);....sta
c8a0: 74 69 63 20 46 74 73 35 45 78 70 72 4e 6f 64 65  tic Fts5ExprNode
c8b0: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72   *sqlite3Fts5Par
c8c0: 73 65 49 6d 70 6c 69 63 69 74 41 6e 64 28 0d 0a  seImplicitAnd(..
c8d0: 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61    Fts5Parse *pPa
c8e0: 72 73 65 2c 0d 0a 20 20 46 74 73 35 45 78 70 72  rse,..  Fts5Expr
c8f0: 4e 6f 64 65 20 2a 70 4c 65 66 74 2c 0d 0a 20 20  Node *pLeft,..  
c900: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52  Fts5ExprNode *pR
c910: 69 67 68 74 0d 0a 29 3b 0d 0a 0d 0a 73 74 61 74  ight..);....stat
c920: 69 63 20 46 74 73 35 45 78 70 72 50 68 72 61 73  ic Fts5ExprPhras
c930: 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61  e *sqlite3Fts5Pa
c940: 72 73 65 54 65 72 6d 28 0d 0a 20 20 46 74 73 35  rseTerm(..  Fts5
c950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0d  Parse *pParse, .
c960: 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73  .  Fts5ExprPhras
c970: 65 20 2a 70 50 68 72 61 73 65 2c 20 0d 0a 20 20  e *pPhrase, ..  
c980: 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  Fts5Token *pToke
c990: 6e 2c 0d 0a 20 20 69 6e 74 20 62 50 72 65 66 69  n,..  int bPrefi
c9a0: 78 0d 0a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20  x..);....static 
c9b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
c9c0: 50 61 72 73 65 53 65 74 43 61 72 65 74 28 46 74  ParseSetCaret(Ft
c9d0: 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0d  s5ExprPhrase*);.
c9e0: 0a 0d 0a 73 74 61 74 69 63 20 46 74 73 35 45 78  ...static Fts5Ex
c9f0: 70 72 4e 65 61 72 73 65 74 20 2a 73 71 6c 69 74  prNearset *sqlit
ca00: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73  e3Fts5ParseNears
ca10: 65 74 28 0d 0a 20 20 46 74 73 35 50 61 72 73 65  et(..  Fts5Parse
ca20: 2a 2c 20 0d 0a 20 20 46 74 73 35 45 78 70 72 4e  *, ..  Fts5ExprN
ca30: 65 61 72 73 65 74 2a 2c 0d 0a 20 20 46 74 73 35  earset*,..  Fts5
ca40: 45 78 70 72 50 68 72 61 73 65 2a 20 0d 0a 29 3b  ExprPhrase* ..);
ca50: 0d 0a 0d 0a 73 74 61 74 69 63 20 46 74 73 35 43  ....static Fts5C
ca60: 6f 6c 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74  olset *sqlite3Ft
ca70: 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28 0d 0a  s5ParseColset(..
ca80: 20 20 46 74 73 35 50 61 72 73 65 2a 2c 20 0d 0a    Fts5Parse*, ..
ca90: 20 20 46 74 73 35 43 6f 6c 73 65 74 2a 2c 20 0d    Fts5Colset*, .
caa0: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 0d 0a  .  Fts5Token *..
cab0: 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69  );....static voi
cac0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
cad0: 73 65 50 68 72 61 73 65 46 72 65 65 28 46 74 73  sePhraseFree(Fts
cae0: 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0d 0a  5ExprPhrase*);..
caf0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
cb00: 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72  te3Fts5ParseNear
cb10: 73 65 74 46 72 65 65 28 46 74 73 35 45 78 70 72  setFree(Fts5Expr
cb20: 4e 65 61 72 73 65 74 2a 29 3b 0d 0a 73 74 61 74  Nearset*);..stat
cb30: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
cb40: 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65  ts5ParseNodeFree
cb50: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 3b  (Fts5ExprNode*);
cb60: 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ....static void 
cb70: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
cb80: 53 65 74 44 69 73 74 61 6e 63 65 28 46 74 73 35  SetDistance(Fts5
cb90: 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78 70 72  Parse*, Fts5Expr
cba0: 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35 54 6f  Nearset*, Fts5To
cbb0: 6b 65 6e 2a 29 3b 0d 0a 73 74 61 74 69 63 20 76  ken*);..static v
cbc0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
cbd0: 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28 46 74  arseSetColset(Ft
cbe0: 73 35 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78  s5Parse*, Fts5Ex
cbf0: 70 72 4e 6f 64 65 2a 2c 20 46 74 73 35 43 6f 6c  prNode*, Fts5Col
cc00: 73 65 74 2a 29 3b 0d 0a 73 74 61 74 69 63 20 46  set*);..static F
cc10: 74 73 35 43 6f 6c 73 65 74 20 2a 73 71 6c 69 74  ts5Colset *sqlit
cc20: 65 33 46 74 73 35 50 61 72 73 65 43 6f 6c 73 65  e3Fts5ParseColse
cc30: 74 49 6e 76 65 72 74 28 46 74 73 35 50 61 72 73  tInvert(Fts5Pars
cc40: 65 2a 2c 20 46 74 73 35 43 6f 6c 73 65 74 2a 29  e*, Fts5Colset*)
cc50: 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  ;..static void s
cc60: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46  qlite3Fts5ParseF
cc70: 69 6e 69 73 68 65 64 28 46 74 73 35 50 61 72 73  inished(Fts5Pars
cc80: 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45  e *pParse, Fts5E
cc90: 78 70 72 4e 6f 64 65 20 2a 70 29 3b 0d 0a 73 74  xprNode *p);..st
cca0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
ccb0: 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 28 46  3Fts5ParseNear(F
ccc0: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
ccd0: 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0d 0a  , Fts5Token*);..
cce0: 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20  ../*..** End of 
ccf0: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  interface to cod
cd00: 65 20 69 6e 20 66 74 73 35 5f 65 78 70 72 2e 63  e in fts5_expr.c
cd10: 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ...*************
cd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a  *************/..
cd60: 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ....../*********
cd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cd90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cdb0: 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  *..** Interface 
cdc0: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
cdd0: 61 75 78 2e 63 2e 20 0d 0a 2a 2f 0d 0a 0d 0a 73  aux.c. ..*/....s
cde0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
cdf0: 33 46 74 73 35 41 75 78 49 6e 69 74 28 66 74 73  3Fts5AuxInit(fts
ce00: 35 5f 61 70 69 2a 29 3b 0d 0a 2f 2a 0d 0a 2a 2a  5_api*);../*..**
ce10: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
ce20: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
ce30: 35 5f 61 75 78 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a  5_aux.c...******
ce40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ce80: 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a  ****/..../******
ce90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ceb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ced0: 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74 65 72 66 61  ****..** Interfa
cee0: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
cef0: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 20  s5_tokenizer.c. 
cf00: 0d 0a 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 69  ..*/....static i
cf10: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f  nt sqlite3Fts5To
cf20: 6b 65 6e 69 7a 65 72 49 6e 69 74 28 66 74 73 35  kenizerInit(fts5
cf30: 5f 61 70 69 2a 29 3b 0d 0a 2f 2a 0d 0a 2a 2a 20  _api*);../*..** 
cf40: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
cf50: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
cf60: 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 0d 0a 2a  _tokenizer.c...*
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 2a 2a 2a 2a 2a  ****************
cf90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a  *********/..../*
cfc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e  *********..** In
d010: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
d020: 69 6e 20 66 74 73 35 5f 76 6f 63 61 62 2e 63 2e  in fts5_vocab.c.
d030: 20 0d 0a 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20   ..*/....static 
d040: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 56  int sqlite3Fts5V
d050: 6f 63 61 62 49 6e 69 74 28 46 74 73 35 47 6c 6f  ocabInit(Fts5Glo
d060: 62 61 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 29 3b  bal*, sqlite3*);
d070: 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f  ..../*..** End o
d080: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
d090: 6f 64 65 20 69 6e 20 66 74 73 35 5f 76 6f 63 61  ode in fts5_voca
d0a0: 62 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  b.c...**********
d0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0f0: 2f 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  /....../********
d100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  **..** Interface
d150: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
d160: 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  y generated code
d170: 20 69 6e 20 66 74 73 35 5f 75 6e 69 63 6f 64 65   in fts5_unicode
d180: 32 2e 63 2e 20 0d 0a 2a 2f 0d 0a 73 74 61 74 69  2.c. ..*/..stati
d190: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
d1a0: 35 55 6e 69 63 6f 64 65 49 73 64 69 61 63 72 69  5UnicodeIsdiacri
d1b0: 74 69 63 28 69 6e 74 20 63 29 3b 0d 0a 73 74 61  tic(int c);..sta
d1c0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
d1d0: 74 73 35 55 6e 69 63 6f 64 65 46 6f 6c 64 28 69  ts5UnicodeFold(i
d1e0: 6e 74 20 63 2c 20 69 6e 74 20 62 52 65 6d 6f 76  nt c, int bRemov
d1f0: 65 44 69 61 63 72 69 74 69 63 29 3b 0d 0a 0d 0a  eDiacritic);....
d200: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
d210: 65 33 46 74 73 35 55 6e 69 63 6f 64 65 43 61 74  e3Fts5UnicodeCat
d220: 50 61 72 73 65 28 63 6f 6e 73 74 20 63 68 61 72  Parse(const char
d230: 2a 2c 20 75 38 2a 29 3b 0d 0a 73 74 61 74 69 63  *, u8*);..static
d240: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
d250: 55 6e 69 63 6f 64 65 43 61 74 65 67 6f 72 79 28  UnicodeCategory(
d260: 75 33 32 20 69 43 6f 64 65 29 3b 0d 0a 73 74 61  u32 iCode);..sta
d270: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
d280: 46 74 73 35 55 6e 69 63 6f 64 65 41 73 63 69 69  Fts5UnicodeAscii
d290: 28 75 38 2a 2c 20 75 38 2a 29 3b 0d 0a 2f 2a 0d  (u8*, u8*);../*.
d2a0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
d2b0: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
d2c0: 66 74 73 35 5f 75 6e 69 63 6f 64 65 32 2e 63 2e  fts5_unicode2.c.
d2d0: 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
d2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d  ************/...
d320: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 6c 69 6e 65  .#endif....#line
d330: 20 31 20 22 66 74 73 35 70 61 72 73 65 2e 68 22   1 "fts5parse.h"
d340: 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f  ..#define FTS5_O
d350: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 31 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  1..#define FTS5_
d380: 41 4e 44 20 20 20 20 20 20 20 20 20 20 20 20 20  AND             
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 32 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35   2..#define FTS5
d3b0: 5f 4e 4f 54 20 20 20 20 20 20 20 20 20 20 20 20  _NOT            
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 33 0d 0a 23 64 65 66 69 6e 65 20 46 54 53    3..#define FTS
d3e0: 35 5f 54 45 52 4d 20 20 20 20 20 20 20 20 20 20  5_TERM          
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 34 0d 0a 23 64 65 66 69 6e 65 20 46 54     4..#define FT
d410: 53 35 5f 43 4f 4c 4f 4e 20 20 20 20 20 20 20 20  S5_COLON        
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 35 0d 0a 23 64 65 66 69 6e 65 20 46      5..#define F
d440: 54 53 35 5f 4d 49 4e 55 53 20 20 20 20 20 20 20  TS5_MINUS       
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 20 20 36 0d 0a 23 64 65 66 69 6e 65 20       6..#define 
d470: 46 54 53 35 5f 4c 43 50 20 20 20 20 20 20 20 20  FTS5_LCP        
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 20 20 20 20 37 0d 0a 23 64 65 66 69 6e 65        7..#define
d4a0: 20 46 54 53 35 5f 52 43 50 20 20 20 20 20 20 20   FTS5_RCP       
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 20 38 0d 0a 23 64 65 66 69 6e         8..#defin
d4d0: 65 20 46 54 53 35 5f 53 54 52 49 4e 47 20 20 20  e FTS5_STRING   
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 20 20 20 20 20 20 20 39 0d 0a 23 64 65 66 69          9..#defi
d500: 6e 65 20 46 54 53 35 5f 4c 50 20 20 20 20 20 20  ne FTS5_LP      
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 20 20 20 31 30 0d 0a 23 64 65 66          10..#def
d530: 69 6e 65 20 46 54 53 35 5f 52 50 20 20 20 20 20  ine FTS5_RP     
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 20 31 31 0d 0a 23 64 65           11..#de
d560: 66 69 6e 65 20 46 54 53 35 5f 43 41 52 45 54 20  fine FTS5_CARET 
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 20 20 20 20 31 32 0d 0a 23 64            12..#d
d590: 65 66 69 6e 65 20 46 54 53 35 5f 43 4f 4d 4d 41  efine FTS5_COMMA
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 20 20 20 20 20 20 20 20 31 33 0d 0a 23             13..#
d5c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4c 55 53  define FTS5_PLUS
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 31 34 0d 0a              14..
d5f0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 41  #define FTS5_STA
d600: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 35 0d               15.
d620: 0a 0d 0a 23 6c 69 6e 65 20 31 20 22 66 74 73 35  ...#line 1 "fts5
d630: 70 61 72 73 65 2e 63 22 0d 0a 2f 2a 0d 0a 2a 2a  parse.c"../*..**
d640: 20 32 30 30 30 2d 30 35 2d 32 39 0d 0a 2a 2a 0d   2000-05-29..**.
d650: 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64  .** The author d
d660: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
d670: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
d680: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
d690: 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c  e of..** a legal
d6a0: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
d6b0: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a   a blessing:..**
d6c0: 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  ..**    May you 
d6d0: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
d6e0: 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79  evil...**    May
d6f0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
d700: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
d710: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
d720: 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61  thers...**    Ma
d730: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
d740: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
d750: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
d760: 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a  ive...**..******
d770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d7b0: 2a 2a 2a 0d 0a 2a 2a 20 44 72 69 76 65 72 20 74  ***..** Driver t
d7c0: 65 6d 70 6c 61 74 65 20 66 6f 72 20 74 68 65 20  emplate for the 
d7d0: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
d7e0: 65 72 61 74 6f 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  erator...**..** 
d7f0: 54 68 65 20 22 6c 65 6d 6f 6e 22 20 70 72 6f 67  The "lemon" prog
d800: 72 61 6d 20 70 72 6f 63 65 73 73 65 73 20 61 6e  ram processes an
d810: 20 4c 41 4c 52 28 31 29 20 69 6e 70 75 74 20 67   LALR(1) input g
d820: 72 61 6d 6d 61 72 20 66 69 6c 65 2c 20 74 68 65  rammar file, the
d830: 6e 20 75 73 65 73 0d 0a 2a 2a 20 74 68 69 73 20  n uses..** this 
d840: 74 65 6d 70 6c 61 74 65 20 74 6f 20 63 6f 6e 73  template to cons
d850: 74 72 75 63 74 20 61 20 70 61 72 73 65 72 2e 20  truct a parser. 
d860: 20 54 68 65 20 22 6c 65 6d 6f 6e 22 20 70 72 6f   The "lemon" pro
d870: 67 72 61 6d 20 69 6e 73 65 72 74 73 20 74 65 78  gram inserts tex
d880: 74 0d 0a 2a 2a 20 61 74 20 65 61 63 68 20 22 25  t..** at each "%
d890: 25 22 20 6c 69 6e 65 2e 20 20 41 6c 73 6f 2c 20  %" line.  Also, 
d8a0: 61 6e 79 20 22 50 2d 61 2d 72 2d 73 2d 65 22 20  any "P-a-r-s-e" 
d8b0: 69 64 65 6e 74 69 66 65 72 20 70 72 65 66 69 78  identifer prefix
d8c0: 20 28 77 69 74 68 6f 75 74 20 74 68 65 0d 0a 2a   (without the..*
d8d0: 2a 20 69 6e 74 65 72 73 74 69 74 69 61 6c 20 22  * interstitial "
d8e0: 2d 22 20 63 68 61 72 61 63 74 65 72 73 29 20 63  -" characters) c
d8f0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 69 73  ontained in this
d900: 20 74 65 6d 70 6c 61 74 65 20 69 73 20 63 68 61   template is cha
d910: 6e 67 65 64 20 69 6e 74 6f 0d 0a 2a 2a 20 74 68  nged into..** th
d920: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 25  e value of the %
d930: 6e 61 6d 65 20 64 69 72 65 63 74 69 76 65 20 66  name directive f
d940: 72 6f 6d 20 74 68 65 20 67 72 61 6d 6d 61 72 2e  rom the grammar.
d950: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65    Otherwise, the
d960: 20 63 6f 6e 74 65 6e 74 0d 0a 2a 2a 20 6f 66 20   content..** of 
d970: 74 68 69 73 20 74 65 6d 70 6c 61 74 65 20 69 73  this template is
d980: 20 63 6f 70 69 65 64 20 73 74 72 61 69 67 68 74   copied straight
d990: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68   through into th
d9a0: 65 20 67 65 6e 65 72 61 74 65 20 70 61 72 73 65  e generate parse
d9b0: 72 0d 0a 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  r..** source fil
d9c0: 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66  e...**..** The f
d9d0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
d9e0: 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
d9f0: 20 61 6c 6c 20 25 69 6e 63 6c 75 64 65 20 64 69   all %include di
da00: 72 65 63 74 69 76 65 73 20 66 72 6f 6d 20 74 68  rectives from th
da10: 65 0d 0a 2a 2a 20 69 6e 70 75 74 20 67 72 61 6d  e..** input gram
da20: 6d 61 72 20 66 69 6c 65 3a 0d 0a 2a 2f 0d 0a 23  mar file:..*/..#
da30: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
da40: 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  >..#include <ass
da50: 65 72 74 2e 68 3e 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ert.h>../*******
da60: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 25 69 6e 63  ***** Begin %inc
da70: 6c 75 64 65 20 73 65 63 74 69 6f 6e 73 20 66 72  lude sections fr
da80: 6f 6d 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  om the grammar *
da90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
daa0: 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 23 6c 69 6e 65 20  *******/..#line 
dab0: 34 37 20 22 66 74 73 35 70 61 72 73 65 2e 79 22  47 "fts5parse.y"
dac0: 0d 0a 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20  ..../* #include 
dad0: 22 66 74 73 35 49 6e 74 2e 68 22 20 2a 2f 0d 0a  "fts5Int.h" */..
dae0: 2f 2a 20 23 69 6e 63 6c 75 64 65 20 22 66 74 73  /* #include "fts
daf0: 35 70 61 72 73 65 2e 68 22 20 2a 2f 0d 0a 0d 0a  5parse.h" */....
db00: 2f 2a 0d 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  /*..** Disable a
db10: 6c 6c 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72  ll error recover
db20: 79 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  y processing in 
db30: 74 68 65 20 70 61 72 73 65 72 20 70 75 73 68 2d  the parser push-
db40: 64 6f 77 6e 0d 0a 2a 2a 20 61 75 74 6f 6d 61 74  down..** automat
db50: 6f 6e 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65  on...*/..#define
db60: 20 66 74 73 35 59 59 4e 4f 45 52 52 4f 52 52 45   fts5YYNOERRORRE
db70: 43 4f 56 45 52 59 20 31 0d 0a 0d 0a 2f 2a 0d 0a  COVERY 1..../*..
db80: 2a 2a 20 4d 61 6b 65 20 66 74 73 35 79 79 74 65  ** Make fts5yyte
db90: 73 74 63 61 73 65 28 29 20 74 68 65 20 73 61 6d  stcase() the sam
dba0: 65 20 61 73 20 74 65 73 74 63 61 73 65 28 29 0d  e as testcase().
dbb0: 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 66 74 73  .*/..#define fts
dbc0: 35 79 79 74 65 73 74 63 61 73 65 28 58 29 20 74  5yytestcase(X) t
dbd0: 65 73 74 63 61 73 65 28 58 29 0d 0a 0d 0a 2f 2a  estcase(X)..../*
dbe0: 0d 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  ..** Indicate th
dbf0: 61 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 72  at sqlite3Parser
dc00: 46 72 65 65 28 29 20 77 69 6c 6c 20 6e 65 76 65  Free() will neve
dc10: 72 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  r be called with
dc20: 20 61 20 6e 75 6c 6c 0d 0a 2a 2a 20 70 6f 69 6e   a null..** poin
dc30: 74 65 72 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e  ter...*/..#defin
dc40: 65 20 66 74 73 35 59 59 50 41 52 53 45 46 52 45  e fts5YYPARSEFRE
dc50: 45 4e 4f 54 4e 55 4c 4c 20 31 0d 0a 0d 0a 2f 2a  ENOTNULL 1..../*
dc60: 0d 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  ..** Alternative
dc70: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 74 68   datatype for th
dc80: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
dc90: 65 20 6d 61 6c 6c 6f 63 28 29 20 72 6f 75 74 69  e malloc() routi
dca0: 6e 65 20 70 61 73 73 65 64 0d 0a 2a 2a 20 69 6e  ne passed..** in
dcb0: 74 6f 20 73 71 6c 69 74 65 33 50 61 72 73 65 72  to sqlite3Parser
dcc0: 41 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 64 65  Alloc().  The de
dcd0: 66 61 75 6c 74 20 69 73 20 73 69 7a 65 5f 74 2e  fault is size_t.
dce0: 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 66 74  ..*/..#define ft
dcf0: 73 35 59 59 4d 41 4c 4c 4f 43 41 52 47 54 59 50  s5YYMALLOCARGTYP
dd00: 45 20 20 75 36 34 0d 0a 0d 0a 23 6c 69 6e 65 20  E  u64....#line 
dd10: 35 37 20 22 66 74 73 35 70 61 72 73 65 2e 63 22  57 "fts5parse.c"
dd20: 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
dd30: 2a 2a 2a 20 45 6e 64 20 6f 66 20 25 69 6e 63 6c  *** End of %incl
dd40: 75 64 65 20 64 69 72 65 63 74 69 76 65 73 20 2a  ude directives *
dd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd70: 2a 2f 0d 0a 2f 2a 20 54 68 65 73 65 20 63 6f 6e  */../* These con
dd80: 73 74 61 6e 74 73 20 73 70 65 63 69 66 79 20 74  stants specify t
dd90: 68 65 20 76 61 72 69 6f 75 73 20 6e 75 6d 65 72  he various numer
dda0: 69 63 20 76 61 6c 75 65 73 20 66 6f 72 20 74 65  ic values for te
ddb0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 0d 0a  rminal symbols..
ddc0: 2a 2a 20 69 6e 20 61 20 66 6f 72 6d 61 74 20 75  ** in a format u
ddd0: 6e 64 65 72 73 74 61 6e 64 61 62 6c 65 20 74 6f  nderstandable to
dde0: 20 22 6d 61 6b 65 68 65 61 64 65 72 73 22 2e 20   "makeheaders". 
ddf0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
de00: 20 62 6c 61 6e 6b 20 75 6e 6c 65 73 73 0d 0a 2a   blank unless..*
de10: 2a 20 22 6c 65 6d 6f 6e 22 20 69 73 20 72 75 6e  * "lemon" is run
de20: 20 77 69 74 68 20 74 68 65 20 22 2d 6d 22 20 63   with the "-m" c
de30: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
de40: 6f 6e 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on...***********
de50: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 6d 61 6b  ****** Begin mak
de60: 65 68 65 61 64 65 72 73 20 74 6f 6b 65 6e 20 64  eheaders token d
de70: 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2a 2a 2a 2a  efinitions *****
de80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
de90: 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
dea0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6d 61 6b  ******** End mak
deb0: 65 68 65 61 64 65 72 73 20 74 6f 6b 65 6e 20 64  eheaders token d
dec0: 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2a 2a 2a 2a  efinitions *****
ded0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dee0: 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 20 54 68  ******/..../* Th
def0: 65 20 6e 65 78 74 20 73 65 63 74 69 6f 6e 73 20  e next sections 
df00: 69 73 20 61 20 73 65 72 69 65 73 20 6f 66 20 63  is a series of c
df10: 6f 6e 74 72 6f 6c 20 23 64 65 66 69 6e 65 73 2e  ontrol #defines.
df20: 0d 0a 2a 2a 20 76 61 72 69 6f 75 73 20 61 73 70  ..** various asp
df30: 65 63 74 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ects of the gene
df40: 72 61 74 65 64 20 70 61 72 73 65 72 2e 0d 0a 2a  rated parser...*
df50: 2a 20 20 20 20 66 74 73 35 59 59 43 4f 44 45 54  *    fts5YYCODET
df60: 59 50 45 20 20 20 20 20 20 20 20 20 69 73 20 74  YPE         is t
df70: 68 65 20 64 61 74 61 20 74 79 70 65 20 75 73 65  he data type use
df80: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 69  d to store the i
df90: 6e 74 65 67 65 72 20 63 6f 64 65 73 0d 0a 2a 2a  nteger codes..**
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 20 20 20 20 74 68 61 74 20 72 65 70 72         that repr
dfc0: 65 73 65 6e 74 20 74 65 72 6d 69 6e 61 6c 20 61  esent terminal a
dfd0: 6e 64 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  nd non-terminal 
dfe0: 73 79 6d 62 6f 6c 73 2e 0d 0a 2a 2a 20 20 20 20  symbols...**    
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 20 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61     "unsigned cha
e010: 72 22 20 69 73 20 75 73 65 64 20 69 66 20 74 68  r" is used if th
e020: 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
e030: 61 6e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  an..**          
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 35 36               256
e050: 20 73 79 6d 62 6f 6c 73 2e 20 20 4c 61 72 67 65   symbols.  Large
e060: 72 20 74 79 70 65 73 20 6f 74 68 65 72 77 69 73  r types otherwis
e070: 65 2e 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59  e...**    fts5YY
e080: 4e 4f 43 4f 44 45 20 20 20 20 20 20 20 20 20 20  NOCODE          
e090: 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   is a number of 
e0a0: 74 79 70 65 20 66 74 73 35 59 59 43 4f 44 45 54  type fts5YYCODET
e0b0: 59 50 45 20 74 68 61 74 20 69 73 20 6e 6f 74 20  YPE that is not 
e0c0: 75 73 65 64 20 66 6f 72 0d 0a 2a 2a 20 20 20 20  used for..**    
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 61 6e 79 20 74 65 72 6d 69 6e 61 6c 20     any terminal 
e0f0: 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73  or nonterminal s
e100: 79 6d 62 6f 6c 2e 0d 0a 2a 2a 20 20 20 20 66 74  ymbol...**    ft
e110: 73 35 59 59 46 41 4c 4c 42 41 43 4b 20 20 20 20  s5YYFALLBACK    
e120: 20 20 20 20 20 49 66 20 64 65 66 69 6e 65 64 2c       If defined,
e130: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
e140: 74 68 61 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  that one or more
e150: 20 74 6f 6b 65 6e 73 0d 0a 2a 2a 20 20 20 20 20   tokens..**     
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 28 61 6c 73 6f 20 6b 6e 6f 77 6e 20 61 73    (also known as
e180: 3a 20 22 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  : "terminal symb
e190: 6f 6c 73 22 29 20 68 61 76 65 20 66 61 6c 6c 2d  ols") have fall-
e1a0: 62 61 63 6b 0d 0a 2a 2a 20 20 20 20 20 20 20 20  back..**        
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
e1c0: 61 6c 75 65 73 20 77 68 69 63 68 20 73 68 6f 75  alues which shou
e1d0: 6c 64 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ld be used if th
e1e0: 65 20 6f 72 69 67 69 6e 61 6c 20 73 79 6d 62 6f  e original symbo
e1f0: 6c 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  l..**           
e200: 20 20 20 20 20 20 20 20 20 20 20 20 77 6f 75 6c              woul
e210: 64 20 6e 6f 74 20 70 61 72 73 65 2e 20 20 54 68  d not parse.  Th
e220: 69 73 20 70 65 72 6d 69 74 73 20 6b 65 79 77 6f  is permits keywo
e230: 72 64 73 20 74 6f 20 73 6f 6d 65 74 69 6d 65 73  rds to sometimes
e240: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
e250: 20 20 20 20 20 20 20 20 20 20 20 62 65 20 75 73             be us
e260: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
e270: 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0d  s, for example..
e280: 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 41 43 54  .**    fts5YYACT
e290: 49 4f 4e 54 59 50 45 20 20 20 20 20 20 20 69 73  IONTYPE       is
e2a0: 20 74 68 65 20 64 61 74 61 20 74 79 70 65 20 75   the data type u
e2b0: 73 65 64 20 66 6f 72 20 22 61 63 74 69 6f 6e 20  sed for "action 
e2c0: 63 6f 64 65 73 22 20 2d 20 6e 75 6d 62 65 72 73  codes" - numbers
e2d0: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
e2e0: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
e2f0: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 6f  indicate what to
e300: 20 64 6f 20 69 6e 20 72 65 73 70 6f 6e 73 65 20   do in response 
e310: 74 6f 20 74 68 65 20 6e 65 78 74 0d 0a 2a 2a 20  to the next..** 
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 74 6f 6b 65 6e 2e 0d 0a 2a 2a        token...**
e340: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
e350: 61 72 73 65 72 46 54 53 35 54 4f 4b 45 4e 54 59  arserFTS5TOKENTY
e360: 50 45 20 20 20 20 20 69 73 20 74 68 65 20 64 61  PE     is the da
e370: 74 61 20 74 79 70 65 20 75 73 65 64 20 66 6f 72  ta type used for
e380: 20 6d 69 6e 6f 72 20 74 79 70 65 20 66 6f 72 20   minor type for 
e390: 74 65 72 6d 69 6e 61 6c 0d 0a 2a 2a 20 20 20 20  terminal..**    
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 73 79 6d 62 6f 6c 73 2e 20 20 42 61 63     symbols.  Bac
e3c0: 6b 67 72 6f 75 6e 64 3a 20 41 20 22 6d 69 6e 6f  kground: A "mino
e3d0: 72 20 74 79 70 65 22 20 69 73 20 61 20 73 65 6d  r type" is a sem
e3e0: 61 6e 74 69 63 0d 0a 2a 2a 20 20 20 20 20 20 20  antic..**       
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 76 61 6c 75 65 20 61 73 73 6f 63 69 61 74 65 64  value associated
e410: 20 77 69 74 68 20 61 20 74 65 72 6d 69 6e 61 6c   with a terminal
e420: 20 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c   or non-terminal
e430: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
e440: 20 20 20 20 20 20 20 20 20 20 20 73 79 6d 62 6f             symbo
e450: 6c 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ls.  For example
e460: 2c 20 66 6f 72 20 61 6e 20 22 49 44 22 20 74 65  , for an "ID" te
e470: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 2c 0d 0a  rminal symbol,..
e480: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e490: 20 20 20 20 20 20 20 20 20 74 68 65 20 6d 69 6e           the min
e4a0: 6f 72 20 74 79 70 65 20 6d 69 67 68 74 20 62 65  or type might be
e4b0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
e4c0: 20 69 64 65 6e 74 69 66 69 65 72 2e 0d 0a 2a 2a   identifier...**
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 20 20 20 45 61 63 68 20 6e 6f 6e 2d         Each non-
e4f0: 74 65 72 6d 69 6e 61 6c 20 63 61 6e 20 68 61 76  terminal can hav
e500: 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 69  e a different mi
e510: 6e 6f 72 20 74 79 70 65 2e 0d 0a 2a 2a 20 20 20  nor type...**   
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 20 54 65 72 6d 69 6e 61 6c 20 73 79 6d      Terminal sym
e540: 62 6f 6c 73 20 61 6c 6c 20 68 61 76 65 20 74 68  bols all have th
e550: 65 20 73 61 6d 65 20 6d 69 6e 6f 72 20 74 79 70  e same minor typ
e560: 65 2c 20 74 68 6f 75 67 68 2e 0d 0a 2a 2a 20 20  e, though...**  
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 54 68 69 73 20 6d 61 63 72 6f 73       This macros
e590: 20 64 65 66 69 6e 65 73 20 74 68 65 20 6d 69 6e   defines the min
e5a0: 6f 72 20 74 79 70 65 20 66 6f 72 20 74 65 72 6d  or type for term
e5b0: 69 6e 61 6c 20 0d 0a 2a 2a 20 20 20 20 20 20 20  inal ..**       
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 73 79 6d 62 6f 6c 73 2e 0d 0a 2a 2a 20 20 20 20  symbols...**    
e5e0: 66 74 73 35 59 59 4d 49 4e 4f 52 54 59 50 45 20  fts5YYMINORTYPE 
e5f0: 20 20 20 20 20 20 20 69 73 20 74 68 65 20 64 61         is the da
e600: 74 61 20 74 79 70 65 20 75 73 65 64 20 66 6f 72  ta type used for
e610: 20 61 6c 6c 20 6d 69 6e 6f 72 20 74 79 70 65 73   all minor types
e620: 2e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
e630: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73              This
e640: 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 61 20   is typically a 
e650: 75 6e 69 6f 6e 20 6f 66 20 6d 61 6e 79 20 74 79  union of many ty
e660: 70 65 73 2c 20 6f 6e 65 20 6f 66 0d 0a 2a 2a 20  pes, one of..** 
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 73        which is s
e690: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
e6a0: 46 54 53 35 54 4f 4b 45 4e 54 59 50 45 2e 20 20  FTS5TOKENTYPE.  
e6b0: 54 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  The entry in the
e6c0: 20 75 6e 69 6f 6e 0d 0a 2a 2a 20 20 20 20 20 20   union..**      
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79   for terminal sy
e6f0: 6d 62 6f 6c 73 20 69 73 20 63 61 6c 6c 65 64 20  mbols is called 
e700: 22 66 74 73 35 79 79 30 22 2e 0d 0a 2a 2a 20 20  "fts5yy0"...**  
e710: 20 20 66 74 73 35 59 59 53 54 41 43 4b 44 45 50    fts5YYSTACKDEP
e720: 54 48 20 20 20 20 20 20 20 69 73 20 74 68 65 20  TH       is the 
e730: 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 6f 66  maximum depth of
e740: 20 74 68 65 20 70 61 72 73 65 72 27 73 20 73 74   the parser's st
e750: 61 63 6b 2e 20 20 49 66 0d 0a 2a 2a 20 20 20 20  ack.  If..**    
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 20 7a 65 72 6f 20 74 68 65 20 73 74 61 63     zero the stac
e780: 6b 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  k is dynamically
e790: 20 73 69 7a 65 64 20 75 73 69 6e 67 20 72 65 61   sized using rea
e7a0: 6c 6c 6f 63 28 29 0d 0a 2a 2a 20 20 20 20 73 71  lloc()..**    sq
e7b0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 41  lite3Fts5ParserA
e7c0: 52 47 5f 53 44 45 43 4c 20 20 20 20 20 41 20 73  RG_SDECL     A s
e7d0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 64  tatic variable d
e7e0: 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 74  eclaration for t
e7f0: 68 65 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65  he %extra_argume
e800: 6e 74 0d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  nt..**    sqlite
e810: 33 46 74 73 35 50 61 72 73 65 72 41 52 47 5f 50  3Fts5ParserARG_P
e820: 44 45 43 4c 20 20 20 20 20 41 20 70 61 72 61 6d  DECL     A param
e830: 65 74 65 72 20 64 65 63 6c 61 72 61 74 69 6f 6e  eter declaration
e840: 20 66 6f 72 20 74 68 65 20 25 65 78 74 72 61 5f   for the %extra_
e850: 61 72 67 75 6d 65 6e 74 0d 0a 2a 2a 20 20 20 20  argument..**    
e860: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
e870: 72 41 52 47 5f 50 41 52 41 4d 20 20 20 20 20 43  rARG_PARAM     C
e880: 6f 64 65 20 74 6f 20 70 61 73 73 20 25 65 78 74  ode to pass %ext
e890: 72 61 5f 61 72 67 75 6d 65 6e 74 20 61 73 20 61  ra_argument as a
e8a0: 20 73 75 62 72 6f 75 74 69 6e 65 20 70 61 72 61   subroutine para
e8b0: 6d 65 74 65 72 0d 0a 2a 2a 20 20 20 20 73 71 6c  meter..**    sql
e8c0: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 41 52  ite3Fts5ParserAR
e8d0: 47 5f 53 54 4f 52 45 20 20 20 20 20 43 6f 64 65  G_STORE     Code
e8e0: 20 74 6f 20 73 74 6f 72 65 20 25 65 78 74 72 61   to store %extra
e8f0: 5f 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 66  _argument into f
e900: 74 73 35 79 79 70 50 61 72 73 65 72 0d 0a 2a 2a  ts5yypParser..**
e910: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
e920: 61 72 73 65 72 41 52 47 5f 46 45 54 43 48 20 20  arserARG_FETCH  
e930: 20 20 20 43 6f 64 65 20 74 6f 20 65 78 74 72 61     Code to extra
e940: 63 74 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65  ct %extra_argume
e950: 6e 74 20 66 72 6f 6d 20 66 74 73 35 79 79 70 50  nt from fts5yypP
e960: 61 72 73 65 72 0d 0a 2a 2a 20 20 20 20 73 71 6c  arser..**    sql
e970: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54  ite3Fts5ParserCT
e980: 58 5f 2a 20 20 20 20 20 20 20 20 20 41 73 20 73  X_*         As s
e990: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
e9a0: 41 52 47 5f 20 65 78 63 65 70 74 20 66 6f 72 20  ARG_ except for 
e9b0: 25 65 78 74 72 61 5f 63 6f 6e 74 65 78 74 0d 0a  %extra_context..
e9c0: 2a 2a 20 20 20 20 66 74 73 35 59 59 45 52 52 4f  **    fts5YYERRO
e9d0: 52 53 59 4d 42 4f 4c 20 20 20 20 20 20 69 73 20  RSYMBOL      is 
e9e0: 74 68 65 20 63 6f 64 65 20 6e 75 6d 62 65 72 20  the code number 
e9f0: 6f 66 20 74 68 65 20 65 72 72 6f 72 20 73 79 6d  of the error sym
ea00: 62 6f 6c 2e 20 20 49 66 20 6e 6f 74 0d 0a 2a 2a  bol.  If not..**
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 20 20 20 64 65 66 69 6e 65 64 2c 20         defined, 
ea30: 74 68 65 6e 20 64 6f 20 6e 6f 20 65 72 72 6f 72  then do no error
ea40: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0d 0a 2a 2a   processing...**
ea50: 20 20 20 20 66 74 73 35 59 59 4e 53 54 41 54 45      fts5YYNSTATE
ea60: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 63             the c
ea70: 6f 6d 62 69 6e 65 64 20 6e 75 6d 62 65 72 20 6f  ombined number o
ea80: 66 20 73 74 61 74 65 73 2e 0d 0a 2a 2a 20 20 20  f states...**   
ea90: 20 66 74 73 35 59 59 4e 52 55 4c 45 20 20 20 20   fts5YYNRULE    
eaa0: 20 20 20 20 20 20 20 20 74 68 65 20 6e 75 6d 62          the numb
eab0: 65 72 20 6f 66 20 72 75 6c 65 73 20 69 6e 20 74  er of rules in t
eac0: 68 65 20 67 72 61 6d 6d 61 72 0d 0a 2a 2a 20 20  he grammar..**  
ead0: 20 20 66 74 73 35 59 59 4e 46 54 53 35 54 4f 4b    fts5YYNFTS5TOK
eae0: 45 4e 20 20 20 20 20 20 20 20 20 20 20 4e 75 6d  EN           Num
eaf0: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
eb00: 73 79 6d 62 6f 6c 73 0d 0a 2a 2a 20 20 20 20 66  symbols..**    f
eb10: 74 73 35 59 59 5f 4d 41 58 5f 53 48 49 46 54 20  ts5YY_MAX_SHIFT 
eb20: 20 20 20 20 20 20 4d 61 78 69 6d 75 6d 20 76 61        Maximum va
eb30: 6c 75 65 20 66 6f 72 20 73 68 69 66 74 20 61 63  lue for shift ac
eb40: 74 69 6f 6e 73 0d 0a 2a 2a 20 20 20 20 66 74 73  tions..**    fts
eb50: 35 59 59 5f 4d 49 4e 5f 53 48 49 46 54 52 45 44  5YY_MIN_SHIFTRED
eb60: 55 43 45 20 4d 69 6e 69 6d 75 6d 20 76 61 6c 75  UCE Minimum valu
eb70: 65 20 66 6f 72 20 73 68 69 66 74 2d 72 65 64 75  e for shift-redu
eb80: 63 65 20 61 63 74 69 6f 6e 73 0d 0a 2a 2a 20 20  ce actions..**  
eb90: 20 20 66 74 73 35 59 59 5f 4d 41 58 5f 53 48 49    fts5YY_MAX_SHI
eba0: 46 54 52 45 44 55 43 45 20 4d 61 78 69 6d 75 6d  FTREDUCE Maximum
ebb0: 20 76 61 6c 75 65 20 66 6f 72 20 73 68 69 66 74   value for shift
ebc0: 2d 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 0d  -reduce actions.
ebd0: 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 5f 45 52  .**    fts5YY_ER
ebe0: 52 4f 52 5f 41 43 54 49 4f 4e 20 20 20 20 54 68  ROR_ACTION    Th
ebf0: 65 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e 5b  e fts5yy_action[
ec00: 5d 20 63 6f 64 65 20 66 6f 72 20 73 79 6e 74 61  ] code for synta
ec10: 78 20 65 72 72 6f 72 0d 0a 2a 2a 20 20 20 20 66  x error..**    f
ec20: 74 73 35 59 59 5f 41 43 43 45 50 54 5f 41 43 54  ts5YY_ACCEPT_ACT
ec30: 49 4f 4e 20 20 20 54 68 65 20 66 74 73 35 79 79  ION   The fts5yy
ec40: 5f 61 63 74 69 6f 6e 5b 5d 20 63 6f 64 65 20 66  _action[] code f
ec50: 6f 72 20 61 63 63 65 70 74 0d 0a 2a 2a 20 20 20  or accept..**   
ec60: 20 66 74 73 35 59 59 5f 4e 4f 5f 41 43 54 49 4f   fts5YY_NO_ACTIO
ec70: 4e 20 20 20 20 20 20 20 54 68 65 20 66 74 73 35  N       The fts5
ec80: 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 63 6f 64 65  yy_action[] code
ec90: 20 66 6f 72 20 6e 6f 2d 6f 70 0d 0a 2a 2a 20 20   for no-op..**  
eca0: 20 20 66 74 73 35 59 59 5f 4d 49 4e 5f 52 45 44    fts5YY_MIN_RED
ecb0: 55 43 45 20 20 20 20 20 20 4d 69 6e 69 6d 75 6d  UCE      Minimum
ecc0: 20 76 61 6c 75 65 20 66 6f 72 20 72 65 64 75 63   value for reduc
ecd0: 65 20 61 63 74 69 6f 6e 73 0d 0a 2a 2a 20 20 20  e actions..**   
ece0: 20 66 74 73 35 59 59 5f 4d 41 58 5f 52 45 44 55   fts5YY_MAX_REDU
ecf0: 43 45 20 20 20 20 20 20 4d 61 78 69 6d 75 6d 20  CE      Maximum 
ed00: 76 61 6c 75 65 20 66 6f 72 20 72 65 64 75 63 65  value for reduce
ed10: 20 61 63 74 69 6f 6e 73 0d 0a 2a 2f 0d 0a 23 69   actions..*/..#i
ed20: 66 6e 64 65 66 20 49 4e 54 45 52 46 41 43 45 0d  fndef INTERFACE.
ed30: 0a 23 20 64 65 66 69 6e 65 20 49 4e 54 45 52 46  .# define INTERF
ed40: 41 43 45 20 31 0d 0a 23 65 6e 64 69 66 0d 0a 2f  ACE 1..#endif../
ed50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
ed60: 67 69 6e 20 63 6f 6e 74 72 6f 6c 20 23 64 65 66  gin control #def
ed70: 69 6e 65 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ines ***********
ed80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d  **************/.
eda0: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 43  .#define fts5YYC
edb0: 4f 44 45 54 59 50 45 20 75 6e 73 69 67 6e 65 64  ODETYPE unsigned
edc0: 20 63 68 61 72 0d 0a 23 64 65 66 69 6e 65 20 66   char..#define f
edd0: 74 73 35 59 59 4e 4f 43 4f 44 45 20 32 37 0d 0a  ts5YYNOCODE 27..
ede0: 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 41 43  #define fts5YYAC
edf0: 54 49 4f 4e 54 59 50 45 20 75 6e 73 69 67 6e 65  TIONTYPE unsigne
ee00: 64 20 63 68 61 72 0d 0a 23 64 65 66 69 6e 65 20  d char..#define 
ee10: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
ee20: 72 46 54 53 35 54 4f 4b 45 4e 54 59 50 45 20 46  rFTS5TOKENTYPE F
ee30: 74 73 35 54 6f 6b 65 6e 0d 0a 74 79 70 65 64 65  ts5Token..typede
ee40: 66 20 75 6e 69 6f 6e 20 7b 0d 0a 20 20 69 6e 74  f union {..  int
ee50: 20 66 74 73 35 79 79 69 6e 69 74 3b 0d 0a 20 20   fts5yyinit;..  
ee60: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
ee70: 72 46 54 53 35 54 4f 4b 45 4e 54 59 50 45 20 66  rFTS5TOKENTYPE f
ee80: 74 73 35 79 79 30 3b 0d 0a 20 20 69 6e 74 20 66  ts5yy0;..  int f
ee90: 74 73 35 79 79 34 3b 0d 0a 20 20 46 74 73 35 43  ts5yy4;..  Fts5C
eea0: 6f 6c 73 65 74 2a 20 66 74 73 35 79 79 31 31 3b  olset* fts5yy11;
eeb0: 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ..  Fts5ExprNode
eec0: 2a 20 66 74 73 35 79 79 32 34 3b 0d 0a 20 20 46  * fts5yy24;..  F
eed0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 20  ts5ExprNearset* 
eee0: 66 74 73 35 79 79 34 36 3b 0d 0a 20 20 46 74 73  fts5yy46;..  Fts
eef0: 35 45 78 70 72 50 68 72 61 73 65 2a 20 66 74 73  5ExprPhrase* fts
ef00: 35 79 79 35 33 3b 0d 0a 7d 20 66 74 73 35 59 59  5yy53;..} fts5YY
ef10: 4d 49 4e 4f 52 54 59 50 45 3b 0d 0a 23 69 66 6e  MINORTYPE;..#ifn
ef20: 64 65 66 20 66 74 73 35 59 59 53 54 41 43 4b 44  def fts5YYSTACKD
ef30: 45 50 54 48 0d 0a 23 64 65 66 69 6e 65 20 66 74  EPTH..#define ft
ef40: 73 35 59 59 53 54 41 43 4b 44 45 50 54 48 20 31  s5YYSTACKDEPTH 1
ef50: 30 30 0d 0a 23 65 6e 64 69 66 0d 0a 23 64 65 66  00..#endif..#def
ef60: 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73 35 50  ine sqlite3Fts5P
ef70: 61 72 73 65 72 41 52 47 5f 53 44 45 43 4c 20 46  arserARG_SDECL F
ef80: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
ef90: 3b 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  ;..#define sqlit
efa0: 65 33 46 74 73 35 50 61 72 73 65 72 41 52 47 5f  e3Fts5ParserARG_
efb0: 50 44 45 43 4c 20 2c 46 74 73 35 50 61 72 73 65  PDECL ,Fts5Parse
efc0: 20 2a 70 50 61 72 73 65 0d 0a 23 64 65 66 69 6e   *pParse..#defin
efd0: 65 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  e sqlite3Fts5Par
efe0: 73 65 72 41 52 47 5f 50 41 52 41 4d 20 2c 70 50  serARG_PARAM ,pP
eff0: 61 72 73 65 0d 0a 23 64 65 66 69 6e 65 20 73 71  arse..#define sq
f000: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 41  lite3Fts5ParserA
f010: 52 47 5f 46 45 54 43 48 20 46 74 73 35 50 61 72  RG_FETCH Fts5Par
f020: 73 65 20 2a 70 50 61 72 73 65 3d 66 74 73 35 79  se *pParse=fts5y
f030: 79 70 50 61 72 73 65 72 2d 3e 70 50 61 72 73 65  ypParser->pParse
f040: 3b 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  ;..#define sqlit
f050: 65 33 46 74 73 35 50 61 72 73 65 72 41 52 47 5f  e3Fts5ParserARG_
f060: 53 54 4f 52 45 20 66 74 73 35 79 79 70 50 61 72  STORE fts5yypPar
f070: 73 65 72 2d 3e 70 50 61 72 73 65 3d 70 50 61 72  ser->pParse=pPar
f080: 73 65 3b 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c  se;..#define sql
f090: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54  ite3Fts5ParserCT
f0a0: 58 5f 53 44 45 43 4c 0d 0a 23 64 65 66 69 6e 65  X_SDECL..#define
f0b0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
f0c0: 65 72 43 54 58 5f 50 44 45 43 4c 0d 0a 23 64 65  erCTX_PDECL..#de
f0d0: 66 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73 35  fine sqlite3Fts5
f0e0: 50 61 72 73 65 72 43 54 58 5f 50 41 52 41 4d 0d  ParserCTX_PARAM.
f0f0: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
f100: 46 74 73 35 50 61 72 73 65 72 43 54 58 5f 46 45  Fts5ParserCTX_FE
f110: 54 43 48 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c  TCH..#define sql
f120: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54  ite3Fts5ParserCT
f130: 58 5f 53 54 4f 52 45 0d 0a 23 64 65 66 69 6e 65  X_STORE..#define
f140: 20 66 74 73 35 59 59 4e 53 54 41 54 45 20 20 20   fts5YYNSTATE   
f150: 20 20 20 20 20 20 20 20 20 20 33 35 0d 0a 23 64            35..#d
f160: 65 66 69 6e 65 20 66 74 73 35 59 59 4e 52 55 4c  efine fts5YYNRUL
f170: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  E              2
f180: 38 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59  8..#define fts5Y
f190: 59 4e 46 54 53 35 54 4f 4b 45 4e 20 20 20 20 20  YNFTS5TOKEN     
f1a0: 20 20 20 20 20 20 20 20 31 36 0d 0a 23 64 65 66          16..#def
f1b0: 69 6e 65 20 66 74 73 35 59 59 5f 4d 41 58 5f 53  ine fts5YY_MAX_S
f1c0: 48 49 46 54 20 20 20 20 20 20 20 20 20 33 34 0d  HIFT         34.
f1d0: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f  .#define fts5YY_
f1e0: 4d 49 4e 5f 53 48 49 46 54 52 45 44 55 43 45 20  MIN_SHIFTREDUCE 
f1f0: 20 20 35 32 0d 0a 23 64 65 66 69 6e 65 20 66 74    52..#define ft
f200: 73 35 59 59 5f 4d 41 58 5f 53 48 49 46 54 52 45  s5YY_MAX_SHIFTRE
f210: 44 55 43 45 20 20 20 37 39 0d 0a 23 64 65 66 69  DUCE   79..#defi
f220: 6e 65 20 66 74 73 35 59 59 5f 45 52 52 4f 52 5f  ne fts5YY_ERROR_
f230: 41 43 54 49 4f 4e 20 20 20 20 20 20 38 30 0d 0a  ACTION      80..
f240: 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f 41  #define fts5YY_A
f250: 43 43 45 50 54 5f 41 43 54 49 4f 4e 20 20 20 20  CCEPT_ACTION    
f260: 20 38 31 0d 0a 23 64 65 66 69 6e 65 20 66 74 73   81..#define fts
f270: 35 59 59 5f 4e 4f 5f 41 43 54 49 4f 4e 20 20 20  5YY_NO_ACTION   
f280: 20 20 20 20 20 20 38 32 0d 0a 23 64 65 66 69 6e        82..#defin
f290: 65 20 66 74 73 35 59 59 5f 4d 49 4e 5f 52 45 44  e fts5YY_MIN_RED
f2a0: 55 43 45 20 20 20 20 20 20 20 20 38 33 0d 0a 23  UCE        83..#
f2b0: 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f 4d 41  define fts5YY_MA
f2c0: 58 5f 52 45 44 55 43 45 20 20 20 20 20 20 20 20  X_REDUCE        
f2d0: 31 31 30 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  110../**********
f2e0: 2a 2a 2a 20 45 6e 64 20 63 6f 6e 74 72 6f 6c 20  *** End control 
f2f0: 23 64 65 66 69 6e 65 73 20 2a 2a 2a 2a 2a 2a 2a  #defines *******
f300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f320: 2a 2a 2a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 66  ****/..#define f
f330: 74 73 35 59 59 5f 4e 4c 4f 4f 4b 41 48 45 41 44  ts5YY_NLOOKAHEAD
f340: 20 28 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 66   ((int)(sizeof(f
f350: 74 73 35 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 29  ts5yy_lookahead)
f360: 2f 73 69 7a 65 6f 66 28 66 74 73 35 79 79 5f 6c  /sizeof(fts5yy_l
f370: 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 29 29 0d 0a  ookahead[0])))..
f380: 0d 0a 2f 2a 20 44 65 66 69 6e 65 20 74 68 65 20  ../* Define the 
f390: 66 74 73 35 79 79 74 65 73 74 63 61 73 65 28 29  fts5yytestcase()
f3a0: 20 6d 61 63 72 6f 20 74 6f 20 62 65 20 61 20 6e   macro to be a n
f3b0: 6f 2d 6f 70 20 69 66 20 69 73 20 6e 6f 74 20 61  o-op if is not a
f3c0: 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64 0d 0a  lready defined..
f3d0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a 2a  ** otherwise...*
f3e0: 2a 0d 0a 2a 2a 20 41 70 70 6c 69 63 61 74 69 6f  *..** Applicatio
f3f0: 6e 73 20 63 61 6e 20 63 68 6f 6f 73 65 20 74 6f  ns can choose to
f400: 20 64 65 66 69 6e 65 20 66 74 73 35 79 79 74 65   define fts5yyte
f410: 73 74 63 61 73 65 28 29 20 69 6e 20 74 68 65 20  stcase() in the 
f420: 25 69 6e 63 6c 75 64 65 20 73 65 63 74 69 6f 6e  %include section
f430: 0d 0a 2a 2a 20 74 6f 20 61 20 6d 61 63 72 6f 20  ..** to a macro 
f440: 74 68 61 74 20 63 61 6e 20 61 73 73 69 73 74 20  that can assist 
f450: 69 6e 20 76 65 72 69 66 79 69 6e 67 20 63 6f 64  in verifying cod
f460: 65 20 63 6f 76 65 72 61 67 65 2e 20 20 46 6f 72  e coverage.  For
f470: 20 70 72 6f 64 75 63 74 69 6f 6e 0d 0a 2a 2a 20   production..** 
f480: 63 6f 64 65 20 74 68 65 20 66 74 73 35 79 79 74  code the fts5yyt
f490: 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
f4a0: 73 68 6f 75 6c 64 20 62 65 20 74 75 72 6e 65 64  should be turned
f4b0: 20 6f 66 66 2e 20 20 42 75 74 20 69 74 20 69 73   off.  But it is
f4c0: 20 75 73 65 66 75 6c 0d 0a 2a 2a 20 66 6f 72 20   useful..** for 
f4d0: 74 65 73 74 69 6e 67 2e 0d 0a 2a 2f 0d 0a 23 69  testing...*/..#i
f4e0: 66 6e 64 65 66 20 66 74 73 35 79 79 74 65 73 74  fndef fts5yytest
f4f0: 63 61 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 66  case..# define f
f500: 74 73 35 79 79 74 65 73 74 63 61 73 65 28 58 29  ts5yytestcase(X)
f510: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 0d 0a 2f 2a  ..#endif....../*
f520: 20 4e 65 78 74 20 61 72 65 20 74 68 65 20 74 61   Next are the ta
f530: 62 6c 65 73 20 75 73 65 64 20 74 6f 20 64 65 74  bles used to det
f540: 65 72 6d 69 6e 65 20 77 68 61 74 20 61 63 74 69  ermine what acti
f550: 6f 6e 20 74 6f 20 74 61 6b 65 20 62 61 73 65 64  on to take based
f560: 20 6f 6e 20 74 68 65 0d 0a 2a 2a 20 63 75 72 72   on the..** curr
f570: 65 6e 74 20 73 74 61 74 65 20 61 6e 64 20 6c 6f  ent state and lo
f580: 6f 6b 61 68 65 61 64 20 74 6f 6b 65 6e 2e 20 20  okahead token.  
f590: 54 68 65 73 65 20 74 61 62 6c 65 73 20 61 72 65  These tables are
f5a0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
f5b0: 6e 74 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  nt..** functions
f5c0: 20 74 68 61 74 20 74 61 6b 65 20 61 20 73 74 61   that take a sta
f5d0: 74 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 6c 6f  te number and lo
f5e0: 6f 6b 61 68 65 61 64 20 76 61 6c 75 65 20 61 6e  okahead value an
f5f0: 64 20 72 65 74 75 72 6e 20 61 6e 0d 0a 2a 2a 20  d return an..** 
f600: 61 63 74 69 6f 6e 20 69 6e 74 65 67 65 72 2e 20  action integer. 
f610: 20 0d 0a 2a 2a 0d 0a 2a 2a 20 53 75 70 70 6f 73   ..**..** Suppos
f620: 65 20 74 68 65 20 61 63 74 69 6f 6e 20 69 6e 74  e the action int
f630: 65 67 65 72 20 69 73 20 4e 2e 20 20 54 68 65 6e  eger is N.  Then
f640: 20 74 68 65 20 61 63 74 69 6f 6e 20 69 73 20 64   the action is d
f650: 65 74 65 72 6d 69 6e 65 64 20 61 73 0d 0a 2a 2a  etermined as..**
f660: 20 66 6f 6c 6c 6f 77 73 0d 0a 2a 2a 0d 0a 2a 2a   follows..**..**
f670: 20 20 20 30 20 3c 3d 20 4e 20 3c 3d 20 66 74 73     0 <= N <= fts
f680: 35 59 59 5f 4d 41 58 5f 53 48 49 46 54 20 20 20  5YY_MAX_SHIFT   
f690: 20 20 20 20 20 20 20 20 20 20 53 68 69 66 74 20            Shift 
f6a0: 4e 2e 20 20 54 68 61 74 20 69 73 2c 20 70 75 73  N.  That is, pus
f6b0: 68 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 0d  h the lookahead.
f6c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 20 6f           token o
f6f0: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 61 6e  nto the stack an
f700: 64 20 67 6f 74 6f 20 73 74 61 74 65 20 4e 2e 0d  d goto state N..
f710: 0a 2a 2a 0d 0a 2a 2a 20 20 20 4e 20 62 65 74 77  .**..**   N betw
f720: 65 65 6e 20 66 74 73 35 59 59 5f 4d 49 4e 5f 53  een fts5YY_MIN_S
f730: 48 49 46 54 52 45 44 55 43 45 20 20 20 20 20 20  HIFTREDUCE      
f740: 20 53 68 69 66 74 20 74 6f 20 61 6e 20 61 72 62   Shift to an arb
f750: 69 74 72 61 72 79 20 73 74 61 74 65 20 74 68 65  itrary state the
f760: 6e 0d 0a 2a 2a 20 20 20 20 20 61 6e 64 20 66 74  n..**     and ft
f770: 73 35 59 59 5f 4d 41 58 5f 53 48 49 46 54 52 45  s5YY_MAX_SHIFTRE
f780: 44 55 43 45 20 20 20 20 20 20 20 20 20 20 20 72  DUCE           r
f790: 65 64 75 63 65 20 62 79 20 72 75 6c 65 20 4e 2d  educe by rule N-
f7a0: 66 74 73 35 59 59 5f 4d 49 4e 5f 53 48 49 46 54  fts5YY_MIN_SHIFT
f7b0: 52 45 44 55 43 45 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  REDUCE...**..** 
f7c0: 20 20 4e 20 3d 3d 20 66 74 73 35 59 59 5f 45 52    N == fts5YY_ER
f7d0: 52 4f 52 5f 41 43 54 49 4f 4e 20 20 20 20 20 20  ROR_ACTION      
f7e0: 20 20 20 20 20 20 20 20 20 41 20 73 79 6e 74 61           A synta
f7f0: 78 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  x error has occu
f800: 72 72 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  rred...**..**   
f810: 4e 20 3d 3d 20 66 74 73 35 59 59 5f 41 43 43 45  N == fts5YY_ACCE
f820: 50 54 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 20  PT_ACTION       
f830: 20 20 20 20 20 20 20 54 68 65 20 70 61 72 73 65         The parse
f840: 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e  r accepts its in
f850: 70 75 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 4e  put...**..**   N
f860: 20 3d 3d 20 66 74 73 35 59 59 5f 4e 4f 5f 41 43   == fts5YY_NO_AC
f870: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  TION            
f880: 20 20 20 20 20 20 4e 6f 20 73 75 63 68 20 61 63        No such ac
f890: 74 69 6f 6e 2e 20 20 44 65 6e 6f 74 65 73 20 75  tion.  Denotes u
f8a0: 6e 75 73 65 64 0d 0a 2a 2a 20 20 20 20 20 20 20  nused..**       
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f8d0: 6c 6f 74 73 20 69 6e 20 74 68 65 20 66 74 73 35  lots in the fts5
f8e0: 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c  yy_action[] tabl
f8f0: 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 4e 20 62  e...**..**   N b
f900: 65 74 77 65 65 6e 20 66 74 73 35 59 59 5f 4d 49  etween fts5YY_MI
f910: 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20 20 20  N_REDUCE        
f920: 20 20 20 20 52 65 64 75 63 65 20 62 79 20 72 75      Reduce by ru
f930: 6c 65 20 4e 2d 66 74 73 35 59 59 5f 4d 49 4e 5f  le N-fts5YY_MIN_
f940: 52 45 44 55 43 45 0d 0a 2a 2a 20 20 20 20 20 61  REDUCE..**     a
f950: 6e 64 20 66 74 73 35 59 59 5f 4d 41 58 5f 52 45  nd fts5YY_MAX_RE
f960: 44 55 43 45 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65  DUCE..**..** The
f970: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 69 73   action table is
f980: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 61 73 20   constructed as 
f990: 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 20 74  a single large t
f9a0: 61 62 6c 65 20 6e 61 6d 65 64 20 66 74 73 35 79  able named fts5y
f9b0: 79 5f 61 63 74 69 6f 6e 5b 5d 2e 0d 0a 2a 2a 20  y_action[]...** 
f9c0: 47 69 76 65 6e 20 73 74 61 74 65 20 53 20 61 6e  Given state S an
f9d0: 64 20 6c 6f 6f 6b 61 68 65 61 64 20 58 2c 20 74  d lookahead X, t
f9e0: 68 65 20 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  he action is com
f9f0: 70 75 74 65 64 20 61 73 20 65 69 74 68 65 72 3a  puted as either:
fa00: 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 28 41 29 20  ..**..**    (A) 
fa10: 20 20 4e 20 3d 20 66 74 73 35 79 79 5f 61 63 74    N = fts5yy_act
fa20: 69 6f 6e 5b 20 66 74 73 35 79 79 5f 73 68 69 66  ion[ fts5yy_shif
fa30: 74 5f 6f 66 73 74 5b 53 5d 20 2b 20 58 20 5d 0d  t_ofst[S] + X ].
fa40: 0a 2a 2a 20 20 20 20 28 42 29 20 20 20 4e 20 3d  .**    (B)   N =
fa50: 20 66 74 73 35 79 79 5f 64 65 66 61 75 6c 74 5b   fts5yy_default[
fa60: 53 5d 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 28  S]..**..** The (
fa70: 41 29 20 66 6f 72 6d 75 6c 61 20 69 73 20 70 72  A) formula is pr
fa80: 65 66 65 72 72 65 64 2e 20 20 54 68 65 20 42 20  eferred.  The B 
fa90: 66 6f 72 6d 75 6c 61 20 69 73 20 75 73 65 64 20  formula is used 
faa0: 69 6e 73 74 65 61 64 20 69 66 0d 0a 2a 2a 20 66  instead if..** f
fab0: 74 73 35 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  ts5yy_lookahead[
fac0: 66 74 73 35 79 79 5f 73 68 69 66 74 5f 6f 66 73  fts5yy_shift_ofs
fad0: 74 5b 53 5d 2b 58 5d 20 69 73 20 6e 6f 74 20 65  t[S]+X] is not e
fae0: 71 75 61 6c 20 74 6f 20 58 2e 0d 0a 2a 2a 0d 0a  qual to X...**..
faf0: 2a 2a 20 54 68 65 20 66 6f 72 6d 75 6c 61 73 20  ** The formulas 
fb00: 61 62 6f 76 65 20 61 72 65 20 66 6f 72 20 63 6f  above are for co
fb10: 6d 70 75 74 69 6e 67 20 74 68 65 20 61 63 74 69  mputing the acti
fb20: 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 6f 6f 6b  on when the look
fb30: 61 68 65 61 64 20 69 73 0d 0a 2a 2a 20 61 20 74  ahead is..** a t
fb40: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 2e 20  erminal symbol. 
fb50: 20 49 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   If the lookahea
fb60: 64 20 69 73 20 61 20 6e 6f 6e 2d 74 65 72 6d 69  d is a non-termi
fb70: 6e 61 6c 20 28 61 73 20 6f 63 63 75 72 73 20 61  nal (as occurs a
fb80: 66 74 65 72 0d 0a 2a 2a 20 61 20 72 65 64 75 63  fter..** a reduc
fb90: 65 20 61 63 74 69 6f 6e 29 20 74 68 65 6e 20 74  e action) then t
fba0: 68 65 20 66 74 73 35 79 79 5f 72 65 64 75 63 65  he fts5yy_reduce
fbb0: 5f 6f 66 73 74 5b 5d 20 61 72 72 61 79 20 69 73  _ofst[] array is
fbc0: 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
fbd0: 66 0d 0a 2a 2a 20 74 68 65 20 66 74 73 35 79 79  f..** the fts5yy
fbe0: 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 61 72  _shift_ofst[] ar
fbf0: 72 61 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65  ray...**..** The
fc00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
fc10: 68 65 20 74 61 62 6c 65 73 20 67 65 6e 65 72 61  he tables genera
fc20: 74 65 64 20 69 6e 20 74 68 69 73 20 73 65 63 74  ted in this sect
fc30: 69 6f 6e 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 66 74  ion:..**..**  ft
fc40: 73 35 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20  s5yy_action[]   
fc50: 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61       A single ta
fc60: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
fc70: 6c 6c 20 61 63 74 69 6f 6e 73 2e 0d 0a 2a 2a 20  ll actions...** 
fc80: 20 66 74 73 35 79 79 5f 6c 6f 6f 6b 61 68 65 61   fts5yy_lookahea
fc90: 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20  d[]     A table 
fca0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
fcb0: 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63  ookahead for eac
fcc0: 68 20 65 6e 74 72 79 20 69 6e 0d 0a 2a 2a 20 20  h entry in..**  
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 20 20 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e     fts5yy_action
fcf0: 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65 63  .  Used to detec
fd00: 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  t hash collision
fd10: 73 2e 0d 0a 2a 2a 20 20 66 74 73 35 79 79 5f 73  s...**  fts5yy_s
fd20: 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46  hift_ofst[]    F
fd30: 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20 74  or each state, t
fd40: 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 66  he offset into f
fd50: 74 73 35 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72  ts5yy_action for
fd60: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
fd70: 20 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e           shiftin
fd80: 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0d 0a 2a 2a  g terminals...**
fd90: 20 20 66 74 73 35 79 79 5f 72 65 64 75 63 65 5f    fts5yy_reduce_
fda0: 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63  ofst[]   For eac
fdb0: 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66  h state, the off
fdc0: 73 65 74 20 69 6e 74 6f 20 66 74 73 35 79 79 5f  set into fts5yy_
fdd0: 61 63 74 69 6f 6e 20 66 6f 72 0d 0a 2a 2a 20 20  action for..**  
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d     shifting non-
fe00: 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20  terminals after 
fe10: 61 20 72 65 64 75 63 65 2e 0d 0a 2a 2a 20 20 66  a reduce...**  f
fe20: 74 73 35 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20  ts5yy_default[] 
fe30: 20 20 20 20 20 20 44 65 66 61 75 6c 74 20 61 63        Default ac
fe40: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74  tion for each st
fe50: 61 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a  ate...**..******
fe60: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 70 61 72 73  ***** Begin pars
fe70: 69 6e 67 20 74 61 62 6c 65 73 20 2a 2a 2a 2a 2a  ing tables *****
fe80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 23 64 65 66  *********/..#def
feb0: 69 6e 65 20 66 74 73 35 59 59 5f 41 43 54 54 41  ine fts5YY_ACTTA
fec0: 42 5f 43 4f 55 4e 54 20 28 31 30 35 29 0d 0a 73  B_COUNT (105)..s
fed0: 74 61 74 69 63 20 63 6f 6e 73 74 20 66 74 73 35  tatic const fts5
fee0: 59 59 41 43 54 49 4f 4e 54 59 50 45 20 66 74 73  YYACTIONTYPE fts
fef0: 35 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b  5yy_action[] = {
ff00: 0d 0a 20 2f 2a 20 20 20 20 20 30 20 2a 2f 20 20  .. /*     0 */  
ff10: 20 20 38 31 2c 20 20 20 32 30 2c 20 20 20 39 36    81,   20,   96
ff20: 2c 20 20 20 20 36 2c 20 20 20 32 38 2c 20 20 20  ,    6,   28,   
ff30: 39 39 2c 20 20 20 39 38 2c 20 20 20 32 36 2c 20  99,   98,   26, 
ff40: 20 20 32 36 2c 20 20 20 31 38 2c 0d 0a 20 2f 2a    26,   18,.. /*
ff50: 20 20 20 20 31 30 20 2a 2f 20 20 20 20 39 36 2c      10 */    96,
ff60: 20 20 20 20 36 2c 20 20 20 32 38 2c 20 20 20 31      6,   28,   1
ff70: 37 2c 20 20 20 39 38 2c 20 20 20 35 36 2c 20 20  7,   98,   56,  
ff80: 20 32 36 2c 20 20 20 31 39 2c 20 20 20 39 36 2c   26,   19,   96,
ff90: 20 20 20 20 36 2c 0d 0a 20 2f 2a 20 20 20 20 32      6,.. /*    2
ffa0: 30 20 2a 2f 20 20 20 20 32 38 2c 20 20 20 31 34  0 */    28,   14
ffb0: 2c 20 20 20 39 38 2c 20 20 20 31 34 2c 20 20 20  ,   98,   14,   
ffc0: 32 36 2c 20 20 20 33 31 2c 20 20 20 39 32 2c 20  26,   31,   92, 
ffd0: 20 20 39 36 2c 20 20 20 20 36 2c 20 20 20 32 38    96,    6,   28
ffe0: 2c 0d 0a 20 2f 2a 20 20 20 20 33 30 20 2a 2f 20  ,.. /*    30 */ 
fff0: 20 20 31 30 38 2c 20 20 20 39 38 2c 20 20 20 32    108,   98,   2
10000 35 2c 20 20 20 32 36 2c 20 20 20 32 31 2c 20 20  5,   26,   21,  
10010 20 39 36 2c 20 20 20 20 36 2c 20 20 20 32 38 2c   96,    6,   28,
10020 20 20 20 37 38 2c 20 20 20 39 38 2c 0d 0a 20 2f     78,   98,.. /
10030 2a 20 20 20 20 34 30 20 2a 2f 20 20 20 20 35 38  *    40 */    58
10040 2c 20 20 20 32 36 2c 20 20 20 32 39 2c 20 20 20  ,   26,   29,   
10050 39 36 2c 20 20 20 20 36 2c 20 20 20 32 38 2c 20  96,    6,   28, 
10060 20 31 30 37 2c 20 20 20 39 38 2c 20 20 20 32 32   107,   98,   22
10070 2c 20 20 20 32 36 2c 0d 0a 20 2f 2a 20 20 20 20  ,   26,.. /*    
10080 35 30 20 2a 2f 20 20 20 20 32 34 2c 20 20 20 31  50 */    24,   1
10090 36 2c 20 20 20 31 32 2c 20 20 20 31 31 2c 20 20  6,   12,   11,  
100a0 20 20 31 2c 20 20 20 31 33 2c 20 20 20 31 33 2c    1,   13,   13,
100b0 20 20 20 32 34 2c 20 20 20 31 36 2c 20 20 20 32     24,   16,   2
100c0 33 2c 0d 0a 20 2f 2a 20 20 20 20 36 30 20 2a 2f  3,.. /*    60 */
100d0 20 20 20 20 31 31 2c 20 20 20 33 33 2c 20 20 20      11,   33,   
100e0 33 34 2c 20 20 20 31 33 2c 20 20 20 39 37 2c 20  34,   13,   97, 
100f0 20 20 20 38 2c 20 20 20 32 37 2c 20 20 20 33 32     8,   27,   32
10100 2c 20 20 20 39 38 2c 20 20 20 20 37 2c 0d 0a 20  ,   98,    7,.. 
10110 2f 2a 20 20 20 20 37 30 20 2a 2f 20 20 20 20 32  /*    70 */    2
10120 36 2c 20 20 20 20 33 2c 20 20 20 20 34 2c 20 20  6,    3,    4,  
10130 20 20 35 2c 20 20 20 20 33 2c 20 20 20 20 34 2c    5,    3,    4,
10140 20 20 20 20 35 2c 20 20 20 20 33 2c 20 20 20 38      5,    3,   8
10150 33 2c 20 20 20 20 34 2c 0d 0a 20 2f 2a 20 20 20  3,    4,.. /*   
10160 20 38 30 20 2a 2f 20 20 20 20 20 35 2c 20 20 20   80 */     5,   
10170 20 33 2c 20 20 20 36 33 2c 20 20 20 20 35 2c 20   3,   63,    5, 
10180 20 20 20 33 2c 20 20 20 36 32 2c 20 20 20 31 32     3,   62,   12
10190 2c 20 20 20 20 32 2c 20 20 20 38 36 2c 20 20 20  ,    2,   86,   
101a0 31 33 2c 0d 0a 20 2f 2a 20 20 20 20 39 30 20 2a  13,.. /*    90 *
101b0 2f 20 20 20 20 20 39 2c 20 20 20 33 30 2c 20 20  /     9,   30,  
101c0 20 31 30 2c 20 20 20 31 30 2c 20 20 20 35 34 2c   10,   10,   54,
101d0 20 20 20 35 37 2c 20 20 20 37 35 2c 20 20 20 37     57,   75,   7
101e0 38 2c 20 20 20 37 38 2c 20 20 20 35 33 2c 0d 0a  8,   78,   53,..
101f0 20 2f 2a 20 20 20 31 30 30 20 2a 2f 20 20 20 20   /*   100 */    
10200 35 37 2c 20 20 20 31 35 2c 20 20 20 38 32 2c 20  57,   15,   82, 
10210 20 20 38 32 2c 20 20 20 37 31 2c 0d 0a 7d 3b 0d    82,   71,..};.
10220 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 66 74  .static const ft
10230 73 35 59 59 43 4f 44 45 54 59 50 45 20 66 74 73  s5YYCODETYPE fts
10240 35 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20  5yy_lookahead[] 
10250 3d 20 7b 0d 0a 20 2f 2a 20 20 20 20 20 30 20 2a  = {.. /*     0 *
10260 2f 20 20 20 20 31 36 2c 20 20 20 31 37 2c 20 20  /    16,   17,  
10270 20 31 38 2c 20 20 20 31 39 2c 20 20 20 32 30 2c   18,   19,   20,
10280 20 20 20 32 32 2c 20 20 20 32 32 2c 20 20 20 32     22,   22,   2
10290 34 2c 20 20 20 32 34 2c 20 20 20 31 37 2c 0d 0a  4,   24,   17,..
102a0 20 2f 2a 20 20 20 20 31 30 20 2a 2f 20 20 20 20   /*    10 */    
102b0 31 38 2c 20 20 20 31 39 2c 20 20 20 32 30 2c 20  18,   19,   20, 
102c0 20 20 20 37 2c 20 20 20 32 32 2c 20 20 20 20 39     7,   22,    9
102d0 2c 20 20 20 32 34 2c 20 20 20 31 37 2c 20 20 20  ,   24,   17,   
102e0 31 38 2c 20 20 20 31 39 2c 0d 0a 20 2f 2a 20 20  18,   19,.. /*  
102f0 20 20 32 30 20 2a 2f 20 20 20 20 32 30 2c 20 20    20 */    20,  
10300 20 20 39 2c 20 20 20 32 32 2c 20 20 20 20 39 2c    9,   22,    9,
10310 20 20 20 32 34 2c 20 20 20 31 33 2c 20 20 20 31     24,   13,   1
10320 37 2c 20 20 20 31 38 2c 20 20 20 31 39 2c 20 20  7,   18,   19,  
10330 20 32 30 2c 0d 0a 20 2f 2a 20 20 20 20 33 30 20   20,.. /*    30 
10340 2a 2f 20 20 20 20 32 36 2c 20 20 20 32 32 2c 20  */    26,   22, 
10350 20 20 32 34 2c 20 20 20 32 34 2c 20 20 20 31 37    24,   24,   17
10360 2c 20 20 20 31 38 2c 20 20 20 31 39 2c 20 20 20  ,   18,   19,   
10370 32 30 2c 20 20 20 31 35 2c 20 20 20 32 32 2c 0d  20,   15,   22,.
10380 0a 20 2f 2a 20 20 20 20 34 30 20 2a 2f 20 20 20  . /*    40 */   
10390 20 20 39 2c 20 20 20 32 34 2c 20 20 20 31 37 2c    9,   24,   17,
103a0 20 20 20 31 38 2c 20 20 20 31 39 2c 20 20 20 32     18,   19,   2
103b0 30 2c 20 20 20 32 36 2c 20 20 20 32 32 2c 20 20  0,   26,   22,  
103c0 20 32 31 2c 20 20 20 32 34 2c 0d 0a 20 2f 2a 20   21,   24,.. /* 
103d0 20 20 20 35 30 20 2a 2f 20 20 20 20 20 36 2c 20     50 */     6, 
103e0 20 20 20 37 2c 20 20 20 20 39 2c 20 20 20 20 39     7,    9,    9
103f0 2c 20 20 20 31 30 2c 20 20 20 31 32 2c 20 20 20  ,   10,   12,   
10400 31 32 2c 20 20 20 20 36 2c 20 20 20 20 37 2c 20  12,    6,    7, 
10410 20 20 32 31 2c 0d 0a 20 2f 2a 20 20 20 20 36 30    21,.. /*    60
10420 20 2a 2f 20 20 20 20 20 39 2c 20 20 20 32 34 2c   */     9,   24,
10430 20 20 20 32 35 2c 20 20 20 31 32 2c 20 20 20 31     25,   12,   1
10440 38 2c 20 20 20 20 35 2c 20 20 20 32 30 2c 20 20  8,    5,   20,  
10450 20 31 34 2c 20 20 20 32 32 2c 20 20 20 20 35 2c   14,   22,    5,
10460 0d 0a 20 2f 2a 20 20 20 20 37 30 20 2a 2f 20 20  .. /*    70 */  
10470 20 20 32 34 2c 20 20 20 20 33 2c 20 20 20 20 31    24,    3,    1
10480 2c 20 20 20 20 32 2c 20 20 20 20 33 2c 20 20 20  ,    2,    3,   
10490 20 31 2c 20 20 20 20 32 2c 20 20 20 20 33 2c 20   1,    2,    3, 
104a0 20 20 20 30 2c 20 20 20 20 31 2c 0d 0a 20 2f 2a     0,    1,.. /*
104b0 20 20 20 20 38 30 20 2a 2f 20 20 20 20 20 32 2c      80 */     2,
104c0 20 20 20 20 33 2c 20 20 20 31 31 2c 20 20 20 20      3,   11,    
104d0 32 2c 20 20 20 20 33 2c 20 20 20 31 31 2c 20 20  2,    3,   11,  
104e0 20 20 39 2c 20 20 20 31 30 2c 20 20 20 20 35 2c    9,   10,    5,
104f0 20 20 20 31 32 2c 0d 0a 20 2f 2a 20 20 20 20 39     12,.. /*    9
10500 30 20 2a 2f 20 20 20 20 32 33 2c 20 20 20 32 34  0 */    23,   24
10510 2c 20 20 20 31 30 2c 20 20 20 31 30 2c 20 20 20  ,   10,   10,   
10520 20 38 2c 20 20 20 20 39 2c 20 20 20 20 39 2c 20   8,    9,    9, 
10530 20 20 31 35 2c 20 20 20 31 35 2c 20 20 20 20 38    15,   15,    8
10540 2c 0d 0a 20 2f 2a 20 20 20 31 30 30 20 2a 2f 20  ,.. /*   100 */ 
10550 20 20 20 20 39 2c 20 20 20 20 39 2c 20 20 20 32      9,    9,   2
10560 37 2c 20 20 20 32 37 2c 20 20 20 31 31 2c 20 20  7,   27,   11,  
10570 20 32 37 2c 20 20 20 32 37 2c 20 20 20 32 37 2c   27,   27,   27,
10580 20 20 20 32 37 2c 20 20 20 32 37 2c 0d 0a 20 2f     27,   27,.. /
10590 2a 20 20 20 31 31 30 20 2a 2f 20 20 20 20 32 37  *   110 */    27
105a0 2c 20 20 20 32 37 2c 20 20 20 32 37 2c 20 20 20  ,   27,   27,   
105b0 32 37 2c 20 20 20 32 37 2c 20 20 20 32 37 2c 20  27,   27,   27, 
105c0 20 20 32 37 2c 20 20 20 32 37 2c 20 20 20 32 37    27,   27,   27
105d0 2c 20 20 20 32 37 2c 0d 0a 20 2f 2a 20 20 20 31  ,   27,.. /*   1
105e0 32 30 20 2a 2f 20 20 20 20 32 37 2c 0d 0a 7d 3b  20 */    27,..};
105f0 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59  ..#define fts5YY
10600 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 20 20 20  _SHIFT_COUNT    
10610 28 33 34 29 0d 0a 23 64 65 66 69 6e 65 20 66 74  (34)..#define ft
10620 73 35 59 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20  s5YY_SHIFT_MIN  
10630 20 20 20 20 28 30 29 0d 0a 23 64 65 66 69 6e 65      (0)..#define
10640 20 66 74 73 35 59 59 5f 53 48 49 46 54 5f 4d 41   fts5YY_SHIFT_MA
10650 58 20 20 20 20 20 20 28 39 33 29 0d 0a 73 74 61  X      (93)..sta
10660 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
10670 65 64 20 63 68 61 72 20 66 74 73 35 79 79 5f 73  ed char fts5yy_s
10680 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 0d  hift_ofst[] = {.
10690 0a 20 2f 2a 20 20 20 20 20 30 20 2a 2f 20 20 20  . /*     0 */   
106a0 20 34 34 2c 20 20 20 34 34 2c 20 20 20 34 34 2c   44,   44,   44,
106b0 20 20 20 34 34 2c 20 20 20 34 34 2c 20 20 20 34     44,   44,   4
106c0 34 2c 20 20 20 35 31 2c 20 20 20 37 37 2c 20 20  4,   51,   77,  
106d0 20 34 33 2c 20 20 20 31 32 2c 0d 0a 20 2f 2a 20   43,   12,.. /* 
106e0 20 20 20 31 30 20 2a 2f 20 20 20 20 31 34 2c 20     10 */    14, 
106f0 20 20 38 33 2c 20 20 20 38 32 2c 20 20 20 31 34    83,   82,   14
10700 2c 20 20 20 32 33 2c 20 20 20 32 33 2c 20 20 20  ,   23,   23,   
10710 33 31 2c 20 20 20 33 31 2c 20 20 20 37 31 2c 20  31,   31,   71, 
10720 20 20 37 34 2c 0d 0a 20 2f 2a 20 20 20 20 32 30    74,.. /*    20
10730 20 2a 2f 20 20 20 20 37 38 2c 20 20 20 38 31 2c   */    78,   81,
10740 20 20 20 38 36 2c 20 20 20 39 31 2c 20 20 20 20     86,   91,    
10750 36 2c 20 20 20 35 33 2c 20 20 20 35 33 2c 20 20  6,   53,   53,  
10760 20 36 30 2c 20 20 20 36 34 2c 20 20 20 36 38 2c   60,   64,   68,
10770 0d 0a 20 2f 2a 20 20 20 20 33 30 20 2a 2f 20 20  .. /*    30 */  
10780 20 20 35 33 2c 20 20 20 38 37 2c 20 20 20 39 32    53,   87,   92
10790 2c 20 20 20 35 33 2c 20 20 20 39 33 2c 0d 0a 7d  ,   53,   93,..}
107a0 3b 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59  ;..#define fts5Y
107b0 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54 20 28  Y_REDUCE_COUNT (
107c0 31 37 29 0d 0a 23 64 65 66 69 6e 65 20 66 74 73  17)..#define fts
107d0 35 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20 20  5YY_REDUCE_MIN  
107e0 20 28 2d 31 37 29 0d 0a 23 64 65 66 69 6e 65 20   (-17)..#define 
107f0 66 74 73 35 59 59 5f 52 45 44 55 43 45 5f 4d 41  fts5YY_REDUCE_MA
10800 58 20 20 20 28 36 37 29 0d 0a 73 74 61 74 69 63  X   (67)..static
10810 20 63 6f 6e 73 74 20 73 69 67 6e 65 64 20 63 68   const signed ch
10820 61 72 20 66 74 73 35 79 79 5f 72 65 64 75 63 65  ar fts5yy_reduce
10830 5f 6f 66 73 74 5b 5d 20 3d 20 7b 0d 0a 20 2f 2a  _ofst[] = {.. /*
10840 20 20 20 20 20 30 20 2a 2f 20 20 20 2d 31 36 2c       0 */   -16,
10850 20 20 20 2d 38 2c 20 20 20 20 30 2c 20 20 20 20     -8,    0,    
10860 39 2c 20 20 20 31 37 2c 20 20 20 32 35 2c 20 20  9,   17,   25,  
10870 20 34 36 2c 20 20 2d 31 37 2c 20 20 2d 31 37 2c   46,  -17,  -17,
10880 20 20 20 33 37 2c 0d 0a 20 2f 2a 20 20 20 20 31     37,.. /*    1
10890 30 20 2a 2f 20 20 20 20 36 37 2c 20 20 20 20 34  0 */    67,    4
108a0 2c 20 20 20 20 34 2c 20 20 20 20 38 2c 20 20 20  ,    4,    8,   
108b0 20 34 2c 20 20 20 32 30 2c 20 20 20 32 37 2c 20   4,   20,   27, 
108c0 20 20 33 38 2c 0d 0a 7d 3b 0d 0a 73 74 61 74 69    38,..};..stati
108d0 63 20 63 6f 6e 73 74 20 66 74 73 35 59 59 41 43  c const fts5YYAC
108e0 54 49 4f 4e 54 59 50 45 20 66 74 73 35 79 79 5f  TIONTYPE fts5yy_
108f0 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 0d 0a 20  default[] = {.. 
10900 2f 2a 20 20 20 20 20 30 20 2a 2f 20 20 20 20 38  /*     0 */    8
10910 30 2c 20 20 20 38 30 2c 20 20 20 38 30 2c 20 20  0,   80,   80,  
10920 20 38 30 2c 20 20 20 38 30 2c 20 20 20 38 30 2c   80,   80,   80,
10930 20 20 20 39 35 2c 20 20 20 38 30 2c 20 20 20 38     95,   80,   8
10940 30 2c 20 20 31 30 35 2c 0d 0a 20 2f 2a 20 20 20  0,  105,.. /*   
10950 20 31 30 20 2a 2f 20 20 20 20 38 30 2c 20 20 31   10 */    80,  1
10960 31 30 2c 20 20 31 31 30 2c 20 20 20 38 30 2c 20  10,  110,   80, 
10970 20 31 31 30 2c 20 20 31 31 30 2c 20 20 20 38 30   110,  110,   80
10980 2c 20 20 20 38 30 2c 20 20 20 38 30 2c 20 20 20  ,   80,   80,   
10990 38 30 2c 0d 0a 20 2f 2a 20 20 20 20 32 30 20 2a  80,.. /*    20 *
109a0 2f 20 20 20 20 38 30 2c 20 20 20 39 31 2c 20 20  /    80,   91,  
109b0 20 38 30 2c 20 20 20 38 30 2c 20 20 20 38 30 2c   80,   80,   80,
109c0 20 20 31 30 31 2c 20 20 31 30 30 2c 20 20 20 38    101,  100,   8
109d0 30 2c 20 20 20 38 30 2c 20 20 20 39 30 2c 0d 0a  0,   80,   90,..
109e0 20 2f 2a 20 20 20 20 33 30 20 2a 2f 20 20 20 31   /*    30 */   1
109f0 30 33 2c 20 20 20 38 30 2c 20 20 20 38 30 2c 20  03,   80,   80, 
10a00 20 31 30 34 2c 20 20 20 38 30 2c 0d 0a 7d 3b 0d   104,   80,..};.
10a10 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ./********** End
10a20 20 6f 66 20 6c 65 6d 6f 6e 2d 67 65 6e 65 72 61   of lemon-genera
10a30 74 65 64 20 70 61 72 73 69 6e 67 20 74 61 62 6c  ted parsing tabl
10a40 65 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  es *************
10a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a60 2f 0d 0a 0d 0a 2f 2a 20 54 68 65 20 6e 65 78 74  /..../* The next
10a70 20 74 61 62 6c 65 20 6d 61 70 73 20 74 6f 6b 65   table maps toke
10a80 6e 73 20 28 74 65 72 6d 69 6e 61 6c 20 73 79 6d  ns (terminal sym
10a90 62 6f 6c 73 29 20 69 6e 74 6f 20 66 61 6c 6c 62  bols) into fallb
10aa0 61 63 6b 20 74 6f 6b 65 6e 73 2e 20 20 0d 0a 2a  ack tokens.  ..*
10ab0 2a 20 49 66 20 61 20 63 6f 6e 73 74 72 75 63 74  * If a construct
10ac0 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
10ad0 69 6e 67 3a 0d 0a 2a 2a 20 0d 0a 2a 2a 20 20 20  ing:..** ..**   
10ae0 20 20 20 25 66 61 6c 6c 62 61 63 6b 20 49 44 20     %fallback ID 
10af0 58 20 59 20 5a 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 61  X Y Z...**..** a
10b00 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 67 72  ppears in the gr
10b10 61 6d 6d 61 72 2c 20 74 68 65 6e 20 49 44 20 62  ammar, then ID b
10b20 65 63 6f 6d 65 73 20 61 20 66 61 6c 6c 62 61 63  ecomes a fallbac
10b30 6b 20 74 6f 6b 65 6e 20 66 6f 72 20 58 2c 20 59  k token for X, Y
10b40 2c 0d 0a 2a 2a 20 61 6e 64 20 5a 2e 20 20 57 68  ,..** and Z.  Wh
10b50 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68  enever one of th
10b60 65 20 74 6f 6b 65 6e 73 20 58 2c 20 59 2c 20 6f  e tokens X, Y, o
10b70 72 20 5a 20 69 73 20 69 6e 70 75 74 20 74 6f 20  r Z is input to 
10b80 74 68 65 20 70 61 72 73 65 72 0d 0a 2a 2a 20 62  the parser..** b
10b90 75 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 70  ut it does not p
10ba0 61 72 73 65 2c 20 74 68 65 20 74 79 70 65 20 6f  arse, the type o
10bb0 66 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 63  f the token is c
10bc0 68 61 6e 67 65 64 20 74 6f 20 49 44 20 61 6e 64  hanged to ID and
10bd0 0d 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 20 69  ..** the parse i
10be0 73 20 72 65 74 72 69 65 64 20 62 65 66 6f 72 65  s retried before
10bf0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 74 68 72   an error is thr
10c00 6f 77 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69  own...**..** Thi
10c10 73 20 66 65 61 74 75 72 65 20 63 61 6e 20 62 65  s feature can be
10c20 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70   used, for examp
10c30 6c 65 2c 20 74 6f 20 63 61 75 73 65 20 73 6f 6d  le, to cause som
10c40 65 20 6b 65 79 77 6f 72 64 73 20 69 6e 20 61 20  e keywords in a 
10c50 6c 61 6e 67 75 61 67 65 0d 0a 2a 2a 20 74 6f 20  language..** to 
10c60 72 65 76 65 72 74 20 74 6f 20 69 64 65 6e 74 69  revert to identi
10c70 66 69 65 72 73 20 69 66 20 74 68 65 79 20 6b 65  fiers if they ke
10c80 79 77 6f 72 64 20 64 6f 65 73 20 6e 6f 74 20 61  yword does not a
10c90 70 70 6c 79 20 69 6e 20 74 68 65 20 63 6f 6e 74  pply in the cont
10ca0 65 78 74 20 77 68 65 72 65 0d 0a 2a 2a 20 69 74  ext where..** it
10cb0 20 61 70 70 65 61 72 73 2e 0d 0a 2a 2f 0d 0a 23   appears...*/..#
10cc0 69 66 64 65 66 20 66 74 73 35 59 59 46 41 4c 4c  ifdef fts5YYFALL
10cd0 42 41 43 4b 0d 0a 73 74 61 74 69 63 20 63 6f 6e  BACK..static con
10ce0 73 74 20 66 74 73 35 59 59 43 4f 44 45 54 59 50  st fts5YYCODETYP
10cf0 45 20 66 74 73 35 79 79 46 61 6c 6c 62 61 63 6b  E fts5yyFallback
10d00 5b 5d 20 3d 20 7b 0d 0a 7d 3b 0d 0a 23 65 6e 64  [] = {..};..#end
10d10 69 66 20 2f 2a 20 66 74 73 35 59 59 46 41 4c 4c  if /* fts5YYFALL
10d20 42 41 43 4b 20 2a 2f 0d 0a 0d 0a 2f 2a 20 54 68  BACK */..../* Th
10d30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
10d40 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 73  cture represents
10d50 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
10d60 74 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 70 61 72  t of the..** par
10d70 73 65 72 27 73 20 73 74 61 63 6b 2e 20 20 49 6e  ser's stack.  In
10d80 66 6f 72 6d 61 74 69 6f 6e 20 73 74 6f 72 65 64  formation stored
10d90 20 69 6e 63 6c 75 64 65 73 3a 0d 0a 2a 2a 0d 0a   includes:..**..
10da0 2a 2a 20 20 20 2b 20 20 54 68 65 20 73 74 61 74  **   +  The stat
10db0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
10dc0 20 70 61 72 73 65 72 20 61 74 20 74 68 69 73 20   parser at this 
10dd0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 73 74 61  level of the sta
10de0 63 6b 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2b 20  ck...**..**   + 
10df0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   The value of th
10e00 65 20 74 6f 6b 65 6e 20 73 74 6f 72 65 64 20 61  e token stored a
10e10 74 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20  t this level of 
10e20 74 68 65 20 73 74 61 63 6b 2e 0d 0a 2a 2a 20 20  the stack...**  
10e30 20 20 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f      (In other wo
10e40 72 64 73 2c 20 74 68 65 20 22 6d 61 6a 6f 72 22  rds, the "major"
10e50 20 74 6f 6b 65 6e 2e 29 0d 0a 2a 2a 0d 0a 2a 2a   token.)..**..**
10e60 20 20 20 2b 20 20 54 68 65 20 73 65 6d 61 6e 74     +  The semant
10e70 69 63 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ic value stored 
10e80 61 74 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66  at this level of
10e90 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 69   the stack.  Thi
10ea0 73 20 69 73 0d 0a 2a 2a 20 20 20 20 20 20 74 68  s is..**      th
10eb0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  e information us
10ec0 65 64 20 62 79 20 74 68 65 20 61 63 74 69 6f 6e  ed by the action
10ed0 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 65   routines in the
10ee0 20 67 72 61 6d 6d 61 72 2e 0d 0a 2a 2a 20 20 20   grammar...**   
10ef0 20 20 20 49 74 20 69 73 20 73 6f 6d 65 74 69 6d     It is sometim
10f00 65 73 20 63 61 6c 6c 65 64 20 74 68 65 20 22 6d  es called the "m
10f10 69 6e 6f 72 22 20 74 6f 6b 65 6e 2e 0d 0a 2a 2a  inor" token...**
10f20 0d 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 22  ..** After the "
10f30 73 68 69 66 74 22 20 68 61 6c 66 20 6f 66 20 61  shift" half of a
10f40 20 53 48 49 46 54 52 45 44 55 43 45 20 61 63 74   SHIFTREDUCE act
10f50 69 6f 6e 2c 20 74 68 65 20 73 74 61 74 65 6e 6f  ion, the stateno
10f60 20 66 69 65 6c 64 0d 0a 2a 2a 20 61 63 74 75 61   field..** actua
10f70 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  lly contains the
10f80 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 66   reduce action f
10f90 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 68 61  or the second ha
10fa0 6c 66 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 53 48  lf of the..** SH
10fb0 49 46 54 52 45 44 55 43 45 2e 0d 0a 2a 2f 0d 0a  IFTREDUCE...*/..
10fc0 73 74 72 75 63 74 20 66 74 73 35 79 79 53 74 61  struct fts5yySta
10fd0 63 6b 45 6e 74 72 79 20 7b 0d 0a 20 20 66 74 73  ckEntry {..  fts
10fe0 35 59 59 41 43 54 49 4f 4e 54 59 50 45 20 73 74  5YYACTIONTYPE st
10ff0 61 74 65 6e 6f 3b 20 20 2f 2a 20 54 68 65 20 73  ateno;  /* The s
11000 74 61 74 65 2d 6e 75 6d 62 65 72 2c 20 6f 72 20  tate-number, or 
11010 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 6e  reduce action in
11020 20 53 48 49 46 54 52 45 44 55 43 45 20 2a 2f 0d   SHIFTREDUCE */.
11030 0a 20 20 66 74 73 35 59 59 43 4f 44 45 54 59 50  .  fts5YYCODETYP
11040 45 20 6d 61 6a 6f 72 3b 20 20 20 20 20 20 2f 2a  E major;      /*
11050 20 54 68 65 20 6d 61 6a 6f 72 20 74 6f 6b 65 6e   The major token
11060 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73   value.  This is
11070 20 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20   the code..     
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11090 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
110a0 72 20 74 68 65 20 74 6f 6b 65 6e 20 61 74 20 74  r the token at t
110b0 68 69 73 20 73 74 61 63 6b 20 6c 65 76 65 6c 20  his stack level 
110c0 2a 2f 0d 0a 20 20 66 74 73 35 59 59 4d 49 4e 4f  */..  fts5YYMINO
110d0 52 54 59 50 45 20 6d 69 6e 6f 72 3b 20 20 20 20  RTYPE minor;    
110e0 20 2f 2a 20 54 68 65 20 75 73 65 72 2d 73 75 70   /* The user-sup
110f0 70 6c 69 65 64 20 6d 69 6e 6f 72 20 74 6f 6b 65  plied minor toke
11100 6e 20 76 61 6c 75 65 2e 20 20 54 68 69 73 0d 0a  n value.  This..
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74           ** is t
11130 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11140 74 6f 6b 65 6e 20 20 2a 2f 0d 0a 7d 3b 0d 0a 74  token  */..};..t
11150 79 70 65 64 65 66 20 73 74 72 75 63 74 20 66 74  ypedef struct ft
11160 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79 20 66  s5yyStackEntry f
11170 74 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79 3b  ts5yyStackEntry;
11180 0d 0a 0d 0a 2f 2a 20 54 68 65 20 73 74 61 74 65  ..../* The state
11190 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 69   of the parser i
111a0 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 6e  s completely con
111b0 74 61 69 6e 65 64 20 69 6e 20 61 6e 20 69 6e 73  tained in an ins
111c0 74 61 6e 63 65 20 6f 66 0d 0a 2a 2a 20 74 68 65  tance of..** the
111d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
111e0 74 75 72 65 20 2a 2f 0d 0a 73 74 72 75 63 74 20  ture */..struct 
111f0 66 74 73 35 79 79 50 61 72 73 65 72 20 7b 0d 0a  fts5yyParser {..
11200 20 20 66 74 73 35 79 79 53 74 61 63 6b 45 6e 74    fts5yyStackEnt
11210 72 79 20 2a 66 74 73 35 79 79 74 6f 73 3b 20 20  ry *fts5yytos;  
11220 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
11230 65 72 20 74 6f 20 74 6f 70 20 65 6c 65 6d 65 6e  er to top elemen
11240 74 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 2a  t of the stack *
11250 2f 0d 0a 23 69 66 64 65 66 20 66 74 73 35 59 59  /..#ifdef fts5YY
11260 54 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50  TRACKMAXSTACKDEP
11270 54 48 0d 0a 20 20 69 6e 74 20 66 74 73 35 79 79  TH..  int fts5yy
11280 68 77 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  hwm;            
11290 20 20 20 20 20 20 20 20 2f 2a 20 48 69 67 68 2d          /* High-
112a0 77 61 74 65 72 20 6d 61 72 6b 20 6f 66 20 74 68  water mark of th
112b0 65 20 73 74 61 63 6b 20 2a 2f 0d 0a 23 65 6e 64  e stack */..#end
112c0 69 66 0d 0a 23 69 66 6e 64 65 66 20 66 74 73 35  if..#ifndef fts5
112d0 59 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52  YYNOERRORRECOVER
112e0 59 0d 0a 20 20 69 6e 74 20 66 74 73 35 79 79 65  Y..  int fts5yye
112f0 72 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rrcnt;          
11300 20 20 20 20 20 20 20 2f 2a 20 53 68 69 66 74 73         /* Shifts
11310 20 6c 65 66 74 20 62 65 66 6f 72 65 20 6f 75 74   left before out
11320 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 2a 2f   of the error */
11330 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 73 71 6c 69  ..#endif..  sqli
11340 74 65 33 46 74 73 35 50 61 72 73 65 72 41 52 47  te3Fts5ParserARG
11350 5f 53 44 45 43 4c 20 20 20 20 20 20 20 20 20 20  _SDECL          
11360 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65        /* A place
11370 20 74 6f 20 68 6f 6c 64 20 25 65 78 74 72 61 5f   to hold %extra_
11380 61 72 67 75 6d 65 6e 74 20 2a 2f 0d 0a 20 20 73  argument */..  s
11390 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
113a0 43 54 58 5f 53 44 45 43 4c 20 20 20 20 20 20 20  CTX_SDECL       
113b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
113c0 61 63 65 20 74 6f 20 68 6f 6c 64 20 25 65 78 74  ace to hold %ext
113d0 72 61 5f 63 6f 6e 74 65 78 74 20 2a 2f 0d 0a 23  ra_context */..#
113e0 69 66 20 66 74 73 35 59 59 53 54 41 43 4b 44 45  if fts5YYSTACKDE
113f0 50 54 48 3c 3d 30 0d 0a 20 20 69 6e 74 20 66 74  PTH<=0..  int ft
11400 73 35 79 79 73 74 6b 73 7a 3b 20 20 20 20 20 20  s5yystksz;      
11410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11420 75 72 72 65 6e 74 20 73 69 64 65 20 6f 66 20 74  urrent side of t
11430 68 65 20 73 74 61 63 6b 20 2a 2f 0d 0a 20 20 66  he stack */..  f
11440 74 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79 20  ts5yyStackEntry 
11450 2a 66 74 73 35 79 79 73 74 61 63 6b 3b 20 20 20  *fts5yystack;   
11460 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
11470 65 72 27 73 20 73 74 61 63 6b 20 2a 2f 0d 0a 20  er's stack */.. 
11480 20 66 74 73 35 79 79 53 74 61 63 6b 45 6e 74 72   fts5yyStackEntr
11490 79 20 66 74 73 35 79 79 73 74 6b 30 3b 20 20 20  y fts5yystk0;   
114a0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
114b0 73 74 61 63 6b 20 65 6e 74 72 79 20 2a 2f 0d 0a  stack entry */..
114c0 23 65 6c 73 65 0d 0a 20 20 66 74 73 35 79 79 53  #else..  fts5yyS
114d0 74 61 63 6b 45 6e 74 72 79 20 66 74 73 35 79 79  tackEntry fts5yy
114e0 73 74 61 63 6b 5b 66 74 73 35 59 59 53 54 41 43  stack[fts5YYSTAC
114f0 4b 44 45 50 54 48 5d 3b 20 20 2f 2a 20 54 68 65  KDEPTH];  /* The
11500 20 70 61 72 73 65 72 27 73 20 73 74 61 63 6b 20   parser's stack 
11510 2a 2f 0d 0a 20 20 66 74 73 35 79 79 53 74 61 63  */..  fts5yyStac
11520 6b 45 6e 74 72 79 20 2a 66 74 73 35 79 79 73 74  kEntry *fts5yyst
11530 61 63 6b 45 6e 64 3b 20 20 20 20 20 20 20 20 20  ackEnd;         
11540 20 20 20 2f 2a 20 4c 61 73 74 20 65 6e 74 72 79     /* Last entry
11550 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 2a 2f   in the stack */
11560 0d 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 74 79  ..#endif..};..ty
11570 70 65 64 65 66 20 73 74 72 75 63 74 20 66 74 73  pedef struct fts
11580 35 79 79 50 61 72 73 65 72 20 66 74 73 35 79 79  5yyParser fts5yy
11590 50 61 72 73 65 72 3b 0d 0a 0d 0a 23 69 66 6e 64  Parser;....#ifnd
115a0 65 66 20 4e 44 45 42 55 47 0d 0a 23 69 6e 63 6c  ef NDEBUG..#incl
115b0 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0d 0a 73  ude <stdio.h>..s
115c0 74 61 74 69 63 20 46 49 4c 45 20 2a 66 74 73 35  tatic FILE *fts5
115d0 79 79 54 72 61 63 65 46 49 4c 45 20 3d 20 30 3b  yyTraceFILE = 0;
115e0 0d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66  ..static char *f
115f0 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74  ts5yyTracePrompt
11600 20 3d 20 30 3b 0d 0a 23 65 6e 64 69 66 20 2f 2a   = 0;..#endif /*
11610 20 4e 44 45 42 55 47 20 2a 2f 0d 0a 0d 0a 23 69   NDEBUG */....#i
11620 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 2f 2a  fndef NDEBUG../*
11630 20 0d 0a 2a 2a 20 54 75 72 6e 20 70 61 72 73 65   ..** Turn parse
11640 72 20 74 72 61 63 69 6e 67 20 6f 6e 20 62 79 20  r tracing on by 
11650 67 69 76 69 6e 67 20 61 20 73 74 72 65 61 6d 20  giving a stream 
11660 74 6f 20 77 68 69 63 68 20 74 6f 20 77 72 69 74  to which to writ
11670 65 20 74 68 65 20 74 72 61 63 65 0d 0a 2a 2a 20  e the trace..** 
11680 61 6e 64 20 61 20 70 72 6f 6d 70 74 20 74 6f 20  and a prompt to 
11690 70 72 65 66 61 63 65 20 65 61 63 68 20 74 72 61  preface each tra
116a0 63 65 20 6d 65 73 73 61 67 65 2e 20 20 54 72 61  ce message.  Tra
116b0 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  cing is turned o
116c0 66 66 0d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  ff..** by making
116d0 20 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74   either argument
116e0 20 4e 55 4c 4c 20 0d 0a 2a 2a 0d 0a 2a 2a 20 49   NULL ..**..** I
116f0 6e 70 75 74 73 3a 0d 0a 2a 2a 20 3c 75 6c 3e 0d  nputs:..** <ul>.
11700 0a 2a 2a 20 3c 6c 69 3e 20 41 20 46 49 4c 45 2a  .** <li> A FILE*
11710 20 74 6f 20 77 68 69 63 68 20 74 72 61 63 65 20   to which trace 
11720 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 20 62 65  output should be
11730 20 77 72 69 74 74 65 6e 2e 0d 0a 2a 2a 20 20 20   written...**   
11740 20 20 20 49 66 20 4e 55 4c 4c 2c 20 74 68 65 6e     If NULL, then
11750 20 74 72 61 63 69 6e 67 20 69 73 20 74 75 72 6e   tracing is turn
11760 65 64 20 6f 66 66 2e 0d 0a 2a 2a 20 3c 6c 69 3e  ed off...** <li>
11770 20 41 20 70 72 65 66 69 78 20 73 74 72 69 6e 67   A prefix string
11780 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 65 20   written at the 
11790 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65  beginning of eve
117a0 72 79 0d 0a 2a 2a 20 20 20 20 20 20 6c 69 6e 65  ry..**      line
117b0 20 6f 66 20 74 72 61 63 65 20 6f 75 74 70 75 74   of trace output
117c0 2e 20 20 49 66 20 4e 55 4c 4c 2c 20 74 68 65 6e  .  If NULL, then
117d0 20 74 72 61 63 69 6e 67 20 69 73 0d 0a 2a 2a 20   tracing is..** 
117e0 20 20 20 20 20 74 75 72 6e 65 64 20 6f 66 66 2e       turned off.
117f0 0d 0a 2a 2a 20 3c 2f 75 6c 3e 0d 0a 2a 2a 0d 0a  ..** </ul>..**..
11800 2a 2a 20 4f 75 74 70 75 74 73 3a 0d 0a 2a 2a 20  ** Outputs:..** 
11810 4e 6f 6e 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  None...*/..stati
11820 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
11830 73 35 50 61 72 73 65 72 54 72 61 63 65 28 46 49  s5ParserTrace(FI
11840 4c 45 20 2a 54 72 61 63 65 46 49 4c 45 2c 20 63  LE *TraceFILE, c
11850 68 61 72 20 2a 7a 54 72 61 63 65 50 72 6f 6d 70  har *zTracePromp
11860 74 29 7b 0d 0a 20 20 66 74 73 35 79 79 54 72 61  t){..  fts5yyTra
11870 63 65 46 49 4c 45 20 3d 20 54 72 61 63 65 46 49  ceFILE = TraceFI
11880 4c 45 3b 0d 0a 20 20 66 74 73 35 79 79 54 72 61  LE;..  fts5yyTra
11890 63 65 50 72 6f 6d 70 74 20 3d 20 7a 54 72 61 63  cePrompt = zTrac
118a0 65 50 72 6f 6d 70 74 3b 0d 0a 20 20 69 66 28 20  ePrompt;..  if( 
118b0 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 3d  fts5yyTraceFILE=
118c0 3d 30 20 29 20 66 74 73 35 79 79 54 72 61 63 65  =0 ) fts5yyTrace
118d0 50 72 6f 6d 70 74 20 3d 20 30 3b 0d 0a 20 20 65  Prompt = 0;..  e
118e0 6c 73 65 20 69 66 28 20 66 74 73 35 79 79 54 72  lse if( fts5yyTr
118f0 61 63 65 50 72 6f 6d 70 74 3d 3d 30 20 29 20 66  acePrompt==0 ) f
11900 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 20 3d  ts5yyTraceFILE =
11910 20 30 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f   0;..}..#endif /
11920 2a 20 4e 44 45 42 55 47 20 2a 2f 0d 0a 0d 0a 23  * NDEBUG */....#
11930 69 66 20 64 65 66 69 6e 65 64 28 66 74 73 35 59  if defined(fts5Y
11940 59 43 4f 56 45 52 41 47 45 29 20 7c 7c 20 21 64  YCOVERAGE) || !d
11950 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0d 0a  efined(NDEBUG)..
11960 2f 2a 20 46 6f 72 20 74 72 61 63 69 6e 67 20 73  /* For tracing s
11970 68 69 66 74 73 2c 20 74 68 65 20 6e 61 6d 65 73  hifts, the names
11980 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c   of all terminal
11990 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  s and nontermina
119a0 6c 73 0d 0a 2a 2a 20 61 72 65 20 72 65 71 75 69  ls..** are requi
119b0 72 65 64 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  red.  The follow
119c0 69 6e 67 20 74 61 62 6c 65 20 73 75 70 70 6c 69  ing table suppli
119d0 65 73 20 74 68 65 73 65 20 6e 61 6d 65 73 20 2a  es these names *
119e0 2f 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
119f0 63 68 61 72 20 2a 63 6f 6e 73 74 20 66 74 73 35  char *const fts5
11a00 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 5d 20 3d 20  yyTokenName[] = 
11a10 7b 20 0d 0a 20 20 2f 2a 20 20 20 20 30 20 2a 2f  { ..  /*    0 */
11a20 20 22 24 22 2c 0d 0a 20 20 2f 2a 20 20 20 20 31   "$",..  /*    1
11a30 20 2a 2f 20 22 4f 52 22 2c 0d 0a 20 20 2f 2a 20   */ "OR",..  /* 
11a40 20 20 20 32 20 2a 2f 20 22 41 4e 44 22 2c 0d 0a     2 */ "AND",..
11a50 20 20 2f 2a 20 20 20 20 33 20 2a 2f 20 22 4e 4f    /*    3 */ "NO
11a60 54 22 2c 0d 0a 20 20 2f 2a 20 20 20 20 34 20 2a  T",..  /*    4 *
11a70 2f 20 22 54 45 52 4d 22 2c 0d 0a 20 20 2f 2a 20  / "TERM",..  /* 
11a80 20 20 20 35 20 2a 2f 20 22 43 4f 4c 4f 4e 22 2c     5 */ "COLON",
11a90 0d 0a 20 20 2f 2a 20 20 20 20 36 20 2a 2f 20 22  ..  /*    6 */ "
11aa0 4d 49 4e 55 53 22 2c 0d 0a 20 20 2f 2a 20 20 20  MINUS",..  /*   
11ab0 20 37 20 2a 2f 20 22 4c 43 50 22 2c 0d 0a 20 20   7 */ "LCP",..  
11ac0 2f 2a 20 20 20 20 38 20 2a 2f 20 22 52 43 50 22  /*    8 */ "RCP"
11ad0 2c 0d 0a 20 20 2f 2a 20 20 20 20 39 20 2a 2f 20  ,..  /*    9 */ 
11ae0 22 53 54 52 49 4e 47 22 2c 0d 0a 20 20 2f 2a 20  "STRING",..  /* 
11af0 20 20 31 30 20 2a 2f 20 22 4c 50 22 2c 0d 0a 20    10 */ "LP",.. 
11b00 20 2f 2a 20 20 20 31 31 20 2a 2f 20 22 52 50 22   /*   11 */ "RP"
11b10 2c 0d 0a 20 20 2f 2a 20 20 20 31 32 20 2a 2f 20  ,..  /*   12 */ 
11b20 22 43 41 52 45 54 22 2c 0d 0a 20 20 2f 2a 20 20  "CARET",..  /*  
11b30 20 31 33 20 2a 2f 20 22 43 4f 4d 4d 41 22 2c 0d   13 */ "COMMA",.
11b40 0a 20 20 2f 2a 20 20 20 31 34 20 2a 2f 20 22 50  .  /*   14 */ "P
11b50 4c 55 53 22 2c 0d 0a 20 20 2f 2a 20 20 20 31 35  LUS",..  /*   15
11b60 20 2a 2f 20 22 53 54 41 52 22 2c 0d 0a 20 20 2f   */ "STAR",..  /
11b70 2a 20 20 20 31 36 20 2a 2f 20 22 69 6e 70 75 74  *   16 */ "input
11b80 22 2c 0d 0a 20 20 2f 2a 20 20 20 31 37 20 2a 2f  ",..  /*   17 */
11b90 20 22 65 78 70 72 22 2c 0d 0a 20 20 2f 2a 20 20   "expr",..  /*  
11ba0 20 31 38 20 2a 2f 20 22 63 6e 65 61 72 73 65 74   18 */ "cnearset
11bb0 22 2c 0d 0a 20 20 2f 2a 20 20 20 31 39 20 2a 2f  ",..  /*   19 */
11bc0 20 22 65 78 70 72 6c 69 73 74 22 2c 0d 0a 20 20   "exprlist",..  
11bd0 2f 2a 20 20 20 32 30 20 2a 2f 20 22 63 6f 6c 73  /*   20 */ "cols
11be0 65 74 22 2c 0d 0a 20 20 2f 2a 20 20 20 32 31 20  et",..  /*   21 
11bf0 2a 2f 20 22 63 6f 6c 73 65 74 6c 69 73 74 22 2c  */ "colsetlist",
11c00 0d 0a 20 20 2f 2a 20 20 20 32 32 20 2a 2f 20 22  ..  /*   22 */ "
11c10 6e 65 61 72 73 65 74 22 2c 0d 0a 20 20 2f 2a 20  nearset",..  /* 
11c20 20 20 32 33 20 2a 2f 20 22 6e 65 61 72 70 68 72    23 */ "nearphr
11c30 61 73 65 73 22 2c 0d 0a 20 20 2f 2a 20 20 20 32  ases",..  /*   2
11c40 34 20 2a 2f 20 22 70 68 72 61 73 65 22 2c 0d 0a  4 */ "phrase",..
11c50 20 20 2f 2a 20 20 20 32 35 20 2a 2f 20 22 6e 65    /*   25 */ "ne
11c60 61 72 64 69 73 74 5f 6f 70 74 22 2c 0d 0a 20 20  ardist_opt",..  
11c70 2f 2a 20 20 20 32 36 20 2a 2f 20 22 73 74 61 72  /*   26 */ "star
11c80 5f 6f 70 74 22 2c 0d 0a 7d 3b 0d 0a 23 65 6e 64  _opt",..};..#end
11c90 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 66 74  if /* defined(ft
11ca0 73 35 59 59 43 4f 56 45 52 41 47 45 29 20 7c 7c  s5YYCOVERAGE) ||
11cb0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
11cc0 29 20 2a 2f 0d 0a 0d 0a 23 69 66 6e 64 65 66 20  ) */....#ifndef 
11cd0 4e 44 45 42 55 47 0d 0a 2f 2a 20 46 6f 72 20 74  NDEBUG../* For t
11ce0 72 61 63 69 6e 67 20 72 65 64 75 63 65 20 61 63  racing reduce ac
11cf0 74 69 6f 6e 73 2c 20 74 68 65 20 6e 61 6d 65 73  tions, the names
11d00 20 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20 61 72   of all rules ar
11d10 65 20 72 65 71 75 69 72 65 64 2e 0d 0a 2a 2f 0d  e required...*/.
11d20 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
11d30 61 72 20 2a 63 6f 6e 73 74 20 66 74 73 35 79 79  ar *const fts5yy
11d40 52 75 6c 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0d 0a  RuleName[] = {..
11d50 20 2f 2a 20 20 20 30 20 2a 2f 20 22 69 6e 70 75   /*   0 */ "inpu
11d60 74 20 3a 3a 3d 20 65 78 70 72 22 2c 0d 0a 20 2f  t ::= expr",.. /
11d70 2a 20 20 20 31 20 2a 2f 20 22 63 6f 6c 73 65 74  *   1 */ "colset
11d80 20 3a 3a 3d 20 4d 49 4e 55 53 20 4c 43 50 20 63   ::= MINUS LCP c
11d90 6f 6c 73 65 74 6c 69 73 74 20 52 43 50 22 2c 0d  olsetlist RCP",.
11da0 0a 20 2f 2a 20 20 20 32 20 2a 2f 20 22 63 6f 6c  . /*   2 */ "col
11db0 73 65 74 20 3a 3a 3d 20 4c 43 50 20 63 6f 6c 73  set ::= LCP cols
11dc0 65 74 6c 69 73 74 20 52 43 50 22 2c 0d 0a 20 2f  etlist RCP",.. /
11dd0 2a 20 20 20 33 20 2a 2f 20 22 63 6f 6c 73 65 74  *   3 */ "colset
11de0 20 3a 3a 3d 20 53 54 52 49 4e 47 22 2c 0d 0a 20   ::= STRING",.. 
11df0 2f 2a 20 20 20 34 20 2a 2f 20 22 63 6f 6c 73 65  /*   4 */ "colse
11e00 74 20 3a 3a 3d 20 4d 49 4e 55 53 20 53 54 52 49  t ::= MINUS STRI
11e10 4e 47 22 2c 0d 0a 20 2f 2a 20 20 20 35 20 2a 2f  NG",.. /*   5 */
11e20 20 22 63 6f 6c 73 65 74 6c 69 73 74 20 3a 3a 3d   "colsetlist ::=
11e30 20 63 6f 6c 73 65 74 6c 69 73 74 20 53 54 52 49   colsetlist STRI
11e40 4e 47 22 2c 0d 0a 20 2f 2a 20 20 20 36 20 2a 2f  NG",.. /*   6 */
11e50 20 22 63 6f 6c 73 65 74 6c 69 73 74 20 3a 3a 3d   "colsetlist ::=
11e60 20 53 54 52 49 4e 47 22 2c 0d 0a 20 2f 2a 20 20   STRING",.. /*  
11e70 20 37 20 2a 2f 20 22 65 78 70 72 20 3a 3a 3d 20   7 */ "expr ::= 
11e80 65 78 70 72 20 41 4e 44 20 65 78 70 72 22 2c 0d  expr AND expr",.
11e90 0a 20 2f 2a 20 20 20 38 20 2a 2f 20 22 65 78 70  . /*   8 */ "exp
11ea0 72 20 3a 3a 3d 20 65 78 70 72 20 4f 52 20 65 78  r ::= expr OR ex
11eb0 70 72 22 2c 0d 0a 20 2f 2a 20 20 20 39 20 2a 2f  pr",.. /*   9 */
11ec0 20 22 65 78 70 72 20 3a 3a 3d 20 65 78 70 72 20   "expr ::= expr 
11ed0 4e 4f 54 20 65 78 70 72 22 2c 0d 0a 20 2f 2a 20  NOT expr",.. /* 
11ee0 20 31 30 20 2a 2f 20 22 65 78 70 72 20 3a 3a 3d   10 */ "expr ::=
11ef0 20 63 6f 6c 73 65 74 20 43 4f 4c 4f 4e 20 4c 50   colset COLON LP
11f00 20 65 78 70 72 20 52 50 22 2c 0d 0a 20 2f 2a 20   expr RP",.. /* 
11f10 20 31 31 20 2a 2f 20 22 65 78 70 72 20 3a 3a 3d   11 */ "expr ::=
11f20 20 4c 50 20 65 78 70 72 20 52 50 22 2c 0d 0a 20   LP expr RP",.. 
11f30 2f 2a 20 20 31 32 20 2a 2f 20 22 65 78 70 72 20  /*  12 */ "expr 
11f40 3a 3a 3d 20 65 78 70 72 6c 69 73 74 22 2c 0d 0a  ::= exprlist",..
11f50 20 2f 2a 20 20 31 33 20 2a 2f 20 22 65 78 70 72   /*  13 */ "expr
11f60 6c 69 73 74 20 3a 3a 3d 20 63 6e 65 61 72 73 65  list ::= cnearse
11f70 74 22 2c 0d 0a 20 2f 2a 20 20 31 34 20 2a 2f 20  t",.. /*  14 */ 
11f80 22 65 78 70 72 6c 69 73 74 20 3a 3a 3d 20 65 78  "exprlist ::= ex
11f90 70 72 6c 69 73 74 20 63 6e 65 61 72 73 65 74 22  prlist cnearset"
11fa0 2c 0d 0a 20 2f 2a 20 20 31 35 20 2a 2f 20 22 63  ,.. /*  15 */ "c
11fb0 6e 65 61 72 73 65 74 20 3a 3a 3d 20 6e 65 61 72  nearset ::= near
11fc0 73 65 74 22 2c 0d 0a 20 2f 2a 20 20 31 36 20 2a  set",.. /*  16 *
11fd0 2f 20 22 63 6e 65 61 72 73 65 74 20 3a 3a 3d 20  / "cnearset ::= 
11fe0 63 6f 6c 73 65 74 20 43 4f 4c 4f 4e 20 6e 65 61  colset COLON nea
11ff0 72 73 65 74 22 2c 0d 0a 20 2f 2a 20 20 31 37 20  rset",.. /*  17 
12000 2a 2f 20 22 6e 65 61 72 73 65 74 20 3a 3a 3d 20  */ "nearset ::= 
12010 70 68 72 61 73 65 22 2c 0d 0a 20 2f 2a 20 20 31  phrase",.. /*  1
12020 38 20 2a 2f 20 22 6e 65 61 72 73 65 74 20 3a 3a  8 */ "nearset ::
12030 3d 20 43 41 52 45 54 20 70 68 72 61 73 65 22 2c  = CARET phrase",
12040 0d 0a 20 2f 2a 20 20 31 39 20 2a 2f 20 22 6e 65  .. /*  19 */ "ne
12050 61 72 73 65 74 20 3a 3a 3d 20 53 54 52 49 4e 47  arset ::= STRING
12060 20 4c 50 20 6e 65 61 72 70 68 72 61 73 65 73 20   LP nearphrases 
12070 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 52 50 22  neardist_opt RP"
12080 2c 0d 0a 20 2f 2a 20 20 32 30 20 2a 2f 20 22 6e  ,.. /*  20 */ "n
12090 65 61 72 70 68 72 61 73 65 73 20 3a 3a 3d 20 70  earphrases ::= p
120a0 68 72 61 73 65 22 2c 0d 0a 20 2f 2a 20 20 32 31  hrase",.. /*  21
120b0 20 2a 2f 20 22 6e 65 61 72 70 68 72 61 73 65 73   */ "nearphrases
120c0 20 3a 3a 3d 20 6e 65 61 72 70 68 72 61 73 65 73   ::= nearphrases
120d0 20 70 68 72 61 73 65 22 2c 0d 0a 20 2f 2a 20 20   phrase",.. /*  
120e0 32 32 20 2a 2f 20 22 6e 65 61 72 64 69 73 74 5f  22 */ "neardist_
120f0 6f 70 74 20 3a 3a 3d 22 2c 0d 0a 20 2f 2a 20 20  opt ::=",.. /*  
12100 32 33 20 2a 2f 20 22 6e 65 61 72 64 69 73 74 5f  23 */ "neardist_
12110 6f 70 74 20 3a 3a 3d 20 43 4f 4d 4d 41 20 53 54  opt ::= COMMA ST
12120 52 49 4e 47 22 2c 0d 0a 20 2f 2a 20 20 32 34 20  RING",.. /*  24 
12130 2a 2f 20 22 70 68 72 61 73 65 20 3a 3a 3d 20 70  */ "phrase ::= p
12140 68 72 61 73 65 20 50 4c 55 53 20 53 54 52 49 4e  hrase PLUS STRIN
12150 47 20 73 74 61 72 5f 6f 70 74 22 2c 0d 0a 20 2f  G star_opt",.. /
12160 2a 20 20 32 35 20 2a 2f 20 22 70 68 72 61 73 65  *  25 */ "phrase
12170 20 3a 3a 3d 20 53 54 52 49 4e 47 20 73 74 61 72   ::= STRING star
12180 5f 6f 70 74 22 2c 0d 0a 20 2f 2a 20 20 32 36 20  _opt",.. /*  26 
12190 2a 2f 20 22 73 74 61 72 5f 6f 70 74 20 3a 3a 3d  */ "star_opt ::=
121a0 20 53 54 41 52 22 2c 0d 0a 20 2f 2a 20 20 32 37   STAR",.. /*  27
121b0 20 2a 2f 20 22 73 74 61 72 5f 6f 70 74 20 3a 3a   */ "star_opt ::
121c0 3d 22 2c 0d 0a 7d 3b 0d 0a 23 65 6e 64 69 66 20  =",..};..#endif 
121d0 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0d 0a 0d 0a  /* NDEBUG */....
121e0 0d 0a 23 69 66 20 66 74 73 35 59 59 53 54 41 43  ..#if fts5YYSTAC
121f0 4b 44 45 50 54 48 3c 3d 30 0d 0a 2f 2a 0d 0a 2a  KDEPTH<=0../*..*
12200 2a 20 54 72 79 20 74 6f 20 69 6e 63 72 65 61 73  * Try to increas
12210 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
12220 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 2e 20  e parser stack. 
12230 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12240 65 72 0d 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  er..** of errors
12250 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73  .  Return 0 on s
12260 75 63 63 65 73 73 2e 0d 0a 2a 2f 0d 0a 73 74 61  uccess...*/..sta
12270 74 69 63 20 69 6e 74 20 66 74 73 35 79 79 47 72  tic int fts5yyGr
12280 6f 77 53 74 61 63 6b 28 66 74 73 35 79 79 50 61  owStack(fts5yyPa
12290 72 73 65 72 20 2a 70 29 7b 0d 0a 20 20 69 6e 74  rser *p){..  int
122a0 20 6e 65 77 53 69 7a 65 3b 0d 0a 20 20 69 6e 74   newSize;..  int
122b0 20 69 64 78 3b 0d 0a 20 20 66 74 73 35 79 79 53   idx;..  fts5yyS
122c0 74 61 63 6b 45 6e 74 72 79 20 2a 70 4e 65 77 3b  tackEntry *pNew;
122d0 0d 0a 0d 0a 20 20 6e 65 77 53 69 7a 65 20 3d 20  ....  newSize = 
122e0 70 2d 3e 66 74 73 35 79 79 73 74 6b 73 7a 2a 32  p->fts5yystksz*2
122f0 20 2b 20 31 30 30 3b 0d 0a 20 20 69 64 78 20 3d   + 100;..  idx =
12300 20 70 2d 3e 66 74 73 35 79 79 74 6f 73 20 3f 20   p->fts5yytos ? 
12310 28 69 6e 74 29 28 70 2d 3e 66 74 73 35 79 79 74  (int)(p->fts5yyt
12320 6f 73 20 2d 20 70 2d 3e 66 74 73 35 79 79 73 74  os - p->fts5yyst
12330 61 63 6b 29 20 3a 20 30 3b 0d 0a 20 20 69 66 28  ack) : 0;..  if(
12340 20 70 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 3d   p->fts5yystack=
12350 3d 26 70 2d 3e 66 74 73 35 79 79 73 74 6b 30 20  =&p->fts5yystk0 
12360 29 7b 0d 0a 20 20 20 20 70 4e 65 77 20 3d 20 6d  ){..    pNew = m
12370 61 6c 6c 6f 63 28 6e 65 77 53 69 7a 65 2a 73 69  alloc(newSize*si
12380 7a 65 6f 66 28 70 4e 65 77 5b 30 5d 29 29 3b 0d  zeof(pNew[0]));.
12390 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 20  .    if( pNew ) 
123a0 70 4e 65 77 5b 30 5d 20 3d 20 70 2d 3e 66 74 73  pNew[0] = p->fts
123b0 35 79 79 73 74 6b 30 3b 0d 0a 20 20 7d 65 6c 73  5yystk0;..  }els
123c0 65 7b 0d 0a 20 20 20 20 70 4e 65 77 20 3d 20 72  e{..    pNew = r
123d0 65 61 6c 6c 6f 63 28 70 2d 3e 66 74 73 35 79 79  ealloc(p->fts5yy
123e0 73 74 61 63 6b 2c 20 6e 65 77 53 69 7a 65 2a 73  stack, newSize*s
123f0 69 7a 65 6f 66 28 70 4e 65 77 5b 30 5d 29 29 3b  izeof(pNew[0]));
12400 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 70 4e 65  ..  }..  if( pNe
12410 77 20 29 7b 0d 0a 20 20 20 20 70 2d 3e 66 74 73  w ){..    p->fts
12420 35 79 79 73 74 61 63 6b 20 3d 20 70 4e 65 77 3b  5yystack = pNew;
12430 0d 0a 20 20 20 20 70 2d 3e 66 74 73 35 79 79 74  ..    p->fts5yyt
12440 6f 73 20 3d 20 26 70 2d 3e 66 74 73 35 79 79 73  os = &p->fts5yys
12450 74 61 63 6b 5b 69 64 78 5d 3b 0d 0a 23 69 66 6e  tack[idx];..#ifn
12460 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 20 20  def NDEBUG..    
12470 69 66 28 20 66 74 73 35 79 79 54 72 61 63 65 46  if( fts5yyTraceF
12480 49 4c 45 20 29 7b 0d 0a 20 20 20 20 20 20 66 70  ILE ){..      fp
12490 72 69 6e 74 66 28 66 74 73 35 79 79 54 72 61 63  rintf(fts5yyTrac
124a0 65 46 49 4c 45 2c 22 25 73 53 74 61 63 6b 20 67  eFILE,"%sStack g
124b0 72 6f 77 73 20 66 72 6f 6d 20 25 64 20 74 6f 20  rows from %d to 
124c0 25 64 20 65 6e 74 72 69 65 73 2e 5c 6e 22 2c 0d  %d entries.\n",.
124d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
124e0 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74  ts5yyTracePrompt
124f0 2c 20 70 2d 3e 66 74 73 35 79 79 73 74 6b 73 7a  , p->fts5yystksz
12500 2c 20 6e 65 77 53 69 7a 65 29 3b 0d 0a 20 20 20  , newSize);..   
12510 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20   }..#endif..    
12520 70 2d 3e 66 74 73 35 79 79 73 74 6b 73 7a 20 3d  p->fts5yystksz =
12530 20 6e 65 77 53 69 7a 65 3b 0d 0a 20 20 7d 0d 0a   newSize;..  }..
12540 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3d 3d 30    return pNew==0
12550 3b 20 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d  ; ..}..#endif...
12560 0a 2f 2a 20 44 61 74 61 74 79 70 65 20 6f 66 20  ./* Datatype of 
12570 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
12580 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
12590 61 74 65 64 20 70 61 73 73 65 64 20 61 73 20 74  ated passed as t
125a0 68 65 0d 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72  he..** second ar
125b0 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65  gument to sqlite
125c0 33 46 74 73 35 50 61 72 73 65 72 41 6c 6c 6f 63  3Fts5ParserAlloc
125d0 28 29 20 62 65 6c 6f 77 2e 20 20 54 68 69 73 20  () below.  This 
125e0 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 62  can be changed b
125f0 79 0d 0a 2a 2a 20 70 75 74 74 69 6e 67 20 61 6e  y..** putting an
12600 20 61 70 70 72 6f 70 72 69 61 74 65 20 23 64 65   appropriate #de
12610 66 69 6e 65 20 69 6e 20 74 68 65 20 25 69 6e 63  fine in the %inc
12620 6c 75 64 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  lude section of 
12630 74 68 65 20 69 6e 70 75 74 0d 0a 2a 2a 20 67 72  the input..** gr
12640 61 6d 6d 61 72 2e 0d 0a 2a 2f 0d 0a 23 69 66 6e  ammar...*/..#ifn
12650 64 65 66 20 66 74 73 35 59 59 4d 41 4c 4c 4f 43  def fts5YYMALLOC
12660 41 52 47 54 59 50 45 0d 0a 23 20 64 65 66 69 6e  ARGTYPE..# defin
12670 65 20 66 74 73 35 59 59 4d 41 4c 4c 4f 43 41 52  e fts5YYMALLOCAR
12680 47 54 59 50 45 20 73 69 7a 65 5f 74 0d 0a 23 65  GTYPE size_t..#e
12690 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 49 6e 69 74 69  ndif..../* Initi
126a0 61 6c 69 7a 65 20 61 20 6e 65 77 20 70 61 72 73  alize a new pars
126b0 65 72 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  er that has alre
126c0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
126d0 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ed...*/..static 
126e0 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
126f0 50 61 72 73 65 72 49 6e 69 74 28 76 6f 69 64 20  ParserInit(void 
12700 2a 66 74 73 35 79 79 70 52 61 77 50 61 72 73 65  *fts5yypRawParse
12710 72 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  r sqlite3Fts5Par
12720 73 65 72 43 54 58 5f 50 44 45 43 4c 29 7b 0d 0a  serCTX_PDECL){..
12730 20 20 66 74 73 35 79 79 50 61 72 73 65 72 20 2a    fts5yyParser *
12740 66 74 73 35 79 79 70 50 61 72 73 65 72 20 3d 20  fts5yypParser = 
12750 28 66 74 73 35 79 79 50 61 72 73 65 72 2a 29 66  (fts5yyParser*)f
12760 74 73 35 79 79 70 52 61 77 50 61 72 73 65 72 3b  ts5yypRawParser;
12770 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
12780 61 72 73 65 72 43 54 58 5f 53 54 4f 52 45 0d 0a  arserCTX_STORE..
12790 23 69 66 64 65 66 20 66 74 73 35 59 59 54 52 41  #ifdef fts5YYTRA
127a0 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0d  CKMAXSTACKDEPTH.
127b0 0a 20 20 66 74 73 35 79 79 70 50 61 72 73 65 72  .  fts5yypParser
127c0 2d 3e 66 74 73 35 79 79 68 77 6d 20 3d 20 30 3b  ->fts5yyhwm = 0;
127d0 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20 66 74  ..#endif..#if ft
127e0 73 35 59 59 53 54 41 43 4b 44 45 50 54 48 3c 3d  s5YYSTACKDEPTH<=
127f0 30 0d 0a 20 20 66 74 73 35 79 79 70 50 61 72 73  0..  fts5yypPars
12800 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 20 3d 20  er->fts5yytos = 
12810 4e 55 4c 4c 3b 0d 0a 20 20 66 74 73 35 79 79 70  NULL;..  fts5yyp
12820 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74  Parser->fts5yyst
12830 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20 66  ack = NULL;..  f
12840 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
12850 73 35 79 79 73 74 6b 73 7a 20 3d 20 30 3b 0d 0a  s5yystksz = 0;..
12860 20 20 69 66 28 20 66 74 73 35 79 79 47 72 6f 77    if( fts5yyGrow
12870 53 74 61 63 6b 28 66 74 73 35 79 79 70 50 61 72  Stack(fts5yypPar
12880 73 65 72 29 20 29 7b 0d 0a 20 20 20 20 66 74 73  ser) ){..    fts
12890 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
128a0 79 79 73 74 61 63 6b 20 3d 20 26 66 74 73 35 79  yystack = &fts5y
128b0 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
128c0 73 74 6b 30 3b 0d 0a 20 20 20 20 66 74 73 35 79  stk0;..    fts5y
128d0 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
128e0 73 74 6b 73 7a 20 3d 20 31 3b 0d 0a 20 20 7d 0d  stksz = 1;..  }.
128f0 0a 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
12900 20 66 74 73 35 59 59 4e 4f 45 52 52 4f 52 52 45   fts5YYNOERRORRE
12910 43 4f 56 45 52 59 0d 0a 20 20 66 74 73 35 79 79  COVERY..  fts5yy
12920 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 65  pParser->fts5yye
12930 72 72 63 6e 74 20 3d 20 2d 31 3b 0d 0a 23 65 6e  rrcnt = -1;..#en
12940 64 69 66 0d 0a 20 20 66 74 73 35 79 79 70 50 61  dif..  fts5yypPa
12950 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 20  rser->fts5yytos 
12960 3d 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  = fts5yypParser-
12970 3e 66 74 73 35 79 79 73 74 61 63 6b 3b 0d 0a 20  >fts5yystack;.. 
12980 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
12990 66 74 73 35 79 79 73 74 61 63 6b 5b 30 5d 2e 73  fts5yystack[0].s
129a0 74 61 74 65 6e 6f 20 3d 20 30 3b 0d 0a 20 20 66  tateno = 0;..  f
129b0 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
129c0 73 35 79 79 73 74 61 63 6b 5b 30 5d 2e 6d 61 6a  s5yystack[0].maj
129d0 6f 72 20 3d 20 30 3b 0d 0a 23 69 66 20 66 74 73  or = 0;..#if fts
129e0 35 59 59 53 54 41 43 4b 44 45 50 54 48 3e 30 0d  5YYSTACKDEPTH>0.
129f0 0a 20 20 66 74 73 35 79 79 70 50 61 72 73 65 72  .  fts5yypParser
12a00 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 45 6e 64  ->fts5yystackEnd
12a10 20 3d 20 26 66 74 73 35 79 79 70 50 61 72 73 65   = &fts5yypParse
12a20 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 5b 66  r->fts5yystack[f
12a30 74 73 35 59 59 53 54 41 43 4b 44 45 50 54 48 2d  ts5YYSTACKDEPTH-
12a40 31 5d 3b 0d 0a 23 65 6e 64 69 66 0d 0a 7d 0d 0a  1];..#endif..}..
12a50 0d 0a 23 69 66 6e 64 65 66 20 73 71 6c 69 74 65  ..#ifndef sqlite
12a60 33 46 74 73 35 50 61 72 73 65 72 5f 45 4e 47 49  3Fts5Parser_ENGI
12a70 4e 45 41 4c 57 41 59 53 4f 4e 53 54 41 43 4b 0d  NEALWAYSONSTACK.
12a80 0a 2f 2a 20 0d 0a 2a 2a 20 54 68 69 73 20 66 75  ./* ..** This fu
12a90 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
12aa0 20 61 20 6e 65 77 20 70 61 72 73 65 72 2e 0d 0a   a new parser...
12ab0 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 61 72 67 75  ** The only argu
12ac0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12ad0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
12ae0 77 68 69 63 68 20 77 6f 72 6b 73 20 6c 69 6b 65  which works like
12af0 0d 0a 2a 2a 20 6d 61 6c 6c 6f 63 2e 0d 0a 2a 2a  ..** malloc...**
12b00 0d 0a 2a 2a 20 49 6e 70 75 74 73 3a 0d 0a 2a 2a  ..** Inputs:..**
12b10 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
12b20 65 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20  e function used 
12b30 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
12b40 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 75 74 70  ry...**..** Outp
12b50 75 74 73 3a 0d 0a 2a 2a 20 41 20 70 6f 69 6e 74  uts:..** A point
12b60 65 72 20 74 6f 20 61 20 70 61 72 73 65 72 2e 20  er to a parser. 
12b70 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
12b80 20 75 73 65 64 20 69 6e 20 73 75 62 73 65 71 75   used in subsequ
12b90 65 6e 74 20 63 61 6c 6c 73 0d 0a 2a 2a 20 74 6f  ent calls..** to
12ba0 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
12bb0 65 72 20 61 6e 64 20 73 71 6c 69 74 65 33 46 74  er and sqlite3Ft
12bc0 73 35 50 61 72 73 65 72 46 72 65 65 2e 0d 0a 2a  s5ParserFree...*
12bd0 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  /..static void *
12be0 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
12bf0 72 41 6c 6c 6f 63 28 76 6f 69 64 20 2a 28 2a 6d  rAlloc(void *(*m
12c00 61 6c 6c 6f 63 50 72 6f 63 29 28 66 74 73 35 59  allocProc)(fts5Y
12c10 59 4d 41 4c 4c 4f 43 41 52 47 54 59 50 45 29 20  YMALLOCARGTYPE) 
12c20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
12c30 72 43 54 58 5f 50 44 45 43 4c 29 7b 0d 0a 20 20  rCTX_PDECL){..  
12c40 66 74 73 35 79 79 50 61 72 73 65 72 20 2a 66 74  fts5yyParser *ft
12c50 73 35 79 79 70 50 61 72 73 65 72 3b 0d 0a 20 20  s5yypParser;..  
12c60 66 74 73 35 79 79 70 50 61 72 73 65 72 20 3d 20  fts5yypParser = 
12c70 28 66 74 73 35 79 79 50 61 72 73 65 72 2a 29 28  (fts5yyParser*)(
12c80 2a 6d 61 6c 6c 6f 63 50 72 6f 63 29 28 20 28 66  *mallocProc)( (f
12c90 74 73 35 59 59 4d 41 4c 4c 4f 43 41 52 47 54 59  ts5YYMALLOCARGTY
12ca0 50 45 29 73 69 7a 65 6f 66 28 66 74 73 35 79 79  PE)sizeof(fts5yy
12cb0 50 61 72 73 65 72 29 20 29 3b 0d 0a 20 20 69 66  Parser) );..  if
12cc0 28 20 66 74 73 35 79 79 70 50 61 72 73 65 72 20  ( fts5yypParser 
12cd0 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46  ){..    sqlite3F
12ce0 74 73 35 50 61 72 73 65 72 43 54 58 5f 53 54 4f  ts5ParserCTX_STO
12cf0 52 45 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46  RE..    sqlite3F
12d00 74 73 35 50 61 72 73 65 72 49 6e 69 74 28 66 74  ts5ParserInit(ft
12d10 73 35 79 79 70 50 61 72 73 65 72 20 73 71 6c 69  s5yypParser sqli
12d20 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54 58  te3Fts5ParserCTX
12d30 5f 50 41 52 41 4d 29 3b 0d 0a 20 20 7d 0d 0a 20  _PARAM);..  }.. 
12d40 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 66   return (void*)f
12d50 74 73 35 79 79 70 50 61 72 73 65 72 3b 0d 0a 7d  ts5yypParser;..}
12d60 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 73 71 6c 69  ..#endif /* sqli
12d70 74 65 33 46 74 73 35 50 61 72 73 65 72 5f 45 4e  te3Fts5Parser_EN
12d80 47 49 4e 45 41 4c 57 41 59 53 4f 4e 53 54 41 43  GINEALWAYSONSTAC
12d90 4b 20 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a 20 54 68 65  K */....../* The
12da0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
12db0 69 6f 6e 20 64 65 6c 65 74 65 73 20 74 68 65 20  ion deletes the 
12dc0 22 6d 69 6e 6f 72 20 74 79 70 65 22 20 6f 72 20  "minor type" or 
12dd0 73 65 6d 61 6e 74 69 63 20 76 61 6c 75 65 0d 0a  semantic value..
12de0 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
12df0 74 68 20 61 20 73 79 6d 62 6f 6c 2e 20 20 54 68  th a symbol.  Th
12e00 65 20 73 79 6d 62 6f 6c 20 63 61 6e 20 62 65 20  e symbol can be 
12e10 65 69 74 68 65 72 20 61 20 74 65 72 6d 69 6e 61  either a termina
12e20 6c 0d 0a 2a 2a 20 6f 72 20 6e 6f 6e 74 65 72 6d  l..** or nonterm
12e30 69 6e 61 6c 2e 20 22 66 74 73 35 79 79 6d 61 6a  inal. "fts5yymaj
12e40 6f 72 22 20 69 73 20 74 68 65 20 73 79 6d 62 6f  or" is the symbo
12e50 6c 20 63 6f 64 65 2c 20 61 6e 64 20 22 66 74 73  l code, and "fts
12e60 35 79 79 70 6d 69 6e 6f 72 22 20 69 73 0d 0a 2a  5yypminor" is..*
12e70 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
12e80 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 64  he value to be d
12e90 65 6c 65 74 65 64 2e 20 20 54 68 65 20 63 6f 64  eleted.  The cod
12ea0 65 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65  e used to do the
12eb0 20 0d 0a 2a 2a 20 64 65 6c 65 74 69 6f 6e 73 20   ..** deletions 
12ec0 69 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20  is derived from 
12ed0 74 68 65 20 25 64 65 73 74 72 75 63 74 6f 72 20  the %destructor 
12ee0 61 6e 64 2f 6f 72 20 25 74 6f 6b 65 6e 5f 64 65  and/or %token_de
12ef0 73 74 72 75 63 74 6f 72 0d 0a 2a 2a 20 64 69 72  structor..** dir
12f00 65 63 74 69 76 65 73 20 6f 66 20 74 68 65 20 69  ectives of the i
12f10 6e 70 75 74 20 67 72 61 6d 6d 61 72 2e 0d 0a 2a  nput grammar...*
12f20 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  /..static void f
12f30 74 73 35 79 79 5f 64 65 73 74 72 75 63 74 6f 72  ts5yy_destructor
12f40 28 0d 0a 20 20 66 74 73 35 79 79 50 61 72 73 65  (..  fts5yyParse
12f50 72 20 2a 66 74 73 35 79 79 70 50 61 72 73 65 72  r *fts5yypParser
12f60 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  ,    /* The pars
12f70 65 72 20 2a 2f 0d 0a 20 20 66 74 73 35 59 59 43  er */..  fts5YYC
12f80 4f 44 45 54 59 50 45 20 66 74 73 35 79 79 6d 61  ODETYPE fts5yyma
12f90 6a 6f 72 2c 20 20 20 20 20 2f 2a 20 54 79 70 65  jor,     /* Type
12fa0 20 63 6f 64 65 20 66 6f 72 20 6f 62 6a 65 63 74   code for object
12fb0 20 74 6f 20 64 65 73 74 72 6f 79 20 2a 2f 0d 0a   to destroy */..
12fc0 20 20 66 74 73 35 59 59 4d 49 4e 4f 52 54 59 50    fts5YYMINORTYP
12fd0 45 20 2a 66 74 73 35 79 79 70 6d 69 6e 6f 72 20  E *fts5yypminor 
12fe0 20 20 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20    /* The object 
12ff0 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
13000 2a 2f 0d 0a 29 7b 0d 0a 20 20 73 71 6c 69 74 65  */..){..  sqlite
13010 33 46 74 73 35 50 61 72 73 65 72 41 52 47 5f 46  3Fts5ParserARG_F
13020 45 54 43 48 0d 0a 20 20 73 71 6c 69 74 65 33 46  ETCH..  sqlite3F
13030 74 73 35 50 61 72 73 65 72 43 54 58 5f 46 45 54  ts5ParserCTX_FET
13040 43 48 0d 0a 20 20 73 77 69 74 63 68 28 20 66 74  CH..  switch( ft
13050 73 35 79 79 6d 61 6a 6f 72 20 29 7b 0d 0a 20 20  s5yymajor ){..  
13060 20 20 2f 2a 20 48 65 72 65 20 69 73 20 69 6e 73    /* Here is ins
13070 65 72 74 65 64 20 74 68 65 20 61 63 74 69 6f 6e  erted the action
13080 73 20 77 68 69 63 68 20 74 61 6b 65 20 70 6c 61  s which take pla
13090 63 65 20 77 68 65 6e 20 61 0d 0a 20 20 20 20 2a  ce when a..    *
130a0 2a 20 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f  * terminal or no
130b0 6e 2d 74 65 72 6d 69 6e 61 6c 20 69 73 20 64 65  n-terminal is de
130c0 73 74 72 6f 79 65 64 2e 20 20 54 68 69 73 20 63  stroyed.  This c
130d0 61 6e 20 68 61 70 70 65 6e 0d 0a 20 20 20 20 2a  an happen..    *
130e0 2a 20 77 68 65 6e 20 74 68 65 20 73 79 6d 62 6f  * when the symbo
130f0 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d  l is popped from
13100 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
13110 67 20 61 0d 0a 20 20 20 20 2a 2a 20 72 65 64 75  g a..    ** redu
13120 63 65 20 6f 72 20 64 75 72 69 6e 67 20 65 72 72  ce or during err
13130 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 72  or processing or
13140 20 77 68 65 6e 20 61 20 70 61 72 73 65 72 20 69   when a parser i
13150 73 20 0d 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67  s ..    ** being
13160 20 64 65 73 74 72 6f 79 65 64 20 62 65 66 6f 72   destroyed befor
13170 65 20 69 74 20 69 73 20 66 69 6e 69 73 68 65 64  e it is finished
13180 20 70 61 72 73 69 6e 67 2e 0d 0a 20 20 20 20 2a   parsing...    *
13190 2a 0d 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  *..    ** Note: 
131a0 64 75 72 69 6e 67 20 61 20 72 65 64 75 63 65 2c  during a reduce,
131b0 20 74 68 65 20 6f 6e 6c 79 20 73 79 6d 62 6f 6c   the only symbol
131c0 73 20 64 65 73 74 72 6f 79 65 64 20 61 72 65 20  s destroyed are 
131d0 74 68 6f 73 65 0d 0a 20 20 20 20 2a 2a 20 77 68  those..    ** wh
131e0 69 63 68 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ich appear on th
131f0 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c  e RHS of the rul
13200 65 2c 20 62 75 74 20 77 68 69 63 68 20 61 72 65  e, but which are
13210 20 2a 6e 6f 74 2a 20 75 73 65 64 0d 0a 20 20 20   *not* used..   
13220 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 43   ** inside the C
13230 20 63 6f 64 65 2e 0d 0a 20 20 20 20 2a 2f 0d 0a   code...    */..
13240 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  /********* Begin
13250 20 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69   destructor defi
13260 6e 69 74 69 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a  nitions ********
13270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
13290 0d 0a 20 20 20 20 63 61 73 65 20 31 36 3a 20 2f  ..    case 16: /
132a0 2a 20 69 6e 70 75 74 20 2a 2f 0d 0a 7b 0d 0a 23  * input */..{..#
132b0 6c 69 6e 65 20 38 33 20 22 66 74 73 35 70 61 72  line 83 "fts5par
132c0 73 65 2e 79 22 0d 0a 20 28 76 6f 69 64 29 70 50  se.y".. (void)pP
132d0 61 72 73 65 3b 20 0d 0a 23 6c 69 6e 65 20 35 37  arse; ..#line 57
132e0 30 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  0 "fts5parse.c".
132f0 0a 7d 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  .}..      break;
13300 0d 0a 20 20 20 20 63 61 73 65 20 31 37 3a 20 2f  ..    case 17: /
13310 2a 20 65 78 70 72 20 2a 2f 0d 0a 20 20 20 20 63  * expr */..    c
13320 61 73 65 20 31 38 3a 20 2f 2a 20 63 6e 65 61 72  ase 18: /* cnear
13330 73 65 74 20 2a 2f 0d 0a 20 20 20 20 63 61 73 65  set */..    case
13340 20 31 39 3a 20 2f 2a 20 65 78 70 72 6c 69 73 74   19: /* exprlist
13350 20 2a 2f 0d 0a 7b 0d 0a 23 6c 69 6e 65 20 38 39   */..{..#line 89
13360 20 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a   "fts5parse.y"..
13370 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
13380 65 4e 6f 64 65 46 72 65 65 28 28 66 74 73 35 79  eNodeFree((fts5y
13390 79 70 6d 69 6e 6f 72 2d 3e 66 74 73 35 79 79 32  ypminor->fts5yy2
133a0 34 29 29 3b 20 0d 0a 23 6c 69 6e 65 20 35 37 39  4)); ..#line 579
133b0 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a   "fts5parse.c"..
133c0 7d 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  }..      break;.
133d0 0a 20 20 20 20 63 61 73 65 20 32 30 3a 20 2f 2a  .    case 20: /*
133e0 20 63 6f 6c 73 65 74 20 2a 2f 0d 0a 20 20 20 20   colset */..    
133f0 63 61 73 65 20 32 31 3a 20 2f 2a 20 63 6f 6c 73  case 21: /* cols
13400 65 74 6c 69 73 74 20 2a 2f 0d 0a 7b 0d 0a 23 6c  etlist */..{..#l
13410 69 6e 65 20 39 33 20 22 66 74 73 35 70 61 72 73  ine 93 "fts5pars
13420 65 2e 79 22 0d 0a 20 73 71 6c 69 74 65 33 5f 66  e.y".. sqlite3_f
13430 72 65 65 28 28 66 74 73 35 79 79 70 6d 69 6e 6f  ree((fts5yypmino
13440 72 2d 3e 66 74 73 35 79 79 31 31 29 29 3b 20 0d  r->fts5yy11)); .
13450 0a 23 6c 69 6e 65 20 35 38 37 20 22 66 74 73 35  .#line 587 "fts5
13460 70 61 72 73 65 2e 63 22 0d 0a 7d 0d 0a 20 20 20  parse.c"..}..   
13470 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63     break;..    c
13480 61 73 65 20 32 32 3a 20 2f 2a 20 6e 65 61 72 73  ase 22: /* nears
13490 65 74 20 2a 2f 0d 0a 20 20 20 20 63 61 73 65 20  et */..    case 
134a0 32 33 3a 20 2f 2a 20 6e 65 61 72 70 68 72 61 73  23: /* nearphras
134b0 65 73 20 2a 2f 0d 0a 7b 0d 0a 23 6c 69 6e 65 20  es */..{..#line 
134c0 31 34 38 20 22 66 74 73 35 70 61 72 73 65 2e 79  148 "fts5parse.y
134d0 22 0d 0a 20 73 71 6c 69 74 65 33 46 74 73 35 50  ".. sqlite3Fts5P
134e0 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65 28  arseNearsetFree(
134f0 28 66 74 73 35 79 79 70 6d 69 6e 6f 72 2d 3e 66  (fts5yypminor->f
13500 74 73 35 79 79 34 36 29 29 3b 20 0d 0a 23 6c 69  ts5yy46)); ..#li
13510 6e 65 20 35 39 35 20 22 66 74 73 35 70 61 72 73  ne 595 "fts5pars
13520 65 2e 63 22 0d 0a 7d 0d 0a 20 20 20 20 20 20 62  e.c"..}..      b
13530 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
13540 32 34 3a 20 2f 2a 20 70 68 72 61 73 65 20 2a 2f  24: /* phrase */
13550 0d 0a 7b 0d 0a 23 6c 69 6e 65 20 31 38 33 20 22  ..{..#line 183 "
13560 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 20 73  fts5parse.y".. s
13570 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 50  qlite3Fts5ParseP
13580 68 72 61 73 65 46 72 65 65 28 28 66 74 73 35 79  hraseFree((fts5y
13590 79 70 6d 69 6e 6f 72 2d 3e 66 74 73 35 79 79 35  ypminor->fts5yy5
135a0 33 29 29 3b 20 0d 0a 23 6c 69 6e 65 20 36 30 32  3)); ..#line 602
135b0 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a   "fts5parse.c"..
135c0 7d 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  }..      break;.
135d0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  ./********* End 
135e0 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69 6e  destructor defin
135f0 69 74 69 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  itions *********
13600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13620 2f 0d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  /..    default: 
13630 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 49 66 20   break;   /* If 
13640 6e 6f 20 64 65 73 74 72 75 63 74 6f 72 20 61 63  no destructor ac
13650 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 3a 20  tion specified: 
13660 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0d 0a 20  do nothing */.. 
13670 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20   }..}..../*..** 
13680 50 6f 70 20 74 68 65 20 70 61 72 73 65 72 27 73  Pop the parser's
13690 20 73 74 61 63 6b 20 6f 6e 63 65 2e 0d 0a 2a 2a   stack once...**
136a0 0d 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  ..** If there is
136b0 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 72 6f   a destructor ro
136c0 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 64  utine associated
136d0 20 77 69 74 68 20 74 68 65 20 74 6f 6b 65 6e 20   with the token 
136e0 77 68 69 63 68 0d 0a 2a 2a 20 69 73 20 70 6f 70  which..** is pop
136f0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
13700 63 6b 2c 20 74 68 65 6e 20 63 61 6c 6c 20 69 74  ck, then call it
13710 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f  ...*/..static vo
13720 69 64 20 66 74 73 35 79 79 5f 70 6f 70 5f 70 61  id fts5yy_pop_pa
13730 72 73 65 72 5f 73 74 61 63 6b 28 66 74 73 35 79  rser_stack(fts5y
13740 79 50 61 72 73 65 72 20 2a 70 50 61 72 73 65 72  yParser *pParser
13750 29 7b 0d 0a 20 20 66 74 73 35 79 79 53 74 61 63  ){..  fts5yyStac
13760 6b 45 6e 74 72 79 20 2a 66 74 73 35 79 79 74 6f  kEntry *fts5yyto
13770 73 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50  s;..  assert( pP
13780 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73  arser->fts5yytos
13790 21 3d 30 20 29 3b 0d 0a 20 20 61 73 73 65 72 74  !=0 );..  assert
137a0 28 20 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  ( pParser->fts5y
137b0 79 74 6f 73 20 3e 20 70 50 61 72 73 65 72 2d 3e  ytos > pParser->
137c0 66 74 73 35 79 79 73 74 61 63 6b 20 29 3b 0d 0a  fts5yystack );..
137d0 20 20 66 74 73 35 79 79 74 6f 73 20 3d 20 70 50    fts5yytos = pP
137e0 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73  arser->fts5yytos
137f0 2d 2d 3b 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45  --;..#ifndef NDE
13800 42 55 47 0d 0a 20 20 69 66 28 20 66 74 73 35 79  BUG..  if( fts5y
13810 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20  yTraceFILE ){.. 
13820 20 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79     fprintf(fts5y
13830 79 54 72 61 63 65 46 49 4c 45 2c 22 25 73 50 6f  yTraceFILE,"%sPo
13840 70 70 69 6e 67 20 25 73 5c 6e 22 2c 0d 0a 20 20  pping %s\n",..  
13850 20 20 20 20 66 74 73 35 79 79 54 72 61 63 65 50      fts5yyTraceP
13860 72 6f 6d 70 74 2c 0d 0a 20 20 20 20 20 20 66 74  rompt,..      ft
13870 73 35 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 66 74  s5yyTokenName[ft
13880 73 35 79 79 74 6f 73 2d 3e 6d 61 6a 6f 72 5d 29  s5yytos->major])
13890 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a  ;..  }..#endif..
138a0 20 20 66 74 73 35 79 79 5f 64 65 73 74 72 75 63    fts5yy_destruc
138b0 74 6f 72 28 70 50 61 72 73 65 72 2c 20 66 74 73  tor(pParser, fts
138c0 35 79 79 74 6f 73 2d 3e 6d 61 6a 6f 72 2c 20 26  5yytos->major, &
138d0 66 74 73 35 79 79 74 6f 73 2d 3e 6d 69 6e 6f 72  fts5yytos->minor
138e0 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  );..}..../*..** 
138f0 43 6c 65 61 72 20 61 6c 6c 20 73 65 63 6f 6e 64  Clear all second
13900 61 72 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ary memory alloc
13910 61 74 69 6f 6e 73 20 66 72 6f 6d 20 74 68 65 20  ations from the 
13920 70 61 72 73 65 72 0d 0a 2a 2f 0d 0a 73 74 61 74  parser..*/..stat
13930 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
13940 74 73 35 50 61 72 73 65 72 46 69 6e 61 6c 69 7a  ts5ParserFinaliz
13950 65 28 76 6f 69 64 20 2a 70 29 7b 0d 0a 20 20 66  e(void *p){..  f
13960 74 73 35 79 79 50 61 72 73 65 72 20 2a 70 50 61  ts5yyParser *pPa
13970 72 73 65 72 20 3d 20 28 66 74 73 35 79 79 50 61  rser = (fts5yyPa
13980 72 73 65 72 2a 29 70 3b 0d 0a 20 20 77 68 69 6c  rser*)p;..  whil
13990 65 28 20 70 50 61 72 73 65 72 2d 3e 66 74 73 35  e( pParser->fts5
139a0 79 79 74 6f 73 3e 70 50 61 72 73 65 72 2d 3e 66  yytos>pParser->f
139b0 74 73 35 79 79 73 74 61 63 6b 20 29 20 66 74 73  ts5yystack ) fts
139c0 35 79 79 5f 70 6f 70 5f 70 61 72 73 65 72 5f 73  5yy_pop_parser_s
139d0 74 61 63 6b 28 70 50 61 72 73 65 72 29 3b 0d 0a  tack(pParser);..
139e0 23 69 66 20 66 74 73 35 59 59 53 54 41 43 4b 44  #if fts5YYSTACKD
139f0 45 50 54 48 3c 3d 30 0d 0a 20 20 69 66 28 20 70  EPTH<=0..  if( p
13a00 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74  Parser->fts5yyst
13a10 61 63 6b 21 3d 26 70 50 61 72 73 65 72 2d 3e 66  ack!=&pParser->f
13a20 74 73 35 79 79 73 74 6b 30 20 29 20 66 72 65 65  ts5yystk0 ) free
13a30 28 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  (pParser->fts5yy
13a40 73 74 61 63 6b 29 3b 0d 0a 23 65 6e 64 69 66 0d  stack);..#endif.
13a50 0a 7d 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 73 71  .}....#ifndef sq
13a60 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 5f  lite3Fts5Parser_
13a70 45 4e 47 49 4e 45 41 4c 57 41 59 53 4f 4e 53 54  ENGINEALWAYSONST
13a80 41 43 4b 0d 0a 2f 2a 20 0d 0a 2a 2a 20 44 65 61  ACK../* ..** Dea
13a90 6c 6c 6f 63 61 74 65 20 61 6e 64 20 64 65 73 74  llocate and dest
13aa0 72 6f 79 20 61 20 70 61 72 73 65 72 2e 20 20 44  roy a parser.  D
13ab0 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 63  estructors are c
13ac0 61 6c 6c 65 64 20 66 6f 72 0d 0a 2a 2a 20 61 6c  alled for..** al
13ad0 6c 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 73  l stack elements
13ae0 20 62 65 66 6f 72 65 20 73 68 75 74 74 69 6e 67   before shutting
13af0 20 74 68 65 20 70 61 72 73 65 72 20 64 6f 77 6e   the parser down
13b00 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65  ...**..** If the
13b10 20 66 74 73 35 59 59 50 41 52 53 45 46 52 45 45   fts5YYPARSEFREE
13b20 4e 45 56 45 52 4e 55 4c 4c 20 6d 61 63 72 6f 20  NEVERNULL macro 
13b30 65 78 69 73 74 73 20 28 66 6f 72 20 65 78 61 6d  exists (for exam
13b40 70 6c 65 20 62 65 63 61 75 73 65 20 69 74 0d 0a  ple because it..
13b50 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e  ** is defined in
13b60 20 61 20 25 69 6e 63 6c 75 64 65 20 73 65 63 74   a %include sect
13b70 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ion of the input
13b80 20 67 72 61 6d 6d 61 72 29 20 74 68 65 6e 20 69   grammar) then i
13b90 74 20 69 73 0d 0a 2a 2a 20 61 73 73 75 6d 65 64  t is..** assumed
13ba0 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
13bb0 70 6f 69 6e 74 65 72 20 69 73 20 6e 65 76 65 72  pointer is never
13bc0 20 4e 55 4c 4c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74   NULL...*/..stat
13bd0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
13be0 74 73 35 50 61 72 73 65 72 46 72 65 65 28 0d 0a  ts5ParserFree(..
13bf0 20 20 76 6f 69 64 20 2a 70 2c 20 20 20 20 20 20    void *p,      
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c10 20 54 68 65 20 70 61 72 73 65 72 20 74 6f 20 62   The parser to b
13c20 65 20 64 65 6c 65 74 65 64 20 2a 2f 0d 0a 20 20  e deleted */..  
13c30 76 6f 69 64 20 28 2a 66 72 65 65 50 72 6f 63 29  void (*freeProc)
13c40 28 76 6f 69 64 2a 29 20 20 20 20 20 2f 2a 20 46  (void*)     /* F
13c50 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  unction used to 
13c60 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20 2a  reclaim memory *
13c70 2f 0d 0a 29 7b 0d 0a 23 69 66 6e 64 65 66 20 66  /..){..#ifndef f
13c80 74 73 35 59 59 50 41 52 53 45 46 52 45 45 4e 45  ts5YYPARSEFREENE
13c90 56 45 52 4e 55 4c 4c 0d 0a 20 20 69 66 28 20 70  VERNULL..  if( p
13ca0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0d 0a 23  ==0 ) return;..#
13cb0 65 6e 64 69 66 0d 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
13cc0 46 74 73 35 50 61 72 73 65 72 46 69 6e 61 6c 69  Fts5ParserFinali
13cd0 7a 65 28 70 29 3b 0d 0a 20 20 28 2a 66 72 65 65  ze(p);..  (*free
13ce0 50 72 6f 63 29 28 70 29 3b 0d 0a 7d 0d 0a 23 65  Proc)(p);..}..#e
13cf0 6e 64 69 66 20 2f 2a 20 73 71 6c 69 74 65 33 46  ndif /* sqlite3F
13d00 74 73 35 50 61 72 73 65 72 5f 45 4e 47 49 4e 45  ts5Parser_ENGINE
13d10 41 4c 57 41 59 53 4f 4e 53 54 41 43 4b 20 2a 2f  ALWAYSONSTACK */
13d20 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72  ..../*..** Retur
13d30 6e 20 74 68 65 20 70 65 61 6b 20 64 65 70 74 68  n the peak depth
13d40 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 66 6f   of the stack fo
13d50 72 20 61 20 70 61 72 73 65 72 2e 0d 0a 2a 2f 0d  r a parser...*/.
13d60 0a 23 69 66 64 65 66 20 66 74 73 35 59 59 54 52  .#ifdef fts5YYTR
13d70 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48  ACKMAXSTACKDEPTH
13d80 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
13d90 69 74 65 33 46 74 73 35 50 61 72 73 65 72 53 74  ite3Fts5ParserSt
13da0 61 63 6b 50 65 61 6b 28 76 6f 69 64 20 2a 70 29  ackPeak(void *p)
13db0 7b 0d 0a 20 20 66 74 73 35 79 79 50 61 72 73 65  {..  fts5yyParse
13dc0 72 20 2a 70 50 61 72 73 65 72 20 3d 20 28 66 74  r *pParser = (ft
13dd0 73 35 79 79 50 61 72 73 65 72 2a 29 70 3b 0d 0a  s5yyParser*)p;..
13de0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 72    return pParser
13df0 2d 3e 66 74 73 35 79 79 68 77 6d 3b 0d 0a 7d 0d  ->fts5yyhwm;..}.
13e00 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 54 68  .#endif..../* Th
13e10 69 73 20 61 72 72 61 79 20 6f 66 20 62 6f 6f 6c  is array of bool
13e20 65 61 6e 73 20 6b 65 65 70 73 20 74 72 61 63 6b  eans keeps track
13e30 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 73   of the parser s
13e40 74 61 74 65 6d 65 6e 74 0d 0a 2a 2a 20 63 6f 76  tatement..** cov
13e50 65 72 61 67 65 2e 20 20 54 68 65 20 65 6c 65 6d  erage.  The elem
13e60 65 6e 74 20 66 74 73 35 79 79 63 6f 76 65 72 61  ent fts5yycovera
13e70 67 65 5b 58 5d 5b 59 5d 20 69 73 20 73 65 74 20  ge[X][Y] is set 
13e80 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 0d  when the parser.
13e90 0a 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20  .** is in state 
13ea0 58 20 61 6e 64 20 68 61 73 20 61 20 6c 6f 6f 6b  X and has a look
13eb0 61 68 65 61 64 20 74 6f 6b 65 6e 20 59 2e 20 20  ahead token Y.  
13ec0 49 6e 20 61 20 77 65 6c 6c 2d 74 65 73 74 65 64  In a well-tested
13ed0 0d 0a 2a 2a 20 73 79 73 74 65 6d 73 2c 20 65 76  ..** systems, ev
13ee0 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
13ef0 68 69 73 20 6d 61 74 72 69 78 20 73 68 6f 75 6c  his matrix shoul
13f00 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73  d end up being s
13f10 65 74 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 66  et...*/..#if def
13f20 69 6e 65 64 28 66 74 73 35 59 59 43 4f 56 45 52  ined(fts5YYCOVER
13f30 41 47 45 29 0d 0a 73 74 61 74 69 63 20 75 6e 73  AGE)..static uns
13f40 69 67 6e 65 64 20 63 68 61 72 20 66 74 73 35 79  igned char fts5y
13f50 79 63 6f 76 65 72 61 67 65 5b 66 74 73 35 59 59  ycoverage[fts5YY
13f60 4e 53 54 41 54 45 5d 5b 66 74 73 35 59 59 4e 46  NSTATE][fts5YYNF
13f70 54 53 35 54 4f 4b 45 4e 5d 3b 0d 0a 23 65 6e 64  TS5TOKEN];..#end
13f80 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 57 72 69  if..../*..** Wri
13f90 74 65 20 69 6e 74 6f 20 6f 75 74 20 61 20 64 65  te into out a de
13fa0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65 76 65  scription of eve
13fb0 72 79 20 73 74 61 74 65 2f 6c 6f 6f 6b 61 68 65  ry state/lookahe
13fc0 61 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74  ad combination t
13fd0 68 61 74 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 28 31  hat..**..**   (1
13fe0 29 20 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  )  has not been 
13ff0 75 73 65 64 20 62 79 20 74 68 65 20 70 61 72 73  used by the pars
14000 65 72 2c 20 61 6e 64 0d 0a 2a 2a 20 20 20 28 32  er, and..**   (2
14010 29 20 20 69 73 20 6e 6f 74 20 61 20 73 79 6e 74  )  is not a synt
14020 61 78 20 65 72 72 6f 72 2e 0d 0a 2a 2a 0d 0a 2a  ax error...**..*
14030 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
14040 62 65 72 20 6f 66 20 6d 69 73 73 65 64 20 73 74  ber of missed st
14050 61 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20 63 6f  ate/lookahead co
14060 6d 62 69 6e 61 74 69 6f 6e 73 2e 0d 0a 2a 2f 0d  mbinations...*/.
14070 0a 23 69 66 20 64 65 66 69 6e 65 64 28 66 74 73  .#if defined(fts
14080 35 59 59 43 4f 56 45 52 41 47 45 29 0d 0a 73 74  5YYCOVERAGE)..st
14090 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
140a0 46 74 73 35 50 61 72 73 65 72 43 6f 76 65 72 61  Fts5ParserCovera
140b0 67 65 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0d 0a  ge(FILE *out){..
140c0 20 20 69 6e 74 20 73 74 61 74 65 6e 6f 2c 20 69    int stateno, i
140d0 4c 6f 6f 6b 41 68 65 61 64 2c 20 69 3b 0d 0a 20  LookAhead, i;.. 
140e0 20 69 6e 74 20 6e 4d 69 73 73 65 64 20 3d 20 30   int nMissed = 0
140f0 3b 0d 0a 20 20 66 6f 72 28 73 74 61 74 65 6e 6f  ;..  for(stateno
14100 3d 30 3b 20 73 74 61 74 65 6e 6f 3c 66 74 73 35  =0; stateno<fts5
14110 59 59 4e 53 54 41 54 45 3b 20 73 74 61 74 65 6e  YYNSTATE; staten
14120 6f 2b 2b 29 7b 0d 0a 20 20 20 20 69 20 3d 20 66  o++){..    i = f
14130 74 73 35 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  ts5yy_shift_ofst
14140 5b 73 74 61 74 65 6e 6f 5d 3b 0d 0a 20 20 20 20  [stateno];..    
14150 66 6f 72 28 69 4c 6f 6f 6b 41 68 65 61 64 3d 30  for(iLookAhead=0
14160 3b 20 69 4c 6f 6f 6b 41 68 65 61 64 3c 66 74 73  ; iLookAhead<fts
14170 35 59 59 4e 46 54 53 35 54 4f 4b 45 4e 3b 20 69  5YYNFTS5TOKEN; i
14180 4c 6f 6f 6b 41 68 65 61 64 2b 2b 29 7b 0d 0a 20  LookAhead++){.. 
14190 20 20 20 20 20 69 66 28 20 66 74 73 35 79 79 5f       if( fts5yy_
141a0 6c 6f 6f 6b 61 68 65 61 64 5b 69 2b 69 4c 6f 6f  lookahead[i+iLoo
141b0 6b 41 68 65 61 64 5d 21 3d 69 4c 6f 6f 6b 41 68  kAhead]!=iLookAh
141c0 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d  ead ) continue;.
141d0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 79  .      if( fts5y
141e0 79 63 6f 76 65 72 61 67 65 5b 73 74 61 74 65 6e  ycoverage[staten
141f0 6f 5d 5b 69 4c 6f 6f 6b 41 68 65 61 64 5d 3d 3d  o][iLookAhead]==
14200 30 20 29 20 6e 4d 69 73 73 65 64 2b 2b 3b 0d 0a  0 ) nMissed++;..
14210 20 20 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b        if( out ){
14220 0d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ..        fprint
14230 66 28 6f 75 74 2c 22 53 74 61 74 65 20 25 64 20  f(out,"State %d 
14240 6c 6f 6f 6b 61 68 65 61 64 20 25 73 20 25 73 5c  lookahead %s %s\
14250 6e 22 2c 20 73 74 61 74 65 6e 6f 2c 0d 0a 20 20  n", stateno,..  
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
14270 73 35 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 69 4c  s5yyTokenName[iL
14280 6f 6f 6b 41 68 65 61 64 5d 2c 0d 0a 20 20 20 20  ookAhead],..    
14290 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
142a0 79 79 63 6f 76 65 72 61 67 65 5b 73 74 61 74 65  yycoverage[state
142b0 6e 6f 5d 5b 69 4c 6f 6f 6b 41 68 65 61 64 5d 20  no][iLookAhead] 
142c0 3f 20 22 6f 6b 22 20 3a 20 22 6d 69 73 73 65 64  ? "ok" : "missed
142d0 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ");..      }..  
142e0 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75    }..  }..  retu
142f0 72 6e 20 6e 4d 69 73 73 65 64 3b 0d 0a 7d 0d 0a  rn nMissed;..}..
14300 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  #endif..../*..**
14310 20 46 69 6e 64 20 74 68 65 20 61 70 70 72 6f 70   Find the approp
14320 72 69 61 74 65 20 61 63 74 69 6f 6e 20 66 6f 72  riate action for
14330 20 61 20 70 61 72 73 65 72 20 67 69 76 65 6e 20   a parser given 
14340 74 68 65 20 74 65 72 6d 69 6e 61 6c 0d 0a 2a 2a  the terminal..**
14350 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 74 6f 6b 65   look-ahead toke
14360 6e 20 69 4c 6f 6f 6b 41 68 65 61 64 2e 0d 0a 2a  n iLookAhead...*
14370 2f 0d 0a 73 74 61 74 69 63 20 66 74 73 35 59 59  /..static fts5YY
14380 41 43 54 49 4f 4e 54 59 50 45 20 66 74 73 35 79  ACTIONTYPE fts5y
14390 79 5f 66 69 6e 64 5f 73 68 69 66 74 5f 61 63 74  y_find_shift_act
143a0 69 6f 6e 28 0d 0a 20 20 66 74 73 35 59 59 43 4f  ion(..  fts5YYCO
143b0 44 45 54 59 50 45 20 69 4c 6f 6f 6b 41 68 65 61  DETYPE iLookAhea
143c0 64 2c 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f  d,    /* The loo
143d0 6b 2d 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f  k-ahead token */
143e0 0d 0a 20 20 66 74 73 35 59 59 41 43 54 49 4f 4e  ..  fts5YYACTION
143f0 54 59 50 45 20 73 74 61 74 65 6e 6f 20 20 20 20  TYPE stateno    
14400 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
14410 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0d 0a 29 7b  te number */..){
14420 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20  ..  int i;....  
14430 69 66 28 20 73 74 61 74 65 6e 6f 3e 66 74 73 35  if( stateno>fts5
14440 59 59 5f 4d 41 58 5f 53 48 49 46 54 20 29 20 72  YY_MAX_SHIFT ) r
14450 65 74 75 72 6e 20 73 74 61 74 65 6e 6f 3b 0d 0a  eturn stateno;..
14460 20 20 61 73 73 65 72 74 28 20 73 74 61 74 65 6e    assert( staten
14470 6f 20 3c 3d 20 66 74 73 35 59 59 5f 53 48 49 46  o <= fts5YY_SHIF
14480 54 5f 43 4f 55 4e 54 20 29 3b 0d 0a 23 69 66 20  T_COUNT );..#if 
14490 64 65 66 69 6e 65 64 28 66 74 73 35 59 59 43 4f  defined(fts5YYCO
144a0 56 45 52 41 47 45 29 0d 0a 20 20 66 74 73 35 79  VERAGE)..  fts5y
144b0 79 63 6f 76 65 72 61 67 65 5b 73 74 61 74 65 6e  ycoverage[staten
144c0 6f 5d 5b 69 4c 6f 6f 6b 41 68 65 61 64 5d 20 3d  o][iLookAhead] =
144d0 20 31 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 64   1;..#endif..  d
144e0 6f 7b 0d 0a 20 20 20 20 69 20 3d 20 66 74 73 35  o{..    i = fts5
144f0 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 73 74  yy_shift_ofst[st
14500 61 74 65 6e 6f 5d 3b 0d 0a 20 20 20 20 61 73 73  ateno];..    ass
14510 65 72 74 28 20 69 3e 3d 30 20 29 3b 0d 0a 20 20  ert( i>=0 );..  
14520 20 20 2f 2a 20 61 73 73 65 72 74 28 20 69 2b 66    /* assert( i+f
14530 74 73 35 59 59 4e 46 54 53 35 54 4f 4b 45 4e 3c  ts5YYNFTS5TOKEN<
14540 3d 28 69 6e 74 29 66 74 73 35 59 59 5f 4e 4c 4f  =(int)fts5YY_NLO
14550 4f 4b 41 48 45 41 44 20 29 3b 20 2a 2f 0d 0a 20  OKAHEAD ); */.. 
14560 20 20 20 61 73 73 65 72 74 28 20 69 4c 6f 6f 6b     assert( iLook
14570 41 68 65 61 64 21 3d 66 74 73 35 59 59 4e 4f 43  Ahead!=fts5YYNOC
14580 4f 44 45 20 29 3b 0d 0a 20 20 20 20 61 73 73 65  ODE );..    asse
14590 72 74 28 20 69 4c 6f 6f 6b 41 68 65 61 64 20 3c  rt( iLookAhead <
145a0 20 66 74 73 35 59 59 4e 46 54 53 35 54 4f 4b 45   fts5YYNFTS5TOKE
145b0 4e 20 29 3b 0d 0a 20 20 20 20 69 20 2b 3d 20 69  N );..    i += i
145c0 4c 6f 6f 6b 41 68 65 61 64 3b 0d 0a 20 20 20 20  LookAhead;..    
145d0 69 66 28 20 69 3e 3d 66 74 73 35 59 59 5f 4e 4c  if( i>=fts5YY_NL
145e0 4f 4f 4b 41 48 45 41 44 20 7c 7c 20 66 74 73 35  OOKAHEAD || fts5
145f0 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 69 5d 21  yy_lookahead[i]!
14600 3d 69 4c 6f 6f 6b 41 68 65 61 64 20 29 7b 0d 0a  =iLookAhead ){..
14610 23 69 66 64 65 66 20 66 74 73 35 59 59 46 41 4c  #ifdef fts5YYFAL
14620 4c 42 41 43 4b 0d 0a 20 20 20 20 20 20 66 74 73  LBACK..      fts
14630 35 59 59 43 4f 44 45 54 59 50 45 20 69 46 61 6c  5YYCODETYPE iFal
14640 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
14650 20 20 2f 2a 20 46 61 6c 6c 62 61 63 6b 20 74 6f    /* Fallback to
14660 6b 65 6e 20 2a 2f 0d 0a 20 20 20 20 20 20 69 66  ken */..      if
14670 28 20 69 4c 6f 6f 6b 41 68 65 61 64 3c 73 69 7a  ( iLookAhead<siz
14680 65 6f 66 28 66 74 73 35 79 79 46 61 6c 6c 62 61  eof(fts5yyFallba
14690 63 6b 29 2f 73 69 7a 65 6f 66 28 66 74 73 35 79  ck)/sizeof(fts5y
146a0 79 46 61 6c 6c 62 61 63 6b 5b 30 5d 29 0d 0a 20  yFallback[0]).. 
146b0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
146c0 69 46 61 6c 6c 62 61 63 6b 20 3d 20 66 74 73 35  iFallback = fts5
146d0 79 79 46 61 6c 6c 62 61 63 6b 5b 69 4c 6f 6f 6b  yyFallback[iLook
146e0 41 68 65 61 64 5d 29 21 3d 30 20 29 7b 0d 0a 23  Ahead])!=0 ){..#
146f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 20  ifndef NDEBUG.. 
14700 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 79         if( fts5y
14710 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20  yTraceFILE ){.. 
14720 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
14730 28 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45  (fts5yyTraceFILE
14740 2c 20 22 25 73 46 41 4c 4c 42 41 43 4b 20 25 73  , "%sFALLBACK %s
14750 20 3d 3e 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 20   => %s\n",..    
14760 20 20 20 20 20 20 20 20 20 66 74 73 35 79 79 54           fts5yyT
14770 72 61 63 65 50 72 6f 6d 70 74 2c 20 66 74 73 35  racePrompt, fts5
14780 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 69 4c 6f 6f  yyTokenName[iLoo
14790 6b 41 68 65 61 64 5d 2c 20 66 74 73 35 79 79 54  kAhead], fts5yyT
147a0 6f 6b 65 6e 4e 61 6d 65 5b 69 46 61 6c 6c 62 61  okenName[iFallba
147b0 63 6b 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  ck]);..        }
147c0 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20  ..#endif..      
147d0 20 20 61 73 73 65 72 74 28 20 66 74 73 35 79 79    assert( fts5yy
147e0 46 61 6c 6c 62 61 63 6b 5b 69 46 61 6c 6c 62 61  Fallback[iFallba
147f0 63 6b 5d 3d 3d 30 20 29 3b 20 2f 2a 20 46 61 6c  ck]==0 ); /* Fal
14800 6c 62 61 63 6b 20 6c 6f 6f 70 20 6d 75 73 74 20  lback loop must 
14810 74 65 72 6d 69 6e 61 74 65 20 2a 2f 0d 0a 20 20  terminate */..  
14820 20 20 20 20 20 20 69 4c 6f 6f 6b 41 68 65 61 64        iLookAhead
14830 20 3d 20 69 46 61 6c 6c 62 61 63 6b 3b 0d 0a 20   = iFallback;.. 
14840 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14850 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69  ..      }..#endi
14860 66 0d 0a 23 69 66 64 65 66 20 66 74 73 35 59 59  f..#ifdef fts5YY
14870 57 49 4c 44 43 41 52 44 0d 0a 20 20 20 20 20 20  WILDCARD..      
14880 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  {..        int j
14890 20 3d 20 69 20 2d 20 69 4c 6f 6f 6b 41 68 65 61   = i - iLookAhea
148a0 64 20 2b 20 66 74 73 35 59 59 57 49 4c 44 43 41  d + fts5YYWILDCA
148b0 52 44 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  RD;..        if(
148c0 20 0d 0a 23 69 66 20 66 74 73 35 59 59 5f 53 48   ..#if fts5YY_SH
148d0 49 46 54 5f 4d 49 4e 2b 66 74 73 35 59 59 57 49  IFT_MIN+fts5YYWI
148e0 4c 44 43 41 52 44 3c 30 0d 0a 20 20 20 20 20 20  LDCARD<0..      
148f0 20 20 20 20 6a 3e 3d 30 20 26 26 0d 0a 23 65 6e      j>=0 &&..#en
14900 64 69 66 0d 0a 23 69 66 20 66 74 73 35 59 59 5f  dif..#if fts5YY_
14910 53 48 49 46 54 5f 4d 41 58 2b 66 74 73 35 59 59  SHIFT_MAX+fts5YY
14920 57 49 4c 44 43 41 52 44 3e 3d 66 74 73 35 59 59  WILDCARD>=fts5YY
14930 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 0d 0a 20  _ACTTAB_COUNT.. 
14940 20 20 20 20 20 20 20 20 20 6a 3c 66 74 73 35 59           j<fts5Y
14950 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 26  Y_ACTTAB_COUNT &
14960 26 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20  &..#endif..     
14970 20 20 20 20 20 6a 3c 28 69 6e 74 29 28 73 69 7a       j<(int)(siz
14980 65 6f 66 28 66 74 73 35 79 79 5f 6c 6f 6f 6b 61  eof(fts5yy_looka
14990 68 65 61 64 29 2f 73 69 7a 65 6f 66 28 66 74 73  head)/sizeof(fts
149a0 35 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 30 5d  5yy_lookahead[0]
149b0 29 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20  )) &&..         
149c0 20 66 74 73 35 79 79 5f 6c 6f 6f 6b 61 68 65 61   fts5yy_lookahea
149d0 64 5b 6a 5d 3d 3d 66 74 73 35 59 59 57 49 4c 44  d[j]==fts5YYWILD
149e0 43 41 52 44 20 26 26 20 69 4c 6f 6f 6b 41 68 65  CARD && iLookAhe
149f0 61 64 3e 30 0d 0a 20 20 20 20 20 20 20 20 29 7b  ad>0..        ){
14a00 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
14a10 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
14a20 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 20  fts5yyTraceFILE 
14a30 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){..            
14a40 66 70 72 69 6e 74 66 28 66 74 73 35 79 79 54 72  fprintf(fts5yyTr
14a50 61 63 65 46 49 4c 45 2c 20 22 25 73 57 49 4c 44  aceFILE, "%sWILD
14a60 43 41 52 44 20 25 73 20 3d 3e 20 25 73 5c 6e 22  CARD %s => %s\n"
14a70 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
14a80 20 20 66 74 73 35 79 79 54 72 61 63 65 50 72 6f    fts5yyTracePro
14a90 6d 70 74 2c 20 66 74 73 35 79 79 54 6f 6b 65 6e  mpt, fts5yyToken
14aa0 4e 61 6d 65 5b 69 4c 6f 6f 6b 41 68 65 61 64 5d  Name[iLookAhead]
14ab0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
14ac0 20 20 66 74 73 35 79 79 54 6f 6b 65 6e 4e 61 6d    fts5yyTokenNam
14ad0 65 5b 66 74 73 35 59 59 57 49 4c 44 43 41 52 44  e[fts5YYWILDCARD
14ae0 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ]);..          }
14af0 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  ..#endif /* NDEB
14b00 55 47 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20  UG */..         
14b10 20 72 65 74 75 72 6e 20 66 74 73 35 79 79 5f 61   return fts5yy_a
14b20 63 74 69 6f 6e 5b 6a 5d 3b 0d 0a 20 20 20 20 20  ction[j];..     
14b30 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 23     }..      }..#
14b40 65 6e 64 69 66 20 2f 2a 20 66 74 73 35 59 59 57  endif /* fts5YYW
14b50 49 4c 44 43 41 52 44 20 2a 2f 0d 0a 20 20 20 20  ILDCARD */..    
14b60 20 20 72 65 74 75 72 6e 20 66 74 73 35 79 79 5f    return fts5yy_
14b70 64 65 66 61 75 6c 74 5b 73 74 61 74 65 6e 6f 5d  default[stateno]
14b80 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20  ;..    }else{.. 
14b90 20 20 20 20 20 72 65 74 75 72 6e 20 66 74 73 35       return fts5
14ba0 79 79 5f 61 63 74 69 6f 6e 5b 69 5d 3b 0d 0a 20  yy_action[i];.. 
14bb0 20 20 20 7d 0d 0a 20 20 7d 77 68 69 6c 65 28 31     }..  }while(1
14bc0 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  );..}..../*..** 
14bd0 46 69 6e 64 20 74 68 65 20 61 70 70 72 6f 70 72  Find the appropr
14be0 69 61 74 65 20 61 63 74 69 6f 6e 20 66 6f 72 20  iate action for 
14bf0 61 20 70 61 72 73 65 72 20 67 69 76 65 6e 20 74  a parser given t
14c00 68 65 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 0d  he non-terminal.
14c10 0a 2a 2a 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 74  .** look-ahead t
14c20 6f 6b 65 6e 20 69 4c 6f 6f 6b 41 68 65 61 64 2e  oken iLookAhead.
14c30 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 66 74 73  ..*/..static fts
14c40 35 59 59 41 43 54 49 4f 4e 54 59 50 45 20 66 74  5YYACTIONTYPE ft
14c50 73 35 79 79 5f 66 69 6e 64 5f 72 65 64 75 63 65  s5yy_find_reduce
14c60 5f 61 63 74 69 6f 6e 28 0d 0a 20 20 66 74 73 35  _action(..  fts5
14c70 59 59 41 43 54 49 4f 4e 54 59 50 45 20 73 74 61  YYACTIONTYPE sta
14c80 74 65 6e 6f 2c 20 20 20 20 20 2f 2a 20 43 75 72  teno,     /* Cur
14c90 72 65 6e 74 20 73 74 61 74 65 20 6e 75 6d 62 65  rent state numbe
14ca0 72 20 2a 2f 0d 0a 20 20 66 74 73 35 59 59 43 4f  r */..  fts5YYCO
14cb0 44 45 54 59 50 45 20 69 4c 6f 6f 6b 41 68 65 61  DETYPE iLookAhea
14cc0 64 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f  d     /* The loo
14cd0 6b 2d 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f  k-ahead token */
14ce0 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a  ..){..  int i;..
14cf0 23 69 66 64 65 66 20 66 74 73 35 59 59 45 52 52  #ifdef fts5YYERR
14d00 4f 52 53 59 4d 42 4f 4c 0d 0a 20 20 69 66 28 20  ORSYMBOL..  if( 
14d10 73 74 61 74 65 6e 6f 3e 66 74 73 35 59 59 5f 52  stateno>fts5YY_R
14d20 45 44 55 43 45 5f 43 4f 55 4e 54 20 29 7b 0d 0a  EDUCE_COUNT ){..
14d30 20 20 20 20 72 65 74 75 72 6e 20 66 74 73 35 79      return fts5y
14d40 79 5f 64 65 66 61 75 6c 74 5b 73 74 61 74 65 6e  y_default[staten
14d50 6f 5d 3b 0d 0a 20 20 7d 0d 0a 23 65 6c 73 65 0d  o];..  }..#else.
14d60 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 74 65  .  assert( state
14d70 6e 6f 3c 3d 66 74 73 35 59 59 5f 52 45 44 55 43  no<=fts5YY_REDUC
14d80 45 5f 43 4f 55 4e 54 20 29 3b 0d 0a 23 65 6e 64  E_COUNT );..#end
14d90 69 66 0d 0a 20 20 69 20 3d 20 66 74 73 35 79 79  if..  i = fts5yy
14da0 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 73 74 61  _reduce_ofst[sta
14db0 74 65 6e 6f 5d 3b 0d 0a 20 20 61 73 73 65 72 74  teno];..  assert
14dc0 28 20 69 4c 6f 6f 6b 41 68 65 61 64 21 3d 66 74  ( iLookAhead!=ft
14dd0 73 35 59 59 4e 4f 43 4f 44 45 20 29 3b 0d 0a 20  s5YYNOCODE );.. 
14de0 20 69 20 2b 3d 20 69 4c 6f 6f 6b 41 68 65 61 64   i += iLookAhead
14df0 3b 0d 0a 23 69 66 64 65 66 20 66 74 73 35 59 59  ;..#ifdef fts5YY
14e00 45 52 52 4f 52 53 59 4d 42 4f 4c 0d 0a 20 20 69  ERRORSYMBOL..  i
14e10 66 28 20 69 3c 30 20 7c 7c 20 69 3e 3d 66 74 73  f( i<0 || i>=fts
14e20 35 59 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54  5YY_ACTTAB_COUNT
14e30 20 7c 7c 20 66 74 73 35 79 79 5f 6c 6f 6f 6b 61   || fts5yy_looka
14e40 68 65 61 64 5b 69 5d 21 3d 69 4c 6f 6f 6b 41 68  head[i]!=iLookAh
14e50 65 61 64 20 29 7b 0d 0a 20 20 20 20 72 65 74 75  ead ){..    retu
14e60 72 6e 20 66 74 73 35 79 79 5f 64 65 66 61 75 6c  rn fts5yy_defaul
14e70 74 5b 73 74 61 74 65 6e 6f 5d 3b 0d 0a 20 20 7d  t[stateno];..  }
14e80 0d 0a 23 65 6c 73 65 0d 0a 20 20 61 73 73 65 72  ..#else..  asser
14e90 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 66 74 73  t( i>=0 && i<fts
14ea0 35 59 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54  5YY_ACTTAB_COUNT
14eb0 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 66   );..  assert( f
14ec0 74 73 35 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  ts5yy_lookahead[
14ed0 69 5d 3d 3d 69 4c 6f 6f 6b 41 68 65 61 64 20 29  i]==iLookAhead )
14ee0 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 72 65 74  ;..#endif..  ret
14ef0 75 72 6e 20 66 74 73 35 79 79 5f 61 63 74 69 6f  urn fts5yy_actio
14f00 6e 5b 69 5d 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a  n[i];..}..../*..
14f10 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
14f20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
14f30 65 64 20 69 66 20 74 68 65 20 73 74 61 63 6b 20  ed if the stack 
14f40 6f 76 65 72 66 6c 6f 77 73 2e 0d 0a 2a 2f 0d 0a  overflows...*/..
14f50 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14f60 79 79 53 74 61 63 6b 4f 76 65 72 66 6c 6f 77 28  yyStackOverflow(
14f70 66 74 73 35 79 79 50 61 72 73 65 72 20 2a 66 74  fts5yyParser *ft
14f80 73 35 79 79 70 50 61 72 73 65 72 29 7b 0d 0a 20  s5yypParser){.. 
14f90 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
14fa0 73 65 72 41 52 47 5f 46 45 54 43 48 0d 0a 20 20  serARG_FETCH..  
14fb0 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
14fc0 65 72 43 54 58 5f 46 45 54 43 48 0d 0a 23 69 66  erCTX_FETCH..#if
14fd0 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 20  ndef NDEBUG..   
14fe0 69 66 28 20 66 74 73 35 79 79 54 72 61 63 65 46  if( fts5yyTraceF
14ff0 49 4c 45 20 29 7b 0d 0a 20 20 20 20 20 66 70 72  ILE ){..     fpr
15000 69 6e 74 66 28 66 74 73 35 79 79 54 72 61 63 65  intf(fts5yyTrace
15010 46 49 4c 45 2c 22 25 73 53 74 61 63 6b 20 4f 76  FILE,"%sStack Ov
15020 65 72 66 6c 6f 77 21 5c 6e 22 2c 66 74 73 35 79  erflow!\n",fts5y
15030 79 54 72 61 63 65 50 72 6f 6d 70 74 29 3b 0d 0a  yTracePrompt);..
15040 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20     }..#endif..  
15050 20 77 68 69 6c 65 28 20 66 74 73 35 79 79 70 50   while( fts5yypP
15060 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73  arser->fts5yytos
15070 3e 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e  >fts5yypParser->
15080 66 74 73 35 79 79 73 74 61 63 6b 20 29 20 66 74  fts5yystack ) ft
15090 73 35 79 79 5f 70 6f 70 5f 70 61 72 73 65 72 5f  s5yy_pop_parser_
150a0 73 74 61 63 6b 28 66 74 73 35 79 79 70 50 61 72  stack(fts5yypPar
150b0 73 65 72 29 3b 0d 0a 20 20 20 2f 2a 20 48 65 72  ser);..   /* Her
150c0 65 20 63 6f 64 65 20 69 73 20 69 6e 73 65 72 74  e code is insert
150d0 65 64 20 77 68 69 63 68 20 77 69 6c 6c 20 65 78  ed which will ex
150e0 65 63 75 74 65 20 69 66 20 74 68 65 20 70 61 72  ecute if the par
150f0 73 65 72 0d 0a 20 20 20 2a 2a 20 73 74 61 63 6b  ser..   ** stack
15100 20 65 76 65 72 79 20 6f 76 65 72 66 6c 6f 77 73   every overflows
15110 20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 42   */../******** B
15120 65 67 69 6e 20 25 73 74 61 63 6b 5f 6f 76 65 72  egin %stack_over
15130 66 6c 6f 77 20 63 6f 64 65 20 2a 2a 2a 2a 2a 2a  flow code ******
15140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15160 2a 2a 2a 2a 2f 0d 0a 23 6c 69 6e 65 20 33 36 20  ****/..#line 36 
15170 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 0d  "fts5parse.y"...
15180 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  .  sqlite3Fts5Pa
15190 72 73 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  rseError(pParse,
151a0 20 22 66 74 73 35 3a 20 70 61 72 73 65 72 20 73   "fts5: parser s
151b0 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 22 29 3b  tack overflow");
151c0 0d 0a 23 6c 69 6e 65 20 38 32 37 20 22 66 74 73  ..#line 827 "fts
151d0 35 70 61 72 73 65 2e 63 22 0d 0a 2f 2a 2a 2a 2a  5parse.c"../****
151e0 2a 2a 2a 2a 20 45 6e 64 20 25 73 74 61 63 6b 5f  **** End %stack_
151f0 6f 76 65 72 66 6c 6f 77 20 63 6f 64 65 20 2a 2a  overflow code **
15200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20 20  **********/..   
15230 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
15240 72 41 52 47 5f 53 54 4f 52 45 20 2f 2a 20 53 75  rARG_STORE /* Su
15250 70 70 72 65 73 73 20 77 61 72 6e 69 6e 67 20 61  ppress warning a
15260 62 6f 75 74 20 75 6e 75 73 65 64 20 25 65 78 74  bout unused %ext
15270 72 61 5f 61 72 67 75 6d 65 6e 74 20 76 61 72 20  ra_argument var 
15280 2a 2f 0d 0a 20 20 20 73 71 6c 69 74 65 33 46 74  */..   sqlite3Ft
15290 73 35 50 61 72 73 65 72 43 54 58 5f 53 54 4f 52  s5ParserCTX_STOR
152a0 45 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50  E..}..../*..** P
152b0 72 69 6e 74 20 74 72 61 63 69 6e 67 20 69 6e 66  rint tracing inf
152c0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53  ormation for a S
152d0 48 49 46 54 20 61 63 74 69 6f 6e 0d 0a 2a 2f 0d  HIFT action..*/.
152e0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d  .#ifndef NDEBUG.
152f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15300 35 79 79 54 72 61 63 65 53 68 69 66 74 28 66 74  5yyTraceShift(ft
15310 73 35 79 79 50 61 72 73 65 72 20 2a 66 74 73 35  s5yyParser *fts5
15320 79 79 70 50 61 72 73 65 72 2c 20 69 6e 74 20 66  yypParser, int f
15330 74 73 35 79 79 4e 65 77 53 74 61 74 65 2c 20 63  ts5yyNewState, c
15340 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 29  onst char *zTag)
15350 7b 0d 0a 20 20 69 66 28 20 66 74 73 35 79 79 54  {..  if( fts5yyT
15360 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20 20 20  raceFILE ){..   
15370 20 69 66 28 20 66 74 73 35 79 79 4e 65 77 53 74   if( fts5yyNewSt
15380 61 74 65 3c 66 74 73 35 59 59 4e 53 54 41 54 45  ate<fts5YYNSTATE
15390 20 29 7b 0d 0a 20 20 20 20 20 20 66 70 72 69 6e   ){..      fprin
153a0 74 66 28 66 74 73 35 79 79 54 72 61 63 65 46 49  tf(fts5yyTraceFI
153b0 4c 45 2c 22 25 73 25 73 20 27 25 73 27 2c 20 67  LE,"%s%s '%s', g
153c0 6f 20 74 6f 20 73 74 61 74 65 20 25 64 5c 6e 22  o to state %d\n"
153d0 2c 0d 0a 20 20 20 20 20 20 20 20 20 66 74 73 35  ,..         fts5
153e0 79 79 54 72 61 63 65 50 72 6f 6d 70 74 2c 20 7a  yyTracePrompt, z
153f0 54 61 67 2c 20 66 74 73 35 79 79 54 6f 6b 65 6e  Tag, fts5yyToken
15400 4e 61 6d 65 5b 66 74 73 35 79 79 70 50 61 72 73  Name[fts5yypPars
15410 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 2d 3e 6d  er->fts5yytos->m
15420 61 6a 6f 72 5d 2c 0d 0a 20 20 20 20 20 20 20 20  ajor],..        
15430 20 66 74 73 35 79 79 4e 65 77 53 74 61 74 65 29   fts5yyNewState)
15440 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20  ;..    }else{.. 
15450 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 74 73       fprintf(fts
15460 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22 25 73  5yyTraceFILE,"%s
15470 25 73 20 27 25 73 27 2c 20 70 65 6e 64 69 6e 67  %s '%s', pending
15480 20 72 65 64 75 63 65 20 25 64 5c 6e 22 2c 0d 0a   reduce %d\n",..
15490 20 20 20 20 20 20 20 20 20 66 74 73 35 79 79 54           fts5yyT
154a0 72 61 63 65 50 72 6f 6d 70 74 2c 20 7a 54 61 67  racePrompt, zTag
154b0 2c 20 66 74 73 35 79 79 54 6f 6b 65 6e 4e 61 6d  , fts5yyTokenNam
154c0 65 5b 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  e[fts5yypParser-
154d0 3e 66 74 73 35 79 79 74 6f 73 2d 3e 6d 61 6a 6f  >fts5yytos->majo
154e0 72 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20 66 74  r],..         ft
154f0 73 35 79 79 4e 65 77 53 74 61 74 65 20 2d 20 66  s5yyNewState - f
15500 74 73 35 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45  ts5YY_MIN_REDUCE
15510 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  );..    }..  }..
15520 7d 0d 0a 23 65 6c 73 65 0d 0a 23 20 64 65 66 69  }..#else..# defi
15530 6e 65 20 66 74 73 35 79 79 54 72 61 63 65 53 68  ne fts5yyTraceSh
15540 69 66 74 28 58 2c 59 2c 5a 29 0d 0a 23 65 6e 64  ift(X,Y,Z)..#end
15550 69 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 65 72  if..../*..** Per
15560 66 6f 72 6d 20 61 20 73 68 69 66 74 20 61 63 74  form a shift act
15570 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ion...*/..static
15580 20 76 6f 69 64 20 66 74 73 35 79 79 5f 73 68 69   void fts5yy_shi
15590 66 74 28 0d 0a 20 20 66 74 73 35 79 79 50 61 72  ft(..  fts5yyPar
155a0 73 65 72 20 2a 66 74 73 35 79 79 70 50 61 72 73  ser *fts5yypPars
155b0 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
155c0 54 68 65 20 70 61 72 73 65 72 20 74 6f 20 62 65  The parser to be
155d0 20 73 68 69 66 74 65 64 20 2a 2f 0d 0a 20 20 66   shifted */..  f
155e0 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50 45 20  ts5YYACTIONTYPE 
155f0 66 74 73 35 79 79 4e 65 77 53 74 61 74 65 2c 20  fts5yyNewState, 
15600 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
15610 73 74 61 74 65 20 74 6f 20 73 68 69 66 74 20 69  state to shift i
15620 6e 20 2a 2f 0d 0a 20 20 66 74 73 35 59 59 43 4f  n */..  fts5YYCO
15630 44 45 54 59 50 45 20 66 74 73 35 79 79 4d 61 6a  DETYPE fts5yyMaj
15640 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  or,           /*
15650 20 54 68 65 20 6d 61 6a 6f 72 20 74 6f 6b 65 6e   The major token
15660 20 74 6f 20 73 68 69 66 74 20 69 6e 20 2a 2f 0d   to shift in */.
15670 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  .  sqlite3Fts5Pa
15680 72 73 65 72 46 54 53 35 54 4f 4b 45 4e 54 59 50  rserFTS5TOKENTYP
15690 45 20 66 74 73 35 79 79 4d 69 6e 6f 72 20 20 20  E fts5yyMinor   
156a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 69 6e 6f       /* The mino
156b0 72 20 74 6f 6b 65 6e 20 74 6f 20 73 68 69 66 74  r token to shift
156c0 20 69 6e 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 66 74   in */..){..  ft
156d0 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79 20 2a  s5yyStackEntry *
156e0 66 74 73 35 79 79 74 6f 73 3b 0d 0a 20 20 66 74  fts5yytos;..  ft
156f0 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73  s5yypParser->fts
15700 35 79 79 74 6f 73 2b 2b 3b 0d 0a 23 69 66 64 65  5yytos++;..#ifde
15710 66 20 66 74 73 35 59 59 54 52 41 43 4b 4d 41 58  f fts5YYTRACKMAX
15720 53 54 41 43 4b 44 45 50 54 48 0d 0a 20 20 69 66  STACKDEPTH..  if
15730 28 20 28 69 6e 74 29 28 66 74 73 35 79 79 70 50  ( (int)(fts5yypP
15740 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73  arser->fts5yytos
15750 20 2d 20 66 74 73 35 79 79 70 50 61 72 73 65 72   - fts5yypParser
15760 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 29 3e 66  ->fts5yystack)>f
15770 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
15780 73 35 79 79 68 77 6d 20 29 7b 0d 0a 20 20 20 20  s5yyhwm ){..    
15790 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
157a0 74 73 35 79 79 68 77 6d 2b 2b 3b 0d 0a 20 20 20  ts5yyhwm++;..   
157b0 20 61 73 73 65 72 74 28 20 66 74 73 35 79 79 70   assert( fts5yyp
157c0 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 68 77  Parser->fts5yyhw
157d0 6d 20 3d 3d 20 28 69 6e 74 29 28 66 74 73 35 79  m == (int)(fts5y
157e0 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
157f0 74 6f 73 20 2d 20 66 74 73 35 79 79 70 50 61 72  tos - fts5yypPar
15800 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b  ser->fts5yystack
15810 29 20 29 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69  ) );..  }..#endi
15820 66 0d 0a 23 69 66 20 66 74 73 35 59 59 53 54 41  f..#if fts5YYSTA
15830 43 4b 44 45 50 54 48 3e 30 20 0d 0a 20 20 69 66  CKDEPTH>0 ..  if
15840 28 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  ( fts5yypParser-
15850 3e 66 74 73 35 79 79 74 6f 73 3e 66 74 73 35 79  >fts5yytos>fts5y
15860 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
15870 73 74 61 63 6b 45 6e 64 20 29 7b 0d 0a 20 20 20  stackEnd ){..   
15880 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
15890 66 74 73 35 79 79 74 6f 73 2d 2d 3b 0d 0a 20 20  fts5yytos--;..  
158a0 20 20 66 74 73 35 79 79 53 74 61 63 6b 4f 76 65    fts5yyStackOve
158b0 72 66 6c 6f 77 28 66 74 73 35 79 79 70 50 61 72  rflow(fts5yypPar
158c0 73 65 72 29 3b 0d 0a 20 20 20 20 72 65 74 75 72  ser);..    retur
158d0 6e 3b 0d 0a 20 20 7d 0d 0a 23 65 6c 73 65 0d 0a  n;..  }..#else..
158e0 20 20 69 66 28 20 66 74 73 35 79 79 70 50 61 72    if( fts5yypPar
158f0 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 3e 3d  ser->fts5yytos>=
15900 26 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e  &fts5yypParser->
15910 66 74 73 35 79 79 73 74 61 63 6b 5b 66 74 73 35  fts5yystack[fts5
15920 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
15930 79 73 74 6b 73 7a 5d 20 29 7b 0d 0a 20 20 20 20  ystksz] ){..    
15940 69 66 28 20 66 74 73 35 79 79 47 72 6f 77 53 74  if( fts5yyGrowSt
15950 61 63 6b 28 66 74 73 35 79 79 70 50 61 72 73 65  ack(fts5yypParse
15960 72 29 20 29 7b 0d 0a 20 20 20 20 20 20 66 74 73  r) ){..      fts
15970 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
15980 79 79 74 6f 73 2d 2d 3b 0d 0a 20 20 20 20 20 20  yytos--;..      
15990 66 74 73 35 79 79 53 74 61 63 6b 4f 76 65 72 66  fts5yyStackOverf
159a0 6c 6f 77 28 66 74 73 35 79 79 70 50 61 72 73 65  low(fts5yypParse
159b0 72 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  r);..      retur
159c0 6e 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  n;..    }..  }..
159d0 23 65 6e 64 69 66 0d 0a 20 20 69 66 28 20 66 74  #endif..  if( ft
159e0 73 35 79 79 4e 65 77 53 74 61 74 65 20 3e 20 66  s5yyNewState > f
159f0 74 73 35 59 59 5f 4d 41 58 5f 53 48 49 46 54 20  ts5YY_MAX_SHIFT 
15a00 29 7b 0d 0a 20 20 20 20 66 74 73 35 79 79 4e 65  ){..    fts5yyNe
15a10 77 53 74 61 74 65 20 2b 3d 20 66 74 73 35 59 59  wState += fts5YY
15a20 5f 4d 49 4e 5f 52 45 44 55 43 45 20 2d 20 66 74  _MIN_REDUCE - ft
15a30 73 35 59 59 5f 4d 49 4e 5f 53 48 49 46 54 52 45  s5YY_MIN_SHIFTRE
15a40 44 55 43 45 3b 0d 0a 20 20 7d 0d 0a 20 20 66 74  DUCE;..  }..  ft
15a50 73 35 79 79 74 6f 73 20 3d 20 66 74 73 35 79 79  s5yytos = fts5yy
15a60 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74  pParser->fts5yyt
15a70 6f 73 3b 0d 0a 20 20 66 74 73 35 79 79 74 6f 73  os;..  fts5yytos
15a80 2d 3e 73 74 61 74 65 6e 6f 20 3d 20 66 74 73 35  ->stateno = fts5
15a90 79 79 4e 65 77 53 74 61 74 65 3b 0d 0a 20 20 66  yyNewState;..  f
15aa0 74 73 35 79 79 74 6f 73 2d 3e 6d 61 6a 6f 72 20  ts5yytos->major 
15ab0 3d 20 66 74 73 35 79 79 4d 61 6a 6f 72 3b 0d 0a  = fts5yyMajor;..
15ac0 20 20 66 74 73 35 79 79 74 6f 73 2d 3e 6d 69 6e    fts5yytos->min
15ad0 6f 72 2e 66 74 73 35 79 79 30 20 3d 20 66 74 73  or.fts5yy0 = fts
15ae0 35 79 79 4d 69 6e 6f 72 3b 0d 0a 20 20 66 74 73  5yyMinor;..  fts
15af0 35 79 79 54 72 61 63 65 53 68 69 66 74 28 66 74  5yyTraceShift(ft
15b00 73 35 79 79 70 50 61 72 73 65 72 2c 20 66 74 73  s5yypParser, fts
15b10 35 79 79 4e 65 77 53 74 61 74 65 2c 20 22 53 68  5yyNewState, "Sh
15b20 69 66 74 22 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 20  ift");..}..../* 
15b30 46 6f 72 20 72 75 6c 65 20 4a 2c 20 66 74 73 35  For rule J, fts5
15b40 79 79 52 75 6c 65 49 6e 66 6f 4c 68 73 5b 4a 5d  yyRuleInfoLhs[J]
15b50 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 79   contains the sy
15b60 6d 62 6f 6c 20 6f 6e 20 74 68 65 20 6c 65 66 74  mbol on the left
15b70 2d 68 61 6e 64 20 73 69 64 65 0d 0a 2a 2a 20 6f  -hand side..** o
15b80 66 20 74 68 61 74 20 72 75 6c 65 20 2a 2f 0d 0a  f that rule */..
15b90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 66 74 73  static const fts
15ba0 35 59 59 43 4f 44 45 54 59 50 45 20 66 74 73 35  5YYCODETYPE fts5
15bb0 79 79 52 75 6c 65 49 6e 66 6f 4c 68 73 5b 5d 20  yyRuleInfoLhs[] 
15bc0 3d 20 7b 0d 0a 20 20 20 20 31 36 2c 20 20 2f 2a  = {..    16,  /*
15bd0 20 28 30 29 20 69 6e 70 75 74 20 3a 3a 3d 20 65   (0) input ::= e
15be0 78 70 72 20 2a 2f 0d 0a 20 20 20 20 32 30 2c 20  xpr */..    20, 
15bf0 20 2f 2a 20 28 31 29 20 63 6f 6c 73 65 74 20 3a   /* (1) colset :
15c00 3a 3d 20 4d 49 4e 55 53 20 4c 43 50 20 63 6f 6c  := MINUS LCP col
15c10 73 65 74 6c 69 73 74 20 52 43 50 20 2a 2f 0d 0a  setlist RCP */..
15c20 20 20 20 20 32 30 2c 20 20 2f 2a 20 28 32 29 20      20,  /* (2) 
15c30 63 6f 6c 73 65 74 20 3a 3a 3d 20 4c 43 50 20 63  colset ::= LCP c
15c40 6f 6c 73 65 74 6c 69 73 74 20 52 43 50 20 2a 2f  olsetlist RCP */
15c50 0d 0a 20 20 20 20 32 30 2c 20 20 2f 2a 20 28 33  ..    20,  /* (3
15c60 29 20 63 6f 6c 73 65 74 20 3a 3a 3d 20 53 54 52  ) colset ::= STR
15c70 49 4e 47 20 2a 2f 0d 0a 20 20 20 20 32 30 2c 20  ING */..    20, 
15c80 20 2f 2a 20 28 34 29 20 63 6f 6c 73 65 74 20 3a   /* (4) colset :
15c90 3a 3d 20 4d 49 4e 55 53 20 53 54 52 49 4e 47 20  := MINUS STRING 
15ca0 2a 2f 0d 0a 20 20 20 20 32 31 2c 20 20 2f 2a 20  */..    21,  /* 
15cb0 28 35 29 20 63 6f 6c 73 65 74 6c 69 73 74 20 3a  (5) colsetlist :
15cc0 3a 3d 20 63 6f 6c 73 65 74 6c 69 73 74 20 53 54  := colsetlist ST
15cd0 52 49 4e 47 20 2a 2f 0d 0a 20 20 20 20 32 31 2c  RING */..    21,
15ce0 20 20 2f 2a 20 28 36 29 20 63 6f 6c 73 65 74 6c    /* (6) colsetl
15cf0 69 73 74 20 3a 3a 3d 20 53 54 52 49 4e 47 20 2a  ist ::= STRING *
15d00 2f 0d 0a 20 20 20 20 31 37 2c 20 20 2f 2a 20 28  /..    17,  /* (
15d10 37 29 20 65 78 70 72 20 3a 3a 3d 20 65 78 70 72  7) expr ::= expr
15d20 20 41 4e 44 20 65 78 70 72 20 2a 2f 0d 0a 20 20   AND expr */..  
15d30 20 20 31 37 2c 20 20 2f 2a 20 28 38 29 20 65 78    17,  /* (8) ex
15d40 70 72 20 3a 3a 3d 20 65 78 70 72 20 4f 52 20 65  pr ::= expr OR e
15d50 78 70 72 20 2a 2f 0d 0a 20 20 20 20 31 37 2c 20  xpr */..    17, 
15d60 20 2f 2a 20 28 39 29 20 65 78 70 72 20 3a 3a 3d   /* (9) expr ::=
15d70 20 65 78 70 72 20 4e 4f 54 20 65 78 70 72 20 2a   expr NOT expr *
15d80 2f 0d 0a 20 20 20 20 31 37 2c 20 20 2f 2a 20 28  /..    17,  /* (
15d90 31 30 29 20 65 78 70 72 20 3a 3a 3d 20 63 6f 6c  10) expr ::= col
15da0 73 65 74 20 43 4f 4c 4f 4e 20 4c 50 20 65 78 70  set COLON LP exp
15db0 72 20 52 50 20 2a 2f 0d 0a 20 20 20 20 31 37 2c  r RP */..    17,
15dc0 20 20 2f 2a 20 28 31 31 29 20 65 78 70 72 20 3a    /* (11) expr :
15dd0 3a 3d 20 4c 50 20 65 78 70 72 20 52 50 20 2a 2f  := LP expr RP */
15de0 0d 0a 20 20 20 20 31 37 2c 20 20 2f 2a 20 28 31  ..    17,  /* (1
15df0 32 29 20 65 78 70 72 20 3a 3a 3d 20 65 78 70 72  2) expr ::= expr
15e00 6c 69 73 74 20 2a 2f 0d 0a 20 20 20 20 31 39 2c  list */..    19,
15e10 20 20 2f 2a 20 28 31 33 29 20 65 78 70 72 6c 69    /* (13) exprli
15e20 73 74 20 3a 3a 3d 20 63 6e 65 61 72 73 65 74 20  st ::= cnearset 
15e30 2a 2f 0d 0a 20 20 20 20 31 39 2c 20 20 2f 2a 20  */..    19,  /* 
15e40 28 31 34 29 20 65 78 70 72 6c 69 73 74 20 3a 3a  (14) exprlist ::
15e50 3d 20 65 78 70 72 6c 69 73 74 20 63 6e 65 61 72  = exprlist cnear
15e60 73 65 74 20 2a 2f 0d 0a 20 20 20 20 31 38 2c 20  set */..    18, 
15e70 20 2f 2a 20 28 31 35 29 20 63 6e 65 61 72 73 65   /* (15) cnearse
15e80 74 20 3a 3a 3d 20 6e 65 61 72 73 65 74 20 2a 2f  t ::= nearset */
15e90 0d 0a 20 20 20 20 31 38 2c 20 20 2f 2a 20 28 31  ..    18,  /* (1
15ea0 36 29 20 63 6e 65 61 72 73 65 74 20 3a 3a 3d 20  6) cnearset ::= 
15eb0 63 6f 6c 73 65 74 20 43 4f 4c 4f 4e 20 6e 65 61  colset COLON nea
15ec0 72 73 65 74 20 2a 2f 0d 0a 20 20 20 20 32 32 2c  rset */..    22,
15ed0 20 20 2f 2a 20 28 31 37 29 20 6e 65 61 72 73 65    /* (17) nearse
15ee0 74 20 3a 3a 3d 20 70 68 72 61 73 65 20 2a 2f 0d  t ::= phrase */.
15ef0 0a 20 20 20 20 32 32 2c 20 20 2f 2a 20 28 31 38  .    22,  /* (18
15f00 29 20 6e 65 61 72 73 65 74 20 3a 3a 3d 20 43 41  ) nearset ::= CA
15f10 52 45 54 20 70 68 72 61 73 65 20 2a 2f 0d 0a 20  RET phrase */.. 
15f20 20 20 20 32 32 2c 20 20 2f 2a 20 28 31 39 29 20     22,  /* (19) 
15f30 6e 65 61 72 73 65 74 20 3a 3a 3d 20 53 54 52 49  nearset ::= STRI
15f40 4e 47 20 4c 50 20 6e 65 61 72 70 68 72 61 73 65  NG LP nearphrase
15f50 73 20 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 52  s neardist_opt R
15f60 50 20 2a 2f 0d 0a 20 20 20 20 32 33 2c 20 20 2f  P */..    23,  /
15f70 2a 20 28 32 30 29 20 6e 65 61 72 70 68 72 61 73  * (20) nearphras
15f80 65 73 20 3a 3a 3d 20 70 68 72 61 73 65 20 2a 2f  es ::= phrase */
15f90 0d 0a 20 20 20 20 32 33 2c 20 20 2f 2a 20 28 32  ..    23,  /* (2
15fa0 31 29 20 6e 65 61 72 70 68 72 61 73 65 73 20 3a  1) nearphrases :
15fb0 3a 3d 20 6e 65 61 72 70 68 72 61 73 65 73 20 70  := nearphrases p
15fc0 68 72 61 73 65 20 2a 2f 0d 0a 20 20 20 20 32 35  hrase */..    25
15fd0 2c 20 20 2f 2a 20 28 32 32 29 20 6e 65 61 72 64  ,  /* (22) neard
15fe0 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 2a 2f 0d 0a  ist_opt ::= */..
15ff0 20 20 20 20 32 35 2c 20 20 2f 2a 20 28 32 33 29      25,  /* (23)
16000 20 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 3a 3a   neardist_opt ::
16010 3d 20 43 4f 4d 4d 41 20 53 54 52 49 4e 47 20 2a  = COMMA STRING *
16020 2f 0d 0a 20 20 20 20 32 34 2c 20 20 2f 2a 20 28  /..    24,  /* (
16030 32 34 29 20 70 68 72 61 73 65 20 3a 3a 3d 20 70  24) phrase ::= p
16040 68 72 61 73 65 20 50 4c 55 53 20 53 54 52 49 4e  hrase PLUS STRIN
16050 47 20 73 74 61 72 5f 6f 70 74 20 2a 2f 0d 0a 20  G star_opt */.. 
16060 20 20 20 32 34 2c 20 20 2f 2a 20 28 32 35 29 20     24,  /* (25) 
16070 70 68 72 61 73 65 20 3a 3a 3d 20 53 54 52 49 4e  phrase ::= STRIN
16080 47 20 73 74 61 72 5f 6f 70 74 20 2a 2f 0d 0a 20  G star_opt */.. 
16090 20 20 20 32 36 2c 20 20 2f 2a 20 28 32 36 29 20     26,  /* (26) 
160a0 73 74 61 72 5f 6f 70 74 20 3a 3a 3d 20 53 54 41  star_opt ::= STA
160b0 52 20 2a 2f 0d 0a 20 20 20 20 32 36 2c 20 20 2f  R */..    26,  /
160c0 2a 20 28 32 37 29 20 73 74 61 72 5f 6f 70 74 20  * (27) star_opt 
160d0 3a 3a 3d 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a  ::= */..};..../*
160e0 20 46 6f 72 20 72 75 6c 65 20 4a 2c 20 66 74 73   For rule J, fts
160f0 35 79 79 52 75 6c 65 49 6e 66 6f 4e 52 68 73 5b  5yyRuleInfoNRhs[
16100 4a 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  J] contains the 
16110 6e 65 67 61 74 69 76 65 20 6f 66 20 74 68 65 20  negative of the 
16120 6e 75 6d 62 65 72 0d 0a 2a 2a 20 6f 66 20 73 79  number..** of sy
16130 6d 62 6f 6c 73 20 6f 6e 20 74 68 65 20 72 69 67  mbols on the rig
16140 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
16150 74 68 61 74 20 72 75 6c 65 2e 20 2a 2f 0d 0a 73  that rule. */..s
16160 74 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67 6e  tatic const sign
16170 65 64 20 63 68 61 72 20 66 74 73 35 79 79 52 75  ed char fts5yyRu
16180 6c 65 49 6e 66 6f 4e 52 68 73 5b 5d 20 3d 20 7b  leInfoNRhs[] = {
16190 0d 0a 20 20 20 2d 31 2c 20 20 2f 2a 20 28 30 29  ..   -1,  /* (0)
161a0 20 69 6e 70 75 74 20 3a 3a 3d 20 65 78 70 72 20   input ::= expr 
161b0 2a 2f 0d 0a 20 20 20 2d 34 2c 20 20 2f 2a 20 28  */..   -4,  /* (
161c0 31 29 20 63 6f 6c 73 65 74 20 3a 3a 3d 20 4d 49  1) colset ::= MI
161d0 4e 55 53 20 4c 43 50 20 63 6f 6c 73 65 74 6c 69  NUS LCP colsetli
161e0 73 74 20 52 43 50 20 2a 2f 0d 0a 20 20 20 2d 33  st RCP */..   -3
161f0 2c 20 20 2f 2a 20 28 32 29 20 63 6f 6c 73 65 74  ,  /* (2) colset
16200 20 3a 3a 3d 20 4c 43 50 20 63 6f 6c 73 65 74 6c   ::= LCP colsetl
16210 69 73 74 20 52 43 50 20 2a 2f 0d 0a 20 20 20 2d  ist RCP */..   -
16220 31 2c 20 20 2f 2a 20 28 33 29 20 63 6f 6c 73 65  1,  /* (3) colse
16230 74 20 3a 3a 3d 20 53 54 52 49 4e 47 20 2a 2f 0d  t ::= STRING */.
16240 0a 20 20 20 2d 32 2c 20 20 2f 2a 20 28 34 29 20  .   -2,  /* (4) 
16250 63 6f 6c 73 65 74 20 3a 3a 3d 20 4d 49 4e 55 53  colset ::= MINUS
16260 20 53 54 52 49 4e 47 20 2a 2f 0d 0a 20 20 20 2d   STRING */..   -
16270 32 2c 20 20 2f 2a 20 28 35 29 20 63 6f 6c 73 65  2,  /* (5) colse
16280 74 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 73 65 74  tlist ::= colset
16290 6c 69 73 74 20 53 54 52 49 4e 47 20 2a 2f 0d 0a  list STRING */..
162a0 20 20 20 2d 31 2c 20 20 2f 2a 20 28 36 29 20 63     -1,  /* (6) c
162b0 6f 6c 73 65 74 6c 69 73 74 20 3a 3a 3d 20 53 54  olsetlist ::= ST
162c0 52 49 4e 47 20 2a 2f 0d 0a 20 20 20 2d 33 2c 20  RING */..   -3, 
162d0 20 2f 2a 20 28 37 29 20 65 78 70 72 20 3a 3a 3d   /* (7) expr ::=
162e0 20 65 78 70 72 20 41 4e 44 20 65 78 70 72 20 2a   expr AND expr *
162f0 2f 0d 0a 20 20 20 2d 33 2c 20 20 2f 2a 20 28 38  /..   -3,  /* (8
16300 29 20 65 78 70 72 20 3a 3a 3d 20 65 78 70 72 20  ) expr ::= expr 
16310 4f 52 20 65 78 70 72 20 2a 2f 0d 0a 20 20 20 2d  OR expr */..   -
16320 33 2c 20 20 2f 2a 20 28 39 29 20 65 78 70 72 20  3,  /* (9) expr 
16330 3a 3a 3d 20 65 78 70 72 20 4e 4f 54 20 65 78 70  ::= expr NOT exp
16340 72 20 2a 2f 0d 0a 20 20 20 2d 35 2c 20 20 2f 2a  r */..   -5,  /*
16350 20 28 31 30 29 20 65 78 70 72 20 3a 3a 3d 20 63   (10) expr ::= c
16360 6f 6c 73 65 74 20 43 4f 4c 4f 4e 20 4c 50 20 65  olset COLON LP e
16370 78 70 72 20 52 50 20 2a 2f 0d 0a 20 20 20 2d 33  xpr RP */..   -3
16380 2c 20 20 2f 2a 20 28 31 31 29 20 65 78 70 72 20  ,  /* (11) expr 
16390 3a 3a 3d 20 4c 50 20 65 78 70 72 20 52 50 20 2a  ::= LP expr RP *
163a0 2f 0d 0a 20 20 20 2d 31 2c 20 20 2f 2a 20 28 31  /..   -1,  /* (1
163b0 32 29 20 65 78 70 72 20 3a 3a 3d 20 65 78 70 72  2) expr ::= expr
163c0 6c 69 73 74 20 2a 2f 0d 0a 20 20 20 2d 31 2c 20  list */..   -1, 
163d0 20 2f 2a 20 28 31 33 29 20 65 78 70 72 6c 69 73   /* (13) exprlis
163e0 74 20 3a 3a 3d 20 63 6e 65 61 72 73 65 74 20 2a  t ::= cnearset *
163f0 2f 0d 0a 20 20 20 2d 32 2c 20 20 2f 2a 20 28 31  /..   -2,  /* (1
16400 34 29 20 65 78 70 72 6c 69 73 74 20 3a 3a 3d 20  4) exprlist ::= 
16410 65 78 70 72 6c 69 73 74 20 63 6e 65 61 72 73 65  exprlist cnearse
16420 74 20 2a 2f 0d 0a 20 20 20 2d 31 2c 20 20 2f 2a  t */..   -1,  /*
16430 20 28 31 35 29 20 63 6e 65 61 72 73 65 74 20 3a   (15) cnearset :
16440 3a 3d 20 6e 65 61 72 73 65 74 20 2a 2f 0d 0a 20  := nearset */.. 
16450 20 20 2d 33 2c 20 20 2f 2a 20 28 31 36 29 20 63    -3,  /* (16) c
16460 6e 65 61 72 73 65 74 20 3a 3a 3d 20 63 6f 6c 73  nearset ::= cols
16470 65 74 20 43 4f 4c 4f 4e 20 6e 65 61 72 73 65 74  et COLON nearset
16480 20 2a 2f 0d 0a 20 20 20 2d 31 2c 20 20 2f 2a 20   */..   -1,  /* 
16490 28 31 37 29 20 6e 65 61 72 73 65 74 20 3a 3a 3d  (17) nearset ::=
164a0 20 70 68 72 61 73 65 20 2a 2f 0d 0a 20 20 20 2d   phrase */..   -
164b0 32 2c 20 20 2f 2a 20 28 31 38 29 20 6e 65 61 72  2,  /* (18) near
164c0 73 65 74 20 3a 3a 3d 20 43 41 52 45 54 20 70 68  set ::= CARET ph
164d0 72 61 73 65 20 2a 2f 0d 0a 20 20 20 2d 35 2c 20  rase */..   -5, 
164e0 20 2f 2a 20 28 31 39 29 20 6e 65 61 72 73 65 74   /* (19) nearset
164f0 20 3a 3a 3d 20 53 54 52 49 4e 47 20 4c 50 20 6e   ::= STRING LP n
16500 65 61 72 70 68 72 61 73 65 73 20 6e 65 61 72 64  earphrases neard
16510 69 73 74 5f 6f 70 74 20 52 50 20 2a 2f 0d 0a 20  ist_opt RP */.. 
16520 20 20 2d 31 2c 20 20 2f 2a 20 28 32 30 29 20 6e    -1,  /* (20) n
16530 65 61 72 70 68 72 61 73 65 73 20 3a 3a 3d 20 70  earphrases ::= p
16540 68 72 61 73 65 20 2a 2f 0d 0a 20 20 20 2d 32 2c  hrase */..   -2,
16550 20 20 2f 2a 20 28 32 31 29 20 6e 65 61 72 70 68    /* (21) nearph
16560 72 61 73 65 73 20 3a 3a 3d 20 6e 65 61 72 70 68  rases ::= nearph
16570 72 61 73 65 73 20 70 68 72 61 73 65 20 2a 2f 0d  rases phrase */.
16580 0a 20 20 20 20 30 2c 20 20 2f 2a 20 28 32 32 29  .    0,  /* (22)
16590 20 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 3a 3a   neardist_opt ::
165a0 3d 20 2a 2f 0d 0a 20 20 20 2d 32 2c 20 20 2f 2a  = */..   -2,  /*
165b0 20 28 32 33 29 20 6e 65 61 72 64 69 73 74 5f 6f   (23) neardist_o
165c0 70 74 20 3a 3a 3d 20 43 4f 4d 4d 41 20 53 54 52  pt ::= COMMA STR
165d0 49 4e 47 20 2a 2f 0d 0a 20 20 20 2d 34 2c 20 20  ING */..   -4,  
165e0 2f 2a 20 28 32 34 29 20 70 68 72 61 73 65 20 3a  /* (24) phrase :
165f0 3a 3d 20 70 68 72 61 73 65 20 50 4c 55 53 20 53  := phrase PLUS S
16600 54 52 49 4e 47 20 73 74 61 72 5f 6f 70 74 20 2a  TRING star_opt *
16610 2f 0d 0a 20 20 20 2d 32 2c 20 20 2f 2a 20 28 32  /..   -2,  /* (2
16620 35 29 20 70 68 72 61 73 65 20 3a 3a 3d 20 53 54  5) phrase ::= ST
16630 52 49 4e 47 20 73 74 61 72 5f 6f 70 74 20 2a 2f  RING star_opt */
16640 0d 0a 20 20 20 2d 31 2c 20 20 2f 2a 20 28 32 36  ..   -1,  /* (26
16650 29 20 73 74 61 72 5f 6f 70 74 20 3a 3a 3d 20 53  ) star_opt ::= S
16660 54 41 52 20 2a 2f 0d 0a 20 20 20 20 30 2c 20 20  TAR */..    0,  
16670 2f 2a 20 28 32 37 29 20 73 74 61 72 5f 6f 70 74  /* (27) star_opt
16680 20 3a 3a 3d 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 73   ::= */..};....s
16690 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 79  tatic void fts5y
166a0 79 5f 61 63 63 65 70 74 28 66 74 73 35 79 79 50  y_accept(fts5yyP
166b0 61 72 73 65 72 2a 29 3b 20 20 2f 2a 20 46 6f 72  arser*);  /* For
166c0 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
166d0 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 65   */..../*..** Pe
166e0 72 66 6f 72 6d 20 61 20 72 65 64 75 63 65 20 61  rform a reduce a
166f0 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 73 68  ction and the sh
16700 69 66 74 20 74 68 61 74 20 6d 75 73 74 20 69 6d  ift that must im
16710 6d 65 64 69 61 74 65 6c 79 0d 0a 2a 2a 20 66 6f  mediately..** fo
16720 6c 6c 6f 77 20 74 68 65 20 72 65 64 75 63 65 2e  llow the reduce.
16730 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 74 73  ..**..** The fts
16740 35 79 79 4c 6f 6f 6b 61 68 65 61 64 20 61 6e 64  5yyLookahead and
16750 20 66 74 73 35 79 79 4c 6f 6f 6b 61 68 65 61 64   fts5yyLookahead
16760 54 6f 6b 65 6e 20 70 61 72 61 6d 65 74 65 72 73  Token parameters
16770 20 70 72 6f 76 69 64 65 20 72 65 64 75 63 65 20   provide reduce 
16780 61 63 74 69 6f 6e 73 0d 0a 2a 2a 20 61 63 63 65  actions..** acce
16790 73 73 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68  ss to the lookah
167a0 65 61 64 20 74 6f 6b 65 6e 20 28 69 66 20 61 6e  ead token (if an
167b0 79 29 2e 20 20 54 68 65 20 66 74 73 35 79 79 4c  y).  The fts5yyL
167c0 6f 6f 6b 61 68 65 61 64 20 77 69 6c 6c 20 62 65  ookahead will be
167d0 20 66 74 73 35 59 59 4e 4f 43 4f 44 45 0d 0a 2a   fts5YYNOCODE..*
167e0 2a 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65  * if the lookahe
167f0 61 64 20 74 6f 6b 65 6e 20 68 61 73 20 61 6c 72  ad token has alr
16800 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 75 6d  eady been consum
16810 65 64 2e 20 20 41 73 20 74 68 69 73 20 70 72 6f  ed.  As this pro
16820 63 65 64 75 72 65 20 69 73 0d 0a 2a 2a 20 6f 6e  cedure is..** on
16830 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 6f  ly called from o
16840 6e 65 20 70 6c 61 63 65 2c 20 6f 70 74 69 6d 69  ne place, optimi
16850 7a 69 6e 67 20 63 6f 6d 70 69 6c 65 72 73 20 77  zing compilers w
16860 69 6c 6c 20 69 6e 2d 6c 69 6e 65 20 69 74 2c 20  ill in-line it, 
16870 77 68 69 63 68 0d 0a 2a 2a 20 6d 65 61 6e 73 20  which..** means 
16880 74 68 61 74 20 74 68 65 20 65 78 74 72 61 20 70  that the extra p
16890 61 72 61 6d 65 74 65 72 73 20 68 61 76 65 20 6e  arameters have n
168a0 6f 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  o performance im
168b0 70 61 63 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  pact...*/..stati
168c0 63 20 66 74 73 35 59 59 41 43 54 49 4f 4e 54 59  c fts5YYACTIONTY
168d0 50 45 20 66 74 73 35 79 79 5f 72 65 64 75 63 65  PE fts5yy_reduce
168e0 28 0d 0a 20 20 66 74 73 35 79 79 50 61 72 73 65  (..  fts5yyParse
168f0 72 20 2a 66 74 73 35 79 79 70 50 61 72 73 65 72  r *fts5yypParser
16900 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
16910 20 70 61 72 73 65 72 20 2a 2f 0d 0a 20 20 75 6e   parser */..  un
16920 73 69 67 6e 65 64 20 69 6e 74 20 66 74 73 35 79  signed int fts5y
16930 79 72 75 6c 65 6e 6f 2c 20 20 20 20 20 20 20 2f  yruleno,       /
16940 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
16950 72 75 6c 65 20 62 79 20 77 68 69 63 68 20 74 6f  rule by which to
16960 20 72 65 64 75 63 65 20 2a 2f 0d 0a 20 20 69 6e   reduce */..  in
16970 74 20 66 74 73 35 79 79 4c 6f 6f 6b 61 68 65 61  t fts5yyLookahea
16980 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d,             /
16990 2a 20 4c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65  * Lookahead toke
169a0 6e 2c 20 6f 72 20 66 74 73 35 59 59 4e 4f 43 4f  n, or fts5YYNOCO
169b0 44 45 20 69 66 20 6e 6f 6e 65 20 2a 2f 0d 0a 20  DE if none */.. 
169c0 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
169d0 65 72 46 54 53 35 54 4f 4b 45 4e 54 59 50 45 20  erFTS5TOKENTYPE 
169e0 66 74 73 35 79 79 4c 6f 6f 6b 61 68 65 61 64 54  fts5yyLookaheadT
169f0 6f 6b 65 6e 20 20 2f 2a 20 56 61 6c 75 65 20 6f  oken  /* Value o
16a00 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
16a10 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 73 71 6c 69  token */..  sqli
16a20 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54 58  te3Fts5ParserCTX
16a30 5f 50 44 45 43 4c 20 20 20 20 20 20 20 20 20 20  _PDECL          
16a40 20 20 20 20 20 20 20 20 20 2f 2a 20 25 65 78 74           /* %ext
16a50 72 61 5f 63 6f 6e 74 65 78 74 20 2a 2f 0d 0a 29  ra_context */..)
16a60 7b 0d 0a 20 20 69 6e 74 20 66 74 73 35 79 79 67  {..  int fts5yyg
16a70 6f 74 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  oto;            
16a80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16a90 6e 65 78 74 20 73 74 61 74 65 20 2a 2f 0d 0a 20  next state */.. 
16aa0 20 66 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50   fts5YYACTIONTYP
16ab0 45 20 66 74 73 35 79 79 61 63 74 3b 20 20 20 20  E fts5yyact;    
16ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16ad0 6e 65 78 74 20 61 63 74 69 6f 6e 20 2a 2f 0d 0a  next action */..
16ae0 20 20 66 74 73 35 79 79 53 74 61 63 6b 45 6e 74    fts5yyStackEnt
16af0 72 79 20 2a 66 74 73 35 79 79 6d 73 70 3b 20 20  ry *fts5yymsp;  
16b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16b10 20 74 6f 70 20 6f 66 20 74 68 65 20 70 61 72 73   top of the pars
16b20 65 72 27 73 20 73 74 61 63 6b 20 2a 2f 0d 0a 20  er's stack */.. 
16b30 20 69 6e 74 20 66 74 73 35 79 79 73 69 7a 65 3b   int fts5yysize;
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b50 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 74       /* Amount t
16b60 6f 20 70 6f 70 20 74 68 65 20 73 74 61 63 6b 20  o pop the stack 
16b70 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73  */..  sqlite3Fts
16b80 35 50 61 72 73 65 72 41 52 47 5f 46 45 54 43 48  5ParserARG_FETCH
16b90 0d 0a 20 20 28 76 6f 69 64 29 66 74 73 35 79 79  ..  (void)fts5yy
16ba0 4c 6f 6f 6b 61 68 65 61 64 3b 0d 0a 20 20 28 76  Lookahead;..  (v
16bb0 6f 69 64 29 66 74 73 35 79 79 4c 6f 6f 6b 61 68  oid)fts5yyLookah
16bc0 65 61 64 54 6f 6b 65 6e 3b 0d 0a 20 20 66 74 73  eadToken;..  fts
16bd0 35 79 79 6d 73 70 20 3d 20 66 74 73 35 79 79 70  5yymsp = fts5yyp
16be0 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f  Parser->fts5yyto
16bf0 73 3b 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  s;..#ifndef NDEB
16c00 55 47 0d 0a 20 20 69 66 28 20 66 74 73 35 79 79  UG..  if( fts5yy
16c10 54 72 61 63 65 46 49 4c 45 20 26 26 20 66 74 73  TraceFILE && fts
16c20 35 79 79 72 75 6c 65 6e 6f 3c 28 69 6e 74 29 28  5yyruleno<(int)(
16c30 73 69 7a 65 6f 66 28 66 74 73 35 79 79 52 75 6c  sizeof(fts5yyRul
16c40 65 4e 61 6d 65 29 2f 73 69 7a 65 6f 66 28 66 74  eName)/sizeof(ft
16c50 73 35 79 79 52 75 6c 65 4e 61 6d 65 5b 30 5d 29  s5yyRuleName[0])
16c60 29 20 29 7b 0d 0a 20 20 20 20 66 74 73 35 79 79  ) ){..    fts5yy
16c70 73 69 7a 65 20 3d 20 66 74 73 35 79 79 52 75 6c  size = fts5yyRul
16c80 65 49 6e 66 6f 4e 52 68 73 5b 66 74 73 35 79 79  eInfoNRhs[fts5yy
16c90 72 75 6c 65 6e 6f 5d 3b 0d 0a 20 20 20 20 69 66  ruleno];..    if
16ca0 28 20 66 74 73 35 79 79 73 69 7a 65 20 29 7b 0d  ( fts5yysize ){.
16cb0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
16cc0 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 20  ts5yyTraceFILE, 
16cd0 22 25 73 52 65 64 75 63 65 20 25 64 20 5b 25 73  "%sReduce %d [%s
16ce0 5d 2c 20 67 6f 20 74 6f 20 73 74 61 74 65 20 25  ], go to state %
16cf0 64 2e 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20  d.\n",..        
16d00 66 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70  fts5yyTracePromp
16d10 74 2c 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35  t,..        fts5
16d20 79 79 72 75 6c 65 6e 6f 2c 20 66 74 73 35 79 79  yyruleno, fts5yy
16d30 52 75 6c 65 4e 61 6d 65 5b 66 74 73 35 79 79 72  RuleName[fts5yyr
16d40 75 6c 65 6e 6f 5d 2c 20 66 74 73 35 79 79 6d 73  uleno], fts5yyms
16d50 70 5b 66 74 73 35 79 79 73 69 7a 65 5d 2e 73 74  p[fts5yysize].st
16d60 61 74 65 6e 6f 29 3b 0d 0a 20 20 20 20 7d 65 6c  ateno);..    }el
16d70 73 65 7b 0d 0a 20 20 20 20 20 20 66 70 72 69 6e  se{..      fprin
16d80 74 66 28 66 74 73 35 79 79 54 72 61 63 65 46 49  tf(fts5yyTraceFI
16d90 4c 45 2c 20 22 25 73 52 65 64 75 63 65 20 25 64  LE, "%sReduce %d
16da0 20 5b 25 73 5d 2e 5c 6e 22 2c 0d 0a 20 20 20 20   [%s].\n",..    
16db0 20 20 20 20 66 74 73 35 79 79 54 72 61 63 65 50      fts5yyTraceP
16dc0 72 6f 6d 70 74 2c 20 66 74 73 35 79 79 72 75 6c  rompt, fts5yyrul
16dd0 65 6e 6f 2c 20 66 74 73 35 79 79 52 75 6c 65 4e  eno, fts5yyRuleN
16de0 61 6d 65 5b 66 74 73 35 79 79 72 75 6c 65 6e 6f  ame[fts5yyruleno
16df0 5d 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  ]);..    }..  }.
16e00 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
16e10 47 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 43 68 65  G */....  /* Che
16e20 63 6b 20 74 68 61 74 20 74 68 65 20 73 74 61 63  ck that the stac
16e30 6b 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  k is large enoug
16e40 68 20 74 6f 20 67 72 6f 77 20 62 79 20 61 20 73  h to grow by a s
16e50 69 6e 67 6c 65 20 65 6e 74 72 79 0d 0a 20 20 2a  ingle entry..  *
16e60 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
16e70 74 68 65 20 72 75 6c 65 20 69 73 20 65 6d 70 74  the rule is empt
16e80 79 2e 20 20 54 68 69 73 20 65 6e 73 75 72 65 73  y.  This ensures
16e90 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 72   that there is r
16ea0 6f 6f 6d 0d 0a 20 20 2a 2a 20 65 6e 6f 75 67 68  oom..  ** enough
16eb0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 74 6f   on the stack to
16ec0 20 70 75 73 68 20 74 68 65 20 4c 48 53 20 76 61   push the LHS va
16ed0 6c 75 65 20 2a 2f 0d 0a 20 20 69 66 28 20 66 74  lue */..  if( ft
16ee0 73 35 79 79 52 75 6c 65 49 6e 66 6f 4e 52 68 73  s5yyRuleInfoNRhs
16ef0 5b 66 74 73 35 79 79 72 75 6c 65 6e 6f 5d 3d 3d  [fts5yyruleno]==
16f00 30 20 29 7b 0d 0a 23 69 66 64 65 66 20 66 74 73  0 ){..#ifdef fts
16f10 35 59 59 54 52 41 43 4b 4d 41 58 53 54 41 43 4b  5YYTRACKMAXSTACK
16f20 44 45 50 54 48 0d 0a 20 20 20 20 69 66 28 20 28  DEPTH..    if( (
16f30 69 6e 74 29 28 66 74 73 35 79 79 70 50 61 72 73  int)(fts5yypPars
16f40 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 20 2d 20  er->fts5yytos - 
16f50 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
16f60 74 73 35 79 79 73 74 61 63 6b 29 3e 66 74 73 35  ts5yystack)>fts5
16f70 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
16f80 79 68 77 6d 20 29 7b 0d 0a 20 20 20 20 20 20 66  yhwm ){..      f
16f90 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
16fa0 73 35 79 79 68 77 6d 2b 2b 3b 0d 0a 20 20 20 20  s5yyhwm++;..    
16fb0 20 20 61 73 73 65 72 74 28 20 66 74 73 35 79 79    assert( fts5yy
16fc0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 68  pParser->fts5yyh
16fd0 77 6d 20 3d 3d 20 28 69 6e 74 29 28 66 74 73 35  wm == (int)(fts5
16fe0 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
16ff0 79 74 6f 73 20 2d 20 66 74 73 35 79 79 70 50 61  ytos - fts5yypPa
17000 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63  rser->fts5yystac
17010 6b 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e  k));..    }..#en
17020 64 69 66 0d 0a 23 69 66 20 66 74 73 35 59 59 53  dif..#if fts5YYS
17030 54 41 43 4b 44 45 50 54 48 3e 30 20 0d 0a 20 20  TACKDEPTH>0 ..  
17040 20 20 69 66 28 20 66 74 73 35 79 79 70 50 61 72    if( fts5yypPar
17050 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 3e 3d  ser->fts5yytos>=
17060 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
17070 74 73 35 79 79 73 74 61 63 6b 45 6e 64 20 29 7b  ts5yystackEnd ){
17080 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79 53 74  ..      fts5yySt
17090 61 63 6b 4f 76 65 72 66 6c 6f 77 28 66 74 73 35  ackOverflow(fts5
170a0 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 20 20 20  yypParser);..   
170b0 20 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 74     /* The call t
170c0 6f 20 66 74 73 35 79 79 53 74 61 63 6b 4f 76 65  o fts5yyStackOve
170d0 72 66 6c 6f 77 28 29 20 61 62 6f 76 65 20 70 6f  rflow() above po
170e0 70 73 20 74 68 65 20 73 74 61 63 6b 20 75 6e 74  ps the stack unt
170f0 69 6c 20 69 74 20 69 73 0d 0a 20 20 20 20 20 20  il it is..      
17100 2a 2a 20 65 6d 70 74 79 2c 20 63 61 75 73 69 6e  ** empty, causin
17110 67 20 74 68 65 20 6d 61 69 6e 20 70 61 72 73 65  g the main parse
17120 72 20 6c 6f 6f 70 20 74 6f 20 65 78 69 74 2e 20  r loop to exit. 
17130 20 53 6f 20 74 68 65 20 72 65 74 75 72 6e 20 76   So the return v
17140 61 6c 75 65 0d 0a 20 20 20 20 20 20 2a 2a 20 69  alue..      ** i
17150 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 6e 64  s never used and
17160 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
17170 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 72 65 74 75  . */..      retu
17180 72 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65  rn 0;..    }..#e
17190 6c 73 65 0d 0a 20 20 20 20 69 66 28 20 66 74 73  lse..    if( fts
171a0 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
171b0 79 79 74 6f 73 3e 3d 26 66 74 73 35 79 79 70 50  yytos>=&fts5yypP
171c0 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61  arser->fts5yysta
171d0 63 6b 5b 66 74 73 35 79 79 70 50 61 72 73 65 72  ck[fts5yypParser
171e0 2d 3e 66 74 73 35 79 79 73 74 6b 73 7a 2d 31 5d  ->fts5yystksz-1]
171f0 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 66   ){..      if( f
17200 74 73 35 79 79 47 72 6f 77 53 74 61 63 6b 28 66  ts5yyGrowStack(f
17210 74 73 35 79 79 70 50 61 72 73 65 72 29 20 29 7b  ts5yypParser) ){
17220 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35 79 79  ..        fts5yy
17230 53 74 61 63 6b 4f 76 65 72 66 6c 6f 77 28 66 74  StackOverflow(ft
17240 73 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 20  s5yypParser);.. 
17250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 61         /* The ca
17260 6c 6c 20 74 6f 20 66 74 73 35 79 79 53 74 61 63  ll to fts5yyStac
17270 6b 4f 76 65 72 66 6c 6f 77 28 29 20 61 62 6f 76  kOverflow() abov
17280 65 20 70 6f 70 73 20 74 68 65 20 73 74 61 63 6b  e pops the stack
17290 20 75 6e 74 69 6c 20 69 74 20 69 73 0d 0a 20 20   until it is..  
172a0 20 20 20 20 20 20 2a 2a 20 65 6d 70 74 79 2c 20        ** empty, 
172b0 63 61 75 73 69 6e 67 20 74 68 65 20 6d 61 69 6e  causing the main
172c0 20 70 61 72 73 65 72 20 6c 6f 6f 70 20 74 6f 20   parser loop to 
172d0 65 78 69 74 2e 20 20 53 6f 20 74 68 65 20 72 65  exit.  So the re
172e0 74 75 72 6e 20 76 61 6c 75 65 0d 0a 20 20 20 20  turn value..    
172f0 20 20 20 20 2a 2a 20 69 73 20 6e 65 76 65 72 20      ** is never 
17300 75 73 65 64 20 61 6e 64 20 64 6f 65 73 20 6e 6f  used and does no
17310 74 20 6d 61 74 74 65 72 2e 20 2a 2f 0d 0a 20 20  t matter. */..  
17320 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d        return 0;.
17330 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
17340 66 74 73 35 79 79 6d 73 70 20 3d 20 66 74 73 35  fts5yymsp = fts5
17350 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
17360 79 74 6f 73 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65  ytos;..    }..#e
17370 6e 64 69 66 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 73  ndif..  }....  s
17380 77 69 74 63 68 28 20 66 74 73 35 79 79 72 75 6c  witch( fts5yyrul
17390 65 6e 6f 20 29 7b 0d 0a 20 20 2f 2a 20 42 65 67  eno ){..  /* Beg
173a0 69 6e 6e 69 6e 67 20 68 65 72 65 20 61 72 65 20  inning here are 
173b0 74 68 65 20 72 65 64 75 63 74 69 6f 6e 20 63 61  the reduction ca
173c0 73 65 73 2e 20 20 41 20 74 79 70 69 63 61 6c 20  ses.  A typical 
173d0 65 78 61 6d 70 6c 65 0d 0a 20 20 2a 2a 20 66 6f  example..  ** fo
173e0 6c 6c 6f 77 73 3a 0d 0a 20 20 2a 2a 20 20 20 63  llows:..  **   c
173f0 61 73 65 20 30 3a 0d 0a 20 20 2a 2a 20 20 23 6c  ase 0:..  **  #l
17400 69 6e 65 20 3c 6c 69 6e 65 6e 6f 3e 20 3c 67 72  ine <lineno> <gr
17410 61 6d 6d 61 72 66 69 6c 65 3e 0d 0a 20 20 2a 2a  ammarfile>..  **
17420 20 20 20 20 20 7b 20 2e 2e 2e 20 7d 20 20 20 20       { ... }    
17430 20 20 20 20 20 20 20 2f 2f 20 55 73 65 72 20 73         // User s
17440 75 70 70 6c 69 65 64 20 63 6f 64 65 0d 0a 20 20  upplied code..  
17450 2a 2a 20 20 23 6c 69 6e 65 20 3c 6c 69 6e 65 6e  **  #line <linen
17460 6f 3e 20 3c 74 68 69 73 66 69 6c 65 3e 0d 0a 20  o> <thisfile>.. 
17470 20 2a 2a 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a   **     break;..
17480 20 20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    */../*********
17490 2a 20 42 65 67 69 6e 20 72 65 64 75 63 65 20 61  * Begin reduce a
174a0 63 74 69 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ctions *********
174b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
174c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
174d0 2a 2a 2a 2a 2a 2f 0d 0a 20 20 20 20 20 20 20 20  *****/..        
174e0 66 74 73 35 59 59 4d 49 4e 4f 52 54 59 50 45 20  fts5YYMINORTYPE 
174f0 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 3b 0d  fts5yylhsminor;.
17500 0a 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 2f  .      case 0: /
17510 2a 20 69 6e 70 75 74 20 3a 3a 3d 20 65 78 70 72  * input ::= expr
17520 20 2a 2f 0d 0a 23 6c 69 6e 65 20 38 32 20 22 66   */..#line 82 "f
17530 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 73  ts5parse.y"..{ s
17540 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46  qlite3Fts5ParseF
17550 69 6e 69 73 68 65 64 28 70 50 61 72 73 65 2c 20  inished(pParse, 
17560 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e  fts5yymsp[0].min
17570 6f 72 2e 66 74 73 35 79 79 32 34 29 3b 20 7d 0d  or.fts5yy24); }.
17580 0a 23 6c 69 6e 65 20 31 30 34 39 20 22 66 74 73  .#line 1049 "fts
17590 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 20 20 20  5parse.c"..     
175a0 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
175b0 20 63 61 73 65 20 31 3a 20 2f 2a 20 63 6f 6c 73   case 1: /* cols
175c0 65 74 20 3a 3a 3d 20 4d 49 4e 55 53 20 4c 43 50  et ::= MINUS LCP
175d0 20 63 6f 6c 73 65 74 6c 69 73 74 20 52 43 50 20   colsetlist RCP 
175e0 2a 2f 0d 0a 23 6c 69 6e 65 20 39 37 20 22 66 74  */..#line 97 "ft
175f0 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 0d 0a  s5parse.y"..{ ..
17600 20 20 20 20 66 74 73 35 79 79 6d 73 70 5b 2d 33      fts5yymsp[-3
17610 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31  ].minor.fts5yy11
17620 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   = sqlite3Fts5Pa
17630 72 73 65 43 6f 6c 73 65 74 49 6e 76 65 72 74 28  rseColsetInvert(
17640 70 50 61 72 73 65 2c 20 66 74 73 35 79 79 6d 73  pParse, fts5yyms
17650 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  p[-1].minor.fts5
17660 79 79 31 31 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65  yy11);..}..#line
17670 20 31 30 35 36 20 22 66 74 73 35 70 61 72 73 65   1056 "fts5parse
17680 2e 63 22 0d 0a 20 20 20 20 20 20 20 20 62 72 65  .c"..        bre
17690 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
176a0 32 3a 20 2f 2a 20 63 6f 6c 73 65 74 20 3a 3a 3d  2: /* colset ::=
176b0 20 4c 43 50 20 63 6f 6c 73 65 74 6c 69 73 74 20   LCP colsetlist 
176c0 52 43 50 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 30  RCP */..#line 10
176d0 30 20 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d  0 "fts5parse.y".
176e0 0a 7b 20 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d  .{ fts5yymsp[-2]
176f0 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 20  .minor.fts5yy11 
17700 3d 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e  = fts5yymsp[-1].
17710 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 3b 20  minor.fts5yy11; 
17720 7d 0d 0a 23 6c 69 6e 65 20 31 30 36 31 20 22 66  }..#line 1061 "f
17730 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 20  ts5parse.c"..   
17740 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
17750 20 20 20 63 61 73 65 20 33 3a 20 2f 2a 20 63 6f     case 3: /* co
17760 6c 73 65 74 20 3a 3a 3d 20 53 54 52 49 4e 47 20  lset ::= STRING 
17770 2a 2f 0d 0a 23 6c 69 6e 65 20 31 30 31 20 22 66  */..#line 101 "f
17780 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 0d 0a  ts5parse.y"..{..
17790 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72    fts5yylhsminor
177a0 2e 66 74 73 35 79 79 31 31 20 3d 20 73 71 6c 69  .fts5yy11 = sqli
177b0 74 65 33 46 74 73 35 50 61 72 73 65 43 6f 6c 73  te3Fts5ParseCols
177c0 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 26 66  et(pParse, 0, &f
177d0 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f  ts5yymsp[0].mino
177e0 72 2e 66 74 73 35 79 79 30 29 3b 0d 0a 7d 0d 0a  r.fts5yy0);..}..
177f0 23 6c 69 6e 65 20 31 30 36 38 20 22 66 74 73 35  #line 1068 "fts5
17800 70 61 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35  parse.c"..  fts5
17810 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66  yymsp[0].minor.f
17820 74 73 35 79 79 31 31 20 3d 20 66 74 73 35 79 79  ts5yy11 = fts5yy
17830 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31  lhsminor.fts5yy1
17840 31 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  1;..        brea
17850 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 34  k;..      case 4
17860 3a 20 2f 2a 20 63 6f 6c 73 65 74 20 3a 3a 3d 20  : /* colset ::= 
17870 4d 49 4e 55 53 20 53 54 52 49 4e 47 20 2a 2f 0d  MINUS STRING */.
17880 0a 23 6c 69 6e 65 20 31 30 34 20 22 66 74 73 35  .#line 104 "fts5
17890 70 61 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66  parse.y"..{..  f
178a0 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e  ts5yymsp[-1].min
178b0 6f 72 2e 66 74 73 35 79 79 31 31 20 3d 20 73 71  or.fts5yy11 = sq
178c0 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43 6f  lite3Fts5ParseCo
178d0 6c 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lset(pParse, 0, 
178e0 26 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69  &fts5yymsp[0].mi
178f0 6e 6f 72 2e 66 74 73 35 79 79 30 29 3b 0d 0a 20  nor.fts5yy0);.. 
17900 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d   fts5yymsp[-1].m
17910 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 20 3d 20  inor.fts5yy11 = 
17920 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
17930 43 6f 6c 73 65 74 49 6e 76 65 72 74 28 70 50 61  ColsetInvert(pPa
17940 72 73 65 2c 20 66 74 73 35 79 79 6d 73 70 5b 2d  rse, fts5yymsp[-
17950 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31  1].minor.fts5yy1
17960 31 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 30  1);..}..#line 10
17970 37 37 20 22 66 74 73 35 70 61 72 73 65 2e 63 22  77 "fts5parse.c"
17980 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
17990 0d 0a 20 20 20 20 20 20 63 61 73 65 20 35 3a 20  ..      case 5: 
179a0 2f 2a 20 63 6f 6c 73 65 74 6c 69 73 74 20 3a 3a  /* colsetlist ::
179b0 3d 20 63 6f 6c 73 65 74 6c 69 73 74 20 53 54 52  = colsetlist STR
179c0 49 4e 47 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 30  ING */..#line 10
179d0 39 20 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d  9 "fts5parse.y".
179e0 0a 7b 20 0d 0a 20 20 66 74 73 35 79 79 6c 68 73  .{ ..  fts5yylhs
179f0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 20 3d  minor.fts5yy11 =
17a00 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
17a10 65 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20  eColset(pParse, 
17a20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69  fts5yymsp[-1].mi
17a30 6e 6f 72 2e 66 74 73 35 79 79 31 31 2c 20 26 66  nor.fts5yy11, &f
17a40 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f  ts5yymsp[0].mino
17a50 72 2e 66 74 73 35 79 79 30 29 3b 20 7d 0d 0a 23  r.fts5yy0); }..#
17a60 6c 69 6e 65 20 31 30 38 33 20 22 66 74 73 35 70  line 1083 "fts5p
17a70 61 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35 79  arse.c"..  fts5y
17a80 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66  ymsp[-1].minor.f
17a90 74 73 35 79 79 31 31 20 3d 20 66 74 73 35 79 79  ts5yy11 = fts5yy
17aa0 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31  lhsminor.fts5yy1
17ab0 31 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  1;..        brea
17ac0 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 36  k;..      case 6
17ad0 3a 20 2f 2a 20 63 6f 6c 73 65 74 6c 69 73 74 20  : /* colsetlist 
17ae0 3a 3a 3d 20 53 54 52 49 4e 47 20 2a 2f 0d 0a 23  ::= STRING */..#
17af0 6c 69 6e 65 20 31 31 31 20 22 66 74 73 35 70 61  line 111 "fts5pa
17b00 72 73 65 2e 79 22 0d 0a 7b 20 0d 0a 20 20 66 74  rse.y"..{ ..  ft
17b10 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
17b20 35 79 79 31 31 20 3d 20 73 71 6c 69 74 65 33 46  5yy11 = sqlite3F
17b30 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28 70  ts5ParseColset(p
17b40 50 61 72 73 65 2c 20 30 2c 20 26 66 74 73 35 79  Parse, 0, &fts5y
17b50 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74  ymsp[0].minor.ft
17b60 73 35 79 79 30 29 3b 20 0d 0a 7d 0d 0a 23 6c 69  s5yy0); ..}..#li
17b70 6e 65 20 31 30 39 31 20 22 66 74 73 35 70 61 72  ne 1091 "fts5par
17b80 73 65 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d  se.c"..  fts5yym
17b90 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  sp[0].minor.fts5
17ba0 79 79 31 31 20 3d 20 66 74 73 35 79 79 6c 68 73  yy11 = fts5yylhs
17bb0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 3b 0d  minor.fts5yy11;.
17bc0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
17bd0 0a 20 20 20 20 20 20 63 61 73 65 20 37 3a 20 2f  .      case 7: /
17be0 2a 20 65 78 70 72 20 3a 3a 3d 20 65 78 70 72 20  * expr ::= expr 
17bf0 41 4e 44 20 65 78 70 72 20 2a 2f 0d 0a 23 6c 69  AND expr */..#li
17c00 6e 65 20 31 31 35 20 22 66 74 73 35 70 61 72 73  ne 115 "fts5pars
17c10 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66 74 73 35 79  e.y"..{..  fts5y
17c20 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79  ylhsminor.fts5yy
17c30 32 34 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  24 = sqlite3Fts5
17c40 50 61 72 73 65 4e 6f 64 65 28 70 50 61 72 73 65  ParseNode(pParse
17c50 2c 20 46 54 53 35 5f 41 4e 44 2c 20 66 74 73 35  , FTS5_AND, fts5
17c60 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e  yymsp[-2].minor.
17c70 66 74 73 35 79 79 32 34 2c 20 66 74 73 35 79 79  fts5yy24, fts5yy
17c80 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73  msp[0].minor.fts
17c90 35 79 79 32 34 2c 20 30 29 3b 0d 0a 7d 0d 0a 23  5yy24, 0);..}..#
17ca0 6c 69 6e 65 20 31 30 39 39 20 22 66 74 73 35 70  line 1099 "fts5p
17cb0 61 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35 79  arse.c"..  fts5y
17cc0 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66  ymsp[-2].minor.f
17cd0 74 73 35 79 79 32 34 20 3d 20 66 74 73 35 79 79  ts5yy24 = fts5yy
17ce0 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32  lhsminor.fts5yy2
17cf0 34 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  4;..        brea
17d00 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 38  k;..      case 8
17d10 3a 20 2f 2a 20 65 78 70 72 20 3a 3a 3d 20 65 78  : /* expr ::= ex
17d20 70 72 20 4f 52 20 65 78 70 72 20 2a 2f 0d 0a 23  pr OR expr */..#
17d30 6c 69 6e 65 20 31 31 38 20 22 66 74 73 35 70 61  line 118 "fts5pa
17d40 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66 74 73  rse.y"..{..  fts
17d50 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
17d60 79 79 32 34 20 3d 20 73 71 6c 69 74 65 33 46 74  yy24 = sqlite3Ft
17d70 73 35 50 61 72 73 65 4e 6f 64 65 28 70 50 61 72  s5ParseNode(pPar
17d80 73 65 2c 20 46 54 53 35 5f 4f 52 2c 20 66 74 73  se, FTS5_OR, fts
17d90 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72  5yymsp[-2].minor
17da0 2e 66 74 73 35 79 79 32 34 2c 20 66 74 73 35 79  .fts5yy24, fts5y
17db0 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74  ymsp[0].minor.ft
17dc0 73 35 79 79 32 34 2c 20 30 29 3b 0d 0a 7d 0d 0a  s5yy24, 0);..}..
17dd0 23 6c 69 6e 65 20 31 31 30 37 20 22 66 74 73 35  #line 1107 "fts5
17de0 70 61 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35  parse.c"..  fts5
17df0 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e  yymsp[-2].minor.
17e00 66 74 73 35 79 79 32 34 20 3d 20 66 74 73 35 79  fts5yy24 = fts5y
17e10 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79  ylhsminor.fts5yy
17e20 32 34 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65  24;..        bre
17e30 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
17e40 39 3a 20 2f 2a 20 65 78 70 72 20 3a 3a 3d 20 65  9: /* expr ::= e
17e50 78 70 72 20 4e 4f 54 20 65 78 70 72 20 2a 2f 0d  xpr NOT expr */.
17e60 0a 23 6c 69 6e 65 20 31 32 31 20 22 66 74 73 35  .#line 121 "fts5
17e70 70 61 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66  parse.y"..{..  f
17e80 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74  ts5yylhsminor.ft
17e90 73 35 79 79 32 34 20 3d 20 73 71 6c 69 74 65 33  s5yy24 = sqlite3
17ea0 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28 70 50  Fts5ParseNode(pP
17eb0 61 72 73 65 2c 20 46 54 53 35 5f 4e 4f 54 2c 20  arse, FTS5_NOT, 
17ec0 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69  fts5yymsp[-2].mi
17ed0 6e 6f 72 2e 66 74 73 35 79 79 32 34 2c 20 66 74  nor.fts5yy24, ft
17ee0 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72  s5yymsp[0].minor
17ef0 2e 66 74 73 35 79 79 32 34 2c 20 30 29 3b 0d 0a  .fts5yy24, 0);..
17f00 7d 0d 0a 23 6c 69 6e 65 20 31 31 31 35 20 22 66  }..#line 1115 "f
17f10 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 66  ts5parse.c"..  f
17f20 74 73 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e  ts5yymsp[-2].min
17f30 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20 66 74  or.fts5yy24 = ft
17f40 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
17f50 35 79 79 32 34 3b 0d 0a 20 20 20 20 20 20 20 20  5yy24;..        
17f60 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61  break;..      ca
17f70 73 65 20 31 30 3a 20 2f 2a 20 65 78 70 72 20 3a  se 10: /* expr :
17f80 3a 3d 20 63 6f 6c 73 65 74 20 43 4f 4c 4f 4e 20  := colset COLON 
17f90 4c 50 20 65 78 70 72 20 52 50 20 2a 2f 0d 0a 23  LP expr RP */..#
17fa0 6c 69 6e 65 20 31 32 35 20 22 66 74 73 35 70 61  line 125 "fts5pa
17fb0 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 73 71 6c  rse.y"..{..  sql
17fc0 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74  ite3Fts5ParseSet
17fd0 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20 66  Colset(pParse, f
17fe0 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e  ts5yymsp[-1].min
17ff0 6f 72 2e 66 74 73 35 79 79 32 34 2c 20 66 74 73  or.fts5yy24, fts
18000 35 79 79 6d 73 70 5b 2d 34 5d 2e 6d 69 6e 6f 72  5yymsp[-4].minor
18010 2e 66 74 73 35 79 79 31 31 29 3b 0d 0a 20 20 66  .fts5yy11);..  f
18020 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74  ts5yylhsminor.ft
18030 73 35 79 79 32 34 20 3d 20 66 74 73 35 79 79 6d  s5yy24 = fts5yym
18040 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-1].minor.fts
18050 35 79 79 32 34 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65  5yy24;..}..#line
18060 20 31 31 32 34 20 22 66 74 73 35 70 61 72 73 65   1124 "fts5parse
18070 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70  .c"..  fts5yymsp
18080 5b 2d 34 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-4].minor.fts5y
18090 79 32 34 20 3d 20 66 74 73 35 79 79 6c 68 73 6d  y24 = fts5yylhsm
180a0 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b 0d 0a  inor.fts5yy24;..
180b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
180c0 20 20 20 20 20 20 63 61 73 65 20 31 31 3a 20 2f        case 11: /
180d0 2a 20 65 78 70 72 20 3a 3a 3d 20 4c 50 20 65 78  * expr ::= LP ex
180e0 70 72 20 52 50 20 2a 2f 0d 0a 23 6c 69 6e 65 20  pr RP */..#line 
180f0 31 32 39 20 22 66 74 73 35 70 61 72 73 65 2e 79  129 "fts5parse.y
18100 22 0d 0a 7b 66 74 73 35 79 79 6d 73 70 5b 2d 32  "..{fts5yymsp[-2
18110 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34  ].minor.fts5yy24
18120 20 3d 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d   = fts5yymsp[-1]
18130 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b  .minor.fts5yy24;
18140 7d 0d 0a 23 6c 69 6e 65 20 31 31 33 30 20 22 66  }..#line 1130 "f
18150 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 20  ts5parse.c"..   
18160 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
18170 20 20 20 63 61 73 65 20 31 32 3a 20 2f 2a 20 65     case 12: /* e
18180 78 70 72 20 3a 3a 3d 20 65 78 70 72 6c 69 73 74  xpr ::= exprlist
18190 20 2a 2f 0d 0a 20 20 20 20 20 20 63 61 73 65 20   */..      case 
181a0 31 33 3a 20 2f 2a 20 65 78 70 72 6c 69 73 74 20  13: /* exprlist 
181b0 3a 3a 3d 20 63 6e 65 61 72 73 65 74 20 2a 2f 20  ::= cnearset */ 
181c0 66 74 73 35 79 79 74 65 73 74 63 61 73 65 28 66  fts5yytestcase(f
181d0 74 73 35 79 79 72 75 6c 65 6e 6f 3d 3d 31 33 29  ts5yyruleno==13)
181e0 3b 0d 0a 23 6c 69 6e 65 20 31 33 30 20 22 66 74  ;..#line 130 "ft
181f0 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 66 74 73  s5parse.y"..{fts
18200 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
18210 79 79 32 34 20 3d 20 66 74 73 35 79 79 6d 73 70  yy24 = fts5yymsp
18220 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  [0].minor.fts5yy
18230 32 34 3b 7d 0d 0a 23 6c 69 6e 65 20 31 31 33 36  24;}..#line 1136
18240 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a   "fts5parse.c"..
18250 20 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d    fts5yymsp[0].m
18260 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20  inor.fts5yy24 = 
18270 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66  fts5yylhsminor.f
18280 74 73 35 79 79 32 34 3b 0d 0a 20 20 20 20 20 20  ts5yy24;..      
18290 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
182a0 63 61 73 65 20 31 34 3a 20 2f 2a 20 65 78 70 72  case 14: /* expr
182b0 6c 69 73 74 20 3a 3a 3d 20 65 78 70 72 6c 69 73  list ::= exprlis
182c0 74 20 63 6e 65 61 72 73 65 74 20 2a 2f 0d 0a 23  t cnearset */..#
182d0 6c 69 6e 65 20 31 33 33 20 22 66 74 73 35 70 61  line 133 "fts5pa
182e0 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66 74 73  rse.y"..{..  fts
182f0 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
18300 79 79 32 34 20 3d 20 73 71 6c 69 74 65 33 46 74  yy24 = sqlite3Ft
18310 73 35 50 61 72 73 65 49 6d 70 6c 69 63 69 74 41  s5ParseImplicitA
18320 6e 64 28 70 50 61 72 73 65 2c 20 66 74 73 35 79  nd(pParse, fts5y
18330 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66  ymsp[-1].minor.f
18340 74 73 35 79 79 32 34 2c 20 66 74 73 35 79 79 6d  ts5yy24, fts5yym
18350 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  sp[0].minor.fts5
18360 79 79 32 34 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65  yy24);..}..#line
18370 20 31 31 34 34 20 22 66 74 73 35 70 61 72 73 65   1144 "fts5parse
18380 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70  .c"..  fts5yymsp
18390 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-1].minor.fts5y
183a0 79 32 34 20 3d 20 66 74 73 35 79 79 6c 68 73 6d  y24 = fts5yylhsm
183b0 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b 0d 0a  inor.fts5yy24;..
183c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
183d0 20 20 20 20 20 20 63 61 73 65 20 31 35 3a 20 2f        case 15: /
183e0 2a 20 63 6e 65 61 72 73 65 74 20 3a 3a 3d 20 6e  * cnearset ::= n
183f0 65 61 72 73 65 74 20 2a 2f 0d 0a 23 6c 69 6e 65  earset */..#line
18400 20 31 33 37 20 22 66 74 73 35 70 61 72 73 65 2e   137 "fts5parse.
18410 79 22 0d 0a 7b 20 0d 0a 20 20 66 74 73 35 79 79  y"..{ ..  fts5yy
18420 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32  lhsminor.fts5yy2
18430 34 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50  4 = sqlite3Fts5P
18440 61 72 73 65 4e 6f 64 65 28 70 50 61 72 73 65 2c  arseNode(pParse,
18450 20 46 54 53 35 5f 53 54 52 49 4e 47 2c 20 30 2c   FTS5_STRING, 0,
18460 20 30 2c 20 66 74 73 35 79 79 6d 73 70 5b 30 5d   0, fts5yymsp[0]
18470 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34 36 29  .minor.fts5yy46)
18480 3b 20 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 31 35  ; ..}..#line 115
18490 32 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  2 "fts5parse.c".
184a0 0a 20 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e  .  fts5yymsp[0].
184b0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 20 3d  minor.fts5yy24 =
184c0 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e   fts5yylhsminor.
184d0 66 74 73 35 79 79 32 34 3b 0d 0a 20 20 20 20 20  fts5yy24;..     
184e0 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
184f0 20 63 61 73 65 20 31 36 3a 20 2f 2a 20 63 6e 65   case 16: /* cne
18500 61 72 73 65 74 20 3a 3a 3d 20 63 6f 6c 73 65 74  arset ::= colset
18510 20 43 4f 4c 4f 4e 20 6e 65 61 72 73 65 74 20 2a   COLON nearset *
18520 2f 0d 0a 23 6c 69 6e 65 20 31 34 30 20 22 66 74  /..#line 140 "ft
18530 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 0d 0a  s5parse.y"..{ ..
18540 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72    fts5yylhsminor
18550 2e 66 74 73 35 79 79 32 34 20 3d 20 73 71 6c 69  .fts5yy24 = sqli
18560 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
18570 28 70 50 61 72 73 65 2c 20 46 54 53 35 5f 53 54  (pParse, FTS5_ST
18580 52 49 4e 47 2c 20 30 2c 20 30 2c 20 66 74 73 35  RING, 0, 0, fts5
18590 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66  yymsp[0].minor.f
185a0 74 73 35 79 79 34 36 29 3b 20 0d 0a 20 20 73 71  ts5yy46); ..  sq
185b0 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65  lite3Fts5ParseSe
185c0 74 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20  tColset(pParse, 
185d0 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66  fts5yylhsminor.f
185e0 74 73 35 79 79 32 34 2c 20 66 74 73 35 79 79 6d  ts5yy24, fts5yym
185f0 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-2].minor.fts
18600 35 79 79 31 31 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e  5yy11);..}..#lin
18610 65 20 31 31 36 31 20 22 66 74 73 35 70 61 72 73  e 1161 "fts5pars
18620 65 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73  e.c"..  fts5yyms
18630 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  p[-2].minor.fts5
18640 79 79 32 34 20 3d 20 66 74 73 35 79 79 6c 68 73  yy24 = fts5yylhs
18650 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b 0d  minor.fts5yy24;.
18660 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
18670 0a 20 20 20 20 20 20 63 61 73 65 20 31 37 3a 20  .      case 17: 
18680 2f 2a 20 6e 65 61 72 73 65 74 20 3a 3a 3d 20 70  /* nearset ::= p
18690 68 72 61 73 65 20 2a 2f 0d 0a 23 6c 69 6e 65 20  hrase */..#line 
186a0 31 35 31 20 22 66 74 73 35 70 61 72 73 65 2e 79  151 "fts5parse.y
186b0 22 0d 0a 7b 20 66 74 73 35 79 79 6c 68 73 6d 69  "..{ fts5yylhsmi
186c0 6e 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 73  nor.fts5yy46 = s
186d0 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
186e0 65 61 72 73 65 74 28 70 50 61 72 73 65 2c 20 30  earset(pParse, 0
186f0 2c 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d  , fts5yymsp[0].m
18700 69 6e 6f 72 2e 66 74 73 35 79 79 35 33 29 3b 20  inor.fts5yy53); 
18710 7d 0d 0a 23 6c 69 6e 65 20 31 31 36 37 20 22 66  }..#line 1167 "f
18720 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 66  ts5parse.c"..  f
18730 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f  ts5yymsp[0].mino
18740 72 2e 66 74 73 35 79 79 34 36 20 3d 20 66 74 73  r.fts5yy46 = fts
18750 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
18760 79 79 34 36 3b 0d 0a 20 20 20 20 20 20 20 20 62  yy46;..        b
18770 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
18780 65 20 31 38 3a 20 2f 2a 20 6e 65 61 72 73 65 74  e 18: /* nearset
18790 20 3a 3a 3d 20 43 41 52 45 54 20 70 68 72 61 73   ::= CARET phras
187a0 65 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 35 32 20  e */..#line 152 
187b0 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b  "fts5parse.y"..{
187c0 20 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35   ..  sqlite3Fts5
187d0 50 61 72 73 65 53 65 74 43 61 72 65 74 28 66 74  ParseSetCaret(ft
187e0 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72  s5yymsp[0].minor
187f0 2e 66 74 73 35 79 79 35 33 29 3b 0d 0a 20 20 66  .fts5yy53);..  f
18800 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e  ts5yymsp[-1].min
18810 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 73 71  or.fts5yy46 = sq
18820 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
18830 61 72 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c  arset(pParse, 0,
18840 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69   fts5yymsp[0].mi
18850 6e 6f 72 2e 66 74 73 35 79 79 35 33 29 3b 20 0d  nor.fts5yy53); .
18860 0a 7d 0d 0a 23 6c 69 6e 65 20 31 31 37 36 20 22  .}..#line 1176 "
18870 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20  fts5parse.c"..  
18880 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
18890 20 20 20 20 63 61 73 65 20 31 39 3a 20 2f 2a 20      case 19: /* 
188a0 6e 65 61 72 73 65 74 20 3a 3a 3d 20 53 54 52 49  nearset ::= STRI
188b0 4e 47 20 4c 50 20 6e 65 61 72 70 68 72 61 73 65  NG LP nearphrase
188c0 73 20 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 52  s neardist_opt R
188d0 50 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 35 36 20  P */..#line 156 
188e0 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b  "fts5parse.y"..{
188f0 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
18900 61 72 73 65 4e 65 61 72 28 70 50 61 72 73 65 2c  arseNear(pParse,
18910 20 26 66 74 73 35 79 79 6d 73 70 5b 2d 34 5d 2e   &fts5yymsp[-4].
18920 6d 69 6e 6f 72 2e 66 74 73 35 79 79 30 29 3b 0d  minor.fts5yy0);.
18930 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  .  sqlite3Fts5Pa
18940 72 73 65 53 65 74 44 69 73 74 61 6e 63 65 28 70  rseSetDistance(p
18950 50 61 72 73 65 2c 20 66 74 73 35 79 79 6d 73 70  Parse, fts5yymsp
18960 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-2].minor.fts5y
18970 79 34 36 2c 20 26 66 74 73 35 79 79 6d 73 70 5b  y46, &fts5yymsp[
18980 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  -1].minor.fts5yy
18990 30 29 3b 0d 0a 20 20 66 74 73 35 79 79 6c 68 73  0);..  fts5yylhs
189a0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34 36 20 3d  minor.fts5yy46 =
189b0 20 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d   fts5yymsp[-2].m
189c0 69 6e 6f 72 2e 66 74 73 35 79 79 34 36 3b 0d 0a  inor.fts5yy46;..
189d0 7d 0d 0a 23 6c 69 6e 65 20 31 31 38 35 20 22 66  }..#line 1185 "f
189e0 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 66  ts5parse.c"..  f
189f0 74 73 35 79 79 6d 73 70 5b 2d 34 5d 2e 6d 69 6e  ts5yymsp[-4].min
18a00 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 66 74  or.fts5yy46 = ft
18a10 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
18a20 35 79 79 34 36 3b 0d 0a 20 20 20 20 20 20 20 20  5yy46;..        
18a30 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61  break;..      ca
18a40 73 65 20 32 30 3a 20 2f 2a 20 6e 65 61 72 70 68  se 20: /* nearph
18a50 72 61 73 65 73 20 3a 3a 3d 20 70 68 72 61 73 65  rases ::= phrase
18a60 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 36 32 20 22   */..#line 162 "
18a70 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20  fts5parse.y"..{ 
18a80 0d 0a 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e  ..  fts5yylhsmin
18a90 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 73 71  or.fts5yy46 = sq
18aa0 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
18ab0 61 72 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c  arset(pParse, 0,
18ac0 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69   fts5yymsp[0].mi
18ad0 6e 6f 72 2e 66 74 73 35 79 79 35 33 29 3b 20 0d  nor.fts5yy53); .
18ae0 0a 7d 0d 0a 23 6c 69 6e 65 20 31 31 39 33 20 22  .}..#line 1193 "
18af0 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20  fts5parse.c"..  
18b00 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e  fts5yymsp[0].min
18b10 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20 66 74  or.fts5yy46 = ft
18b20 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
18b30 35 79 79 34 36 3b 0d 0a 20 20 20 20 20 20 20 20  5yy46;..        
18b40 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61  break;..      ca
18b50 73 65 20 32 31 3a 20 2f 2a 20 6e 65 61 72 70 68  se 21: /* nearph
18b60 72 61 73 65 73 20 3a 3a 3d 20 6e 65 61 72 70 68  rases ::= nearph
18b70 72 61 73 65 73 20 70 68 72 61 73 65 20 2a 2f 0d  rases phrase */.
18b80 0a 23 6c 69 6e 65 20 31 36 35 20 22 66 74 73 35  .#line 165 "fts5
18b90 70 61 72 73 65 2e 79 22 0d 0a 7b 0d 0a 20 20 66  parse.y"..{..  f
18ba0 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74  ts5yylhsminor.ft
18bb0 73 35 79 79 34 36 20 3d 20 73 71 6c 69 74 65 33  s5yy46 = sqlite3
18bc0 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74  Fts5ParseNearset
18bd0 28 70 50 61 72 73 65 2c 20 66 74 73 35 79 79 6d  (pParse, fts5yym
18be0 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-1].minor.fts
18bf0 35 79 79 34 36 2c 20 66 74 73 35 79 79 6d 73 70  5yy46, fts5yymsp
18c00 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  [0].minor.fts5yy
18c10 35 33 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31  53);..}..#line 1
18c20 32 30 31 20 22 66 74 73 35 70 61 72 73 65 2e 63  201 "fts5parse.c
18c30 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 5b 2d  "..  fts5yymsp[-
18c40 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34  1].minor.fts5yy4
18c50 36 20 3d 20 66 74 73 35 79 79 6c 68 73 6d 69 6e  6 = fts5yylhsmin
18c60 6f 72 2e 66 74 73 35 79 79 34 36 3b 0d 0a 20 20  or.fts5yy46;..  
18c70 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
18c80 20 20 20 20 63 61 73 65 20 32 32 3a 20 2f 2a 20      case 22: /* 
18c90 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 3a 3a 3d  neardist_opt ::=
18ca0 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 37 32 20 22   */..#line 172 "
18cb0 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20  fts5parse.y"..{ 
18cc0 66 74 73 35 79 79 6d 73 70 5b 31 5d 2e 6d 69 6e  fts5yymsp[1].min
18cd0 6f 72 2e 66 74 73 35 79 79 30 2e 70 20 3d 20 30  or.fts5yy0.p = 0
18ce0 3b 20 66 74 73 35 79 79 6d 73 70 5b 31 5d 2e 6d  ; fts5yymsp[1].m
18cf0 69 6e 6f 72 2e 66 74 73 35 79 79 30 2e 6e 20 3d  inor.fts5yy0.n =
18d00 20 30 3b 20 7d 0d 0a 23 6c 69 6e 65 20 31 32 30   0; }..#line 120
18d10 37 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  7 "fts5parse.c".
18d20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
18d30 0a 20 20 20 20 20 20 63 61 73 65 20 32 33 3a 20  .      case 23: 
18d40 2f 2a 20 6e 65 61 72 64 69 73 74 5f 6f 70 74 20  /* neardist_opt 
18d50 3a 3a 3d 20 43 4f 4d 4d 41 20 53 54 52 49 4e 47  ::= COMMA STRING
18d60 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 37 33 20 22   */..#line 173 "
18d70 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20  fts5parse.y"..{ 
18d80 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69  fts5yymsp[-1].mi
18d90 6e 6f 72 2e 66 74 73 35 79 79 30 20 3d 20 66 74  nor.fts5yy0 = ft
18da0 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72  s5yymsp[0].minor
18db0 2e 66 74 73 35 79 79 30 3b 20 7d 0d 0a 23 6c 69  .fts5yy0; }..#li
18dc0 6e 65 20 31 32 31 32 20 22 66 74 73 35 70 61 72  ne 1212 "fts5par
18dd0 73 65 2e 63 22 0d 0a 20 20 20 20 20 20 20 20 62  se.c"..        b
18de0 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
18df0 65 20 32 34 3a 20 2f 2a 20 70 68 72 61 73 65 20  e 24: /* phrase 
18e00 3a 3a 3d 20 70 68 72 61 73 65 20 50 4c 55 53 20  ::= phrase PLUS 
18e10 53 54 52 49 4e 47 20 73 74 61 72 5f 6f 70 74 20  STRING star_opt 
18e20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 38 35 20 22 66  */..#line 185 "f
18e30 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 0d  ts5parse.y"..{ .
18e40 0a 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f  .  fts5yylhsmino
18e50 72 2e 66 74 73 35 79 79 35 33 20 3d 20 73 71 6c  r.fts5yy53 = sql
18e60 69 74 65 33 46 74 73 35 50 61 72 73 65 54 65 72  ite3Fts5ParseTer
18e70 6d 28 70 50 61 72 73 65 2c 20 66 74 73 35 79 79  m(pParse, fts5yy
18e80 6d 73 70 5b 2d 33 5d 2e 6d 69 6e 6f 72 2e 66 74  msp[-3].minor.ft
18e90 73 35 79 79 35 33 2c 20 26 66 74 73 35 79 79 6d  s5yy53, &fts5yym
18ea0 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-1].minor.fts
18eb0 35 79 79 30 2c 20 66 74 73 35 79 79 6d 73 70 5b  5yy0, fts5yymsp[
18ec0 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34  0].minor.fts5yy4
18ed0 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 32 31  );..}..#line 121
18ee0 39 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  9 "fts5parse.c".
18ef0 0a 20 20 66 74 73 35 79 79 6d 73 70 5b 2d 33 5d  .  fts5yymsp[-3]
18f00 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 35 33 20  .minor.fts5yy53 
18f10 3d 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72  = fts5yylhsminor
18f20 2e 66 74 73 35 79 79 35 33 3b 0d 0a 20 20 20 20  .fts5yy53;..    
18f30 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
18f40 20 20 63 61 73 65 20 32 35 3a 20 2f 2a 20 70 68    case 25: /* ph
18f50 72 61 73 65 20 3a 3a 3d 20 53 54 52 49 4e 47 20  rase ::= STRING 
18f60 73 74 61 72 5f 6f 70 74 20 2a 2f 0d 0a 23 6c 69  star_opt */..#li
18f70 6e 65 20 31 38 38 20 22 66 74 73 35 70 61 72 73  ne 188 "fts5pars
18f80 65 2e 79 22 0d 0a 7b 20 0d 0a 20 20 66 74 73 35  e.y"..{ ..  fts5
18f90 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79  yylhsminor.fts5y
18fa0 79 35 33 20 3d 20 73 71 6c 69 74 65 33 46 74 73  y53 = sqlite3Fts
18fb0 35 50 61 72 73 65 54 65 72 6d 28 70 50 61 72 73  5ParseTerm(pPars
18fc0 65 2c 20 30 2c 20 26 66 74 73 35 79 79 6d 73 70  e, 0, &fts5yymsp
18fd0 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-1].minor.fts5y
18fe0 79 30 2c 20 66 74 73 35 79 79 6d 73 70 5b 30 5d  y0, fts5yymsp[0]
18ff0 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34 29 3b  .minor.fts5yy4);
19000 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 32 32 37 20  ..}..#line 1227 
19010 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20  "fts5parse.c".. 
19020 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d   fts5yymsp[-1].m
19030 69 6e 6f 72 2e 66 74 73 35 79 79 35 33 20 3d 20  inor.fts5yy53 = 
19040 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66  fts5yylhsminor.f
19050 74 73 35 79 79 35 33 3b 0d 0a 20 20 20 20 20 20  ts5yy53;..      
19060 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
19070 63 61 73 65 20 32 36 3a 20 2f 2a 20 73 74 61 72  case 26: /* star
19080 5f 6f 70 74 20 3a 3a 3d 20 53 54 41 52 20 2a 2f  _opt ::= STAR */
19090 0d 0a 23 6c 69 6e 65 20 31 39 36 20 22 66 74 73  ..#line 196 "fts
190a0 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 66 74 73  5parse.y"..{ fts
190b0 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e  5yymsp[0].minor.
190c0 66 74 73 35 79 79 34 20 3d 20 31 3b 20 7d 0d 0a  fts5yy4 = 1; }..
190d0 23 6c 69 6e 65 20 31 32 33 33 20 22 66 74 73 35  #line 1233 "fts5
190e0 70 61 72 73 65 2e 63 22 0d 0a 20 20 20 20 20 20  parse.c"..      
190f0 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
19100 63 61 73 65 20 32 37 3a 20 2f 2a 20 73 74 61 72  case 27: /* star
19110 5f 6f 70 74 20 3a 3a 3d 20 2a 2f 0d 0a 23 6c 69  _opt ::= */..#li
19120 6e 65 20 31 39 37 20 22 66 74 73 35 70 61 72 73  ne 197 "fts5pars
19130 65 2e 79 22 0d 0a 7b 20 66 74 73 35 79 79 6d 73  e.y"..{ fts5yyms
19140 70 5b 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  p[1].minor.fts5y
19150 79 34 20 3d 20 30 3b 20 7d 0d 0a 23 6c 69 6e 65  y4 = 0; }..#line
19160 20 31 32 33 38 20 22 66 74 73 35 70 61 72 73 65   1238 "fts5parse
19170 2e 63 22 0d 0a 20 20 20 20 20 20 20 20 62 72 65  .c"..        bre
19180 61 6b 3b 0d 0a 20 20 20 20 20 20 64 65 66 61 75  ak;..      defau
19190 6c 74 3a 0d 0a 20 20 20 20 20 20 20 20 62 72 65  lt:..        bre
191a0 61 6b 3b 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ak;../**********
191b0 20 45 6e 64 20 72 65 64 75 63 65 20 61 63 74 69   End reduce acti
191c0 6f 6e 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ons ************
191d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191f0 2a 2a 2a 2a 2f 0d 0a 20 20 7d 3b 0d 0a 20 20 61  ****/..  };..  a
19200 73 73 65 72 74 28 20 66 74 73 35 79 79 72 75 6c  ssert( fts5yyrul
19210 65 6e 6f 3c 73 69 7a 65 6f 66 28 66 74 73 35 79  eno<sizeof(fts5y
19220 79 52 75 6c 65 49 6e 66 6f 4c 68 73 29 2f 73 69  yRuleInfoLhs)/si
19230 7a 65 6f 66 28 66 74 73 35 79 79 52 75 6c 65 49  zeof(fts5yyRuleI
19240 6e 66 6f 4c 68 73 5b 30 5d 29 20 29 3b 0d 0a 20  nfoLhs[0]) );.. 
19250 20 66 74 73 35 79 79 67 6f 74 6f 20 3d 20 66 74   fts5yygoto = ft
19260 73 35 79 79 52 75 6c 65 49 6e 66 6f 4c 68 73 5b  s5yyRuleInfoLhs[
19270 66 74 73 35 79 79 72 75 6c 65 6e 6f 5d 3b 0d 0a  fts5yyruleno];..
19280 20 20 66 74 73 35 79 79 73 69 7a 65 20 3d 20 66    fts5yysize = f
19290 74 73 35 79 79 52 75 6c 65 49 6e 66 6f 4e 52 68  ts5yyRuleInfoNRh
192a0 73 5b 66 74 73 35 79 79 72 75 6c 65 6e 6f 5d 3b  s[fts5yyruleno];
192b0 0d 0a 20 20 66 74 73 35 79 79 61 63 74 20 3d 20  ..  fts5yyact = 
192c0 66 74 73 35 79 79 5f 66 69 6e 64 5f 72 65 64 75  fts5yy_find_redu
192d0 63 65 5f 61 63 74 69 6f 6e 28 66 74 73 35 79 79  ce_action(fts5yy
192e0 6d 73 70 5b 66 74 73 35 79 79 73 69 7a 65 5d 2e  msp[fts5yysize].
192f0 73 74 61 74 65 6e 6f 2c 28 66 74 73 35 59 59 43  stateno,(fts5YYC
19300 4f 44 45 54 59 50 45 29 66 74 73 35 79 79 67 6f  ODETYPE)fts5yygo
19310 74 6f 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 54 68 65  to);....  /* The
19320 72 65 20 61 72 65 20 6e 6f 20 53 48 49 46 54 52  re are no SHIFTR
19330 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20 6f 6e  EDUCE actions on
19340 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 62 65   nonterminals be
19350 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 0d  cause the table.
19360 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 6f 72 20  .  ** generator 
19370 68 61 73 20 73 69 6d 70 6c 69 66 69 65 64 20 74  has simplified t
19380 68 65 6d 20 74 6f 20 70 75 72 65 20 52 45 44 55  hem to pure REDU
19390 43 45 20 61 63 74 69 6f 6e 73 2e 20 2a 2f 0d 0a  CE actions. */..
193a0 20 20 61 73 73 65 72 74 28 20 21 28 66 74 73 35    assert( !(fts5
193b0 79 79 61 63 74 3e 66 74 73 35 59 59 5f 4d 41 58  yyact>fts5YY_MAX
193c0 5f 53 48 49 46 54 20 26 26 20 66 74 73 35 79 79  _SHIFT && fts5yy
193d0 61 63 74 3c 3d 66 74 73 35 59 59 5f 4d 41 58 5f  act<=fts5YY_MAX_
193e0 53 48 49 46 54 52 45 44 55 43 45 29 20 29 3b 0d  SHIFTREDUCE) );.
193f0 0a 0d 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  ...  /* It is no
19400 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
19410 20 52 45 44 55 43 45 20 74 6f 20 62 65 20 66 6f   REDUCE to be fo
19420 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 65 72 72  llowed by an err
19430 6f 72 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28  or */..  assert(
19440 20 66 74 73 35 79 79 61 63 74 21 3d 66 74 73 35   fts5yyact!=fts5
19450 59 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f 4e 20  YY_ERROR_ACTION 
19460 29 3b 0d 0a 0d 0a 20 20 66 74 73 35 79 79 6d 73  );....  fts5yyms
19470 70 20 2b 3d 20 66 74 73 35 79 79 73 69 7a 65 2b  p += fts5yysize+
19480 31 3b 0d 0a 20 20 66 74 73 35 79 79 70 50 61 72  1;..  fts5yypPar
19490 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 20 3d  ser->fts5yytos =
194a0 20 66 74 73 35 79 79 6d 73 70 3b 0d 0a 20 20 66   fts5yymsp;..  f
194b0 74 73 35 79 79 6d 73 70 2d 3e 73 74 61 74 65 6e  ts5yymsp->staten
194c0 6f 20 3d 20 28 66 74 73 35 59 59 41 43 54 49 4f  o = (fts5YYACTIO
194d0 4e 54 59 50 45 29 66 74 73 35 79 79 61 63 74 3b  NTYPE)fts5yyact;
194e0 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 2d 3e 6d  ..  fts5yymsp->m
194f0 61 6a 6f 72 20 3d 20 28 66 74 73 35 59 59 43 4f  ajor = (fts5YYCO
19500 44 45 54 59 50 45 29 66 74 73 35 79 79 67 6f 74  DETYPE)fts5yygot
19510 6f 3b 0d 0a 20 20 66 74 73 35 79 79 54 72 61 63  o;..  fts5yyTrac
19520 65 53 68 69 66 74 28 66 74 73 35 79 79 70 50 61  eShift(fts5yypPa
19530 72 73 65 72 2c 20 66 74 73 35 79 79 61 63 74 2c  rser, fts5yyact,
19540 20 22 2e 2e 2e 20 74 68 65 6e 20 73 68 69 66 74   "... then shift
19550 22 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 66 74  ");..  return ft
19560 73 35 79 79 61 63 74 3b 0d 0a 7d 0d 0a 0d 0a 2f  s5yyact;..}..../
19570 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  *..** The follow
19580 69 6e 67 20 63 6f 64 65 20 65 78 65 63 75 74 65  ing code execute
19590 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65  s when the parse
195a0 20 66 61 69 6c 73 0d 0a 2a 2f 0d 0a 23 69 66 6e   fails..*/..#ifn
195b0 64 65 66 20 66 74 73 35 59 59 4e 4f 45 52 52 4f  def fts5YYNOERRO
195c0 52 52 45 43 4f 56 45 52 59 0d 0a 73 74 61 74 69  RRECOVERY..stati
195d0 63 20 76 6f 69 64 20 66 74 73 35 79 79 5f 70 61  c void fts5yy_pa
195e0 72 73 65 5f 66 61 69 6c 65 64 28 0d 0a 20 20 66  rse_failed(..  f
195f0 74 73 35 79 79 50 61 72 73 65 72 20 2a 66 74 73  ts5yyParser *fts
19600 35 79 79 70 50 61 72 73 65 72 20 20 20 20 20 20  5yypParser      
19610 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
19620 65 72 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 73 71 6c  er */..){..  sql
19630 69 74 65 33 46 74 73 35 50 61 72 73 65 72 41 52  ite3Fts5ParserAR
19640 47 5f 46 45 54 43 48 0d 0a 20 20 73 71 6c 69 74  G_FETCH..  sqlit
19650 65 33 46 74 73 35 50 61 72 73 65 72 43 54 58 5f  e3Fts5ParserCTX_
19660 46 45 54 43 48 0d 0a 23 69 66 6e 64 65 66 20 4e  FETCH..#ifndef N
19670 44 45 42 55 47 0d 0a 20 20 69 66 28 20 66 74 73  DEBUG..  if( fts
19680 35 79 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d  5yyTraceFILE ){.
19690 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 74 73  .    fprintf(fts
196a0 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22 25 73  5yyTraceFILE,"%s
196b0 46 61 69 6c 21 5c 6e 22 2c 66 74 73 35 79 79 54  Fail!\n",fts5yyT
196c0 72 61 63 65 50 72 6f 6d 70 74 29 3b 0d 0a 20 20  racePrompt);..  
196d0 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 77 68 69  }..#endif..  whi
196e0 6c 65 28 20 66 74 73 35 79 79 70 50 61 72 73 65  le( fts5yypParse
196f0 72 2d 3e 66 74 73 35 79 79 74 6f 73 3e 66 74 73  r->fts5yytos>fts
19700 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
19710 79 79 73 74 61 63 6b 20 29 20 66 74 73 35 79 79  yystack ) fts5yy
19720 5f 70 6f 70 5f 70 61 72 73 65 72 5f 73 74 61 63  _pop_parser_stac
19730 6b 28 66 74 73 35 79 79 70 50 61 72 73 65 72 29  k(fts5yypParser)
19740 3b 0d 0a 20 20 2f 2a 20 48 65 72 65 20 63 6f 64  ;..  /* Here cod
19750 65 20 69 73 20 69 6e 73 65 72 74 65 64 20 77 68  e is inserted wh
19760 69 63 68 20 77 69 6c 6c 20 62 65 20 65 78 65 63  ich will be exec
19770 75 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  uted whenever th
19780 65 0d 0a 20 20 2a 2a 20 70 61 72 73 65 72 20 66  e..  ** parser f
19790 61 69 6c 73 20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a  ails */../******
197a0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 25 70 61  ****** Begin %pa
197b0 72 73 65 5f 66 61 69 6c 75 72 65 20 63 6f 64 65  rse_failure code
197c0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
197d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197e0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a  ********/../****
197f0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 25 70 61  ******** End %pa
19800 72 73 65 5f 66 61 69 6c 75 72 65 20 63 6f 64 65  rse_failure code
19810 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
19820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20 73  **********/..  s
19840 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
19850 41 52 47 5f 53 54 4f 52 45 20 2f 2a 20 53 75 70  ARG_STORE /* Sup
19860 70 72 65 73 73 20 77 61 72 6e 69 6e 67 20 61 62  press warning ab
19870 6f 75 74 20 75 6e 75 73 65 64 20 25 65 78 74 72  out unused %extr
19880 61 5f 61 72 67 75 6d 65 6e 74 20 76 61 72 69 61  a_argument varia
19890 62 6c 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65  ble */..  sqlite
198a0 33 46 74 73 35 50 61 72 73 65 72 43 54 58 5f 53  3Fts5ParserCTX_S
198b0 54 4f 52 45 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20  TORE..}..#endif 
198c0 2f 2a 20 66 74 73 35 59 59 4e 4f 45 52 52 4f 52  /* fts5YYNOERROR
198d0 52 45 43 4f 56 45 52 59 20 2a 2f 0d 0a 0d 0a 2f  RECOVERY */..../
198e0 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  *..** The follow
198f0 69 6e 67 20 63 6f 64 65 20 65 78 65 63 75 74 65  ing code execute
19900 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20  s when a syntax 
19910 65 72 72 6f 72 20 66 69 72 73 74 20 6f 63 63 75  error first occu
19920 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  rs...*/..static 
19930 76 6f 69 64 20 66 74 73 35 79 79 5f 73 79 6e 74  void fts5yy_synt
19940 61 78 5f 65 72 72 6f 72 28 0d 0a 20 20 66 74 73  ax_error(..  fts
19950 35 79 79 50 61 72 73 65 72 20 2a 66 74 73 35 79  5yyParser *fts5y
19960 79 70 50 61 72 73 65 72 2c 20 20 20 20 20 20 20  ypParser,       
19970 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
19980 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 74 73 35  r */..  int fts5
19990 79 79 6d 61 6a 6f 72 2c 20 20 20 20 20 20 20 20  yymajor,        
199a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
199b0 65 20 6d 61 6a 6f 72 20 74 79 70 65 20 6f 66 20  e major type of 
199c0 74 68 65 20 65 72 72 6f 72 20 74 6f 6b 65 6e 20  the error token 
199d0 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73  */..  sqlite3Fts
199e0 35 50 61 72 73 65 72 46 54 53 35 54 4f 4b 45 4e  5ParserFTS5TOKEN
199f0 54 59 50 45 20 66 74 73 35 79 79 6d 69 6e 6f 72  TYPE fts5yyminor
19a00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19a10 6d 69 6e 6f 72 20 74 79 70 65 20 6f 66 20 74 68  minor type of th
19a20 65 20 65 72 72 6f 72 20 74 6f 6b 65 6e 20 2a 2f  e error token */
19a30 0d 0a 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 46  ..){..  sqlite3F
19a40 74 73 35 50 61 72 73 65 72 41 52 47 5f 46 45 54  ts5ParserARG_FET
19a50 43 48 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73  CH..  sqlite3Fts
19a60 35 50 61 72 73 65 72 43 54 58 5f 46 45 54 43 48  5ParserCTX_FETCH
19a70 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 54 4f  ..#define FTS5TO
19a80 4b 45 4e 20 66 74 73 35 79 79 6d 69 6e 6f 72 0d  KEN fts5yyminor.
19a90 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ./************ B
19aa0 65 67 69 6e 20 25 73 79 6e 74 61 78 5f 65 72 72  egin %syntax_err
19ab0 6f 72 20 63 6f 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a  or code ********
19ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ae0 2f 0d 0a 23 6c 69 6e 65 20 33 30 20 22 66 74 73  /..#line 30 "fts
19af0 35 70 61 72 73 65 2e 79 22 0d 0a 0d 0a 20 20 55  5parse.y"....  U
19b00 4e 55 53 45 44 5f 50 41 52 41 4d 28 66 74 73 35  NUSED_PARAM(fts5
19b10 79 79 6d 61 6a 6f 72 29 3b 20 2f 2a 20 53 69 6c  yymajor); /* Sil
19b20 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65 72 20  ence a compiler 
19b30 77 61 72 6e 69 6e 67 20 2a 2f 0d 0a 20 20 73 71  warning */..  sq
19b40 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 45 72  lite3Fts5ParseEr
19b50 72 6f 72 28 0d 0a 20 20 20 20 70 50 61 72 73 65  ror(..    pParse
19b60 2c 20 22 66 74 73 35 3a 20 73 79 6e 74 61 78 20  , "fts5: syntax 
19b70 65 72 72 6f 72 20 6e 65 61 72 20 5c 22 25 2e 2a  error near \"%.*
19b80 73 5c 22 22 2c 46 54 53 35 54 4f 4b 45 4e 2e 6e  s\"",FTS5TOKEN.n
19b90 2c 46 54 53 35 54 4f 4b 45 4e 2e 70 0d 0a 20 20  ,FTS5TOKEN.p..  
19ba0 29 3b 0d 0a 23 6c 69 6e 65 20 31 33 30 36 20 22  );..#line 1306 "
19bb0 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 2f 2a  fts5parse.c"../*
19bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
19bd0 25 73 79 6e 74 61 78 5f 65 72 72 6f 72 20 63 6f  %syntax_error co
19be0 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de *************
19bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a  *************/..
19c10 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
19c20 73 65 72 41 52 47 5f 53 54 4f 52 45 20 2f 2a 20  serARG_STORE /* 
19c30 53 75 70 70 72 65 73 73 20 77 61 72 6e 69 6e 67  Suppress warning
19c40 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 25 65   about unused %e
19c50 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 20 76 61  xtra_argument va
19c60 72 69 61 62 6c 65 20 2a 2f 0d 0a 20 20 73 71 6c  riable */..  sql
19c70 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54  ite3Fts5ParserCT
19c80 58 5f 53 54 4f 52 45 0d 0a 7d 0d 0a 0d 0a 2f 2a  X_STORE..}..../*
19c90 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ..** The followi
19ca0 6e 67 20 69 73 20 65 78 65 63 75 74 65 64 20 77  ng is executed w
19cb0 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  hen the parser a
19cc0 63 63 65 70 74 73 0d 0a 2a 2f 0d 0a 73 74 61 74  ccepts..*/..stat
19cd0 69 63 20 76 6f 69 64 20 66 74 73 35 79 79 5f 61  ic void fts5yy_a
19ce0 63 63 65 70 74 28 0d 0a 20 20 66 74 73 35 79 79  ccept(..  fts5yy
19cf0 50 61 72 73 65 72 20 2a 66 74 73 35 79 79 70 50  Parser *fts5yypP
19d00 61 72 73 65 72 20 20 20 20 20 20 20 20 20 20 20  arser           
19d10 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 2a 2f  /* The parser */
19d20 0d 0a 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 46  ..){..  sqlite3F
19d30 74 73 35 50 61 72 73 65 72 41 52 47 5f 46 45 54  ts5ParserARG_FET
19d40 43 48 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73  CH..  sqlite3Fts
19d50 35 50 61 72 73 65 72 43 54 58 5f 46 45 54 43 48  5ParserCTX_FETCH
19d60 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
19d70 0d 0a 20 20 69 66 28 20 66 74 73 35 79 79 54 72  ..  if( fts5yyTr
19d80 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20 20 20 20  aceFILE ){..    
19d90 66 70 72 69 6e 74 66 28 66 74 73 35 79 79 54 72  fprintf(fts5yyTr
19da0 61 63 65 46 49 4c 45 2c 22 25 73 41 63 63 65 70  aceFILE,"%sAccep
19db0 74 21 5c 6e 22 2c 66 74 73 35 79 79 54 72 61 63  t!\n",fts5yyTrac
19dc0 65 50 72 6f 6d 70 74 29 3b 0d 0a 20 20 7d 0d 0a  ePrompt);..  }..
19dd0 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
19de0 66 74 73 35 59 59 4e 4f 45 52 52 4f 52 52 45 43  fts5YYNOERRORREC
19df0 4f 56 45 52 59 0d 0a 20 20 66 74 73 35 79 79 70  OVERY..  fts5yyp
19e00 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 65 72  Parser->fts5yyer
19e10 72 63 6e 74 20 3d 20 2d 31 3b 0d 0a 23 65 6e 64  rcnt = -1;..#end
19e20 69 66 0d 0a 20 20 61 73 73 65 72 74 28 20 66 74  if..  assert( ft
19e30 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73  s5yypParser->fts
19e40 35 79 79 74 6f 73 3d 3d 66 74 73 35 79 79 70 50  5yytos==fts5yypP
19e50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61  arser->fts5yysta
19e60 63 6b 20 29 3b 0d 0a 20 20 2f 2a 20 48 65 72 65  ck );..  /* Here
19e70 20 63 6f 64 65 20 69 73 20 69 6e 73 65 72 74 65   code is inserte
19e80 64 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 20  d which will be 
19e90 65 78 65 63 75 74 65 64 20 77 68 65 6e 65 76 65  executed wheneve
19ea0 72 20 74 68 65 0d 0a 20 20 2a 2a 20 70 61 72 73  r the..  ** pars
19eb0 65 72 20 61 63 63 65 70 74 73 20 2a 2f 0d 0a 2f  er accepts */../
19ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
19ed0 6e 20 25 70 61 72 73 65 5f 61 63 63 65 70 74 20  n %parse_accept 
19ee0 63 6f 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  code ***********
19ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d  **************/.
19f10 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ./*********** En
19f20 64 20 25 70 61 72 73 65 5f 61 63 63 65 70 74 20  d %parse_accept 
19f30 63 6f 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  code ***********
19f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f60 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  /..  sqlite3Fts5
19f70 50 61 72 73 65 72 41 52 47 5f 53 54 4f 52 45 20  ParserARG_STORE 
19f80 2f 2a 20 53 75 70 70 72 65 73 73 20 77 61 72 6e  /* Suppress warn
19f90 69 6e 67 20 61 62 6f 75 74 20 75 6e 75 73 65 64  ing about unused
19fa0 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74   %extra_argument
19fb0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0d 0a 20 20   variable */..  
19fc0 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
19fd0 72 43 54 58 5f 53 54 4f 52 45 0d 0a 7d 0d 0a 0d  rCTX_STORE..}...
19fe0 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 61 72  ./* The main par
19ff0 73 65 72 20 70 72 6f 67 72 61 6d 2e 0d 0a 2a 2a  ser program...**
1a000 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1a010 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
1a020 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
1a030 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0d 0a 2a  obtained from..*
1a040 2a 20 22 73 71 6c 69 74 65 33 46 74 73 35 50 61  * "sqlite3Fts5Pa
1a050 72 73 65 72 41 6c 6c 6f 63 22 20 77 68 69 63 68  rserAlloc" which
1a060 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
1a070 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1a080 74 68 65 20 70 61 72 73 65 72 2e 0d 0a 2a 2a 20  the parser...** 
1a090 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
1a0a0 65 6e 74 20 69 73 20 74 68 65 20 6d 61 6a 6f 72  ent is the major
1a0b0 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 2e 20 20   token number.  
1a0c0 54 68 65 20 74 68 69 72 64 20 69 73 0d 0a 2a 2a  The third is..**
1a0d0 20 74 68 65 20 6d 69 6e 6f 72 20 74 6f 6b 65 6e   the minor token
1a0e0 2e 20 20 54 68 65 20 66 6f 75 72 74 68 20 6f 70  .  The fourth op
1a0f0 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20  tional argument 
1a100 69 73 20 77 68 61 74 65 76 65 72 20 74 68 65 0d  is whatever the.
1a110 0a 2a 2a 20 75 73 65 72 20 77 61 6e 74 73 20 28  .** user wants (
1a120 61 6e 64 20 73 70 65 63 69 66 69 65 64 20 69 6e  and specified in
1a130 20 74 68 65 20 67 72 61 6d 6d 61 72 29 20 61 6e   the grammar) an
1a140 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  d is available f
1a150 6f 72 0d 0a 2a 2a 20 75 73 65 20 62 79 20 74 68  or..** use by th
1a160 65 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  e action routine
1a170 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 70 75 74  s...**..** Input
1a180 73 3a 0d 0a 2a 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20  s:..** <ul>..** 
1a190 3c 6c 69 3e 20 41 20 70 6f 69 6e 74 65 72 20 74  <li> A pointer t
1a1a0 6f 20 74 68 65 20 70 61 72 73 65 72 20 28 61 6e  o the parser (an
1a1b0 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
1a1c0 65 2e 29 0d 0a 2a 2a 20 3c 6c 69 3e 20 54 68 65  e.)..** <li> The
1a1d0 20 6d 61 6a 6f 72 20 74 6f 6b 65 6e 20 6e 75 6d   major token num
1a1e0 62 65 72 2e 0d 0a 2a 2a 20 3c 6c 69 3e 20 54 68  ber...** <li> Th
1a1f0 65 20 6d 69 6e 6f 72 20 74 6f 6b 65 6e 20 6e 75  e minor token nu
1a200 6d 62 65 72 2e 0d 0a 2a 2a 20 3c 6c 69 3e 20 41  mber...** <li> A
1a210 6e 20 6f 70 74 69 6f 6e 20 61 72 67 75 6d 65 6e  n option argumen
1a220 74 20 6f 66 20 61 20 67 72 61 6d 6d 61 72 2d 73  t of a grammar-s
1a230 70 65 63 69 66 69 65 64 20 74 79 70 65 2e 0d 0a  pecified type...
1a240 2a 2a 20 3c 2f 75 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a  ** </ul>..**..**
1a250 20 4f 75 74 70 75 74 73 3a 0d 0a 2a 2a 20 4e 6f   Outputs:..** No
1a260 6e 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ne...*/..static 
1a270 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
1a280 50 61 72 73 65 72 28 0d 0a 20 20 76 6f 69 64 20  Parser(..  void 
1a290 2a 66 74 73 35 79 79 70 2c 20 20 20 20 20 20 20  *fts5yyp,       
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a2b0 68 65 20 70 61 72 73 65 72 20 2a 2f 0d 0a 20 20  he parser */..  
1a2c0 69 6e 74 20 66 74 73 35 79 79 6d 61 6a 6f 72 2c  int fts5yymajor,
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 2f 2a 20 54 68 65 20 6d 61 6a 6f 72 20 74 6f   /* The major to
1a2f0 6b 65 6e 20 63 6f 64 65 20 6e 75 6d 62 65 72 20  ken code number 
1a300 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73  */..  sqlite3Fts
1a310 35 50 61 72 73 65 72 46 54 53 35 54 4f 4b 45 4e  5ParserFTS5TOKEN
1a320 54 59 50 45 20 66 74 73 35 79 79 6d 69 6e 6f 72  TYPE fts5yyminor
1a330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
1a340 6c 75 65 20 66 6f 72 20 74 68 65 20 74 6f 6b 65  lue for the toke
1a350 6e 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46  n */..  sqlite3F
1a360 74 73 35 50 61 72 73 65 72 41 52 47 5f 50 44 45  ts5ParserARG_PDE
1a370 43 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  CL              
1a380 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 25 65 78   /* Optional %ex
1a390 74 72 61 5f 61 72 67 75 6d 65 6e 74 20 70 61 72  tra_argument par
1a3a0 61 6d 65 74 65 72 20 2a 2f 0d 0a 29 7b 0d 0a 20  ameter */..){.. 
1a3b0 20 66 74 73 35 59 59 4d 49 4e 4f 52 54 59 50 45   fts5YYMINORTYPE
1a3c0 20 66 74 73 35 79 79 6d 69 6e 6f 72 75 6e 69 6f   fts5yyminorunio
1a3d0 6e 3b 0d 0a 20 20 66 74 73 35 59 59 41 43 54 49  n;..  fts5YYACTI
1a3e0 4f 4e 54 59 50 45 20 66 74 73 35 79 79 61 63 74  ONTYPE fts5yyact
1a3f0 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65  ;   /* The parse
1a400 72 20 61 63 74 69 6f 6e 2e 20 2a 2f 0d 0a 23 69  r action. */..#i
1a410 66 20 21 64 65 66 69 6e 65 64 28 66 74 73 35 59  f !defined(fts5Y
1a420 59 45 52 52 4f 52 53 59 4d 42 4f 4c 29 20 26 26  YERRORSYMBOL) &&
1a430 20 21 64 65 66 69 6e 65 64 28 66 74 73 35 59 59   !defined(fts5YY
1a440 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59 29  NOERRORRECOVERY)
1a450 0d 0a 20 20 69 6e 74 20 66 74 73 35 79 79 65 6e  ..  int fts5yyen
1a460 64 6f 66 69 6e 70 75 74 3b 20 20 20 20 20 2f 2a  dofinput;     /*
1a470 20 54 72 75 65 20 69 66 20 77 65 20 61 72 65 20   True if we are 
1a480 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 69 6e  at the end of in
1a490 70 75 74 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a  put */..#endif..
1a4a0 23 69 66 64 65 66 20 66 74 73 35 59 59 45 52 52  #ifdef fts5YYERR
1a4b0 4f 52 53 59 4d 42 4f 4c 0d 0a 20 20 69 6e 74 20  ORSYMBOL..  int 
1a4c0 66 74 73 35 79 79 65 72 72 6f 72 68 69 74 20 3d  fts5yyerrorhit =
1a4d0 20 30 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66   0;   /* True if
1a4e0 20 66 74 73 35 79 79 6d 61 6a 6f 72 20 68 61 73   fts5yymajor has
1a4f0 20 69 6e 76 6f 6b 65 64 20 61 6e 20 65 72 72 6f   invoked an erro
1a500 72 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d 0a 20 20  r */..#endif..  
1a510 66 74 73 35 79 79 50 61 72 73 65 72 20 2a 66 74  fts5yyParser *ft
1a520 73 35 79 79 70 50 61 72 73 65 72 20 3d 20 28 66  s5yypParser = (f
1a530 74 73 35 79 79 50 61 72 73 65 72 2a 29 66 74 73  ts5yyParser*)fts
1a540 35 79 79 70 3b 20 20 2f 2a 20 54 68 65 20 70 61  5yyp;  /* The pa
1a550 72 73 65 72 20 2a 2f 0d 0a 20 20 73 71 6c 69 74  rser */..  sqlit
1a560 65 33 46 74 73 35 50 61 72 73 65 72 43 54 58 5f  e3Fts5ParserCTX_
1a570 46 45 54 43 48 0d 0a 20 20 73 71 6c 69 74 65 33  FETCH..  sqlite3
1a580 46 74 73 35 50 61 72 73 65 72 41 52 47 5f 53 54  Fts5ParserARG_ST
1a590 4f 52 45 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28  ORE....  assert(
1a5a0 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
1a5b0 66 74 73 35 79 79 74 6f 73 21 3d 30 20 29 3b 0d  fts5yytos!=0 );.
1a5c0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 74  .#if !defined(ft
1a5d0 73 35 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 29  s5YYERRORSYMBOL)
1a5e0 20 26 26 20 21 64 65 66 69 6e 65 64 28 66 74 73   && !defined(fts
1a5f0 35 59 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45  5YYNOERRORRECOVE
1a600 52 59 29 0d 0a 20 20 66 74 73 35 79 79 65 6e 64  RY)..  fts5yyend
1a610 6f 66 69 6e 70 75 74 20 3d 20 28 66 74 73 35 79  ofinput = (fts5y
1a620 79 6d 61 6a 6f 72 3d 3d 30 29 3b 0d 0a 23 65 6e  ymajor==0);..#en
1a630 64 69 66 0d 0a 0d 0a 20 20 66 74 73 35 79 79 61  dif....  fts5yya
1a640 63 74 20 3d 20 66 74 73 35 79 79 70 50 61 72 73  ct = fts5yypPars
1a650 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 2d 3e 73  er->fts5yytos->s
1a660 74 61 74 65 6e 6f 3b 0d 0a 23 69 66 6e 64 65 66  tateno;..#ifndef
1a670 20 4e 44 45 42 55 47 0d 0a 20 20 69 66 28 20 66   NDEBUG..  if( f
1a680 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 20 29  ts5yyTraceFILE )
1a690 7b 0d 0a 20 20 20 20 69 66 28 20 66 74 73 35 79  {..    if( fts5y
1a6a0 79 61 63 74 20 3c 20 66 74 73 35 59 59 5f 4d 49  yact < fts5YY_MI
1a6b0 4e 5f 52 45 44 55 43 45 20 29 7b 0d 0a 20 20 20  N_REDUCE ){..   
1a6c0 20 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79     fprintf(fts5y
1a6d0 79 54 72 61 63 65 46 49 4c 45 2c 22 25 73 49 6e  yTraceFILE,"%sIn
1a6e0 70 75 74 20 27 25 73 27 20 69 6e 20 73 74 61 74  put '%s' in stat
1a6f0 65 20 25 64 5c 6e 22 2c 0d 0a 20 20 20 20 20 20  e %d\n",..      
1a700 20 20 20 20 20 20 20 20 66 74 73 35 79 79 54 72          fts5yyTr
1a710 61 63 65 50 72 6f 6d 70 74 2c 66 74 73 35 79 79  acePrompt,fts5yy
1a720 54 6f 6b 65 6e 4e 61 6d 65 5b 66 74 73 35 79 79  TokenName[fts5yy
1a730 6d 61 6a 6f 72 5d 2c 66 74 73 35 79 79 61 63 74  major],fts5yyact
1a740 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a  );..    }else{..
1a750 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 74        fprintf(ft
1a760 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22 25  s5yyTraceFILE,"%
1a770 73 49 6e 70 75 74 20 27 25 73 27 20 77 69 74 68  sInput '%s' with
1a780 20 70 65 6e 64 69 6e 67 20 72 65 64 75 63 65 20   pending reduce 
1a790 25 64 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20  %d\n",..        
1a7a0 20 20 20 20 20 20 66 74 73 35 79 79 54 72 61 63        fts5yyTrac
1a7b0 65 50 72 6f 6d 70 74 2c 66 74 73 35 79 79 54 6f  ePrompt,fts5yyTo
1a7c0 6b 65 6e 4e 61 6d 65 5b 66 74 73 35 79 79 6d 61  kenName[fts5yyma
1a7d0 6a 6f 72 5d 2c 66 74 73 35 79 79 61 63 74 2d 66  jor],fts5yyact-f
1a7e0 74 73 35 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45  ts5YY_MIN_REDUCE
1a7f0 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  );..    }..  }..
1a800 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 64 6f 7b 0d  #endif....  do{.
1a810 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
1a820 35 79 79 61 63 74 3d 3d 66 74 73 35 79 79 70 50  5yyact==fts5yypP
1a830 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73  arser->fts5yytos
1a840 2d 3e 73 74 61 74 65 6e 6f 20 29 3b 0d 0a 20 20  ->stateno );..  
1a850 20 20 66 74 73 35 79 79 61 63 74 20 3d 20 66 74    fts5yyact = ft
1a860 73 35 79 79 5f 66 69 6e 64 5f 73 68 69 66 74 5f  s5yy_find_shift_
1a870 61 63 74 69 6f 6e 28 28 66 74 73 35 59 59 43 4f  action((fts5YYCO
1a880 44 45 54 59 50 45 29 66 74 73 35 79 79 6d 61 6a  DETYPE)fts5yymaj
1a890 6f 72 2c 66 74 73 35 79 79 61 63 74 29 3b 0d 0a  or,fts5yyact);..
1a8a0 20 20 20 20 69 66 28 20 66 74 73 35 79 79 61 63      if( fts5yyac
1a8b0 74 20 3e 3d 20 66 74 73 35 59 59 5f 4d 49 4e 5f  t >= fts5YY_MIN_
1a8c0 52 45 44 55 43 45 20 29 7b 0d 0a 20 20 20 20 20  REDUCE ){..     
1a8d0 20 66 74 73 35 79 79 61 63 74 20 3d 20 66 74 73   fts5yyact = fts
1a8e0 35 79 79 5f 72 65 64 75 63 65 28 66 74 73 35 79  5yy_reduce(fts5y
1a8f0 79 70 50 61 72 73 65 72 2c 66 74 73 35 79 79 61  ypParser,fts5yya
1a900 63 74 2d 66 74 73 35 59 59 5f 4d 49 4e 5f 52 45  ct-fts5YY_MIN_RE
1a910 44 55 43 45 2c 66 74 73 35 79 79 6d 61 6a 6f 72  DUCE,fts5yymajor
1a920 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1a930 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 79             fts5y
1a940 79 6d 69 6e 6f 72 20 73 71 6c 69 74 65 33 46 74  yminor sqlite3Ft
1a950 73 35 50 61 72 73 65 72 43 54 58 5f 50 41 52 41  s5ParserCTX_PARA
1a960 4d 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69  M);..    }else i
1a970 66 28 20 66 74 73 35 79 79 61 63 74 20 3c 3d 20  f( fts5yyact <= 
1a980 66 74 73 35 59 59 5f 4d 41 58 5f 53 48 49 46 54  fts5YY_MAX_SHIFT
1a990 52 45 44 55 43 45 20 29 7b 0d 0a 20 20 20 20 20  REDUCE ){..     
1a9a0 20 66 74 73 35 79 79 5f 73 68 69 66 74 28 66 74   fts5yy_shift(ft
1a9b0 73 35 79 79 70 50 61 72 73 65 72 2c 66 74 73 35  s5yypParser,fts5
1a9c0 79 79 61 63 74 2c 28 66 74 73 35 59 59 43 4f 44  yyact,(fts5YYCOD
1a9d0 45 54 59 50 45 29 66 74 73 35 79 79 6d 61 6a 6f  ETYPE)fts5yymajo
1a9e0 72 2c 66 74 73 35 79 79 6d 69 6e 6f 72 29 3b 0d  r,fts5yyminor);.
1a9f0 0a 23 69 66 6e 64 65 66 20 66 74 73 35 59 59 4e  .#ifndef fts5YYN
1aa00 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59 0d 0a  OERRORRECOVERY..
1aa10 20 20 20 20 20 20 66 74 73 35 79 79 70 50 61 72        fts5yypPar
1aa20 73 65 72 2d 3e 66 74 73 35 79 79 65 72 72 63 6e  ser->fts5yyerrcn
1aa30 74 2d 2d 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20  t--;..#endif..  
1aa40 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
1aa50 7d 65 6c 73 65 20 69 66 28 20 66 74 73 35 79 79  }else if( fts5yy
1aa60 61 63 74 3d 3d 66 74 73 35 59 59 5f 41 43 43 45  act==fts5YY_ACCE
1aa70 50 54 5f 41 43 54 49 4f 4e 20 29 7b 0d 0a 20 20  PT_ACTION ){..  
1aa80 20 20 20 20 66 74 73 35 79 79 70 50 61 72 73 65      fts5yypParse
1aa90 72 2d 3e 66 74 73 35 79 79 74 6f 73 2d 2d 3b 0d  r->fts5yytos--;.
1aaa0 0a 20 20 20 20 20 20 66 74 73 35 79 79 5f 61 63  .      fts5yy_ac
1aab0 63 65 70 74 28 66 74 73 35 79 79 70 50 61 72 73  cept(fts5yypPars
1aac0 65 72 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75  er);..      retu
1aad0 72 6e 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d  rn;..    }else{.
1aae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
1aaf0 74 73 35 79 79 61 63 74 20 3d 3d 20 66 74 73 35  ts5yyact == fts5
1ab00 59 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f 4e 20  YY_ERROR_ACTION 
1ab10 29 3b 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79  );..      fts5yy
1ab20 6d 69 6e 6f 72 75 6e 69 6f 6e 2e 66 74 73 35 79  minorunion.fts5y
1ab30 79 30 20 3d 20 66 74 73 35 79 79 6d 69 6e 6f 72  y0 = fts5yyminor
1ab40 3b 0d 0a 23 69 66 64 65 66 20 66 74 73 35 59 59  ;..#ifdef fts5YY
1ab50 45 52 52 4f 52 53 59 4d 42 4f 4c 0d 0a 20 20 20  ERRORSYMBOL..   
1ab60 20 20 20 69 6e 74 20 66 74 73 35 79 79 6d 78 3b     int fts5yymx;
1ab70 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64 65  ..#endif..#ifnde
1ab80 66 20 4e 44 45 42 55 47 0d 0a 20 20 20 20 20 20  f NDEBUG..      
1ab90 69 66 28 20 66 74 73 35 79 79 54 72 61 63 65 46  if( fts5yyTraceF
1aba0 49 4c 45 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ILE ){..        
1abb0 66 70 72 69 6e 74 66 28 66 74 73 35 79 79 54 72  fprintf(fts5yyTr
1abc0 61 63 65 46 49 4c 45 2c 22 25 73 53 79 6e 74 61  aceFILE,"%sSynta
1abd0 78 20 45 72 72 6f 72 21 5c 6e 22 2c 66 74 73 35  x Error!\n",fts5
1abe0 79 79 54 72 61 63 65 50 72 6f 6d 70 74 29 3b 0d  yyTracePrompt);.
1abf0 0a 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66  .      }..#endif
1ac00 0d 0a 23 69 66 64 65 66 20 66 74 73 35 59 59 45  ..#ifdef fts5YYE
1ac10 52 52 4f 52 53 59 4d 42 4f 4c 0d 0a 20 20 20 20  RRORSYMBOL..    
1ac20 20 20 2f 2a 20 41 20 73 79 6e 74 61 78 20 65 72    /* A syntax er
1ac30 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
1ac40 2e 0d 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  ...      ** The 
1ac50 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 6e 20 65  response to an e
1ac60 72 72 6f 72 20 64 65 70 65 6e 64 73 20 75 70 6f  rror depends upo
1ac70 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1ac80 20 74 68 65 0d 0a 20 20 20 20 20 20 2a 2a 20 67   the..      ** g
1ac90 72 61 6d 6d 61 72 20 64 65 66 69 6e 65 73 20 61  rammar defines a
1aca0 6e 20 65 72 72 6f 72 20 74 6f 6b 65 6e 20 22 45  n error token "E
1acb0 52 52 4f 52 22 2e 20 20 0d 0a 20 20 20 20 20 20  RROR".  ..      
1acc0 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  **..      ** Thi
1acd0 73 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 20  s is what we do 
1ace0 69 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 64  if the grammar d
1acf0 6f 65 73 20 64 65 66 69 6e 65 20 45 52 52 4f 52  oes define ERROR
1ad00 3a 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20  :..      **..   
1ad10 20 20 20 2a 2a 20 20 2a 20 43 61 6c 6c 20 74 68     **  * Call th
1ad20 65 20 25 73 79 6e 74 61 78 5f 65 72 72 6f 72 20  e %syntax_error 
1ad30 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  function...     
1ad40 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 20 2a   **..      **  *
1ad50 20 42 65 67 69 6e 20 70 6f 70 70 69 6e 67 20 74   Begin popping t
1ad60 68 65 20 73 74 61 63 6b 20 75 6e 74 69 6c 20 77  he stack until w
1ad70 65 20 65 6e 74 65 72 20 61 20 73 74 61 74 65 20  e enter a state 
1ad80 77 68 65 72 65 0d 0a 20 20 20 20 20 20 2a 2a 20  where..      ** 
1ad90 20 20 20 69 74 20 69 73 20 6c 65 67 61 6c 20 74     it is legal t
1ada0 6f 20 73 68 69 66 74 20 74 68 65 20 65 72 72 6f  o shift the erro
1adb0 72 20 73 79 6d 62 6f 6c 2c 20 74 68 65 6e 20 73  r symbol, then s
1adc0 68 69 66 74 0d 0a 20 20 20 20 20 20 2a 2a 20 20  hift..      **  
1add0 20 20 74 68 65 20 65 72 72 6f 72 20 73 79 6d 62    the error symb
1ade0 6f 6c 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20  ol...      **.. 
1adf0 20 20 20 20 20 2a 2a 20 20 2a 20 53 65 74 20 74       **  * Set t
1ae00 68 65 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 74  he error count t
1ae10 6f 20 74 68 72 65 65 2e 0d 0a 20 20 20 20 20 20  o three...      
1ae20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 20 2a 20  **..      **  * 
1ae30 42 65 67 69 6e 20 61 63 63 65 70 74 69 6e 67 20  Begin accepting 
1ae40 61 6e 64 20 73 68 69 66 74 69 6e 67 20 6e 65 77  and shifting new
1ae50 20 74 6f 6b 65 6e 73 2e 20 20 4e 6f 20 6e 65 77   tokens.  No new
1ae60 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 2a 2a   error..      **
1ae70 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 20 77      processing w
1ae80 69 6c 6c 20 6f 63 63 75 72 20 75 6e 74 69 6c 20  ill occur until 
1ae90 74 68 72 65 65 20 74 6f 6b 65 6e 73 20 68 61 76  three tokens hav
1aea0 65 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 2a 2a  e been..      **
1aeb0 20 20 20 20 73 68 69 66 74 65 64 20 73 75 63 63      shifted succ
1aec0 65 73 73 66 75 6c 6c 79 2e 0d 0a 20 20 20 20 20  essfully...     
1aed0 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20   **..      */.. 
1aee0 20 20 20 20 20 69 66 28 20 66 74 73 35 79 79 70       if( fts5yyp
1aef0 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 65 72  Parser->fts5yyer
1af00 72 63 6e 74 3c 30 20 29 7b 0d 0a 20 20 20 20 20  rcnt<0 ){..     
1af10 20 20 20 66 74 73 35 79 79 5f 73 79 6e 74 61 78     fts5yy_syntax
1af20 5f 65 72 72 6f 72 28 66 74 73 35 79 79 70 50 61  _error(fts5yypPa
1af30 72 73 65 72 2c 66 74 73 35 79 79 6d 61 6a 6f 72  rser,fts5yymajor
1af40 2c 66 74 73 35 79 79 6d 69 6e 6f 72 29 3b 0d 0a  ,fts5yyminor);..
1af50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 66        }..      f
1af60 74 73 35 79 79 6d 78 20 3d 20 66 74 73 35 79 79  ts5yymx = fts5yy
1af70 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74  pParser->fts5yyt
1af80 6f 73 2d 3e 6d 61 6a 6f 72 3b 0d 0a 20 20 20 20  os->major;..    
1af90 20 20 69 66 28 20 66 74 73 35 79 79 6d 78 3d 3d    if( fts5yymx==
1afa0 66 74 73 35 59 59 45 52 52 4f 52 53 59 4d 42 4f  fts5YYERRORSYMBO
1afb0 4c 20 7c 7c 20 66 74 73 35 79 79 65 72 72 6f 72  L || fts5yyerror
1afc0 68 69 74 20 29 7b 0d 0a 23 69 66 6e 64 65 66 20  hit ){..#ifndef 
1afd0 4e 44 45 42 55 47 0d 0a 20 20 20 20 20 20 20 20  NDEBUG..        
1afe0 69 66 28 20 66 74 73 35 79 79 54 72 61 63 65 46  if( fts5yyTraceF
1aff0 49 4c 45 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ILE ){..        
1b000 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79 79    fprintf(fts5yy
1b010 54 72 61 63 65 46 49 4c 45 2c 22 25 73 44 69 73  TraceFILE,"%sDis
1b020 63 61 72 64 20 69 6e 70 75 74 20 74 6f 6b 65 6e  card input token
1b030 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20   %s\n",..       
1b040 20 20 20 20 20 20 66 74 73 35 79 79 54 72 61 63        fts5yyTrac
1b050 65 50 72 6f 6d 70 74 2c 66 74 73 35 79 79 54 6f  ePrompt,fts5yyTo
1b060 6b 65 6e 4e 61 6d 65 5b 66 74 73 35 79 79 6d 61  kenName[fts5yyma
1b070 6a 6f 72 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20  jor]);..        
1b080 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20  }..#endif..     
1b090 20 20 20 66 74 73 35 79 79 5f 64 65 73 74 72 75     fts5yy_destru
1b0a0 63 74 6f 72 28 66 74 73 35 79 79 70 50 61 72 73  ctor(fts5yypPars
1b0b0 65 72 2c 20 28 66 74 73 35 59 59 43 4f 44 45 54  er, (fts5YYCODET
1b0c0 59 50 45 29 66 74 73 35 79 79 6d 61 6a 6f 72 2c  YPE)fts5yymajor,
1b0d0 20 26 66 74 73 35 79 79 6d 69 6e 6f 72 75 6e 69   &fts5yyminoruni
1b0e0 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20 66 74  on);..        ft
1b0f0 73 35 79 79 6d 61 6a 6f 72 20 3d 20 66 74 73 35  s5yymajor = fts5
1b100 59 59 4e 4f 43 4f 44 45 3b 0d 0a 20 20 20 20 20  YYNOCODE;..     
1b110 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20   }else{..       
1b120 20 77 68 69 6c 65 28 20 66 74 73 35 79 79 70 50   while( fts5yypP
1b130 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73  arser->fts5yytos
1b140 20 3e 3d 20 66 74 73 35 79 79 70 50 61 72 73 65   >= fts5yypParse
1b150 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 0d 0a  r->fts5yystack..
1b160 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
1b170 66 74 73 35 79 79 61 63 74 20 3d 20 66 74 73 35  fts5yyact = fts5
1b180 79 79 5f 66 69 6e 64 5f 72 65 64 75 63 65 5f 61  yy_find_reduce_a
1b190 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20  ction(..        
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1b0 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
1b1c0 74 73 35 79 79 74 6f 73 2d 3e 73 74 61 74 65 6e  ts5yytos->staten
1b1d0 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  o,..            
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1b1f0 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 29 29 20  YYERRORSYMBOL)) 
1b200 3e 20 66 74 73 35 59 59 5f 4d 41 58 5f 53 48 49  > fts5YY_MAX_SHI
1b210 46 54 52 45 44 55 43 45 0d 0a 20 20 20 20 20 20  FTREDUCE..      
1b220 20 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20    ){..          
1b230 66 74 73 35 79 79 5f 70 6f 70 5f 70 61 72 73 65  fts5yy_pop_parse
1b240 72 5f 73 74 61 63 6b 28 66 74 73 35 79 79 70 50  r_stack(fts5yypP
1b250 61 72 73 65 72 29 3b 0d 0a 20 20 20 20 20 20 20  arser);..       
1b260 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
1b270 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
1b280 74 73 35 79 79 74 6f 73 20 3c 20 66 74 73 35 79  ts5yytos < fts5y
1b290 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
1b2a0 73 74 61 63 6b 20 7c 7c 20 66 74 73 35 79 79 6d  stack || fts5yym
1b2b0 61 6a 6f 72 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  ajor==0 ){..    
1b2c0 20 20 20 20 20 20 66 74 73 35 79 79 5f 64 65 73        fts5yy_des
1b2d0 74 72 75 63 74 6f 72 28 66 74 73 35 79 79 70 50  tructor(fts5yypP
1b2e0 61 72 73 65 72 2c 28 66 74 73 35 59 59 43 4f 44  arser,(fts5YYCOD
1b2f0 45 54 59 50 45 29 66 74 73 35 79 79 6d 61 6a 6f  ETYPE)fts5yymajo
1b300 72 2c 26 66 74 73 35 79 79 6d 69 6e 6f 72 75 6e  r,&fts5yyminorun
1b310 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ion);..         
1b320 20 66 74 73 35 79 79 5f 70 61 72 73 65 5f 66 61   fts5yy_parse_fa
1b330 69 6c 65 64 28 66 74 73 35 79 79 70 50 61 72 73  iled(fts5yypPars
1b340 65 72 29 3b 0d 0a 23 69 66 6e 64 65 66 20 66 74  er);..#ifndef ft
1b350 73 35 59 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56  s5YYNOERRORRECOV
1b360 45 52 59 0d 0a 20 20 20 20 20 20 20 20 20 20 66  ERY..          f
1b370 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
1b380 73 35 79 79 65 72 72 63 6e 74 20 3d 20 2d 31 3b  s5yyerrcnt = -1;
1b390 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20  ..#endif..      
1b3a0 20 20 20 20 66 74 73 35 79 79 6d 61 6a 6f 72 20      fts5yymajor 
1b3b0 3d 20 66 74 73 35 59 59 4e 4f 43 4f 44 45 3b 0d  = fts5YYNOCODE;.
1b3c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1b3d0 66 28 20 66 74 73 35 79 79 6d 78 21 3d 66 74 73  f( fts5yymx!=fts
1b3e0 35 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 29  5YYERRORSYMBOL )
1b3f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  {..          fts
1b400 35 79 79 5f 73 68 69 66 74 28 66 74 73 35 79 79  5yy_shift(fts5yy
1b410 70 50 61 72 73 65 72 2c 66 74 73 35 79 79 61 63  pParser,fts5yyac
1b420 74 2c 66 74 73 35 59 59 45 52 52 4f 52 53 59 4d  t,fts5YYERRORSYM
1b430 42 4f 4c 2c 66 74 73 35 79 79 6d 69 6e 6f 72 29  BOL,fts5yyminor)
1b440 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
1b450 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 66 74 73      }..      fts
1b460 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
1b470 79 79 65 72 72 63 6e 74 20 3d 20 33 3b 0d 0a 20  yyerrcnt = 3;.. 
1b480 20 20 20 20 20 66 74 73 35 79 79 65 72 72 6f 72       fts5yyerror
1b490 68 69 74 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  hit = 1;..      
1b4a0 69 66 28 20 66 74 73 35 79 79 6d 61 6a 6f 72 3d  if( fts5yymajor=
1b4b0 3d 66 74 73 35 59 59 4e 4f 43 4f 44 45 20 29 20  =fts5YYNOCODE ) 
1b4c0 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 66 74  break;..      ft
1b4d0 73 35 79 79 61 63 74 20 3d 20 66 74 73 35 79 79  s5yyact = fts5yy
1b4e0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74  pParser->fts5yyt
1b4f0 6f 73 2d 3e 73 74 61 74 65 6e 6f 3b 0d 0a 23 65  os->stateno;..#e
1b500 6c 69 66 20 64 65 66 69 6e 65 64 28 66 74 73 35  lif defined(fts5
1b510 59 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52  YYNOERRORRECOVER
1b520 59 29 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  Y)..      /* If 
1b530 74 68 65 20 66 74 73 35 59 59 4e 4f 45 52 52 4f  the fts5YYNOERRO
1b540 52 52 45 43 4f 56 45 52 59 20 6d 61 63 72 6f 20  RRECOVERY macro 
1b550 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
1b560 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
1b570 74 6f 0d 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  to..      ** do 
1b580 61 6e 79 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  any kind of erro
1b590 72 20 72 65 63 6f 76 65 72 79 2e 20 20 49 6e 73  r recovery.  Ins
1b5a0 74 65 61 64 2c 20 73 69 6d 70 6c 79 20 69 6e 76  tead, simply inv
1b5b0 6f 6b 65 20 74 68 65 20 73 79 6e 74 61 78 0d 0a  oke the syntax..
1b5c0 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 72        ** error r
1b5d0 6f 75 74 69 6e 65 20 61 6e 64 20 63 6f 6e 74 69  outine and conti
1b5e0 6e 75 65 20 67 6f 69 6e 67 20 61 73 20 69 66 20  nue going as if 
1b5f0 6e 6f 74 68 69 6e 67 20 68 61 64 20 68 61 70 70  nothing had happ
1b600 65 6e 65 64 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d  ened...      **.
1b610 0a 20 20 20 20 20 20 2a 2a 20 41 70 70 6c 69 63  .      ** Applic
1b620 61 74 69 6f 6e 73 20 63 61 6e 20 73 65 74 20 74  ations can set t
1b630 68 69 73 20 6d 61 63 72 6f 20 28 66 6f 72 20 65  his macro (for e
1b640 78 61 6d 70 6c 65 20 69 6e 73 69 64 65 20 25 69  xample inside %i
1b650 6e 63 6c 75 64 65 29 20 69 66 0d 0a 20 20 20 20  nclude) if..    
1b660 20 20 2a 2a 20 74 68 65 79 20 69 6e 74 65 6e 64    ** they intend
1b670 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20   to abandon the 
1b680 70 61 72 73 65 20 75 70 6f 6e 20 74 68 65 20 66  parse upon the f
1b690 69 72 73 74 20 73 79 6e 74 61 78 20 65 72 72 6f  irst syntax erro
1b6a0 72 20 73 65 65 6e 2e 0d 0a 20 20 20 20 20 20 2a  r seen...      *
1b6b0 2f 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79 5f  /..      fts5yy_
1b6c0 73 79 6e 74 61 78 5f 65 72 72 6f 72 28 66 74 73  syntax_error(fts
1b6d0 35 79 79 70 50 61 72 73 65 72 2c 66 74 73 35 79  5yypParser,fts5y
1b6e0 79 6d 61 6a 6f 72 2c 20 66 74 73 35 79 79 6d 69  ymajor, fts5yymi
1b6f0 6e 6f 72 29 3b 0d 0a 20 20 20 20 20 20 66 74 73  nor);..      fts
1b700 35 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28 66  5yy_destructor(f
1b710 74 73 35 79 79 70 50 61 72 73 65 72 2c 28 66 74  ts5yypParser,(ft
1b720 73 35 59 59 43 4f 44 45 54 59 50 45 29 66 74 73  s5YYCODETYPE)fts
1b730 35 79 79 6d 61 6a 6f 72 2c 26 66 74 73 35 79 79  5yymajor,&fts5yy
1b740 6d 69 6e 6f 72 75 6e 69 6f 6e 29 3b 0d 0a 20 20  minorunion);..  
1b750 20 20 20 20 62 72 65 61 6b 3b 0d 0a 23 65 6c 73      break;..#els
1b760 65 20 20 2f 2a 20 66 74 73 35 59 59 45 52 52 4f  e  /* fts5YYERRO
1b770 52 53 59 4d 42 4f 4c 20 69 73 20 6e 6f 74 20 64  RSYMBOL is not d
1b780 65 66 69 6e 65 64 20 2a 2f 0d 0a 20 20 20 20 20  efined */..     
1b790 20 2f 2a 20 54 68 69 73 20 69 73 20 77 68 61 74   /* This is what
1b7a0 20 77 65 20 64 6f 20 69 66 20 74 68 65 20 67 72   we do if the gr
1b7b0 61 6d 6d 61 72 20 64 6f 65 73 20 6e 6f 74 20 64  ammar does not d
1b7c0 65 66 69 6e 65 20 45 52 52 4f 52 3a 0d 0a 20 20  efine ERROR:..  
1b7d0 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a      **..      **
1b7e0 20 20 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72    * Report an er
1b7f0 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 61 6e 64  ror message, and
1b800 20 74 68 72 6f 77 20 61 77 61 79 20 74 68 65 20   throw away the 
1b810 69 6e 70 75 74 20 74 6f 6b 65 6e 2e 0d 0a 20 20  input token...  
1b820 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a      **..      **
1b830 20 20 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74    * If the input
1b840 20 74 6f 6b 65 6e 20 69 73 20 24 2c 20 74 68 65   token is $, the
1b850 6e 20 66 61 69 6c 20 74 68 65 20 70 61 72 73 65  n fail the parse
1b860 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20  ...      **..   
1b870 20 20 20 2a 2a 20 41 73 20 62 65 66 6f 72 65 2c     ** As before,
1b880 20 73 75 62 73 65 71 75 65 6e 74 20 65 72 72 6f   subsequent erro
1b890 72 20 6d 65 73 73 61 67 65 73 20 61 72 65 20 73  r messages are s
1b8a0 75 70 70 72 65 73 73 65 64 20 75 6e 74 69 6c 0d  uppressed until.
1b8b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 72 65 65 20  .      ** three 
1b8c0 69 6e 70 75 74 20 74 6f 6b 65 6e 73 20 68 61 76  input tokens hav
1b8d0 65 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  e been successfu
1b8e0 6c 6c 79 20 73 68 69 66 74 65 64 2e 0d 0a 20 20  lly shifted...  
1b8f0 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 69 66      */..      if
1b900 28 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  ( fts5yypParser-
1b910 3e 66 74 73 35 79 79 65 72 72 63 6e 74 3c 3d 30  >fts5yyerrcnt<=0
1b920 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 66 74 73   ){..        fts
1b930 35 79 79 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  5yy_syntax_error
1b940 28 66 74 73 35 79 79 70 50 61 72 73 65 72 2c 66  (fts5yypParser,f
1b950 74 73 35 79 79 6d 61 6a 6f 72 2c 20 66 74 73 35  ts5yymajor, fts5
1b960 79 79 6d 69 6e 6f 72 29 3b 0d 0a 20 20 20 20 20  yyminor);..     
1b970 20 7d 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79   }..      fts5yy
1b980 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 65  pParser->fts5yye
1b990 72 72 63 6e 74 20 3d 20 33 3b 0d 0a 20 20 20 20  rrcnt = 3;..    
1b9a0 20 20 66 74 73 35 79 79 5f 64 65 73 74 72 75 63    fts5yy_destruc
1b9b0 74 6f 72 28 66 74 73 35 79 79 70 50 61 72 73 65  tor(fts5yypParse
1b9c0 72 2c 28 66 74 73 35 59 59 43 4f 44 45 54 59 50  r,(fts5YYCODETYP
1b9d0 45 29 66 74 73 35 79 79 6d 61 6a 6f 72 2c 26 66  E)fts5yymajor,&f
1b9e0 74 73 35 79 79 6d 69 6e 6f 72 75 6e 69 6f 6e 29  ts5yyminorunion)
1b9f0 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  ;..      if( fts
1ba00 35 79 79 65 6e 64 6f 66 69 6e 70 75 74 20 29 7b  5yyendofinput ){
1ba10 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35 79 79  ..        fts5yy
1ba20 5f 70 61 72 73 65 5f 66 61 69 6c 65 64 28 66 74  _parse_failed(ft
1ba30 73 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 23  s5yypParser);..#
1ba40 69 66 6e 64 65 66 20 66 74 73 35 59 59 4e 4f 45  ifndef fts5YYNOE
1ba50 52 52 4f 52 52 45 43 4f 56 45 52 59 0d 0a 20 20  RRORRECOVERY..  
1ba60 20 20 20 20 20 20 66 74 73 35 79 79 70 50 61 72        fts5yypPar
1ba70 73 65 72 2d 3e 66 74 73 35 79 79 65 72 72 63 6e  ser->fts5yyerrcn
1ba80 74 20 3d 20 2d 31 3b 0d 0a 23 65 6e 64 69 66 0d  t = -1;..#endif.
1ba90 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
1baa0 62 72 65 61 6b 3b 0d 0a 23 65 6e 64 69 66 0d 0a  break;..#endif..
1bab0 20 20 20 20 7d 0d 0a 20 20 7d 77 68 69 6c 65 28      }..  }while(
1bac0 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
1bad0 66 74 73 35 79 79 74 6f 73 3e 66 74 73 35 79 79  fts5yytos>fts5yy
1bae0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73  pParser->fts5yys
1baf0 74 61 63 6b 20 29 3b 0d 0a 23 69 66 6e 64 65 66  tack );..#ifndef
1bb00 20 4e 44 45 42 55 47 0d 0a 20 20 69 66 28 20 66   NDEBUG..  if( f
1bb10 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 20 29  ts5yyTraceFILE )
1bb20 7b 0d 0a 20 20 20 20 66 74 73 35 79 79 53 74 61  {..    fts5yySta
1bb30 63 6b 45 6e 74 72 79 20 2a 69 3b 0d 0a 20 20 20  ckEntry *i;..   
1bb40 20 63 68 61 72 20 63 44 69 76 20 3d 20 27 5b 27   char cDiv = '['
1bb50 3b 0d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ;..    fprintf(f
1bb60 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22  ts5yyTraceFILE,"
1bb70 25 73 52 65 74 75 72 6e 2e 20 53 74 61 63 6b 3d  %sReturn. Stack=
1bb80 22 2c 66 74 73 35 79 79 54 72 61 63 65 50 72 6f  ",fts5yyTracePro
1bb90 6d 70 74 29 3b 0d 0a 20 20 20 20 66 6f 72 28 69  mpt);..    for(i
1bba0 3d 26 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  =&fts5yypParser-
1bbb0 3e 66 74 73 35 79 79 73 74 61 63 6b 5b 31 5d 3b  >fts5yystack[1];
1bbc0 20 69 3c 3d 66 74 73 35 79 79 70 50 61 72 73 65   i<=fts5yypParse
1bbd0 72 2d 3e 66 74 73 35 79 79 74 6f 73 3b 20 69 2b  r->fts5yytos; i+
1bbe0 2b 29 7b 0d 0a 20 20 20 20 20 20 66 70 72 69 6e  +){..      fprin
1bbf0 74 66 28 66 74 73 35 79 79 54 72 61 63 65 46 49  tf(fts5yyTraceFI
1bc00 4c 45 2c 22 25 63 25 73 22 2c 20 63 44 69 76 2c  LE,"%c%s", cDiv,
1bc10 20 66 74 73 35 79 79 54 6f 6b 65 6e 4e 61 6d 65   fts5yyTokenName
1bc20 5b 69 2d 3e 6d 61 6a 6f 72 5d 29 3b 0d 0a 20 20  [i->major]);..  
1bc30 20 20 20 20 63 44 69 76 20 3d 20 27 20 27 3b 0d      cDiv = ' ';.
1bc40 0a 20 20 20 20 7d 0d 0a 20 20 20 20 66 70 72 69  .    }..    fpri
1bc50 6e 74 66 28 66 74 73 35 79 79 54 72 61 63 65 46  ntf(fts5yyTraceF
1bc60 49 4c 45 2c 22 5d 5c 6e 22 29 3b 0d 0a 20 20 7d  ILE,"]\n");..  }
1bc70 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 72 65 74 75  ..#endif..  retu
1bc80 72 6e 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  rn;..}..../*..**
1bc90 20 52 65 74 75 72 6e 20 74 68 65 20 66 61 6c 6c   Return the fall
1bca0 62 61 63 6b 20 74 6f 6b 65 6e 20 63 6f 72 72 65  back token corre
1bcb0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 63 61 6e 6f  sponding to cano
1bcc0 6e 69 63 61 6c 20 74 6f 6b 65 6e 20 69 54 6f 6b  nical token iTok
1bcd0 65 6e 2c 20 6f 72 0d 0a 2a 2a 20 30 20 69 66 20  en, or..** 0 if 
1bce0 69 54 6f 6b 65 6e 20 68 61 73 20 6e 6f 20 66 61  iToken has no fa
1bcf0 6c 6c 62 61 63 6b 2e 0d 0a 2a 2f 0d 0a 73 74 61  llback...*/..sta
1bd00 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
1bd10 74 73 35 50 61 72 73 65 72 46 61 6c 6c 62 61 63  ts5ParserFallbac
1bd20 6b 28 69 6e 74 20 69 54 6f 6b 65 6e 29 7b 0d 0a  k(int iToken){..
1bd30 23 69 66 64 65 66 20 66 74 73 35 59 59 46 41 4c  #ifdef fts5YYFAL
1bd40 4c 42 41 43 4b 0d 0a 20 20 69 66 28 20 69 54 6f  LBACK..  if( iTo
1bd50 6b 65 6e 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ken<(int)(sizeof
1bd60 28 66 74 73 35 79 79 46 61 6c 6c 62 61 63 6b 29  (fts5yyFallback)
1bd70 2f 73 69 7a 65 6f 66 28 66 74 73 35 79 79 46 61  /sizeof(fts5yyFa
1bd80 6c 6c 62 61 63 6b 5b 30 5d 29 29 20 29 7b 0d 0a  llback[0])) ){..
1bd90 20 20 20 20 72 65 74 75 72 6e 20 66 74 73 35 79      return fts5y
1bda0 79 46 61 6c 6c 62 61 63 6b 5b 69 54 6f 6b 65 6e  yFallback[iToken
1bdb0 5d 3b 0d 0a 20 20 7d 0d 0a 23 65 6c 73 65 0d 0a  ];..  }..#else..
1bdc0 20 20 28 76 6f 69 64 29 69 54 6f 6b 65 6e 3b 0d    (void)iToken;.
1bdd0 0a 23 65 6e 64 69 66 0d 0a 20 20 72 65 74 75 72  .#endif..  retur
1bde0 6e 20 30 3b 0d 0a 7d 0d 0a 0d 0a 23 6c 69 6e 65  n 0;..}....#line
1bdf0 20 31 20 22 66 74 73 35 5f 61 75 78 2e 63 22 0d   1 "fts5_aux.c".
1be00 0a 2f 2a 0d 0a 2a 2a 20 32 30 31 34 20 4d 61 79  ./*..** 2014 May
1be10 20 33 31 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20   31..**..** The 
1be20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
1be30 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
1be40 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
1be50 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a   In place of..**
1be60 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
1be70 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
1be80 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20  ing:..**..**    
1be90 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
1bea0 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a  and not evil...*
1beb0 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  *    May you fin
1bec0 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
1bed0 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
1bee0 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a  orgive others...
1bef0 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  **    May you sh
1bf00 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
1bf10 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
1bf20 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a  an you give...**
1bf30 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
1bf40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf80 0d 0a 2a 2f 0d 0a 0d 0a 0d 0a 2f 2a 20 23 69 6e  ..*/....../* #in
1bf90 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68  clude "fts5Int.h
1bfa0 22 20 2a 2f 0d 0a 23 69 6e 63 6c 75 64 65 20 3c  " */..#include <
1bfb0 6d 61 74 68 2e 68 3e 20 20 20 20 20 20 20 20 20  math.h>         
1bfc0 20 20 20 20 20 20 20 20 2f 2a 20 61 6d 61 6c 67          /* amalg
1bfd0 61 6d 61 74 6f 72 3a 20 6b 65 65 70 20 2a 2f 0d  amator: keep */.
1bfe0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4f 62 6a 65 63 74  .../*..** Object
1bff0 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
1c000 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 22 63 6f   through all "co
1c010 61 6c 65 73 63 65 64 20 70 68 72 61 73 65 20 69  alesced phrase i
1c020 6e 73 74 61 6e 63 65 73 22 20 69 6e 20 0d 0a 2a  nstances" in ..*
1c030 2a 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  * a single colum
1c040 6e 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  n of the current
1c050 20 72 6f 77 2e 20 49 66 20 74 68 65 20 70 68 72   row. If the phr
1c060 61 73 65 20 69 6e 73 74 61 6e 63 65 73 20 69 6e  ase instances in
1c070 20 74 68 65 0d 0a 2a 2a 20 63 6f 6c 75 6d 6e 20   the..** column 
1c080 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64  being considered
1c090 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 2c   do not overlap,
1c0a0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 73 69 6d   this object sim
1c0b0 70 6c 79 20 69 74 65 72 61 74 65 73 0d 0a 2a 2a  ply iterates..**
1c0c0 20 74 68 72 6f 75 67 68 20 74 68 65 6d 2e 20 4f   through them. O
1c0d0 72 2c 20 69 66 20 74 68 65 79 20 64 6f 20 6f 76  r, if they do ov
1c0e0 65 72 6c 61 70 20 28 73 68 61 72 65 20 6f 6e 65  erlap (share one
1c0f0 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e 73 20   or more tokens 
1c100 69 6e 0d 0a 2a 2a 20 63 6f 6d 6d 6f 6e 29 2c 20  in..** common), 
1c110 65 61 63 68 20 73 65 74 20 6f 66 20 6f 76 65 72  each set of over
1c120 6c 61 70 70 69 6e 67 20 69 6e 73 74 61 6e 63 65  lapping instance
1c130 73 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20  s is treated as 
1c140 61 20 73 69 6e 67 6c 65 0d 0a 2a 2a 20 6d 61 74  a single..** mat
1c150 63 68 2e 20 53 65 65 20 64 6f 63 75 6d 65 6e 74  ch. See document
1c160 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 68 69  ation for the hi
1c170 67 68 6c 69 67 68 74 28 29 20 61 75 78 69 6c 69  ghlight() auxili
1c180 61 72 79 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ary function for
1c190 0d 0a 2a 2a 20 64 65 74 61 69 6c 73 2e 0d 0a 2a  ..** details...*
1c1a0 2a 0d 0a 2a 2a 20 55 73 61 67 65 20 69 73 3a 0d  *..** Usage is:.
1c1b0 0a 2a 2a 0d 0a 2a 2a 20 20 20 66 6f 72 28 72 63  .**..**   for(rc
1c1c0 20 3d 20 66 74 73 35 43 49 6e 73 74 49 74 65 72   = fts5CInstIter
1c1d0 4e 65 78 74 28 70 41 70 69 2c 20 70 46 74 73 2c  Next(pApi, pFts,
1c1e0 20 69 43 6f 6c 2c 20 26 69 74 65 72 29 3b 0d 0a   iCol, &iter);..
1c1f0 2a 2a 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c  **      (rc==SQL
1c200 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73  ITE_OK && 0==fts
1c210 35 43 49 6e 73 74 49 74 65 72 45 6f 66 28 26 69  5CInstIterEof(&i
1c220 74 65 72 29 3b 0d 0a 2a 2a 20 20 20 20 20 20 72  ter);..**      r
1c230 63 20 3d 20 66 74 73 35 43 49 6e 73 74 49 74 65  c = fts5CInstIte
1c240 72 4e 65 78 74 28 26 69 74 65 72 29 0d 0a 2a 2a  rNext(&iter)..**
1c250 20 20 20 29 7b 0d 0a 2a 2a 20 20 20 20 20 70 72     ){..**     pr
1c260 69 6e 74 66 28 22 69 6e 73 74 61 6e 63 65 20 73  intf("instance s
1c270 74 61 72 74 73 20 61 74 20 25 64 2c 20 65 6e 64  tarts at %d, end
1c280 73 20 61 74 20 25 64 5c 6e 22 2c 20 69 74 65 72  s at %d\n", iter
1c290 2e 69 53 74 61 72 74 2c 20 69 74 65 72 2e 69 45  .iStart, iter.iE
1c2a0 6e 64 29 3b 0d 0a 2a 2a 20 20 20 7d 0d 0a 2a 2a  nd);..**   }..**
1c2b0 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74  ..*/..typedef st
1c2c0 72 75 63 74 20 43 49 6e 73 74 49 74 65 72 20 43  ruct CInstIter C
1c2d0 49 6e 73 74 49 74 65 72 3b 0d 0a 73 74 72 75 63  InstIter;..struc
1c2e0 74 20 43 49 6e 73 74 49 74 65 72 20 7b 0d 0a 20  t CInstIter {.. 
1c2f0 20 63 6f 6e 73 74 20 46 74 73 35 45 78 74 65 6e   const Fts5Exten
1c300 73 69 6f 6e 41 70 69 20 2a 70 41 70 69 3b 20 20  sionApi *pApi;  
1c310 20 2f 2a 20 41 50 49 20 6f 66 66 65 72 65 64 20   /* API offered 
1c320 62 79 20 63 75 72 72 65 6e 74 20 46 54 53 20 76  by current FTS v
1c330 65 72 73 69 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73  ersion */..  Fts
1c340 35 43 6f 6e 74 65 78 74 20 2a 70 46 74 73 3b 20  5Context *pFts; 
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c360 46 69 72 73 74 20 61 72 67 20 74 6f 20 70 61 73  First arg to pas
1c370 73 20 74 6f 20 70 41 70 69 20 66 75 6e 63 74 69  s to pApi functi
1c380 6f 6e 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 43  ons */..  int iC
1c390 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
1c3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1c3b0 75 6d 6e 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  umn to search */
1c3c0 0d 0a 20 20 69 6e 74 20 69 49 6e 73 74 3b 20 20  ..  int iInst;  
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 20 20 20 2f 2a 20 4e 65 78 74 20 70 68 72 61      /* Next phra
1c3f0 73 65 20 69 6e 73 74 61 6e 63 65 20 69 6e 64 65  se instance inde
1c400 78 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 49 6e 73  x */..  int nIns
1c410 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1c420 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
1c430 20 6e 75 6d 62 65 72 20 6f 66 20 70 68 72 61 73   number of phras
1c440 65 20 69 6e 73 74 61 6e 63 65 73 20 2a 2f 0d 0a  e instances */..
1c450 0d 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
1c460 72 69 61 62 6c 65 73 20 2a 2f 0d 0a 20 20 69 6e  riables */..  in
1c470 74 20 69 53 74 61 72 74 3b 20 20 20 20 20 20 20  t iStart;       
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c490 20 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20   First token in 
1c4a0 63 6f 61 6c 65 73 63 65 64 20 70 68 72 61 73 65  coalesced phrase
1c4b0 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0d 0a 20 20   instance */..  
1c4c0 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 2f 2a 20 4c 61 73 74 20 74 6f 6b 65 6e 20 69 6e  /* Last token in
1c4f0 20 63 6f 61 6c 65 73 63 65 64 20 70 68 72 61 73   coalesced phras
1c500 65 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0d 0a 7d  e instance */..}
1c510 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 64 76 61  ;..../*..** Adva
1c520 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
1c530 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 6f 61   to the next coa
1c540 6c 65 73 63 65 64 20 70 68 72 61 73 65 20 69 6e  lesced phrase in
1c550 73 74 61 6e 63 65 2e 20 52 65 74 75 72 6e 0d 0a  stance. Return..
1c560 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
1c570 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
1c580 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 53  ror occurs, or S
1c590 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77 69  QLITE_OK otherwi
1c5a0 73 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  se...*/..static 
1c5b0 69 6e 74 20 66 74 73 35 43 49 6e 73 74 49 74 65  int fts5CInstIte
1c5c0 72 4e 65 78 74 28 43 49 6e 73 74 49 74 65 72 20  rNext(CInstIter 
1c5d0 2a 70 49 74 65 72 29 7b 0d 0a 20 20 69 6e 74 20  *pIter){..  int 
1c5e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d  rc = SQLITE_OK;.
1c5f0 0a 20 20 70 49 74 65 72 2d 3e 69 53 74 61 72 74  .  pIter->iStart
1c600 20 3d 20 2d 31 3b 0d 0a 20 20 70 49 74 65 72 2d   = -1;..  pIter-
1c610 3e 69 45 6e 64 20 3d 20 2d 31 3b 0d 0a 0d 0a 20  >iEnd = -1;.... 
1c620 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1c630 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e  TE_OK && pIter->
1c640 69 49 6e 73 74 3c 70 49 74 65 72 2d 3e 6e 49 6e  iInst<pIter->nIn
1c650 73 74 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69  st ){..    int i
1c660 70 3b 20 69 6e 74 20 69 63 3b 20 69 6e 74 20 69  p; int ic; int i
1c670 6f 3b 0d 0a 20 20 20 20 72 63 20 3d 20 70 49 74  o;..    rc = pIt
1c680 65 72 2d 3e 70 41 70 69 2d 3e 78 49 6e 73 74 28  er->pApi->xInst(
1c690 70 49 74 65 72 2d 3e 70 46 74 73 2c 20 70 49 74  pIter->pFts, pIt
1c6a0 65 72 2d 3e 69 49 6e 73 74 2c 20 26 69 70 2c 20  er->iInst, &ip, 
1c6b0 26 69 63 2c 20 26 69 6f 29 3b 0d 0a 20 20 20 20  &ic, &io);..    
1c6c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c6d0 4b 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20  K ){..      if( 
1c6e0 69 63 3d 3d 70 49 74 65 72 2d 3e 69 43 6f 6c 20  ic==pIter->iCol 
1c6f0 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ){..        int 
1c700 69 45 6e 64 20 3d 20 69 6f 20 2d 20 31 20 2b 20  iEnd = io - 1 + 
1c710 70 49 74 65 72 2d 3e 70 41 70 69 2d 3e 78 50 68  pIter->pApi->xPh
1c720 72 61 73 65 53 69 7a 65 28 70 49 74 65 72 2d 3e  raseSize(pIter->
1c730 70 46 74 73 2c 20 69 70 29 3b 0d 0a 20 20 20 20  pFts, ip);..    
1c740 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
1c750 53 74 61 72 74 3c 30 20 29 7b 0d 0a 20 20 20 20  Start<0 ){..    
1c760 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 74        pIter->iSt
1c770 61 72 74 20 3d 20 69 6f 3b 0d 0a 20 20 20 20 20  art = io;..     
1c780 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
1c790 20 3d 20 69 45 6e 64 3b 0d 0a 20 20 20 20 20 20   = iEnd;..      
1c7a0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 6f 3c 3d    }else if( io<=
1c7b0 70 49 74 65 72 2d 3e 69 45 6e 64 20 29 7b 0d 0a  pIter->iEnd ){..
1c7c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 45            if( iE
1c7d0 6e 64 3e 70 49 74 65 72 2d 3e 69 45 6e 64 20 29  nd>pIter->iEnd )
1c7e0 20 70 49 74 65 72 2d 3e 69 45 6e 64 20 3d 20 69   pIter->iEnd = i
1c7f0 45 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65  End;..        }e
1c800 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse{..          
1c810 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20  break;..        
1c820 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1c830 20 20 70 49 74 65 72 2d 3e 69 49 6e 73 74 2b 2b    pIter->iInst++
1c840 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
1c850 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d  .  return rc;..}
1c860 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69  ..../*..** Initi
1c870 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74  alize the iterat
1c880 6f 72 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61  or object indica
1c890 74 65 64 20 62 79 20 74 68 65 20 66 69 6e 61 6c  ted by the final
1c8a0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 0d 0a   parameter to ..
1c8b0 2a 2a 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  ** iterate throu
1c8c0 67 68 20 63 6f 61 6c 65 73 63 65 64 20 70 68 72  gh coalesced phr
1c8d0 61 73 65 20 69 6e 73 74 61 6e 63 65 73 20 69 6e  ase instances in
1c8e0 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 0d 0a 2a   column iCol...*
1c8f0 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
1c900 73 35 43 49 6e 73 74 49 74 65 72 49 6e 69 74 28  s5CInstIterInit(
1c910 0d 0a 20 20 63 6f 6e 73 74 20 46 74 73 35 45 78  ..  const Fts5Ex
1c920 74 65 6e 73 69 6f 6e 41 70 69 20 2a 70 41 70 69  tensionApi *pApi
1c930 2c 0d 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74  ,..  Fts5Context
1c940 20 2a 70 46 74 73 2c 0d 0a 20 20 69 6e 74 20 69   *pFts,..  int i
1c950 43 6f 6c 2c 0d 0a 20 20 43 49 6e 73 74 49 74 65  Col,..  CInstIte
1c960 72 20 2a 70 49 74 65 72 0d 0a 29 7b 0d 0a 20 20  r *pIter..){..  
1c970 69 6e 74 20 72 63 3b 0d 0a 0d 0a 20 20 6d 65 6d  int rc;....  mem
1c980 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
1c990 7a 65 6f 66 28 43 49 6e 73 74 49 74 65 72 29 29  zeof(CInstIter))
1c9a0 3b 0d 0a 20 20 70 49 74 65 72 2d 3e 70 41 70 69  ;..  pIter->pApi
1c9b0 20 3d 20 70 41 70 69 3b 0d 0a 20 20 70 49 74 65   = pApi;..  pIte
1c9c0 72 2d 3e 70 46 74 73 20 3d 20 70 46 74 73 3b 0d  r->pFts = pFts;.
1c9d0 0a 20 20 70 49 74 65 72 2d 3e 69 43 6f 6c 20 3d  .  pIter->iCol =
1c9e0 20 69 43 6f 6c 3b 0d 0a 20 20 72 63 20 3d 20 70   iCol;..  rc = p
1c9f0 41 70 69 2d 3e 78 49 6e 73 74 43 6f 75 6e 74 28  Api->xInstCount(
1ca00 70 46 74 73 2c 20 26 70 49 74 65 72 2d 3e 6e 49  pFts, &pIter->nI
1ca10 6e 73 74 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 72  nst);....  if( r
1ca20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
1ca30 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 43 49  .    rc = fts5CI
1ca40 6e 73 74 49 74 65 72 4e 65 78 74 28 70 49 74 65  nstIterNext(pIte
1ca50 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65  r);..  }....  re
1ca60 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d  turn rc;..}.....
1ca70 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
1ca80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1caa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a  *************..*
1cac0 2a 20 53 74 61 72 74 20 6f 66 20 68 69 67 68 6c  * Start of highl
1cad0 69 67 68 74 28 29 20 69 6d 70 6c 65 6d 65 6e 74  ight() implement
1cae0 61 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 74 79 70 65  ation...*/..type
1caf0 64 65 66 20 73 74 72 75 63 74 20 48 69 67 68 6c  def struct Highl
1cb00 69 67 68 74 43 6f 6e 74 65 78 74 20 48 69 67 68  ightContext High
1cb10 6c 69 67 68 74 43 6f 6e 74 65 78 74 3b 0d 0a 73  lightContext;..s
1cb20 74 72 75 63 74 20 48 69 67 68 6c 69 67 68 74 43  truct HighlightC
1cb30 6f 6e 74 65 78 74 20 7b 0d 0a 20 20 43 49 6e 73  ontext {..  CIns
1cb40 74 49 74 65 72 20 69 74 65 72 3b 20 20 20 20 20  tIter iter;     
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1cb60 6f 61 6c 65 73 63 65 64 20 49 6e 73 74 61 6e 63  oalesced Instanc
1cb70 65 20 49 74 65 72 61 74 6f 72 20 2a 2f 0d 0a 20  e Iterator */.. 
1cb80 20 69 6e 74 20 69 50 6f 73 3b 20 20 20 20 20 20   int iPos;      
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 6f 6b 65   /* Current toke
1cbb0 6e 20 6f 66 66 73 65 74 20 69 6e 20 7a 49 6e 5b  n offset in zIn[
1cbc0 5d 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 52 61 6e  ] */..  int iRan
1cbd0 67 65 53 74 61 72 74 3b 20 20 20 20 20 20 20 20  geStart;        
1cbe0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1cbf0 20 74 6f 6b 65 6e 20 74 6f 20 69 6e 63 6c 75 64   token to includ
1cc00 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 52 61 6e  e */..  int iRan
1cc10 67 65 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  geEnd;          
1cc20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
1cc30 6e 2d 7a 65 72 6f 2c 20 6c 61 73 74 20 74 6f 6b  n-zero, last tok
1cc40 65 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 2a 2f  en to include */
1cc50 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
1cc60 7a 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  zOpen;          
1cc70 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 68      /* Opening h
1cc80 69 67 68 6c 69 67 68 74 20 2a 2f 0d 0a 20 20 63  ighlight */..  c
1cc90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6c 6f 73  onst char *zClos
1cca0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1ccb0 2a 20 43 6c 6f 73 69 6e 67 20 68 69 67 68 6c 69  * Closing highli
1ccc0 67 68 74 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20  ght */..  const 
1ccd0 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20  char *zIn;      
1cce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
1ccf0 75 74 20 74 65 78 74 20 2a 2f 0d 0a 20 20 69 6e  ut text */..  in
1cd00 74 20 6e 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t nIn;          
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cd20 20 53 69 7a 65 20 6f 66 20 69 6e 70 75 74 20 74   Size of input t
1cd30 65 78 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d  ext in bytes */.
1cd40 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20  .  int iOff;    
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66     /* Current of
1cd70 66 73 65 74 20 77 69 74 68 69 6e 20 7a 49 6e 5b  fset within zIn[
1cd80 5d 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 4f  ] */..  char *zO
1cd90 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
1cda0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
1cdb0 74 20 76 61 6c 75 65 20 2a 2f 0d 0a 7d 3b 0d 0a  t value */..};..
1cdc0 0d 0a 2f 2a 0d 0a 2a 2a 20 41 70 70 65 6e 64 20  ../*..** Append 
1cdd0 74 65 78 74 20 74 6f 20 74 68 65 20 48 69 67 68  text to the High
1cde0 6c 69 67 68 74 43 6f 6e 74 65 78 74 20 6f 75 74  lightContext out
1cdf0 70 75 74 20 73 74 72 69 6e 67 20 2d 20 70 2d 3e  put string - p->
1ce00 7a 4f 75 74 2e 20 41 72 67 75 6d 65 6e 74 0d 0a  zOut. Argument..
1ce10 2a 2a 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61  ** z points to a
1ce20 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1ce30 6e 67 20 6e 20 62 79 74 65 73 20 6f 66 20 74 65  ng n bytes of te
1ce40 78 74 20 74 6f 20 61 70 70 65 6e 64 2e 20 49 66  xt to append. If
1ce50 20 6e 20 69 73 20 0d 0a 2a 2a 20 6e 65 67 61 74   n is ..** negat
1ce60 69 76 65 2c 20 65 76 65 72 79 74 68 69 6e 67 20  ive, everything 
1ce70 75 70 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  up until the fir
1ce80 73 74 20 27 5c 30 27 20 69 73 20 61 70 70 65 6e  st '\0' is appen
1ce90 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ded to the outpu
1cea0 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 2a 70  t...**..** If *p
1ceb0 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 79  Rc is set to any
1cec0 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74 68 61   value other tha
1ced0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  n SQLITE_OK when
1cee0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1cef0 73 20 0d 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 69  s ..** called, i
1cf00 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 49 66  t is a no-op. If
1cf10 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e 20   an error (i.e. 
1cf20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
1cf30 29 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  ) is encountered
1cf40 2c 20 0d 0a 2a 2a 20 2a 70 52 63 20 69 73 20 73  , ..** *pRc is s
1cf50 65 74 20 74 6f 20 61 6e 20 65 72 72 6f 72 20 63  et to an error c
1cf60 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ode before retur
1cf70 6e 69 6e 67 2e 20 0d 0a 2a 2f 0d 0a 73 74 61 74  ning. ..*/..stat
1cf80 69 63 20 76 6f 69 64 20 66 74 73 35 48 69 67 68  ic void fts5High
1cf90 6c 69 67 68 74 41 70 70 65 6e 64 28 0d 0a 20 20  lightAppend(..  
1cfa0 69 6e 74 20 2a 70 52 63 2c 20 0d 0a 20 20 48 69  int *pRc, ..  Hi
1cfb0 67 68 6c 69 67 68 74 43 6f 6e 74 65 78 74 20 2a  ghlightContext *
1cfc0 70 2c 20 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61  p, ..  const cha
1cfd0 72 20 2a 7a 2c 20 69 6e 74 20 6e 0d 0a 29 7b 0d  r *z, int n..){.
1cfe0 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
1cff0 49 54 45 5f 4f 4b 20 26 26 20 7a 20 29 7b 0d 0a  ITE_OK && z ){..
1d000 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20      if( n<0 ) n 
1d010 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
1d020 3b 0d 0a 20 20 20 20 70 2d 3e 7a 4f 75 74 20 3d  ;..    p->zOut =
1d030 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1d040 28 22 25 7a 25 2e 2a 73 22 2c 20 70 2d 3e 7a 4f  ("%z%.*s", p->zO
1d050 75 74 2c 20 6e 2c 20 7a 29 3b 0d 0a 20 20 20 20  ut, n, z);..    
1d060 69 66 28 20 70 2d 3e 7a 4f 75 74 3d 3d 30 20 29  if( p->zOut==0 )
1d070 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
1d080 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d  OMEM;..  }..}...
1d090 0a 2f 2a 0d 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 65  ./*..** Tokenize
1d0a0 72 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  r callback used 
1d0b0 62 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  by implementatio
1d0c0 6e 20 6f 66 20 68 69 67 68 6c 69 67 68 74 28 29  n of highlight()
1d0d0 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a   function...*/..
1d0e0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 48  static int fts5H
1d0f0 69 67 68 6c 69 67 68 74 43 62 28 0d 0a 20 20 76  ighlightCb(..  v
1d100 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20  oid *pContext,  
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d120 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 48 69 67  * Pointer to Hig
1d130 68 6c 69 67 68 74 43 6f 6e 74 65 78 74 20 6f 62  hlightContext ob
1d140 6a 65 63 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 74  ject */..  int t
1d150 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1d160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1d170 73 6b 20 6f 66 20 46 54 53 35 5f 54 4f 4b 45 4e  sk of FTS5_TOKEN
1d180 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 63  _* flags */..  c
1d190 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
1d1a0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
1d1b0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
1d1c0 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20  ing token */..  
1d1d0 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1f0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65 6e  /* Size of token
1d200 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20   in bytes */..  
1d210 69 6e 74 20 69 53 74 61 72 74 4f 66 66 2c 20 20  int iStartOff,  
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d230 2f 2a 20 53 74 61 72 74 20 6f 66 66 73 65 74 20  /* Start offset 
1d240 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 69  of token */..  i
1d250 6e 74 20 69 45 6e 64 4f 66 66 20 20 20 20 20 20  nt iEndOff      
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d270 2a 20 45 6e 64 20 6f 66 66 73 65 74 20 6f 66 20  * End offset of 
1d280 74 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b 0d 0a 20 20  token */..){..  
1d290 48 69 67 68 6c 69 67 68 74 43 6f 6e 74 65 78 74  HighlightContext
1d2a0 20 2a 70 20 3d 20 28 48 69 67 68 6c 69 67 68 74   *p = (Highlight
1d2b0 43 6f 6e 74 65 78 74 2a 29 70 43 6f 6e 74 65 78  Context*)pContex
1d2c0 74 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t;..  int rc = S
1d2d0 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 6e 74  QLITE_OK;..  int
1d2e0 20 69 50 6f 73 3b 0d 0a 0d 0a 20 20 55 4e 55 53   iPos;....  UNUS
1d2f0 45 44 5f 50 41 52 41 4d 32 28 70 54 6f 6b 65 6e  ED_PARAM2(pToken
1d300 2c 20 6e 54 6f 6b 65 6e 29 3b 0d 0a 0d 0a 20 20  , nToken);....  
1d310 69 66 28 20 74 66 6c 61 67 73 20 26 20 46 54 53  if( tflags & FTS
1d320 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45  5_TOKEN_COLOCATE
1d330 44 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  D ) return SQLIT
1d340 45 5f 4f 4b 3b 0d 0a 20 20 69 50 6f 73 20 3d 20  E_OK;..  iPos = 
1d350 70 2d 3e 69 50 6f 73 2b 2b 3b 0d 0a 0d 0a 20 20  p->iPos++;....  
1d360 69 66 28 20 70 2d 3e 69 52 61 6e 67 65 45 6e 64  if( p->iRangeEnd
1d370 3e 30 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 69  >0 ){..    if( i
1d380 50 6f 73 3c 70 2d 3e 69 52 61 6e 67 65 53 74 61  Pos<p->iRangeSta
1d390 72 74 20 7c 7c 20 69 50 6f 73 3e 70 2d 3e 69 52  rt || iPos>p->iR
1d3a0 61 6e 67 65 45 6e 64 20 29 20 72 65 74 75 72 6e  angeEnd ) return
1d3b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20   SQLITE_OK;..   
1d3c0 20 69 66 28 20 70 2d 3e 69 52 61 6e 67 65 53 74   if( p->iRangeSt
1d3d0 61 72 74 20 26 26 20 69 50 6f 73 3d 3d 70 2d 3e  art && iPos==p->
1d3e0 69 52 61 6e 67 65 53 74 61 72 74 20 29 20 70 2d  iRangeStart ) p-
1d3f0 3e 69 4f 66 66 20 3d 20 69 53 74 61 72 74 4f 66  >iOff = iStartOf
1d400 66 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28  f;..  }....  if(
1d410 20 69 50 6f 73 3d 3d 70 2d 3e 69 74 65 72 2e 69   iPos==p->iter.i
1d420 53 74 61 72 74 20 29 7b 0d 0a 20 20 20 20 66 74  Start ){..    ft
1d430 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65 6e  s5HighlightAppen
1d440 64 28 26 72 63 2c 20 70 2c 20 26 70 2d 3e 7a 49  d(&rc, p, &p->zI
1d450 6e 5b 70 2d 3e 69 4f 66 66 5d 2c 20 69 53 74 61  n[p->iOff], iSta
1d460 72 74 4f 66 66 20 2d 20 70 2d 3e 69 4f 66 66 29  rtOff - p->iOff)
1d470 3b 0d 0a 20 20 20 20 66 74 73 35 48 69 67 68 6c  ;..    fts5Highl
1d480 69 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20  ightAppend(&rc, 
1d490 70 2c 20 70 2d 3e 7a 4f 70 65 6e 2c 20 2d 31 29  p, p->zOpen, -1)
1d4a0 3b 0d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d  ;..    p->iOff =
1d4b0 20 69 53 74 61 72 74 4f 66 66 3b 0d 0a 20 20 7d   iStartOff;..  }
1d4c0 0d 0a 0d 0a 20 20 69 66 28 20 69 50 6f 73 3d 3d  ....  if( iPos==
1d4d0 70 2d 3e 69 74 65 72 2e 69 45 6e 64 20 29 7b 0d  p->iter.iEnd ){.
1d4e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 61 6e  .    if( p->iRan
1d4f0 67 65 45 6e 64 20 26 26 20 70 2d 3e 69 74 65 72  geEnd && p->iter
1d500 2e 69 53 74 61 72 74 3c 70 2d 3e 69 52 61 6e 67  .iStart<p->iRang
1d510 65 53 74 61 72 74 20 29 7b 0d 0a 20 20 20 20 20  eStart ){..     
1d520 20 66 74 73 35 48 69 67 68 6c 69 67 68 74 41 70   fts5HighlightAp
1d530 70 65 6e 64 28 26 72 63 2c 20 70 2c 20 70 2d 3e  pend(&rc, p, p->
1d540 7a 4f 70 65 6e 2c 20 2d 31 29 3b 0d 0a 20 20 20  zOpen, -1);..   
1d550 20 7d 0d 0a 20 20 20 20 66 74 73 35 48 69 67 68   }..    fts5High
1d560 6c 69 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c  lightAppend(&rc,
1d570 20 70 2c 20 26 70 2d 3e 7a 49 6e 5b 70 2d 3e 69   p, &p->zIn[p->i
1d580 4f 66 66 5d 2c 20 69 45 6e 64 4f 66 66 20 2d 20  Off], iEndOff - 
1d590 70 2d 3e 69 4f 66 66 29 3b 0d 0a 20 20 20 20 66  p->iOff);..    f
1d5a0 74 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65  ts5HighlightAppe
1d5b0 6e 64 28 26 72 63 2c 20 70 2c 20 70 2d 3e 7a 43  nd(&rc, p, p->zC
1d5c0 6c 6f 73 65 2c 20 2d 31 29 3b 0d 0a 20 20 20 20  lose, -1);..    
1d5d0 70 2d 3e 69 4f 66 66 20 3d 20 69 45 6e 64 4f 66  p->iOff = iEndOf
1d5e0 66 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  f;..    if( rc==
1d5f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
1d600 20 20 20 20 72 63 20 3d 20 66 74 73 35 43 49 6e      rc = fts5CIn
1d610 73 74 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 69  stIterNext(&p->i
1d620 74 65 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  ter);..    }..  
1d630 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 2d 3e 69 52  }....  if( p->iR
1d640 61 6e 67 65 45 6e 64 3e 30 20 26 26 20 69 50 6f  angeEnd>0 && iPo
1d650 73 3d 3d 70 2d 3e 69 52 61 6e 67 65 45 6e 64 20  s==p->iRangeEnd 
1d660 29 7b 0d 0a 20 20 20 20 66 74 73 35 48 69 67 68  ){..    fts5High
1d670 6c 69 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c  lightAppend(&rc,
1d680 20 70 2c 20 26 70 2d 3e 7a 49 6e 5b 70 2d 3e 69   p, &p->zIn[p->i
1d690 4f 66 66 5d 2c 20 69 45 6e 64 4f 66 66 20 2d 20  Off], iEndOff - 
1d6a0 70 2d 3e 69 4f 66 66 29 3b 0d 0a 20 20 20 20 70  p->iOff);..    p
1d6b0 2d 3e 69 4f 66 66 20 3d 20 69 45 6e 64 4f 66 66  ->iOff = iEndOff
1d6c0 3b 0d 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3e  ;..    if( iPos>
1d6d0 3d 70 2d 3e 69 74 65 72 2e 69 53 74 61 72 74 20  =p->iter.iStart 
1d6e0 26 26 20 69 50 6f 73 3c 70 2d 3e 69 74 65 72 2e  && iPos<p->iter.
1d6f0 69 45 6e 64 20 29 7b 0d 0a 20 20 20 20 20 20 66  iEnd ){..      f
1d700 74 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65  ts5HighlightAppe
1d710 6e 64 28 26 72 63 2c 20 70 2c 20 70 2d 3e 7a 43  nd(&rc, p, p->zC
1d720 6c 6f 73 65 2c 20 2d 31 29 3b 0d 0a 20 20 20 20  lose, -1);..    
1d730 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75  }..  }....  retu
1d740 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  rn rc;..}..../*.
1d750 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1d760 6f 6e 20 6f 66 20 68 69 67 68 6c 69 67 68 74 28  on of highlight(
1d770 29 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d  ) function...*/.
1d780 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1d790 35 48 69 67 68 6c 69 67 68 74 46 75 6e 63 74 69  5HighlightFuncti
1d7a0 6f 6e 28 0d 0a 20 20 63 6f 6e 73 74 20 46 74 73  on(..  const Fts
1d7b0 35 45 78 74 65 6e 73 69 6f 6e 41 70 69 20 2a 70  5ExtensionApi *p
1d7c0 41 70 69 2c 20 20 20 2f 2a 20 41 50 49 20 6f 66  Api,   /* API of
1d7d0 66 65 72 65 64 20 62 79 20 63 75 72 72 65 6e 74  fered by current
1d7e0 20 46 54 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0d   FTS version */.
1d7f0 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a  .  Fts5Context *
1d800 70 46 74 73 2c 20 20 20 20 20 20 20 20 20 20 20  pFts,           
1d810 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
1d820 74 6f 20 70 61 73 73 20 74 6f 20 70 41 70 69 20  to pass to pApi 
1d830 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20  functions */..  
1d840 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1d850 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
1d860 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 72  /* Context for r
1d870 65 74 75 72 6e 69 6e 67 20 72 65 73 75 6c 74 2f  eturning result/
1d880 65 72 72 6f 72 20 2a 2f 0d 0a 20 20 69 6e 74 20  error */..  int 
1d890 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nVal,           
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d8b0 75 6d 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20  umber of values 
1d8c0 69 6e 20 61 70 56 61 6c 5b 5d 20 61 72 72 61 79  in apVal[] array
1d8d0 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76   */..  sqlite3_v
1d8e0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
1d8f0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1d900 6f 66 20 74 72 61 69 6c 69 6e 67 20 61 72 67 75  of trailing argu
1d910 6d 65 6e 74 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 20  ments */..){..  
1d920 48 69 67 68 6c 69 67 68 74 43 6f 6e 74 65 78 74  HighlightContext
1d930 20 63 74 78 3b 0d 0a 20 20 69 6e 74 20 72 63 3b   ctx;..  int rc;
1d940 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0d 0a 0d  ..  int iCol;...
1d950 0a 20 20 69 66 28 20 6e 56 61 6c 21 3d 33 20 29  .  if( nVal!=3 )
1d960 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  {..    const cha
1d970 72 20 2a 7a 45 72 72 20 3d 20 22 77 72 6f 6e 67  r *zErr = "wrong
1d980 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
1d990 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
1d9a0 20 68 69 67 68 6c 69 67 68 74 28 29 22 3b 0d 0a   highlight()";..
1d9b0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1d9c0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a  lt_error(pCtx, z
1d9d0 45 72 72 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 72  Err, -1);..    r
1d9e0 65 74 75 72 6e 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20  eturn;..  }.... 
1d9f0 20 69 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iCol = sqlite3_
1da00 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
1da10 30 5d 29 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 26  0]);..  memset(&
1da20 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 48  ctx, 0, sizeof(H
1da30 69 67 68 6c 69 67 68 74 43 6f 6e 74 65 78 74 29  ighlightContext)
1da40 29 3b 0d 0a 20 20 63 74 78 2e 7a 4f 70 65 6e 20  );..  ctx.zOpen 
1da50 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
1da60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1da70 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0d 0a 20 20  t(apVal[1]);..  
1da80 63 74 78 2e 7a 43 6c 6f 73 65 20 3d 20 28 63 6f  ctx.zClose = (co
1da90 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1daa0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
1dab0 61 6c 5b 32 5d 29 3b 0d 0a 20 20 72 63 20 3d 20  al[2]);..  rc = 
1dac0 70 41 70 69 2d 3e 78 43 6f 6c 75 6d 6e 54 65 78  pApi->xColumnTex
1dad0 74 28 70 46 74 73 2c 20 69 43 6f 6c 2c 20 26 63  t(pFts, iCol, &c
1dae0 74 78 2e 7a 49 6e 2c 20 26 63 74 78 2e 6e 49 6e  tx.zIn, &ctx.nIn
1daf0 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 63 74 78 2e  );....  if( ctx.
1db00 7a 49 6e 20 29 7b 0d 0a 20 20 20 20 69 66 28 20  zIn ){..    if( 
1db10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1db20 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ..      rc = fts
1db30 35 43 49 6e 73 74 49 74 65 72 49 6e 69 74 28 70  5CInstIterInit(p
1db40 41 70 69 2c 20 70 46 74 73 2c 20 69 43 6f 6c 2c  Api, pFts, iCol,
1db50 20 26 63 74 78 2e 69 74 65 72 29 3b 0d 0a 20 20   &ctx.iter);..  
1db60 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20 72    }....    if( r
1db70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
1db80 0a 20 20 20 20 20 20 72 63 20 3d 20 70 41 70 69  .      rc = pApi
1db90 2d 3e 78 54 6f 6b 65 6e 69 7a 65 28 70 46 74 73  ->xTokenize(pFts
1dba0 2c 20 63 74 78 2e 7a 49 6e 2c 20 63 74 78 2e 6e  , ctx.zIn, ctx.n
1dbb0 49 6e 2c 20 28 76 6f 69 64 2a 29 26 63 74 78 2c  In, (void*)&ctx,
1dbc0 66 74 73 35 48 69 67 68 6c 69 67 68 74 43 62 29  fts5HighlightCb)
1dbd0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 66 74  ;..    }..    ft
1dbe0 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65 6e  s5HighlightAppen
1dbf0 64 28 26 72 63 2c 20 26 63 74 78 2c 20 26 63 74  d(&rc, &ctx, &ct
1dc00 78 2e 7a 49 6e 5b 63 74 78 2e 69 4f 66 66 5d 2c  x.zIn[ctx.iOff],
1dc10 20 63 74 78 2e 6e 49 6e 20 2d 20 63 74 78 2e 69   ctx.nIn - ctx.i
1dc20 4f 66 66 29 3b 0d 0a 0d 0a 20 20 20 20 69 66 28  Off);....    if(
1dc30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dc40 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  {..      sqlite3
1dc50 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
1dc60 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
1dc70 63 74 78 2e 7a 4f 75 74 2c 20 2d 31 2c 20 53 51  ctx.zOut, -1, SQ
1dc80 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
1dc90 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c  ..    }..    sql
1dca0 69 74 65 33 5f 66 72 65 65 28 63 74 78 2e 7a 4f  ite3_free(ctx.zO
1dcb0 75 74 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28  ut);..  }..  if(
1dcc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dcd0 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  {..    sqlite3_r
1dce0 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
1dcf0 28 70 43 74 78 2c 20 72 63 29 3b 0d 0a 20 20 7d  (pCtx, rc);..  }
1dd00 0d 0a 7d 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20  ..}../*..** End 
1dd10 6f 66 20 68 69 67 68 6c 69 67 68 74 28 29 20 69  of highlight() i
1dd20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a  mplementation...
1dd30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dd40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dd50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dd60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dd70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f  **********/..../
1dd80 2a 0d 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62  *..** Context ob
1dd90 6a 65 63 74 20 70 61 73 73 65 64 20 74 6f 20 74  ject passed to t
1dda0 68 65 20 66 74 73 35 53 65 6e 74 65 6e 63 65 46  he fts5SentenceF
1ddb0 69 6e 64 65 72 43 62 28 29 20 66 75 6e 63 74 69  inderCb() functi
1ddc0 6f 6e 2e 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66  on...*/..typedef
1ddd0 20 73 74 72 75 63 74 20 46 74 73 35 53 46 69 6e   struct Fts5SFin
1dde0 64 65 72 20 46 74 73 35 53 46 69 6e 64 65 72 3b  der Fts5SFinder;
1ddf0 0d 0a 73 74 72 75 63 74 20 46 74 73 35 53 46 69  ..struct Fts5SFi
1de00 6e 64 65 72 20 7b 0d 0a 20 20 69 6e 74 20 69 50  nder {..  int iP
1de10 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
1de20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1de30 72 65 6e 74 20 74 6f 6b 65 6e 20 70 6f 73 69 74  rent token posit
1de40 69 6f 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 46  ion */..  int nF
1de50 69 72 73 74 41 6c 6c 6f 63 3b 20 20 20 20 20 20  irstAlloc;      
1de60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1de70 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
1de80 46 69 72 73 74 5b 5d 20 2a 2f 0d 0a 20 20 69 6e  First[] */..  in
1de90 74 20 6e 46 69 72 73 74 3b 20 20 20 20 20 20 20  t nFirst;       
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1deb0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1dec0 65 73 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 2a  es in aFirst[] *
1ded0 2f 0d 0a 20 20 69 6e 74 20 2a 61 46 69 72 73 74  /..  int *aFirst
1dee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1def0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1df00 20 66 69 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20   first token in 
1df10 65 61 63 68 20 73 65 6e 74 65 6e 63 65 20 2a 2f  each sentence */
1df20 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
1df30 7a 44 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  zDoc;           
1df40 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20      /* Document 
1df50 62 65 69 6e 67 20 74 6f 6b 65 6e 69 7a 65 64 20  being tokenized 
1df60 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  */..};..../*..**
1df70 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
1df80 20 74 68 65 20 46 74 73 35 53 46 69 6e 64 65 72   the Fts5SFinder
1df90 2e 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e  .aFirst[] array.
1dfa0 20 47 72 6f 77 20 74 68 65 20 61 72 72 61 79 20   Grow the array 
1dfb0 69 66 0d 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  if..** necessary
1dfc0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1dfd0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
1dfe0 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  , or SQLITE_NOME
1dff0 4d 20 69 66 20 61 6e 0d 0a 2a 2a 20 65 72 72 6f  M if an..** erro
1e000 72 20 6f 63 63 75 72 73 2e 0d 0a 2a 2f 0d 0a 73  r occurs...*/..s
1e010 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65  tatic int fts5Se
1e020 6e 74 65 6e 63 65 46 69 6e 64 65 72 41 64 64 28  ntenceFinderAdd(
1e030 46 74 73 35 53 46 69 6e 64 65 72 20 2a 70 2c 20  Fts5SFinder *p, 
1e040 69 6e 74 20 69 41 64 64 29 7b 0d 0a 20 20 69 66  int iAdd){..  if
1e050 28 20 70 2d 3e 6e 46 69 72 73 74 41 6c 6c 6f 63  ( p->nFirstAlloc
1e060 3d 3d 70 2d 3e 6e 46 69 72 73 74 20 29 7b 0d 0a  ==p->nFirst ){..
1e070 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70      int nNew = p
1e080 2d 3e 6e 46 69 72 73 74 41 6c 6c 6f 63 20 3f 20  ->nFirstAlloc ? 
1e090 70 2d 3e 6e 46 69 72 73 74 41 6c 6c 6f 63 2a 32  p->nFirstAlloc*2
1e0a0 20 3a 20 36 34 3b 0d 0a 20 20 20 20 69 6e 74 20   : 64;..    int 
1e0b0 2a 61 4e 65 77 3b 0d 0a 0d 0a 20 20 20 20 61 4e  *aNew;....    aN
1e0c0 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ew = (int*)sqlit
1e0d0 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e  e3_realloc64(p->
1e0e0 61 46 69 72 73 74 2c 20 6e 4e 65 77 2a 73 69 7a  aFirst, nNew*siz
1e0f0 65 6f 66 28 69 6e 74 29 29 3b 0d 0a 20 20 20 20  eof(int));..    
1e100 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65  if( aNew==0 ) re
1e110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e120 4d 3b 0d 0a 20 20 20 20 70 2d 3e 61 46 69 72 73  M;..    p->aFirs
1e130 74 20 3d 20 61 4e 65 77 3b 0d 0a 20 20 20 20 70  t = aNew;..    p
1e140 2d 3e 6e 46 69 72 73 74 41 6c 6c 6f 63 20 3d 20  ->nFirstAlloc = 
1e150 6e 4e 65 77 3b 0d 0a 20 20 7d 0d 0a 20 20 70 2d  nNew;..  }..  p-
1e160 3e 61 46 69 72 73 74 5b 70 2d 3e 6e 46 69 72 73  >aFirst[p->nFirs
1e170 74 2b 2b 5d 20 3d 20 69 41 64 64 3b 0d 0a 20 20  t++] = iAdd;..  
1e180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e190 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54  ;..}..../*..** T
1e1a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e1b0 61 6e 20 78 54 6f 6b 65 6e 69 7a 65 28 29 20 63  an xTokenize() c
1e1c0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
1e1d0 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 73 6e  the auxiliary sn
1e1e0 69 70 70 65 74 28 29 0d 0a 2a 2a 20 66 75 6e 63  ippet()..** func
1e1f0 74 69 6f 6e 2e 20 49 74 73 20 6a 6f 62 20 69 73  tion. Its job is
1e200 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 6f 6b   to identify tok
1e210 65 6e 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ens that are the
1e220 20 66 69 72 73 74 20 69 6e 20 61 20 73 65 6e 74   first in a sent
1e230 65 6e 63 65 2e 0d 0a 2a 2a 20 46 6f 72 20 65 61  ence...** For ea
1e240 63 68 20 73 75 63 68 20 74 6f 6b 65 6e 2c 20 61  ch such token, a
1e250 6e 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64  n entry is added
1e260 20 74 6f 20 74 68 65 20 53 46 69 6e 64 65 72 2e   to the SFinder.
1e270 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 0d  aFirst[] array..
1e280 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
1e290 66 74 73 35 53 65 6e 74 65 6e 63 65 46 69 6e 64  fts5SentenceFind
1e2a0 65 72 43 62 28 0d 0a 20 20 76 6f 69 64 20 2a 70  erCb(..  void *p
1e2b0 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 20 20  Context,        
1e2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1e2d0 74 65 72 20 74 6f 20 48 69 67 68 6c 69 67 68 74  ter to Highlight
1e2e0 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a  Context object *
1e2f0 2f 0d 0a 20 20 69 6e 74 20 74 66 6c 61 67 73 2c  /..  int tflags,
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e310 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1e320 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66 6c 61  FTS5_TOKEN_* fla
1e330 67 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63  gs */..  const c
1e340 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  har *pToken,    
1e350 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
1e360 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f  er containing to
1e370 6b 65 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54  ken */..  int nT
1e380 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
1e390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1e3a0 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79  e of token in by
1e3b0 74 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 53  tes */..  int iS
1e3c0 74 61 72 74 4f 66 66 2c 20 20 20 20 20 20 20 20  tartOff,        
1e3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
1e3e0 72 74 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b  rt offset of tok
1e3f0 65 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 45 6e  en */..  int iEn
1e400 64 4f 66 66 20 20 20 20 20 20 20 20 20 20 20 20  dOff            
1e410 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
1e420 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20  offset of token 
1e430 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63  */..){..  int rc
1e440 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d   = SQLITE_OK;...
1e450 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32  .  UNUSED_PARAM2
1e460 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  (pToken, nToken)
1e470 3b 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
1e480 4d 28 69 45 6e 64 4f 66 66 29 3b 0d 0a 0d 0a 20  M(iEndOff);.... 
1e490 20 69 66 28 20 28 74 66 6c 61 67 73 20 26 20 46   if( (tflags & F
1e4a0 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41  TS5_TOKEN_COLOCA
1e4b0 54 45 44 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  TED)==0 ){..    
1e4c0 46 74 73 35 53 46 69 6e 64 65 72 20 2a 70 20 3d  Fts5SFinder *p =
1e4d0 20 28 46 74 73 35 53 46 69 6e 64 65 72 2a 29 70   (Fts5SFinder*)p
1e4e0 43 6f 6e 74 65 78 74 3b 0d 0a 20 20 20 20 69 66  Context;..    if
1e4f0 28 20 70 2d 3e 69 50 6f 73 3e 30 20 29 7b 0d 0a  ( p->iPos>0 ){..
1e500 20 20 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20        int i;..  
1e510 20 20 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0d      char c = 0;.
1e520 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 53 74  .      for(i=iSt
1e530 61 72 74 4f 66 66 2d 31 3b 20 69 3e 3d 30 3b 20  artOff-1; i>=0; 
1e540 69 2d 2d 29 7b 0d 0a 20 20 20 20 20 20 20 20 63  i--){..        c
1e550 20 3d 20 70 2d 3e 7a 44 6f 63 5b 69 5d 3b 0d 0a   = p->zDoc[i];..
1e560 20 20 20 20 20 20 20 20 69 66 28 20 63 21 3d 27          if( c!='
1e570 20 27 20 26 26 20 63 21 3d 27 5c 74 27 20 26 26   ' && c!='\t' &&
1e580 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27   c!='\n' && c!='
1e590 5c 72 27 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20  \r' ) break;..  
1e5a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 28      }..      if(
1e5b0 20 69 21 3d 69 53 74 61 72 74 4f 66 66 2d 31 20   i!=iStartOff-1 
1e5c0 26 26 20 28 63 3d 3d 27 2e 27 20 7c 7c 20 63 3d  && (c=='.' || c=
1e5d0 3d 27 3a 27 29 20 29 7b 0d 0a 20 20 20 20 20 20  =':') ){..      
1e5e0 20 20 72 63 20 3d 20 66 74 73 35 53 65 6e 74 65    rc = fts5Sente
1e5f0 6e 63 65 46 69 6e 64 65 72 41 64 64 28 70 2c 20  nceFinderAdd(p, 
1e600 70 2d 3e 69 50 6f 73 29 3b 0d 0a 20 20 20 20 20  p->iPos);..     
1e610 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a   }..    }else{..
1e620 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 53        rc = fts5S
1e630 65 6e 74 65 6e 63 65 46 69 6e 64 65 72 41 64 64  entenceFinderAdd
1e640 28 70 2c 20 30 29 3b 0d 0a 20 20 20 20 7d 0d 0a  (p, 0);..    }..
1e650 20 20 20 20 70 2d 3e 69 50 6f 73 2b 2b 3b 0d 0a      p->iPos++;..
1e660 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1e670 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69  ;..}....static i
1e680 6e 74 20 66 74 73 35 53 6e 69 70 70 65 74 53 63  nt fts5SnippetSc
1e690 6f 72 65 28 0d 0a 20 20 63 6f 6e 73 74 20 46 74  ore(..  const Ft
1e6a0 73 35 45 78 74 65 6e 73 69 6f 6e 41 70 69 20 2a  s5ExtensionApi *
1e6b0 70 41 70 69 2c 20 20 20 2f 2a 20 41 50 49 20 6f  pApi,   /* API o
1e6c0 66 66 65 72 65 64 20 62 79 20 63 75 72 72 65 6e  ffered by curren
1e6d0 74 20 46 54 53 20 76 65 72 73 69 6f 6e 20 2a 2f  t FTS version */
1e6e0 0d 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20  ..  Fts5Context 
1e6f0 2a 70 46 74 73 2c 20 20 20 20 20 20 20 20 20 20  *pFts,          
1e700 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1e710 20 74 6f 20 70 61 73 73 20 74 6f 20 70 41 70 69   to pass to pApi
1e720 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0d 0a 20   functions */.. 
1e730 20 69 6e 74 20 6e 44 6f 63 73 69 7a 65 2c 20 20   int nDocsize,  
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 2f 2a 20 53 69 7a 65 20 6f 66 20 63 6f 6c 75   /* Size of colu
1e760 6d 6e 20 69 6e 20 74 6f 6b 65 6e 73 20 2a 2f 0d  mn in tokens */.
1e770 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1e780 20 2a 61 53 65 65 6e 2c 20 20 20 20 20 20 20 20   *aSeen,        
1e790 20 20 20 2f 2a 20 41 72 72 61 79 20 77 69 74 68     /* Array with
1e7a0 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 70 65 72   one element per
1e7b0 20 71 75 65 72 79 20 70 68 72 61 73 65 20 2a 2f   query phrase */
1e7c0 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  ..  int iCol,   
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
1e7f0 20 73 63 6f 72 65 20 2a 2f 0d 0a 20 20 69 6e 74   score */..  int
1e800 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e820 53 74 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20  Starting offset 
1e830 74 6f 20 73 63 6f 72 65 20 2a 2f 0d 0a 20 20 69  to score */..  i
1e840 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e860 2a 20 4d 61 78 20 74 6f 6b 65 6e 73 20 70 65 72  * Max tokens per
1e870 20 73 6e 69 70 70 65 74 20 2a 2f 0d 0a 20 20 69   snippet */..  i
1e880 6e 74 20 2a 70 6e 53 63 6f 72 65 2c 20 20 20 20  nt *pnScore,    
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e8a0 2a 20 4f 55 54 3a 20 53 63 6f 72 65 20 2a 2f 0d  * OUT: Score */.
1e8b0 0a 20 20 69 6e 74 20 2a 70 69 50 6f 73 20 20 20  .  int *piPos   
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 20 2f 2a 20 4f 55 54 3a 20 41 64 6a 75 73     /* OUT: Adjus
1e8e0 74 65 64 20 6f 66 66 73 65 74 20 2a 2f 0d 0a 29  ted offset */..)
1e8f0 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20  {..  int rc;..  
1e900 69 6e 74 20 69 3b 0d 0a 20 20 69 6e 74 20 69 70  int i;..  int ip
1e910 20 3d 20 30 3b 0d 0a 20 20 69 6e 74 20 69 63 20   = 0;..  int ic 
1e920 3d 20 30 3b 0d 0a 20 20 69 6e 74 20 69 4f 66 66  = 0;..  int iOff
1e930 20 3d 20 30 3b 0d 0a 20 20 69 6e 74 20 69 46 69   = 0;..  int iFi
1e940 72 73 74 20 3d 20 2d 31 3b 0d 0a 20 20 69 6e 74  rst = -1;..  int
1e950 20 6e 49 6e 73 74 3b 0d 0a 20 20 69 6e 74 20 6e   nInst;..  int n
1e960 53 63 6f 72 65 20 3d 20 30 3b 0d 0a 20 20 69 6e  Score = 0;..  in
1e970 74 20 69 4c 61 73 74 20 3d 20 30 3b 0d 0a 20 20  t iLast = 0;..  
1e980 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
1e990 6e 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  nd = (sqlite3_in
1e9a0 74 36 34 29 69 50 6f 73 20 2b 20 6e 54 6f 6b 65  t64)iPos + nToke
1e9b0 6e 3b 0d 0a 0d 0a 20 20 72 63 20 3d 20 70 41 70  n;....  rc = pAp
1e9c0 69 2d 3e 78 49 6e 73 74 43 6f 75 6e 74 28 70 46  i->xInstCount(pF
1e9d0 74 73 2c 20 26 6e 49 6e 73 74 29 3b 0d 0a 20 20  ts, &nInst);..  
1e9e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 73 74  for(i=0; i<nInst
1e9f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1ea00 4b 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 72 63  K; i++){..    rc
1ea10 20 3d 20 70 41 70 69 2d 3e 78 49 6e 73 74 28 70   = pApi->xInst(p
1ea20 46 74 73 2c 20 69 2c 20 26 69 70 2c 20 26 69 63  Fts, i, &ip, &ic
1ea30 2c 20 26 69 4f 66 66 29 3b 0d 0a 20 20 20 20 69  , &iOff);..    i
1ea40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ea50 20 26 26 20 69 63 3d 3d 69 43 6f 6c 20 26 26 20   && ic==iCol && 
1ea60 69 4f 66 66 3e 3d 69 50 6f 73 20 26 26 20 69 4f  iOff>=iPos && iO
1ea70 66 66 3c 69 45 6e 64 20 29 7b 0d 0a 20 20 20 20  ff<iEnd ){..    
1ea80 20 20 6e 53 63 6f 72 65 20 2b 3d 20 28 61 53 65    nScore += (aSe
1ea90 65 6e 5b 69 70 5d 20 3f 20 31 20 3a 20 31 30 30  en[ip] ? 1 : 100
1eaa0 30 29 3b 0d 0a 20 20 20 20 20 20 61 53 65 65 6e  0);..      aSeen
1eab0 5b 69 70 5d 20 3d 20 31 3b 0d 0a 20 20 20 20 20  [ip] = 1;..     
1eac0 20 69 66 28 20 69 46 69 72 73 74 3c 30 20 29 20   if( iFirst<0 ) 
1ead0 69 46 69 72 73 74 20 3d 20 69 4f 66 66 3b 0d 0a  iFirst = iOff;..
1eae0 20 20 20 20 20 20 69 4c 61 73 74 20 3d 20 69 4f        iLast = iO
1eaf0 66 66 20 2b 20 70 41 70 69 2d 3e 78 50 68 72 61  ff + pApi->xPhra
1eb00 73 65 53 69 7a 65 28 70 46 74 73 2c 20 69 70 29  seSize(pFts, ip)
1eb10 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
1eb20 0a 20 20 2a 70 6e 53 63 6f 72 65 20 3d 20 6e 53  .  *pnScore = nS
1eb30 63 6f 72 65 3b 0d 0a 20 20 69 66 28 20 70 69 50  core;..  if( piP
1eb40 6f 73 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74  os ){..    sqlit
1eb50 65 33 5f 69 6e 74 36 34 20 69 41 64 6a 20 3d 20  e3_int64 iAdj = 
1eb60 69 46 69 72 73 74 20 2d 20 28 6e 54 6f 6b 65 6e  iFirst - (nToken
1eb70 20 2d 20 28 69 4c 61 73 74 2d 69 46 69 72 73 74   - (iLast-iFirst
1eb80 29 29 20 2f 20 32 3b 0d 0a 20 20 20 20 69 66 28  )) / 2;..    if(
1eb90 20 28 69 41 64 6a 2b 6e 54 6f 6b 65 6e 29 3e 6e   (iAdj+nToken)>n
1eba0 44 6f 63 73 69 7a 65 20 29 20 69 41 64 6a 20 3d  Docsize ) iAdj =
1ebb0 20 6e 44 6f 63 73 69 7a 65 20 2d 20 6e 54 6f 6b   nDocsize - nTok
1ebc0 65 6e 3b 0d 0a 20 20 20 20 69 66 28 20 69 41 64  en;..    if( iAd
1ebd0 6a 3c 30 20 29 20 69 41 64 6a 20 3d 20 30 3b 0d  j<0 ) iAdj = 0;.
1ebe0 0a 20 20 20 20 2a 70 69 50 6f 73 20 3d 20 69 41  .    *piPos = iA
1ebf0 64 6a 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65  dj;..  }....  re
1ec00 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f  turn rc;..}..../
1ec10 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  *..** Return the
1ec20 20 76 61 6c 75 65 20 69 6e 20 70 56 61 6c 20 69   value in pVal i
1ec30 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 75 74  nterpreted as ut
1ec40 66 2d 38 20 74 65 78 74 2e 20 45 78 63 65 70 74  f-8 text. Except
1ec50 2c 20 69 66 20 70 56 61 6c 20 0d 0a 2a 2a 20 63  , if pVal ..** c
1ec60 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20 76  ontains a NULL v
1ec70 61 6c 75 65 2c 20 72 65 74 75 72 6e 20 61 20 70  alue, return a p
1ec80 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
1ec90 69 63 20 73 74 72 69 6e 67 20 7a 65 72 6f 0d 0a  ic string zero..
1eca0 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
1ecb0 74 68 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  th instead of a 
1ecc0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a  NULL pointer...*
1ecd0 2f 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
1ece0 63 68 61 72 20 2a 66 74 73 35 56 61 6c 75 65 54  char *fts5ValueT
1ecf0 6f 54 65 78 74 28 73 71 6c 69 74 65 33 5f 76 61  oText(sqlite3_va
1ed00 6c 75 65 20 2a 70 56 61 6c 29 7b 0d 0a 20 20 63  lue *pVal){..  c
1ed10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20  onst char *zRet 
1ed20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
1ed30 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1ed40 74 28 70 56 61 6c 29 3b 0d 0a 20 20 72 65 74 75  t(pVal);..  retu
1ed50 72 6e 20 7a 52 65 74 20 3f 20 7a 52 65 74 20 3a  rn zRet ? zRet :
1ed60 20 22 22 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a   "";..}..../*..*
1ed70 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1ed80 20 6f 66 20 73 6e 69 70 70 65 74 28 29 20 66 75   of snippet() fu
1ed90 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61  nction...*/..sta
1eda0 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 6e 69  tic void fts5Sni
1edb0 70 70 65 74 46 75 6e 63 74 69 6f 6e 28 0d 0a 20  ppetFunction(.. 
1edc0 20 63 6f 6e 73 74 20 46 74 73 35 45 78 74 65 6e   const Fts5Exten
1edd0 73 69 6f 6e 41 70 69 20 2a 70 41 70 69 2c 20 20  sionApi *pApi,  
1ede0 20 2f 2a 20 41 50 49 20 6f 66 66 65 72 65 64 20   /* API offered 
1edf0 62 79 20 63 75 72 72 65 6e 74 20 46 54 53 20 76  by current FTS v
1ee00 65 72 73 69 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73  ersion */..  Fts
1ee10 35 43 6f 6e 74 65 78 74 20 2a 70 46 74 73 2c 20  5Context *pFts, 
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee30 46 69 72 73 74 20 61 72 67 20 74 6f 20 70 61 73  First arg to pas
1ee40 73 20 74 6f 20 70 41 70 69 20 66 75 6e 63 74 69  s to pApi functi
1ee50 6f 6e 73 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65  ons */..  sqlite
1ee60 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1ee70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1ee80 74 65 78 74 20 66 6f 72 20 72 65 74 75 72 6e 69  text for returni
1ee90 6e 67 20 72 65 73 75 6c 74 2f 65 72 72 6f 72 20  ng result/error 
1eea0 2a 2f 0d 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20  */..  int nVal, 
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eec0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1eed0 6f 66 20 76 61 6c 75 65 73 20 69 6e 20 61 70 56  of values in apV
1eee0 61 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0d 0a 20  al[] array */.. 
1eef0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1ef00 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
1ef10 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 72 61   /* Array of tra
1ef20 69 6c 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20  iling arguments 
1ef30 2a 2f 0d 0a 29 7b 0d 0a 20 20 48 69 67 68 6c 69  */..){..  Highli
1ef40 67 68 74 43 6f 6e 74 65 78 74 20 63 74 78 3b 0d  ghtContext ctx;.
1ef50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ef60 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1ef70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ef80 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 43 6f 6c  e */..  int iCol
1ef90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1efa0 20 20 20 20 20 20 20 20 2f 2a 20 31 73 74 20 61          /* 1st a
1efb0 72 67 75 6d 65 6e 74 20 74 6f 20 73 6e 69 70 70  rgument to snipp
1efc0 65 74 28 29 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74  et() */..  const
1efd0 20 63 68 61 72 20 2a 7a 45 6c 6c 69 70 73 3b 20   char *zEllips; 
1efe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 74             /* 4t
1eff0 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 6e  h argument to sn
1f000 69 70 70 65 74 28 29 20 2a 2f 0d 0a 20 20 69 6e  ippet() */..  in
1f010 74 20 6e 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20  t nToken;       
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f030 20 35 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f   5th argument to
1f040 20 73 6e 69 70 70 65 74 28 29 20 2a 2f 0d 0a 20   snippet() */.. 
1f050 20 69 6e 74 20 6e 49 6e 73 74 20 3d 20 30 3b 20   int nInst = 0; 
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
1f080 73 74 61 6e 63 65 20 6d 61 74 63 68 65 73 20 74  stance matches t
1f090 68 69 73 20 72 6f 77 20 2a 2f 0d 0a 20 20 69 6e  his row */..  in
1f0a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f0c0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
1f0d0 20 74 68 72 6f 75 67 68 20 69 6e 73 74 61 6e 63   through instanc
1f0e0 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 50 68  es */..  int nPh
1f0f0 72 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  rase;           
1f100 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f110 65 72 20 6f 66 20 70 68 72 61 73 65 73 20 69 6e  er of phrases in
1f120 20 71 75 65 72 79 20 2a 2f 0d 0a 20 20 75 6e 73   query */..  uns
1f130 69 67 6e 65 64 20 63 68 61 72 20 2a 61 53 65 65  igned char *aSee
1f140 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1f150 41 72 72 61 79 20 6f 66 20 22 73 65 65 6e 20 69  Array of "seen i
1f160 6e 73 74 61 6e 63 65 22 20 66 6c 61 67 73 20 2a  nstance" flags *
1f170 2f 0d 0a 20 20 69 6e 74 20 69 42 65 73 74 43 6f  /..  int iBestCo
1f180 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1f190 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
1f1a0 6f 6e 74 61 69 6e 69 6e 67 20 62 65 73 74 20 73  ontaining best s
1f1b0 6e 69 70 70 65 74 20 2a 2f 0d 0a 20 20 69 6e 74  nippet */..  int
1f1c0 20 69 42 65 73 74 53 74 61 72 74 20 3d 20 30 3b   iBestStart = 0;
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f1e0 46 69 72 73 74 20 74 6f 6b 65 6e 20 6f 66 20 62  First token of b
1f1f0 65 73 74 20 73 6e 69 70 70 65 74 20 2a 2f 0d 0a  est snippet */..
1f200 20 20 69 6e 74 20 6e 42 65 73 74 53 63 6f 72 65    int nBestScore
1f210 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f220 20 20 2f 2a 20 53 63 6f 72 65 20 6f 66 20 62 65    /* Score of be
1f230 73 74 20 73 6e 69 70 70 65 74 20 2a 2f 0d 0a 20  st snippet */.. 
1f240 20 69 6e 74 20 6e 43 6f 6c 53 69 7a 65 20 3d 20   int nColSize = 
1f250 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f260 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
1f270 66 20 69 42 65 73 74 43 6f 6c 20 69 6e 20 74 6f  f iBestCol in to
1f280 6b 65 6e 73 20 2a 2f 0d 0a 20 20 46 74 73 35 53  kens */..  Fts5S
1f290 46 69 6e 64 65 72 20 73 46 69 6e 64 65 72 3b 20  Finder sFinder; 
1f2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1f2b0 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62  ed to find the b
1f2c0 65 67 69 6e 6e 69 6e 67 73 20 6f 66 20 73 65 6e  eginnings of sen
1f2d0 74 65 6e 63 65 73 20 2a 2f 0d 0a 20 20 69 6e 74  tences */..  int
1f2e0 20 6e 43 6f 6c 3b 0d 0a 0d 0a 20 20 69 66 28 20   nCol;....  if( 
1f2f0 6e 56 61 6c 21 3d 35 20 29 7b 0d 0a 20 20 20 20  nVal!=5 ){..    
1f300 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
1f310 20 3d 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72   = "wrong number
1f320 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
1f330 20 66 75 6e 63 74 69 6f 6e 20 73 6e 69 70 70 65   function snippe
1f340 74 28 29 22 3b 0d 0a 20 20 20 20 73 71 6c 69 74  t()";..    sqlit
1f350 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
1f360 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29 3b  pCtx, zErr, -1);
1f370 0d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20  ..    return;.. 
1f380 20 7d 0d 0a 0d 0a 20 20 6e 43 6f 6c 20 3d 20 70   }....  nCol = p
1f390 41 70 69 2d 3e 78 43 6f 6c 75 6d 6e 43 6f 75 6e  Api->xColumnCoun
1f3a0 74 28 70 46 74 73 29 3b 0d 0a 20 20 6d 65 6d 73  t(pFts);..  mems
1f3b0 65 74 28 26 63 74 78 2c 20 30 2c 20 73 69 7a 65  et(&ctx, 0, size
1f3c0 6f 66 28 48 69 67 68 6c 69 67 68 74 43 6f 6e 74  of(HighlightCont
1f3d0 65 78 74 29 29 3b 0d 0a 20 20 69 43 6f 6c 20 3d  ext));..  iCol =
1f3e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
1f3f0 6e 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0d 0a 20  nt(apVal[0]);.. 
1f400 20 63 74 78 2e 7a 4f 70 65 6e 20 3d 20 66 74 73   ctx.zOpen = fts
1f410 35 56 61 6c 75 65 54 6f 54 65 78 74 28 61 70 56  5ValueToText(apV
1f420 61 6c 5b 31 5d 29 3b 0d 0a 20 20 63 74 78 2e 7a  al[1]);..  ctx.z
1f430 43 6c 6f 73 65 20 3d 20 66 74 73 35 56 61 6c 75  Close = fts5Valu
1f440 65 54 6f 54 65 78 74 28 61 70 56 61 6c 5b 32 5d  eToText(apVal[2]
1f450 29 3b 0d 0a 20 20 7a 45 6c 6c 69 70 73 20 3d 20  );..  zEllips = 
1f460 66 74 73 35 56 61 6c 75 65 54 6f 54 65 78 74 28  fts5ValueToText(
1f470 61 70 56 61 6c 5b 33 5d 29 3b 0d 0a 20 20 6e 54  apVal[3]);..  nT
1f480 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  oken = sqlite3_v
1f490 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 34  alue_int(apVal[4
1f4a0 5d 29 3b 0d 0a 0d 0a 20 20 69 42 65 73 74 43 6f  ]);....  iBestCo
1f4b0 6c 20 3d 20 28 69 43 6f 6c 3e 3d 30 20 3f 20 69  l = (iCol>=0 ? i
1f4c0 43 6f 6c 20 3a 20 30 29 3b 0d 0a 20 20 6e 50 68  Col : 0);..  nPh
1f4d0 72 61 73 65 20 3d 20 70 41 70 69 2d 3e 78 50 68  rase = pApi->xPh
1f4e0 72 61 73 65 43 6f 75 6e 74 28 70 46 74 73 29 3b  raseCount(pFts);
1f4f0 0d 0a 20 20 61 53 65 65 6e 20 3d 20 73 71 6c 69  ..  aSeen = sqli
1f500 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 50 68 72 61  te3_malloc(nPhra
1f510 73 65 29 3b 0d 0a 20 20 69 66 28 20 61 53 65 65  se);..  if( aSee
1f520 6e 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 63 20  n==0 ){..    rc 
1f530 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d  = SQLITE_NOMEM;.
1f540 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1f550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
1f560 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 49 6e    rc = pApi->xIn
1f570 73 74 43 6f 75 6e 74 28 70 46 74 73 2c 20 26 6e  stCount(pFts, &n
1f580 49 6e 73 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20  Inst);..  }.... 
1f590 20 6d 65 6d 73 65 74 28 26 73 46 69 6e 64 65 72   memset(&sFinder
1f5a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1f5b0 53 46 69 6e 64 65 72 29 29 3b 0d 0a 20 20 66 6f  SFinder));..  fo
1f5c0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
1f5d0 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 20 69 43  ++){..    if( iC
1f5e0 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 69 20  ol<0 || iCol==i 
1f5f0 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 44  ){..      int nD
1f600 6f 63 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e  oc;..      int n
1f610 44 6f 63 73 69 7a 65 3b 0d 0a 20 20 20 20 20 20  Docsize;..      
1f620 69 6e 74 20 69 69 3b 0d 0a 20 20 20 20 20 20 73  int ii;..      s
1f630 46 69 6e 64 65 72 2e 69 50 6f 73 20 3d 20 30 3b  Finder.iPos = 0;
1f640 0d 0a 20 20 20 20 20 20 73 46 69 6e 64 65 72 2e  ..      sFinder.
1f650 6e 46 69 72 73 74 20 3d 20 30 3b 0d 0a 20 20 20  nFirst = 0;..   
1f660 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 43     rc = pApi->xC
1f670 6f 6c 75 6d 6e 54 65 78 74 28 70 46 74 73 2c 20  olumnText(pFts, 
1f680 69 2c 20 26 73 46 69 6e 64 65 72 2e 7a 44 6f 63  i, &sFinder.zDoc
1f690 2c 20 26 6e 44 6f 63 29 3b 0d 0a 20 20 20 20 20  , &nDoc);..     
1f6a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f6b0 4f 4b 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20  OK ) break;..   
1f6c0 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 54     rc = pApi->xT
1f6d0 6f 6b 65 6e 69 7a 65 28 70 46 74 73 2c 20 0d 0a  okenize(pFts, ..
1f6e0 20 20 20 20 20 20 20 20 20 20 73 46 69 6e 64 65            sFinde
1f6f0 72 2e 7a 44 6f 63 2c 20 6e 44 6f 63 2c 20 28 76  r.zDoc, nDoc, (v
1f700 6f 69 64 2a 29 26 73 46 69 6e 64 65 72 2c 66 74  oid*)&sFinder,ft
1f710 73 35 53 65 6e 74 65 6e 63 65 46 69 6e 64 65 72  s5SentenceFinder
1f720 43 62 0d 0a 20 20 20 20 20 20 29 3b 0d 0a 20 20  Cb..      );..  
1f730 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f740 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0d 0a  TE_OK ) break;..
1f750 20 20 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d        rc = pApi-
1f760 3e 78 43 6f 6c 75 6d 6e 53 69 7a 65 28 70 46 74  >xColumnSize(pFt
1f770 73 2c 20 69 2c 20 26 6e 44 6f 63 73 69 7a 65 29  s, i, &nDocsize)
1f780 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ;..      if( rc!
1f790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
1f7a0 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  ak;....      for
1f7b0 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
1f7c0 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 49 6e 73 74  E_OK && ii<nInst
1f7d0 3b 20 69 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  ; ii++){..      
1f7e0 20 20 69 6e 74 20 69 70 2c 20 69 63 2c 20 69 6f    int ip, ic, io
1f7f0 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ;..        int i
1f800 41 64 6a 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e  Adj;..        in
1f810 74 20 6e 53 63 6f 72 65 3b 0d 0a 20 20 20 20 20  t nScore;..     
1f820 20 20 20 69 6e 74 20 6a 6a 3b 0d 0a 0d 0a 20 20     int jj;....  
1f830 20 20 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d        rc = pApi-
1f840 3e 78 49 6e 73 74 28 70 46 74 73 2c 20 69 69 2c  >xInst(pFts, ii,
1f850 20 26 69 70 2c 20 26 69 63 2c 20 26 69 6f 29 3b   &ip, &ic, &io);
1f860 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 63  ..        if( ic
1f870 21 3d 69 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d  !=i ) continue;.
1f880 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6f 3e  .        if( io>
1f890 6e 44 6f 63 73 69 7a 65 20 29 20 72 63 20 3d 20  nDocsize ) rc = 
1f8a0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0d 0a 20  FTS5_CORRUPT;.. 
1f8b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f8c0 51 4c 49 54 45 5f 4f 4b 20 29 20 63 6f 6e 74 69  QLITE_OK ) conti
1f8d0 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 6d 65  nue;..        me
1f8e0 6d 73 65 74 28 61 53 65 65 6e 2c 20 30 2c 20 6e  mset(aSeen, 0, n
1f8f0 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20 20 20  Phrase);..      
1f900 20 20 72 63 20 3d 20 66 74 73 35 53 6e 69 70 70    rc = fts5Snipp
1f910 65 74 53 63 6f 72 65 28 70 41 70 69 2c 20 70 46  etScore(pApi, pF
1f920 74 73 2c 20 6e 44 6f 63 73 69 7a 65 2c 20 61 53  ts, nDocsize, aS
1f930 65 65 6e 2c 20 69 2c 0d 0a 20 20 20 20 20 20 20  een, i,..       
1f940 20 20 20 20 20 69 6f 2c 20 6e 54 6f 6b 65 6e 2c       io, nToken,
1f950 20 26 6e 53 63 6f 72 65 2c 20 26 69 41 64 6a 0d   &nScore, &iAdj.
1f960 0a 20 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 20  .        );..   
1f970 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f980 49 54 45 5f 4f 4b 20 26 26 20 6e 53 63 6f 72 65  ITE_OK && nScore
1f990 3e 6e 42 65 73 74 53 63 6f 72 65 20 29 7b 0d 0a  >nBestScore ){..
1f9a0 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 53            nBestS
1f9b0 63 6f 72 65 20 3d 20 6e 53 63 6f 72 65 3b 0d 0a  core = nScore;..
1f9c0 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74 43            iBestC
1f9d0 6f 6c 20 3d 20 69 3b 0d 0a 20 20 20 20 20 20 20  ol = i;..       
1f9e0 20 20 20 69 42 65 73 74 53 74 61 72 74 20 3d 20     iBestStart = 
1f9f0 69 41 64 6a 3b 0d 0a 20 20 20 20 20 20 20 20 20  iAdj;..         
1fa00 20 6e 43 6f 6c 53 69 7a 65 20 3d 20 6e 44 6f 63   nColSize = nDoc
1fa10 73 69 7a 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d  size;..        }
1fa20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ....        if( 
1fa30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1fa40 20 73 46 69 6e 64 65 72 2e 6e 46 69 72 73 74 20   sFinder.nFirst 
1fa50 26 26 20 6e 44 6f 63 73 69 7a 65 3e 6e 54 6f 6b  && nDocsize>nTok
1fa60 65 6e 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20  en ){..         
1fa70 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 28 73   for(jj=0; jj<(s
1fa80 46 69 6e 64 65 72 2e 6e 46 69 72 73 74 2d 31 29  Finder.nFirst-1)
1fa90 3b 20 6a 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  ; jj++){..      
1faa0 20 20 20 20 20 20 69 66 28 20 73 46 69 6e 64 65        if( sFinde
1fab0 72 2e 61 46 69 72 73 74 5b 6a 6a 2b 31 5d 3e 69  r.aFirst[jj+1]>i
1fac0 6f 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20  o ) break;..    
1fad0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1fae0 20 20 20 20 20 69 66 28 20 73 46 69 6e 64 65 72       if( sFinder
1faf0 2e 61 46 69 72 73 74 5b 6a 6a 5d 3c 69 6f 20 29  .aFirst[jj]<io )
1fb00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  {..            m
1fb10 65 6d 73 65 74 28 61 53 65 65 6e 2c 20 30 2c 20  emset(aSeen, 0, 
1fb20 6e 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20 20  nPhrase);..     
1fb30 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
1fb40 53 6e 69 70 70 65 74 53 63 6f 72 65 28 70 41 70  SnippetScore(pAp
1fb50 69 2c 20 70 46 74 73 2c 20 6e 44 6f 63 73 69 7a  i, pFts, nDocsiz
1fb60 65 2c 20 61 53 65 65 6e 2c 20 69 2c 20 0d 0a 20  e, aSeen, i, .. 
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 46 69               sFi
1fb80 6e 64 65 72 2e 61 46 69 72 73 74 5b 6a 6a 5d 2c  nder.aFirst[jj],
1fb90 20 6e 54 6f 6b 65 6e 2c 20 26 6e 53 63 6f 72 65   nToken, &nScore
1fba0 2c 20 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20  , 0..           
1fbb0 20 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   );....         
1fbc0 20 20 20 6e 53 63 6f 72 65 20 2b 3d 20 28 73 46     nScore += (sF
1fbd0 69 6e 64 65 72 2e 61 46 69 72 73 74 5b 6a 6a 5d  inder.aFirst[jj]
1fbe0 3d 3d 30 20 3f 20 31 32 30 20 3a 20 31 30 30 29  ==0 ? 120 : 100)
1fbf0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
1fc00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fc10 20 26 26 20 6e 53 63 6f 72 65 3e 6e 42 65 73 74   && nScore>nBest
1fc20 53 63 6f 72 65 20 29 7b 0d 0a 20 20 20 20 20 20  Score ){..      
1fc30 20 20 20 20 20 20 20 20 6e 42 65 73 74 53 63 6f          nBestSco
1fc40 72 65 20 3d 20 6e 53 63 6f 72 65 3b 0d 0a 20 20  re = nScore;..  
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 69 42 65 73              iBes
1fc60 74 43 6f 6c 20 3d 20 69 3b 0d 0a 20 20 20 20 20  tCol = i;..     
1fc70 20 20 20 20 20 20 20 20 20 69 42 65 73 74 53 74           iBestSt
1fc80 61 72 74 20 3d 20 73 46 69 6e 64 65 72 2e 61 46  art = sFinder.aF
1fc90 69 72 73 74 5b 6a 6a 5d 3b 0d 0a 20 20 20 20 20  irst[jj];..     
1fca0 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 53 69 7a           nColSiz
1fcb0 65 20 3d 20 6e 44 6f 63 73 69 7a 65 3b 0d 0a 20  e = nDocsize;.. 
1fcc0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1fcd0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fce0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
1fcf0 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69     }..  }....  i
1fd00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fd10 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 70 41   ){..    rc = pA
1fd20 70 69 2d 3e 78 43 6f 6c 75 6d 6e 54 65 78 74 28  pi->xColumnText(
1fd30 70 46 74 73 2c 20 69 42 65 73 74 43 6f 6c 2c 20  pFts, iBestCol, 
1fd40 26 63 74 78 2e 7a 49 6e 2c 20 26 63 74 78 2e 6e  &ctx.zIn, &ctx.n
1fd50 49 6e 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28  In);..  }..  if(
1fd60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1fd70 26 20 6e 43 6f 6c 53 69 7a 65 3d 3d 30 20 29 7b  & nColSize==0 ){
1fd80 0d 0a 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d  ..    rc = pApi-
1fd90 3e 78 43 6f 6c 75 6d 6e 53 69 7a 65 28 70 46 74  >xColumnSize(pFt
1fda0 73 2c 20 69 42 65 73 74 43 6f 6c 2c 20 26 6e 43  s, iBestCol, &nC
1fdb0 6f 6c 53 69 7a 65 29 3b 0d 0a 20 20 7d 0d 0a 20  olSize);..  }.. 
1fdc0 20 69 66 28 20 63 74 78 2e 7a 49 6e 20 29 7b 0d   if( ctx.zIn ){.
1fdd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1fde0 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20  ITE_OK ){..     
1fdf0 20 72 63 20 3d 20 66 74 73 35 43 49 6e 73 74 49   rc = fts5CInstI
1fe00 74 65 72 49 6e 69 74 28 70 41 70 69 2c 20 70 46  terInit(pApi, pF
1fe10 74 73 2c 20 69 42 65 73 74 43 6f 6c 2c 20 26 63  ts, iBestCol, &c
1fe20 74 78 2e 69 74 65 72 29 3b 0d 0a 20 20 20 20 7d  tx.iter);..    }
1fe30 0d 0a 0d 0a 20 20 20 20 63 74 78 2e 69 52 61 6e  ....    ctx.iRan
1fe40 67 65 53 74 61 72 74 20 3d 20 69 42 65 73 74 53  geStart = iBestS
1fe50 74 61 72 74 3b 0d 0a 20 20 20 20 63 74 78 2e 69  tart;..    ctx.i
1fe60 52 61 6e 67 65 45 6e 64 20 3d 20 69 42 65 73 74  RangeEnd = iBest
1fe70 53 74 61 72 74 20 2b 20 6e 54 6f 6b 65 6e 20 2d  Start + nToken -
1fe80 20 31 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 69   1;....    if( i
1fe90 42 65 73 74 53 74 61 72 74 3e 30 20 29 7b 0d 0a  BestStart>0 ){..
1fea0 20 20 20 20 20 20 66 74 73 35 48 69 67 68 6c 69        fts5Highli
1feb0 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20 26  ghtAppend(&rc, &
1fec0 63 74 78 2c 20 7a 45 6c 6c 69 70 73 2c 20 2d 31  ctx, zEllips, -1
1fed0 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
1fee0 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72   /* Advance iter
1fef0 61 74 6f 72 20 63 74 78 2e 69 74 65 72 20 73 6f  ator ctx.iter so
1ff00 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1ff10 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 61  to the first coa
1ff20 6c 65 73 63 65 64 0d 0a 20 20 20 20 2a 2a 20 70  lesced..    ** p
1ff30 68 72 61 73 65 20 69 6e 73 74 61 6e 63 65 20 61  hrase instance a
1ff40 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 70  t or following p
1ff50 6f 73 69 74 69 6f 6e 20 69 42 65 73 74 53 74 61  osition iBestSta
1ff60 72 74 2e 20 2a 2f 0d 0a 20 20 20 20 77 68 69 6c  rt. */..    whil
1ff70 65 28 20 63 74 78 2e 69 74 65 72 2e 69 53 74 61  e( ctx.iter.iSta
1ff80 72 74 3e 3d 30 20 26 26 20 63 74 78 2e 69 74 65  rt>=0 && ctx.ite
1ff90 72 2e 69 53 74 61 72 74 3c 69 42 65 73 74 53 74  r.iStart<iBestSt
1ffa0 61 72 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  art && rc==SQLIT
1ffb0 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72  E_OK ){..      r
1ffc0 63 20 3d 20 66 74 73 35 43 49 6e 73 74 49 74 65  c = fts5CInstIte
1ffd0 72 4e 65 78 74 28 26 63 74 78 2e 69 74 65 72 29  rNext(&ctx.iter)
1ffe0 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
1fff0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20000 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d  K ){..      rc =
20010 20 70 41 70 69 2d 3e 78 54 6f 6b 65 6e 69 7a 65   pApi->xTokenize
20020 28 70 46 74 73 2c 20 63 74 78 2e 7a 49 6e 2c 20  (pFts, ctx.zIn, 
20030 63 74 78 2e 6e 49 6e 2c 20 28 76 6f 69 64 2a 29  ctx.nIn, (void*)
20040 26 63 74 78 2c 66 74 73 35 48 69 67 68 6c 69 67  &ctx,fts5Highlig
20050 68 74 43 62 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20  htCb);..    }.. 
20060 20 20 20 69 66 28 20 63 74 78 2e 69 52 61 6e 67     if( ctx.iRang
20070 65 45 6e 64 3e 3d 28 6e 43 6f 6c 53 69 7a 65 2d  eEnd>=(nColSize-
20080 31 29 20 29 7b 0d 0a 20 20 20 20 20 20 66 74 73  1) ){..      fts
20090 35 48 69 67 68 6c 69 67 68 74 41 70 70 65 6e 64  5HighlightAppend
200a0 28 26 72 63 2c 20 26 63 74 78 2c 20 26 63 74 78  (&rc, &ctx, &ctx
200b0 2e 7a 49 6e 5b 63 74 78 2e 69 4f 66 66 5d 2c 20  .zIn[ctx.iOff], 
200c0 63 74 78 2e 6e 49 6e 20 2d 20 63 74 78 2e 69 4f  ctx.nIn - ctx.iO
200d0 66 66 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b  ff);..    }else{
200e0 0d 0a 20 20 20 20 20 20 66 74 73 35 48 69 67 68  ..      fts5High
200f0 6c 69 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c  lightAppend(&rc,
20100 20 26 63 74 78 2c 20 7a 45 6c 6c 69 70 73 2c 20   &ctx, zEllips, 
20110 2d 31 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  -1);..    }..  }
20120 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
20130 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 73 71  TE_OK ){..    sq
20140 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
20150 74 28 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63  t(pCtx, (const c
20160 68 61 72 2a 29 63 74 78 2e 7a 4f 75 74 2c 20 2d  har*)ctx.zOut, -
20170 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
20180 45 4e 54 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d  ENT);..  }else{.
20190 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
201a0 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
201b0 43 74 78 2c 20 72 63 29 3b 0d 0a 20 20 7d 0d 0a  Ctx, rc);..  }..
201c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63    sqlite3_free(c
201d0 74 78 2e 7a 4f 75 74 29 3b 0d 0a 20 20 73 71 6c  tx.zOut);..  sql
201e0 69 74 65 33 5f 66 72 65 65 28 61 53 65 65 6e 29  ite3_free(aSeen)
201f0 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
20200 65 28 73 46 69 6e 64 65 72 2e 61 46 69 72 73 74  e(sFinder.aFirst
20210 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a  );..}..../******
20220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20260 2a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68  **/..../*..** Th
20270 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
20280 20 62 6d 32 35 28 29 20 66 75 6e 63 74 69 6f 6e   bm25() function
20290 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 61   is called for a
202a0 20 71 75 65 72 79 2c 20 61 6e 20 69 6e 73 74 61   query, an insta
202b0 6e 63 65 0d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  nce..** of the f
202c0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
202d0 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
202e0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 2e 0d 0a  and populated...
202f0 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75  */..typedef stru
20300 63 74 20 46 74 73 35 42 6d 32 35 44 61 74 61 20  ct Fts5Bm25Data 
20310 46 74 73 35 42 6d 32 35 44 61 74 61 3b 0d 0a 73  Fts5Bm25Data;..s
20320 74 72 75 63 74 20 46 74 73 35 42 6d 32 35 44 61  truct Fts5Bm25Da
20330 74 61 20 7b 0d 0a 20 20 69 6e 74 20 6e 50 68 72  ta {..  int nPhr
20340 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
20350 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20360 72 20 6f 66 20 70 68 72 61 73 65 73 20 69 6e 20  r of phrases in 
20370 71 75 65 72 79 20 2a 2f 0d 0a 20 20 64 6f 75 62  query */..  doub
20380 6c 65 20 61 76 67 64 6c 3b 20 20 20 20 20 20 20  le avgdl;       
20390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
203a0 76 65 72 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  verage number of
203b0 20 74 6f 6b 65 6e 73 20 69 6e 20 65 61 63 68 20   tokens in each 
203c0 72 6f 77 20 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65  row */..  double
203d0 20 2a 61 49 44 46 3b 20 20 20 20 20 20 20 20 20   *aIDF;         
203e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 44 46            /* IDF
203f0 20 66 6f 72 20 65 61 63 68 20 70 68 72 61 73 65   for each phrase
20400 20 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 2a 61   */..  double *a
20410 46 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20  Freq;           
20420 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
20430 75 73 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74  used to calculat
20440 65 20 70 68 72 61 73 65 20 66 72 65 71 2e 20 2a  e phrase freq. *
20450 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  /..};..../*..** 
20460 43 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  Callback used by
20470 20 66 74 73 35 42 6d 32 35 47 65 74 44 61 74 61   fts5Bm25GetData
20480 28 29 20 74 6f 20 63 6f 75 6e 74 20 74 68 65 20  () to count the 
20490 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
204a0 6e 20 74 68 65 0d 0a 2a 2a 20 74 61 62 6c 65 20  n the..** table 
204b0 6d 61 74 63 68 65 64 20 62 79 20 65 61 63 68 20  matched by each 
204c0 69 6e 64 69 76 69 64 75 61 6c 20 70 68 72 61 73  individual phras
204d0 65 20 77 69 74 68 69 6e 20 74 68 65 20 71 75 65  e within the que
204e0 72 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ry...*/..static 
204f0 69 6e 74 20 66 74 73 35 43 6f 75 6e 74 43 62 28  int fts5CountCb(
20500 0d 0a 20 20 63 6f 6e 73 74 20 46 74 73 35 45 78  ..  const Fts5Ex
20510 74 65 6e 73 69 6f 6e 41 70 69 20 2a 70 41 70 69  tensionApi *pApi
20520 2c 20 0d 0a 20 20 46 74 73 35 43 6f 6e 74 65 78  , ..  Fts5Contex
20530 74 20 2a 70 46 74 73 2c 0d 0a 20 20 76 6f 69 64  t *pFts,..  void
20540 20 2a 70 55 73 65 72 44 61 74 61 20 20 20 20 20   *pUserData     
20550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
20560 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
20570 33 5f 69 6e 74 36 34 20 76 61 72 69 61 62 6c 65  3_int64 variable
20580 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 73 71 6c 69 74   */..){..  sqlit
20590 65 33 5f 69 6e 74 36 34 20 2a 70 6e 20 3d 20 28  e3_int64 *pn = (
205a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
205b0 55 73 65 72 44 61 74 61 3b 0d 0a 20 20 55 4e 55  UserData;..  UNU
205c0 53 45 44 5f 50 41 52 41 4d 32 28 70 41 70 69 2c  SED_PARAM2(pApi,
205d0 20 70 46 74 73 29 3b 0d 0a 20 20 28 2a 70 6e 29   pFts);..  (*pn)
205e0 2b 2b 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51  ++;..  return SQ
205f0 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f  LITE_OK;..}..../
20600 2a 0d 0a 2a 2a 20 53 65 74 20 2a 70 70 44 61 74  *..** Set *ppDat
20610 61 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  a to point to th
20620 65 20 46 74 73 35 42 6d 32 35 44 61 74 61 20 6f  e Fts5Bm25Data o
20630 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 63 75  bject for the cu
20640 72 72 65 6e 74 20 71 75 65 72 79 2e 20 0d 0a 2a  rrent query. ..*
20650 2a 20 49 66 20 74 68 65 20 6f 62 6a 65 63 74 20  * If the object 
20660 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
20670 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
20680 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70  allocate and pop
20690 75 6c 61 74 65 20 69 74 0d 0a 2a 2a 20 6e 6f 77  ulate it..** now
206a0 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
206b0 74 20 66 74 73 35 42 6d 32 35 47 65 74 44 61 74  t fts5Bm25GetDat
206c0 61 28 0d 0a 20 20 63 6f 6e 73 74 20 46 74 73 35  a(..  const Fts5
206d0 45 78 74 65 6e 73 69 6f 6e 41 70 69 20 2a 70 41  ExtensionApi *pA
206e0 70 69 2c 20 0d 0a 20 20 46 74 73 35 43 6f 6e 74  pi, ..  Fts5Cont
206f0 65 78 74 20 2a 70 46 74 73 2c 0d 0a 20 20 46 74  ext *pFts,..  Ft
20700 73 35 42 6d 32 35 44 61 74 61 20 2a 2a 70 70 44  s5Bm25Data **ppD
20710 61 74 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ata           /*
20720 20 4f 55 54 3a 20 62 6d 32 35 2d 64 61 74 61 20   OUT: bm25-data 
20730 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 69 73 20  object for this 
20740 71 75 65 72 79 20 2a 2f 0d 0a 29 7b 0d 0a 20 20  query */..){..  
20750 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20760 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
20770 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
20780 2f 0d 0a 20 20 46 74 73 35 42 6d 32 35 44 61 74  /..  Fts5Bm25Dat
20790 61 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  a *p;           
207a0 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
207b0 6f 20 72 65 74 75 72 6e 20 2a 2f 0d 0a 0d 0a 20  o return */.... 
207c0 20 70 20 3d 20 70 41 70 69 2d 3e 78 47 65 74 41   p = pApi->xGetA
207d0 75 78 64 61 74 61 28 70 46 74 73 2c 20 30 29 3b  uxdata(pFts, 0);
207e0 0d 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0d  ..  if( p==0 ){.
207f0 0a 20 20 20 20 69 6e 74 20 6e 50 68 72 61 73 65  .    int nPhrase
20800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20810 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20820 70 68 72 61 73 65 73 20 69 6e 20 71 75 65 72 79  phrases in query
20830 20 2a 2f 0d 0a 20 20 20 20 73 71 6c 69 74 65 33   */..    sqlite3
20840 5f 69 6e 74 36 34 20 6e 52 6f 77 20 3d 20 30 3b  _int64 nRow = 0;
20850 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20860 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 61 62 6c   of rows in tabl
20870 65 20 2a 2f 0d 0a 20 20 20 20 73 71 6c 69 74 65  e */..    sqlite
20880 33 5f 69 6e 74 36 34 20 6e 54 6f 6b 65 6e 20 3d  3_int64 nToken =
20890 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
208a0 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74  r of tokens in t
208b0 61 62 6c 65 20 2a 2f 0d 0a 20 20 20 20 73 71 6c  able */..    sql
208c0 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
208d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79  ;          /* By
208e0 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
208f0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0d 0a 20 20 20  allocate */..   
20900 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20 20 20 2f   int i;....    /
20910 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 46  * Allocate the F
20920 74 73 35 42 6d 32 35 44 61 74 61 20 6f 62 6a 65  ts5Bm25Data obje
20930 63 74 20 2a 2f 0d 0a 20 20 20 20 6e 50 68 72 61  ct */..    nPhra
20940 73 65 20 3d 20 70 41 70 69 2d 3e 78 50 68 72 61  se = pApi->xPhra
20950 73 65 43 6f 75 6e 74 28 70 46 74 73 29 3b 0d 0a  seCount(pFts);..
20960 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
20970 6f 66 28 46 74 73 35 42 6d 32 35 44 61 74 61 29  of(Fts5Bm25Data)
20980 20 2b 20 6e 50 68 72 61 73 65 2a 32 2a 73 69 7a   + nPhrase*2*siz
20990 65 6f 66 28 64 6f 75 62 6c 65 29 3b 0d 0a 20 20  eof(double);..  
209a0 20 20 70 20 3d 20 28 46 74 73 35 42 6d 32 35 44    p = (Fts5Bm25D
209b0 61 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ata*)sqlite3_mal
209c0 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0d 0a 20  loc64(nByte);.. 
209d0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0d 0a     if( p==0 ){..
209e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
209f0 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 7d 65  E_NOMEM;..    }e
20a00 6c 73 65 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 73  lse{..      mems
20a10 65 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b  et(p, 0, nByte);
20a20 0d 0a 20 20 20 20 20 20 70 2d 3e 6e 50 68 72 61  ..      p->nPhra
20a30 73 65 20 3d 20 6e 50 68 72 61 73 65 3b 0d 0a 20  se = nPhrase;.. 
20a40 20 20 20 20 20 70 2d 3e 61 49 44 46 20 3d 20 28       p->aIDF = (
20a50 64 6f 75 62 6c 65 2a 29 26 70 5b 31 5d 3b 0d 0a  double*)&p[1];..
20a60 20 20 20 20 20 20 70 2d 3e 61 46 72 65 71 20 3d        p->aFreq =
20a70 20 26 70 2d 3e 61 49 44 46 5b 6e 50 68 72 61 73   &p->aIDF[nPhras
20a80 65 5d 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  e];..    }....  
20a90 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
20aa0 68 65 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d  he average docum
20ab0 65 6e 74 20 6c 65 6e 67 74 68 20 66 6f 72 20 74  ent length for t
20ac0 68 69 73 20 46 54 53 35 20 74 61 62 6c 65 20 2a  his FTS5 table *
20ad0 2f 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  /..    if( rc==S
20ae0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
20af0 70 41 70 69 2d 3e 78 52 6f 77 43 6f 75 6e 74 28  pApi->xRowCount(
20b00 70 46 74 73 2c 20 26 6e 52 6f 77 29 3b 0d 0a 20  pFts, &nRow);.. 
20b10 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
20b20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 52 6f 77  QLITE_OK || nRow
20b30 3e 30 20 29 3b 0d 0a 20 20 20 20 69 66 28 20 72  >0 );..    if( r
20b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
20b50 63 20 3d 20 70 41 70 69 2d 3e 78 43 6f 6c 75 6d  c = pApi->xColum
20b60 6e 54 6f 74 61 6c 53 69 7a 65 28 70 46 74 73 2c  nTotalSize(pFts,
20b70 20 2d 31 2c 20 26 6e 54 6f 6b 65 6e 29 3b 0d 0a   -1, &nToken);..
20b80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20b90 54 45 5f 4f 4b 20 29 20 70 2d 3e 61 76 67 64 6c  TE_OK ) p->avgdl
20ba0 20 3d 20 28 64 6f 75 62 6c 65 29 6e 54 6f 6b 65   = (double)nToke
20bb0 6e 20 20 2f 20 28 64 6f 75 62 6c 65 29 6e 52 6f  n  / (double)nRo
20bc0 77 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 43 61 6c  w;....    /* Cal
20bd0 63 75 6c 61 74 65 20 61 6e 20 49 44 46 20 66 6f  culate an IDF fo
20be0 72 20 65 61 63 68 20 70 68 72 61 73 65 20 69 6e  r each phrase in
20bf0 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0d 0a 20   the query */.. 
20c00 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
20c10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
20c20 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20  Phrase; i++){.. 
20c30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
20c40 36 34 20 6e 48 69 74 20 3d 20 30 3b 0d 0a 20 20  64 nHit = 0;..  
20c50 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78      rc = pApi->x
20c60 51 75 65 72 79 50 68 72 61 73 65 28 70 46 74 73  QueryPhrase(pFts
20c70 2c 20 69 2c 20 28 76 6f 69 64 2a 29 26 6e 48 69  , i, (void*)&nHi
20c80 74 2c 20 66 74 73 35 43 6f 75 6e 74 43 62 29 3b  t, fts5CountCb);
20c90 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
20ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
20cb0 20 20 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61        /* Calcula
20cc0 74 65 20 74 68 65 20 49 44 46 20 28 49 6e 76 65  te the IDF (Inve
20cd0 72 73 65 20 44 6f 63 75 6d 65 6e 74 20 46 72 65  rse Document Fre
20ce0 71 75 65 6e 63 79 29 20 66 6f 72 20 70 68 72 61  quency) for phra
20cf0 73 65 20 69 2e 0d 0a 20 20 20 20 20 20 20 20 2a  se i...        *
20d00 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 75  * This is done u
20d10 73 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61 72  sing the standar
20d20 64 20 42 4d 32 35 20 66 6f 72 6d 75 6c 61 20 61  d BM25 formula a
20d30 73 20 66 6f 75 6e 64 20 6f 6e 20 77 69 6b 69 70  s found on wikip
20d40 65 64 69 61 3a 0d 0a 20 20 20 20 20 20 20 20 2a  edia:..        *
20d50 2a 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  *..        **   
20d60 49 44 46 20 3d 20 6c 6f 67 28 20 28 4e 20 2d 20  IDF = log( (N - 
20d70 6e 48 69 74 20 2b 20 30 2e 35 29 20 2f 20 28 6e  nHit + 0.5) / (n
20d80 48 69 74 20 2b 20 30 2e 35 29 20 29 0d 0a 20 20  Hit + 0.5) )..  
20d90 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20        **..      
20da0 20 20 2a 2a 20 77 68 65 72 65 20 22 4e 22 20 69    ** where "N" i
20db0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
20dc0 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  er of documents 
20dd0 69 6e 20 74 68 65 20 73 65 74 20 61 6e 64 20 6e  in the set and n
20de0 48 69 74 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20  Hit..        ** 
20df0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 74 68  is the number th
20e00 61 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65  at contain at le
20e10 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  ast one instance
20e20 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 0d 0a   of the phrase..
20e30 20 20 20 20 20 20 20 20 2a 2a 20 75 6e 64 65 72          ** under
20e40 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2e 0d   consideration..
20e50 0a 20 20 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20  .        **..   
20e60 20 20 20 20 20 2a 2a 20 54 68 65 20 70 72 6f 62       ** The prob
20e70 6c 65 6d 20 77 69 74 68 20 74 68 69 73 20 69 73  lem with this is
20e80 20 74 68 61 74 20 69 66 20 28 4e 20 3c 20 32 2a   that if (N < 2*
20e90 6e 48 69 74 29 2c 20 74 68 65 20 49 44 46 20 69  nHit), the IDF i
20ea0 73 20 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  s ..        ** n
20eb0 65 67 61 74 69 76 65 2e 20 57 68 69 63 68 20 69  egative. Which i
20ec0 73 20 75 6e 64 65 73 69 72 61 62 6c 65 2e 20 53  s undesirable. S
20ed0 6f 20 74 68 65 20 6d 69 6d 69 6d 75 6d 20 61 6c  o the mimimum al
20ee0 6c 6f 77 61 62 6c 65 20 49 44 46 20 69 73 0d 0a  lowable IDF is..
20ef0 20 20 20 20 20 20 20 20 2a 2a 20 28 31 65 2d 36          ** (1e-6
20f00 29 20 2d 20 72 6f 75 67 68 6c 79 20 74 68 65 20  ) - roughly the 
20f10 73 61 6d 65 20 61 73 20 61 20 74 65 72 6d 20 74  same as a term t
20f20 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 6a  hat appears in j
20f30 75 73 74 20 6f 76 65 72 0d 0a 20 20 20 20 20 20  ust over..      
20f40 20 20 2a 2a 20 68 61 6c 66 20 6f 66 20 73 65 74    ** half of set
20f50 20 6f 66 20 35 2c 30 30 30 2c 30 30 30 20 64 6f   of 5,000,000 do
20f60 63 75 6d 65 6e 74 73 2e 20 20 2a 2f 0d 0a 20 20  cuments.  */..  
20f70 20 20 20 20 20 20 64 6f 75 62 6c 65 20 69 64 66        double idf
20f80 20 3d 20 6c 6f 67 28 20 28 6e 52 6f 77 20 2d 20   = log( (nRow - 
20f90 6e 48 69 74 20 2b 20 30 2e 35 29 20 2f 20 28 6e  nHit + 0.5) / (n
20fa0 48 69 74 20 2b 20 30 2e 35 29 20 29 3b 0d 0a 20  Hit + 0.5) );.. 
20fb0 20 20 20 20 20 20 20 69 66 28 20 69 64 66 3c 3d         if( idf<=
20fc0 30 2e 30 20 29 20 69 64 66 20 3d 20 31 65 2d 36  0.0 ) idf = 1e-6
20fd0 3b 0d 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 49  ;..        p->aI
20fe0 44 46 5b 69 5d 20 3d 20 69 64 66 3b 0d 0a 20 20  DF[i] = idf;..  
20ff0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
21000 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21010 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
21020 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
21030 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20  ..    }else{..  
21040 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78      rc = pApi->x
21050 53 65 74 41 75 78 64 61 74 61 28 70 46 74 73 2c  SetAuxdata(pFts,
21060 20 70 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   p, sqlite3_free
21070 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69  );..    }..    i
21080 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21090 20 29 20 70 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a   ) p = 0;..  }..
210a0 20 20 2a 70 70 44 61 74 61 20 3d 20 70 3b 0d 0a    *ppData = p;..
210b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
210c0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6d 70 6c 65 6d  .../*..** Implem
210d0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6d 32 35  entation of bm25
210e0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f  () function...*/
210f0 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
21100 73 35 42 6d 32 35 46 75 6e 63 74 69 6f 6e 28 0d  s5Bm25Function(.
21110 0a 20 20 63 6f 6e 73 74 20 46 74 73 35 45 78 74  .  const Fts5Ext
21120 65 6e 73 69 6f 6e 41 70 69 20 2a 70 41 70 69 2c  ensionApi *pApi,
21130 20 20 20 2f 2a 20 41 50 49 20 6f 66 66 65 72 65     /* API offere
21140 64 20 62 79 20 63 75 72 72 65 6e 74 20 46 54 53  d by current FTS
21150 20 76 65 72 73 69 6f 6e 20 2a 2f 0d 0a 20 20 46   version */..  F
21160 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 46 74 73  ts5Context *pFts
21170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
21180 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 70  * First arg to p
21190 61 73 73 20 74 6f 20 70 41 70 69 20 66 75 6e 63  ass to pApi func
211a0 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20 73 71 6c 69  tions */..  sqli
211b0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
211c0 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  x,          /* C
211d0 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 74 75 72  ontext for retur
211e0 6e 69 6e 67 20 72 65 73 75 6c 74 2f 65 72 72 6f  ning result/erro
211f0 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 56 61 6c  r */..  int nVal
21200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21210 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21220 72 20 6f 66 20 76 61 6c 75 65 73 20 69 6e 20 61  r of values in a
21230 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0d  pVal[] array */.
21240 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
21250 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
21260 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
21270 72 61 69 6c 69 6e 67 20 61 72 67 75 6d 65 6e 74  railing argument
21280 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73  s */..){..  cons
21290 74 20 64 6f 75 62 6c 65 20 6b 31 20 3d 20 31 2e  t double k1 = 1.
212a0 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  2;          /* C
212b0 6f 6e 73 74 61 6e 74 20 22 6b 31 22 20 66 72 6f  onstant "k1" fro
212c0 6d 20 42 4d 32 35 20 66 6f 72 6d 75 6c 61 20 2a  m BM25 formula *
212d0 2f 0d 0a 20 20 63 6f 6e 73 74 20 64 6f 75 62 6c  /..  const doubl
212e0 65 20 62 20 3d 20 30 2e 37 35 3b 20 20 20 20 20  e b = 0.75;     
212f0 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74       /* Constant
21300 20 22 62 22 20 66 72 6f 6d 20 42 4d 32 35 20 66   "b" from BM25 f
21310 6f 72 6d 75 6c 61 20 2a 2f 0d 0a 20 20 69 6e 74  ormula */..  int
21320 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21340 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0d 0a 20  Error code */.. 
21350 20 64 6f 75 62 6c 65 20 73 63 6f 72 65 20 3d 20   double score = 
21360 30 2e 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  0.0;            
21370 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   /* SQL function
21380 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
21390 0d 0a 20 20 46 74 73 35 42 6d 32 35 44 61 74 61  ..  Fts5Bm25Data
213a0 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
213b0 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 61 6c      /* Values al
213c0 6c 6f 63 61 74 65 64 2f 63 61 6c 63 75 6c 61 74  located/calculat
213d0 65 64 20 6f 6e 63 65 20 6f 6e 6c 79 20 2a 2f 0d  ed once only */.
213e0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21400 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
21410 61 72 69 61 62 6c 65 20 2a 2f 0d 0a 20 20 69 6e  ariable */..  in
21420 74 20 6e 49 6e 73 74 20 3d 20 30 3b 20 20 20 20  t nInst = 0;    
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21440 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
21450 62 79 20 78 49 6e 73 74 43 6f 75 6e 74 28 29 20  by xInstCount() 
21460 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 44 20 3d  */..  double D =
21470 20 30 2e 30 3b 20 20 20 20 20 20 20 20 20 20 20   0.0;           
21480 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
21490 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
214a0 69 6e 20 72 6f 77 20 2a 2f 0d 0a 20 20 64 6f 75  in row */..  dou
214b0 62 6c 65 20 2a 61 46 72 65 71 20 3d 20 30 3b 20  ble *aFreq = 0; 
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
214d0 41 72 72 61 79 20 6f 66 20 70 68 72 61 73 65 20  Array of phrase 
214e0 66 72 65 71 2e 20 66 6f 72 20 63 75 72 72 65 6e  freq. for curren
214f0 74 20 72 6f 77 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a  t row */....  /*
21500 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 70   Calculate the p
21510 68 72 61 73 65 20 66 72 65 71 75 65 6e 63 79 20  hrase frequency 
21520 28 73 79 6d 62 6f 6c 20 22 66 28 71 69 2c 44 29  (symbol "f(qi,D)
21530 22 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  " in the documen
21540 74 61 74 69 6f 6e 29 0d 0a 20 20 2a 2a 20 66 6f  tation)..  ** fo
21550 72 20 65 61 63 68 20 70 68 72 61 73 65 20 69 6e  r each phrase in
21560 20 74 68 65 20 71 75 65 72 79 20 66 6f 72 20 74   the query for t
21570 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
21580 2a 2f 0d 0a 20 20 72 63 20 3d 20 66 74 73 35 42  */..  rc = fts5B
21590 6d 32 35 47 65 74 44 61 74 61 28 70 41 70 69 2c  m25GetData(pApi,
215a0 20 70 46 74 73 2c 20 26 70 44 61 74 61 29 3b 0d   pFts, &pData);.
215b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
215c0 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 61 46 72  E_OK ){..    aFr
215d0 65 71 20 3d 20 70 44 61 74 61 2d 3e 61 46 72 65  eq = pData->aFre
215e0 71 3b 0d 0a 20 20 20 20 6d 65 6d 73 65 74 28 61  q;..    memset(a
215f0 46 72 65 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Freq, 0, sizeof(
21600 64 6f 75 62 6c 65 29 20 2a 20 70 44 61 74 61 2d  double) * pData-
21610 3e 6e 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20  >nPhrase);..    
21620 72 63 20 3d 20 70 41 70 69 2d 3e 78 49 6e 73 74  rc = pApi->xInst
21630 43 6f 75 6e 74 28 70 46 74 73 2c 20 26 6e 49 6e  Count(pFts, &nIn
21640 73 74 29 3b 0d 0a 20 20 7d 0d 0a 20 20 66 6f 72  st);..  }..  for
21650 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
21660 5f 4f 4b 20 26 26 20 69 3c 6e 49 6e 73 74 3b 20  _OK && i<nInst; 
21670 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69  i++){..    int i
21680 70 3b 20 69 6e 74 20 69 63 3b 20 69 6e 74 20 69  p; int ic; int i
21690 6f 3b 0d 0a 20 20 20 20 72 63 20 3d 20 70 41 70  o;..    rc = pAp
216a0 69 2d 3e 78 49 6e 73 74 28 70 46 74 73 2c 20 69  i->xInst(pFts, i
216b0 2c 20 26 69 70 2c 20 26 69 63 2c 20 26 69 6f 29  , &ip, &ic, &io)
216c0 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
216d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
216e0 20 20 20 64 6f 75 62 6c 65 20 77 20 3d 20 28 6e     double w = (n
216f0 56 61 6c 20 3e 20 69 63 29 20 3f 20 73 71 6c 69  Val > ic) ? sqli
21700 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
21710 28 61 70 56 61 6c 5b 69 63 5d 29 20 3a 20 31 2e  (apVal[ic]) : 1.
21720 30 3b 0d 0a 20 20 20 20 20 20 61 46 72 65 71 5b  0;..      aFreq[
21730 69 70 5d 20 2b 3d 20 77 3b 0d 0a 20 20 20 20 7d  ip] += w;..    }
21740 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 46 69  ..  }....  /* Fi
21750 67 75 72 65 20 6f 75 74 20 74 68 65 20 74 6f 74  gure out the tot
21760 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  al size of the c
21770 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 6f  urrent row in to
21780 6b 65 6e 73 2e 20 2a 2f 0d 0a 20 20 69 66 28 20  kens. */..  if( 
21790 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
217a0 0d 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 3b 0d  ..    int nTok;.
217b0 0a 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e  .    rc = pApi->
217c0 78 43 6f 6c 75 6d 6e 53 69 7a 65 28 70 46 74 73  xColumnSize(pFts
217d0 2c 20 2d 31 2c 20 26 6e 54 6f 6b 29 3b 0d 0a 20  , -1, &nTok);.. 
217e0 20 20 20 44 20 3d 20 28 64 6f 75 62 6c 65 29 6e     D = (double)n
217f0 54 6f 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f  Tok;..  }....  /
21800 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
21810 42 4d 32 35 20 73 63 6f 72 65 20 66 6f 72 20 74  BM25 score for t
21820 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
21830 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */..  for(i=0; r
21840 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21850 69 3c 70 44 61 74 61 2d 3e 6e 50 68 72 61 73 65  i<pData->nPhrase
21860 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 73 63 6f  ; i++){..    sco
21870 72 65 20 2b 3d 20 70 44 61 74 61 2d 3e 61 49 44  re += pData->aID
21880 46 5b 69 5d 20 2a 20 28 0d 0a 20 20 20 20 20 20  F[i] * (..      
21890 28 20 61 46 72 65 71 5b 69 5d 20 2a 20 28 6b 31  ( aFreq[i] * (k1
218a0 20 2b 20 31 2e 30 29 20 29 20 2f 20 0d 0a 20 20   + 1.0) ) / ..  
218b0 20 20 20 20 28 20 61 46 72 65 71 5b 69 5d 20 2b      ( aFreq[i] +
218c0 20 6b 31 20 2a 20 28 31 20 2d 20 62 20 2b 20 62   k1 * (1 - b + b
218d0 20 2a 20 44 20 2f 20 70 44 61 74 61 2d 3e 61 76   * D / pData->av
218e0 67 64 6c 29 20 29 0d 0a 20 20 20 20 29 3b 0d 0a  gdl) )..    );..
218f0 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f 2a 20 49 66    }..  ..  /* If
21900 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63   no error has oc
21910 63 75 72 72 65 64 2c 20 72 65 74 75 72 6e 20 74  curred, return t
21920 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 73 63  he calculated sc
21930 6f 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0d  ore. Otherwise,.
21940 0a 20 20 2a 2a 20 74 68 72 6f 77 20 61 6e 20 53  .  ** throw an S
21950 51 4c 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 2a  QL exception.  *
21960 2f 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  /..  if( rc==SQL
21970 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 73  ITE_OK ){..    s
21980 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
21990 75 62 6c 65 28 70 43 74 78 2c 20 2d 31 2e 30 20  uble(pCtx, -1.0 
219a0 2a 20 73 63 6f 72 65 29 3b 0d 0a 20 20 7d 65 6c  * score);..  }el
219b0 73 65 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  se{..    sqlite3
219c0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
219d0 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0d 0a 20  de(pCtx, rc);.. 
219e0 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20   }..}....static 
219f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 41  int sqlite3Fts5A
21a00 75 78 49 6e 69 74 28 66 74 73 35 5f 61 70 69 20  uxInit(fts5_api 
21a10 2a 70 41 70 69 29 7b 0d 0a 20 20 73 74 72 75 63  *pApi){..  struc
21a20 74 20 42 75 69 6c 74 69 6e 20 7b 0d 0a 20 20 20  t Builtin {..   
21a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
21a40 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nc;            /
21a50 2a 20 46 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  * Function name 
21a60 28 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 29  (nul-terminated)
21a70 20 2a 2f 0d 0a 20 20 20 20 76 6f 69 64 20 2a 70   */..    void *p
21a80 55 73 65 72 44 61 74 61 3b 20 20 20 20 20 20 20  UserData;       
21a90 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 2d 64         /* User-d
21aa0 61 74 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0d 0a  ata pointer */..
21ab0 20 20 20 20 66 74 73 35 5f 65 78 74 65 6e 73 69      fts5_extensi
21ac0 6f 6e 5f 66 75 6e 63 74 69 6f 6e 20 78 46 75 6e  on_function xFun
21ad0 63 3b 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75  c;/* Callback fu
21ae0 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 20 20 76  nction */..    v
21af0 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28  oid (*xDestroy)(
21b00 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 2f 2a 20  void*);      /* 
21b10 44 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  Destructor funct
21b20 69 6f 6e 20 2a 2f 0d 0a 20 20 7d 20 61 42 75 69  ion */..  } aBui
21b30 6c 74 69 6e 20 5b 5d 20 3d 20 7b 0d 0a 20 20 20  ltin [] = {..   
21b40 20 7b 20 22 73 6e 69 70 70 65 74 22 2c 20 20 20   { "snippet",   
21b50 30 2c 20 66 74 73 35 53 6e 69 70 70 65 74 46 75  0, fts5SnippetFu
21b60 6e 63 74 69 6f 6e 2c 20 30 20 7d 2c 0d 0a 20 20  nction, 0 },..  
21b70 20 20 7b 20 22 68 69 67 68 6c 69 67 68 74 22 2c    { "highlight",
21b80 20 30 2c 20 66 74 73 35 48 69 67 68 6c 69 67 68   0, fts5Highligh
21b90 74 46 75 6e 63 74 69 6f 6e 2c 20 30 20 7d 2c 0d  tFunction, 0 },.
21ba0 0a 20 20 20 20 7b 20 22 62 6d 32 35 22 2c 20 20  .    { "bm25",  
21bb0 20 20 20 20 30 2c 20 66 74 73 35 42 6d 32 35 46      0, fts5Bm25F
21bc0 75 6e 63 74 69 6f 6e 2c 20 20 20 20 30 20 7d 2c  unction,    0 },
21bd0 0d 0a 20 20 7d 3b 0d 0a 20 20 69 6e 74 20 72 63  ..  };..  int rc
21be0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
21bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
21c00 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 69  urn code */..  i
21c10 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c30 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72  * To iterate thr
21c40 6f 75 67 68 20 62 75 69 6c 74 69 6e 20 66 75 6e  ough builtin fun
21c50 63 74 69 6f 6e 73 20 2a 2f 0d 0a 0d 0a 20 20 66  ctions */....  f
21c60 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
21c70 54 45 5f 4f 4b 20 26 26 20 69 3c 41 72 72 61 79  TE_OK && i<Array
21c80 53 69 7a 65 28 61 42 75 69 6c 74 69 6e 29 3b 20  Size(aBuiltin); 
21c90 69 2b 2b 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20  i++){..    rc = 
21ca0 70 41 70 69 2d 3e 78 43 72 65 61 74 65 46 75 6e  pApi->xCreateFun
21cb0 63 74 69 6f 6e 28 70 41 70 69 2c 0d 0a 20 20 20  ction(pApi,..   
21cc0 20 20 20 20 20 61 42 75 69 6c 74 69 6e 5b 69 5d       aBuiltin[i]
21cd0 2e 7a 46 75 6e 63 2c 0d 0a 20 20 20 20 20 20 20  .zFunc,..       
21ce0 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 70 55 73   aBuiltin[i].pUs
21cf0 65 72 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  erData,..       
21d00 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 78 46 75   aBuiltin[i].xFu
21d10 6e 63 2c 0d 0a 20 20 20 20 20 20 20 20 61 42 75  nc,..        aBu
21d20 69 6c 74 69 6e 5b 69 5d 2e 78 44 65 73 74 72 6f  iltin[i].xDestro
21d30 79 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 7d 0d 0a  y..    );..  }..
21d40 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
21d50 7d 0d 0a 0d 0a 23 6c 69 6e 65 20 31 20 22 66 74  }....#line 1 "ft
21d60 73 35 5f 62 75 66 66 65 72 2e 63 22 0d 0a 2f 2a  s5_buffer.c"../*
21d70 0d 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33 31  ..** 2014 May 31
21d80 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74  ..**..** The aut
21d90 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
21da0 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
21db0 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
21dc0 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20   place of..** a 
21dd0 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
21de0 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
21df0 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79  :..**..**    May
21e00 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
21e10 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20   not evil...**  
21e20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
21e30 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
21e40 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
21e50 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20  ive others...** 
21e60 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
21e70 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
21e80 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
21e90 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a  you give...**..*
21ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a  *************..*
21ef0 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 20 23 69 6e 63  /......../* #inc
21f00 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68 22  lude "fts5Int.h"
21f10 20 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e   */....static in
21f20 74 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  t sqlite3Fts5Buf
21f30 66 65 72 53 69 7a 65 28 69 6e 74 20 2a 70 52 63  ferSize(int *pRc
21f40 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
21f50 75 66 2c 20 75 33 32 20 6e 42 79 74 65 29 7b 0d  uf, u32 nByte){.
21f60 0a 20 20 69 66 28 20 28 75 33 32 29 70 42 75 66  .  if( (u32)pBuf
21f70 2d 3e 6e 53 70 61 63 65 3c 6e 42 79 74 65 20 29  ->nSpace<nByte )
21f80 7b 0d 0a 20 20 20 20 75 36 34 20 6e 4e 65 77 20  {..    u64 nNew 
21f90 3d 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 3f  = pBuf->nSpace ?
21fa0 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 3a 20   pBuf->nSpace : 
21fb0 36 34 3b 0d 0a 20 20 20 20 75 38 20 2a 70 4e 65  64;..    u8 *pNe
21fc0 77 3b 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  w;..    while( n
21fd0 4e 65 77 3c 6e 42 79 74 65 20 29 7b 0d 0a 20 20  New<nByte ){..  
21fe0 20 20 20 20 6e 4e 65 77 20 3d 20 6e 4e 65 77 20      nNew = nNew 
21ff0 2a 20 32 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  * 2;..    }..   
22000 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
22010 72 65 61 6c 6c 6f 63 36 34 28 70 42 75 66 2d 3e  realloc64(pBuf->
22020 70 2c 20 6e 4e 65 77 29 3b 0d 0a 20 20 20 20 69  p, nNew);..    i
22030 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0d 0a 20  f( pNew==0 ){.. 
22040 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
22050 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20  TE_NOMEM;..     
22060 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20   return 1;..    
22070 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 42  }else{..      pB
22080 75 66 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65  uf->nSpace = nNe
22090 77 3b 0d 0a 20 20 20 20 20 20 70 42 75 66 2d 3e  w;..      pBuf->
220a0 70 20 3d 20 70 4e 65 77 3b 0d 0a 20 20 20 20 7d  p = pNew;..    }
220b0 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20  ..  }..  return 
220c0 30 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a  0;..}....../*..*
220d0 2a 20 45 6e 63 6f 64 65 20 76 61 6c 75 65 20 69  * Encode value i
220e0 56 61 6c 20 61 73 20 61 6e 20 53 51 4c 69 74 65  Val as an SQLite
220f0 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65   varint and appe
22100 6e 64 20 69 74 20 74 6f 20 74 68 65 20 62 75 66  nd it to the buf
22110 66 65 72 20 6f 62 6a 65 63 74 0d 0a 2a 2a 20 70  fer object..** p
22120 42 75 66 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  Buf. If an OOM e
22130 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
22140 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
22150 69 6e 20 70 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  in p...*/..stati
22160 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
22170 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
22180 72 69 6e 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  rint(int *pRc, F
22190 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
221a0 20 69 36 34 20 69 56 61 6c 29 7b 0d 0a 20 20 69   i64 iVal){..  i
221b0 66 28 20 66 74 73 35 42 75 66 66 65 72 47 72 6f  f( fts5BufferGro
221c0 77 28 70 52 63 2c 20 70 42 75 66 2c 20 39 29 20  w(pRc, pBuf, 9) 
221d0 29 20 72 65 74 75 72 6e 3b 0d 0a 20 20 70 42 75  ) return;..  pBu
221e0 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  f->n += sqlite3F
221f0 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts5PutVarint(&pB
22200 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
22210 69 56 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61  iVal);..}....sta
22220 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
22230 46 74 73 35 50 75 74 33 32 28 75 38 20 2a 61 42  Fts5Put32(u8 *aB
22240 75 66 2c 20 69 6e 74 20 69 56 61 6c 29 7b 0d 0a  uf, int iVal){..
22250 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69 56 61    aBuf[0] = (iVa
22260 6c 3e 3e 32 34 29 20 26 20 30 78 30 30 46 46 3b  l>>24) & 0x00FF;
22270 0d 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28 69  ..  aBuf[1] = (i
22280 56 61 6c 3e 3e 31 36 29 20 26 20 30 78 30 30 46  Val>>16) & 0x00F
22290 46 3b 0d 0a 20 20 61 42 75 66 5b 32 5d 20 3d 20  F;..  aBuf[2] = 
222a0 28 69 56 61 6c 3e 3e 20 38 29 20 26 20 30 78 30  (iVal>> 8) & 0x0
222b0 30 46 46 3b 0d 0a 20 20 61 42 75 66 5b 33 5d 20  0FF;..  aBuf[3] 
222c0 3d 20 28 69 56 61 6c 3e 3e 20 30 29 20 26 20 30  = (iVal>> 0) & 0
222d0 78 30 30 46 46 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61  x00FF;..}....sta
222e0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
222f0 74 73 35 47 65 74 33 32 28 63 6f 6e 73 74 20 75  ts5Get32(const u
22300 38 20 2a 61 42 75 66 29 7b 0d 0a 20 20 72 65 74  8 *aBuf){..  ret
22310 75 72 6e 20 28 69 6e 74 29 28 28 28 28 75 33 32  urn (int)((((u32
22320 29 61 42 75 66 5b 30 5d 29 3c 3c 32 34 29 20 2b  )aBuf[0])<<24) +
22330 20 28 61 42 75 66 5b 31 5d 3c 3c 31 36 29 20 2b   (aBuf[1]<<16) +
22340 20 28 61 42 75 66 5b 32 5d 3c 3c 38 29 20 2b 20   (aBuf[2]<<8) + 
22350 61 42 75 66 5b 33 5d 29 3b 0d 0a 7d 0d 0a 0d 0a  aBuf[3]);..}....
22360 2f 2a 0d 0a 2a 2a 20 41 70 70 65 6e 64 20 62 75  /*..** Append bu
22370 66 66 65 72 20 6e 44 61 74 61 2f 70 44 61 74 61  ffer nData/pData
22380 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
22390 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
223a0 20 6f 63 63 75 72 73 2c 20 73 65 74 20 0d 0a 2a   occurs, set ..*
223b0 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
223c0 20 69 6e 20 70 2e 20 49 66 20 61 6e 20 65 72 72   in p. If an err
223d0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
223e0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
223f0 73 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 69  s function..** i
22400 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
22410 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 73 74  a no-op...*/..st
22420 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
22430 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
22440 64 42 6c 6f 62 28 0d 0a 20 20 69 6e 74 20 2a 70  dBlob(..  int *p
22450 52 63 2c 0d 0a 20 20 46 74 73 35 42 75 66 66 65  Rc,..  Fts5Buffe
22460 72 20 2a 70 42 75 66 2c 20 0d 0a 20 20 75 33 32  r *pBuf, ..  u32
22470 20 6e 44 61 74 61 2c 20 0d 0a 20 20 63 6f 6e 73   nData, ..  cons
22480 74 20 75 38 20 2a 70 44 61 74 61 0d 0a 29 7b 0d  t u8 *pData..){.
22490 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 2a 70  .  assert_nc( *p
224a0 52 63 20 7c 7c 20 6e 44 61 74 61 3e 3d 30 20 29  Rc || nData>=0 )
224b0 3b 0d 0a 20 20 69 66 28 20 6e 44 61 74 61 20 29  ;..  if( nData )
224c0 7b 0d 0a 20 20 20 20 69 66 28 20 66 74 73 35 42  {..    if( fts5B
224d0 75 66 66 65 72 47 72 6f 77 28 70 52 63 2c 20 70  ufferGrow(pRc, p
224e0 42 75 66 2c 20 6e 44 61 74 61 29 20 29 20 72 65  Buf, nData) ) re
224f0 74 75 72 6e 3b 0d 0a 20 20 20 20 6d 65 6d 63 70  turn;..    memcp
22500 79 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  y(&pBuf->p[pBuf-
22510 3e 6e 5d 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  >n], pData, nDat
22520 61 29 3b 0d 0a 20 20 20 20 70 42 75 66 2d 3e 6e  a);..    pBuf->n
22530 20 2b 3d 20 6e 44 61 74 61 3b 0d 0a 20 20 7d 0d   += nData;..  }.
22540 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 70 70  .}..../*..** App
22550 65 6e 64 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  end the nul-term
22560 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 7a 53  inated string zS
22570 74 72 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  tr to the buffer
22580 20 70 42 75 66 2e 20 54 68 69 73 20 66 75 6e 63   pBuf. This func
22590 74 69 6f 6e 0d 0a 2a 2a 20 65 6e 73 75 72 65 73  tion..** ensures
225a0 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 66   that the byte f
225b0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 75 66  ollowing the buf
225c0 66 65 72 20 64 61 74 61 20 69 73 20 73 65 74 20  fer data is set 
225d0 74 6f 20 30 78 30 30 2c 20 65 76 65 6e 20 0d 0a  to 0x00, even ..
225e0 2a 2a 20 74 68 6f 75 67 68 20 74 68 69 73 20 62  ** though this b
225f0 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75  yte is not inclu
22600 64 65 64 20 69 6e 20 74 68 65 20 70 42 75 66 2d  ded in the pBuf-
22610 3e 6e 20 63 6f 75 6e 74 2e 0d 0a 2a 2f 0d 0a 73  >n count...*/..s
22620 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
22630 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
22640 6e 64 53 74 72 69 6e 67 28 0d 0a 20 20 69 6e 74  ndString(..  int
22650 20 2a 70 52 63 2c 0d 0a 20 20 46 74 73 35 42 75   *pRc,..  Fts5Bu
22660 66 66 65 72 20 2a 70 42 75 66 2c 20 0d 0a 20 20  ffer *pBuf, ..  
22670 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
22680 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 6e 53 74 72  ..){..  int nStr
22690 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
226a0 53 74 72 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33  Str);..  sqlite3
226b0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
226c0 42 6c 6f 62 28 70 52 63 2c 20 70 42 75 66 2c 20  Blob(pRc, pBuf, 
226d0 6e 53 74 72 2b 31 2c 20 28 63 6f 6e 73 74 20 75  nStr+1, (const u
226e0 38 2a 29 7a 53 74 72 29 3b 0d 0a 20 20 70 42 75  8*)zStr);..  pBu
226f0 66 2d 3e 6e 2d 2d 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  f->n--;..}..../*
22700 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46  ..** Argument zF
22710 6d 74 20 69 73 20 61 20 70 72 69 6e 74 66 28 29  mt is a printf()
22720 20 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74   style format st
22730 72 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ring. This funct
22740 69 6f 6e 20 70 65 72 66 6f 72 6d 73 0d 0a 2a 2a  ion performs..**
22750 20 74 68 65 20 70 72 69 6e 74 66 28 29 20 73 74   the printf() st
22760 79 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 2c 20  yle processing, 
22770 74 68 65 6e 20 61 70 70 65 6e 64 73 20 74 68 65  then appends the
22780 20 72 65 73 75 6c 74 73 20 74 6f 20 62 75 66 66   results to buff
22790 65 72 20 70 42 75 66 2e 0d 0a 2a 2a 0d 0a 2a 2a  er pBuf...**..**
227a0 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 46 74 73   Like sqlite3Fts
227b0 35 42 75 66 66 65 72 41 70 70 65 6e 64 53 74 72  5BufferAppendStr
227c0 69 6e 67 28 29 2c 20 74 68 69 73 20 66 75 6e 63  ing(), this func
227d0 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74 68 61  tion ensures tha
227e0 74 20 74 68 65 20 62 79 74 65 20 0d 0a 2a 2a 20  t the byte ..** 
227f0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 75  following the bu
22800 66 66 65 72 20 64 61 74 61 20 69 73 20 73 65 74  ffer data is set
22810 20 74 6f 20 30 78 30 30 2c 20 65 76 65 6e 20 74   to 0x00, even t
22820 68 6f 75 67 68 20 74 68 69 73 20 62 79 74 65 20  hough this byte 
22830 69 73 20 6e 6f 74 0d 0a 2a 2a 20 69 6e 63 6c 75  is not..** inclu
22840 64 65 64 20 69 6e 20 74 68 65 20 70 42 75 66 2d  ded in the pBuf-
22850 3e 6e 20 63 6f 75 6e 74 2e 0d 0a 2a 2f 20 0d 0a  >n count...*/ ..
22860 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
22870 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
22880 65 6e 64 50 72 69 6e 74 66 28 0d 0a 20 20 69 6e  endPrintf(..  in
22890 74 20 2a 70 52 63 2c 0d 0a 20 20 46 74 73 35 42  t *pRc,..  Fts5B
228a0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0d 0a 20  uffer *pBuf, .. 
228b0 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
228c0 0d 0a 29 7b 0d 0a 20 20 69 66 28 20 2a 70 52 63  ..){..  if( *pRc
228d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
228e0 20 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0d      char *zTmp;.
228f0 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  .    va_list ap;
22900 0d 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ..    va_start(a
22910 70 2c 20 7a 46 6d 74 29 3b 0d 0a 20 20 20 20 7a  p, zFmt);..    z
22920 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Tmp = sqlite3_vm
22930 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
22940 3b 0d 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  ;..    va_end(ap
22950 29 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 7a 54  );....    if( zT
22960 6d 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  mp==0 ){..      
22970 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
22980 4d 45 4d 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b  MEM;..    }else{
22990 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
229a0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 53  ts5BufferAppendS
229b0 74 72 69 6e 67 28 70 52 63 2c 20 70 42 75 66 2c  tring(pRc, pBuf,
229c0 20 7a 54 6d 70 29 3b 0d 0a 20 20 20 20 20 20 73   zTmp);..      s
229d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
229e0 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  );..    }..  }..
229f0 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 63 68 61 72  }....static char
22a00 20 2a 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72   *sqlite3Fts5Mpr
22a10 69 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20 63  intf(int *pRc, c
22a20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
22a30 20 2e 2e 2e 29 7b 0d 0a 20 20 63 68 61 72 20 2a   ...){..  char *
22a40 7a 52 65 74 20 3d 20 30 3b 0d 0a 20 20 69 66 28  zRet = 0;..  if(
22a50 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
22a60 20 29 7b 0d 0a 20 20 20 20 76 61 5f 6c 69 73 74   ){..    va_list
22a70 20 61 70 3b 0d 0a 20 20 20 20 76 61 5f 73 74 61   ap;..    va_sta
22a80 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0d 0a 20  rt(ap, zFmt);.. 
22a90 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65     zRet = sqlite
22aa0 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
22ab0 20 61 70 29 3b 0d 0a 20 20 20 20 76 61 5f 65 6e   ap);..    va_en
22ac0 64 28 61 70 29 3b 0d 0a 20 20 20 20 69 66 28 20  d(ap);..    if( 
22ad0 7a 52 65 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  zRet==0 ){..    
22ae0 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
22af0 4e 4f 4d 45 4d 3b 20 0d 0a 20 20 20 20 7d 0d 0a  NOMEM; ..    }..
22b00 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 7a 52    }..  return zR
22b10 65 74 3b 0d 0a 7d 0d 0a 20 0d 0a 0d 0a 2f 2a 0d  et;..}.. ..../*.
22b20 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 62 75 66  .** Free any buf
22b30 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
22b40 20 70 42 75 66 2e 20 5a 65 72 6f 20 74 68 65 20   pBuf. Zero the 
22b50 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
22b60 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2f 0d   returning...*/.
22b70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
22b80 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
22b90 65 65 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  ee(Fts5Buffer *p
22ba0 42 75 66 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33  Buf){..  sqlite3
22bb0 5f 66 72 65 65 28 70 42 75 66 2d 3e 70 29 3b 0d  _free(pBuf->p);.
22bc0 0a 20 20 6d 65 6d 73 65 74 28 70 42 75 66 2c 20  .  memset(pBuf, 
22bd0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
22be0 66 66 65 72 29 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  ffer));..}..../*
22bf0 0d 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f  ..** Zero the co
22c00 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75  ntents of the bu
22c10 66 66 65 72 20 6f 62 6a 65 63 74 2e 20 42 75 74  ffer object. But
22c20 20 64 6f 20 6e 6f 74 20 66 72 65 65 20 74 68 65   do not free the
22c30 20 61 73 73 6f 63 69 61 74 65 64 20 0d 0a 2a 2a   associated ..**
22c40 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
22c50 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  on...*/..static 
22c60 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
22c70 42 75 66 66 65 72 5a 65 72 6f 28 46 74 73 35 42  BufferZero(Fts5B
22c80 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0d 0a 20  uffer *pBuf){.. 
22c90 20 70 42 75 66 2d 3e 6e 20 3d 20 30 3b 0d 0a 7d   pBuf->n = 0;..}
22ca0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74  ..../*..** Set t
22cb0 68 65 20 62 75 66 66 65 72 20 74 6f 20 63 6f 6e  he buffer to con
22cc0 74 61 69 6e 20 6e 44 61 74 61 2f 70 44 61 74 61  tain nData/pData
22cd0 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
22ce0 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
22cf0 61 6e 0d 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  an..** the error
22d00 20 63 6f 64 65 20 69 6e 20 70 2e 20 49 66 20 61   code in p. If a
22d10 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
22d20 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
22d30 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0d  n this function.
22d40 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  .** is called, i
22d50 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a  t is a no-op...*
22d60 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  /..static void s
22d70 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
22d80 53 65 74 28 0d 0a 20 20 69 6e 74 20 2a 70 52 63  Set(..  int *pRc
22d90 2c 0d 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ,..  Fts5Buffer 
22da0 2a 70 42 75 66 2c 20 0d 0a 20 20 69 6e 74 20 6e  *pBuf, ..  int n
22db0 44 61 74 61 2c 20 0d 0a 20 20 63 6f 6e 73 74 20  Data, ..  const 
22dc0 75 38 20 2a 70 44 61 74 61 0d 0a 29 7b 0d 0a 20  u8 *pData..){.. 
22dd0 20 70 42 75 66 2d 3e 6e 20 3d 20 30 3b 0d 0a 20   pBuf->n = 0;.. 
22de0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
22df0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63  erAppendBlob(pRc
22e00 2c 20 70 42 75 66 2c 20 6e 44 61 74 61 2c 20 70  , pBuf, nData, p
22e10 44 61 74 61 29 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61  Data);..}....sta
22e20 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
22e30 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
22e40 28 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  (..  const u8 *a
22e50 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20  , int n,        
22e60 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
22e70 6f 6e 74 61 69 6e 69 6e 67 20 70 6f 73 6c 69 73  ontaining poslis
22e80 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 69 2c  t */..  int *pi,
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
22eb0 54 3a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e  T: Offset within
22ec0 20 61 5b 5d 20 2a 2f 0d 0a 20 20 69 36 34 20 2a   a[] */..  i64 *
22ed0 70 69 4f 66 66 20 20 20 20 20 20 20 20 20 20 20  piOff           
22ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
22ef0 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 6f 66  /OUT: Current of
22f00 66 73 65 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69  fset */..){..  i
22f10 6e 74 20 69 20 3d 20 2a 70 69 3b 0d 0a 20 20 69  nt i = *pi;..  i
22f20 66 28 20 69 3e 3d 6e 20 29 7b 0d 0a 20 20 20 20  f( i>=n ){..    
22f30 2f 2a 20 45 4f 46 20 2a 2f 0d 0a 20 20 20 20 2a  /* EOF */..    *
22f40 70 69 4f 66 66 20 3d 20 2d 31 3b 0d 0a 20 20 20  piOff = -1;..   
22f50 20 72 65 74 75 72 6e 20 31 3b 20 20 0d 0a 20 20   return 1;  ..  
22f60 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69 36 34 20  }else{..    i64 
22f70 69 4f 66 66 20 3d 20 2a 70 69 4f 66 66 3b 0d 0a  iOff = *piOff;..
22f80 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0d 0a 20      int iVal;.. 
22f90 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
22fa0 72 69 6e 74 33 32 28 61 2c 20 69 2c 20 69 56 61  rint32(a, i, iVa
22fb0 6c 29 3b 0d 0a 20 20 20 20 69 66 28 20 69 56 61  l);..    if( iVa
22fc0 6c 3d 3d 31 20 29 7b 0d 0a 20 20 20 20 20 20 66  l==1 ){..      f
22fd0 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
22fe0 33 32 28 61 2c 20 69 2c 20 69 56 61 6c 29 3b 0d  32(a, i, iVal);.
22ff0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 28 28  .      iOff = ((
23000 69 36 34 29 69 56 61 6c 29 20 3c 3c 20 33 32 3b  i64)iVal) << 32;
23010 0d 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74  ..      fts5Fast
23020 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
23030 2c 20 69 56 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d  , iVal);..    }.
23040 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 69 4f  .    *piOff = iO
23050 66 66 20 2b 20 28 28 69 56 61 6c 2d 32 29 20 26  ff + ((iVal-2) &
23060 20 30 78 37 46 46 46 46 46 46 46 29 3b 0d 0a 20   0x7FFFFFFF);.. 
23070 20 20 20 2a 70 69 20 3d 20 69 3b 0d 0a 20 20 20     *pi = i;..   
23080 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d   return 0;..  }.
23090 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41  .}....../*..** A
230a0 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
230b0 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
230c0 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
230d0 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  gument. Return t
230e0 72 75 65 0d 0a 2a 2a 20 69 66 20 74 68 65 20 69  rue..** if the i
230f0 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
23100 45 4f 46 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  EOF, or false ot
23110 68 65 72 77 69 73 65 2e 0d 0a 2a 2f 0d 0a 73 74  herwise...*/..st
23120 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
23130 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
23140 72 4e 65 78 74 28 46 74 73 35 50 6f 73 6c 69 73  rNext(Fts5Poslis
23150 74 52 65 61 64 65 72 20 2a 70 49 74 65 72 29 7b  tReader *pIter){
23160 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ..  if( sqlite3F
23170 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
23180 28 70 49 74 65 72 2d 3e 61 2c 20 70 49 74 65 72  (pIter->a, pIter
23190 2d 3e 6e 2c 20 26 70 49 74 65 72 2d 3e 69 2c 20  ->n, &pIter->i, 
231a0 26 70 49 74 65 72 2d 3e 69 50 6f 73 29 20 29 7b  &pIter->iPos) ){
231b0 0d 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f  ..    pIter->bEo
231c0 66 20 3d 20 31 3b 0d 0a 20 20 7d 0d 0a 20 20 72  f = 1;..  }..  r
231d0 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f  eturn pIter->bEo
231e0 66 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20  f;..}....static 
231f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
23200 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
23210 28 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  (..  const u8 *a
23220 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20  , int n,        
23230 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20       /* Poslist 
23240 62 75 66 66 65 72 20 74 6f 20 69 74 65 72 61 74  buffer to iterat
23250 65 20 74 68 72 6f 75 67 68 20 2a 2f 0d 0a 20 20  e through */..  
23260 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
23270 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
23280 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65  /* Iterator obje
23290 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ct to initialize
232a0 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 6d 65 6d 73 65   */..){..  memse
232b0 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
232c0 6f 66 28 2a 70 49 74 65 72 29 29 3b 0d 0a 20 20  of(*pIter));..  
232d0 70 49 74 65 72 2d 3e 61 20 3d 20 61 3b 0d 0a 20  pIter->a = a;.. 
232e0 20 70 49 74 65 72 2d 3e 6e 20 3d 20 6e 3b 0d 0a   pIter->n = n;..
232f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
23300 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 70  listReaderNext(p
23310 49 74 65 72 29 3b 0d 0a 20 20 72 65 74 75 72 6e  Iter);..  return
23320 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0d 0a 7d   pIter->bEof;..}
23330 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 70 70 65 6e  ..../*..** Appen
23340 64 20 70 6f 73 69 74 69 6f 6e 20 69 50 6f 73 20  d position iPos 
23350 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
23360 6c 69 73 74 20 62 65 69 6e 67 20 61 63 63 75 6d  list being accum
23370 75 6c 61 74 65 64 20 69 6e 20 62 75 66 66 65 72  ulated in buffer
23380 0d 0a 2a 2a 20 70 42 75 66 2c 20 77 68 69 63 68  ..** pBuf, which
23390 20 6d 75 73 74 20 62 65 20 61 6c 72 65 61 64 79   must be already
233a0 20 62 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   be large enough
233b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
233c0 20 64 61 74 61 2e 0d 0a 2a 2a 20 54 68 65 20 70   data...** The p
233d0 72 65 76 69 6f 75 73 20 70 6f 73 69 74 69 6f 6e  revious position
233e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
233f0 20 6c 69 73 74 20 69 73 20 2a 70 69 50 72 65 76   list is *piPrev
23400 2e 20 2a 70 69 50 72 65 76 20 69 73 20 73 65 74  . *piPrev is set
23410 0d 0a 2a 2a 20 74 6f 20 69 50 6f 73 20 62 65 66  ..** to iPos bef
23420 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a  ore returning...
23430 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
23440 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
23450 73 74 53 61 66 65 41 70 70 65 6e 64 28 0d 0a 20  stSafeAppend(.. 
23460 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
23470 66 2c 20 0d 0a 20 20 69 36 34 20 2a 70 69 50 72  f, ..  i64 *piPr
23480 65 76 2c 20 0d 0a 20 20 69 36 34 20 69 50 6f 73  ev, ..  i64 iPos
23490 0d 0a 29 7b 0d 0a 20 20 73 74 61 74 69 63 20 63  ..){..  static c
234a0 6f 6e 73 74 20 69 36 34 20 63 6f 6c 6d 61 73 6b  onst i64 colmask
234b0 20 3d 20 28 28 69 36 34 29 28 30 78 37 46 46 46   = ((i64)(0x7FFF
234c0 46 46 46 46 29 29 20 3c 3c 20 33 32 3b 0d 0a 20  FFFF)) << 32;.. 
234d0 20 69 66 28 20 28 69 50 6f 73 20 26 20 63 6f 6c   if( (iPos & col
234e0 6d 61 73 6b 29 20 21 3d 20 28 2a 70 69 50 72 65  mask) != (*piPre
234f0 76 20 26 20 63 6f 6c 6d 61 73 6b 29 20 29 7b 0d  v & colmask) ){.
23500 0a 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75  .    pBuf->p[pBu
23510 66 2d 3e 6e 2b 2b 5d 20 3d 20 31 3b 0d 0a 20 20  f->n++] = 1;..  
23520 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c    pBuf->n += sql
23530 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e  ite3Fts5PutVarin
23540 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  t(&pBuf->p[pBuf-
23550 3e 6e 5d 2c 20 28 69 50 6f 73 3e 3e 33 32 29 29  >n], (iPos>>32))
23560 3b 0d 0a 20 20 20 20 2a 70 69 50 72 65 76 20 3d  ;..    *piPrev =
23570 20 28 69 50 6f 73 20 26 20 63 6f 6c 6d 61 73 6b   (iPos & colmask
23580 29 3b 0d 0a 20 20 7d 0d 0a 20 20 70 42 75 66 2d  );..  }..  pBuf-
23590 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
235a0 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66  5PutVarint(&pBuf
235b0 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 28 69  ->p[pBuf->n], (i
235c0 50 6f 73 2d 2a 70 69 50 72 65 76 29 2b 32 29 3b  Pos-*piPrev)+2);
235d0 0d 0a 20 20 2a 70 69 50 72 65 76 20 3d 20 69 50  ..  *piPrev = iP
235e0 6f 73 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63  os;..}....static
235f0 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
23600 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
23610 65 6e 64 28 0d 0a 20 20 46 74 73 35 42 75 66 66  end(..  Fts5Buff
23620 65 72 20 2a 70 42 75 66 2c 20 0d 0a 20 20 46 74  er *pBuf, ..  Ft
23630 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20  s5PoslistWriter 
23640 2a 70 57 72 69 74 65 72 2c 0d 0a 20 20 69 36 34  *pWriter,..  i64
23650 20 69 50 6f 73 0d 0a 29 7b 0d 0a 20 20 69 6e 74   iPos..){..  int
23660 20 72 63 20 3d 20 30 3b 20 20 20 2f 2a 20 49 6e   rc = 0;   /* In
23670 69 74 69 61 6c 69 7a 65 64 20 6f 6e 6c 79 20 74  itialized only t
23680 6f 20 73 75 70 70 72 65 73 73 20 65 72 72 6f 6e  o suppress erron
23690 65 6f 75 73 20 77 61 72 6e 69 6e 67 20 66 72 6f  eous warning fro
236a0 6d 20 43 6c 61 6e 67 20 2a 2f 0d 0a 20 20 69 66  m Clang */..  if
236b0 28 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77  ( fts5BufferGrow
236c0 28 26 72 63 2c 20 70 42 75 66 2c 20 35 2b 35 2b  (&rc, pBuf, 5+5+
236d0 35 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d  5) ) return rc;.
236e0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  .  sqlite3Fts5Po
236f0 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
23700 70 42 75 66 2c 20 26 70 57 72 69 74 65 72 2d 3e  pBuf, &pWriter->
23710 69 50 72 65 76 2c 20 69 50 6f 73 29 3b 0d 0a 20  iPrev, iPos);.. 
23720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23730 4b 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20  K;..}....static 
23740 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 46 74 73  void *sqlite3Fts
23750 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74 20  5MallocZero(int 
23760 2a 70 52 63 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *pRc, sqlite3_in
23770 74 36 34 20 6e 42 79 74 65 29 7b 0d 0a 20 20 76  t64 nByte){..  v
23780 6f 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0d 0a  oid *pRet = 0;..
23790 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
237a0 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 52  TE_OK ){..    pR
237b0 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  et = sqlite3_mal
237c0 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0d 0a 20  loc64(nByte);.. 
237d0 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29     if( pRet==0 )
237e0 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79  {..      if( nBy
237f0 74 65 3e 30 20 29 20 2a 70 52 63 20 3d 20 53 51  te>0 ) *pRc = SQ
23800 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20  LITE_NOMEM;..   
23810 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 6d   }else{..      m
23820 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e  emset(pRet, 0, n
23830 42 79 74 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20  Byte);..    }.. 
23840 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
23850 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  t;..}..../*..** 
23860 52 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72  Return a nul-ter
23870 6d 69 6e 61 74 65 64 20 63 6f 70 79 20 6f 66 20  minated copy of 
23880 74 68 65 20 73 74 72 69 6e 67 20 69 6e 64 69 63  the string indic
23890 61 74 65 64 20 62 79 20 70 49 6e 2e 20 49 66 20  ated by pIn. If 
238a0 6e 49 6e 0d 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 6e  nIn..** is non-n
238b0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
238c0 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   is the length o
238d0 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20  f the string in 
238e0 62 79 74 65 73 2e 20 4f 74 68 65 72 77 69 73 65  bytes. Otherwise
238f0 2c 0d 0a 2a 2a 20 74 68 65 20 6c 65 6e 67 74 68  ,..** the length
23900 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 69   of the string i
23910 73 20 64 65 74 65 72 6d 69 6e 65 64 20 75 73 69  s determined usi
23920 6e 67 20 73 74 72 6c 65 6e 28 29 2e 0d 0a 2a 2a  ng strlen()...**
23930 0d 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
23940 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
23950 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
23960 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
23970 68 65 20 72 65 74 75 72 6e 65 64 0d 0a 2a 2a 20  he returned..** 
23980 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
23990 69 74 65 33 5f 66 72 65 65 28 29 2e 20 49 66 20  ite3_free(). If 
239a0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
239b0 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
239c0 75 72 6e 65 64 2e 20 0d 0a 2a 2f 0d 0a 73 74 61  urned. ..*/..sta
239d0 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65  tic char *sqlite
239e0 33 46 74 73 35 53 74 72 6e 64 75 70 28 69 6e 74  3Fts5Strndup(int
239f0 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61   *pRc, const cha
23a00 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29  r *pIn, int nIn)
23a10 7b 0d 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  {..  char *zRet 
23a20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 2a 70 52 63  = 0;..  if( *pRc
23a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
23a40 20 20 20 20 69 66 28 20 6e 49 6e 3c 30 20 29 7b      if( nIn<0 ){
23a50 0d 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 28 69  ..      nIn = (i
23a60 6e 74 29 73 74 72 6c 65 6e 28 70 49 6e 29 3b 0d  nt)strlen(pIn);.
23a70 0a 20 20 20 20 7d 0d 0a 20 20 20 20 7a 52 65 74  .    }..    zRet
23a80 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
23a90 33 5f 6d 61 6c 6c 6f 63 28 6e 49 6e 2b 31 29 3b  3_malloc(nIn+1);
23aa0 0d 0a 20 20 20 20 69 66 28 20 7a 52 65 74 20 29  ..    if( zRet )
23ab0 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  {..      memcpy(
23ac0 7a 52 65 74 2c 20 70 49 6e 2c 20 6e 49 6e 29 3b  zRet, pIn, nIn);
23ad0 0d 0a 20 20 20 20 20 20 7a 52 65 74 5b 6e 49 6e  ..      zRet[nIn
23ae0 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20 20 20 20 7d  ] = '\0';..    }
23af0 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 2a 70 52  else{..      *pR
23b00 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23b10 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20  ;..    }..  }.. 
23b20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0d 0a 7d   return zRet;..}
23b30 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74  ....../*..** Ret
23b40 75 72 6e 20 74 72 75 65 20 69 66 20 63 68 61 72  urn true if char
23b50 61 63 74 65 72 20 27 74 27 20 6d 61 79 20 62 65  acter 't' may be
23b60 20 70 61 72 74 20 6f 66 20 61 6e 20 46 54 53 35   part of an FTS5
23b70 20 62 61 72 65 77 6f 72 64 2c 20 6f 72 20 66 61   bareword, or fa
23b80 6c 73 65 0d 0a 2a 2a 20 6f 74 68 65 72 77 69 73  lse..** otherwis
23b90 65 2e 20 43 68 61 72 61 63 74 65 72 73 20 74 68  e. Characters th
23ba0 61 74 20 6d 61 79 20 62 65 20 70 61 72 74 20 6f  at may be part o
23bb0 66 20 62 61 72 65 77 6f 72 64 73 3a 0d 0a 2a 2a  f barewords:..**
23bc0 0d 0a 2a 2a 20 20 20 2a 20 41 6c 6c 20 6e 6f 6e  ..**   * All non
23bd0 2d 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72  -ASCII character
23be0 73 2c 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20 35  s,..**   * The 5
23bf0 32 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  2 upper and lowe
23c00 72 20 63 61 73 65 20 41 53 43 49 49 20 63 68 61  r case ASCII cha
23c10 72 61 63 74 65 72 73 2c 20 61 6e 64 0d 0a 2a 2a  racters, and..**
23c20 20 20 20 2a 20 54 68 65 20 31 30 20 69 6e 74 65     * The 10 inte
23c30 67 65 72 20 41 53 43 49 49 20 63 68 61 72 61 63  ger ASCII charac
23c40 74 65 72 73 2e 0d 0a 2a 2a 20 20 20 2a 20 54 68  ters...**   * Th
23c50 65 20 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61  e underscore cha
23c60 72 61 63 74 65 72 20 22 5f 22 20 28 30 78 35 46  racter "_" (0x5F
23c70 29 2e 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20 75  )...**   * The u
23c80 6e 69 63 6f 64 65 20 22 73 75 62 73 69 74 75 74  nicode "subsitut
23c90 65 22 20 63 68 61 72 61 63 74 65 72 20 28 30 78  e" character (0x
23ca0 31 41 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  1A)...*/..static
23cb0 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
23cc0 49 73 42 61 72 65 77 6f 72 64 28 63 68 61 72 20  IsBareword(char 
23cd0 74 29 7b 0d 0a 20 20 75 38 20 61 42 61 72 65 77  t){..  u8 aBarew
23ce0 6f 72 64 5b 31 32 38 5d 20 3d 20 7b 0d 0a 20 20  ord[128] = {..  
23cf0 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
23d00 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 30 2c 20   0, 0, 0,    0, 
23d10 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
23d20 2c 20 30 2c 20 20 20 2f 2a 20 30 78 30 30 20 2e  , 0,   /* 0x00 .
23d30 2e 20 30 78 30 46 20 2a 2f 0d 0a 20 20 20 20 30  . 0x0F */..    0
23d40 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
23d50 20 30 2c 20 30 2c 20 20 20 20 30 2c 20 30 2c 20   0, 0,    0, 0, 
23d60 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  1, 0, 0, 0, 0, 0
23d70 2c 20 20 20 2f 2a 20 30 78 31 30 20 2e 2e 20 30  ,   /* 0x10 .. 0
23d80 78 31 46 20 2a 2f 0d 0a 20 20 20 20 30 2c 20 30  x1F */..    0, 0
23d90 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
23da0 20 30 2c 20 20 20 20 30 2c 20 30 2c 20 30 2c 20   0,    0, 0, 0, 
23db0 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
23dc0 20 2f 2a 20 30 78 32 30 20 2e 2e 20 30 78 32 46   /* 0x20 .. 0x2F
23dd0 20 2a 2f 0d 0a 20 20 20 20 31 2c 20 31 2c 20 31   */..    1, 1, 1
23de0 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
23df0 20 20 20 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20      1, 1, 0, 0, 
23e00 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a  0, 0, 0, 0,   /*
23e10 20 30 78 33 30 20 2e 2e 20 30 78 33 46 20 2a 2f   0x30 .. 0x3F */
23e20 0d 0a 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 31  ..    0, 1, 1, 1
23e30 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
23e40 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
23e50 31 2c 20 31 2c 20 31 2c 20 20 20 2f 2a 20 30 78  1, 1, 1,   /* 0x
23e60 34 30 20 2e 2e 20 30 78 34 46 20 2a 2f 0d 0a 20  40 .. 0x4F */.. 
23e70 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
23e80 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 20 31 2c  , 1, 1, 1,    1,
23e90 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20   1, 1, 0, 0, 0, 
23ea0 30 2c 20 31 2c 20 20 20 2f 2a 20 30 78 35 30 20  0, 1,   /* 0x50 
23eb0 2e 2e 20 30 78 35 46 20 2a 2f 0d 0a 20 20 20 20  .. 0x5F */..    
23ec0 30 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  0, 1, 1, 1, 1, 1
23ed0 2c 20 31 2c 20 31 2c 20 20 20 20 31 2c 20 31 2c  , 1, 1,    1, 1,
23ee0 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
23ef0 31 2c 20 20 20 2f 2a 20 30 78 36 30 20 2e 2e 20  1,   /* 0x60 .. 
23f00 30 78 36 46 20 2a 2f 0d 0a 20 20 20 20 31 2c 20  0x6F */..    1, 
23f10 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
23f20 2c 20 31 2c 20 20 20 20 31 2c 20 31 2c 20 31 2c  , 1,    1, 1, 1,
23f30 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 20   0, 0, 0, 0, 0  
23f40 20 20 2f 2a 20 30 78 37 30 20 2e 2e 20 30 78 37    /* 0x70 .. 0x7
23f50 46 20 2a 2f 0d 0a 20 20 7d 3b 0d 0a 0d 0a 20 20  F */..  };....  
23f60 72 65 74 75 72 6e 20 28 74 20 26 20 30 78 38 30  return (t & 0x80
23f70 29 20 7c 7c 20 61 42 61 72 65 77 6f 72 64 5b 28  ) || aBareword[(
23f80 69 6e 74 29 74 5d 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a  int)t];..}......
23f90 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
23fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2f 0d 0a  **********..*/..
23fe0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
23ff0 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20  ts5TermsetEntry 
24000 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79  Fts5TermsetEntry
24010 3b 0d 0a 73 74 72 75 63 74 20 46 74 73 35 54 65  ;..struct Fts5Te
24020 72 6d 73 65 74 45 6e 74 72 79 20 7b 0d 0a 20 20  rmsetEntry {..  
24030 63 68 61 72 20 2a 70 54 65 72 6d 3b 0d 0a 20 20  char *pTerm;..  
24040 69 6e 74 20 6e 54 65 72 6d 3b 0d 0a 20 20 69 6e  int nTerm;..  in
24050 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24070 20 49 6e 64 65 78 20 28 6d 61 69 6e 20 6f 72 20   Index (main or 
24080 61 50 72 65 66 69 78 5b 5d 20 65 6e 74 72 79 29  aPrefix[] entry)
24090 20 2a 2f 0d 0a 20 20 46 74 73 35 54 65 72 6d 73   */..  Fts5Terms
240a0 65 74 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b 0d  etEntry *pNext;.
240b0 0a 7d 3b 0d 0a 0d 0a 73 74 72 75 63 74 20 46 74  .};....struct Ft
240c0 73 35 54 65 72 6d 73 65 74 20 7b 0d 0a 20 20 46  s5Termset {..  F
240d0 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20  ts5TermsetEntry 
240e0 2a 61 70 48 61 73 68 5b 35 31 32 5d 3b 0d 0a 7d  *apHash[512];..}
240f0 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  ;....static int 
24100 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d 73  sqlite3Fts5Terms
24110 65 74 4e 65 77 28 46 74 73 35 54 65 72 6d 73 65  etNew(Fts5Termse
24120 74 20 2a 2a 70 70 29 7b 0d 0a 20 20 69 6e 74 20  t **pp){..  int 
24130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d  rc = SQLITE_OK;.
24140 0a 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33  .  *pp = sqlite3
24150 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
24160 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 54  rc, sizeof(Fts5T
24170 65 72 6d 73 65 74 29 29 3b 0d 0a 20 20 72 65 74  ermset));..  ret
24180 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73 74  urn rc;..}....st
24190 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
241a0 46 74 73 35 54 65 72 6d 73 65 74 41 64 64 28 0d  Fts5TermsetAdd(.
241b0 0a 20 20 46 74 73 35 54 65 72 6d 73 65 74 20 2a  .  Fts5Termset *
241c0 70 2c 20 0d 0a 20 20 69 6e 74 20 69 49 64 78 2c  p, ..  int iIdx,
241d0 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
241e0 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
241f0 2c 20 0d 0a 20 20 69 6e 74 20 2a 70 62 50 72 65  , ..  int *pbPre
24200 73 65 6e 74 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  sent..){..  int 
24210 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d  rc = SQLITE_OK;.
24220 0a 20 20 2a 70 62 50 72 65 73 65 6e 74 20 3d 20  .  *pbPresent = 
24230 30 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a  0;..  if( p ){..
24240 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20      int i;..    
24250 75 33 32 20 68 61 73 68 20 3d 20 31 33 3b 0d 0a  u32 hash = 13;..
24260 20 20 20 20 46 74 73 35 54 65 72 6d 73 65 74 45      Fts5TermsetE
24270 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b 0d 0a 0d  ntry *pEntry;...
24280 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  .    /* Calculat
24290 65 20 61 20 68 61 73 68 20 76 61 6c 75 65 20 66  e a hash value f
242a0 6f 72 20 74 68 69 73 20 74 65 72 6d 2e 20 54 68  or this term. Th
242b0 69 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 68  is is the same h
242c0 61 73 68 20 63 68 65 63 6b 73 75 6d 0d 0a 20 20  ash checksum..  
242d0 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
242e0 20 66 74 73 35 5f 68 61 73 68 2e 63 20 6d 6f 64   fts5_hash.c mod
242f0 75 6c 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ule. This is not
24300 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 63   important for c
24310 6f 72 72 65 63 74 0d 0a 20 20 20 20 2a 2a 20 6f  orrect..    ** o
24320 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
24330 6d 6f 64 75 6c 65 2c 20 62 75 74 20 69 73 20 6e  module, but is n
24340 65 63 65 73 73 61 72 79 20 74 6f 20 65 6e 73 75  ecessary to ensu
24350 72 65 20 74 68 61 74 20 73 6f 6d 65 20 74 65 73  re that some tes
24360 74 73 0d 0a 20 20 20 20 2a 2a 20 64 65 73 69 67  ts..    ** desig
24370 6e 65 64 20 74 6f 20 70 72 6f 64 75 63 65 20 68  ned to produce h
24380 61 73 68 20 74 61 62 6c 65 20 63 6f 6c 6c 69 73  ash table collis
24390 69 6f 6e 73 20 72 65 61 6c 6c 79 20 64 6f 20 77  ions really do w
243a0 6f 72 6b 2e 20 20 2a 2f 0d 0a 20 20 20 20 66 6f  ork.  */..    fo
243b0 72 28 69 3d 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  r(i=nTerm-1; i>=
243c0 30 3b 20 69 2d 2d 29 7b 0d 0a 20 20 20 20 20 20  0; i--){..      
243d0 68 61 73 68 20 3d 20 28 68 61 73 68 20 3c 3c 20  hash = (hash << 
243e0 33 29 20 5e 20 68 61 73 68 20 5e 20 70 54 65 72  3) ^ hash ^ pTer
243f0 6d 5b 69 5d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  m[i];..    }..  
24400 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 3c    hash = (hash <
24410 3c 20 33 29 20 5e 20 68 61 73 68 20 5e 20 69 49  < 3) ^ hash ^ iI
24420 64 78 3b 0d 0a 20 20 20 20 68 61 73 68 20 3d 20  dx;..    hash = 
24430 68 61 73 68 20 25 20 41 72 72 61 79 53 69 7a 65  hash % ArraySize
24440 28 70 2d 3e 61 70 48 61 73 68 29 3b 0d 0a 0d 0a  (p->apHash);....
24450 20 20 20 20 66 6f 72 28 70 45 6e 74 72 79 3d 70      for(pEntry=p
24460 2d 3e 61 70 48 61 73 68 5b 68 61 73 68 5d 3b 20  ->apHash[hash]; 
24470 70 45 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d 70  pEntry; pEntry=p
24480 45 6e 74 72 79 2d 3e 70 4e 65 78 74 29 7b 0d 0a  Entry->pNext){..
24490 20 20 20 20 20 20 69 66 28 20 70 45 6e 74 72 79        if( pEntry
244a0 2d 3e 69 49 64 78 3d 3d 69 49 64 78 20 0d 0a 20  ->iIdx==iIdx .. 
244b0 20 20 20 20 20 20 20 20 20 26 26 20 70 45 6e 74           && pEnt
244c0 72 79 2d 3e 6e 54 65 72 6d 3d 3d 6e 54 65 72 6d  ry->nTerm==nTerm
244d0 20 0d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20   ..          && 
244e0 6d 65 6d 63 6d 70 28 70 45 6e 74 72 79 2d 3e 70  memcmp(pEntry->p
244f0 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  Term, pTerm, nTe
24500 72 6d 29 3d 3d 30 20 0d 0a 20 20 20 20 20 20 29  rm)==0 ..      )
24510 7b 0d 0a 20 20 20 20 20 20 20 20 2a 70 62 50 72  {..        *pbPr
24520 65 73 65 6e 74 20 3d 20 31 3b 0d 0a 20 20 20 20  esent = 1;..    
24530 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
24540 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
24550 20 20 69 66 28 20 70 45 6e 74 72 79 3d 3d 30 20    if( pEntry==0 
24560 29 7b 0d 0a 20 20 20 20 20 20 70 45 6e 74 72 79  ){..      pEntry
24570 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61   = sqlite3Fts5Ma
24580 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69  llocZero(&rc, si
24590 7a 65 6f 66 28 46 74 73 35 54 65 72 6d 73 65 74  zeof(Fts5Termset
245a0 45 6e 74 72 79 29 20 2b 20 6e 54 65 72 6d 29 3b  Entry) + nTerm);
245b0 0d 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 74  ..      if( pEnt
245c0 72 79 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70  ry ){..        p
245d0 45 6e 74 72 79 2d 3e 70 54 65 72 6d 20 3d 20 28  Entry->pTerm = (
245e0 63 68 61 72 2a 29 26 70 45 6e 74 72 79 5b 31 5d  char*)&pEntry[1]
245f0 3b 0d 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72  ;..        pEntr
24600 79 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d  y->nTerm = nTerm
24610 3b 0d 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72  ;..        pEntr
24620 79 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0d  y->iIdx = iIdx;.
24630 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
24640 70 45 6e 74 72 79 2d 3e 70 54 65 72 6d 2c 20 70  pEntry->pTerm, p
24650 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0d 0a 20  Term, nTerm);.. 
24660 20 20 20 20 20 20 20 70 45 6e 74 72 79 2d 3e 70         pEntry->p
24670 4e 65 78 74 20 3d 20 70 2d 3e 61 70 48 61 73 68  Next = p->apHash
24680 5b 68 61 73 68 5d 3b 0d 0a 20 20 20 20 20 20 20  [hash];..       
24690 20 70 2d 3e 61 70 48 61 73 68 5b 68 61 73 68 5d   p->apHash[hash]
246a0 20 3d 20 70 45 6e 74 72 79 3b 0d 0a 20 20 20 20   = pEntry;..    
246b0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d    }..    }..  }.
246c0 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  ...  return rc;.
246d0 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69  .}....static voi
246e0 64 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72  d sqlite3Fts5Ter
246f0 6d 73 65 74 46 72 65 65 28 46 74 73 35 54 65 72  msetFree(Fts5Ter
24700 6d 73 65 74 20 2a 70 29 7b 0d 0a 20 20 69 66 28  mset *p){..  if(
24710 20 70 20 29 7b 0d 0a 20 20 20 20 75 33 32 20 69   p ){..    u32 i
24720 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
24730 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
24740 70 48 61 73 68 29 3b 20 69 2b 2b 29 7b 0d 0a 20  pHash); i++){.. 
24750 20 20 20 20 20 46 74 73 35 54 65 72 6d 73 65 74       Fts5Termset
24760 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 20 3d 20  Entry *pEntry = 
24770 70 2d 3e 61 70 48 61 73 68 5b 69 5d 3b 0d 0a 20  p->apHash[i];.. 
24780 20 20 20 20 20 77 68 69 6c 65 28 20 70 45 6e 74       while( pEnt
24790 72 79 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 46  ry ){..        F
247a0 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20  ts5TermsetEntry 
247b0 2a 70 44 65 6c 20 3d 20 70 45 6e 74 72 79 3b 0d  *pDel = pEntry;.
247c0 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 20  .        pEntry 
247d0 3d 20 70 45 6e 74 72 79 2d 3e 70 4e 65 78 74 3b  = pEntry->pNext;
247e0 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
247f0 33 5f 66 72 65 65 28 70 44 65 6c 29 3b 0d 0a 20  3_free(pDel);.. 
24800 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20       }..    }.. 
24810 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24820 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 23  p);..  }..}....#
24830 6c 69 6e 65 20 31 20 22 66 74 73 35 5f 63 6f 6e  line 1 "fts5_con
24840 66 69 67 2e 63 22 0d 0a 2f 2a 0d 0a 2a 2a 20 32  fig.c"../*..** 2
24850 30 31 34 20 4a 75 6e 20 30 39 0d 0a 2a 2a 0d 0a  014 Jun 09..**..
24860 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  ** The author di
24870 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
24880 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
24890 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
248a0 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20   of..** a legal 
248b0 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
248c0 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d  a blessing:..**.
248d0 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64  .**    May you d
248e0 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65  o good and not e
248f0 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20  vil...**    May 
24900 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
24910 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
24920 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
24930 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79  hers...**    May
24940 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
24950 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
24960 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
24970 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a  ve...**..*******
24980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249c0 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20  *******..**..** 
249d0 54 68 69 73 20 69 73 20 61 6e 20 53 51 4c 69 74  This is an SQLit
249e0 65 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65  e module impleme
249f0 6e 74 69 6e 67 20 66 75 6c 6c 2d 74 65 78 74 20  nting full-text 
24a00 73 65 61 72 63 68 2e 0d 0a 2a 2f 0d 0a 0d 0a 0d  search...*/.....
24a10 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 22 66 74  ./* #include "ft
24a20 73 35 49 6e 74 2e 68 22 20 2a 2f 0d 0a 0d 0a 23  s5Int.h" */....#
24a30 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41  define FTS5_DEFA
24a40 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 20 20  ULT_PAGE_SIZE   
24a50 34 30 35 30 0d 0a 23 64 65 66 69 6e 65 20 46 54  4050..#define FT
24a60 53 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  S5_DEFAULT_AUTOM
24a70 45 52 47 45 20 20 20 20 20 20 34 0d 0a 23 64 65  ERGE      4..#de
24a80 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c  fine FTS5_DEFAUL
24a90 54 5f 55 53 45 52 4d 45 52 47 45 20 20 20 20 20  T_USERMERGE     
24aa0 20 34 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35   4..#define FTS5
24ab0 5f 44 45 46 41 55 4c 54 5f 43 52 49 53 49 53 4d  _DEFAULT_CRISISM
24ac0 45 52 47 45 20 20 20 31 36 0d 0a 23 64 65 66 69  ERGE   16..#defi
24ad0 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f  ne FTS5_DEFAULT_
24ae0 48 41 53 48 53 49 5a 45 20 20 20 20 28 31 30 32  HASHSIZE    (102
24af0 34 2a 31 30 32 34 29 0d 0a 0d 0a 2f 2a 20 4d 61  4*1024)..../* Ma
24b00 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 70 61  ximum allowed pa
24b10 67 65 20 73 69 7a 65 20 2a 2f 0d 0a 23 64 65 66  ge size */..#def
24b20 69 6e 65 20 46 54 53 35 5f 4d 41 58 5f 50 41 47  ine FTS5_MAX_PAG
24b30 45 5f 53 49 5a 45 20 28 31 32 38 2a 31 30 32 34  E_SIZE (128*1024
24b40 29 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  )....static int 
24b50 66 74 73 35 5f 69 73 77 68 69 74 65 73 70 61 63  fts5_iswhitespac
24b60 65 28 63 68 61 72 20 78 29 7b 0d 0a 20 20 72 65  e(char x){..  re
24b70 74 75 72 6e 20 28 78 3d 3d 27 20 27 29 3b 0d 0a  turn (x==' ');..
24b80 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  }....static int 
24b90 66 74 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65  fts5_isopenquote
24ba0 28 63 68 61 72 20 78 29 7b 0d 0a 20 20 72 65 74  (char x){..  ret
24bb0 75 72 6e 20 28 78 3d 3d 27 22 27 20 7c 7c 20 78  urn (x=='"' || x
24bc0 3d 3d 27 5c 27 27 20 7c 7c 20 78 3d 3d 27 5b 27  =='\'' || x=='['
24bd0 20 7c 7c 20 78 3d 3d 27 60 27 29 3b 0d 0a 7d 0d   || x=='`');..}.
24be0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65  .../*..** Argume
24bf0 6e 74 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f  nt pIn points to
24c00 20 61 20 63 68 61 72 61 63 74 65 72 20 74 68 61   a character tha
24c10 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e  t is part of a n
24c20 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0d 0a  ul-terminated ..
24c30 2a 2a 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72  ** string. Retur
24c40 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24c50 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
24c60 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 49  er following *pI
24c70 6e 20 69 6e 20 0d 0a 2a 2a 20 74 68 65 20 73 74  n in ..** the st
24c80 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74  ring that is not
24c90 20 61 20 77 68 69 74 65 2d 73 70 61 63 65 20 63   a white-space c
24ca0 68 61 72 61 63 74 65 72 2e 0d 0a 2a 2f 0d 0a 73  haracter...*/..s
24cb0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
24cc0 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70   *fts5ConfigSkip
24cd0 57 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73 74  Whitespace(const
24ce0 20 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20   char *pIn){..  
24cf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
24d00 70 49 6e 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b  pIn;..  if( p ){
24d10 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73  ..    while( fts
24d20 35 5f 69 73 77 68 69 74 65 73 70 61 63 65 28 2a  5_iswhitespace(*
24d30 70 29 20 29 7b 20 70 2b 2b 3b 20 7d 0d 0a 20 20  p) ){ p++; }..  
24d40 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a  }..  return p;..
24d50 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75  }..../*..** Argu
24d60 6d 65 6e 74 20 70 49 6e 20 70 6f 69 6e 74 73 20  ment pIn points 
24d70 74 6f 20 61 20 63 68 61 72 61 63 74 65 72 20 74  to a character t
24d80 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
24d90 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
24da0 0d 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 52 65 74  ..** string. Ret
24db0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24dc0 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
24dd0 63 74 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a  cter following *
24de0 70 49 6e 20 69 6e 20 0d 0a 2a 2a 20 74 68 65 20  pIn in ..** the 
24df0 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e  string that is n
24e00 6f 74 20 61 20 22 62 61 72 65 77 6f 72 64 22 20  ot a "bareword" 
24e10 63 68 61 72 61 63 74 65 72 2e 0d 0a 2a 2f 0d 0a  character...*/..
24e20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
24e30 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69  r *fts5ConfigSki
24e40 70 42 61 72 65 77 6f 72 64 28 63 6f 6e 73 74 20  pBareword(const 
24e50 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20 63  char *pIn){..  c
24e60 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 70  onst char *p = p
24e70 49 6e 3b 0d 0a 20 20 77 68 69 6c 65 20 28 20 73  In;..  while ( s
24e80 71 6c 69 74 65 33 46 74 73 35 49 73 42 61 72 65  qlite3Fts5IsBare
24e90 77 6f 72 64 28 2a 70 29 20 29 20 70 2b 2b 3b 0d  word(*p) ) p++;.
24ea0 0a 20 20 69 66 28 20 70 3d 3d 70 49 6e 20 29 20  .  if( p==pIn ) 
24eb0 70 20 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e  p = 0;..  return
24ec0 20 70 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63   p;..}....static
24ed0 20 69 6e 74 20 66 74 73 35 5f 69 73 64 69 67 69   int fts5_isdigi
24ee0 74 28 63 68 61 72 20 61 29 7b 0d 0a 20 20 72 65  t(char a){..  re
24ef0 74 75 72 6e 20 28 61 3e 3d 27 30 27 20 26 26 20  turn (a>='0' && 
24f00 61 3c 3d 27 39 27 29 3b 0d 0a 7d 0d 0a 0d 0a 0d  a<='9');..}.....
24f10 0a 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ...static const 
24f20 63 68 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67  char *fts5Config
24f30 53 6b 69 70 4c 69 74 65 72 61 6c 28 63 6f 6e 73  SkipLiteral(cons
24f40 74 20 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20  t char *pIn){.. 
24f50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d   const char *p =
24f60 20 70 49 6e 3b 0d 0a 20 20 73 77 69 74 63 68 28   pIn;..  switch(
24f70 20 2a 70 20 29 7b 0d 0a 20 20 20 20 63 61 73 65   *p ){..    case
24f80 20 27 6e 27 3a 20 63 61 73 65 20 27 4e 27 3a 0d   'n': case 'N':.
24f90 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
24fa0 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 6e 75 6c  e3_strnicmp("nul
24fb0 6c 22 2c 20 70 2c 20 34 29 3d 3d 30 20 29 7b 0d  l", p, 4)==0 ){.
24fc0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 26 70 5b  .        p = &p[
24fd0 34 5d 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65  4];..      }else
24fe0 7b 0d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 30  {..        p = 0
24ff0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
25000 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20    break;....    
25010 63 61 73 65 20 27 78 27 3a 20 63 61 73 65 20 27  case 'x': case '
25020 58 27 3a 0d 0a 20 20 20 20 20 20 70 2b 2b 3b 0d  X':..      p++;.
25030 0a 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27  .      if( *p=='
25040 5c 27 27 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  \'' ){..        
25050 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 77 68  p++;..        wh
25060 69 6c 65 28 20 28 2a 70 3e 3d 27 61 27 20 26 26  ile( (*p>='a' &&
25070 20 2a 70 3c 3d 27 66 27 29 20 0d 0a 20 20 20 20   *p<='f') ..    
25080 20 20 20 20 20 20 20 20 7c 7c 20 28 2a 70 3e 3d          || (*p>=
25090 27 41 27 20 26 26 20 2a 70 3c 3d 27 46 27 29 20  'A' && *p<='F') 
250a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ..            ||
250b0 20 28 2a 70 3e 3d 27 30 27 20 26 26 20 2a 70 3c   (*p>='0' && *p<
250c0 3d 27 39 27 29 20 0d 0a 20 20 20 20 20 20 20 20  ='9') ..        
250d0 20 20 20 20 29 7b 0d 0a 20 20 20 20 20 20 20 20      ){..        
250e0 20 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20    p++;..        
250f0 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  }..        if( *
25100 70 3d 3d 27 5c 27 27 20 26 26 20 30 3d 3d 28 28  p=='\'' && 0==((
25110 70 2d 70 49 6e 29 25 32 29 20 29 7b 0d 0a 20 20  p-pIn)%2) ){..  
25120 20 20 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20          p++;..  
25130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20        }else{..  
25140 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b 0d 0a          p = 0;..
25150 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
25160 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20   }else{..       
25170 20 70 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 7d   p = 0;..      }
25180 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a  ..      break;..
25190 0d 0a 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a  ..    case '\'':
251a0 0d 0a 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20  ..      p++;..  
251b0 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0d      while( p ){.
251c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d  .        if( *p=
251d0 3d 27 5c 27 27 20 29 7b 0d 0a 20 20 20 20 20 20  ='\'' ){..      
251e0 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20      p++;..      
251f0 20 20 20 20 69 66 28 20 2a 70 21 3d 27 5c 27 27      if( *p!='\''
25200 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20   ) break;..     
25210 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 70 2b     }..        p+
25220 2b 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20  +;..        if( 
25230 2a 70 3d 3d 30 20 29 20 70 20 3d 20 30 3b 0d 0a  *p==0 ) p = 0;..
25240 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 62        }..      b
25250 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 64 65 66  reak;....    def
25260 61 75 6c 74 3a 0d 0a 20 20 20 20 20 20 2f 2a 20  ault:..      /* 
25270 6d 61 79 62 65 20 61 20 6e 75 6d 62 65 72 20 2a  maybe a number *
25280 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 2a 70 3d  /..      if( *p=
25290 3d 27 2b 27 20 7c 7c 20 2a 70 3d 3d 27 2d 27 20  ='+' || *p=='-' 
252a0 29 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 77 68  ) p++;..      wh
252b0 69 6c 65 28 20 66 74 73 35 5f 69 73 64 69 67 69  ile( fts5_isdigi
252c0 74 28 2a 70 29 20 29 20 70 2b 2b 3b 0d 0a 0d 0a  t(*p) ) p++;....
252d0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
252e0 20 70 6f 69 6e 74 2c 20 69 66 20 74 68 65 20 6c   point, if the l
252f0 69 74 65 72 61 6c 20 77 61 73 20 61 6e 20 69 6e  iteral was an in
25300 74 65 67 65 72 2c 20 74 68 65 20 70 61 72 73 65  teger, the parse
25310 20 69 73 20 0d 0a 20 20 20 20 20 20 2a 2a 20 66   is ..      ** f
25320 69 6e 69 73 68 65 64 2e 20 4f 72 2c 20 69 66 20  inished. Or, if 
25330 69 74 20 69 73 20 61 20 66 6c 6f 61 74 69 6e 67  it is a floating
25340 20 70 6f 69 6e 74 20 76 61 6c 75 65 2c 20 69 74   point value, it
25350 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 0d 0a 20   may continue.. 
25360 20 20 20 20 20 2a 2a 20 77 69 74 68 20 65 69 74       ** with eit
25370 68 65 72 20 61 20 64 65 63 69 6d 61 6c 20 70 6f  her a decimal po
25380 69 6e 74 20 6f 72 20 61 6e 20 27 45 27 20 63 68  int or an 'E' ch
25390 61 72 61 63 74 65 72 2e 20 2a 2f 0d 0a 20 20 20  aracter. */..   
253a0 20 20 20 69 66 28 20 2a 70 3d 3d 27 2e 27 20 26     if( *p=='.' &
253b0 26 20 66 74 73 35 5f 69 73 64 69 67 69 74 28 70  & fts5_isdigit(p
253c0 5b 31 5d 29 20 29 7b 0d 0a 20 20 20 20 20 20 20  [1]) ){..       
253d0 20 70 20 2b 3d 20 32 3b 0d 0a 20 20 20 20 20 20   p += 2;..      
253e0 20 20 77 68 69 6c 65 28 20 66 74 73 35 5f 69 73    while( fts5_is
253f0 64 69 67 69 74 28 2a 70 29 20 29 20 70 2b 2b 3b  digit(*p) ) p++;
25400 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
25410 20 69 66 28 20 70 3d 3d 70 49 6e 20 29 20 70 20   if( p==pIn ) p 
25420 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 20 20 62 72  = 0;....      br
25430 65 61 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72  eak;..  }....  r
25440 65 74 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 2f  eturn p;..}..../
25450 2a 0d 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  *..** The first 
25460 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
25470 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
25480 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 7a  to by argument z
25490 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0d 0a   is guaranteed..
254a0 2a 2a 20 74 6f 20 62 65 20 61 6e 20 6f 70 65 6e  ** to be an open
254b0 2d 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72  -quote character
254c0 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 66   (see function f
254d0 74 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65 28  ts5_isopenquote(
254e0 29 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73  ))...**..** This
254f0 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
25500 65 73 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  es for the corre
25510 73 70 6f 6e 64 69 6e 67 20 63 6c 6f 73 65 2d 71  sponding close-q
25520 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 77  uote character w
25530 69 74 68 69 6e 0d 0a 2a 2a 20 74 68 65 20 73 74  ithin..** the st
25540 72 69 6e 67 20 61 6e 64 2c 20 69 66 20 66 6f 75  ring and, if fou
25550 6e 64 2c 20 64 65 71 75 6f 74 65 73 20 74 68 65  nd, dequotes the
25560 20 73 74 72 69 6e 67 20 69 6e 20 70 6c 61 63 65   string in place
25570 20 61 6e 64 20 61 64 64 73 20 61 20 6e 65 77 0d   and adds a new.
25580 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
25590 6f 72 20 62 79 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a  or byte...**..**
255a0 20 49 66 20 74 68 65 20 63 6c 6f 73 65 2d 71 75   If the close-qu
255b0 6f 74 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ote is found, th
255c0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
255d0 20 69 73 20 74 68 65 20 62 79 74 65 20 6f 66 66   is the byte off
255e0 73 65 74 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 63  set of..** the c
255f0 68 61 72 61 63 74 65 72 20 69 6d 6d 65 64 69 61  haracter immedia
25600 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tely following i
25610 74 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6c  t. Or, if the cl
25620 6f 73 65 2d 71 75 6f 74 65 20 69 73 20 6e 6f 74  ose-quote is not
25630 20 0d 0a 2a 2a 20 66 6f 75 6e 64 2c 20 2d 31 20   ..** found, -1 
25640 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
25650 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  -1 is returned, 
25660 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6c 65  the buffer is le
25670 66 74 20 69 6e 20 61 6e 20 0d 0a 2a 2a 20 75 6e  ft in an ..** un
25680 64 65 66 69 6e 65 64 20 73 74 61 74 65 2e 0d 0a  defined state...
25690 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */..static int f
256a0 74 73 35 44 65 71 75 6f 74 65 28 63 68 61 72 20  ts5Dequote(char 
256b0 2a 7a 29 7b 0d 0a 20 20 63 68 61 72 20 71 3b 0d  *z){..  char q;.
256c0 0a 20 20 69 6e 74 20 69 49 6e 20 3d 20 31 3b 0d  .  int iIn = 1;.
256d0 0a 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b  .  int iOut = 0;
256e0 0d 0a 20 20 71 20 3d 20 7a 5b 30 5d 3b 0d 0a 0d  ..  q = z[0];...
256f0 0a 20 20 2f 2a 20 53 65 74 20 73 74 61 63 6b 20  .  /* Set stack 
25700 76 61 72 69 61 62 6c 65 20 71 20 74 6f 20 74 68  variable q to th
25710 65 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63 68  e close-quote ch
25720 61 72 61 63 74 65 72 20 2a 2f 0d 0a 20 20 61 73  aracter */..  as
25730 73 65 72 74 28 20 71 3d 3d 27 5b 27 20 7c 7c 20  sert( q=='[' || 
25740 71 3d 3d 27 5c 27 27 20 7c 7c 20 71 3d 3d 27 22  q=='\'' || q=='"
25750 27 20 7c 7c 20 71 3d 3d 27 60 27 20 29 3b 0d 0a  ' || q=='`' );..
25760 20 20 69 66 28 20 71 3d 3d 27 5b 27 20 29 20 71    if( q=='[' ) q
25770 20 3d 20 27 5d 27 3b 20 20 0d 0a 0d 0a 20 20 77   = ']';  ....  w
25780 68 69 6c 65 28 20 41 4c 57 41 59 53 28 7a 5b 69  hile( ALWAYS(z[i
25790 49 6e 5d 29 20 29 7b 0d 0a 20 20 20 20 69 66 28  In]) ){..    if(
257a0 20 7a 5b 69 49 6e 5d 3d 3d 71 20 29 7b 0d 0a 20   z[iIn]==q ){.. 
257b0 20 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 2b 31       if( z[iIn+1
257c0 5d 21 3d 71 20 29 7b 0d 0a 20 20 20 20 20 20 20  ]!=q ){..       
257d0 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20 69 49   /* Character iI
257e0 6e 20 77 61 73 20 74 68 65 20 63 6c 6f 73 65 20  n was the close 
257f0 71 75 6f 74 65 2e 20 2a 2f 0d 0a 20 20 20 20 20  quote. */..     
25800 20 20 20 69 49 6e 2b 2b 3b 0d 0a 20 20 20 20 20     iIn++;..     
25810 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
25820 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20   }else{..       
25830 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20 69 49   /* Character iI
25840 6e 20 61 6e 64 20 69 49 6e 2b 31 20 66 6f 72 6d  n and iIn+1 form
25850 20 61 6e 20 65 73 63 61 70 65 64 20 71 75 6f 74   an escaped quot
25860 65 20 63 68 61 72 61 63 74 65 72 2e 20 53 6b 69  e character. Ski
25870 70 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p..        ** th
25880 65 20 69 6e 70 75 74 20 63 75 72 73 6f 72 20 70  e input cursor p
25890 61 73 74 20 62 6f 74 68 20 61 6e 64 20 63 6f 70  ast both and cop
258a0 79 20 61 20 73 69 6e 67 6c 65 20 71 75 6f 74 65  y a single quote
258b0 20 63 68 61 72 61 63 74 65 72 20 0d 0a 20 20 20   character ..   
258c0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f       ** to the o
258d0 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a 2f  utput buffer. */
258e0 0d 0a 20 20 20 20 20 20 20 20 69 49 6e 20 2b 3d  ..        iIn +=
258f0 20 32 3b 0d 0a 20 20 20 20 20 20 20 20 7a 5b 69   2;..        z[i
25900 4f 75 74 2b 2b 5d 20 3d 20 71 3b 0d 0a 20 20 20  Out++] = q;..   
25910 20 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 7b     }..    }else{
25920 0d 0a 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b  ..      z[iOut++
25930 5d 20 3d 20 7a 5b 69 49 6e 2b 2b 5d 3b 0d 0a 20  ] = z[iIn++];.. 
25940 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 7a     }..  }....  z
25950 5b 69 4f 75 74 5d 20 3d 20 27 5c 30 27 3b 0d 0a  [iOut] = '\0';..
25960 20 20 72 65 74 75 72 6e 20 69 49 6e 3b 0d 0a 7d    return iIn;..}
25970 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65  ..../*..** Conve
25980 72 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20  rt an SQL-style 
25990 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e  quoted string in
259a0 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69  to a normal stri
259b0 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e 67 0d 0a  ng by removing..
259c0 2a 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68 61  ** the quote cha
259d0 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 63 6f  racters.  The co
259e0 6e 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65  nversion is done
259f0 20 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20 74   in-place.  If t
25a00 68 65 0d 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65  he..** input doe
25a10 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
25a20 20 61 20 71 75 6f 74 65 20 63 68 61 72 61 63 74   a quote charact
25a30 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  er, then this ro
25a40 75 74 69 6e 65 0d 0a 2a 2a 20 69 73 20 61 20 6e  utine..** is a n
25a50 6f 2d 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 78  o-op...**..** Ex
25a60 61 6d 70 6c 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20  amples:..**..** 
25a70 20 20 20 20 22 61 62 63 22 20 20 20 62 65 63 6f      "abc"   beco
25a80 6d 65 73 20 20 20 61 62 63 0d 0a 2a 2a 20 20 20  mes   abc..**   
25a90 20 20 27 78 79 7a 27 20 20 20 62 65 63 6f 6d 65    'xyz'   become
25aa0 73 20 20 20 78 79 7a 0d 0a 2a 2a 20 20 20 20 20  s   xyz..**     
25ab0 5b 70 71 72 5d 20 20 20 62 65 63 6f 6d 65 73 20  [pqr]   becomes 
25ac0 20 20 70 71 72 0d 0a 2a 2a 20 20 20 20 20 60 6d    pqr..**     `m
25ad0 6e 6f 60 20 20 20 62 65 63 6f 6d 65 73 20 20 20  no`   becomes   
25ae0 6d 6e 6f 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  mno..*/..static 
25af0 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
25b00 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29  Dequote(char *z)
25b10 7b 0d 0a 20 20 63 68 61 72 20 71 75 6f 74 65 3b  {..  char quote;
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b30 20 20 20 20 20 2f 2a 20 51 75 6f 74 65 20 63 68       /* Quote ch
25b40 61 72 61 63 74 65 72 20 28 69 66 20 61 6e 79 20  aracter (if any 
25b50 29 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74  ) */....  assert
25b60 28 20 30 3d 3d 66 74 73 35 5f 69 73 77 68 69 74  ( 0==fts5_iswhit
25b70 65 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 3b 0d  espace(z[0]) );.
25b80 0a 20 20 71 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b  .  quote = z[0];
25b90 0d 0a 20 20 69 66 28 20 71 75 6f 74 65 3d 3d 27  ..  if( quote=='
25ba0 5b 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 5c 27  [' || quote=='\'
25bb0 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 22 27 20  ' || quote=='"' 
25bc0 7c 7c 20 71 75 6f 74 65 3d 3d 27 60 27 20 29 7b  || quote=='`' ){
25bd0 0d 0a 20 20 20 20 66 74 73 35 44 65 71 75 6f 74  ..    fts5Dequot
25be0 65 28 7a 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d  e(z);..  }..}...
25bf0 0a 0d 0a 73 74 72 75 63 74 20 46 74 73 35 45 6e  ...struct Fts5En
25c00 75 6d 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68  um {..  const ch
25c10 61 72 20 2a 7a 4e 61 6d 65 3b 0d 0a 20 20 69 6e  ar *zName;..  in
25c20 74 20 65 56 61 6c 3b 0d 0a 7d 3b 0d 0a 74 79 70  t eVal;..};..typ
25c30 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25c40 45 6e 75 6d 20 46 74 73 35 45 6e 75 6d 3b 0d 0a  Enum Fts5Enum;..
25c50 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
25c60 35 43 6f 6e 66 69 67 53 65 74 45 6e 75 6d 28 0d  5ConfigSetEnum(.
25c70 0a 20 20 63 6f 6e 73 74 20 46 74 73 35 45 6e 75  .  const Fts5Enu
25c80 6d 20 2a 61 45 6e 75 6d 2c 20 0d 0a 20 20 63 6f  m *aEnum, ..  co
25c90 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 75 6d 2c  nst char *zEnum,
25ca0 20 0d 0a 20 20 69 6e 74 20 2a 70 65 56 61 6c 0d   ..  int *peVal.
25cb0 0a 29 7b 0d 0a 20 20 69 6e 74 20 6e 45 6e 75 6d  .){..  int nEnum
25cc0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
25cd0 45 6e 75 6d 29 3b 0d 0a 20 20 69 6e 74 20 69 3b  Enum);..  int i;
25ce0 0d 0a 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 2d  ..  int iVal = -
25cf0 31 3b 0d 0a 0d 0a 20 20 66 6f 72 28 69 3d 30 3b  1;....  for(i=0;
25d00 20 61 45 6e 75 6d 5b 69 5d 2e 7a 4e 61 6d 65 3b   aEnum[i].zName;
25d10 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 20   i++){..    if( 
25d20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
25d30 28 61 45 6e 75 6d 5b 69 5d 2e 7a 4e 61 6d 65 2c  (aEnum[i].zName,
25d40 20 7a 45 6e 75 6d 2c 20 6e 45 6e 75 6d 29 3d 3d   zEnum, nEnum)==
25d50 30 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20  0 ){..      if( 
25d60 69 56 61 6c 3e 3d 30 20 29 20 72 65 74 75 72 6e  iVal>=0 ) return
25d70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a   SQLITE_ERROR;..
25d80 20 20 20 20 20 20 69 56 61 6c 20 3d 20 61 45 6e        iVal = aEn
25d90 75 6d 5b 69 5d 2e 65 56 61 6c 3b 0d 0a 20 20 20  um[i].eVal;..   
25da0 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 65   }..  }....  *pe
25db0 56 61 6c 20 3d 20 69 56 61 6c 3b 0d 0a 20 20 72  Val = iVal;..  r
25dc0 65 74 75 72 6e 20 69 56 61 6c 3c 30 20 3f 20 53  eturn iVal<0 ? S
25dd0 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51  QLITE_ERROR : SQ
25de0 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f  LITE_OK;..}..../
25df0 2a 0d 0a 2a 2a 20 50 61 72 73 65 20 61 20 22 73  *..** Parse a "s
25e00 70 65 63 69 61 6c 22 20 43 52 45 41 54 45 20 56  pecial" CREATE V
25e10 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 69 72  IRTUAL TABLE dir
25e20 65 63 74 69 76 65 20 61 6e 64 20 75 70 64 61 74  ective and updat
25e30 65 0d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74  e..** configurat
25e40 69 6f 6e 20 6f 62 6a 65 63 74 20 70 43 6f 6e 66  ion object pConf
25e50 69 67 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ig as appropriat
25e60 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75  e...**..** If su
25e70 63 63 65 73 73 66 75 6c 2c 20 6f 62 6a 65 63 74  ccessful, object
25e80 20 70 43 6f 6e 66 69 67 20 69 73 20 75 70 64 61   pConfig is upda
25e90 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
25ea0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0d 0a  K returned. If..
25eb0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
25ec0 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
25ed0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
25ee0 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
25ef0 72 20 6d 65 73 73 61 67 65 0d 0a 2a 2a 20 6d 61  r message..** ma
25f00 79 20 62 65 20 6c 65 66 74 20 69 6e 20 2a 70 7a  y be left in *pz
25f10 45 72 72 2e 20 49 74 20 69 73 20 74 68 65 20 72  Err. It is the r
25f20 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
25f30 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 0d 0a   the caller to..
25f40 2a 2a 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  ** eventually fr
25f50 65 65 20 61 6e 79 20 73 75 63 68 20 65 72 72 6f  ee any such erro
25f60 72 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  r message using 
25f70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0d  sqlite3_free()..
25f80 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
25f90 66 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 53  fts5ConfigParseS
25fa0 70 65 63 69 61 6c 28 0d 0a 20 20 46 74 73 35 47  pecial(..  Fts5G
25fb0 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 0d  lobal *pGlobal,.
25fc0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
25fd0 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20  Config,         
25fe0 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
25ff0 69 6f 6e 20 6f 62 6a 65 63 74 20 74 6f 20 75 70  ion object to up
26000 64 61 74 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74  date */..  const
26010 20 63 68 61 72 20 2a 7a 43 6d 64 2c 20 20 20 20   char *zCmd,    
26020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
26030 65 63 69 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f  ecial command to
26040 20 70 61 72 73 65 20 2a 2f 0d 0a 20 20 63 6f 6e   parse */..  con
26050 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20 20  st char *zArg,  
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26070 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73  Argument to pars
26080 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70  e */..  char **p
26090 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  zErr            
260a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
260b0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
260c0 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d  ..){..  int rc =
260d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69   SQLITE_OK;..  i
260e0 6e 74 20 6e 43 6d 64 20 3d 20 28 69 6e 74 29 73  nt nCmd = (int)s
260f0 74 72 6c 65 6e 28 7a 43 6d 64 29 3b 0d 0a 20 20  trlen(zCmd);..  
26100 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
26110 69 63 6d 70 28 22 70 72 65 66 69 78 22 2c 20 7a  icmp("prefix", z
26120 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b  Cmd, nCmd)==0 ){
26130 0d 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ..    const int 
26140 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 69  nByte = sizeof(i
26150 6e 74 29 20 2a 20 46 54 53 35 5f 4d 41 58 5f 50  nt) * FTS5_MAX_P
26160 52 45 46 49 58 5f 49 4e 44 45 58 45 53 3b 0d 0a  REFIX_INDEXES;..
26170 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26180 70 3b 0d 0a 20 20 20 20 69 6e 74 20 62 46 69 72  p;..    int bFir
26190 73 74 20 3d 20 31 3b 0d 0a 20 20 20 20 69 66 28  st = 1;..    if(
261a0 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
261b0 78 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 70  x==0 ){..      p
261c0 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 20  Config->aPrefix 
261d0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  = sqlite3Fts5Mal
261e0 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79  locZero(&rc, nBy
261f0 74 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20  te);..      if( 
26200 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d  rc ) return rc;.
26210 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 20  .    }....    p 
26220 3d 20 7a 41 72 67 3b 0d 0a 20 20 20 20 77 68 69  = zArg;..    whi
26230 6c 65 28 20 31 20 29 7b 0d 0a 20 20 20 20 20 20  le( 1 ){..      
26240 69 6e 74 20 6e 50 72 65 20 3d 20 30 3b 0d 0a 0d  int nPre = 0;...
26250 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 5b  .      while( p[
26260 30 5d 3d 3d 27 20 27 20 29 20 70 2b 2b 3b 0d 0a  0]==' ' ) p++;..
26270 20 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74        if( bFirst
26280 3d 3d 30 20 26 26 20 70 5b 30 5d 3d 3d 27 2c 27  ==0 && p[0]==','
26290 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 2b 2b   ){..        p++
262a0 3b 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ;..        while
262b0 28 20 70 5b 30 5d 3d 3d 27 20 27 20 29 20 70 2b  ( p[0]==' ' ) p+
262c0 2b 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +;..      }else 
262d0 69 66 28 20 70 5b 30 5d 3d 3d 27 5c 30 27 20 29  if( p[0]=='\0' )
262e0 7b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  {..        break
262f0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
26300 20 20 69 66 28 20 70 5b 30 5d 3c 27 30 27 20 7c    if( p[0]<'0' |
26310 7c 20 70 5b 30 5d 3e 27 39 27 20 29 7b 0d 0a 20  | p[0]>'9' ){.. 
26320 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
26330 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
26340 22 6d 61 6c 66 6f 72 6d 65 64 20 70 72 65 66 69  "malformed prefi
26350 78 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 22  x=... directive"
26360 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d  );..        rc =
26370 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a   SQLITE_ERROR;..
26380 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
26390 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
263a0 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 50   if( pConfig->nP
263b0 72 65 66 69 78 3d 3d 46 54 53 35 5f 4d 41 58 5f  refix==FTS5_MAX_
263c0 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20 29  PREFIX_INDEXES )
263d0 7b 0d 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  {..        *pzEr
263e0 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
263f0 6e 74 66 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ntf(..          
26400 20 20 22 74 6f 6f 20 6d 61 6e 79 20 70 72 65 66    "too many pref
26410 69 78 20 69 6e 64 65 78 65 73 20 28 6d 61 78 20  ix indexes (max 
26420 25 64 29 22 2c 20 46 54 53 35 5f 4d 41 58 5f 50  %d)", FTS5_MAX_P
26430 52 45 46 49 58 5f 49 4e 44 45 58 45 53 0d 0a 20  REFIX_INDEXES.. 
26440 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20         );..     
26450 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26460 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 20 20 62  RROR;..        b
26470 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  reak;..      }..
26480 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ..      while( p
26490 5b 30 5d 3e 3d 27 30 27 20 26 26 20 70 5b 30 5d  [0]>='0' && p[0]
264a0 3c 3d 27 39 27 20 26 26 20 6e 50 72 65 3c 31 30  <='9' && nPre<10
264b0 30 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 6e  00 ){..        n
264c0 50 72 65 20 3d 20 6e 50 72 65 2a 31 30 20 2b 20  Pre = nPre*10 + 
264d0 28 70 5b 30 5d 20 2d 20 27 30 27 29 3b 0d 0a 20  (p[0] - '0');.. 
264e0 20 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 20         p++;..   
264f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
26500 28 20 6e 50 72 65 3c 3d 30 20 7c 7c 20 6e 50 72  ( nPre<=0 || nPr
26510 65 3e 3d 31 30 30 30 20 29 7b 0d 0a 20 20 20 20  e>=1000 ){..    
26520 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
26530 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 70 72  ite3_mprintf("pr
26540 65 66 69 78 20 6c 65 6e 67 74 68 20 6f 75 74 20  efix length out 
26550 6f 66 20 72 61 6e 67 65 20 28 6d 61 78 20 39 39  of range (max 99
26560 39 29 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 72  9)");..        r
26570 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
26580 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;..        break
26590 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
265a0 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72      pConfig->aPr
265b0 65 66 69 78 5b 70 43 6f 6e 66 69 67 2d 3e 6e 50  efix[pConfig->nP
265c0 72 65 66 69 78 5d 20 3d 20 6e 50 72 65 3b 0d 0a  refix] = nPre;..
265d0 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e        pConfig->n
265e0 50 72 65 66 69 78 2b 2b 3b 0d 0a 20 20 20 20 20  Prefix++;..     
265f0 20 62 46 69 72 73 74 20 3d 20 30 3b 0d 0a 20 20   bFirst = 0;..  
26600 20 20 7d 0d 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
26610 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69   pConfig->nPrefi
26620 78 3c 3d 46 54 53 35 5f 4d 41 58 5f 50 52 45 46  x<=FTS5_MAX_PREF
26630 49 58 5f 49 4e 44 45 58 45 53 20 29 3b 0d 0a 20  IX_INDEXES );.. 
26640 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20     return rc;.. 
26650 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c 69   }....  if( sqli
26660 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 74 6f  te3_strnicmp("to
26670 6b 65 6e 69 7a 65 22 2c 20 7a 43 6d 64 2c 20 6e  kenize", zCmd, n
26680 43 6d 64 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  Cmd)==0 ){..    
26690 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
266a0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 41 72  (const char*)zAr
266b0 67 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g;..    sqlite3_
266c0 69 6e 74 36 34 20 6e 41 72 67 20 3d 20 73 74 72  int64 nArg = str
266d0 6c 65 6e 28 7a 41 72 67 29 20 2b 20 31 3b 0d 0a  len(zArg) + 1;..
266e0 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67      char **azArg
266f0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61   = sqlite3Fts5Ma
26700 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69  llocZero(&rc, si
26710 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41  zeof(char*) * nA
26720 72 67 29 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a  rg);..    char *
26730 70 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 46 74  pDel = sqlite3Ft
26740 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
26750 2c 20 6e 41 72 67 20 2a 20 32 29 3b 0d 0a 20 20  , nArg * 2);..  
26760 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 20 3d    char *pSpace =
26770 20 70 44 65 6c 3b 0d 0a 0d 0a 20 20 20 20 69 66   pDel;....    if
26780 28 20 61 7a 41 72 67 20 26 26 20 70 53 70 61 63  ( azArg && pSpac
26790 65 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20  e ){..      if( 
267a0 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 20 29 7b  pConfig->pTok ){
267b0 0d 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  ..        *pzErr
267c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
267d0 74 66 28 22 6d 75 6c 74 69 70 6c 65 20 74 6f 6b  tf("multiple tok
267e0 65 6e 69 7a 65 3d 2e 2e 2e 20 64 69 72 65 63 74  enize=... direct
267f0 69 76 65 73 22 29 3b 0d 0a 20 20 20 20 20 20 20  ives");..       
26800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26810 4f 52 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65  OR;..      }else
26820 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e  {..        for(n
26830 41 72 67 3d 30 3b 20 70 20 26 26 20 2a 70 3b 20  Arg=0; p && *p; 
26840 6e 41 72 67 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  nArg++){..      
26850 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26860 70 32 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53  p2 = fts5ConfigS
26870 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29  kipWhitespace(p)
26880 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
26890 20 2a 70 32 3d 3d 27 5c 27 27 20 29 7b 0d 0a 20   *p2=='\'' ){.. 
268a0 20 20 20 20 20 20 20 20 20 20 20 70 20 3d 20 66             p = f
268b0 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 4c 69 74  ts5ConfigSkipLit
268c0 65 72 61 6c 28 70 32 29 3b 0d 0a 20 20 20 20 20  eral(p2);..     
268d0 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20       }else{..   
268e0 20 20 20 20 20 20 20 20 20 70 20 3d 20 66 74 73           p = fts
268f0 35 43 6f 6e 66 69 67 53 6b 69 70 42 61 72 65 77  5ConfigSkipBarew
26900 6f 72 64 28 70 32 29 3b 0d 0a 20 20 20 20 20 20  ord(p2);..      
26910 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
26920 20 69 66 28 20 70 20 29 7b 0d 0a 20 20 20 20 20   if( p ){..     
26930 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53         memcpy(pS
26940 70 61 63 65 2c 20 70 32 2c 20 70 2d 70 32 29 3b  pace, p2, p-p2);
26950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  ..            az
26960 41 72 67 5b 6e 41 72 67 5d 20 3d 20 70 53 70 61  Arg[nArg] = pSpa
26970 63 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce;..           
26980 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71 75   sqlite3Fts5Dequ
26990 6f 74 65 28 70 53 70 61 63 65 29 3b 0d 0a 20 20  ote(pSpace);..  
269a0 20 20 20 20 20 20 20 20 20 20 70 53 70 61 63 65            pSpace
269b0 20 2b 3d 20 28 70 20 2d 20 70 32 29 20 2b 20 31   += (p - p2) + 1
269c0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
269d0 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69   = fts5ConfigSki
269e0 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b 0d  pWhitespace(p);.
269f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
26a00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
26a10 20 69 66 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 20   if( p==0 ){..  
26a20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d          *pzErr =
26a30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26a40 28 22 70 61 72 73 65 20 65 72 72 6f 72 20 69 6e  ("parse error in
26a50 20 74 6f 6b 65 6e 69 7a 65 20 64 69 72 65 63 74   tokenize direct
26a60 69 76 65 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ive");..        
26a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26a80 52 4f 52 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65  ROR;..        }e
26a90 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse{..          
26aa0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
26ab0 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 70 47 6c  GetTokenizer(pGl
26ac0 6f 62 61 6c 2c 20 0d 0a 20 20 20 20 20 20 20 20  obal, ..        
26ad0 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
26ae0 72 2a 2a 29 61 7a 41 72 67 2c 20 6e 41 72 67 2c  r**)azArg, nArg,
26af0 20 26 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 2c   &pConfig->pTok,
26b00 20 26 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41   &pConfig->pTokA
26b10 70 69 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  pi,..           
26b20 20 20 20 70 7a 45 72 72 0d 0a 20 20 20 20 20 20     pzErr..      
26b30 20 20 20 20 29 3b 0d 0a 20 20 20 20 20 20 20 20      );..        
26b40 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
26b50 7d 0d 0a 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  }....    sqlite3
26b60 5f 66 72 65 65 28 61 7a 41 72 67 29 3b 0d 0a 20  _free(azArg);.. 
26b70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26b80 70 44 65 6c 29 3b 0d 0a 20 20 20 20 72 65 74 75  pDel);..    retu
26b90 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20  rn rc;..  }.... 
26ba0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
26bb0 6e 69 63 6d 70 28 22 63 6f 6e 74 65 6e 74 22 2c  nicmp("content",
26bc0 20 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30 20   zCmd, nCmd)==0 
26bd0 29 7b 0d 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ){..    if( pCon
26be0 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 21 3d 46  fig->eContent!=F
26bf0 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d  TS5_CONTENT_NORM
26c00 41 4c 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 7a  AL ){..      *pz
26c10 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
26c20 72 69 6e 74 66 28 22 6d 75 6c 74 69 70 6c 65 20  rintf("multiple 
26c30 63 6f 6e 74 65 6e 74 3d 2e 2e 2e 20 64 69 72 65  content=... dire
26c40 63 74 69 76 65 73 22 29 3b 0d 0a 20 20 20 20 20  ctives");..     
26c50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26c60 4f 52 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d  OR;..    }else{.
26c70 0a 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 5b  .      if( zArg[
26c80 30 5d 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70  0] ){..        p
26c90 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74  Config->eContent
26ca0 20 3d 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f   = FTS5_CONTENT_
26cb0 45 58 54 45 52 4e 41 4c 3b 0d 0a 20 20 20 20 20  EXTERNAL;..     
26cc0 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e     pConfig->zCon
26cd0 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 74  tent = sqlite3Ft
26ce0 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22  s5Mprintf(&rc, "
26cf0 25 51 2e 25 51 22 2c 20 70 43 6f 6e 66 69 67 2d  %Q.%Q", pConfig-
26d00 3e 7a 44 62 2c 7a 41 72 67 29 3b 0d 0a 20 20 20  >zDb,zArg);..   
26d10 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
26d20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e     pConfig->eCon
26d30 74 65 6e 74 20 3d 20 46 54 53 35 5f 43 4f 4e 54  tent = FTS5_CONT
26d40 45 4e 54 5f 4e 4f 4e 45 3b 0d 0a 20 20 20 20 20  ENT_NONE;..     
26d50 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72   }..    }..    r
26d60 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a  eturn rc;..  }..
26d70 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
26d80 73 74 72 6e 69 63 6d 70 28 22 63 6f 6e 74 65 6e  strnicmp("conten
26d90 74 5f 72 6f 77 69 64 22 2c 20 7a 43 6d 64 2c 20  t_rowid", zCmd, 
26da0 6e 43 6d 64 29 3d 3d 30 20 29 7b 0d 0a 20 20 20  nCmd)==0 ){..   
26db0 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 7a 43   if( pConfig->zC
26dc0 6f 6e 74 65 6e 74 52 6f 77 69 64 20 29 7b 0d 0a  ontentRowid ){..
26dd0 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73        *pzErr = s
26de0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
26df0 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 74 65 6e 74  multiple content
26e00 5f 72 6f 77 69 64 3d 2e 2e 2e 20 64 69 72 65 63  _rowid=... direc
26e10 74 69 76 65 73 22 29 3b 0d 0a 20 20 20 20 20 20  tives");..      
26e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26e30 52 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a  R;..    }else{..
26e40 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
26e50 43 6f 6e 74 65 6e 74 52 6f 77 69 64 20 3d 20 73  ContentRowid = s
26e60 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75  qlite3Fts5Strndu
26e70 70 28 26 72 63 2c 20 7a 41 72 67 2c 20 2d 31 29  p(&rc, zArg, -1)
26e80 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65  ;..    }..    re
26e90 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 0d  turn rc;..  }...
26ea0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
26eb0 74 72 6e 69 63 6d 70 28 22 63 6f 6c 75 6d 6e 73  trnicmp("columns
26ec0 69 7a 65 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64  ize", zCmd, nCmd
26ed0 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69 66 28  )==0 ){..    if(
26ee0 20 28 7a 41 72 67 5b 30 5d 21 3d 27 30 27 20 26   (zArg[0]!='0' &
26ef0 26 20 7a 41 72 67 5b 30 5d 21 3d 27 31 27 29 20  & zArg[0]!='1') 
26f00 7c 7c 20 7a 41 72 67 5b 31 5d 21 3d 27 5c 30 27  || zArg[1]!='\0'
26f10 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 7a 45 72   ){..      *pzEr
26f20 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
26f30 6e 74 66 28 22 6d 61 6c 66 6f 72 6d 65 64 20 63  ntf("malformed c
26f40 6f 6c 75 6d 6e 73 69 7a 65 3d 2e 2e 2e 20 64 69  olumnsize=... di
26f50 72 65 63 74 69 76 65 22 29 3b 0d 0a 20 20 20 20  rective");..    
26f60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26f70 52 4f 52 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b  ROR;..    }else{
26f80 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ..      pConfig-
26f90 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20 3d 20 28  >bColumnsize = (
26fa0 7a 41 72 67 5b 30 5d 3d 3d 27 31 27 29 3b 0d 0a  zArg[0]=='1');..
26fb0 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72      }..    retur
26fc0 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  n rc;..  }....  
26fd0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
26fe0 69 63 6d 70 28 22 64 65 74 61 69 6c 22 2c 20 7a  icmp("detail", z
26ff0 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b  Cmd, nCmd)==0 ){
27000 0d 0a 20 20 20 20 63 6f 6e 73 74 20 46 74 73 35  ..    const Fts5
27010 45 6e 75 6d 20 61 44 65 74 61 69 6c 5b 5d 20 3d  Enum aDetail[] =
27020 20 7b 0d 0a 20 20 20 20 20 20 7b 20 22 6e 6f 6e   {..      { "non
27030 65 22 2c 20 46 54 53 35 5f 44 45 54 41 49 4c 5f  e", FTS5_DETAIL_
27040 4e 4f 4e 45 20 7d 2c 0d 0a 20 20 20 20 20 20 7b  NONE },..      {
27050 20 22 66 75 6c 6c 22 2c 20 46 54 53 35 5f 44 45   "full", FTS5_DE
27060 54 41 49 4c 5f 46 55 4c 4c 20 7d 2c 0d 0a 20 20  TAIL_FULL },..  
27070 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 73 22 2c      { "columns",
27080 20 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c   FTS5_DETAIL_COL
27090 55 4d 4e 53 20 7d 2c 0d 0a 20 20 20 20 20 20 7b  UMNS },..      {
270a0 20 30 2c 20 30 20 7d 0d 0a 20 20 20 20 7d 3b 0d   0, 0 }..    };.
270b0 0a 0d 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d  ...    if( (rc =
270c0 20 66 74 73 35 43 6f 6e 66 69 67 53 65 74 45 6e   fts5ConfigSetEn
270d0 75 6d 28 61 44 65 74 61 69 6c 2c 20 7a 41 72 67  um(aDetail, zArg
270e0 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  , &pConfig->eDet
270f0 61 69 6c 29 29 20 29 7b 0d 0a 20 20 20 20 20 20  ail)) ){..      
27100 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
27110 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c 66 6f 72  _mprintf("malfor
27120 6d 65 64 20 64 65 74 61 69 6c 3d 2e 2e 2e 20 64  med detail=... d
27130 69 72 65 63 74 69 76 65 22 29 3b 0d 0a 20 20 20  irective");..   
27140 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 72   }..    return r
27150 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 7a  c;..  }....  *pz
27160 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
27170 72 69 6e 74 66 28 22 75 6e 72 65 63 6f 67 6e 69  rintf("unrecogni
27180 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 5c 22 25 2e  zed option: \"%.
27190 2a 73 5c 22 22 2c 20 6e 43 6d 64 2c 20 7a 43 6d  *s\"", nCmd, zCm
271a0 64 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51  d);..  return SQ
271b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 7d 0d 0a  LITE_ERROR;..}..
271c0 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f 63 61 74  ../*..** Allocat
271d0 65 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  e an instance of
271e0 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 6f 6b   the default tok
271f0 65 6e 69 7a 65 72 20 28 22 73 69 6d 70 6c 65 22  enizer ("simple"
27200 29 20 61 74 20 0d 0a 2a 2a 20 46 74 73 35 43 6f  ) at ..** Fts5Co
27210 6e 66 69 67 2e 70 54 6f 6b 65 6e 69 7a 65 72 2e  nfig.pTokenizer.
27220 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
27230 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
27240 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
27250 72 6f 72 0d 0a 2a 2a 20 63 6f 64 65 20 69 66 20  ror..** code if 
27260 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
27270 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
27280 20 66 74 73 35 43 6f 6e 66 69 67 44 65 66 61 75   fts5ConfigDefau
27290 6c 74 54 6f 6b 65 6e 69 7a 65 72 28 46 74 73 35  ltTokenizer(Fts5
272a0 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c  Global *pGlobal,
272b0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
272c0 6e 66 69 67 29 7b 0d 0a 20 20 61 73 73 65 72 74  nfig){..  assert
272d0 28 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 3d  ( pConfig->pTok=
272e0 3d 30 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e 70  =0 && pConfig->p
272f0 54 6f 6b 41 70 69 3d 3d 30 20 29 3b 0d 0a 20 20  TokApi==0 );..  
27300 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
27310 73 35 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 0d  s5GetTokenizer(.
27320 0a 20 20 20 20 20 20 70 47 6c 6f 62 61 6c 2c 20  .      pGlobal, 
27330 30 2c 20 30 2c 20 26 70 43 6f 6e 66 69 67 2d 3e  0, 0, &pConfig->
27340 70 54 6f 6b 2c 20 26 70 43 6f 6e 66 69 67 2d 3e  pTok, &pConfig->
27350 70 54 6f 6b 41 70 69 2c 20 30 0d 0a 20 20 29 3b  pTokApi, 0..  );
27360 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 47 6f  ..}..../*..** Go
27370 62 62 6c 65 20 75 70 20 74 68 65 20 66 69 72 73  bble up the firs
27380 74 20 62 61 72 65 77 6f 72 64 20 6f 72 20 71 75  t bareword or qu
27390 6f 74 65 64 20 77 6f 72 64 20 66 72 6f 6d 20 74  oted word from t
273a0 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  he input buffer 
273b0 7a 49 6e 2e 0d 0a 2a 2a 20 52 65 74 75 72 6e 20  zIn...** Return 
273c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
273d0 20 63 68 61 72 61 63 74 65 72 20 69 6d 6d 65 64   character immed
273e0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
273f0 20 74 68 65 20 6c 61 73 74 20 69 6e 0d 0a 2a 2a   the last in..**
27400 20 74 68 65 20 67 6f 62 62 6c 65 64 20 77 6f 72   the gobbled wor
27410 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
27420 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   or a NULL point
27430 65 72 20 6f 74 68 65 72 77 69 73 65 20 28 66 61  er otherwise (fa
27440 69 6c 65 64 0d 0a 2a 2a 20 74 6f 20 66 69 6e 64  iled..** to find
27450 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63 68 61   close-quote cha
27460 72 61 63 74 65 72 29 2e 0d 0a 2a 2a 0d 0a 2a 2a  racter)...**..**
27470 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
27480 67 2c 20 73 65 74 20 70 7a 4f 75 74 20 74 6f 20  g, set pzOut to 
27490 70 6f 69 6e 74 20 74 6f 20 61 20 6e 65 77 20 62  point to a new b
274a0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
274b0 20 61 0d 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a..** nul-termi
274c0 6e 61 74 65 64 2c 20 64 65 71 75 6f 74 65 64 20  nated, dequoted 
274d0 63 6f 70 79 20 6f 66 20 74 68 65 20 67 6f 62 62  copy of the gobb
274e0 6c 65 64 20 77 6f 72 64 2e 20 49 66 20 74 68 65  led word. If the
274f0 20 77 6f 72 64 20 77 61 73 0d 0a 2a 2a 20 71 75   word was..** qu
27500 6f 74 65 64 2c 20 2a 70 62 51 75 6f 74 65 64 20  oted, *pbQuoted 
27510 69 73 20 61 6c 73 6f 20 73 65 74 20 74 6f 20 31  is also set to 1
27520 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27530 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 2a 70  g...**..** If *p
27540 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e  Rc is other than
27550 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
27560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27570 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 0d 0a   called, it is..
27580 2a 2a 20 61 20 6e 6f 2d 6f 70 20 28 4e 55 4c 4c  ** a no-op (NULL
27590 20 69 73 20 72 65 74 75 72 6e 65 64 29 2e 20 4f   is returned). O
275a0 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
275b0 4f 4f 4d 20 6f 63 63 75 72 73 20 77 69 74 68 69  OOM occurs withi
275c0 6e 20 74 68 69 73 0d 0a 2a 2a 20 66 75 6e 63 74  n this..** funct
275d0 69 6f 6e 2c 20 2a 70 52 63 20 69 73 20 73 65 74  ion, *pRc is set
275e0 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
275f0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27600 67 2e 20 2a 70 52 63 20 69 73 20 2a 6e 6f 74 2a  g. *pRc is *not*
27610 0d 0a 2a 2a 20 73 65 74 20 69 66 20 61 20 70 61  ..** set if a pa
27620 72 73 65 20 65 72 72 6f 72 20 28 66 61 69 6c 65  rse error (faile
27630 64 20 74 6f 20 66 69 6e 64 20 63 6c 6f 73 65 20  d to find close 
27640 71 75 6f 74 65 29 20 6f 63 63 75 72 73 2e 0d 0a  quote) occurs...
27650 2a 2f 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  */..static const
27660 20 63 68 61 72 20 2a 66 74 73 35 43 6f 6e 66 69   char *fts5Confi
27670 67 47 6f 62 62 6c 65 57 6f 72 64 28 0d 0a 20 20  gGobbleWord(..  
27680 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276a0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
276b0 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73   code */..  cons
276c0 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 20 20 20  t char *zIn,    
276d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
276e0 75 66 66 65 72 20 74 6f 20 67 6f 62 62 6c 65 20  uffer to gobble 
276f0 73 74 72 69 6e 67 2f 62 61 72 65 77 6f 72 64 20  string/bareword 
27700 66 72 6f 6d 20 2a 2f 0d 0a 20 20 63 68 61 72 20  from */..  char 
27710 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20  **pzOut,        
27720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
27730 54 3a 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66  T: malloc'd buff
27740 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 74  er containing st
27750 72 2f 62 77 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a  r/bw */..  int *
27760 70 62 51 75 6f 74 65 64 20 20 20 20 20 20 20 20  pbQuoted        
27770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
27780 54 3a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  T: Set to true i
27790 66 20 64 65 71 75 6f 74 69 6e 67 20 72 65 71 75  f dequoting requ
277a0 69 72 65 64 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 63  ired */..){..  c
277b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20  onst char *zRet 
277c0 3d 20 30 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74 65  = 0;....  sqlite
277d0 33 5f 69 6e 74 36 34 20 6e 49 6e 20 3d 20 73 74  3_int64 nIn = st
277e0 72 6c 65 6e 28 7a 49 6e 29 3b 0d 0a 20 20 63 68  rlen(zIn);..  ch
277f0 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
27800 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 49 6e 2b  e3_malloc64(nIn+
27810 31 29 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28  1);....  assert(
27820 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
27830 20 29 3b 0d 0a 20 20 2a 70 62 51 75 6f 74 65 64   );..  *pbQuoted
27840 20 3d 20 30 3b 0d 0a 20 20 2a 70 7a 4f 75 74 20   = 0;..  *pzOut 
27850 3d 20 30 3b 0d 0a 0d 0a 20 20 69 66 28 20 7a 4f  = 0;....  if( zO
27860 75 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 2a 70  ut==0 ){..    *p
27870 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
27880 4d 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20  M;..  }else{..  
27890 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 7a    memcpy(zOut, z
278a0 49 6e 2c 20 6e 49 6e 2b 31 29 3b 0d 0a 20 20 20  In, nIn+1);..   
278b0 20 69 66 28 20 66 74 73 35 5f 69 73 6f 70 65 6e   if( fts5_isopen
278c0 71 75 6f 74 65 28 7a 4f 75 74 5b 30 5d 29 20 29  quote(zOut[0]) )
278d0 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 69 69 20  {..      int ii 
278e0 3d 20 66 74 73 35 44 65 71 75 6f 74 65 28 7a 4f  = fts5Dequote(zO
278f0 75 74 29 3b 0d 0a 20 20 20 20 20 20 7a 52 65 74  ut);..      zRet
27900 20 3d 20 26 7a 49 6e 5b 69 69 5d 3b 0d 0a 20 20   = &zIn[ii];..  
27910 20 20 20 20 2a 70 62 51 75 6f 74 65 64 20 3d 20      *pbQuoted = 
27920 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a  1;..    }else{..
27930 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
27940 35 43 6f 6e 66 69 67 53 6b 69 70 42 61 72 65 77  5ConfigSkipBarew
27950 6f 72 64 28 7a 49 6e 29 3b 0d 0a 20 20 20 20 20  ord(zIn);..     
27960 20 69 66 28 20 7a 52 65 74 20 29 7b 0d 0a 20 20   if( zRet ){..  
27970 20 20 20 20 20 20 7a 4f 75 74 5b 7a 52 65 74 2d        zOut[zRet-
27980 7a 49 6e 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20 20  zIn] = '\0';..  
27990 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
279a0 7d 0d 0a 0d 0a 20 20 69 66 28 20 7a 52 65 74 3d  }....  if( zRet=
279b0 3d 30 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74  =0 ){..    sqlit
279c0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0d 0a  e3_free(zOut);..
279d0 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2a 70    }else{..    *p
279e0 7a 4f 75 74 20 3d 20 7a 4f 75 74 3b 0d 0a 20 20  zOut = zOut;..  
279f0 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 7a 52  }....  return zR
27a00 65 74 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63  et;..}....static
27a10 20 69 6e 74 20 66 74 73 35 43 6f 6e 66 69 67 50   int fts5ConfigP
27a20 61 72 73 65 43 6f 6c 75 6d 6e 28 0d 0a 20 20 46  arseColumn(..  F
27a30 74 73 35 43 6f 6e 66 69 67 20 2a 70 2c 20 0d 0a  ts5Config *p, ..
27a40 20 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 0d 0a    char *zCol, ..
27a50 20 20 63 68 61 72 20 2a 7a 41 72 67 2c 20 0d 0a    char *zArg, ..
27a60 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0d 0a    char **pzErr..
27a70 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ){..  int rc = S
27a80 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28  QLITE_OK;..  if(
27a90 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
27aa0 63 6d 70 28 7a 43 6f 6c 2c 20 46 54 53 35 5f 52  cmp(zCol, FTS5_R
27ab0 41 4e 4b 5f 4e 41 4d 45 29 20 0d 0a 20 20 20 7c  ANK_NAME) ..   |
27ac0 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  | 0==sqlite3_str
27ad0 69 63 6d 70 28 7a 43 6f 6c 2c 20 46 54 53 35 5f  icmp(zCol, FTS5_
27ae0 52 4f 57 49 44 5f 4e 41 4d 45 29 20 0d 0a 20 20  ROWID_NAME) ..  
27af0 29 7b 0d 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d  ){..    *pzErr =
27b00 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
27b10 28 22 72 65 73 65 72 76 65 64 20 66 74 73 35 20  ("reserved fts5 
27b20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
27b30 2c 20 7a 43 6f 6c 29 3b 0d 0a 20 20 20 20 72 63  , zCol);..    rc
27b40 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
27b50 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ..  }else if( zA
27b60 72 67 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 30  rg ){..    if( 0
27b70 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
27b80 70 28 7a 41 72 67 2c 20 22 75 6e 69 6e 64 65 78  p(zArg, "unindex
27b90 65 64 22 29 20 29 7b 0d 0a 20 20 20 20 20 20 70  ed") ){..      p
27ba0 2d 3e 61 62 55 6e 69 6e 64 65 78 65 64 5b 70 2d  ->abUnindexed[p-
27bb0 3e 6e 43 6f 6c 5d 20 3d 20 31 3b 0d 0a 20 20 20  >nCol] = 1;..   
27bc0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 2a   }else{..      *
27bd0 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
27be0 6d 70 72 69 6e 74 66 28 22 75 6e 72 65 63 6f 67  mprintf("unrecog
27bf0 6e 69 7a 65 64 20 63 6f 6c 75 6d 6e 20 6f 70 74  nized column opt
27c00 69 6f 6e 3a 20 25 73 22 2c 20 7a 41 72 67 29 3b  ion: %s", zArg);
27c10 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ..      rc = SQL
27c20 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20  ITE_ERROR;..    
27c30 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 70 2d 3e 61  }..  }....  p->a
27c40 7a 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 20  zCol[p->nCol++] 
27c50 3d 20 7a 43 6f 6c 3b 0d 0a 20 20 72 65 74 75 72  = zCol;..  retur
27c60 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a  n rc;..}..../*..
27c70 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
27c80 46 74 73 35 43 6f 6e 66 69 67 2e 7a 43 6f 6e 74  Fts5Config.zCont
27c90 65 6e 74 45 78 70 72 6c 69 73 74 20 73 74 72 69  entExprlist stri
27ca0 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ng...*/..static 
27cb0 69 6e 74 20 66 74 73 35 43 6f 6e 66 69 67 4d 61  int fts5ConfigMa
27cc0 6b 65 45 78 70 72 6c 69 73 74 28 46 74 73 35 43  keExprlist(Fts5C
27cd0 6f 6e 66 69 67 20 2a 70 29 7b 0d 0a 20 20 69 6e  onfig *p){..  in
27ce0 74 20 69 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d  t i;..  int rc =
27cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 46   SQLITE_OK;..  F
27d00 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
27d10 7b 30 2c 20 30 2c 20 30 7d 3b 0d 0a 0d 0a 20 20  {0, 0, 0};....  
27d20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
27d30 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
27d40 63 2c 20 26 62 75 66 2c 20 22 54 2e 25 51 22 2c  c, &buf, "T.%Q",
27d50 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69   p->zContentRowi
27d60 64 29 3b 0d 0a 20 20 69 66 28 20 70 2d 3e 65 43  d);..  if( p->eC
27d70 6f 6e 74 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e  ontent!=FTS5_CON
27d80 54 45 4e 54 5f 4e 4f 4e 45 20 29 7b 0d 0a 20 20  TENT_NONE ){..  
27d90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
27da0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  nCol; i++){..   
27db0 20 20 20 69 66 28 20 70 2d 3e 65 43 6f 6e 74 65     if( p->eConte
27dc0 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54  nt==FTS5_CONTENT
27dd0 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0d 0a 20 20  _EXTERNAL ){..  
27de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
27df0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
27e00 6e 74 66 28 26 72 63 2c 20 26 62 75 66 2c 20 22  ntf(&rc, &buf, "
27e10 2c 20 54 2e 25 51 22 2c 20 70 2d 3e 61 7a 43 6f  , T.%Q", p->azCo
27e20 6c 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 20 7d 65  l[i]);..      }e
27e30 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 73 71  lse{..        sq
27e40 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
27e50 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
27e60 20 26 62 75 66 2c 20 22 2c 20 54 2e 63 25 64 22   &buf, ", T.c%d"
27e70 2c 20 69 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  , i);..      }..
27e80 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
27e90 61 73 73 65 72 74 28 20 70 2d 3e 7a 43 6f 6e 74  assert( p->zCont
27ea0 65 6e 74 45 78 70 72 6c 69 73 74 3d 3d 30 20 29  entExprlist==0 )
27eb0 3b 0d 0a 20 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74  ;..  p->zContent
27ec0 45 78 70 72 6c 69 73 74 20 3d 20 28 63 68 61 72  Exprlist = (char
27ed0 2a 29 62 75 66 2e 70 3b 0d 0a 20 20 72 65 74 75  *)buf.p;..  retu
27ee0 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  rn rc;..}..../*.
27ef0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 6e 41  .** Arguments nA
27f00 72 67 2f 61 7a 41 72 67 20 63 6f 6e 74 61 69 6e  rg/azArg contain
27f10 20 74 68 65 20 73 74 72 69 6e 67 20 61 72 67 75   the string argu
27f20 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
27f30 74 68 65 20 78 43 72 65 61 74 65 0d 0a 2a 2a 20  the xCreate..** 
27f40 6f 72 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68  or xConnect meth
27f50 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
27f60 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
27f70 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
27f80 74 6f 20 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  to ..** allocate
27f90 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
27fa0 46 74 73 35 43 6f 6e 66 69 67 20 63 6f 6e 74 61  Fts5Config conta
27fb0 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
27fc0 73 20 6f 66 20 70 61 72 73 69 6e 67 0d 0a 2a 2a  s of parsing..**
27fd0 20 74 68 6f 73 65 20 61 72 67 75 6d 65 6e 74 73   those arguments
27fe0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75 63  ...**..** If suc
27ff0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
28000 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
28010 6e 64 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  nd *ppOut is set
28020 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
28030 0d 0a 2a 2a 20 6e 65 77 20 46 74 73 35 43 6f 6e  ..** new Fts5Con
28040 66 69 67 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  fig object. If a
28050 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
28060 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
28070 63 6f 64 65 20 69 73 20 0d 0a 2a 2a 20 72 65 74  code is ..** ret
28080 75 72 6e 65 64 2c 20 2a 70 70 4f 75 74 20 69 73  urned, *ppOut is
28090 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
280a0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
280b0 65 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  e may be left in
280c0 0d 0a 2a 2a 20 2a 70 7a 45 72 72 2e 20 49 74 20  ..** *pzErr. It 
280d0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
280e0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
280f0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
28100 79 20 66 72 65 65 20 61 6e 79 20 0d 0a 2a 2a 20  y free any ..** 
28110 73 75 63 68 20 65 72 72 6f 72 20 6d 65 73 73 61  such error messa
28120 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
28130 5f 66 72 65 65 28 29 2e 0d 0a 2a 2f 0d 0a 73 74  _free()...*/..st
28140 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
28150 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28  Fts5ConfigParse(
28160 0d 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a  ..  Fts5Global *
28170 70 47 6c 6f 62 61 6c 2c 0d 0a 20 20 73 71 6c 69  pGlobal,..  sqli
28180 74 65 33 20 2a 64 62 2c 0d 0a 20 20 69 6e 74 20  te3 *db,..  int 
28190 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
281a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
281b0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
281c0 74 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63  ts */..  const c
281d0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
281e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
281f0 79 20 6f 66 20 6e 41 72 67 20 43 52 45 41 54 45  y of nArg CREATE
28200 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 61   VIRTUAL TABLE a
28210 72 67 73 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f  rgs */..  Fts5Co
28220 6e 66 69 67 20 2a 2a 70 70 4f 75 74 2c 20 20 20  nfig **ppOut,   
28230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
28240 3a 20 52 65 73 75 6c 74 73 20 6f 66 20 70 61 72  : Results of par
28250 73 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a  se */..  char **
28260 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20  pzErr           
28270 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
28280 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   Error message *
28290 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20  /..){..  int rc 
282a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
282b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
282c0 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 46 74  rn code */..  Ft
282d0 73 35 43 6f 6e 66 69 67 20 2a 70 52 65 74 3b 20  s5Config *pRet; 
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
282f0 20 4e 65 77 20 6f 62 6a 65 63 74 20 74 6f 20 72   New object to r
28300 65 74 75 72 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20  eturn */..  int 
28310 69 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  i;..  sqlite3_in
28320 74 36 34 20 6e 42 79 74 65 3b 0d 0a 0d 0a 20 20  t64 nByte;....  
28330 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 20 3d 20  *ppOut = pRet = 
28340 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 73 71 6c  (Fts5Config*)sql
28350 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
28360 6f 66 28 46 74 73 35 43 6f 6e 66 69 67 29 29 3b  of(Fts5Config));
28370 0d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ..  if( pRet==0 
28380 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28390 4e 4f 4d 45 4d 3b 0d 0a 20 20 6d 65 6d 73 65 74  NOMEM;..  memset
283a0 28 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (pRet, 0, sizeof
283b0 28 46 74 73 35 43 6f 6e 66 69 67 29 29 3b 0d 0a  (Fts5Config));..
283c0 20 20 70 52 65 74 2d 3e 64 62 20 3d 20 64 62 3b    pRet->db = db;
283d0 0d 0a 20 20 70 52 65 74 2d 3e 69 43 6f 6f 6b 69  ..  pRet->iCooki
283e0 65 20 3d 20 2d 31 3b 0d 0a 0d 0a 20 20 6e 42 79  e = -1;....  nBy
283f0 74 65 20 3d 20 6e 41 72 67 20 2a 20 28 73 69 7a  te = nArg * (siz
28400 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a  eof(char*) + siz
28410 65 6f 66 28 75 38 29 29 3b 0d 0a 20 20 70 52 65  eof(u8));..  pRe
28420 74 2d 3e 61 7a 43 6f 6c 20 3d 20 28 63 68 61 72  t->azCol = (char
28430 2a 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  **)sqlite3Fts5Ma
28440 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
28450 79 74 65 29 3b 0d 0a 20 20 70 52 65 74 2d 3e 61  yte);..  pRet->a
28460 62 55 6e 69 6e 64 65 78 65 64 20 3d 20 28 75 38  bUnindexed = (u8
28470 2a 29 26 70 52 65 74 2d 3e 61 7a 43 6f 6c 5b 6e  *)&pRet->azCol[n
28480 41 72 67 5d 3b 0d 0a 20 20 70 52 65 74 2d 3e 7a  Arg];..  pRet->z
28490 44 62 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  Db = sqlite3Fts5
284a0 53 74 72 6e 64 75 70 28 26 72 63 2c 20 61 7a 41  Strndup(&rc, azA
284b0 72 67 5b 31 5d 2c 20 2d 31 29 3b 0d 0a 20 20 70  rg[1], -1);..  p
284c0 52 65 74 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Ret->zName = sql
284d0 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28  ite3Fts5Strndup(
284e0 26 72 63 2c 20 61 7a 41 72 67 5b 32 5d 2c 20 2d  &rc, azArg[2], -
284f0 31 29 3b 0d 0a 20 20 70 52 65 74 2d 3e 62 43 6f  1);..  pRet->bCo
28500 6c 75 6d 6e 73 69 7a 65 20 3d 20 31 3b 0d 0a 20  lumnsize = 1;.. 
28510 20 70 52 65 74 2d 3e 65 44 65 74 61 69 6c 20 3d   pRet->eDetail =
28520 20 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c   FTS5_DETAIL_FUL
28530 4c 3b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  L;..#ifdef SQLIT
28540 45 5f 44 45 42 55 47 0d 0a 20 20 70 52 65 74 2d  E_DEBUG..  pRet-
28550 3e 62 50 72 65 66 69 78 49 6e 64 65 78 20 3d 20  >bPrefixIndex = 
28560 31 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 66  1;..#endif..  if
28570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28580 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
28590 6d 70 28 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c 20  mp(pRet->zName, 
285a0 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45 29 3d  FTS5_RANK_NAME)=
285b0 3d 30 20 29 7b 0d 0a 20 20 20 20 2a 70 7a 45 72  =0 ){..    *pzEr
285c0 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
285d0 6e 74 66 28 22 72 65 73 65 72 76 65 64 20 66 74  ntf("reserved ft
285e0 73 35 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25  s5 table name: %
285f0 73 22 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 29  s", pRet->zName)
28600 3b 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ;..    rc = SQLI
28610 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 7d 0d 0a  TE_ERROR;..  }..
28620 0d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 72 63 3d  ..  for(i=3; rc=
28630 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
28640 6e 41 72 67 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  nArg; i++){..   
28650 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
28660 69 67 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0d 0a  ig = azArg[i];..
28670 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28680 7a 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f  z;..    char *zO
28690 6e 65 20 3d 20 30 3b 0d 0a 20 20 20 20 63 68 61  ne = 0;..    cha
286a0 72 20 2a 7a 54 77 6f 20 3d 20 30 3b 0d 0a 20 20  r *zTwo = 0;..  
286b0 20 20 69 6e 74 20 62 4f 70 74 69 6f 6e 20 3d 20    int bOption = 
286c0 30 3b 0d 0a 20 20 20 20 69 6e 74 20 62 4d 75 73  0;..    int bMus
286d0 74 42 65 43 6f 6c 20 3d 20 30 3b 0d 0a 0d 0a 20  tBeCol = 0;.... 
286e0 20 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69     z = fts5Confi
286f0 67 47 6f 62 62 6c 65 57 6f 72 64 28 26 72 63 2c  gGobbleWord(&rc,
28700 20 7a 4f 72 69 67 2c 20 26 7a 4f 6e 65 2c 20 26   zOrig, &zOne, &
28710 62 4d 75 73 74 42 65 43 6f 6c 29 3b 0d 0a 20 20  bMustBeCol);..  
28720 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69 67    z = fts5Config
28730 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 7a  SkipWhitespace(z
28740 29 3b 0d 0a 20 20 20 20 69 66 28 20 7a 20 26 26  );..    if( z &&
28750 20 2a 7a 3d 3d 27 3d 27 20 29 7b 0d 0a 20 20 20   *z=='=' ){..   
28760 20 20 20 62 4f 70 74 69 6f 6e 20 3d 20 31 3b 0d     bOption = 1;.
28770 0a 20 20 20 20 20 20 7a 2b 2b 3b 0d 0a 20 20 20  .      z++;..   
28780 20 20 20 69 66 28 20 62 4d 75 73 74 42 65 43 6f     if( bMustBeCo
28790 6c 20 29 20 7a 20 3d 20 30 3b 0d 0a 20 20 20 20  l ) z = 0;..    
287a0 7d 0d 0a 20 20 20 20 7a 20 3d 20 66 74 73 35 43  }..    z = fts5C
287b0 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73 70  onfigSkipWhitesp
287c0 61 63 65 28 7a 29 3b 0d 0a 20 20 20 20 69 66 28  ace(z);..    if(
287d0 20 7a 20 26 26 20 7a 5b 30 5d 20 29 7b 0d 0a 20   z && z[0] ){.. 
287e0 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
287f0 0d 0a 20 20 20 20 20 20 7a 20 3d 20 66 74 73 35  ..      z = fts5
28800 43 6f 6e 66 69 67 47 6f 62 62 6c 65 57 6f 72 64  ConfigGobbleWord
28810 28 26 72 63 2c 20 7a 2c 20 26 7a 54 77 6f 2c 20  (&rc, z, &zTwo, 
28820 26 62 44 75 6d 6d 79 29 3b 0d 0a 20 20 20 20 20  &bDummy);..     
28830 20 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d 20 29   if( z && z[0] )
28840 20 7a 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a   z = 0;..    }..
28850 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
28860 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20  LITE_OK ){..    
28870 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0d 0a 20    if( z==0 ){.. 
28880 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
28890 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
288a0 22 70 61 72 73 65 20 65 72 72 6f 72 20 69 6e 20  "parse error in 
288b0 5c 22 25 73 5c 22 22 2c 20 7a 4f 72 69 67 29 3b  \"%s\"", zOrig);
288c0 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ..        rc = S
288d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20  QLITE_ERROR;..  
288e0 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
288f0 20 20 20 20 69 66 28 20 62 4f 70 74 69 6f 6e 20      if( bOption 
28900 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63  ){..          rc
28910 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 50 61 72   = fts5ConfigPar
28920 73 65 53 70 65 63 69 61 6c 28 70 47 6c 6f 62 61  seSpecial(pGloba
28930 6c 2c 20 70 52 65 74 2c 20 7a 4f 6e 65 2c 20 7a  l, pRet, zOne, z
28940 54 77 6f 3f 7a 54 77 6f 3a 22 22 2c 20 70 7a 45  Two?zTwo:"", pzE
28950 72 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65  rr);..        }e
28960 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse{..          
28970 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 50  rc = fts5ConfigP
28980 61 72 73 65 43 6f 6c 75 6d 6e 28 70 52 65 74 2c  arseColumn(pRet,
28990 20 7a 4f 6e 65 2c 20 7a 54 77 6f 2c 20 70 7a 45   zOne, zTwo, pzE
289a0 72 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rr);..          
289b0 7a 4f 6e 65 20 3d 20 30 3b 0d 0a 20 20 20 20 20  zOne = 0;..     
289c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
289d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 71 6c 69     }....    sqli
289e0 74 65 33 5f 66 72 65 65 28 7a 4f 6e 65 29 3b 0d  te3_free(zOne);.
289f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28a00 65 28 7a 54 77 6f 29 3b 0d 0a 20 20 7d 0d 0a 0d  e(zTwo);..  }...
28a10 0a 20 20 2f 2a 20 49 66 20 61 20 74 6f 6b 65 6e  .  /* If a token
28a20 69 7a 65 72 3d 20 6f 70 74 69 6f 6e 20 77 61 73  izer= option was
28a30 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 70 61   successfully pa
28a40 72 73 65 64 2c 20 74 68 65 20 74 6f 6b 65 6e 69  rsed, the tokeni
28a50 7a 65 72 20 68 61 73 0d 0a 20 20 2a 2a 20 61 6c  zer has..  ** al
28a60 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
28a70 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
28a80 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 69 6e 73   allocate an ins
28a90 74 61 6e 63 65 20 6f 66 20 74 68 65 20 64 65 66  tance of the def
28aa0 61 75 6c 74 0d 0a 20 20 2a 2a 20 74 6f 6b 65 6e  ault..  ** token
28ab0 69 7a 65 72 20 28 75 6e 69 63 6f 64 65 36 31 29  izer (unicode61)
28ac0 20 6e 6f 77 2e 20 20 2a 2f 0d 0a 20 20 69 66 28   now.  */..  if(
28ad0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28ae0 26 20 70 52 65 74 2d 3e 70 54 6f 6b 3d 3d 30 20  & pRet->pTok==0 
28af0 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 66 74 73  ){..    rc = fts
28b00 35 43 6f 6e 66 69 67 44 65 66 61 75 6c 74 54 6f  5ConfigDefaultTo
28b10 6b 65 6e 69 7a 65 72 28 70 47 6c 6f 62 61 6c 2c  kenizer(pGlobal,
28b20 20 70 52 65 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a   pRet);..  }....
28b30 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 43 6f 6e 74    /* If no zCont
28b40 65 6e 74 20 6f 70 74 69 6f 6e 20 77 61 73 20 73  ent option was s
28b50 70 65 63 69 66 69 65 64 2c 20 66 69 6c 6c 20 69  pecified, fill i
28b60 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  n the default va
28b70 6c 75 65 73 2e 20 2a 2f 0d 0a 20 20 69 66 28 20  lues. */..  if( 
28b80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28b90 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 3d   pRet->zContent=
28ba0 3d 30 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73 74  =0 ){..    const
28bb0 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
28bc0 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
28bd0 52 65 74 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46  Ret->eContent==F
28be0 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d  TS5_CONTENT_NORM
28bf0 41 4c 20 0d 0a 20 20 20 20 20 20 20 20 20 7c 7c  AL ..         ||
28c00 20 70 52 65 74 2d 3e 65 43 6f 6e 74 65 6e 74 3d   pRet->eContent=
28c10 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f  =FTS5_CONTENT_NO
28c20 4e 45 20 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 20  NE ..    );..   
28c30 20 69 66 28 20 70 52 65 74 2d 3e 65 43 6f 6e 74   if( pRet->eCont
28c40 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e  ent==FTS5_CONTEN
28c50 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0d 0a 20 20 20  T_NORMAL ){..   
28c60 20 20 20 7a 54 61 69 6c 20 3d 20 22 63 6f 6e 74     zTail = "cont
28c70 65 6e 74 22 3b 0d 0a 20 20 20 20 7d 65 6c 73 65  ent";..    }else
28c80 20 69 66 28 20 70 52 65 74 2d 3e 62 43 6f 6c 75   if( pRet->bColu
28c90 6d 6e 73 69 7a 65 20 29 7b 0d 0a 20 20 20 20 20  mnsize ){..     
28ca0 20 7a 54 61 69 6c 20 3d 20 22 64 6f 63 73 69 7a   zTail = "docsiz
28cb0 65 22 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  e";..    }....  
28cc0 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0d 0a    if( zTail ){..
28cd0 20 20 20 20 20 20 70 52 65 74 2d 3e 7a 43 6f 6e        pRet->zCon
28ce0 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 74  tent = sqlite3Ft
28cf0 73 35 4d 70 72 69 6e 74 66 28 0d 0a 20 20 20 20  s5Mprintf(..    
28d00 20 20 20 20 20 20 26 72 63 2c 20 22 25 51 2e 27        &rc, "%Q.'
28d10 25 71 5f 25 73 27 22 2c 20 70 52 65 74 2d 3e 7a  %q_%s'", pRet->z
28d20 44 62 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c  Db, pRet->zName,
28d30 20 7a 54 61 69 6c 0d 0a 20 20 20 20 20 20 29 3b   zTail..      );
28d40 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
28d50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28d60 5f 4f 4b 20 26 26 20 70 52 65 74 2d 3e 7a 43 6f  _OK && pRet->zCo
28d70 6e 74 65 6e 74 52 6f 77 69 64 3d 3d 30 20 29 7b  ntentRowid==0 ){
28d80 0d 0a 20 20 20 20 70 52 65 74 2d 3e 7a 43 6f 6e  ..    pRet->zCon
28d90 74 65 6e 74 52 6f 77 69 64 20 3d 20 73 71 6c 69  tentRowid = sqli
28da0 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26  te3Fts5Strndup(&
28db0 72 63 2c 20 22 72 6f 77 69 64 22 2c 20 2d 31 29  rc, "rowid", -1)
28dc0 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 46  ;..  }....  /* F
28dd0 6f 72 6d 75 6c 61 74 65 20 74 68 65 20 7a 43 6f  ormulate the zCo
28de0 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 20 74 65  ntentExprlist te
28df0 78 74 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d  xt */..  if( rc=
28e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
28e10 20 20 20 72 63 20 3d 20 66 74 73 35 43 6f 6e 66     rc = fts5Conf
28e20 69 67 4d 61 6b 65 45 78 70 72 6c 69 73 74 28 70  igMakeExprlist(p
28e30 52 65 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  Ret);..  }....  
28e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28e50 4b 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65  K ){..    sqlite
28e60 33 46 74 73 35 43 6f 6e 66 69 67 46 72 65 65 28  3Fts5ConfigFree(
28e70 70 52 65 74 29 3b 0d 0a 20 20 20 20 2a 70 70 4f  pRet);..    *ppO
28e80 75 74 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20  ut = 0;..  }..  
28e90 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d  return rc;..}...
28ea0 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65  ./*..** Free the
28eb0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
28ec0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
28ed0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
28ee0 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  t...*/..static v
28ef0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 43  oid sqlite3Fts5C
28f00 6f 6e 66 69 67 46 72 65 65 28 46 74 73 35 43 6f  onfigFree(Fts5Co
28f10 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 29 7b 0d  nfig *pConfig){.
28f20 0a 20 20 69 66 28 20 70 43 6f 6e 66 69 67 20 29  .  if( pConfig )
28f30 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20  {..    int i;.. 
28f40 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
28f50 70 54 6f 6b 20 29 7b 0d 0a 20 20 20 20 20 20 70  pTok ){..      p
28f60 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69 2d  Config->pTokApi-
28f70 3e 78 44 65 6c 65 74 65 28 70 43 6f 6e 66 69 67  >xDelete(pConfig
28f80 2d 3e 70 54 6f 6b 29 3b 0d 0a 20 20 20 20 7d 0d  ->pTok);..    }.
28f90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28fa0 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 29 3b  e(pConfig->zDb);
28fb0 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
28fc0 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  ee(pConfig->zNam
28fd0 65 29 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30  e);..    for(i=0
28fe0 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  ; i<pConfig->nCo
28ff0 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  l; i++){..      
29000 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
29010 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 3b  nfig->azCol[i]);
29020 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c  ..    }..    sql
29030 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
29040 67 2d 3e 61 7a 43 6f 6c 29 3b 0d 0a 20 20 20 20  g->azCol);..    
29050 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
29060 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 29 3b 0d  nfig->aPrefix);.
29070 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29080 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b  e(pConfig->zRank
29090 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  );..    sqlite3_
290a0 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52  free(pConfig->zR
290b0 61 6e 6b 41 72 67 73 29 3b 0d 0a 20 20 20 20 73  ankArgs);..    s
290c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e  qlite3_free(pCon
290d0 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 29 3b 0d  fig->zContent);.
290e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
290f0 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74  e(pConfig->zCont
29100 65 6e 74 52 6f 77 69 64 29 3b 0d 0a 20 20 20 20  entRowid);..    
29110 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
29120 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 45 78  nfig->zContentEx
29130 70 72 6c 69 73 74 29 3b 0d 0a 20 20 20 20 73 71  prlist);..    sq
29140 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
29150 69 67 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a  ig);..  }..}....
29160 2f 2a 0d 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  /*..** Call sqli
29170 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
29180 28 29 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  () based on the 
29190 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
291a0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 2a  configuration..*
291b0 2a 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  * object passed 
291c0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
291d0 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 53 51 4c  ment. Return SQL
291e0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
291f0 73 66 75 6c 2c 20 6f 72 0d 0a 2a 2a 20 61 6e 20  sful, or..** an 
29200 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
29210 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
29220 63 75 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  curs...*/..stati
29230 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
29240 35 43 6f 6e 66 69 67 44 65 63 6c 61 72 65 56 74  5ConfigDeclareVt
29250 61 62 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  ab(Fts5Config *p
29260 43 6f 6e 66 69 67 29 7b 0d 0a 20 20 69 6e 74 20  Config){..  int 
29270 69 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  i;..  int rc = S
29280 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 63 68 61  QLITE_OK;..  cha
29290 72 20 2a 7a 53 71 6c 3b 0d 0a 0d 0a 20 20 7a 53  r *zSql;....  zS
292a0 71 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  ql = sqlite3Fts5
292b0 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 43 52  Mprintf(&rc, "CR
292c0 45 41 54 45 20 54 41 42 4c 45 20 78 28 22 29 3b  EATE TABLE x(");
292d0 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 53 71  ..  for(i=0; zSq
292e0 6c 20 26 26 20 69 3c 70 43 6f 6e 66 69 67 2d 3e  l && i<pConfig->
292f0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  nCol; i++){..   
29300 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
29310 70 20 3d 20 28 69 3d 3d 30 3f 22 22 3a 22 2c 20  p = (i==0?"":", 
29320 22 29 3b 0d 0a 20 20 20 20 7a 53 71 6c 20 3d 20  ");..    zSql = 
29330 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e  sqlite3Fts5Mprin
29340 74 66 28 26 72 63 2c 20 22 25 7a 25 73 25 51 22  tf(&rc, "%z%s%Q"
29350 2c 20 7a 53 71 6c 2c 20 7a 53 65 70 2c 20 70 43  , zSql, zSep, pC
29360 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29  onfig->azCol[i])
29370 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 53 71 6c 20 3d  ;..  }..  zSql =
29380 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69   sqlite3Fts5Mpri
29390 6e 74 66 28 26 72 63 2c 20 22 25 7a 2c 20 25 51  ntf(&rc, "%z, %Q
293a0 20 48 49 44 44 45 4e 2c 20 25 73 20 48 49 44 44   HIDDEN, %s HIDD
293b0 45 4e 29 22 2c 20 0d 0a 20 20 20 20 20 20 7a 53  EN)", ..      zS
293c0 71 6c 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  ql, pConfig->zNa
293d0 6d 65 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41  me, FTS5_RANK_NA
293e0 4d 45 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20 61 73  ME..  );....  as
293f0 73 65 72 74 28 20 7a 53 71 6c 20 7c 7c 20 72 63  sert( zSql || rc
29400 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
29410 3b 0d 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  ;..  if( zSql ){
29420 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
29430 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
29440 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
29450 6c 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  l);..    sqlite3
29460 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0d 0a 20 20  _free(zSql);..  
29470 7d 0d 0a 20 20 0d 0a 20 20 72 65 74 75 72 6e 20  }..  ..  return 
29480 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  rc;..}..../*..**
29490 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 74 65   Tokenize the te
294a0 78 74 20 70 61 73 73 65 64 20 76 69 61 20 74 68  xt passed via th
294b0 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
294c0 72 64 20 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 2a  rd arguments...*
294d0 2a 0d 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  *..** The callba
294e0 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  ck is invoked on
294f0 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65  ce for each toke
29500 6e 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74  n in the input t
29510 65 78 74 2e 20 54 68 65 0d 0a 2a 2a 20 61 72 67  ext. The..** arg
29520 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
29530 20 69 74 20 61 72 65 2c 20 69 6e 20 6f 72 64 65   it are, in orde
29540 72 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 76  r:..**..**     v
29550 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20 20 20  oid *pCtx       
29560 20 20 20 2f 2f 20 43 6f 70 79 20 6f 66 20 34 74     // Copy of 4t
29570 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  h argument to sq
29580 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a  lite3Fts5Tokeniz
29590 65 28 29 0d 0a 2a 2a 20 20 20 20 20 63 6f 6e 73  e()..**     cons
295a0 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 20 20  t char *pToken  
295b0 2f 2f 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  // Pointer to bu
295c0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
295d0 74 6f 6b 65 6e 0d 0a 2a 2a 20 20 20 20 20 69 6e  token..**     in
295e0 74 20 6e 54 6f 6b 65 6e 20 20 20 20 20 20 20 20  t nToken        
295f0 20 20 2f 2f 20 53 69 7a 65 20 6f 66 20 74 6f 6b    // Size of tok
29600 65 6e 20 69 6e 20 62 79 74 65 73 0d 0a 2a 2a 20  en in bytes..** 
29610 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 20      int iStart  
29620 20 20 20 20 20 20 20 20 2f 2f 20 42 79 74 65 20          // Byte 
29630 6f 66 66 73 65 74 20 6f 66 20 73 74 61 72 74 20  offset of start 
29640 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
29650 69 6e 70 75 74 20 74 65 78 74 0d 0a 2a 2a 20 20  input text..**  
29660 20 20 20 69 6e 74 20 69 45 6e 64 20 20 20 20 20     int iEnd     
29670 20 20 20 20 20 20 20 2f 2f 20 42 79 74 65 20 6f         // Byte o
29680 66 66 73 65 74 20 6f 66 20 65 6e 64 20 6f 66 20  ffset of end of 
29690 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 69 6e 70  token within inp
296a0 75 74 20 74 65 78 74 0d 0a 2a 2a 20 20 20 20 20  ut text..**     
296b0 69 6e 74 20 69 50 6f 73 20 20 20 20 20 20 20 20  int iPos        
296c0 20 20 20 20 2f 2f 20 50 6f 73 69 74 69 6f 6e 20      // Position 
296d0 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 69 6e 70 75  of token in inpu
296e0 74 20 28 66 69 72 73 74 20 74 6f 6b 65 6e 20 69  t (first token i
296f0 73 20 30 29 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20  s 0)..**..** If 
29700 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  the callback ret
29710 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  urns a non-zero 
29720 76 61 6c 75 65 20 74 68 65 20 74 6f 6b 65 6e 69  value the tokeni
29730 7a 61 74 69 6f 6e 20 69 73 20 61 62 61 6e 64 6f  zation is abando
29740 6e 65 64 0d 0a 2a 2a 20 61 6e 64 20 6e 6f 20 66  ned..** and no f
29750 75 72 74 68 65 72 20 63 61 6c 6c 62 61 63 6b 73  urther callbacks
29760 20 61 72 65 20 69 73 73 75 65 64 2e 20 0d 0a 2a   are issued. ..*
29770 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  *..** This funct
29780 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
29790 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
297a0 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
297b0 20 65 72 72 6f 72 20 63 6f 64 65 0d 0a 2a 2a 20   error code..** 
297c0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
297d0 72 73 2e 20 49 66 20 74 68 65 20 74 6f 6b 65 6e  rs. If the token
297e0 69 7a 61 74 69 6f 6e 20 77 61 73 20 61 62 61 6e  ization was aban
297f0 64 6f 6e 65 64 20 65 61 72 6c 79 20 62 65 63 61  doned early beca
29800 75 73 65 0d 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  use..** the call
29810 62 61 63 6b 20 72 65 74 75 72 6e 65 64 20 53 51  back returned SQ
29820 4c 49 54 45 5f 44 4f 4e 45 2c 20 74 68 69 73 20  LITE_DONE, this 
29830 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  is not an error 
29840 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
29850 6e 0d 0a 2a 2a 20 73 74 69 6c 6c 20 72 65 74 75  n..** still retu
29860 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  rns SQLITE_OK. O
29870 72 2c 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 69  r, if the tokeni
29880 7a 61 74 69 6f 6e 20 77 61 73 20 61 62 61 6e 64  zation was aband
29890 6f 6e 65 64 20 65 61 72 6c 79 0d 0a 2a 2a 20 62  oned early..** b
298a0 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 62  ecause the callb
298b0 61 63 6b 20 72 65 74 75 72 6e 65 64 20 61 6e 6f  ack returned ano
298c0 74 68 65 72 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ther non-zero va
298d0 6c 75 65 2c 20 69 74 20 69 73 20 61 73 73 75 6d  lue, it is assum
298e0 65 64 0d 0a 2a 2a 20 74 6f 20 62 65 20 61 6e 20  ed..** to be an 
298f0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
29900 65 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74  e and returned t
29910 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 2a  o the caller...*
29920 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  /..static int sq
29930 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a  lite3Fts5Tokeniz
29940 65 28 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  e(..  Fts5Config
29950 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20   *pConfig,      
29960 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43 6f        /* FTS5 Co
29970 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
29980 63 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 6c 61  ct */..  int fla
29990 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
299a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
299b0 5f 54 4f 4b 45 4e 49 5a 45 5f 2a 20 66 6c 61 67  _TOKENIZE_* flag
299c0 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68  s */..  const ch
299d0 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e  ar *pText, int n
299e0 54 65 78 74 2c 20 20 20 2f 2a 20 54 65 78 74 20  Text,   /* Text 
299f0 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0d 0a  to tokenize */..
29a00 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61 73    /* Context pas
29a30 73 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20  sed to xToken() 
29a40 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b  */..  int (*xTok
29a50 65 6e 29 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20  en)(void*, int, 
29a60 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
29a70 2c 20 69 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f  , int, int)    /
29a80 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 29  * Callback */..)
29a90 7b 0d 0a 20 20 69 66 28 20 70 54 65 78 74 3d 3d  {..  if( pText==
29aa0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
29ab0 45 5f 4f 4b 3b 0d 0a 20 20 72 65 74 75 72 6e 20  E_OK;..  return 
29ac0 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69  pConfig->pTokApi
29ad0 2d 3e 78 54 6f 6b 65 6e 69 7a 65 28 0d 0a 20 20  ->xTokenize(..  
29ae0 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f      pConfig->pTo
29af0 6b 2c 20 70 43 74 78 2c 20 66 6c 61 67 73 2c 20  k, pCtx, flags, 
29b00 70 54 65 78 74 2c 20 6e 54 65 78 74 2c 20 78 54  pText, nText, xT
29b10 6f 6b 65 6e 0d 0a 20 20 29 3b 0d 0a 7d 0d 0a 0d  oken..  );..}...
29b20 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ./*..** Argument
29b30 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74   pIn points to t
29b40 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
29b50 65 72 20 69 6e 20 77 68 61 74 20 69 73 20 65 78  er in what is ex
29b60 70 65 63 74 65 64 20 74 6f 20 62 65 0d 0a 2a 2a  pected to be..**
29b70 20 61 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74   a comma-separat
29b80 65 64 20 6c 69 73 74 20 6f 66 20 53 51 4c 20 6c  ed list of SQL l
29b90 69 74 65 72 61 6c 73 20 66 6f 6c 6c 6f 77 65 64  iterals followed
29ba0 20 62 79 20 61 20 27 29 27 20 63 68 61 72 61 63   by a ')' charac
29bb0 74 65 72 2e 0d 0a 2a 2a 20 49 66 20 69 74 20 61  ter...** If it a
29bc0 63 74 75 61 6c 6c 79 20 69 73 20 74 68 69 73 2c  ctually is this,
29bd0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
29be0 72 20 74 6f 20 74 68 65 20 27 29 27 2e 20 4f 74  r to the ')'. Ot
29bf0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0d  herwise, return.
29c00 0a 2a 2a 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69  .** NULL to indi
29c10 63 61 74 65 20 61 20 70 61 72 73 65 20 65 72 72  cate a parse err
29c20 6f 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  or...*/..static 
29c30 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 74 73 35  const char *fts5
29c40 43 6f 6e 66 69 67 53 6b 69 70 41 72 67 73 28 63  ConfigSkipArgs(c
29c50 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 29 7b  onst char *pIn){
29c60 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
29c70 70 20 3d 20 70 49 6e 3b 0d 0a 20 20 0d 0a 20 20  p = pIn;..  ..  
29c80 77 68 69 6c 65 28 20 31 20 29 7b 0d 0a 20 20 20  while( 1 ){..   
29c90 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53   p = fts5ConfigS
29ca0 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29  kipWhitespace(p)
29cb0 3b 0d 0a 20 20 20 20 70 20 3d 20 66 74 73 35 43  ;..    p = fts5C
29cc0 6f 6e 66 69 67 53 6b 69 70 4c 69 74 65 72 61 6c  onfigSkipLiteral
29cd0 28 70 29 3b 0d 0a 20 20 20 20 70 20 3d 20 66 74  (p);..    p = ft
29ce0 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74  s5ConfigSkipWhit
29cf0 65 73 70 61 63 65 28 70 29 3b 0d 0a 20 20 20 20  espace(p);..    
29d00 69 66 28 20 70 3d 3d 30 20 7c 7c 20 2a 70 3d 3d  if( p==0 || *p==
29d10 27 29 27 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20  ')' ) break;..  
29d20 20 20 69 66 28 20 2a 70 21 3d 27 2c 27 20 29 7b    if( *p!=',' ){
29d30 0d 0a 20 20 20 20 20 20 70 20 3d 20 30 3b 0d 0a  ..      p = 0;..
29d40 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
29d50 20 20 7d 0d 0a 20 20 20 20 70 2b 2b 3b 0d 0a 20    }..    p++;.. 
29d60 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 70   }....  return p
29d70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50  ;..}..../*..** P
29d80 61 72 61 6d 65 74 65 72 20 7a 49 6e 20 63 6f 6e  arameter zIn con
29d90 74 61 69 6e 73 20 61 20 72 61 6e 6b 28 29 20 66  tains a rank() f
29da0 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 63  unction specific
29db0 61 74 69 6f 6e 2e 20 54 68 65 20 66 6f 72 6d 61  ation. The forma
29dc0 74 20 6f 66 20 0d 0a 2a 2a 20 74 68 69 73 20 69  t of ..** this i
29dd0 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2b 20 42  s:..**..**   + B
29de0 61 72 65 77 6f 72 64 20 28 66 75 6e 63 74 69 6f  areword (functio
29df0 6e 20 6e 61 6d 65 29 0d 0a 2a 2a 20 20 20 2b 20  n name)..**   + 
29e00 4f 70 65 6e 20 70 61 72 65 6e 74 68 65 73 69 73  Open parenthesis
29e10 20 2d 20 22 28 22 0d 0a 2a 2a 20 20 20 2b 20 5a   - "("..**   + Z
29e20 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20  ero or more SQL 
29e30 6c 69 74 65 72 61 6c 73 20 69 6e 20 61 20 63 6f  literals in a co
29e40 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c 69  mma separated li
29e50 73 74 0d 0a 2a 2a 20 20 20 2b 20 43 6c 6f 73 65  st..**   + Close
29e60 20 70 61 72 65 6e 74 68 65 73 69 73 20 2d 20 22   parenthesis - "
29e70 29 22 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69  )"..*/..static i
29e80 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f  nt sqlite3Fts5Co
29e90 6e 66 69 67 50 61 72 73 65 52 61 6e 6b 28 0d 0a  nfigParseRank(..
29ea0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
29eb0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
29ec0 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e    /* Input strin
29ed0 67 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70  g */..  char **p
29ee0 7a 52 61 6e 6b 2c 20 20 20 20 20 20 20 20 20 20  zRank,          
29ef0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
29f00 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 6e 61  Rank function na
29f10 6d 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a  me */..  char **
29f20 70 7a 52 61 6e 6b 41 72 67 73 20 20 20 20 20 20  pzRankArgs      
29f30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
29f40 20 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 61   Rank function a
29f50 72 67 75 6d 65 6e 74 73 20 2a 2f 0d 0a 29 7b 0d  rguments */..){.
29f60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
29f70 20 3d 20 7a 49 6e 3b 0d 0a 20 20 63 6f 6e 73 74   = zIn;..  const
29f80 20 63 68 61 72 20 2a 70 52 61 6e 6b 3b 0d 0a 20   char *pRank;.. 
29f90 20 63 68 61 72 20 2a 7a 52 61 6e 6b 20 3d 20 30   char *zRank = 0
29fa0 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b  ;..  char *zRank
29fb0 41 72 67 73 20 3d 20 30 3b 0d 0a 20 20 69 6e 74  Args = 0;..  int
29fc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29fd0 0d 0a 0d 0a 20 20 2a 70 7a 52 61 6e 6b 20 3d 20  ....  *pzRank = 
29fe0 30 3b 0d 0a 20 20 2a 70 7a 52 61 6e 6b 41 72 67  0;..  *pzRankArg
29ff0 73 20 3d 20 30 3b 0d 0a 0d 0a 20 20 69 66 28 20  s = 0;....  if( 
2a000 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 63 20  p==0 ){..    rc 
2a010 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d  = SQLITE_ERROR;.
2a020 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70  .  }else{..    p
2a030 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69   = fts5ConfigSki
2a040 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b 0d  pWhitespace(p);.
2a050 0a 20 20 20 20 70 52 61 6e 6b 20 3d 20 70 3b 0d  .    pRank = p;.
2a060 0a 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e  .    p = fts5Con
2a070 66 69 67 53 6b 69 70 42 61 72 65 77 6f 72 64 28  figSkipBareword(
2a080 70 29 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 70  p);....    if( p
2a090 20 29 7b 0d 0a 20 20 20 20 20 20 7a 52 61 6e 6b   ){..      zRank
2a0a0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61   = sqlite3Fts5Ma
2a0b0 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 31 20  llocZero(&rc, 1 
2a0c0 2b 20 70 20 2d 20 70 52 61 6e 6b 29 3b 0d 0a 20  + p - pRank);.. 
2a0d0 20 20 20 20 20 69 66 28 20 7a 52 61 6e 6b 20 29       if( zRank )
2a0e0 20 6d 65 6d 63 70 79 28 7a 52 61 6e 6b 2c 20 70   memcpy(zRank, p
2a0f0 52 61 6e 6b 2c 20 70 2d 70 52 61 6e 6b 29 3b 0d  Rank, p-pRank);.
2a100 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  .    }else{..   
2a110 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2a120 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  RROR;..    }....
2a130 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a140 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
2a150 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  p = fts5ConfigSk
2a160 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b  ipWhitespace(p);
2a170 0d 0a 20 20 20 20 20 20 69 66 28 20 2a 70 21 3d  ..      if( *p!=
2a180 27 28 27 20 29 20 72 63 20 3d 20 53 51 4c 49 54  '(' ) rc = SQLIT
2a190 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20  E_ERROR;..      
2a1a0 70 2b 2b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  p++;..    }..   
2a1b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a1c0 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 63 6f 6e  OK ){..      con
2a1d0 73 74 20 63 68 61 72 20 2a 70 41 72 67 73 3b 20  st char *pArgs; 
2a1e0 0d 0a 20 20 20 20 20 20 70 20 3d 20 66 74 73 35  ..      p = fts5
2a1f0 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73  ConfigSkipWhites
2a200 70 61 63 65 28 70 29 3b 0d 0a 20 20 20 20 20 20  pace(p);..      
2a210 70 41 72 67 73 20 3d 20 70 3b 0d 0a 20 20 20 20  pArgs = p;..    
2a220 20 20 69 66 28 20 2a 70 21 3d 27 29 27 20 29 7b    if( *p!=')' ){
2a230 0d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66 74  ..        p = ft
2a240 73 35 43 6f 6e 66 69 67 53 6b 69 70 41 72 67 73  s5ConfigSkipArgs
2a250 28 70 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66  (p);..        if
2a260 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20  ( p==0 ){..     
2a270 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a280 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 20  _ERROR;..       
2a290 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20   }else{..       
2a2a0 20 20 20 7a 52 61 6e 6b 41 72 67 73 20 3d 20 73     zRankArgs = s
2a2b0 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
2a2c0 5a 65 72 6f 28 26 72 63 2c 20 31 20 2b 20 70 20  Zero(&rc, 1 + p 
2a2d0 2d 20 70 41 72 67 73 29 3b 0d 0a 20 20 20 20 20  - pArgs);..     
2a2e0 20 20 20 20 20 69 66 28 20 7a 52 61 6e 6b 41 72       if( zRankAr
2a2f0 67 73 20 29 20 6d 65 6d 63 70 79 28 7a 52 61 6e  gs ) memcpy(zRan
2a300 6b 41 72 67 73 2c 20 70 41 72 67 73 2c 20 70 2d  kArgs, pArgs, p-
2a310 70 41 72 67 73 29 3b 0d 0a 20 20 20 20 20 20 20  pArgs);..       
2a320 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
2a330 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28   }..  }....  if(
2a340 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a350 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  {..    sqlite3_f
2a360 72 65 65 28 7a 52 61 6e 6b 29 3b 0d 0a 20 20 20  ree(zRank);..   
2a370 20 61 73 73 65 72 74 28 20 7a 52 61 6e 6b 41 72   assert( zRankAr
2a380 67 73 3d 3d 30 20 29 3b 0d 0a 20 20 7d 65 6c 73  gs==0 );..  }els
2a390 65 7b 0d 0a 20 20 20 20 2a 70 7a 52 61 6e 6b 20  e{..    *pzRank 
2a3a0 3d 20 7a 52 61 6e 6b 3b 0d 0a 20 20 20 20 2a 70  = zRank;..    *p
2a3b0 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a 52 61 6e  zRankArgs = zRan
2a3c0 6b 41 72 67 73 3b 0d 0a 20 20 7d 0d 0a 20 20 72  kArgs;..  }..  r
2a3d0 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
2a3e0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
2a3f0 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74 56  e3Fts5ConfigSetV
2a400 61 6c 75 65 28 0d 0a 20 20 46 74 73 35 43 6f 6e  alue(..  Fts5Con
2a410 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0d 0a  fig *pConfig, ..
2a420 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
2a430 65 79 2c 20 0d 0a 20 20 73 71 6c 69 74 65 33 5f  ey, ..  sqlite3_
2a440 76 61 6c 75 65 20 2a 70 56 61 6c 2c 0d 0a 20 20  value *pVal,..  
2a450 69 6e 74 20 2a 70 62 42 61 64 6b 65 79 0d 0a 29  int *pbBadkey..)
2a460 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  {..  int rc = SQ
2a470 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 69 66  LITE_OK;....  if
2a480 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
2a490 69 63 6d 70 28 7a 4b 65 79 2c 20 22 70 67 73 7a  icmp(zKey, "pgsz
2a4a0 22 29 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 70  ") ){..    int p
2a4b0 67 73 7a 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66  gsz = 0;..    if
2a4c0 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ( SQLITE_INTEGER
2a4d0 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
2a4e0 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56 61  numeric_type(pVa
2a4f0 6c 29 20 29 7b 0d 0a 20 20 20 20 20 20 70 67 73  l) ){..      pgs
2a500 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
2a510 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0d 0a 20 20  e_int(pVal);..  
2a520 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 70 67 73    }..    if( pgs
2a530 7a 3c 3d 30 20 7c 7c 20 70 67 73 7a 3e 46 54 53  z<=0 || pgsz>FTS
2a540 35 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  5_MAX_PAGE_SIZE 
2a550 29 7b 0d 0a 20 20 20 20 20 20 2a 70 62 42 61 64  ){..      *pbBad
2a560 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65  key = 1;..    }e
2a570 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6e  lse{..      pCon
2a580 66 69 67 2d 3e 70 67 73 7a 20 3d 20 70 67 73 7a  fig->pgsz = pgsz
2a590 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
2a5a0 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
2a5b0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2a5c0 4b 65 79 2c 20 22 68 61 73 68 73 69 7a 65 22 29  Key, "hashsize")
2a5d0 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 48 61   ){..    int nHa
2a5e0 73 68 53 69 7a 65 20 3d 20 2d 31 3b 0d 0a 20 20  shSize = -1;..  
2a5f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 49 4e 54    if( SQLITE_INT
2a600 45 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61  EGER==sqlite3_va
2a610 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65  lue_numeric_type
2a620 28 70 56 61 6c 29 20 29 7b 0d 0a 20 20 20 20 20  (pVal) ){..     
2a630 20 6e 48 61 73 68 53 69 7a 65 20 3d 20 73 71 6c   nHashSize = sql
2a640 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
2a650 56 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  Val);..    }..  
2a660 20 20 69 66 28 20 6e 48 61 73 68 53 69 7a 65 3c    if( nHashSize<
2a670 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 62  =0 ){..      *pb
2a680 42 61 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20  Badkey = 1;..   
2a690 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70   }else{..      p
2a6a0 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a  Config->nHashSiz
2a6b0 65 20 3d 20 6e 48 61 73 68 53 69 7a 65 3b 0d 0a  e = nHashSize;..
2a6c0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
2a6d0 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69  else if( 0==sqli
2a6e0 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79  te3_stricmp(zKey
2a6f0 2c 20 22 61 75 74 6f 6d 65 72 67 65 22 29 20 29  , "automerge") )
2a700 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 41 75 74 6f  {..    int nAuto
2a710 6d 65 72 67 65 20 3d 20 2d 31 3b 0d 0a 20 20 20  merge = -1;..   
2a720 20 69 66 28 20 53 51 4c 49 54 45 5f 49 4e 54 45   if( SQLITE_INTE
2a730 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  GER==sqlite3_val
2a740 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
2a750 70 56 61 6c 29 20 29 7b 0d 0a 20 20 20 20 20 20  pVal) ){..      
2a760 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 73 71 6c  nAutomerge = sql
2a770 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
2a780 56 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  Val);..    }..  
2a790 20 20 69 66 28 20 6e 41 75 74 6f 6d 65 72 67 65    if( nAutomerge
2a7a0 3c 30 20 7c 7c 20 6e 41 75 74 6f 6d 65 72 67 65  <0 || nAutomerge
2a7b0 3e 36 34 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70  >64 ){..      *p
2a7c0 62 42 61 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20  bBadkey = 1;..  
2a7d0 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
2a7e0 69 66 28 20 6e 41 75 74 6f 6d 65 72 67 65 3d 3d  if( nAutomerge==
2a7f0 31 20 29 20 6e 41 75 74 6f 6d 65 72 67 65 20 3d  1 ) nAutomerge =
2a800 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 41 55   FTS5_DEFAULT_AU
2a810 54 4f 4d 45 52 47 45 3b 0d 0a 20 20 20 20 20 20  TOMERGE;..      
2a820 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65  pConfig->nAutome
2a830 72 67 65 20 3d 20 6e 41 75 74 6f 6d 65 72 67 65  rge = nAutomerge
2a840 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
2a850 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
2a860 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2a870 4b 65 79 2c 20 22 75 73 65 72 6d 65 72 67 65 22  Key, "usermerge"
2a880 29 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 55  ) ){..    int nU
2a890 73 65 72 6d 65 72 67 65 20 3d 20 2d 31 3b 0d 0a  sermerge = -1;..
2a8a0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 49      if( SQLITE_I
2a8b0 4e 54 45 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f  NTEGER==sqlite3_
2a8c0 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79  value_numeric_ty
2a8d0 70 65 28 70 56 61 6c 29 20 29 7b 0d 0a 20 20 20  pe(pVal) ){..   
2a8e0 20 20 20 6e 55 73 65 72 6d 65 72 67 65 20 3d 20     nUsermerge = 
2a8f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2a900 74 28 70 56 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d  t(pVal);..    }.
2a910 0a 20 20 20 20 69 66 28 20 6e 55 73 65 72 6d 65  .    if( nUserme
2a920 72 67 65 3c 32 20 7c 7c 20 6e 55 73 65 72 6d 65  rge<2 || nUserme
2a930 72 67 65 3e 31 36 20 29 7b 0d 0a 20 20 20 20 20  rge>16 ){..     
2a940 20 2a 70 62 42 61 64 6b 65 79 20 3d 20 31 3b 0d   *pbBadkey = 1;.
2a950 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  .    }else{..   
2a960 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65     pConfig->nUse
2a970 72 6d 65 72 67 65 20 3d 20 6e 55 73 65 72 6d 65  rmerge = nUserme
2a980 72 67 65 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  rge;..    }..  }
2a990 0d 0a 0d 0a 20 20 65 6c 73 65 20 69 66 28 20 30  ....  else if( 0
2a9a0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
2a9b0 70 28 7a 4b 65 79 2c 20 22 63 72 69 73 69 73 6d  p(zKey, "crisism
2a9c0 65 72 67 65 22 29 20 29 7b 0d 0a 20 20 20 20 69  erge") ){..    i
2a9d0 6e 74 20 6e 43 72 69 73 69 73 4d 65 72 67 65 20  nt nCrisisMerge 
2a9e0 3d 20 2d 31 3b 0d 0a 20 20 20 20 69 66 28 20 53  = -1;..    if( S
2a9f0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3d 3d 73  QLITE_INTEGER==s
2aa00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
2aa10 65 72 69 63 5f 74 79 70 65 28 70 56 61 6c 29 20  eric_type(pVal) 
2aa20 29 7b 0d 0a 20 20 20 20 20 20 6e 43 72 69 73 69  ){..      nCrisi
2aa30 73 4d 65 72 67 65 20 3d 20 73 71 6c 69 74 65 33  sMerge = sqlite3
2aa40 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29  _value_int(pVal)
2aa50 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66  ;..    }..    if
2aa60 28 20 6e 43 72 69 73 69 73 4d 65 72 67 65 3c 30  ( nCrisisMerge<0
2aa70 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 62 42 61   ){..      *pbBa
2aa80 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d  dkey = 1;..    }
2aa90 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 69 66 28  else{..      if(
2aaa0 20 6e 43 72 69 73 69 73 4d 65 72 67 65 3c 3d 31   nCrisisMerge<=1
2aab0 20 29 20 6e 43 72 69 73 69 73 4d 65 72 67 65 20   ) nCrisisMerge 
2aac0 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 43  = FTS5_DEFAULT_C
2aad0 52 49 53 49 53 4d 45 52 47 45 3b 0d 0a 20 20 20  RISISMERGE;..   
2aae0 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69     pConfig->nCri
2aaf0 73 69 73 4d 65 72 67 65 20 3d 20 6e 43 72 69 73  sisMerge = nCris
2ab00 69 73 4d 65 72 67 65 3b 0d 0a 20 20 20 20 7d 0d  isMerge;..    }.
2ab10 0a 20 20 7d 0d 0a 0d 0a 20 20 65 6c 73 65 20 69  .  }....  else i
2ab20 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
2ab30 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22 72 61 6e  ricmp(zKey, "ran
2ab40 6b 22 29 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73  k") ){..    cons
2ab50 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 28 63  t char *zIn = (c
2ab60 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
2ab70 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
2ab80 61 6c 29 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a  al);..    char *
2ab90 7a 52 61 6e 6b 3b 0d 0a 20 20 20 20 63 68 61 72  zRank;..    char
2aba0 20 2a 7a 52 61 6e 6b 41 72 67 73 3b 0d 0a 20 20   *zRankArgs;..  
2abb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
2abc0 73 35 43 6f 6e 66 69 67 50 61 72 73 65 52 61 6e  s5ConfigParseRan
2abd0 6b 28 7a 49 6e 2c 20 26 7a 52 61 6e 6b 2c 20 26  k(zIn, &zRank, &
2abe0 7a 52 61 6e 6b 41 72 67 73 29 3b 0d 0a 20 20 20  zRankArgs);..   
2abf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ac00 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c  OK ){..      sql
2ac10 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
2ac20 67 2d 3e 7a 52 61 6e 6b 29 3b 0d 0a 20 20 20 20  g->zRank);..    
2ac30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2ac40 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41 72 67  Config->zRankArg
2ac50 73 29 3b 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66  s);..      pConf
2ac60 69 67 2d 3e 7a 52 61 6e 6b 20 3d 20 7a 52 61 6e  ig->zRank = zRan
2ac70 6b 3b 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  k;..      pConfi
2ac80 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a  g->zRankArgs = z
2ac90 52 61 6e 6b 41 72 67 73 3b 0d 0a 20 20 20 20 7d  RankArgs;..    }
2aca0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2acb0 49 54 45 5f 45 52 52 4f 52 20 29 7b 0d 0a 20 20  ITE_ERROR ){..  
2acc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2acd0 4f 4b 3b 0d 0a 20 20 20 20 20 20 2a 70 62 42 61  OK;..      *pbBa
2ace0 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d  dkey = 1;..    }
2acf0 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20  ..  }else{..    
2ad00 2a 70 62 42 61 64 6b 65 79 20 3d 20 31 3b 0d 0a  *pbBadkey = 1;..
2ad10 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2ad20 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c  ;..}..../*..** L
2ad30 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  oad the contents
2ad40 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 66 69 67   of the %_config
2ad50 20 74 61 62 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f   table into memo
2ad60 72 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ry...*/..static 
2ad70 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
2ad80 6f 6e 66 69 67 4c 6f 61 64 28 46 74 73 35 43 6f  onfigLoad(Fts5Co
2ad90 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 69  nfig *pConfig, i
2ada0 6e 74 20 69 43 6f 6f 6b 69 65 29 7b 0d 0a 20 20  nt iCookie){..  
2adb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c  const char *zSel
2adc0 65 63 74 20 3d 20 22 53 45 4c 45 43 54 20 6b 2c  ect = "SELECT k,
2add0 20 76 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63   v FROM %Q.'%q_c
2ade0 6f 6e 66 69 67 27 22 3b 0d 0a 20 20 63 68 61 72  onfig'";..  char
2adf0 20 2a 7a 53 71 6c 3b 0d 0a 20 20 73 71 6c 69 74   *zSql;..  sqlit
2ae00 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 30 3b 0d  e3_stmt *p = 0;.
2ae10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ae20 54 45 5f 4f 4b 3b 0d 0a 20 20 69 6e 74 20 69 56  TE_OK;..  int iV
2ae30 65 72 73 69 6f 6e 20 3d 20 30 3b 0d 0a 0d 0a 20  ersion = 0;.... 
2ae40 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 20   /* Set default 
2ae50 76 61 6c 75 65 73 20 2a 2f 0d 0a 20 20 70 43 6f  values */..  pCo
2ae60 6e 66 69 67 2d 3e 70 67 73 7a 20 3d 20 46 54 53  nfig->pgsz = FTS
2ae70 35 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  5_DEFAULT_PAGE_S
2ae80 49 5a 45 3b 0d 0a 20 20 70 43 6f 6e 66 69 67 2d  IZE;..  pConfig-
2ae90 3e 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 46 54  >nAutomerge = FT
2aea0 53 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  S5_DEFAULT_AUTOM
2aeb0 45 52 47 45 3b 0d 0a 20 20 70 43 6f 6e 66 69 67  ERGE;..  pConfig
2aec0 2d 3e 6e 55 73 65 72 6d 65 72 67 65 20 3d 20 46  ->nUsermerge = F
2aed0 54 53 35 5f 44 45 46 41 55 4c 54 5f 55 53 45 52  TS5_DEFAULT_USER
2aee0 4d 45 52 47 45 3b 0d 0a 20 20 70 43 6f 6e 66 69  MERGE;..  pConfi
2aef0 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 20  g->nCrisisMerge 
2af00 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 43  = FTS5_DEFAULT_C
2af10 52 49 53 49 53 4d 45 52 47 45 3b 0d 0a 20 20 70  RISISMERGE;..  p
2af20 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a  Config->nHashSiz
2af30 65 20 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54  e = FTS5_DEFAULT
2af40 5f 48 41 53 48 53 49 5a 45 3b 0d 0a 0d 0a 20 20  _HASHSIZE;....  
2af50 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 46 74  zSql = sqlite3Ft
2af60 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 7a  s5Mprintf(&rc, z
2af70 53 65 6c 65 63 74 2c 20 70 43 6f 6e 66 69 67 2d  Select, pConfig-
2af80 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
2af90 4e 61 6d 65 29 3b 0d 0a 20 20 69 66 28 20 7a 53  Name);..  if( zS
2afa0 71 6c 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20  ql ){..    rc = 
2afb0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2afc0 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  v2(pConfig->db, 
2afd0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2c 20 30 29  zSql, -1, &p, 0)
2afe0 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ;..    sqlite3_f
2aff0 72 65 65 28 7a 53 71 6c 29 3b 0d 0a 20 20 7d 0d  ree(zSql);..  }.
2b000 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  ...  assert( rc=
2b010 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 3d  =SQLITE_OK || p=
2b020 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d  =0 );..  if( rc=
2b030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
2b040 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
2b050 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2b060 65 70 28 70 29 20 29 7b 0d 0a 20 20 20 20 20 20  ep(p) ){..      
2b070 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 20 3d  const char *zK =
2b080 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2b090 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2b0a0 74 28 70 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20  t(p, 0);..      
2b0b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
2b0c0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
2b0d0 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 2c 20 31 29  lumn_value(p, 1)
2b0e0 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
2b0f0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2b100 7a 4b 2c 20 22 76 65 72 73 69 6f 6e 22 29 20 29  zK, "version") )
2b110 7b 0d 0a 20 20 20 20 20 20 20 20 69 56 65 72 73  {..        iVers
2b120 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ion = sqlite3_va
2b130 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0d 0a  lue_int(pVal);..
2b140 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20        }else{..  
2b150 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
2b160 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 73   = 0;..        s
2b170 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
2b180 53 65 74 56 61 6c 75 65 28 70 43 6f 6e 66 69 67  SetValue(pConfig
2b190 2c 20 7a 4b 2c 20 70 56 61 6c 2c 20 26 62 44 75  , zK, pVal, &bDu
2b1a0 6d 6d 79 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  mmy);..      }..
2b1b0 20 20 20 20 7d 0d 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
2b1c0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2b1d0 28 70 29 3b 0d 0a 20 20 7d 0d 0a 20 20 0d 0a 20  (p);..  }..  .. 
2b1e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b1f0 4f 4b 20 26 26 20 69 56 65 72 73 69 6f 6e 21 3d  OK && iVersion!=
2b200 46 54 53 35 5f 43 55 52 52 45 4e 54 5f 56 45 52  FTS5_CURRENT_VER
2b210 53 49 4f 4e 20 29 7b 0d 0a 20 20 20 20 72 63 20  SION ){..    rc 
2b220 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d  = SQLITE_ERROR;.
2b230 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
2b240 2d 3e 70 7a 45 72 72 6d 73 67 20 29 7b 0d 0a 20  ->pzErrmsg ){.. 
2b250 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
2b260 2a 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d  *pConfig->pzErrm
2b270 73 67 20 29 3b 0d 0a 20 20 20 20 20 20 2a 70 43  sg );..      *pC
2b280 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20  onfig->pzErrmsg 
2b290 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2b2a0 66 28 0d 0a 20 20 20 20 20 20 20 20 20 20 22 69  f(..          "i
2b2b0 6e 76 61 6c 69 64 20 66 74 73 35 20 66 69 6c 65  nvalid fts5 file
2b2c0 20 66 6f 72 6d 61 74 20 28 66 6f 75 6e 64 20 25   format (found %
2b2d0 64 2c 20 65 78 70 65 63 74 65 64 20 25 64 29 20  d, expected %d) 
2b2e0 2d 20 72 75 6e 20 27 72 65 62 75 69 6c 64 27 22  - run 'rebuild'"
2b2f0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 69 56 65  ,..          iVe
2b300 72 73 69 6f 6e 2c 20 46 54 53 35 5f 43 55 52 52  rsion, FTS5_CURR
2b310 45 4e 54 5f 56 45 52 53 49 4f 4e 0d 0a 20 20 20  ENT_VERSION..   
2b320 20 20 20 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20     );..    }..  
2b330 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  }....  if( rc==S
2b340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
2b350 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69   pConfig->iCooki
2b360 65 20 3d 20 69 43 6f 6f 6b 69 65 3b 0d 0a 20 20  e = iCookie;..  
2b370 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  }..  return rc;.
2b380 0a 7d 0d 0a 0d 0a 23 6c 69 6e 65 20 31 20 22 66  .}....#line 1 "f
2b390 74 73 35 5f 65 78 70 72 2e 63 22 0d 0a 2f 2a 0d  ts5_expr.c"../*.
2b3a0 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33 31 0d  .** 2014 May 31.
2b3b0 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68  .**..** The auth
2b3c0 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
2b3d0 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
2b3e0 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
2b3f0 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c  place of..** a l
2b400 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
2b410 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
2b420 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20  ..**..**    May 
2b430 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
2b440 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20  not evil...**   
2b450 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
2b460 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
2b470 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
2b480 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20  ve others...**  
2b490 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
2b4a0 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
2b4b0 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
2b4c0 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a  ou give...**..**
2b4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a  ************..**
2b520 0d 0a 2a 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 20 23  ..*/......../* #
2b530 69 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74  include "fts5Int
2b540 2e 68 22 20 2a 2f 0d 0a 2f 2a 20 23 69 6e 63 6c  .h" */../* #incl
2b550 75 64 65 20 22 66 74 73 35 70 61 72 73 65 2e 68  ude "fts5parse.h
2b560 22 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41  " */..../*..** A
2b570 6c 6c 20 74 6f 6b 65 6e 20 74 79 70 65 73 20 69  ll token types i
2b580 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  n the generated 
2b590 66 74 73 35 70 61 72 73 65 2e 68 20 66 69 6c 65  fts5parse.h file
2b5a0 20 61 72 65 20 67 72 65 61 74 65 72 20 74 68 61   are greater tha
2b5b0 6e 20 30 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e  n 0...*/..#defin
2b5c0 65 20 46 54 53 35 5f 45 4f 46 20 30 0d 0a 0d 0a  e FTS5_EOF 0....
2b5d0 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4c 41 52  #define FTS5_LAR
2b5e0 47 45 53 54 5f 49 4e 54 36 34 20 20 28 30 78 66  GEST_INT64  (0xf
2b5f0 66 66 66 66 66 66 66 7c 28 28 28 69 36 34 29 30  fffffff|(((i64)0
2b600 78 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29  x7fffffff)<<32))
2b610 0d 0a 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75  ....typedef stru
2b620 63 74 20 46 74 73 35 45 78 70 72 54 65 72 6d 20  ct Fts5ExprTerm 
2b630 46 74 73 35 45 78 70 72 54 65 72 6d 3b 0d 0a 0d  Fts5ExprTerm;...
2b640 0a 2f 2a 0d 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ./*..** Function
2b650 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6c  s generated by l
2b660 65 6d 6f 6e 20 66 72 6f 6d 20 66 74 73 35 70 61  emon from fts5pa
2b670 72 73 65 2e 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  rse.y...*/..stat
2b680 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  ic void *sqlite3
2b690 46 74 73 35 50 61 72 73 65 72 41 6c 6c 6f 63 28  Fts5ParserAlloc(
2b6a0 76 6f 69 64 20 2a 28 2a 6d 61 6c 6c 6f 63 50 72  void *(*mallocPr
2b6b0 6f 63 29 28 75 36 34 29 29 3b 0d 0a 73 74 61 74  oc)(u64));..stat
2b6c0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
2b6d0 74 73 35 50 61 72 73 65 72 46 72 65 65 28 76 6f  ts5ParserFree(vo
2b6e0 69 64 2a 2c 20 76 6f 69 64 20 28 2a 66 72 65 65  id*, void (*free
2b6f0 50 72 6f 63 29 28 76 6f 69 64 2a 29 29 3b 0d 0a  Proc)(void*));..
2b700 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2b710 74 65 33 46 74 73 35 50 61 72 73 65 72 28 76 6f  te3Fts5Parser(vo
2b720 69 64 2a 2c 20 69 6e 74 2c 20 46 74 73 35 54 6f  id*, int, Fts5To
2b730 6b 65 6e 2c 20 46 74 73 35 50 61 72 73 65 2a 29  ken, Fts5Parse*)
2b740 3b 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
2b750 47 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  G..#include <std
2b760 69 6f 2e 68 3e 0d 0a 73 74 61 74 69 63 20 76 6f  io.h>..static vo
2b770 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
2b780 72 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c  rserTrace(FILE*,
2b790 20 63 68 61 72 2a 29 3b 0d 0a 23 65 6e 64 69 66   char*);..#endif
2b7a0 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
2b7b0 69 74 65 33 46 74 73 35 50 61 72 73 65 72 46 61  ite3Fts5ParserFa
2b7c0 6c 6c 62 61 63 6b 28 69 6e 74 29 3b 0d 0a 0d 0a  llback(int);....
2b7d0 0d 0a 73 74 72 75 63 74 20 46 74 73 35 45 78 70  ..struct Fts5Exp
2b7e0 72 20 7b 0d 0a 20 20 46 74 73 35 49 6e 64 65 78  r {..  Fts5Index
2b7f0 20 2a 70 49 6e 64 65 78 3b 0d 0a 20 20 46 74 73   *pIndex;..  Fts
2b800 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
2b810 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  ;..  Fts5ExprNod
2b820 65 20 2a 70 52 6f 6f 74 3b 0d 0a 20 20 69 6e 74  e *pRoot;..  int
2b830 20 62 44 65 73 63 3b 20 20 20 20 20 20 20 20 20   bDesc;         
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b850 49 74 65 72 61 74 65 20 69 6e 20 64 65 73 63 65  Iterate in desce
2b860 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
2b870 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 50 68 72  r */..  int nPhr
2b880 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
2b890 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b8a0 72 20 6f 66 20 70 68 72 61 73 65 73 20 69 6e 20  r of phrases in 
2b8b0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0d 0a 20  expression */.. 
2b8c0 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
2b8d0 2a 2a 61 70 45 78 70 72 50 68 72 61 73 65 3b 20  **apExprPhrase; 
2b8e0 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
2b8f0 70 68 72 61 73 65 20 6f 62 6a 65 63 74 73 20 2a  phrase objects *
2b900 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  /..};..../*..** 
2b910 65 54 79 70 65 3a 0d 0a 2a 2a 20 20 20 45 78 70  eType:..**   Exp
2b920 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 79 70  ression node typ
2b930 65 2e 20 41 6c 77 61 79 73 20 6f 6e 65 20 6f 66  e. Always one of
2b940 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20  :..**..**       
2b950 46 54 53 35 5f 41 4e 44 20 20 20 20 20 20 20 20  FTS5_AND        
2b960 20 20 20 20 20 20 20 20 20 28 6e 43 68 69 6c 64           (nChild
2b970 2c 20 61 70 43 68 69 6c 64 20 76 61 6c 69 64 29  , apChild valid)
2b980 0d 0a 2a 2a 20 20 20 20 20 20 20 46 54 53 35 5f  ..**       FTS5_
2b990 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
2b9a0 20 20 20 20 28 6e 43 68 69 6c 64 2c 20 61 70 43      (nChild, apC
2b9b0 68 69 6c 64 20 76 61 6c 69 64 29 0d 0a 2a 2a 20  hild valid)..** 
2b9c0 20 20 20 20 20 20 46 54 53 35 5f 4e 4f 54 20 20        FTS5_NOT  
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b9e0 6e 43 68 69 6c 64 2c 20 61 70 43 68 69 6c 64 20  nChild, apChild 
2b9f0 76 61 6c 69 64 29 0d 0a 2a 2a 20 20 20 20 20 20  valid)..**      
2ba00 20 46 54 53 35 5f 53 54 52 49 4e 47 20 20 20 20   FTS5_STRING    
2ba10 20 20 20 20 20 20 20 20 20 20 28 70 4e 65 61 72            (pNear
2ba20 20 76 61 6c 69 64 29 0d 0a 2a 2a 20 20 20 20 20   valid)..**     
2ba30 20 20 46 54 53 35 5f 54 45 52 4d 20 20 20 20 20    FTS5_TERM     
2ba40 20 20 20 20 20 20 20 20 20 20 20 28 70 4e 65 61             (pNea
2ba50 72 20 76 61 6c 69 64 29 0d 0a 2a 2f 0d 0a 73 74  r valid)..*/..st
2ba60 72 75 63 74 20 46 74 73 35 45 78 70 72 4e 6f 64  ruct Fts5ExprNod
2ba70 65 20 7b 0d 0a 20 20 69 6e 74 20 65 54 79 70 65  e {..  int eType
2ba80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ba90 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74         /* Node t
2baa0 79 70 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 45  ype */..  int bE
2bab0 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
2bac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2bad0 65 20 61 74 20 45 4f 46 20 2a 2f 0d 0a 20 20 69  e at EOF */..  i
2bae0 6e 74 20 62 4e 6f 6d 61 74 63 68 3b 20 20 20 20  nt bNomatch;    
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bb00 2a 20 54 72 75 65 20 69 66 20 65 6e 74 72 79 20  * True if entry 
2bb10 69 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 2a  is not a match *
2bb20 2f 0d 0a 0d 0a 20 20 2f 2a 20 4e 65 78 74 20 6d  /....  /* Next m
2bb30 65 74 68 6f 64 20 66 6f 72 20 74 68 69 73 20 6e  ethod for this n
2bb40 6f 64 65 2e 20 2a 2f 0d 0a 20 20 69 6e 74 20 28  ode. */..  int (
2bb50 2a 78 4e 65 78 74 29 28 46 74 73 35 45 78 70 72  *xNext)(Fts5Expr
2bb60 2a 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65 2a  *, Fts5ExprNode*
2bb70 2c 20 69 6e 74 2c 20 69 36 34 29 3b 0d 0a 0d 0a  , int, i64);....
2bb80 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
2bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bba0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
2bbb0 69 64 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70  id */..  Fts5Exp
2bbc0 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 3b  rNearset *pNear;
2bbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
2bbe0 46 54 53 35 5f 53 54 52 49 4e 47 20 2d 20 63 6c  FTS5_STRING - cl
2bbf0 75 73 74 65 72 20 6f 66 20 70 68 72 61 73 65 73  uster of phrases
2bc00 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 43 68 69 6c   */....  /* Chil
2bc10 64 20 6e 6f 64 65 73 2e 20 46 6f 72 20 61 20 4e  d nodes. For a N
2bc20 4f 54 20 6e 6f 64 65 2c 20 74 68 69 73 20 61 72  OT node, this ar
2bc30 72 61 79 20 61 6c 77 61 79 73 20 63 6f 6e 74 61  ray always conta
2bc40 69 6e 73 20 32 20 65 6e 74 72 69 65 73 2e 20 46  ins 2 entries. F
2bc50 6f 72 20 0d 0a 20 20 2a 2a 20 41 4e 44 20 6f 72  or ..  ** AND or
2bc60 20 4f 52 20 6e 6f 64 65 73 2c 20 69 74 20 63 6f   OR nodes, it co
2bc70 6e 74 61 69 6e 73 20 32 20 6f 72 20 6d 6f 72 65  ntains 2 or more
2bc80 20 65 6e 74 72 69 65 73 2e 20 20 2a 2f 0d 0a 20   entries.  */.. 
2bc90 20 69 6e 74 20 6e 43 68 69 6c 64 3b 20 20 20 20   int nChild;    
2bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
2bcc0 69 6c 64 20 6e 6f 64 65 73 20 2a 2f 0d 0a 20 20  ild nodes */..  
2bcd0 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 61 70  Fts5ExprNode *ap
2bce0 43 68 69 6c 64 5b 31 5d 3b 20 20 20 20 20 20 20  Child[1];       
2bcf0 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 68 69 6c  /* Array of chil
2bd00 64 20 6e 6f 64 65 73 20 2a 2f 0d 0a 7d 3b 0d 0a  d nodes */..};..
2bd10 0d 0a 23 64 65 66 69 6e 65 20 46 74 73 35 4e 6f  ..#define Fts5No
2bd20 64 65 49 73 53 74 72 69 6e 67 28 70 29 20 28 28  deIsString(p) ((
2bd30 70 29 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  p)->eType==FTS5_
2bd40 54 45 52 4d 20 7c 7c 20 28 70 29 2d 3e 65 54 79  TERM || (p)->eTy
2bd50 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 29  pe==FTS5_STRING)
2bd60 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 76 6f 6b  ..../*..** Invok
2bd70 65 20 74 68 65 20 78 4e 65 78 74 20 6d 65 74 68  e the xNext meth
2bd80 6f 64 20 6f 66 20 61 6e 20 46 74 73 35 45 78 70  od of an Fts5Exp
2bd90 72 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 54 68  rNode object. Th
2bda0 69 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  is macro should 
2bdb0 62 65 0d 0a 2a 2a 20 75 73 65 64 20 61 73 20 69  be..** used as i
2bdc0 66 20 69 74 20 68 61 73 20 74 68 65 20 73 61 6d  f it has the sam
2bdd0 65 20 73 69 67 6e 61 74 75 72 65 20 61 73 20 74  e signature as t
2bde0 68 65 20 78 4e 65 78 74 28 29 20 6d 65 74 68 6f  he xNext() metho
2bdf0 64 73 20 74 68 65 6d 73 65 6c 76 65 73 2e 0d 0a  ds themselves...
2be00 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35  */..#define fts5
2be10 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 61 2c 62  ExprNodeNext(a,b
2be20 2c 63 2c 64 29 20 28 62 29 2d 3e 78 4e 65 78 74  ,c,d) (b)->xNext
2be30 28 28 61 29 2c 20 28 62 29 2c 20 28 63 29 2c 20  ((a), (b), (c), 
2be40 28 64 29 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41  (d))..../*..** A
2be50 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2be60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2be70 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 73  cture represents
2be80 20 61 20 73 69 6e 67 6c 65 20 73 65 61 72 63 68   a single search
2be90 20 74 65 72 6d 0d 0a 2a 2a 20 6f 72 20 74 65 72   term..** or ter
2bea0 6d 20 70 72 65 66 69 78 2e 0d 0a 2a 2f 0d 0a 73  m prefix...*/..s
2beb0 74 72 75 63 74 20 46 74 73 35 45 78 70 72 54 65  truct Fts5ExprTe
2bec0 72 6d 20 7b 0d 0a 20 20 75 38 20 62 50 72 65 66  rm {..  u8 bPref
2bed0 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
2bee0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bef0 66 6f 72 20 61 20 70 72 65 66 69 78 20 74 65 72  for a prefix ter
2bf00 6d 20 2a 2f 0d 0a 20 20 75 38 20 62 46 69 72 73  m */..  u8 bFirs
2bf10 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2bf20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bf30 69 66 20 74 6f 6b 65 6e 20 6d 75 73 74 20 62 65  if token must be
2bf40 20 66 69 72 73 74 20 69 6e 20 63 6f 6c 75 6d 6e   first in column
2bf50 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 54 65   */..  char *zTe
2bf60 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2bf70 20 20 20 20 20 20 20 2f 2a 20 6e 75 6c 2d 74 65         /* nul-te
2bf80 72 6d 69 6e 61 74 65 64 20 74 65 72 6d 20 2a 2f  rminated term */
2bf90 0d 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ..  Fts5IndexIte
2bfa0 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  r *pIter;       
2bfb0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2bfc0 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f  for this term */
2bfd0 0d 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d  ..  Fts5ExprTerm
2bfe0 20 2a 70 53 79 6e 6f 6e 79 6d 3b 20 20 20 20 20   *pSynonym;     
2bff0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c000 6f 20 66 69 72 73 74 20 69 6e 20 6c 69 73 74 20  o first in list 
2c010 6f 66 20 73 79 6e 6f 6e 79 6d 73 20 2a 2f 0d 0a  of synonyms */..
2c020 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 70  };..../*..** A p
2c030 68 72 61 73 65 2e 20 4f 6e 65 20 6f 72 20 6d 6f  hrase. One or mo
2c040 72 65 20 74 65 72 6d 73 20 74 68 61 74 20 6d 75  re terms that mu
2c050 73 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 63  st appear in a c
2c060 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e  ontiguous sequen
2c070 63 65 0d 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20  ce..** within a 
2c080 64 6f 63 75 6d 65 6e 74 20 66 6f 72 20 69 74 20  document for it 
2c090 74 6f 20 6d 61 74 63 68 2e 0d 0a 2a 2f 0d 0a 73  to match...*/..s
2c0a0 74 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68  truct Fts5ExprPh
2c0b0 72 61 73 65 20 7b 0d 0a 20 20 46 74 73 35 45 78  rase {..  Fts5Ex
2c0c0 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 20 20  prNode *pNode;  
2c0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
2c0e0 35 5f 53 54 52 49 4e 47 20 6e 6f 64 65 20 74 68  5_STRING node th
2c0f0 69 73 20 70 68 72 61 73 65 20 69 73 20 70 61 72  is phrase is par
2c100 74 20 6f 66 20 2a 2f 0d 0a 20 20 46 74 73 35 42  t of */..  Fts5B
2c110 75 66 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20  uffer poslist;  
2c120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2c130 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  rrent position l
2c140 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54  ist */..  int nT
2c150 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2c160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c170 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2c180 6e 20 61 54 65 72 6d 5b 5d 20 2a 2f 0d 0a 20 20  n aTerm[] */..  
2c190 46 74 73 35 45 78 70 72 54 65 72 6d 20 61 54 65  Fts5ExprTerm aTe
2c1a0 72 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  rm[1];          
2c1b0 2f 2a 20 54 65 72 6d 73 20 74 68 61 74 20 6d 61  /* Terms that ma
2c1c0 6b 65 20 75 70 20 74 68 69 73 20 70 68 72 61 73  ke up this phras
2c1d0 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a  e */..};..../*..
2c1e0 2a 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 70  ** One or more p
2c1f0 68 72 61 73 65 73 20 74 68 61 74 20 6d 75 73 74  hrases that must
2c200 20 61 70 70 65 61 72 20 77 69 74 68 69 6e 20 61   appear within a
2c210 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 64   certain token d
2c220 69 73 74 61 6e 63 65 20 6f 66 0d 0a 2a 2a 20 65  istance of..** e
2c230 61 63 68 20 6f 74 68 65 72 20 77 69 74 68 69 6e  ach other within
2c240 20 65 61 63 68 20 6d 61 74 63 68 69 6e 67 20 64   each matching d
2c250 6f 63 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74  ocument...*/..st
2c260 72 75 63 74 20 46 74 73 35 45 78 70 72 4e 65 61  ruct Fts5ExprNea
2c270 72 73 65 74 20 7b 0d 0a 20 20 69 6e 74 20 6e 4e  rset {..  int nN
2c280 65 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ear;            
2c290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 45 41            /* NEA
2c2a0 52 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0d 0a  R parameter */..
2c2b0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
2c2c0 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
2c2d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 6f 20    /* Columns to 
2c2e0 73 65 61 72 63 68 20 28 4e 55 4c 4c 20 2d 3e 20  search (NULL -> 
2c2f0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0d  all columns) */.
2c300 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65 3b 20  .  int nPhrase; 
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c330 65 6e 74 72 69 65 73 20 69 6e 20 61 50 68 72 61  entries in aPhra
2c340 73 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0d 0a 20  se[] array */.. 
2c350 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
2c360 2a 61 70 50 68 72 61 73 65 5b 31 5d 3b 20 20 20  *apPhrase[1];   
2c370 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 68 72   /* Array of phr
2c380 61 73 65 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0d  ase pointers */.
2c390 0a 7d 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  .};....../*..** 
2c3a0 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 0d 0a  Parse context...
2c3b0 2a 2f 0d 0a 73 74 72 75 63 74 20 46 74 73 35 50  */..struct Fts5P
2c3c0 61 72 73 65 20 7b 0d 0a 20 20 46 74 73 35 43 6f  arse {..  Fts5Co
2c3d0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b 0d 0a  nfig *pConfig;..
2c3e0 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0d 0a 20    char *zErr;.. 
2c3f0 20 69 6e 74 20 72 63 3b 0d 0a 20 20 69 6e 74 20   int rc;..  int 
2c400 6e 50 68 72 61 73 65 3b 20 20 20 20 20 20 20 20  nPhrase;        
2c410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c420 69 7a 65 20 6f 66 20 61 70 50 68 72 61 73 65 20  ize of apPhrase 
2c430 61 72 72 61 79 20 2a 2f 0d 0a 20 20 46 74 73 35  array */..  Fts5
2c440 45 78 70 72 50 68 72 61 73 65 20 2a 2a 61 70 50  ExprPhrase **apP
2c450 68 72 61 73 65 3b 20 20 20 20 20 20 2f 2a 20 41  hrase;      /* A
2c460 72 72 61 79 20 6f 66 20 61 6c 6c 20 70 68 72 61  rray of all phra
2c470 73 65 73 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78  ses */..  Fts5Ex
2c480 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 3b 20 20  prNode *pExpr;  
2c490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2c4a0 75 6c 74 20 6f 66 20 61 20 73 75 63 63 65 73 73  ult of a success
2c4b0 66 75 6c 20 70 61 72 73 65 20 2a 2f 0d 0a 7d 3b  ful parse */..};
2c4c0 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ....static void 
2c4d0 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
2c4e0 45 72 72 6f 72 28 46 74 73 35 50 61 72 73 65 20  Error(Fts5Parse 
2c4f0 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
2c500 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b  har *zFmt, ...){
2c510 0d 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0d  ..  va_list ap;.
2c520 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2c530 7a 46 6d 74 29 3b 0d 0a 20 20 69 66 28 20 70 50  zFmt);..  if( pP
2c540 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
2c550 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 50 61 72  _OK ){..    pPar
2c560 73 65 2d 3e 7a 45 72 72 20 3d 20 73 71 6c 69 74  se->zErr = sqlit
2c570 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
2c580 2c 20 61 70 29 3b 0d 0a 20 20 20 20 70 50 61 72  , ap);..    pPar
2c590 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
2c5a0 45 52 52 4f 52 3b 0d 0a 20 20 7d 0d 0a 20 20 76  ERROR;..  }..  v
2c5b0 61 5f 65 6e 64 28 61 70 29 3b 0d 0a 7d 0d 0a 0d  a_end(ap);..}...
2c5c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2c5d0 45 78 70 72 49 73 73 70 61 63 65 28 63 68 61 72  ExprIsspace(char
2c5e0 20 74 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 74   t){..  return t
2c5f0 3d 3d 27 20 27 20 7c 7c 20 74 3d 3d 27 5c 74 27  ==' ' || t=='\t'
2c600 20 7c 7c 20 74 3d 3d 27 5c 6e 27 20 7c 7c 20 74   || t=='\n' || t
2c610 3d 3d 27 5c 72 27 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  =='\r';..}..../*
2c620 0d 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  ..** Read the fi
2c630 72 73 74 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 74  rst token from t
2c640 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  he nul-terminate
2c650 64 20 73 74 72 69 6e 67 20 61 74 20 2a 70 7a 2e  d string at *pz.
2c660 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
2c670 20 66 74 73 35 45 78 70 72 47 65 74 54 6f 6b 65   fts5ExprGetToke
2c680 6e 28 0d 0a 20 20 46 74 73 35 50 61 72 73 65 20  n(..  Fts5Parse 
2c690 2a 70 50 61 72 73 65 2c 20 0d 0a 20 20 63 6f 6e  *pParse, ..  con
2c6a0 73 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20 20 20  st char **pz,   
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6c0 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  IN/OUT: Pointer 
2c6d0 69 6e 74 6f 20 62 75 66 66 65 72 20 2a 2f 0d 0a  into buffer */..
2c6e0 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f    Fts5Token *pTo
2c6f0 6b 65 6e 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73 74  ken..){..  const
2c700 20 63 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b 0d   char *z = *pz;.
2c710 0a 20 20 69 6e 74 20 74 6f 6b 3b 0d 0a 0d 0a 20  .  int tok;.... 
2c720 20 2f 2a 20 53 6b 69 70 20 70 61 73 74 20 61 6e   /* Skip past an
2c730 79 20 77 68 69 74 65 73 70 61 63 65 20 2a 2f 0d  y whitespace */.
2c740 0a 20 20 77 68 69 6c 65 28 20 66 74 73 35 45 78  .  while( fts5Ex
2c750 70 72 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  prIsspace(*z) ) 
2c760 7a 2b 2b 3b 0d 0a 0d 0a 20 20 70 54 6f 6b 65 6e  z++;....  pToken
2c770 2d 3e 70 20 3d 20 7a 3b 0d 0a 20 20 70 54 6f 6b  ->p = z;..  pTok
2c780 65 6e 2d 3e 6e 20 3d 20 31 3b 0d 0a 20 20 73 77  en->n = 1;..  sw
2c790 69 74 63 68 28 20 2a 7a 20 29 7b 0d 0a 20 20 20  itch( *z ){..   
2c7a0 20 63 61 73 65 20 27 28 27 3a 20 20 74 6f 6b 20   case '(':  tok 
2c7b0 3d 20 46 54 53 35 5f 4c 50 3b 20 20 20 20 62 72  = FTS5_LP;    br
2c7c0 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 27  eak;..    case '
2c7d0 29 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f  )':  tok = FTS5_
2c7e0 52 50 3b 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20  RP;    break;.. 
2c7f0 20 20 20 63 61 73 65 20 27 7b 27 3a 20 20 74 6f     case '{':  to
2c800 6b 20 3d 20 46 54 53 35 5f 4c 43 50 3b 20 20 20  k = FTS5_LCP;   
2c810 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65  break;..    case
2c820 20 27 7d 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53   '}':  tok = FTS
2c830 35 5f 52 43 50 3b 20 20 20 62 72 65 61 6b 3b 0d  5_RCP;   break;.
2c840 0a 20 20 20 20 63 61 73 65 20 27 3a 27 3a 20 20  .    case ':':  
2c850 74 6f 6b 20 3d 20 46 54 53 35 5f 43 4f 4c 4f 4e  tok = FTS5_COLON
2c860 3b 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61  ; break;..    ca
2c870 73 65 20 27 2c 27 3a 20 20 74 6f 6b 20 3d 20 46  se ',':  tok = F
2c880 54 53 35 5f 43 4f 4d 4d 41 3b 20 62 72 65 61 6b  TS5_COMMA; break
2c890 3b 0d 0a 20 20 20 20 63 61 73 65 20 27 2b 27 3a  ;..    case '+':
2c8a0 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 50 4c 55    tok = FTS5_PLU
2c8b0 53 3b 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20  S;  break;..    
2c8c0 63 61 73 65 20 27 2a 27 3a 20 20 74 6f 6b 20 3d  case '*':  tok =
2c8d0 20 46 54 53 35 5f 53 54 41 52 3b 20 20 62 72 65   FTS5_STAR;  bre
2c8e0 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 27 2d  ak;..    case '-
2c8f0 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4d  ':  tok = FTS5_M
2c900 49 4e 55 53 3b 20 62 72 65 61 6b 3b 0d 0a 20 20  INUS; break;..  
2c910 20 20 63 61 73 65 20 27 5e 27 3a 20 20 74 6f 6b    case '^':  tok
2c920 20 3d 20 46 54 53 35 5f 43 41 52 45 54 3b 20 62   = FTS5_CARET; b
2c930 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
2c940 27 5c 30 27 3a 20 74 6f 6b 20 3d 20 46 54 53 35  '\0': tok = FTS5
2c950 5f 45 4f 46 3b 20 20 20 62 72 65 61 6b 3b 0d 0a  _EOF;   break;..
2c960 0d 0a 20 20 20 20 63 61 73 65 20 27 22 27 3a 20  ..    case '"': 
2c970 7b 0d 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  {..      const c
2c980 68 61 72 20 2a 7a 32 3b 0d 0a 20 20 20 20 20 20  har *z2;..      
2c990 74 6f 6b 20 3d 20 46 54 53 35 5f 53 54 52 49 4e  tok = FTS5_STRIN
2c9a0 47 3b 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 28  G;....      for(
2c9b0 7a 32 3d 26 7a 5b 31 5d 3b 20 31 3b 20 7a 32 2b  z2=&z[1]; 1; z2+
2c9c0 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  +){..        if(
2c9d0 20 7a 32 5b 30 5d 3d 3d 27 22 27 20 29 7b 0d 0a   z2[0]=='"' ){..
2c9e0 20 20 20 20 20 20 20 20 20 20 7a 32 2b 2b 3b 0d            z2++;.
2c9f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
2ca00 32 5b 30 5d 21 3d 27 22 27 20 29 20 62 72 65 61  2[0]!='"' ) brea
2ca10 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  k;..        }.. 
2ca20 20 20 20 20 20 20 20 69 66 28 20 7a 32 5b 30 5d         if( z2[0]
2ca30 3d 3d 27 5c 30 27 20 29 7b 0d 0a 20 20 20 20 20  =='\0' ){..     
2ca40 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2ca50 50 61 72 73 65 45 72 72 6f 72 28 70 50 61 72 73  ParseError(pPars
2ca60 65 2c 20 22 75 6e 74 65 72 6d 69 6e 61 74 65 64  e, "unterminated
2ca70 20 73 74 72 69 6e 67 22 29 3b 0d 0a 20 20 20 20   string");..    
2ca80 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 54 53        return FTS
2ca90 35 5f 45 4f 46 3b 0d 0a 20 20 20 20 20 20 20 20  5_EOF;..        
2caa0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2cab0 20 20 70 54 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a    pToken->n = (z
2cac0 32 20 2d 20 7a 29 3b 0d 0a 20 20 20 20 20 20 62  2 - z);..      b
2cad0 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  reak;..    }....
2cae0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0d 0a      default: {..
2caf0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2cb00 20 2a 7a 32 3b 0d 0a 20 20 20 20 20 20 69 66 28   *z2;..      if(
2cb10 20 73 71 6c 69 74 65 33 46 74 73 35 49 73 42 61   sqlite3Fts5IsBa
2cb20 72 65 77 6f 72 64 28 7a 5b 30 5d 29 3d 3d 30 20  reword(z[0])==0 
2cb30 29 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){..        sqli
2cb40 74 65 33 46 74 73 35 50 61 72 73 65 45 72 72 6f  te3Fts5ParseErro
2cb50 72 28 70 50 61 72 73 65 2c 20 22 66 74 73 35 3a  r(pParse, "fts5:
2cb60 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6e 65   syntax error ne
2cb70 61 72 20 5c 22 25 2e 31 73 5c 22 22 2c 20 7a 29  ar \"%.1s\"", z)
2cb80 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ;..        retur
2cb90 6e 20 46 54 53 35 5f 45 4f 46 3b 0d 0a 20 20 20  n FTS5_EOF;..   
2cba0 20 20 20 7d 0d 0a 20 20 20 20 20 20 74 6f 6b 20     }..      tok 
2cbb0 3d 20 46 54 53 35 5f 53 54 52 49 4e 47 3b 0d 0a  = FTS5_STRING;..
2cbc0 20 20 20 20 20 20 66 6f 72 28 7a 32 3d 26 7a 5b        for(z2=&z[
2cbd0 31 5d 3b 20 73 71 6c 69 74 65 33 46 74 73 35 49  1]; sqlite3Fts5I
2cbe0 73 42 61 72 65 77 6f 72 64 28 2a 7a 32 29 3b 20  sBareword(*z2); 
2cbf0 7a 32 2b 2b 29 3b 0d 0a 20 20 20 20 20 20 70 54  z2++);..      pT
2cc00 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a 32 20 2d 20  oken->n = (z2 - 
2cc10 7a 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70  z);..      if( p
2cc20 54 6f 6b 65 6e 2d 3e 6e 3d 3d 32 20 26 26 20 6d  Token->n==2 && m
2cc30 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2d 3e 70 2c  emcmp(pToken->p,
2cc40 20 22 4f 52 22 2c 20 32 29 3d 3d 30 20 29 20 20   "OR", 2)==0 )  
2cc50 74 6f 6b 20 3d 20 46 54 53 35 5f 4f 52 3b 0d 0a  tok = FTS5_OR;..
2cc60 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e        if( pToken
2cc70 2d 3e 6e 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  ->n==3 && memcmp
2cc80 28 70 54 6f 6b 65 6e 2d 3e 70 2c 20 22 4e 4f 54  (pToken->p, "NOT
2cc90 22 2c 20 33 29 3d 3d 30 20 29 20 74 6f 6b 20 3d  ", 3)==0 ) tok =
2cca0 20 46 54 53 35 5f 4e 4f 54 3b 0d 0a 20 20 20 20   FTS5_NOT;..    
2ccb0 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d    if( pToken->n=
2ccc0 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 6f  =3 && memcmp(pTo
2ccd0 6b 65 6e 2d 3e 70 2c 20 22 41 4e 44 22 2c 20 33  ken->p, "AND", 3
2cce0 29 3d 3d 30 20 29 20 74 6f 6b 20 3d 20 46 54 53  )==0 ) tok = FTS
2ccf0 35 5f 41 4e 44 3b 0d 0a 20 20 20 20 20 20 62 72  5_AND;..      br
2cd00 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  eak;..    }..  }
2cd10 0d 0a 0d 0a 20 20 2a 70 7a 20 3d 20 26 70 54 6f  ....  *pz = &pTo
2cd20 6b 65 6e 2d 3e 70 5b 70 54 6f 6b 65 6e 2d 3e 6e  ken->p[pToken->n
2cd30 5d 3b 0d 0a 20 20 72 65 74 75 72 6e 20 74 6f 6b  ];..  return tok
2cd40 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76  ;..}....static v
2cd50 6f 69 64 20 2a 66 74 73 35 50 61 72 73 65 41 6c  oid *fts5ParseAl
2cd60 6c 6f 63 28 75 36 34 20 74 29 7b 20 72 65 74 75  loc(u64 t){ retu
2cd70 72 6e 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  rn sqlite3_mallo
2cd80 63 36 34 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  c64((sqlite3_int
2cd90 36 34 29 74 29 3b 7d 0d 0a 73 74 61 74 69 63 20  64)t);}..static 
2cda0 76 6f 69 64 20 66 74 73 35 50 61 72 73 65 46 72  void fts5ParseFr
2cdb0 65 65 28 76 6f 69 64 20 2a 70 29 7b 20 73 71 6c  ee(void *p){ sql
2cdc0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 20 7d 0d  ite3_free(p); }.
2cdd0 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ...static int sq
2cde0 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e 65 77  lite3Fts5ExprNew
2cdf0 28 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  (..  Fts5Config 
2ce00 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20  *pConfig,       
2ce10 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e       /* FTS5 Con
2ce20 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0d 0a 20  figuration */.. 
2ce30 20 69 6e 74 20 69 43 6f 6c 2c 0d 0a 20 20 63 6f   int iCol,..  co
2ce40 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c  nst char *zExpr,
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ce60 20 45 78 70 72 65 73 73 69 6f 6e 20 74 65 78 74   Expression text
2ce70 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 20   */..  Fts5Expr 
2ce80 2a 2a 70 70 4e 65 77 2c 20 0d 0a 20 20 63 68 61  **ppNew, ..  cha
2ce90 72 20 2a 2a 70 7a 45 72 72 0d 0a 29 7b 0d 0a 20  r **pzErr..){.. 
2cea0 20 46 74 73 35 50 61 72 73 65 20 73 50 61 72 73   Fts5Parse sPars
2ceb0 65 3b 0d 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20  e;..  Fts5Token 
2cec0 74 6f 6b 65 6e 3b 0d 0a 20 20 63 6f 6e 73 74 20  token;..  const 
2ced0 63 68 61 72 20 2a 7a 20 3d 20 7a 45 78 70 72 3b  char *z = zExpr;
2cee0 0d 0a 20 20 69 6e 74 20 74 3b 20 20 20 20 20 20  ..  int t;      
2cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf00 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 6f 6b 65      /* Next toke
2cf10 6e 20 74 79 70 65 20 2a 2f 0d 0a 20 20 76 6f 69  n type */..  voi
2cf20 64 20 2a 70 45 6e 67 69 6e 65 3b 0d 0a 20 20 46  d *pEngine;..  F
2cf30 74 73 35 45 78 70 72 20 2a 70 4e 65 77 3b 0d 0a  ts5Expr *pNew;..
2cf40 0d 0a 20 20 2a 70 70 4e 65 77 20 3d 20 30 3b 0d  ..  *ppNew = 0;.
2cf50 0a 20 20 2a 70 7a 45 72 72 20 3d 20 30 3b 0d 0a  .  *pzErr = 0;..
2cf60 20 20 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65    memset(&sParse
2cf70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 50 61 72  , 0, sizeof(sPar
2cf80 73 65 29 29 3b 0d 0a 20 20 70 45 6e 67 69 6e 65  se));..  pEngine
2cf90 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   = sqlite3Fts5Pa
2cfa0 72 73 65 72 41 6c 6c 6f 63 28 66 74 73 35 50 61  rserAlloc(fts5Pa
2cfb0 72 73 65 41 6c 6c 6f 63 29 3b 0d 0a 20 20 69 66  rseAlloc);..  if
2cfc0 28 20 70 45 6e 67 69 6e 65 3d 3d 30 20 29 7b 20  ( pEngine==0 ){ 
2cfd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2cfe0 4d 45 4d 3b 20 7d 0d 0a 20 20 73 50 61 72 73 65  MEM; }..  sParse
2cff0 2e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  .pConfig = pConf
2d000 69 67 3b 0d 0a 0d 0a 20 20 64 6f 20 7b 0d 0a 20  ig;....  do {.. 
2d010 20 20 20 74 20 3d 20 66 74 73 35 45 78 70 72 47     t = fts5ExprG
2d020 65 74 54 6f 6b 65 6e 28 26 73 50 61 72 73 65 2c  etToken(&sParse,
2d030 20 26 7a 2c 20 26 74 6f 6b 65 6e 29 3b 0d 0a 20   &z, &token);.. 
2d040 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
2d050 72 73 65 72 28 70 45 6e 67 69 6e 65 2c 20 74 2c  rser(pEngine, t,
2d060 20 74 6f 6b 65 6e 2c 20 26 73 50 61 72 73 65 29   token, &sParse)
2d070 3b 0d 0a 20 20 7d 77 68 69 6c 65 28 20 73 50 61  ;..  }while( sPa
2d080 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rse.rc==SQLITE_O
2d090 4b 20 26 26 20 74 21 3d 46 54 53 35 5f 45 4f 46  K && t!=FTS5_EOF
2d0a0 20 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 46 74   );..  sqlite3Ft
2d0b0 73 35 50 61 72 73 65 72 46 72 65 65 28 70 45 6e  s5ParserFree(pEn
2d0c0 67 69 6e 65 2c 20 66 74 73 35 50 61 72 73 65 46  gine, fts5ParseF
2d0d0 72 65 65 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66  ree);....  /* If
2d0e0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
2d0f0 4d 41 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e  MATCH expression
2d100 20 77 61 73 20 61 20 75 73 65 72 20 63 6f 6c 75   was a user colu
2d110 6d 6e 2c 20 61 70 70 6c 79 20 74 68 65 0d 0a 20  mn, apply the.. 
2d120 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 63 6f 6c   ** implicit col
2d130 75 6d 6e 2d 66 69 6c 74 65 72 2e 20 20 2a 2f 0d  umn-filter.  */.
2d140 0a 20 20 69 66 28 20 69 43 6f 6c 3c 70 43 6f 6e  .  if( iCol<pCon
2d150 66 69 67 2d 3e 6e 43 6f 6c 20 26 26 20 73 50 61  fig->nCol && sPa
2d160 72 73 65 2e 70 45 78 70 72 20 26 26 20 73 50 61  rse.pExpr && sPa
2d170 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rse.rc==SQLITE_O
2d180 4b 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 20  K ){..    int n 
2d190 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c  = sizeof(Fts5Col
2d1a0 73 65 74 29 3b 0d 0a 20 20 20 20 46 74 73 35 43  set);..    Fts5C
2d1b0 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d  olset *pColset =
2d1c0 20 28 46 74 73 35 43 6f 6c 73 65 74 2a 29 73 71   (Fts5Colset*)sq
2d1d0 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
2d1e0 65 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c 20  ero(&sParse.rc, 
2d1f0 6e 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 43 6f  n);..    if( pCo
2d200 6c 73 65 74 20 29 7b 0d 0a 20 20 20 20 20 20 70  lset ){..      p
2d210 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 20 3d 20 31  Colset->nCol = 1
2d220 3b 0d 0a 20 20 20 20 20 20 70 43 6f 6c 73 65 74  ;..      pColset
2d230 2d 3e 61 69 43 6f 6c 5b 30 5d 20 3d 20 69 43 6f  ->aiCol[0] = iCo
2d240 6c 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l;..      sqlite
2d250 33 46 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c  3Fts5ParseSetCol
2d260 73 65 74 28 26 73 50 61 72 73 65 2c 20 73 50 61  set(&sParse, sPa
2d270 72 73 65 2e 70 45 78 70 72 2c 20 70 43 6f 6c 73  rse.pExpr, pCols
2d280 65 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  et);..    }..  }
2d290 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 73 50  ....  assert( sP
2d2a0 61 72 73 65 2e 72 63 21 3d 53 51 4c 49 54 45 5f  arse.rc!=SQLITE_
2d2b0 4f 4b 20 7c 7c 20 73 50 61 72 73 65 2e 7a 45 72  OK || sParse.zEr
2d2c0 72 3d 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 73  r==0 );..  if( s
2d2d0 50 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45  Parse.rc==SQLITE
2d2e0 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 2a 70 70 4e  _OK ){..    *ppN
2d2f0 65 77 20 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69  ew = pNew = sqli
2d300 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2d310 66 28 46 74 73 35 45 78 70 72 29 29 3b 0d 0a 20  f(Fts5Expr));.. 
2d320 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
2d330 7b 0d 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e  {..      sParse.
2d340 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2d350 4d 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  M;..      sqlite
2d360 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72  3Fts5ParseNodeFr
2d370 65 65 28 73 50 61 72 73 65 2e 70 45 78 70 72 29  ee(sParse.pExpr)
2d380 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20  ;..    }else{.. 
2d390 20 20 20 20 20 69 66 28 20 21 73 50 61 72 73 65       if( !sParse
2d3a0 2e 70 45 78 70 72 20 29 7b 0d 0a 20 20 20 20 20  .pExpr ){..     
2d3b0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79     const int nBy
2d3c0 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
2d3d0 45 78 70 72 4e 6f 64 65 29 3b 0d 0a 20 20 20 20  ExprNode);..    
2d3e0 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20      pNew->pRoot 
2d3f0 3d 20 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a  = (Fts5ExprNode*
2d400 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
2d410 6f 63 5a 65 72 6f 28 26 73 50 61 72 73 65 2e 72  ocZero(&sParse.r
2d420 63 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20  c, nByte);..    
2d430 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 52      if( pNew->pR
2d440 6f 6f 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  oot ){..        
2d450 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 62    pNew->pRoot->b
2d460 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  Eof = 1;..      
2d470 20 20 7d 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65    }..      }else
2d480 7b 0d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  {..        pNew-
2d490 3e 70 52 6f 6f 74 20 3d 20 73 50 61 72 73 65 2e  >pRoot = sParse.
2d4a0 70 45 78 70 72 3b 0d 0a 20 20 20 20 20 20 7d 0d  pExpr;..      }.
2d4b0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
2d4c0 64 65 78 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20  dex = 0;..      
2d4d0 70 4e 65 77 2d 3e 70 43 6f 6e 66 69 67 20 3d 20  pNew->pConfig = 
2d4e0 70 43 6f 6e 66 69 67 3b 0d 0a 20 20 20 20 20 20  pConfig;..      
2d4f0 70 4e 65 77 2d 3e 61 70 45 78 70 72 50 68 72 61  pNew->apExprPhra
2d500 73 65 20 3d 20 73 50 61 72 73 65 2e 61 70 50 68  se = sParse.apPh
2d510 72 61 73 65 3b 0d 0a 20 20 20 20 20 20 70 4e 65  rase;..      pNe
2d520 77 2d 3e 6e 50 68 72 61 73 65 20 3d 20 73 50 61  w->nPhrase = sPa
2d530 72 73 65 2e 6e 50 68 72 61 73 65 3b 0d 0a 20 20  rse.nPhrase;..  
2d540 20 20 20 20 73 50 61 72 73 65 2e 61 70 50 68 72      sParse.apPhr
2d550 61 73 65 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d  ase = 0;..    }.
2d560 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 73  .  }else{..    s
2d570 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
2d580 6f 64 65 46 72 65 65 28 73 50 61 72 73 65 2e 70  odeFree(sParse.p
2d590 45 78 70 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20  Expr);..  }.... 
2d5a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 50   sqlite3_free(sP
2d5b0 61 72 73 65 2e 61 70 50 68 72 61 73 65 29 3b 0d  arse.apPhrase);.
2d5c0 0a 20 20 2a 70 7a 45 72 72 20 3d 20 73 50 61 72  .  *pzErr = sPar
2d5d0 73 65 2e 7a 45 72 72 3b 0d 0a 20 20 72 65 74 75  se.zErr;..  retu
2d5e0 72 6e 20 73 50 61 72 73 65 2e 72 63 3b 0d 0a 7d  rn sParse.rc;..}
2d5f0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20  ..../*..** Free 
2d600 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2d610 6f 64 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ode object passe
2d620 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2d630 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61  gument...*/..sta
2d640 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
2d650 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65  Fts5ParseNodeFre
2d660 65 28 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  e(Fts5ExprNode *
2d670 70 29 7b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d  p){..  if( p ){.
2d680 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20  .    int i;..   
2d690 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2d6a0 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0d 0a 20 20  Child; i++){..  
2d6b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
2d6c0 61 72 73 65 4e 6f 64 65 46 72 65 65 28 70 2d 3e  arseNodeFree(p->
2d6d0 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20 20  apChild[i]);..  
2d6e0 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
2d6f0 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74  Fts5ParseNearset
2d700 46 72 65 65 28 70 2d 3e 70 4e 65 61 72 29 3b 0d  Free(p->pNear);.
2d710 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2d720 65 28 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d  e(p);..  }..}...
2d730 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65  ./*..** Free the
2d740 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65   expression obje
2d750 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2d760 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d   only argument..
2d770 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
2d780 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
2d790 46 72 65 65 28 46 74 73 35 45 78 70 72 20 2a 70  Free(Fts5Expr *p
2d7a0 29 7b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a  ){..  if( p ){..
2d7b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
2d7c0 61 72 73 65 4e 6f 64 65 46 72 65 65 28 70 2d 3e  arseNodeFree(p->
2d7d0 70 52 6f 6f 74 29 3b 0d 0a 20 20 20 20 73 71 6c  pRoot);..    sql
2d7e0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 45  ite3_free(p->apE
2d7f0 78 70 72 50 68 72 61 73 65 29 3b 0d 0a 20 20 20  xprPhrase);..   
2d800 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
2d810 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  ;..  }..}..../*.
2d820 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 54 65  .** Argument pTe
2d830 72 6d 20 6d 75 73 74 20 62 65 20 61 20 73 79 6e  rm must be a syn
2d840 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e 20 52  onym iterator. R
2d850 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
2d860 74 20 72 6f 77 69 64 0d 0a 2a 2a 20 74 68 61 74  t rowid..** that
2d870 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 2e 0d 0a   it points to...
2d880 2a 2f 0d 0a 73 74 61 74 69 63 20 69 36 34 20 66  */..static i64 f
2d890 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f  ts5ExprSynonymRo
2d8a0 77 69 64 28 46 74 73 35 45 78 70 72 54 65 72 6d  wid(Fts5ExprTerm
2d8b0 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 62 44 65   *pTerm, int bDe
2d8c0 73 63 2c 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b  sc, int *pbEof){
2d8d0 0d 0a 20 20 69 36 34 20 69 52 65 74 20 3d 20 30  ..  i64 iRet = 0
2d8e0 3b 0d 0a 20 20 69 6e 74 20 62 52 65 74 56 61 6c  ;..  int bRetVal
2d8f0 69 64 20 3d 20 30 3b 0d 0a 20 20 46 74 73 35 45  id = 0;..  Fts5E
2d900 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a 0d 0a 20  xprTerm *p;.... 
2d910 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
2d920 70 53 79 6e 6f 6e 79 6d 20 29 3b 0d 0a 20 20 61  pSynonym );..  a
2d930 73 73 65 72 74 28 20 62 44 65 73 63 3d 3d 30 20  ssert( bDesc==0 
2d940 7c 7c 20 62 44 65 73 63 3d 3d 31 20 29 3b 0d 0a  || bDesc==1 );..
2d950 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70    for(p=pTerm; p
2d960 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29  ; p=p->pSynonym)
2d970 7b 0d 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  {..    if( 0==sq
2d980 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
2d990 28 70 2d 3e 70 49 74 65 72 29 20 29 7b 0d 0a 20  (p->pIter) ){.. 
2d9a0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
2d9b0 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69 52 6f 77  = p->pIter->iRow
2d9c0 69 64 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 62  id;..      if( b
2d9d0 52 65 74 56 61 6c 69 64 3d 3d 30 20 7c 7c 20 28  RetValid==0 || (
2d9e0 62 44 65 73 63 21 3d 28 69 52 6f 77 69 64 3c 69  bDesc!=(iRowid<i
2d9f0 52 65 74 29 29 20 29 7b 0d 0a 20 20 20 20 20 20  Ret)) ){..      
2da00 20 20 69 52 65 74 20 3d 20 69 52 6f 77 69 64 3b    iRet = iRowid;
2da10 0d 0a 20 20 20 20 20 20 20 20 62 52 65 74 56 61  ..        bRetVa
2da20 6c 69 64 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  lid = 1;..      
2da30 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  }..    }..  }...
2da40 0a 20 20 69 66 28 20 70 62 45 6f 66 20 26 26 20  .  if( pbEof && 
2da50 62 52 65 74 56 61 6c 69 64 3d 3d 30 20 29 20 2a  bRetValid==0 ) *
2da60 70 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 72 65  pbEof = 1;..  re
2da70 74 75 72 6e 20 69 52 65 74 3b 0d 0a 7d 0d 0a 0d  turn iRet;..}...
2da80 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ./*..** Argument
2da90 20 70 54 65 72 6d 20 6d 75 73 74 20 62 65 20 61   pTerm must be a
2daa0 20 73 79 6e 6f 6e 79 6d 20 69 74 65 72 61 74 6f   synonym iterato
2dab0 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69  r...*/..static i
2dac0 6e 74 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e  nt fts5ExprSynon
2dad0 79 6d 4c 69 73 74 28 0d 0a 20 20 46 74 73 35 45  ymList(..  Fts5E
2dae0 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  xprTerm *pTerm, 
2daf0 0d 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0d  ..  i64 iRowid,.
2db00 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2db10 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
2db20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 62     /* Use this b
2db30 75 66 66 65 72 20 66 6f 72 20 73 70 61 63 65 20  uffer for space 
2db40 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0d 0a  if required */..
2db50 20 20 75 38 20 2a 2a 70 61 2c 20 69 6e 74 20 2a    u8 **pa, int *
2db60 70 6e 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 50 6f  pn..){..  Fts5Po
2db70 73 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61  slistReader aSta
2db80 74 69 63 5b 34 5d 3b 0d 0a 20 20 46 74 73 35 50  tic[4];..  Fts5P
2db90 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49  oslistReader *aI
2dba0 74 65 72 20 3d 20 61 53 74 61 74 69 63 3b 0d 0a  ter = aStatic;..
2dbb0 20 20 69 6e 74 20 6e 49 74 65 72 20 3d 20 30 3b    int nIter = 0;
2dbc0 0d 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  ..  int nAlloc =
2dbd0 20 34 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20   4;..  int rc = 
2dbe0 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 46 74  SQLITE_OK;..  Ft
2dbf0 73 35 45 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a  s5ExprTerm *p;..
2dc00 0d 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72  ..  assert( pTer
2dc10 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 3b 0d 0a  m->pSynonym );..
2dc20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70    for(p=pTerm; p
2dc30 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29  ; p=p->pSynonym)
2dc40 7b 0d 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78  {..    Fts5Index
2dc50 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 70 2d  Iter *pIter = p-
2dc60 3e 70 49 74 65 72 3b 0d 0a 20 20 20 20 69 66 28  >pIter;..    if(
2dc70 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2dc80 45 6f 66 28 70 49 74 65 72 29 3d 3d 30 20 26 26  Eof(pIter)==0 &&
2dc90 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3d 3d   pIter->iRowid==
2dca0 69 52 6f 77 69 64 20 29 7b 0d 0a 20 20 20 20 20  iRowid ){..     
2dcb0 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 44 61 74   if( pIter->nDat
2dcc0 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  a==0 ) continue;
2dcd0 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 49 74 65  ..      if( nIte
2dce0 72 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0d 0a 20 20  r==nAlloc ){..  
2dcf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
2dd00 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
2dd10 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  of(Fts5PoslistRe
2dd20 61 64 65 72 29 20 2a 20 6e 41 6c 6c 6f 63 20 2a  ader) * nAlloc *
2dd30 20 32 3b 0d 0a 20 20 20 20 20 20 20 20 46 74 73   2;..        Fts
2dd40 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a  5PoslistReader *
2dd50 61 4e 65 77 20 3d 20 28 46 74 73 35 50 6f 73 6c  aNew = (Fts5Posl
2dd60 69 73 74 52 65 61 64 65 72 2a 29 73 71 6c 69 74  istReader*)sqlit
2dd70 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
2dd80 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  e);..        if(
2dd90 20 61 4e 65 77 3d 3d 30 20 29 7b 0d 0a 20 20 20   aNew==0 ){..   
2dda0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2ddb0 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20  TE_NOMEM;..     
2ddc0 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 6f 6e 79       goto synony
2ddd0 6d 5f 70 6f 73 6c 69 73 74 5f 6f 75 74 3b 0d 0a  m_poslist_out;..
2dde0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2ddf0 20 20 20 6d 65 6d 63 70 79 28 61 4e 65 77 2c 20     memcpy(aNew, 
2de00 61 49 74 65 72 2c 20 73 69 7a 65 6f 66 28 46 74  aIter, sizeof(Ft
2de10 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 29  s5PoslistReader)
2de20 20 2a 20 6e 49 74 65 72 29 3b 0d 0a 20 20 20 20   * nIter);..    
2de30 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c      nAlloc = nAl
2de40 6c 6f 63 2a 32 3b 0d 0a 20 20 20 20 20 20 20 20  loc*2;..        
2de50 69 66 28 20 61 49 74 65 72 21 3d 61 53 74 61 74  if( aIter!=aStat
2de60 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  ic ) sqlite3_fre
2de70 65 28 61 49 74 65 72 29 3b 0d 0a 20 20 20 20 20  e(aIter);..     
2de80 20 20 20 61 49 74 65 72 20 3d 20 61 4e 65 77 3b     aIter = aNew;
2de90 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
2dea0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2deb0 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 70 49  istReaderInit(pI
2dec0 74 65 72 2d 3e 70 44 61 74 61 2c 20 70 49 74 65  ter->pData, pIte
2ded0 72 2d 3e 6e 44 61 74 61 2c 20 26 61 49 74 65 72  r->nData, &aIter
2dee0 5b 6e 49 74 65 72 5d 29 3b 0d 0a 20 20 20 20 20  [nIter]);..     
2def0 20 61 73 73 65 72 74 28 20 61 49 74 65 72 5b 6e   assert( aIter[n
2df00 49 74 65 72 5d 2e 62 45 6f 66 3d 3d 30 20 29 3b  Iter].bEof==0 );
2df10 0d 0a 20 20 20 20 20 20 6e 49 74 65 72 2b 2b 3b  ..      nIter++;
2df20 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
2df30 20 20 69 66 28 20 6e 49 74 65 72 3d 3d 31 20 29    if( nIter==1 )
2df40 7b 0d 0a 20 20 20 20 2a 70 61 20 3d 20 28 75 38  {..    *pa = (u8
2df50 2a 29 61 49 74 65 72 5b 30 5d 2e 61 3b 0d 0a 20  *)aIter[0].a;.. 
2df60 20 20 20 2a 70 6e 20 3d 20 61 49 74 65 72 5b 30     *pn = aIter[0
2df70 5d 2e 6e 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a  ].n;..  }else{..
2df80 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57      Fts5PoslistW
2df90 72 69 74 65 72 20 77 72 69 74 65 72 20 3d 20 7b  riter writer = {
2dfa0 30 7d 3b 0d 0a 20 20 20 20 69 36 34 20 69 50 72  0};..    i64 iPr
2dfb0 65 76 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 66 74  ev = -1;..    ft
2dfc0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75  s5BufferZero(pBu
2dfd0 66 29 3b 0d 0a 20 20 20 20 77 68 69 6c 65 28 20  f);..    while( 
2dfe0 31 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20  1 ){..      int 
2dff0 69 3b 0d 0a 20 20 20 20 20 20 69 36 34 20 69 4d  i;..      i64 iM
2e000 69 6e 20 3d 20 46 54 53 35 5f 4c 41 52 47 45 53  in = FTS5_LARGES
2e010 54 5f 49 4e 54 36 34 3b 0d 0a 20 20 20 20 20 20  T_INT64;..      
2e020 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 74 65 72  for(i=0; i<nIter
2e030 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20  ; i++){..       
2e040 20 69 66 28 20 61 49 74 65 72 5b 69 5d 2e 62 45   if( aIter[i].bE
2e050 6f 66 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  of==0 ){..      
2e060 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d      if( aIter[i]
2e070 2e 69 50 6f 73 3d 3d 69 50 72 65 76 20 29 7b 0d  .iPos==iPrev ){.
2e080 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e090 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2e0a0 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 61  istReaderNext(&a
2e0b0 49 74 65 72 5b 69 5d 29 20 29 20 63 6f 6e 74 69  Iter[i]) ) conti
2e0c0 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
2e0d0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  }..          if(
2e0e0 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73 3c 69   aIter[i].iPos<i
2e0f0 4d 69 6e 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  Min ){..        
2e100 20 20 20 20 69 4d 69 6e 20 3d 20 61 49 74 65 72      iMin = aIter
2e110 5b 69 5d 2e 69 50 6f 73 3b 0d 0a 20 20 20 20 20  [i].iPos;..     
2e120 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2e130 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2e140 20 20 69 66 28 20 69 4d 69 6e 3d 3d 46 54 53 35    if( iMin==FTS5
2e150 5f 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 7c  _LARGEST_INT64 |
2e160 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
2e170 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20  ) break;..      
2e180 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
2e190 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
2e1a0 65 6e 64 28 70 42 75 66 2c 20 26 77 72 69 74 65  end(pBuf, &write
2e1b0 72 2c 20 69 4d 69 6e 29 3b 0d 0a 20 20 20 20 20  r, iMin);..     
2e1c0 20 69 50 72 65 76 20 3d 20 69 4d 69 6e 3b 0d 0a   iPrev = iMin;..
2e1d0 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 72      }..    if( r
2e1e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
2e1f0 0a 20 20 20 20 20 20 2a 70 61 20 3d 20 70 42 75  .      *pa = pBu
2e200 66 2d 3e 70 3b 0d 0a 20 20 20 20 20 20 2a 70 6e  f->p;..      *pn
2e210 20 3d 20 70 42 75 66 2d 3e 6e 3b 0d 0a 20 20 20   = pBuf->n;..   
2e220 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 73 79 6e 6f   }..  }.... syno
2e230 6e 79 6d 5f 70 6f 73 6c 69 73 74 5f 6f 75 74 3a  nym_poslist_out:
2e240 0d 0a 20 20 69 66 28 20 61 49 74 65 72 21 3d 61  ..  if( aIter!=a
2e250 53 74 61 74 69 63 20 29 20 73 71 6c 69 74 65 33  Static ) sqlite3
2e260 5f 66 72 65 65 28 61 49 74 65 72 29 3b 0d 0a 20  _free(aIter);.. 
2e270 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a   return rc;..}..
2e280 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 20 69  ..../*..** All i
2e290 6e 64 69 76 69 64 75 61 6c 20 74 65 72 6d 20 69  ndividual term i
2e2a0 74 65 72 61 74 6f 72 73 20 69 6e 20 70 50 68 72  terators in pPhr
2e2b0 61 73 65 20 61 72 65 20 67 75 61 72 61 6e 74 65  ase are guarante
2e2c0 65 64 20 74 6f 20 62 65 20 76 61 6c 69 64 20 61  ed to be valid a
2e2d0 6e 64 0d 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  nd..** pointing 
2e2e0 74 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69  to the same rowi
2e2f0 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2e300 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20  tion is called. 
2e310 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0d 0a  This function ..
2e320 2a 2a 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ** checks if the
2e330 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 20 72   current rowid r
2e340 65 61 6c 6c 79 20 69 73 20 61 20 6d 61 74 63 68  eally is a match
2e350 2c 20 61 6e 64 20 69 66 20 73 6f 20 70 6f 70 75  , and if so popu
2e360 6c 61 74 65 73 0d 0a 2a 2a 20 74 68 65 20 70 50  lates..** the pP
2e370 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 20 62  hrase->poslist b
2e380 75 66 66 65 72 20 61 63 63 6f 72 64 69 6e 67 6c  uffer accordingl
2e390 79 2e 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65  y. Output parame
2e3a0 74 65 72 20 2a 70 62 4d 61 74 63 68 0d 0a 2a 2a  ter *pbMatch..**
2e3b0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
2e3c0 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c  if this is reall
2e3d0 79 20 61 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  y a match, or fa
2e3e0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a  lse otherwise...
2e3f0 2a 2a 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  **..** SQLITE_OK
2e400 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2e410 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2e420 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
2e430 72 6f 72 20 63 6f 64 65 20 0d 0a 2a 2a 20 6f 74  ror code ..** ot
2e440 68 65 72 77 69 73 65 2e 20 49 74 20 69 73 20 6e  herwise. It is n
2e450 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
2e460 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2e470 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64  he current rowid
2e480 20 69 73 20 0d 0a 2a 2a 20 6e 6f 74 20 61 20 6d   is ..** not a m
2e490 61 74 63 68 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  atch...*/..stati
2e4a0 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 50 68  c int fts5ExprPh
2e4b0 72 61 73 65 49 73 4d 61 74 63 68 28 0d 0a 20 20  raseIsMatch(..  
2e4c0 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
2e4d0 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
2e4e0 2f 2a 20 4e 6f 64 65 20 70 50 68 72 61 73 65 20  /* Node pPhrase 
2e4f0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d 0a 20  belongs to */.. 
2e500 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
2e510 2a 70 50 68 72 61 73 65 2c 20 20 20 20 20 20 20  *pPhrase,       
2e520 20 2f 2a 20 50 68 72 61 73 65 20 6f 62 6a 65 63   /* Phrase objec
2e530 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  t to initialize 
2e540 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 62 4d 61 74  */..  int *pbMat
2e550 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
2e560 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
2e570 74 20 74 6f 20 74 72 75 65 20 69 66 20 72 65 61  t to true if rea
2e580 6c 6c 79 20 61 20 6d 61 74 63 68 20 2a 2f 0d 0a  lly a match */..
2e590 29 7b 0d 0a 20 20 46 74 73 35 50 6f 73 6c 69 73  ){..  Fts5Poslis
2e5a0 74 57 72 69 74 65 72 20 77 72 69 74 65 72 20 3d  tWriter writer =
2e5b0 20 7b 30 7d 3b 0d 0a 20 20 46 74 73 35 50 6f 73   {0};..  Fts5Pos
2e5c0 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61 74  listReader aStat
2e5d0 69 63 5b 34 5d 3b 0d 0a 20 20 46 74 73 35 50 6f  ic[4];..  Fts5Po
2e5e0 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49 74  slistReader *aIt
2e5f0 65 72 20 3d 20 61 53 74 61 74 69 63 3b 0d 0a 20  er = aStatic;.. 
2e600 20 69 6e 74 20 69 3b 0d 0a 20 20 69 6e 74 20 72   int i;..  int r
2e610 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  c = SQLITE_OK;..
2e620 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d 20 70    int bFirst = p
2e630 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d  Phrase->aTerm[0]
2e640 2e 62 46 69 72 73 74 3b 0d 0a 20 20 0d 0a 20 20  .bFirst;..  ..  
2e650 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
2e660 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
2e670 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68  );....  /* If th
2e680 65 20 61 53 74 61 74 69 63 5b 5d 20 61 72 72 61  e aStatic[] arra
2e690 79 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65  y is not large e
2e6a0 6e 6f 75 67 68 2c 20 61 6c 6c 6f 63 61 74 65 20  nough, allocate 
2e6b0 61 20 6c 61 72 67 65 20 61 72 72 61 79 0d 0a 20  a large array.. 
2e6c0 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65   ** using sqlite
2e6d0 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73  3_malloc(). This
2e6e0 20 61 70 70 72 6f 61 63 68 20 63 6f 75 6c 64 20   approach could 
2e6f0 62 65 20 69 6d 70 72 6f 76 65 64 20 75 70 6f 6e  be improved upon
2e700 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 70 50 68 72  . */..  if( pPhr
2e710 61 73 65 2d 3e 6e 54 65 72 6d 3e 41 72 72 61 79  ase->nTerm>Array
2e720 53 69 7a 65 28 61 53 74 61 74 69 63 29 20 29 7b  Size(aStatic) ){
2e730 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ..    sqlite3_in
2e740 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
2e750 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  of(Fts5PoslistRe
2e760 61 64 65 72 29 20 2a 20 70 50 68 72 61 73 65 2d  ader) * pPhrase-
2e770 3e 6e 54 65 72 6d 3b 0d 0a 20 20 20 20 61 49 74  >nTerm;..    aIt
2e780 65 72 20 3d 20 28 46 74 73 35 50 6f 73 6c 69 73  er = (Fts5Poslis
2e790 74 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33  tReader*)sqlite3
2e7a0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
2e7b0 3b 0d 0a 20 20 20 20 69 66 28 20 21 61 49 74 65  ;..    if( !aIte
2e7c0 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
2e7d0 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 20  E_NOMEM;..  }.. 
2e7e0 20 6d 65 6d 73 65 74 28 61 49 74 65 72 2c 20 30   memset(aIter, 0
2e7f0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73  , sizeof(Fts5Pos
2e800 6c 69 73 74 52 65 61 64 65 72 29 20 2a 20 70 50  listReader) * pP
2e810 68 72 61 73 65 2d 3e 6e 54 65 72 6d 29 3b 0d 0a  hrase->nTerm);..
2e820 0d 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2e830 65 20 61 20 74 65 72 6d 20 69 74 65 72 61 74 6f  e a term iterato
2e840 72 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  r for each term 
2e850 69 6e 20 74 68 65 20 70 68 72 61 73 65 20 2a 2f  in the phrase */
2e860 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
2e870 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69  Phrase->nTerm; i
2e880 2b 2b 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78  ++){..    Fts5Ex
2e890 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  prTerm *pTerm = 
2e8a0 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b  &pPhrase->aTerm[
2e8b0 69 5d 3b 0d 0a 20 20 20 20 69 6e 74 20 6e 20 3d  i];..    int n =
2e8c0 20 30 3b 0d 0a 20 20 20 20 69 6e 74 20 62 46 6c   0;..    int bFl
2e8d0 61 67 20 3d 20 30 3b 0d 0a 20 20 20 20 75 38 20  ag = 0;..    u8 
2e8e0 2a 61 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28  *a = 0;..    if(
2e8f0 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d   pTerm->pSynonym
2e900 20 29 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 42   ){..      Fts5B
2e910 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20  uffer buf = {0, 
2e920 30 2c 20 30 7d 3b 0d 0a 20 20 20 20 20 20 72 63  0, 0};..      rc
2e930 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e   = fts5ExprSynon
2e940 79 6d 4c 69 73 74 28 70 54 65 72 6d 2c 20 70 4e  ymList(pTerm, pN
2e950 6f 64 65 2d 3e 69 52 6f 77 69 64 2c 20 26 62 75  ode->iRowid, &bu
2e960 66 2c 20 26 61 2c 20 26 6e 29 3b 0d 0a 20 20 20  f, &a, &n);..   
2e970 20 20 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 20     if( rc ){..  
2e980 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2e990 65 65 28 61 29 3b 0d 0a 20 20 20 20 20 20 20 20  ee(a);..        
2e9a0 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74  goto ismatch_out
2e9b0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
2e9c0 20 20 69 66 28 20 61 3d 3d 62 75 66 2e 70 20 29    if( a==buf.p )
2e9d0 20 62 46 6c 61 67 20 3d 20 31 3b 0d 0a 20 20 20   bFlag = 1;..   
2e9e0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61   }else{..      a
2e9f0 20 3d 20 28 75 38 2a 29 70 54 65 72 6d 2d 3e 70   = (u8*)pTerm->p
2ea00 49 74 65 72 2d 3e 70 44 61 74 61 3b 0d 0a 20 20  Iter->pData;..  
2ea10 20 20 20 20 6e 20 3d 20 70 54 65 72 6d 2d 3e 70      n = pTerm->p
2ea20 49 74 65 72 2d 3e 6e 44 61 74 61 3b 0d 0a 20 20  Iter->nData;..  
2ea30 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
2ea40 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2ea50 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 61 49 74  rInit(a, n, &aIt
2ea60 65 72 5b 69 5d 29 3b 0d 0a 20 20 20 20 61 49 74  er[i]);..    aIt
2ea70 65 72 5b 69 5d 2e 62 46 6c 61 67 20 3d 20 28 75  er[i].bFlag = (u
2ea80 38 29 62 46 6c 61 67 3b 0d 0a 20 20 20 20 69 66  8)bFlag;..    if
2ea90 28 20 61 49 74 65 72 5b 69 5d 2e 62 45 6f 66 20  ( aIter[i].bEof 
2eaa0 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f  ) goto ismatch_o
2eab0 75 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 77 68  ut;..  }....  wh
2eac0 69 6c 65 28 20 31 20 29 7b 0d 0a 20 20 20 20 69  ile( 1 ){..    i
2ead0 6e 74 20 62 4d 61 74 63 68 3b 0d 0a 20 20 20 20  nt bMatch;..    
2eae0 69 36 34 20 69 50 6f 73 20 3d 20 61 49 74 65 72  i64 iPos = aIter
2eaf0 5b 30 5d 2e 69 50 6f 73 3b 0d 0a 20 20 20 20 64  [0].iPos;..    d
2eb00 6f 20 7b 0d 0a 20 20 20 20 20 20 62 4d 61 74 63  o {..      bMatc
2eb10 68 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 66 6f  h = 1;..      fo
2eb20 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65  r(i=0; i<pPhrase
2eb30 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a  ->nTerm; i++){..
2eb40 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
2eb50 69 73 74 52 65 61 64 65 72 20 2a 70 50 6f 73 20  istReader *pPos 
2eb60 3d 20 26 61 49 74 65 72 5b 69 5d 3b 0d 0a 20 20  = &aIter[i];..  
2eb70 20 20 20 20 20 20 69 36 34 20 69 41 64 6a 20 3d        i64 iAdj =
2eb80 20 69 50 6f 73 20 2b 20 69 3b 0d 0a 20 20 20 20   iPos + i;..    
2eb90 20 20 20 20 69 66 28 20 70 50 6f 73 2d 3e 69 50      if( pPos->iP
2eba0 6f 73 21 3d 69 41 64 6a 20 29 7b 0d 0a 20 20 20  os!=iAdj ){..   
2ebb0 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20         bMatch = 
2ebc0 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 77 68  0;..          wh
2ebd0 69 6c 65 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3c  ile( pPos->iPos<
2ebe0 69 41 64 6a 20 29 7b 0d 0a 20 20 20 20 20 20 20  iAdj ){..       
2ebf0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2ec00 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2ec10 72 4e 65 78 74 28 70 50 6f 73 29 20 29 20 67 6f  rNext(pPos) ) go
2ec20 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0d  to ismatch_out;.
2ec30 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2ec40 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6f 73          if( pPos
2ec50 2d 3e 69 50 6f 73 3e 69 41 64 6a 20 29 20 69 50  ->iPos>iAdj ) iP
2ec60 6f 73 20 3d 20 70 50 6f 73 2d 3e 69 50 6f 73 2d  os = pPos->iPos-
2ec70 69 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  i;..        }.. 
2ec80 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 77 68 69       }..    }whi
2ec90 6c 65 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b  le( bMatch==0 );
2eca0 0d 0a 0d 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  ....    /* Appen
2ecb0 64 20 70 6f 73 69 74 69 6f 6e 20 69 50 6f 73 20  d position iPos 
2ecc0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f  to the output */
2ecd0 0d 0a 20 20 20 20 69 66 28 20 62 46 69 72 73 74  ..    if( bFirst
2ece0 3d 3d 30 20 7c 7c 20 46 54 53 35 5f 50 4f 53 32  ==0 || FTS5_POS2
2ecf0 4f 46 46 53 45 54 28 69 50 6f 73 29 3d 3d 30 20  OFFSET(iPos)==0 
2ed00 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ){..      rc = s
2ed10 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2ed20 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 70  tWriterAppend(&p
2ed30 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2c  Phrase->poslist,
2ed40 20 26 77 72 69 74 65 72 2c 20 69 50 6f 73 29 3b   &writer, iPos);
2ed50 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
2ed60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2ed70 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0d 0a 20   ismatch_out;.. 
2ed80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 66 6f 72 28     }....    for(
2ed90 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e  i=0; i<pPhrase->
2eda0 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a 20 20  nTerm; i++){..  
2edb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
2edc0 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2edd0 4e 65 78 74 28 26 61 49 74 65 72 5b 69 5d 29 20  Next(&aIter[i]) 
2ede0 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f  ) goto ismatch_o
2edf0 75 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  ut;..    }..  }.
2ee00 0a 0d 0a 20 69 73 6d 61 74 63 68 5f 6f 75 74 3a  ... ismatch_out:
2ee10 0d 0a 20 20 2a 70 62 4d 61 74 63 68 20 3d 20 28  ..  *pbMatch = (
2ee20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
2ee30 2e 6e 3e 30 29 3b 0d 0a 20 20 66 6f 72 28 69 3d  .n>0);..  for(i=
2ee40 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54  0; i<pPhrase->nT
2ee50 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20  erm; i++){..    
2ee60 69 66 28 20 61 49 74 65 72 5b 69 5d 2e 62 46 6c  if( aIter[i].bFl
2ee70 61 67 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  ag ) sqlite3_fre
2ee80 65 28 28 75 38 2a 29 61 49 74 65 72 5b 69 5d 2e  e((u8*)aIter[i].
2ee90 61 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20  a);..  }..  if( 
2eea0 61 49 74 65 72 21 3d 61 53 74 61 74 69 63 20 29  aIter!=aStatic )
2eeb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49   sqlite3_free(aI
2eec0 74 65 72 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20  ter);..  return 
2eed0 72 63 3b 0d 0a 7d 0d 0a 0d 0a 74 79 70 65 64 65  rc;..}....typede
2eee0 66 20 73 74 72 75 63 74 20 46 74 73 35 4c 6f 6f  f struct Fts5Loo
2eef0 6b 61 68 65 61 64 52 65 61 64 65 72 20 46 74 73  kaheadReader Fts
2ef00 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72  5LookaheadReader
2ef10 3b 0d 0a 73 74 72 75 63 74 20 46 74 73 35 4c 6f  ;..struct Fts5Lo
2ef20 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20 7b 0d  okaheadReader {.
2ef30 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20  .  const u8 *a; 
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef50 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
2ef60 74 61 69 6e 69 6e 67 20 70 6f 73 69 74 69 6f 6e  taining position
2ef70 20 6c 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20   list */..  int 
2ef80 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2ef90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2efa0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 5b  ize of buffer a[
2efb0 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20  ] in bytes */.. 
2efc0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efe0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73   /* Current offs
2eff0 65 74 20 69 6e 20 70 6f 73 69 74 69 6f 6e 20 6c  et in position l
2f000 69 73 74 20 2a 2f 0d 0a 20 20 69 36 34 20 69 50  ist */..  i64 iP
2f010 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
2f020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2f030 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f  rent position */
2f040 0d 0a 20 20 69 36 34 20 69 4c 6f 6f 6b 61 68 65  ..  i64 iLookahe
2f050 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
2f060 20 20 20 20 2f 2a 20 4e 65 78 74 20 70 6f 73 69      /* Next posi
2f070 74 69 6f 6e 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 23  tion */..};....#
2f080 64 65 66 69 6e 65 20 46 54 53 35 5f 4c 4f 4f 4b  define FTS5_LOOK
2f090 41 48 45 41 44 5f 45 4f 46 20 28 28 28 69 36 34  AHEAD_EOF (((i64
2f0a0 29 31 29 20 3c 3c 20 36 32 29 0d 0a 0d 0a 73 74  )1) << 62)....st
2f0b0 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 6f 6f  atic int fts5Loo
2f0c0 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65 78 74  kaheadReaderNext
2f0d0 28 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65  (Fts5LookaheadRe
2f0e0 61 64 65 72 20 2a 70 29 7b 0d 0a 20 20 70 2d 3e  ader *p){..  p->
2f0f0 69 50 6f 73 20 3d 20 70 2d 3e 69 4c 6f 6f 6b 61  iPos = p->iLooka
2f100 68 65 61 64 3b 0d 0a 20 20 69 66 28 20 73 71 6c  head;..  if( sql
2f110 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
2f120 65 78 74 36 34 28 70 2d 3e 61 2c 20 70 2d 3e 6e  ext64(p->a, p->n
2f130 2c 20 26 70 2d 3e 69 2c 20 26 70 2d 3e 69 4c 6f  , &p->i, &p->iLo
2f140 6f 6b 61 68 65 61 64 29 20 29 7b 0d 0a 20 20 20  okahead) ){..   
2f150 20 70 2d 3e 69 4c 6f 6f 6b 61 68 65 61 64 20 3d   p->iLookahead =
2f160 20 46 54 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f   FTS5_LOOKAHEAD_
2f170 45 4f 46 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74  EOF;..  }..  ret
2f180 75 72 6e 20 28 70 2d 3e 69 50 6f 73 3d 3d 46 54  urn (p->iPos==FT
2f190 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46  S5_LOOKAHEAD_EOF
2f1a0 29 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20  );..}....static 
2f1b0 69 6e 74 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61  int fts5Lookahea
2f1c0 64 52 65 61 64 65 72 49 6e 69 74 28 0d 0a 20 20  dReaderInit(..  
2f1d0 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2f1e0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
2f1f0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61  /* Buffer to rea
2f200 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  d position list 
2f210 66 72 6f 6d 20 2a 2f 0d 0a 20 20 46 74 73 35 4c  from */..  Fts5L
2f220 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20 2a  ookaheadReader *
2f230 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74  p          /* It
2f240 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 74 6f  erator object to
2f250 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0d 0a   initialize */..
2f260 29 7b 0d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  ){..  memset(p, 
2f270 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 4c 6f  0, sizeof(Fts5Lo
2f280 6f 6b 61 68 65 61 64 52 65 61 64 65 72 29 29 3b  okaheadReader));
2f290 0d 0a 20 20 70 2d 3e 61 20 3d 20 61 3b 0d 0a 20  ..  p->a = a;.. 
2f2a0 20 70 2d 3e 6e 20 3d 20 6e 3b 0d 0a 20 20 66 74   p->n = n;..  ft
2f2b0 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65  s5LookaheadReade
2f2c0 72 4e 65 78 74 28 70 29 3b 0d 0a 20 20 72 65 74  rNext(p);..  ret
2f2d0 75 72 6e 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61  urn fts5Lookahea
2f2e0 64 52 65 61 64 65 72 4e 65 78 74 28 70 29 3b 0d  dReaderNext(p);.
2f2f0 0a 7d 0d 0a 0d 0a 74 79 70 65 64 65 66 20 73 74  .}....typedef st
2f300 72 75 63 74 20 46 74 73 35 4e 65 61 72 54 72 69  ruct Fts5NearTri
2f310 6d 6d 65 72 20 46 74 73 35 4e 65 61 72 54 72 69  mmer Fts5NearTri
2f320 6d 6d 65 72 3b 0d 0a 73 74 72 75 63 74 20 46 74  mmer;..struct Ft
2f330 73 35 4e 65 61 72 54 72 69 6d 6d 65 72 20 7b 0d  s5NearTrimmer {.
2f340 0a 20 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64  .  Fts5Lookahead
2f350 52 65 61 64 65 72 20 72 65 61 64 65 72 3b 20 20  Reader reader;  
2f360 20 20 20 2f 2a 20 49 6e 70 75 74 20 69 74 65 72     /* Input iter
2f370 61 74 6f 72 20 2a 2f 0d 0a 20 20 46 74 73 35 50  ator */..  Fts5P
2f380 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69  oslistWriter wri
2f390 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57 72  ter;       /* Wr
2f3a0 69 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0d  iter context */.
2f3b0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2f3c0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
2f3d0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 70 6f 73     /* Output pos
2f3e0 6c 69 73 74 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f  list */..};..../
2f3f0 2a 0d 0a 2a 2a 20 54 68 65 20 6e 65 61 72 2d 73  *..** The near-s
2f400 65 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  et object passed
2f410 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
2f420 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  gument contains 
2f430 6d 6f 72 65 20 74 68 61 6e 0d 0a 2a 2a 20 6f 6e  more than..** on
2f440 65 20 70 68 72 61 73 65 2e 20 41 6c 6c 20 70 68  e phrase. All ph
2f450 72 61 73 65 73 20 63 75 72 72 65 6e 74 6c 79 20  rases currently 
2f460 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
2f470 65 20 72 6f 77 2e 20 54 68 65 0d 0a 2a 2a 20 46  e row. The..** F
2f480 74 73 35 45 78 70 72 50 68 72 61 73 65 2e 70 6f  ts5ExprPhrase.po
2f490 73 6c 69 73 74 20 62 75 66 66 65 72 73 20 61 72  slist buffers ar
2f4a0 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
2f4b0 72 64 69 6e 67 6c 79 2e 20 54 68 69 73 20 66 75  rdingly. This fu
2f4c0 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 74 65 73 74 73  nction..** tests
2f4d0 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
2f4e0 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 69 6e 73  row contains ins
2f4f0 74 61 6e 63 65 73 20 6f 66 20 65 61 63 68 20 70  tances of each p
2f500 68 72 61 73 65 20 73 75 66 66 69 63 69 65 6e 74  hrase sufficient
2f510 6c 79 0d 0a 2a 2a 20 63 6c 6f 73 65 20 74 6f 67  ly..** close tog
2f520 65 74 68 65 72 20 74 6f 20 6d 65 65 74 20 74 68  ether to meet th
2f530 65 20 4e 45 41 52 20 63 6f 6e 73 74 72 61 69 6e  e NEAR constrain
2f540 74 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  t. Non-zero is r
2f550 65 74 75 72 6e 65 64 20 69 66 20 69 74 0d 0a 2a  eturned if it..*
2f560 2a 20 64 6f 65 73 2c 20 6f 72 20 7a 65 72 6f 20  * does, or zero 
2f570 6f 74 68 65 72 77 69 73 65 2e 0d 0a 2a 2a 0d 0a  otherwise...**..
2f580 2a 2a 20 49 66 20 69 6e 2f 6f 75 74 20 70 61 72  ** If in/out par
2f590 61 6d 65 74 65 72 20 28 2a 70 52 63 29 20 69 73  ameter (*pRc) is
2f5a0 20 73 65 74 20 74 6f 20 6f 74 68 65 72 20 74 68   set to other th
2f5b0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  an SQLITE_OK whe
2f5c0 6e 20 74 68 69 73 0d 0a 2a 2a 20 66 75 6e 63 74  n this..** funct
2f5d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
2f5e0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 72  t is a no-op. Or
2f5f0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65  , if an error (e
2f600 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .g. SQLITE_NOMEM
2f610 29 0d 0a 2a 2a 20 6f 63 63 75 72 73 20 77 69 74  )..** occurs wit
2f620 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
2f630 6e 20 28 2a 70 52 63 29 20 69 73 20 73 65 74 20  n (*pRc) is set 
2f640 61 63 63 6f 72 64 69 6e 67 6c 79 20 62 65 66 6f  accordingly befo
2f650 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a  re returning...*
2f660 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2f670 75 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ue is undefined 
2f680 69 6e 20 62 6f 74 68 20 74 68 65 73 65 20 63 61  in both these ca
2f690 73 65 73 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 49 66  ses...** ..** If
2f6a0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2f6b0 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 28 61   and non-zero (a
2f6c0 20 6d 61 74 63 68 29 20 69 73 20 72 65 74 75 72   match) is retur
2f6d0 6e 65 64 2c 20 74 68 65 20 70 6f 73 69 74 69 6f  ned, the positio
2f6e0 6e 2d 6c 69 73 74 0d 0a 2a 2a 20 6f 66 20 65 61  n-list..** of ea
2f6f0 63 68 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74  ch phrase object
2f700 20 69 73 20 65 64 69 74 65 64 20 74 6f 20 63 6f   is edited to co
2f710 6e 74 61 69 6e 20 6f 6e 6c 79 20 74 68 6f 73 65  ntain only those
2f720 20 65 6e 74 72 69 65 73 20 74 68 61 74 0d 0a 2a   entries that..*
2f730 2a 20 6d 65 65 74 20 74 68 65 20 63 6f 6e 73 74  * meet the const
2f740 72 61 69 6e 74 20 62 65 66 6f 72 65 20 72 65 74  raint before ret
2f750 75 72 6e 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61  urning...*/..sta
2f760 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
2f770 4e 65 61 72 49 73 4d 61 74 63 68 28 69 6e 74 20  NearIsMatch(int 
2f780 2a 70 52 63 2c 20 46 74 73 35 45 78 70 72 4e 65  *pRc, Fts5ExprNe
2f790 61 72 73 65 74 20 2a 70 4e 65 61 72 29 7b 0d 0a  arset *pNear){..
2f7a0 20 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65    Fts5NearTrimme
2f7b0 72 20 61 53 74 61 74 69 63 5b 34 5d 3b 0d 0a 20  r aStatic[4];.. 
2f7c0 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65 72   Fts5NearTrimmer
2f7d0 20 2a 61 20 3d 20 61 53 74 61 74 69 63 3b 0d 0a   *a = aStatic;..
2f7e0 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
2f7f0 20 2a 2a 61 70 50 68 72 61 73 65 20 3d 20 70 4e   **apPhrase = pN
2f800 65 61 72 2d 3e 61 70 50 68 72 61 73 65 3b 0d 0a  ear->apPhrase;..
2f810 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 20 20 69 6e  ..  int i;..  in
2f820 74 20 72 63 20 3d 20 2a 70 52 63 3b 0d 0a 20 20  t rc = *pRc;..  
2f830 69 6e 74 20 62 4d 61 74 63 68 3b 0d 0a 0d 0a 20  int bMatch;.... 
2f840 20 61 73 73 65 72 74 28 20 70 4e 65 61 72 2d 3e   assert( pNear->
2f850 6e 50 68 72 61 73 65 3e 31 20 29 3b 0d 0a 0d 0a  nPhrase>1 );....
2f860 20 20 2f 2a 20 49 66 20 74 68 65 20 61 53 74 61    /* If the aSta
2f870 74 69 63 5b 5d 20 61 72 72 61 79 20 69 73 20 6e  tic[] array is n
2f880 6f 74 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c  ot large enough,
2f890 20 61 6c 6c 6f 63 61 74 65 20 61 20 6c 61 72 67   allocate a larg
2f8a0 65 20 61 72 72 61 79 0d 0a 20 20 2a 2a 20 75 73  e array..  ** us
2f8b0 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ing sqlite3_mall
2f8c0 6f 63 28 29 2e 20 54 68 69 73 20 61 70 70 72 6f  oc(). This appro
2f8d0 61 63 68 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  ach could be imp
2f8e0 72 6f 76 65 64 20 75 70 6f 6e 2e 20 2a 2f 0d 0a  roved upon. */..
2f8f0 20 20 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68    if( pNear->nPh
2f900 72 61 73 65 3e 41 72 72 61 79 53 69 7a 65 28 61  rase>ArraySize(a
2f910 53 74 61 74 69 63 29 20 29 7b 0d 0a 20 20 20 20  Static) ){..    
2f920 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
2f930 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
2f940 35 4e 65 61 72 54 72 69 6d 6d 65 72 29 20 2a 20  5NearTrimmer) * 
2f950 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 0d  pNear->nPhrase;.
2f960 0a 20 20 20 20 61 20 3d 20 28 46 74 73 35 4e 65  .    a = (Fts5Ne
2f970 61 72 54 72 69 6d 6d 65 72 2a 29 73 71 6c 69 74  arTrimmer*)sqlit
2f980 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
2f990 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0d 0a 20  (&rc, nByte);.. 
2f9a0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 6d 65 6d   }else{..    mem
2f9b0 73 65 74 28 61 53 74 61 74 69 63 2c 20 30 2c 20  set(aStatic, 0, 
2f9c0 73 69 7a 65 6f 66 28 61 53 74 61 74 69 63 29 29  sizeof(aStatic))
2f9d0 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63  ;..  }..  if( rc
2f9e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  !=SQLITE_OK ){..
2f9f0 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0d 0a      *pRc = rc;..
2fa00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20      return 0;.. 
2fa10 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 69 74 69   }....  /* Initi
2fa20 61 6c 69 7a 65 20 61 20 6c 6f 6f 6b 61 68 65 61  alize a lookahea
2fa30 64 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 65  d iterator for e
2fa40 61 63 68 20 70 68 72 61 73 65 2e 20 41 66 74 65  ach phrase. Afte
2fa50 72 20 70 61 73 73 69 6e 67 20 74 68 65 0d 0a 20  r passing the.. 
2fa60 20 2a 2a 20 62 75 66 66 65 72 20 61 6e 64 20 62   ** buffer and b
2fa70 75 66 66 65 72 20 73 69 7a 65 20 74 6f 20 74 68  uffer size to th
2fa80 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 72 65 61 64  e lookaside-read
2fa90 65 72 20 69 6e 69 74 20 66 75 6e 63 74 69 6f 6e  er init function
2faa0 2c 20 7a 65 72 6f 0d 0a 20 20 2a 2a 20 74 68 65  , zero..  ** the
2fab0 20 70 68 72 61 73 65 20 70 6f 73 6c 69 73 74 20   phrase poslist 
2fac0 62 75 66 66 65 72 2e 20 54 68 65 20 6e 65 77 20  buffer. The new 
2fad0 70 6f 73 6c 69 73 74 20 66 6f 72 20 74 68 65 20  poslist for the 
2fae0 70 68 72 61 73 65 20 28 63 6f 6e 74 61 69 6e 69  phrase (containi
2faf0 6e 67 0d 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  ng..  ** the sam
2fb00 65 20 65 6e 74 72 69 65 73 20 61 73 20 74 68 65  e entries as the
2fb10 20 6f 72 69 67 69 6e 61 6c 20 77 69 74 68 20 73   original with s
2fb20 6f 6d 65 20 65 6e 74 72 69 65 73 20 72 65 6d 6f  ome entries remo
2fb30 76 65 64 20 6f 6e 20 61 63 63 6f 75 6e 74 20 0d  ved on account .
2fb40 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4e 45 41  .  ** of the NEA
2fb50 52 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 69 73  R constraint) is
2fb60 20 77 72 69 74 74 65 6e 20 6f 76 65 72 20 74 68   written over th
2fb70 65 20 6f 72 69 67 69 6e 61 6c 20 65 76 65 6e 20  e original even 
2fb80 61 73 20 69 74 20 69 73 0d 0a 20 20 2a 2a 20 62  as it is..  ** b
2fb90 65 69 6e 67 20 72 65 61 64 2e 20 54 68 69 73 20  eing read. This 
2fba0 69 73 20 73 61 66 65 20 61 73 20 74 68 65 20 65  is safe as the e
2fbb0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
2fbc0 65 77 20 70 6f 73 6c 69 73 74 20 61 72 65 20 61  ew poslist are a
2fbd0 0d 0a 20 20 2a 2a 20 73 75 62 73 65 74 20 6f 66  ..  ** subset of
2fbe0 20 74 68 65 20 6f 6c 64 2c 20 73 6f 20 69 74 20   the old, so it 
2fbf0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
2fc00 66 6f 72 20 64 61 74 61 20 79 65 74 20 74 6f 20  for data yet to 
2fc10 62 65 20 72 65 61 64 20 74 6f 0d 0a 20 20 2a 2a  be read to..  **
2fc20 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   be overwritten.
2fc30 20 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d 30 3b    */..  for(i=0;
2fc40 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
2fc50 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 46 74  e; i++){..    Ft
2fc60 73 35 42 75 66 66 65 72 20 2a 70 50 6f 73 6c 69  s5Buffer *pPosli
2fc70 73 74 20 3d 20 26 61 70 50 68 72 61 73 65 5b 69  st = &apPhrase[i
2fc80 5d 2d 3e 70 6f 73 6c 69 73 74 3b 0d 0a 20 20 20  ]->poslist;..   
2fc90 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
2fca0 61 64 65 72 49 6e 69 74 28 70 50 6f 73 6c 69 73  aderInit(pPoslis
2fcb0 74 2d 3e 70 2c 20 70 50 6f 73 6c 69 73 74 2d 3e  t->p, pPoslist->
2fcc0 6e 2c 20 26 61 5b 69 5d 2e 72 65 61 64 65 72 29  n, &a[i].reader)
2fcd0 3b 0d 0a 20 20 20 20 70 50 6f 73 6c 69 73 74 2d  ;..    pPoslist-
2fce0 3e 6e 20 3d 20 30 3b 0d 0a 20 20 20 20 61 5b 69  >n = 0;..    a[i
2fcf0 5d 2e 70 4f 75 74 20 3d 20 70 50 6f 73 6c 69 73  ].pOut = pPoslis
2fd00 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 77 68 69  t;..  }....  whi
2fd10 6c 65 28 20 31 20 29 7b 0d 0a 20 20 20 20 69 6e  le( 1 ){..    in
2fd20 74 20 69 41 64 76 3b 0d 0a 20 20 20 20 69 36 34  t iAdv;..    i64
2fd30 20 69 4d 69 6e 3b 0d 0a 20 20 20 20 69 36 34 20   iMin;..    i64 
2fd40 69 4d 61 78 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20  iMax;....    /* 
2fd50 54 68 69 73 20 62 6c 6f 63 6b 20 61 64 76 61 6e  This block advan
2fd60 63 65 73 20 74 68 65 20 70 68 72 61 73 65 20 69  ces the phrase i
2fd70 74 65 72 61 74 6f 72 73 20 75 6e 74 69 6c 20 74  terators until t
2fd80 68 65 79 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  hey point to a s
2fd90 65 74 20 6f 66 0d 0a 20 20 20 20 2a 2a 20 65 6e  et of..    ** en
2fda0 74 72 69 65 73 20 74 68 61 74 20 74 6f 67 65 74  tries that toget
2fdb0 68 65 72 20 63 6f 6d 70 72 69 73 65 20 61 20 6d  her comprise a m
2fdc0 61 74 63 68 2e 20 20 2a 2f 0d 0a 20 20 20 20 69  atch.  */..    i
2fdd0 4d 61 78 20 3d 20 61 5b 30 5d 2e 72 65 61 64 65  Max = a[0].reade
2fde0 72 2e 69 50 6f 73 3b 0d 0a 20 20 20 20 64 6f 20  r.iPos;..    do 
2fdf0 7b 0d 0a 20 20 20 20 20 20 62 4d 61 74 63 68 20  {..      bMatch 
2fe00 3d 20 31 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28  = 1;..      for(
2fe10 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
2fe20 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20  hrase; i++){..  
2fe30 20 20 20 20 20 20 46 74 73 35 4c 6f 6f 6b 61 68        Fts5Lookah
2fe40 65 61 64 52 65 61 64 65 72 20 2a 70 50 6f 73 20  eadReader *pPos 
2fe50 3d 20 26 61 5b 69 5d 2e 72 65 61 64 65 72 3b 0d  = &a[i].reader;.
2fe60 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  .        iMin = 
2fe70 69 4d 61 78 20 2d 20 70 4e 65 61 72 2d 3e 61 70  iMax - pNear->ap
2fe80 50 68 72 61 73 65 5b 69 5d 2d 3e 6e 54 65 72 6d  Phrase[i]->nTerm
2fe90 20 2d 20 70 4e 65 61 72 2d 3e 6e 4e 65 61 72 3b   - pNear->nNear;
2fea0 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
2feb0 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e 20 7c 7c  os->iPos<iMin ||
2fec0 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69 4d 61 78   pPos->iPos>iMax
2fed0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62   ){..          b
2fee0 4d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20  Match = 0;..    
2fef0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 6f        while( pPo
2ff00 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e 20 29 7b 0d  s->iPos<iMin ){.
2ff10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ff20 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
2ff30 61 64 65 72 4e 65 78 74 28 70 50 6f 73 29 20 29  aderNext(pPos) )
2ff40 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75   goto ismatch_ou
2ff50 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t;..          }.
2ff60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ff70 50 6f 73 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29  Pos->iPos>iMax )
2ff80 20 69 4d 61 78 20 3d 20 70 50 6f 73 2d 3e 69 50   iMax = pPos->iP
2ff90 6f 73 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  os;..        }..
2ffa0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 77 68        }..    }wh
2ffb0 69 6c 65 28 20 62 4d 61 74 63 68 3d 3d 30 20 29  ile( bMatch==0 )
2ffc0 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 41 64 64 20  ;....    /* Add 
2ffd0 61 6e 20 65 6e 74 72 79 20 74 6f 20 65 61 63 68  an entry to each
2ffe0 20 6f 75 74 70 75 74 20 70 6f 73 69 74 69 6f 6e   output position
2fff0 20 6c 69 73 74 20 2a 2f 0d 0a 20 20 20 20 66 6f   list */..    fo
30000 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e  r(i=0; i<pNear->
30010 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a  nPhrase; i++){..
30020 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d        i64 iPos =
30030 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 50 6f   a[i].reader.iPo
30040 73 3b 0d 0a 20 20 20 20 20 20 46 74 73 35 50 6f  s;..      Fts5Po
30050 73 6c 69 73 74 57 72 69 74 65 72 20 2a 70 57 72  slistWriter *pWr
30060 69 74 65 72 20 3d 20 26 61 5b 69 5d 2e 77 72 69  iter = &a[i].wri
30070 74 65 72 3b 0d 0a 20 20 20 20 20 20 69 66 28 20  ter;..      if( 
30080 61 5b 69 5d 2e 70 4f 75 74 2d 3e 6e 3d 3d 30 20  a[i].pOut->n==0 
30090 7c 7c 20 69 50 6f 73 21 3d 70 57 72 69 74 65 72  || iPos!=pWriter
300a0 2d 3e 69 50 72 65 76 20 29 7b 0d 0a 20 20 20 20  ->iPrev ){..    
300b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
300c0 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65  oslistWriterAppe
300d0 6e 64 28 61 5b 69 5d 2e 70 4f 75 74 2c 20 70 57  nd(a[i].pOut, pW
300e0 72 69 74 65 72 2c 20 69 50 6f 73 29 3b 0d 0a 20  riter, iPos);.. 
300f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
30100 0a 20 20 20 20 69 41 64 76 20 3d 20 30 3b 0d 0a  .    iAdv = 0;..
30110 20 20 20 20 69 4d 69 6e 20 3d 20 61 5b 30 5d 2e      iMin = a[0].
30120 72 65 61 64 65 72 2e 69 4c 6f 6f 6b 61 68 65 61  reader.iLookahea
30130 64 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  d;..    for(i=0;
30140 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
30150 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  e; i++){..      
30160 69 66 28 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e  if( a[i].reader.
30170 69 4c 6f 6f 6b 61 68 65 61 64 20 3c 20 69 4d 69  iLookahead < iMi
30180 6e 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 4d  n ){..        iM
30190 69 6e 20 3d 20 61 5b 69 5d 2e 72 65 61 64 65 72  in = a[i].reader
301a0 2e 69 4c 6f 6f 6b 61 68 65 61 64 3b 0d 0a 20 20  .iLookahead;..  
301b0 20 20 20 20 20 20 69 41 64 76 20 3d 20 69 3b 0d        iAdv = i;.
301c0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
301d0 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 6f 6f  .    if( fts5Loo
301e0 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65 78 74  kaheadReaderNext
301f0 28 26 61 5b 69 41 64 76 5d 2e 72 65 61 64 65 72  (&a[iAdv].reader
30200 29 20 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68  ) ) goto ismatch
30210 5f 6f 75 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  _out;..  }....  
30220 69 73 6d 61 74 63 68 5f 6f 75 74 3a 20 7b 0d 0a  ismatch_out: {..
30230 20 20 20 20 69 6e 74 20 62 52 65 74 20 3d 20 61      int bRet = a
30240 5b 30 5d 2e 70 4f 75 74 2d 3e 6e 3e 30 3b 0d 0a  [0].pOut->n>0;..
30250 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0d 0a      *pRc = rc;..
30260 20 20 20 20 69 66 28 20 61 21 3d 61 53 74 61 74      if( a!=aStat
30270 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  ic ) sqlite3_fre
30280 65 28 61 29 3b 0d 0a 20 20 20 20 72 65 74 75 72  e(a);..    retur
30290 6e 20 62 52 65 74 3b 0d 0a 20 20 7d 0d 0a 7d 0d  n bRet;..  }..}.
302a0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63  .../*..** Advanc
302b0 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
302c0 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
302d0 20 74 6f 20 61 20 76 61 6c 75 65 20 65 71 75 61   to a value equa
302e0 6c 20 74 6f 20 6f 72 20 6c 61 73 74 65 72 0d 0a  l to or laster..
302f0 2a 2a 20 74 68 61 6e 20 74 68 65 20 69 6e 69 74  ** than the init
30300 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 69  ial value of *pi
30310 4c 61 73 74 2e 20 49 66 20 74 68 69 73 20 6d 65  Last. If this me
30320 61 6e 73 20 74 68 65 20 69 74 65 72 61 74 6f 72  ans the iterator
30330 20 70 6f 69 6e 74 73 0d 0a 2a 2a 20 74 6f 20 61   points..** to a
30340 20 76 61 6c 75 65 20 6c 61 73 74 65 72 20 74 68   value laster th
30350 61 6e 20 2a 70 69 4c 61 73 74 2c 20 75 70 64 61  an *piLast, upda
30360 74 65 20 2a 70 69 4c 61 73 74 20 74 6f 20 74 68  te *piLast to th
30370 65 20 6e 65 77 20 6c 61 73 74 65 73 74 20 76 61  e new lastest va
30380 6c 75 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20  lue...**..** If 
30390 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
303a0 63 68 65 73 20 45 4f 46 2c 20 73 65 74 20 2a 70  ches EOF, set *p
303b0 62 45 6f 66 20 74 6f 20 74 72 75 65 20 62 65 66  bEof to true bef
303c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
303d0 66 0d 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  f..** an error o
303e0 63 63 75 72 73 2c 20 73 65 74 20 2a 70 52 63 20  ccurs, set *pRc 
303f0 74 6f 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  to an error code
30400 2e 20 49 66 20 65 69 74 68 65 72 20 2a 70 62 45  . If either *pbE
30410 6f 66 20 6f 72 20 2a 70 52 63 0d 0a 2a 2a 20 61  of or *pRc..** a
30420 72 65 20 73 65 74 2c 20 72 65 74 75 72 6e 20 61  re set, return a
30430 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e   non-zero value.
30440 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
30450 72 6e 20 7a 65 72 6f 2e 0d 0a 2a 2f 0d 0a 73 74  rn zero...*/..st
30460 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
30470 72 41 64 76 61 6e 63 65 74 6f 28 0d 0a 20 20 46  rAdvanceto(..  F
30480 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
30490 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ter,           /
304a0 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
304b0 76 61 6e 63 65 20 2a 2f 0d 0a 20 20 69 6e 74 20  vance */..  int 
304c0 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
304d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
304e0 72 75 65 20 69 66 20 69 74 65 72 61 74 6f 72 20  rue if iterator 
304f0 69 73 20 22 72 6f 77 69 64 20 44 45 53 43 22 20  is "rowid DESC" 
30500 2a 2f 0d 0a 20 20 69 36 34 20 2a 70 69 4c 61 73  */..  i64 *piLas
30510 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
30520 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
30530 20 4c 61 73 74 65 73 74 20 72 6f 77 69 64 20 73   Lastest rowid s
30540 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0d 0a 20  een so far */.. 
30550 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
30560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30570 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 63   /* OUT: Error c
30580 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70  ode */..  int *p
30590 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  bEof            
305a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
305b0 3a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  : Set to true if
305c0 20 45 4f 46 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69   EOF */..){..  i
305d0 36 34 20 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61  64 iLast = *piLa
305e0 73 74 3b 0d 0a 20 20 69 36 34 20 69 52 6f 77 69  st;..  i64 iRowi
305f0 64 3b 0d 0a 0d 0a 20 20 69 52 6f 77 69 64 20 3d  d;....  iRowid =
30600 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0d   pIter->iRowid;.
30610 0a 20 20 69 66 28 20 28 62 44 65 73 63 3d 3d 30  .  if( (bDesc==0
30620 20 26 26 20 69 4c 61 73 74 3e 69 52 6f 77 69 64   && iLast>iRowid
30630 29 20 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69  ) || (bDesc && i
30640 4c 61 73 74 3c 69 52 6f 77 69 64 29 20 29 7b 0d  Last<iRowid) ){.
30650 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
30660 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
30670 74 46 72 6f 6d 28 70 49 74 65 72 2c 20 69 4c 61  tFrom(pIter, iLa
30680 73 74 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63  st);..    if( rc
30690 20 7c 7c 20 73 71 6c 69 74 65 33 46 74 73 35 49   || sqlite3Fts5I
306a0 74 65 72 45 6f 66 28 70 49 74 65 72 29 20 29 7b  terEof(pIter) ){
306b0 0d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72  ..      *pRc = r
306c0 63 3b 0d 0a 20 20 20 20 20 20 2a 70 62 45 6f 66  c;..      *pbEof
306d0 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 72 65 74   = 1;..      ret
306e0 75 72 6e 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20  urn 1;..    }.. 
306f0 20 20 20 69 52 6f 77 69 64 20 3d 20 70 49 74 65     iRowid = pIte
30700 72 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 20 20  r->iRowid;..    
30710 61 73 73 65 72 74 28 20 28 62 44 65 73 63 3d 3d  assert( (bDesc==
30720 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c 61  0 && iRowid>=iLa
30730 73 74 29 20 7c 7c 20 28 62 44 65 73 63 3d 3d 31  st) || (bDesc==1
30740 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73   && iRowid<=iLas
30750 74 29 20 29 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70  t) );..  }..  *p
30760 69 4c 61 73 74 20 3d 20 69 52 6f 77 69 64 3b 0d  iLast = iRowid;.
30770 0a 0d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a  ...  return 0;..
30780 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  }....static int 
30790 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 41  fts5ExprSynonymA
307a0 64 76 61 6e 63 65 74 6f 28 0d 0a 20 20 46 74 73  dvanceto(..  Fts
307b0 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
307c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
307d0 54 65 72 6d 20 69 74 65 72 61 74 6f 72 20 74 6f  Term iterator to
307e0 20 61 64 76 61 6e 63 65 20 2a 2f 0d 0a 20 20 69   advance */..  i
307f0 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20  nt bDesc,       
30800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30810 2a 20 54 72 75 65 20 69 66 20 69 74 65 72 61 74  * True if iterat
30820 6f 72 20 69 73 20 22 72 6f 77 69 64 20 44 45 53  or is "rowid DES
30830 43 22 20 2a 2f 0d 0a 20 20 69 36 34 20 2a 70 69  C" */..  i64 *pi
30840 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
30850 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
30860 55 54 3a 20 4c 61 73 74 65 73 74 20 72 6f 77 69  UT: Lastest rowi
30870 64 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  d seen so far */
30880 0d 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  ..  int *pRc    
30890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f      /* OUT: Erro
308b0 72 20 63 6f 64 65 20 2a 2f 0d 0a 29 7b 0d 0a 20  r code */..){.. 
308c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
308d0 5f 4f 4b 3b 0d 0a 20 20 69 36 34 20 69 4c 61 73  _OK;..  i64 iLas
308e0 74 20 3d 20 2a 70 69 4c 61 73 74 3b 0d 0a 20 20  t = *piLast;..  
308f0 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 3b  Fts5ExprTerm *p;
30900 0d 0a 20 20 69 6e 74 20 62 45 6f 66 20 3d 20 30  ..  int bEof = 0
30910 3b 0d 0a 0d 0a 20 20 66 6f 72 28 70 3d 70 54 65  ;....  for(p=pTe
30920 72 6d 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rm; rc==SQLITE_O
30930 4b 20 26 26 20 70 3b 20 70 3d 70 2d 3e 70 53 79  K && p; p=p->pSy
30940 6e 6f 6e 79 6d 29 7b 0d 0a 20 20 20 20 69 66 28  nonym){..    if(
30950 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
30960 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30  Eof(p->pIter)==0
30970 20 29 7b 0d 0a 20 20 20 20 20 20 69 36 34 20 69   ){..      i64 i
30980 52 6f 77 69 64 20 3d 20 70 2d 3e 70 49 74 65 72  Rowid = p->pIter
30990 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 20 20 20  ->iRowid;..     
309a0 20 69 66 28 20 28 62 44 65 73 63 3d 3d 30 20 26   if( (bDesc==0 &
309b0 26 20 69 4c 61 73 74 3e 69 52 6f 77 69 64 29 20  & iLast>iRowid) 
309c0 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69 4c 61  || (bDesc && iLa
309d0 73 74 3c 69 52 6f 77 69 64 29 20 29 7b 0d 0a 20  st<iRowid) ){.. 
309e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
309f0 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
30a00 72 6f 6d 28 70 2d 3e 70 49 74 65 72 2c 20 69 4c  rom(p->pIter, iL
30a10 61 73 74 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  ast);..      }..
30a20 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
30a30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30a40 4b 20 29 7b 0d 0a 20 20 20 20 2a 70 52 63 20 3d  K ){..    *pRc =
30a50 20 72 63 3b 0d 0a 20 20 20 20 62 45 6f 66 20 3d   rc;..    bEof =
30a60 20 31 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20   1;..  }else{.. 
30a70 20 20 20 2a 70 69 4c 61 73 74 20 3d 20 66 74 73     *piLast = fts
30a80 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69  5ExprSynonymRowi
30a90 64 28 70 54 65 72 6d 2c 20 62 44 65 73 63 2c 20  d(pTerm, bDesc, 
30aa0 26 62 45 6f 66 29 3b 0d 0a 20 20 7d 0d 0a 20 20  &bEof);..  }..  
30ab0 72 65 74 75 72 6e 20 62 45 6f 66 3b 0d 0a 7d 0d  return bEof;..}.
30ac0 0a 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .....static int 
30ad0 66 74 73 35 45 78 70 72 4e 65 61 72 54 65 73 74  fts5ExprNearTest
30ae0 28 0d 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0d 0a  (..  int *pRc,..
30af0 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70    Fts5Expr *pExp
30b00 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
30b10 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
30b20 74 68 61 74 20 70 4e 65 61 72 20 69 73 20 61 20  that pNear is a 
30b30 70 61 72 74 20 6f 66 20 2a 2f 0d 0a 20 20 46 74  part of */..  Ft
30b40 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
30b50 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
30b60 20 54 68 65 20 22 4e 45 41 52 22 20 6e 6f 64 65   The "NEAR" node
30b70 20 28 46 54 53 35 5f 53 54 52 49 4e 47 29 20 2a   (FTS5_STRING) *
30b80 2f 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 45 78 70  /..){..  Fts5Exp
30b90 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
30ba0 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d  = pNode->pNear;.
30bb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63  .  int rc = *pRc
30bc0 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 45 78 70 72  ;....  if( pExpr
30bd0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
30be0 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
30bf0 46 55 4c 4c 20 29 7b 0d 0a 20 20 20 20 46 74 73  FULL ){..    Fts
30c00 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
30c10 3b 0d 0a 20 20 20 20 46 74 73 35 45 78 70 72 50  ;..    Fts5ExprP
30c20 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d  hrase *pPhrase =
30c30 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65   pNear->apPhrase
30c40 5b 30 5d 3b 0d 0a 20 20 20 20 70 50 68 72 61 73  [0];..    pPhras
30c50 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30  e->poslist.n = 0
30c60 3b 0d 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  ;..    for(pTerm
30c70 3d 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  =&pPhrase->aTerm
30c80 5b 30 5d 3b 20 70 54 65 72 6d 3b 20 70 54 65 72  [0]; pTerm; pTer
30c90 6d 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79  m=pTerm->pSynony
30ca0 6d 29 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 49  m){..      Fts5I
30cb0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
30cc0 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0d  = pTerm->pIter;.
30cd0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
30ce0 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
30cf0 74 65 72 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  ter)==0 ){..    
30d00 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
30d10 52 6f 77 69 64 3d 3d 70 4e 6f 64 65 2d 3e 69 52  Rowid==pNode->iR
30d20 6f 77 69 64 20 26 26 20 70 49 74 65 72 2d 3e 6e  owid && pIter->n
30d30 44 61 74 61 3e 30 20 29 7b 0d 0a 20 20 20 20 20  Data>0 ){..     
30d40 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 70 6f       pPhrase->po
30d50 73 6c 69 73 74 2e 6e 20 3d 20 31 3b 0d 0a 20 20  slist.n = 1;..  
30d60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
30d70 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74  ..    }..    ret
30d80 75 72 6e 20 70 50 68 72 61 73 65 2d 3e 70 6f 73  urn pPhrase->pos
30d90 6c 69 73 74 2e 6e 3b 0d 0a 20 20 7d 65 6c 73 65  list.n;..  }else
30da0 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 0d  {..    int i;...
30db0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
30dc0 61 74 20 65 61 63 68 20 70 68 72 61 73 65 20 69  at each phrase i
30dd0 6e 20 74 68 65 20 6e 65 61 72 73 65 74 20 6d 61  n the nearset ma
30de0 74 63 68 65 73 20 74 68 65 20 63 75 72 72 65 6e  tches the curren
30df0 74 20 72 6f 77 2e 0d 0a 20 20 20 20 2a 2a 20 50  t row...    ** P
30e00 6f 70 75 6c 61 74 65 20 74 68 65 20 70 50 68 72  opulate the pPhr
30e10 61 73 65 2d 3e 70 6f 73 6c 69 73 74 20 62 75 66  ase->poslist buf
30e20 66 65 72 73 20 61 74 20 74 68 65 20 73 61 6d 65  fers at the same
30e30 20 74 69 6d 65 2e 20 49 66 20 61 6e 79 0d 0a 20   time. If any.. 
30e40 20 20 20 2a 2a 20 70 68 72 61 73 65 20 69 73 20     ** phrase is 
30e50 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 62 72 65  not a match, bre
30e60 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
30e70 6f 70 20 65 61 72 6c 79 2e 20 20 2a 2f 0d 0a 20  op early.  */.. 
30e80 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
30e90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
30ea0 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69  Near->nPhrase; i
30eb0 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 46 74 73 35  ++){..      Fts5
30ec0 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
30ed0 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50  ase = pNear->apP
30ee0 68 72 61 73 65 5b 69 5d 3b 0d 0a 20 20 20 20 20  hrase[i];..     
30ef0 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54   if( pPhrase->nT
30f00 65 72 6d 3e 31 20 7c 7c 20 70 50 68 72 61 73 65  erm>1 || pPhrase
30f10 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f  ->aTerm[0].pSyno
30f20 6e 79 6d 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20  nym ..       || 
30f30 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 7c  pNear->pColset |
30f40 7c 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  | pPhrase->aTerm
30f50 5b 30 5d 2e 62 46 69 72 73 74 0d 0a 20 20 20 20  [0].bFirst..    
30f60 20 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e    ){..        in
30f70 74 20 62 4d 61 74 63 68 20 3d 20 30 3b 0d 0a 20  t bMatch = 0;.. 
30f80 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
30f90 45 78 70 72 50 68 72 61 73 65 49 73 4d 61 74 63  ExprPhraseIsMatc
30fa0 68 28 70 4e 6f 64 65 2c 20 70 50 68 72 61 73 65  h(pNode, pPhrase
30fb0 2c 20 26 62 4d 61 74 63 68 29 3b 0d 0a 20 20 20  , &bMatch);..   
30fc0 20 20 20 20 20 69 66 28 20 62 4d 61 74 63 68 3d       if( bMatch=
30fd0 3d 30 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20  =0 ) break;..   
30fe0 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
30ff0 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72     Fts5IndexIter
31000 20 2a 70 49 74 65 72 20 3d 20 70 50 68 72 61 73   *pIter = pPhras
31010 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65  e->aTerm[0].pIte
31020 72 3b 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35  r;..        fts5
31030 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26  BufferSet(&rc, &
31040 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
31050 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20  , pIter->nData, 
31060 70 49 74 65 72 2d 3e 70 44 61 74 61 29 3b 0d 0a  pIter->pData);..
31070 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
31080 0d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  ..    *pRc = rc;
31090 0d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4e 65  ..    if( i==pNe
310a0 61 72 2d 3e 6e 50 68 72 61 73 65 20 26 26 20 28  ar->nPhrase && (
310b0 69 3d 3d 31 20 7c 7c 20 66 74 73 35 45 78 70 72  i==1 || fts5Expr
310c0 4e 65 61 72 49 73 4d 61 74 63 68 28 70 52 63 2c  NearIsMatch(pRc,
310d0 20 70 4e 65 61 72 29 29 20 29 7b 0d 0a 20 20 20   pNear)) ){..   
310e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20     return 1;..  
310f0 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
31100 30 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a  0;..  }..}......
31110 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  /*..** Initializ
31120 65 20 61 6c 6c 20 74 65 72 6d 20 69 74 65 72 61  e all term itera
31130 74 6f 72 73 20 69 6e 20 74 68 65 20 70 4e 65 61  tors in the pNea
31140 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 79  r object. If any
31150 20 74 65 72 6d 20 69 73 20 66 6f 75 6e 64 0d 0a   term is found..
31160 2a 2a 20 74 6f 20 6d 61 74 63 68 20 6e 6f 20 64  ** to match no d
31170 6f 63 75 6d 65 6e 74 73 20 61 74 20 61 6c 6c 2c  ocuments at all,
31180 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
31190 65 6c 79 20 77 69 74 68 6f 75 74 20 69 6e 69 74  ely without init
311a0 69 61 6c 69 7a 69 6e 67 20 61 6e 79 0d 0a 2a 2a  ializing any..**
311b0 20 66 75 72 74 68 65 72 20 69 74 65 72 61 74 6f   further iterato
311c0 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61  rs...**..** If a
311d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
311e0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
311f0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
31200 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0d 0a  erwise, return..
31210 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74  ** SQLITE_OK. It
31220 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
31230 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 73  ed an error if s
31240 6f 6d 65 20 74 65 72 6d 20 6d 61 74 63 68 65 73  ome term matches
31250 20 7a 65 72 6f 0d 0a 2a 2a 20 64 6f 63 75 6d 65   zero..** docume
31260 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  nts...*/..static
31270 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 65 61   int fts5ExprNea
31280 72 49 6e 69 74 41 6c 6c 28 0d 0a 20 20 46 74 73  rInitAll(..  Fts
31290 35 45 78 70 72 20 2a 70 45 78 70 72 2c 0d 0a 20  5Expr *pExpr,.. 
312a0 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
312b0 4e 6f 64 65 0d 0a 29 7b 0d 0a 20 20 46 74 73 35  Node..){..  Fts5
312c0 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65  ExprNearset *pNe
312d0 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  ar = pNode->pNea
312e0 72 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a  r;..  int i;....
312f0 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
31300 3e 62 4e 6f 6d 61 74 63 68 3d 3d 30 20 29 3b 0d  >bNomatch==0 );.
31310 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e  .  for(i=0; i<pN
31320 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  ear->nPhrase; i+
31330 2b 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78 70  +){..    Fts5Exp
31340 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
31350 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
31360 73 65 5b 69 5d 3b 0d 0a 20 20 20 20 69 66 28 20  se[i];..    if( 
31370 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d  pPhrase->nTerm==
31380 30 20 29 7b 0d 0a 20 20 20 20 20 20 70 4e 6f 64  0 ){..      pNod
31390 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20  e->bEof = 1;..  
313a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
313b0 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 65 6c 73 65  E_OK;..    }else
313c0 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0d  {..      int j;.
313d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
313e0 6a 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  j<pPhrase->nTerm
313f0 3b 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20  ; j++){..       
31400 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
31410 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d  Term = &pPhrase-
31420 3e 61 54 65 72 6d 5b 6a 5d 3b 0d 0a 20 20 20 20  >aTerm[j];..    
31430 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
31440 20 2a 70 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e   *p;..        in
31450 74 20 62 48 69 74 20 3d 20 30 3b 0d 0a 0d 0a 20  t bHit = 0;.... 
31460 20 20 20 20 20 20 20 66 6f 72 28 70 3d 70 54 65         for(p=pTe
31470 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e  rm; p; p=p->pSyn
31480 6f 6e 79 6d 29 7b 0d 0a 20 20 20 20 20 20 20 20  onym){..        
31490 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 20 20 20    int rc;..     
314a0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 49 74 65       if( p->pIte
314b0 72 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  r ){..          
314c0 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
314d0 72 43 6c 6f 73 65 28 70 2d 3e 70 49 74 65 72 29  rClose(p->pIter)
314e0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
314f0 2d 3e 70 49 74 65 72 20 3d 20 30 3b 0d 0a 20 20  ->pIter = 0;..  
31500 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
31510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31520 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
31530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
31540 70 45 78 70 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pExpr->pIndex, p
31550 2d 3e 7a 54 65 72 6d 2c 20 28 69 6e 74 29 73 74  ->zTerm, (int)st
31560 72 6c 65 6e 28 70 2d 3e 7a 54 65 72 6d 29 2c 0d  rlen(p->zTerm),.
31570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
31580 70 54 65 72 6d 2d 3e 62 50 72 65 66 69 78 20 3f  pTerm->bPrefix ?
31590 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
315a0 5f 50 52 45 46 49 58 20 3a 20 30 29 20 7c 0d 0a  _PREFIX : 0) |..
315b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
315c0 45 78 70 72 2d 3e 62 44 65 73 63 20 3f 20 46 54  Expr->bDesc ? FT
315d0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
315e0 53 43 20 3a 20 30 29 2c 0d 0a 20 20 20 20 20 20  SC : 0),..      
315f0 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d 3e 70          pNear->p
31600 43 6f 6c 73 65 74 2c 0d 0a 20 20 20 20 20 20 20  Colset,..       
31610 20 20 20 20 20 20 20 26 70 2d 3e 70 49 74 65 72         &p->pIter
31620 0d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a  ..          );..
31630 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31640 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
31650 29 3d 3d 28 70 2d 3e 70 49 74 65 72 21 3d 30 29  )==(p->pIter!=0)
31660 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69   );..          i
31670 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31680 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20   ) return rc;.. 
31690 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d           if( 0==
316a0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
316b0 6f 66 28 70 2d 3e 70 49 74 65 72 29 20 29 7b 0d  of(p->pIter) ){.
316c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 48 69  .            bHi
316d0 74 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20  t = 1;..        
316e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
316f0 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 48  ..        if( bH
31700 69 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  it==0 ){..      
31710 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20      pNode->bEof 
31720 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
31730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31740 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
31750 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
31760 7d 0d 0a 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 45  }....  pNode->bE
31770 6f 66 20 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72  of = 0;..  retur
31780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d  n SQLITE_OK;..}.
31790 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 70 45 78  .../*..** If pEx
317a0 70 72 20 69 73 20 61 6e 20 41 53 43 20 69 74 65  pr is an ASC ite
317b0 72 61 74 6f 72 2c 20 74 68 69 73 20 66 75 6e 63  rator, this func
317c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 76  tion returns a v
317d0 61 6c 75 65 20 77 69 74 68 20 74 68 65 0d 0a 2a  alue with the..*
317e0 2a 20 73 61 6d 65 20 73 69 67 6e 20 61 73 3a 0d  * same sign as:.
317f0 0a 2a 2a 0d 0a 2a 2a 20 20 20 28 69 4c 68 73 20  .**..**   (iLhs 
31800 2d 20 69 52 68 73 29 0d 0a 2a 2a 0d 0a 2a 2a 20  - iRhs)..**..** 
31810 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
31820 69 73 20 69 73 20 61 20 44 45 53 43 20 69 74 65  is is a DESC ite
31830 72 61 74 6f 72 2c 20 74 68 65 20 6f 70 70 6f 73  rator, the oppos
31840 69 74 65 20 69 73 20 72 65 74 75 72 6e 65 64 3a  ite is returned:
31850 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 28 69 52 68 73  ..**..**   (iRhs
31860 20 2d 20 69 4c 68 73 29 0d 0a 2a 2f 0d 0a 73 74   - iLhs)..*/..st
31870 61 74 69 63 20 69 6e 74 20 66 74 73 35 52 6f 77  atic int fts5Row
31880 69 64 43 6d 70 28 0d 0a 20 20 46 74 73 35 45 78  idCmp(..  Fts5Ex
31890 70 72 20 2a 70 45 78 70 72 2c 0d 0a 20 20 69 36  pr *pExpr,..  i6
318a0 34 20 69 4c 68 73 2c 0d 0a 20 20 69 36 34 20 69  4 iLhs,..  i64 i
318b0 52 68 73 0d 0a 29 7b 0d 0a 20 20 61 73 73 65 72  Rhs..){..  asser
318c0 74 28 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d  t( pExpr->bDesc=
318d0 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 62 44 65  =0 || pExpr->bDe
318e0 73 63 3d 3d 31 20 29 3b 0d 0a 20 20 69 66 28 20  sc==1 );..  if( 
318f0 70 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d 30 20  pExpr->bDesc==0 
31900 29 7b 0d 0a 20 20 20 20 69 66 28 20 69 4c 68 73  ){..    if( iLhs
31910 3c 69 52 68 73 20 29 20 72 65 74 75 72 6e 20 2d  <iRhs ) return -
31920 31 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 28  1;..    return (
31930 69 4c 68 73 20 3e 20 69 52 68 73 29 3b 0d 0a 20  iLhs > iRhs);.. 
31940 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69 66 28   }else{..    if(
31950 20 69 4c 68 73 3e 69 52 68 73 20 29 20 72 65 74   iLhs>iRhs ) ret
31960 75 72 6e 20 2d 31 3b 0d 0a 20 20 20 20 72 65 74  urn -1;..    ret
31970 75 72 6e 20 28 69 4c 68 73 20 3c 20 69 52 68 73  urn (iLhs < iRhs
31980 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74  );..  }..}....st
31990 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 45 78  atic void fts5Ex
319a0 70 72 53 65 74 45 6f 66 28 46 74 73 35 45 78 70  prSetEof(Fts5Exp
319b0 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0d 0a  rNode *pNode){..
319c0 20 20 69 6e 74 20 69 3b 0d 0a 20 20 70 4e 6f 64    int i;..  pNod
319d0 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20  e->bEof = 1;..  
319e0 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20  pNode->bNomatch 
319f0 3d 20 30 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
31a00 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
31a10 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 66 74 73  ; i++){..    fts
31a20 35 45 78 70 72 53 65 74 45 6f 66 28 70 4e 6f 64  5ExprSetEof(pNod
31a30 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0d  e->apChild[i]);.
31a40 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69  .  }..}....stati
31a50 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 4e  c void fts5ExprN
31a60 6f 64 65 5a 65 72 6f 50 6f 73 6c 69 73 74 28 46  odeZeroPoslist(F
31a70 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f  ts5ExprNode *pNo
31a80 64 65 29 7b 0d 0a 20 20 69 66 28 20 70 4e 6f 64  de){..  if( pNod
31a90 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53  e->eType==FTS5_S
31aa0 54 52 49 4e 47 20 7c 7c 20 70 4e 6f 64 65 2d 3e  TRING || pNode->
31ab0 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d  eType==FTS5_TERM
31ac0 20 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78 70   ){..    Fts5Exp
31ad0 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
31ae0 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d  = pNode->pNear;.
31af0 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20  .    int i;..   
31b00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61   for(i=0; i<pNea
31b10 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29  r->nPhrase; i++)
31b20 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  {..      Fts5Exp
31b30 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
31b40 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
31b50 73 65 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 70 50  se[i];..      pP
31b60 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e  hrase->poslist.n
31b70 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20   = 0;..    }..  
31b80 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69 6e 74 20  }else{..    int 
31b90 69 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  i;..    for(i=0;
31ba0 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
31bb0 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 66  ; i++){..      f
31bc0 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
31bd0 6f 73 6c 69 73 74 28 70 4e 6f 64 65 2d 3e 61 70  oslist(pNode->ap
31be0 43 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20 20 20 20  Child[i]);..    
31bf0 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d  }..  }..}.......
31c00 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ./*..** Compare 
31c10 74 68 65 20 76 61 6c 75 65 73 20 63 75 72 72 65  the values curre
31c20 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
31c30 79 20 74 68 65 20 74 77 6f 20 6e 6f 64 65 73 20  y the two nodes 
31c40 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d  as follows:..**.
31c50 0a 2a 2a 20 20 20 20 72 65 73 20 3d 20 28 2a 70  .**    res = (*p
31c60 31 29 20 2d 20 28 2a 70 32 29 0d 0a 2a 2a 0d 0a  1) - (*p2)..**..
31c70 2a 2a 20 4e 6f 64 65 73 20 74 68 61 74 20 70 6f  ** Nodes that po
31c80 69 6e 74 20 74 6f 20 76 61 6c 75 65 73 20 74 68  int to values th
31c90 61 74 20 63 6f 6d 65 20 6c 61 74 65 72 20 69 6e  at come later in
31ca0 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 6f   the iteration o
31cb0 72 64 65 72 20 61 72 65 0d 0a 2a 2a 20 63 6f 6e  rder are..** con
31cc0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 6c 61  sidered to be la
31cd0 72 67 65 72 2e 20 4e 6f 64 65 73 20 61 74 20 45  rger. Nodes at E
31ce0 4f 46 20 61 72 65 20 74 68 65 20 6c 61 72 67 65  OF are the large
31cf0 73 74 20 6f 66 20 61 6c 6c 2e 0d 0a 2a 2a 0d 0a  st of all...**..
31d00 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
31d10 61 74 20 69 66 20 74 68 65 20 69 74 65 72 61 74  at if the iterat
31d20 69 6f 6e 20 6f 72 64 65 72 20 69 73 20 41 53 43  ion order is ASC
31d30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 61 6c  , then numerical
31d40 6c 79 20 6c 61 72 67 65 72 0d 0a 2a 2a 20 72 6f  ly larger..** ro
31d50 77 69 64 73 20 61 72 65 20 63 6f 6e 73 69 64 65  wids are conside
31d60 72 65 64 20 6c 61 72 67 65 72 2e 20 4f 72 20 69  red larger. Or i
31d70 66 20 69 74 20 69 73 20 74 68 65 20 64 65 66 61  f it is the defa
31d80 75 6c 74 20 44 45 53 43 2c 20 6e 75 6d 65 72 69  ult DESC, numeri
31d90 63 61 6c 6c 79 0d 0a 2a 2a 20 73 6d 61 6c 6c 65  cally..** smalle
31da0 72 20 72 6f 77 69 64 73 20 61 72 65 20 6c 61 72  r rowids are lar
31db0 67 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ger...*/..static
31dc0 20 69 6e 74 20 66 74 73 35 4e 6f 64 65 43 6f 6d   int fts5NodeCom
31dd0 70 61 72 65 28 0d 0a 20 20 46 74 73 35 45 78 70  pare(..  Fts5Exp
31de0 72 20 2a 70 45 78 70 72 2c 0d 0a 20 20 46 74 73  r *pExpr,..  Fts
31df0 35 45 78 70 72 4e 6f 64 65 20 2a 70 31 2c 20 0d  5ExprNode *p1, .
31e00 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
31e10 2a 70 32 0d 0a 29 7b 0d 0a 20 20 69 66 28 20 70  *p2..){..  if( p
31e20 32 2d 3e 62 45 6f 66 20 29 20 72 65 74 75 72 6e  2->bEof ) return
31e30 20 2d 31 3b 0d 0a 20 20 69 66 28 20 70 31 2d 3e   -1;..  if( p1->
31e40 62 45 6f 66 20 29 20 72 65 74 75 72 6e 20 2b 31  bEof ) return +1
31e50 3b 0d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ;..  return fts5
31e60 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20  RowidCmp(pExpr, 
31e70 70 31 2d 3e 69 52 6f 77 69 64 2c 20 70 32 2d 3e  p1->iRowid, p2->
31e80 69 52 6f 77 69 64 29 3b 0d 0a 7d 0d 0a 0d 0a 2f  iRowid);..}..../
31e90 2a 0d 0a 2a 2a 20 41 6c 6c 20 69 6e 64 69 76 69  *..** All indivi
31ea0 64 75 61 6c 20 74 65 72 6d 20 69 74 65 72 61 74  dual term iterat
31eb0 6f 72 73 20 69 6e 20 70 4e 65 61 72 20 61 72 65  ors in pNear are
31ec0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
31ed0 65 20 76 61 6c 69 64 20 77 68 65 6e 0d 0a 2a 2a  e valid when..**
31ee0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31ef0 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 66  s called. This f
31f00 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
31f10 66 20 61 6c 6c 20 74 65 72 6d 20 69 74 65 72 61  f all term itera
31f20 74 6f 72 73 0d 0a 2a 2a 20 70 6f 69 6e 74 20 74  tors..** point t
31f30 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69 64  o the same rowid
31f40 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 61 64  , and if not, ad
31f50 76 61 6e 63 65 73 20 74 68 65 6d 20 75 6e 74 69  vances them unti
31f60 6c 20 74 68 65 79 20 64 6f 2e 0d 0a 2a 2a 20 49  l they do...** I
31f70 66 20 61 6e 20 45 4f 46 20 69 73 20 72 65 61 63  f an EOF is reac
31f80 68 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  hed before this 
31f90 68 61 70 70 65 6e 73 2c 20 2a 70 62 45 6f 66 20  happens, *pbEof 
31fa0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 62  is set to true b
31fb0 65 66 6f 72 65 0d 0a 2a 2a 20 72 65 74 75 72 6e  efore..** return
31fc0 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c  ing...**..** SQL
31fd0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
31fe0 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
31ff0 63 63 75 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c  ccurs, or an SQL
32000 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 0d  ite error code .
32010 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 49  .** otherwise. I
32020 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
32030 72 65 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  red an error cod
32040 65 20 69 66 20 61 6e 20 69 74 65 72 61 74 6f 72  e if an iterator
32050 20 72 65 61 63 68 65 73 0d 0a 2a 2a 20 45 4f 46   reaches..** EOF
32060 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
32070 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65  t fts5ExprNodeTe
32080 73 74 5f 53 54 52 49 4e 47 28 0d 0a 20 20 46 74  st_STRING(..  Ft
32090 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s5Expr *pExpr,  
320a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
320b0 20 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72   Expression pPhr
320c0 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  ase belongs to *
320d0 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  /..  Fts5ExprNod
320e0 65 20 2a 70 4e 6f 64 65 0d 0a 29 7b 0d 0a 20 20  e *pNode..){..  
320f0 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
32100 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e  *pNear = pNode->
32110 70 4e 65 61 72 3b 0d 0a 20 20 46 74 73 35 45 78  pNear;..  Fts5Ex
32120 70 72 50 68 72 61 73 65 20 2a 70 4c 65 66 74 20  prPhrase *pLeft 
32130 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  = pNear->apPhras
32140 65 5b 30 5d 3b 0d 0a 20 20 69 6e 74 20 72 63 20  e[0];..  int rc 
32150 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  = SQLITE_OK;..  
32160 69 36 34 20 69 4c 61 73 74 3b 20 20 20 20 20 20  i64 iLast;      
32170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32180 2f 2a 20 4c 61 73 74 65 73 74 20 72 6f 77 69 64  /* Lastest rowid
32190 20 61 6e 79 20 69 74 65 72 61 74 6f 72 20 70 6f   any iterator po
321a0 69 6e 74 73 20 74 6f 20 2a 2f 0d 0a 20 20 69 6e  ints to */..  in
321b0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
321c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
321d0 20 50 68 72 61 73 65 20 61 6e 64 20 74 6f 6b 65   Phrase and toke
321e0 6e 20 69 6e 64 65 78 2c 20 72 65 73 70 65 63 74  n index, respect
321f0 69 76 65 6c 79 20 2a 2f 0d 0a 20 20 69 6e 74 20  ively */..  int 
32200 62 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  bMatch;         
32210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32220 72 75 65 20 69 66 20 61 6c 6c 20 74 65 72 6d 73  rue if all terms
32230 20 61 72 65 20 61 74 20 74 68 65 20 73 61 6d 65   are at the same
32240 20 72 6f 77 69 64 20 2a 2f 0d 0a 20 20 63 6f 6e   rowid */..  con
32250 73 74 20 69 6e 74 20 62 44 65 73 63 20 3d 20 70  st int bDesc = p
32260 45 78 70 72 2d 3e 62 44 65 73 63 3b 0d 0a 0d 0a  Expr->bDesc;....
32270 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
32280 74 68 69 73 20 6e 6f 64 65 20 73 68 6f 75 6c 64  this node should
32290 20 6e 6f 74 20 62 65 20 46 54 53 35 5f 54 45 52   not be FTS5_TER
322a0 4d 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20  M */..  assert( 
322b0 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e 31  pNear->nPhrase>1
322c0 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65   ..       || pNe
322d0 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
322e0 3e 6e 54 65 72 6d 3e 31 20 0d 0a 20 20 20 20 20  >nTerm>1 ..     
322f0 20 20 7c 7c 20 70 4e 65 61 72 2d 3e 61 70 50 68    || pNear->apPh
32300 72 61 73 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30  rase[0]->aTerm[0
32310 5d 2e 70 53 79 6e 6f 6e 79 6d 0d 0a 20 20 20 20  ].pSynonym..    
32320 20 20 20 7c 7c 20 70 4e 65 61 72 2d 3e 61 70 50     || pNear->apP
32330 68 72 61 73 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b  hrase[0]->aTerm[
32340 30 5d 2e 62 46 69 72 73 74 0d 0a 20 20 29 3b 0d  0].bFirst..  );.
32350 0a 0d 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ...  /* Initiali
32360 7a 65 20 69 4c 61 73 74 2c 20 74 68 65 20 22 6c  ze iLast, the "l
32370 61 73 74 65 73 74 22 20 72 6f 77 69 64 20 61 6e  astest" rowid an
32380 79 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  y iterator point
32390 73 20 74 6f 2e 20 49 66 20 74 68 65 0d 0a 20 20  s to. If the..  
323a0 2a 2a 20 69 74 65 72 61 74 6f 72 20 73 6b 69 70  ** iterator skip
323b0 73 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 73  s through rowids
323c0 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20   in the default 
323d0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c  ascending order,
323e0 20 74 68 69 73 20 6d 65 61 6e 73 0d 0a 20 20 2a   this means..  *
323f0 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f  * the maximum ro
32400 77 69 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  wid. Or, if the 
32410 69 74 65 72 61 74 6f 72 20 69 73 20 22 4f 52 44  iterator is "ORD
32420 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
32430 22 2c 20 74 68 65 6e 20 69 74 0d 0a 20 20 2a 2a  ", then it..  **
32440 20 6d 65 61 6e 73 20 74 68 65 20 6d 69 6e 69 6d   means the minim
32450 75 6d 20 72 6f 77 69 64 2e 20 20 2a 2f 0d 0a 20  um rowid.  */.. 
32460 20 69 66 28 20 70 4c 65 66 74 2d 3e 61 54 65 72   if( pLeft->aTer
32470 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 20 29 7b  m[0].pSynonym ){
32480 0d 0a 20 20 20 20 69 4c 61 73 74 20 3d 20 66 74  ..    iLast = ft
32490 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77  s5ExprSynonymRow
324a0 69 64 28 26 70 4c 65 66 74 2d 3e 61 54 65 72 6d  id(&pLeft->aTerm
324b0 5b 30 5d 2c 20 62 44 65 73 63 2c 20 30 29 3b 0d  [0], bDesc, 0);.
324c0 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69  .  }else{..    i
324d0 4c 61 73 74 20 3d 20 70 4c 65 66 74 2d 3e 61 54  Last = pLeft->aT
324e0 65 72 6d 5b 30 5d 2e 70 49 74 65 72 2d 3e 69 52  erm[0].pIter->iR
324f0 6f 77 69 64 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  owid;..  }....  
32500 64 6f 20 7b 0d 0a 20 20 20 20 62 4d 61 74 63 68  do {..    bMatch
32510 20 3d 20 31 3b 0d 0a 20 20 20 20 66 6f 72 28 69   = 1;..    for(i
32520 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68  =0; i<pNear->nPh
32530 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  rase; i++){..   
32540 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
32550 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65  e *pPhrase = pNe
32560 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b  ar->apPhrase[i];
32570 0d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ..      for(j=0;
32580 20 6a 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72   j<pPhrase->nTer
32590 6d 3b 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  m; j++){..      
325a0 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
325b0 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
325c0 2d 3e 61 54 65 72 6d 5b 6a 5d 3b 0d 0a 20 20 20  ->aTerm[j];..   
325d0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
325e0 70 53 79 6e 6f 6e 79 6d 20 29 7b 0d 0a 20 20 20  pSynonym ){..   
325f0 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69         i64 iRowi
32600 64 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e 6f  d = fts5ExprSyno
32610 6e 79 6d 52 6f 77 69 64 28 70 54 65 72 6d 2c 20  nymRowid(pTerm, 
32620 62 44 65 73 63 2c 20 30 29 3b 0d 0a 20 20 20 20  bDesc, 0);..    
32630 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
32640 3d 3d 69 4c 61 73 74 20 29 20 63 6f 6e 74 69 6e  ==iLast ) contin
32650 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  ue;..          b
32660 4d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20  Match = 0;..    
32670 20 20 20 20 20 20 69 66 28 20 66 74 73 35 45 78        if( fts5Ex
32680 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e 63 65  prSynonymAdvance
32690 74 6f 28 70 54 65 72 6d 2c 20 62 44 65 73 63 2c  to(pTerm, bDesc,
326a0 20 26 69 4c 61 73 74 2c 20 26 72 63 29 20 29 7b   &iLast, &rc) ){
326b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  ..            pN
326c0 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20  ode->bNomatch = 
326d0 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0;..            
326e0 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b  pNode->bEof = 1;
326f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
32700 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20  turn rc;..      
32710 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
32720 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20  else{..         
32730 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
32740 70 49 74 65 72 20 3d 20 70 50 68 72 61 73 65 2d  pIter = pPhrase-
32750 3e 61 54 65 72 6d 5b 6a 5d 2e 70 49 74 65 72 3b  >aTerm[j].pIter;
32760 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
32770 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3d 3d 69  pIter->iRowid==i
32780 4c 61 73 74 20 7c 7c 20 70 49 74 65 72 2d 3e 62  Last || pIter->b
32790 45 6f 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d  Eof ) continue;.
327a0 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74 63  .          bMatc
327b0 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20  h = 0;..        
327c0 20 20 69 66 28 20 66 74 73 35 45 78 70 72 41 64    if( fts5ExprAd
327d0 76 61 6e 63 65 74 6f 28 70 49 74 65 72 2c 20 62  vanceto(pIter, b
327e0 44 65 73 63 2c 20 26 69 4c 61 73 74 2c 20 26 72  Desc, &iLast, &r
327f0 63 2c 20 26 70 4e 6f 64 65 2d 3e 62 45 6f 66 29  c, &pNode->bEof)
32800 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ){..           
32810 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20   return rc;..   
32820 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
32830 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
32840 20 20 7d 0d 0a 20 20 7d 77 68 69 6c 65 28 20 62    }..  }while( b
32850 4d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a 20  Match==0 );.... 
32860 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d   pNode->iRowid =
32870 20 69 4c 61 73 74 3b 0d 0a 20 20 70 4e 6f 64 65   iLast;..  pNode
32880 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28 28 30  ->bNomatch = ((0
32890 3d 3d 66 74 73 35 45 78 70 72 4e 65 61 72 54 65  ==fts5ExprNearTe
328a0 73 74 28 26 72 63 2c 20 70 45 78 70 72 2c 20 70  st(&rc, pExpr, p
328b0 4e 6f 64 65 29 29 20 26 26 20 72 63 3d 3d 53 51  Node)) && rc==SQ
328c0 4c 49 54 45 5f 4f 4b 29 3b 0d 0a 20 20 61 73 73  LITE_OK);..  ass
328d0 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66  ert( pNode->bEof
328e0 3d 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 4e  ==0 || pNode->bN
328f0 6f 6d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a  omatch==0 );....
32900 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
32910 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63  .../*..** Advanc
32920 65 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  e the first term
32930 20 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65   iterator in the
32940 20 66 69 72 73 74 20 70 68 72 61 73 65 20 6f 66   first phrase of
32950 20 70 4e 65 61 72 2e 20 53 65 74 20 6f 75 74 70   pNear. Set outp
32960 75 74 0d 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ut..** variable 
32970 2a 70 62 45 6f 66 20 74 6f 20 74 72 75 65 20 69  *pbEof to true i
32980 66 20 69 74 20 72 65 61 63 68 65 73 20 45 4f 46  f it reaches EOF
32990 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
329a0 6f 63 63 75 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  occurs...**..** 
329b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
329c0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
329d0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
329e0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
329f0 72 6f 72 0d 0a 2a 2a 20 6f 63 63 75 72 73 2e 0d  ror..** occurs..
32a00 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
32a10 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
32a20 5f 53 54 52 49 4e 47 28 0d 0a 20 20 46 74 73 35  _STRING(..  Fts5
32a30 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
32a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
32a50 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73  xpression pPhras
32a60 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d  e belongs to */.
32a70 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
32a80 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
32a90 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 52 49 4e     /* FTS5_STRIN
32aa0 47 20 6f 72 20 46 54 53 35 5f 54 45 52 4d 20 6e  G or FTS5_TERM n
32ab0 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 46  ode */..  int bF
32ac0 72 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20 69 36 34  romValid,..  i64
32ad0 20 69 46 72 6f 6d 20 0d 0a 29 7b 0d 0a 20 20 46   iFrom ..){..  F
32ae0 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
32af0 72 6d 20 3d 20 26 70 4e 6f 64 65 2d 3e 70 4e 65  rm = &pNode->pNe
32b00 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
32b10 3e 61 54 65 72 6d 5b 30 5d 3b 0d 0a 20 20 69 6e  >aTerm[0];..  in
32b20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32b30 3b 0d 0a 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e  ;....  pNode->bN
32b40 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 69  omatch = 0;..  i
32b50 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  f( pTerm->pSynon
32b60 79 6d 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 62  ym ){..    int b
32b70 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 20 20 46 74  Eof = 1;..    Ft
32b80 73 35 45 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a  s5ExprTerm *p;..
32b90 0d 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
32ba0 65 20 66 69 72 73 74 65 73 74 20 72 6f 77 69 64  e firstest rowid
32bb0 20 61 6e 79 20 73 79 6e 6f 6e 79 6d 20 70 6f 69   any synonym poi
32bc0 6e 74 73 20 74 6f 2e 20 2a 2f 0d 0a 20 20 20 20  nts to. */..    
32bd0 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
32be0 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69  5ExprSynonymRowi
32bf0 64 28 70 54 65 72 6d 2c 20 70 45 78 70 72 2d 3e  d(pTerm, pExpr->
32c00 62 44 65 73 63 2c 20 30 29 3b 0d 0a 0d 0a 20 20  bDesc, 0);....  
32c10 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63    /* Advance eac
32c20 68 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  h iterator that 
32c30 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
32c40 20 74 6f 20 69 52 6f 77 69 64 2e 20 4f 72 2c 20   to iRowid. Or, 
32c50 69 66 20 69 46 72 6f 6d 0d 0a 20 20 20 20 2a 2a  if iFrom..    **
32c60 20 69 73 20 76 61 6c 69 64 20 2d 20 65 61 63 68   is valid - each
32c70 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 70   iterator that p
32c80 6f 69 6e 74 73 20 74 6f 20 61 20 72 6f 77 69 64  oints to a rowid
32c90 20 62 65 66 6f 72 65 20 69 46 72 6f 6d 2e 20 20   before iFrom.  
32ca0 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 70 3d 70 54  */..    for(p=pT
32cb0 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
32cc0 6e 6f 6e 79 6d 29 7b 0d 0a 20 20 20 20 20 20 69  nonym){..      i
32cd0 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  f( sqlite3Fts5It
32ce0 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d  erEof(p->pIter)=
32cf0 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69  =0 ){..        i
32d00 36 34 20 69 69 20 3d 20 70 2d 3e 70 49 74 65 72  64 ii = p->pIter
32d10 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 20 20 20  ->iRowid;..     
32d20 20 20 20 69 66 28 20 69 69 3d 3d 69 52 6f 77 69     if( ii==iRowi
32d30 64 20 0d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  d ..         || 
32d40 28 62 46 72 6f 6d 56 61 6c 69 64 20 26 26 20 69  (bFromValid && i
32d50 69 21 3d 69 46 72 6f 6d 20 26 26 20 28 69 69 3e  i!=iFrom && (ii>
32d60 69 46 72 6f 6d 29 3d 3d 70 45 78 70 72 2d 3e 62  iFrom)==pExpr->b
32d70 44 65 73 63 29 20 0d 0a 20 20 20 20 20 20 20 20  Desc) ..        
32d80 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ){..          if
32d90 28 20 62 46 72 6f 6d 56 61 6c 69 64 20 29 7b 0d  ( bFromValid ){.
32da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32db0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
32dc0 72 4e 65 78 74 46 72 6f 6d 28 70 2d 3e 70 49 74  rNextFrom(p->pIt
32dd0 65 72 2c 20 69 46 72 6f 6d 29 3b 0d 0a 20 20 20  er, iFrom);..   
32de0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20         }else{.. 
32df0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32e00 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
32e10 65 78 74 28 70 2d 3e 70 49 74 65 72 29 3b 0d 0a  ext(p->pIter);..
32e20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
32e30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32e40 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
32e50 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
32e60 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
32e70 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30  Eof(p->pIter)==0
32e80 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ){..           
32e90 20 62 45 6f 66 20 3d 20 30 3b 0d 0a 20 20 20 20   bEof = 0;..    
32ea0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
32eb0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20   }else{..       
32ec0 20 20 20 62 45 6f 66 20 3d 20 30 3b 0d 0a 20 20     bEof = 0;..  
32ed0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
32ee0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
32ef0 2a 20 53 65 74 20 74 68 65 20 45 4f 46 20 66 6c  * Set the EOF fl
32f00 61 67 20 69 66 20 65 69 74 68 65 72 20 61 6c 6c  ag if either all
32f10 20 73 79 6e 6f 6e 79 6d 20 69 74 65 72 61 74 6f   synonym iterato
32f20 72 73 20 61 72 65 20 61 74 20 45 4f 46 20 6f 72  rs are at EOF or
32f30 20 61 6e 0d 0a 20 20 20 20 2a 2a 20 65 72 72 6f   an..    ** erro
32f40 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
32f50 20 2a 2f 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e   */..    pNode->
32f60 62 45 6f 66 20 3d 20 28 72 63 20 7c 7c 20 62 45  bEof = (rc || bE
32f70 6f 66 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a  of);..  }else{..
32f80 20 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65      Fts5IndexIte
32f90 72 20 2a 70 49 74 65 72 20 3d 20 70 54 65 72 6d  r *pIter = pTerm
32fa0 2d 3e 70 49 74 65 72 3b 0d 0a 0d 0a 20 20 20 20  ->pIter;....    
32fb0 61 73 73 65 72 74 28 20 46 74 73 35 4e 6f 64 65  assert( Fts5Node
32fc0 49 73 53 74 72 69 6e 67 28 70 4e 6f 64 65 29 20  IsString(pNode) 
32fd0 29 3b 0d 0a 20 20 20 20 69 66 28 20 62 46 72 6f  );..    if( bFro
32fe0 6d 56 61 6c 69 64 20 29 7b 0d 0a 20 20 20 20 20  mValid ){..     
32ff0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
33000 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49  5IterNextFrom(pI
33010 74 65 72 2c 20 69 46 72 6f 6d 29 3b 0d 0a 20 20  ter, iFrom);..  
33020 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
33030 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
33040 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b  IterNext(pIter);
33050 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70  ..    }....    p
33060 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 28 72 63  Node->bEof = (rc
33070 20 7c 7c 20 73 71 6c 69 74 65 33 46 74 73 35 49   || sqlite3Fts5I
33080 74 65 72 45 6f 66 28 70 49 74 65 72 29 29 3b 0d  terEof(pIter));.
33090 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 4e  .  }....  if( pN
330a0 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0d  ode->bEof==0 ){.
330b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
330c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20  =SQLITE_OK );.. 
330d0 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
330e0 4e 6f 64 65 54 65 73 74 5f 53 54 52 49 4e 47 28  NodeTest_STRING(
330f0 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a  pExpr, pNode);..
33100 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20    }....  return 
33110 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 73 74 61 74  rc;..}......stat
33120 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e  ic int fts5ExprN
33130 6f 64 65 54 65 73 74 5f 54 45 52 4d 28 0d 0a 20  odeTest_TERM(.. 
33140 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
33150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33160 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
33170 68 61 74 20 70 4e 65 61 72 20 69 73 20 61 20 70  hat pNear is a p
33180 61 72 74 20 6f 66 20 2a 2f 0d 0a 20 20 46 74 73  art of */..  Fts
33190 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
331a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
331b0 54 68 65 20 22 4e 45 41 52 22 20 6e 6f 64 65 20  The "NEAR" node 
331c0 28 46 54 53 35 5f 54 45 52 4d 29 20 2a 2f 0d 0a  (FTS5_TERM) */..
331d0 29 7b 0d 0a 20 20 2f 2a 20 41 73 20 74 68 69 73  ){..  /* As this
331e0 20 22 4e 45 41 52 22 20 6f 62 6a 65 63 74 20 69   "NEAR" object i
331f0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 69 6e  s actually a sin
33200 67 6c 65 20 70 68 72 61 73 65 20 74 68 61 74 20  gle phrase that 
33210 63 6f 6e 73 69 73 74 73 20 0d 0a 20 20 2a 2a 20  consists ..  ** 
33220 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  of a single term
33230 20 6f 6e 6c 79 2c 20 67 72 61 62 20 70 6f 69 6e   only, grab poin
33240 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 70 6f  ters into the po
33250 73 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79  slist managed by
33260 20 74 68 65 0d 0a 20 20 2a 2a 20 66 74 73 35 5f   the..  ** fts5_
33270 69 6e 64 65 78 2e 63 20 69 74 65 72 61 74 6f 72  index.c iterator
33280 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 69 73   object. This is
33290 20 6d 75 63 68 20 66 61 73 74 65 72 20 74 68 61   much faster tha
332a0 6e 20 73 79 6e 74 68 65 73 69 7a 69 6e 67 20 0d  n synthesizing .
332b0 0a 20 20 2a 2a 20 61 20 6e 65 77 20 70 6f 73 6c  .  ** a new posl
332c0 69 73 74 20 74 68 65 20 77 61 79 20 77 65 20 68  ist the way we h
332d0 61 76 65 20 74 6f 20 66 6f 72 20 6d 6f 72 65 20  ave to for more 
332e0 63 6f 6d 70 6c 69 63 61 74 65 64 20 70 68 72 61  complicated phra
332f0 73 65 20 6f 72 20 4e 45 41 52 0d 0a 20 20 2a 2a  se or NEAR..  **
33300 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 2a   expressions.  *
33310 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68 72  /..  Fts5ExprPhr
33320 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
33330 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e 61 70 50  Node->pNear->apP
33340 68 72 61 73 65 5b 30 5d 3b 0d 0a 20 20 46 74 73  hrase[0];..  Fts
33350 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
33360 72 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65  r = pPhrase->aTe
33370 72 6d 5b 30 5d 2e 70 49 74 65 72 3b 0d 0a 0d 0a  rm[0].pIter;....
33380 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
33390 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
333a0 4d 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20  M );..  assert( 
333b0 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e 6e 50  pNode->pNear->nP
333c0 68 72 61 73 65 3d 3d 31 20 26 26 20 70 50 68 72  hrase==1 && pPhr
333d0 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d 31 20 29 3b  ase->nTerm==1 );
333e0 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 68 72  ..  assert( pPhr
333f0 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53  ase->aTerm[0].pS
33400 79 6e 6f 6e 79 6d 3d 3d 30 20 29 3b 0d 0a 0d 0a  ynonym==0 );....
33410 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69    pPhrase->posli
33420 73 74 2e 6e 20 3d 20 70 49 74 65 72 2d 3e 6e 44  st.n = pIter->nD
33430 61 74 61 3b 0d 0a 20 20 69 66 28 20 70 45 78 70  ata;..  if( pExp
33440 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  r->pConfig->eDet
33450 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
33460 5f 46 55 4c 4c 20 29 7b 0d 0a 20 20 20 20 70 50  _FULL ){..    pP
33470 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 70  hrase->poslist.p
33480 20 3d 20 28 75 38 2a 29 70 49 74 65 72 2d 3e 70   = (u8*)pIter->p
33490 44 61 74 61 3b 0d 0a 20 20 7d 0d 0a 20 20 70 4e  Data;..  }..  pN
334a0 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 49  ode->iRowid = pI
334b0 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20  ter->iRowid;..  
334c0 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20  pNode->bNomatch 
334d0 3d 20 28 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  = (pPhrase->posl
334e0 69 73 74 2e 6e 3d 3d 30 29 3b 0d 0a 20 20 72 65  ist.n==0);..  re
334f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d  turn SQLITE_OK;.
33500 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 78 4e 65  .}..../*..** xNe
33510 78 74 28 29 20 6d 65 74 68 6f 64 20 66 6f 72 20  xt() method for 
33520 61 20 6e 6f 64 65 20 6f 66 20 74 79 70 65 20 46  a node of type F
33530 54 53 35 5f 54 45 52 4d 2e 0d 0a 2a 2f 0d 0a 73  TS5_TERM...*/..s
33540 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
33550 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45 52 4d 28  prNodeNext_TERM(
33560 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  ..  Fts5Expr *pE
33570 78 70 72 2c 20 0d 0a 20 20 46 74 73 35 45 78 70  xpr, ..  Fts5Exp
33580 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0d 0a 20  rNode *pNode,.. 
33590 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c   int bFromValid,
335a0 0d 0a 20 20 69 36 34 20 69 46 72 6f 6d 0d 0a 29  ..  i64 iFrom..)
335b0 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20  {..  int rc;..  
335c0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
335d0 49 74 65 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e  Iter = pNode->pN
335e0 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
335f0 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72  ->aTerm[0].pIter
33600 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70  ;....  assert( p
33610 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b  Node->bEof==0 );
33620 0d 0a 20 20 69 66 28 20 62 46 72 6f 6d 56 61 6c  ..  if( bFromVal
33630 69 64 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20  id ){..    rc = 
33640 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
33650 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2c 20 69  extFrom(pIter, i
33660 46 72 6f 6d 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b  From);..  }else{
33670 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
33680 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70  e3Fts5IterNext(p
33690 49 74 65 72 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69  Iter);..  }..  i
336a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
336b0 20 26 26 20 73 71 6c 69 74 65 33 46 74 73 35 49   && sqlite3Fts5I
336c0 74 65 72 45 6f 66 28 70 49 74 65 72 29 3d 3d 30  terEof(pIter)==0
336d0 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 66 74   ){..    rc = ft
336e0 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 54  s5ExprNodeTest_T
336f0 45 52 4d 28 70 45 78 70 72 2c 20 70 4e 6f 64 65  ERM(pExpr, pNode
33700 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20  );..  }else{..  
33710 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
33720 31 3b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62  1;..    pNode->b
33730 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20  Nomatch = 0;..  
33740 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  }..  return rc;.
33750 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69  .}....static voi
33760 64 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65  d fts5ExprNodeTe
33770 73 74 5f 4f 52 28 0d 0a 20 20 46 74 73 35 45 78  st_OR(..  Fts5Ex
33780 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
33790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
337a0 72 65 73 73 69 6f 6e 20 6f 66 20 77 68 69 63 68  ression of which
337b0 20 70 4e 6f 64 65 20 69 73 20 61 20 70 61 72 74   pNode is a part
337c0 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e   */..  Fts5ExprN
337d0 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20 20  ode *pNode      
337e0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
337f0 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 74 65 73  sion node to tes
33800 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 46 74 73 35  t */..){..  Fts5
33810 45 78 70 72 4e 6f 64 65 20 2a 70 4e 65 78 74 20  ExprNode *pNext 
33820 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  = pNode->apChild
33830 5b 30 5d 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a  [0];..  int i;..
33840 0d 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  ..  for(i=1; i<p
33850 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b  Node->nChild; i+
33860 2b 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78 70  +){..    Fts5Exp
33870 72 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d 20  rNode *pChild = 
33880 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69  pNode->apChild[i
33890 5d 3b 0d 0a 20 20 20 20 69 6e 74 20 63 6d 70 20  ];..    int cmp 
338a0 3d 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72  = fts5NodeCompar
338b0 65 28 70 45 78 70 72 2c 20 70 4e 65 78 74 2c 20  e(pExpr, pNext, 
338c0 70 43 68 69 6c 64 29 3b 0d 0a 20 20 20 20 69 66  pChild);..    if
338d0 28 20 63 6d 70 3e 30 20 7c 7c 20 28 63 6d 70 3d  ( cmp>0 || (cmp=
338e0 3d 30 20 26 26 20 70 43 68 69 6c 64 2d 3e 62 4e  =0 && pChild->bN
338f0 6f 6d 61 74 63 68 3d 3d 30 29 20 29 7b 0d 0a 20  omatch==0) ){.. 
33900 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 43 68       pNext = pCh
33910 69 6c 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  ild;..    }..  }
33920 0d 0a 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69  ..  pNode->iRowi
33930 64 20 3d 20 70 4e 65 78 74 2d 3e 69 52 6f 77 69  d = pNext->iRowi
33940 64 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f  d;..  pNode->bEo
33950 66 20 3d 20 70 4e 65 78 74 2d 3e 62 45 6f 66 3b  f = pNext->bEof;
33960 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61  ..  pNode->bNoma
33970 74 63 68 20 3d 20 70 4e 65 78 74 2d 3e 62 4e 6f  tch = pNext->bNo
33980 6d 61 74 63 68 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61  match;..}....sta
33990 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
339a0 4e 6f 64 65 4e 65 78 74 5f 4f 52 28 0d 0a 20 20  NodeNext_OR(..  
339b0 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts5Expr *pExpr,
339c0 20 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64   ..  Fts5ExprNod
339d0 65 20 2a 70 4e 6f 64 65 2c 0d 0a 20 20 69 6e 74  e *pNode,..  int
339e0 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20   bFromValid,..  
339f0 69 36 34 20 69 46 72 6f 6d 0d 0a 29 7b 0d 0a 20  i64 iFrom..){.. 
33a00 20 69 6e 74 20 69 3b 0d 0a 20 20 69 36 34 20 69   int i;..  i64 i
33a10 4c 61 73 74 20 3d 20 70 4e 6f 64 65 2d 3e 69 52  Last = pNode->iR
33a20 6f 77 69 64 3b 0d 0a 0d 0a 20 20 66 6f 72 28 69  owid;....  for(i
33a30 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68  =0; i<pNode->nCh
33a40 69 6c 64 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20  ild; i++){..    
33a50 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 31  Fts5ExprNode *p1
33a60 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c   = pNode->apChil
33a70 64 5b 69 5d 3b 0d 0a 20 20 20 20 61 73 73 65 72  d[i];..    asser
33a80 74 28 20 70 31 2d 3e 62 45 6f 66 20 7c 7c 20 66  t( p1->bEof || f
33a90 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70  ts5RowidCmp(pExp
33aa0 72 2c 20 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69  r, p1->iRowid, i
33ab0 4c 61 73 74 29 3e 3d 30 20 29 3b 0d 0a 20 20 20  Last)>=0 );..   
33ac0 20 69 66 28 20 70 31 2d 3e 62 45 6f 66 3d 3d 30   if( p1->bEof==0
33ad0 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 28   ){..      if( (
33ae0 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73  p1->iRowid==iLas
33af0 74 29 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20 28  t) ..       || (
33b00 62 46 72 6f 6d 56 61 6c 69 64 20 26 26 20 66 74  bFromValid && ft
33b10 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72  s5RowidCmp(pExpr
33b20 2c 20 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69 46  , p1->iRowid, iF
33b30 72 6f 6d 29 3c 30 29 0d 0a 20 20 20 20 20 20 29  rom)<0)..      )
33b40 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  {..        int r
33b50 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
33b60 4e 65 78 74 28 70 45 78 70 72 2c 20 70 31 2c 20  Next(pExpr, p1, 
33b70 62 46 72 6f 6d 56 61 6c 69 64 2c 20 69 46 72 6f  bFromValid, iFro
33b80 6d 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  m);..        if(
33b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33ba0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f  {..          pNo
33bb0 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30  de->bNomatch = 0
33bc0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ;..          ret
33bd0 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 20  urn rc;..       
33be0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
33bf0 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 66 74 73   }..  }....  fts
33c00 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f 52  5ExprNodeTest_OR
33c10 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d  (pExpr, pNode);.
33c20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33c30 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a  _OK;..}..../*..*
33c40 2a 20 41 72 67 75 6d 65 6e 74 20 70 4e 6f 64 65  * Argument pNode
33c50 20 69 73 20 61 6e 20 46 54 53 35 5f 41 4e 44 20   is an FTS5_AND 
33c60 6e 6f 64 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  node...*/..stati
33c70 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f  c int fts5ExprNo
33c80 64 65 54 65 73 74 5f 41 4e 44 28 0d 0a 20 20 46  deTest_AND(..  F
33c90 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ts5Expr *pExpr, 
33ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33cb0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68  * Expression pPh
33cc0 72 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rase belongs to 
33cd0 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  */..  Fts5ExprNo
33ce0 64 65 20 2a 70 41 6e 64 20 20 20 20 20 20 20 20  de *pAnd        
33cf0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 41 4e        /* FTS5_AN
33d00 44 20 6e 6f 64 65 20 74 6f 20 61 64 76 61 6e 63  D node to advanc
33d10 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  e */..){..  int 
33d20 69 43 68 69 6c 64 3b 0d 0a 20 20 69 36 34 20 69  iChild;..  i64 i
33d30 4c 61 73 74 20 3d 20 70 41 6e 64 2d 3e 69 52 6f  Last = pAnd->iRo
33d40 77 69 64 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d  wid;..  int rc =
33d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69   SQLITE_OK;..  i
33d60 6e 74 20 62 4d 61 74 63 68 3b 0d 0a 0d 0a 20 20  nt bMatch;....  
33d70 61 73 73 65 72 74 28 20 70 41 6e 64 2d 3e 62 45  assert( pAnd->bE
33d80 6f 66 3d 3d 30 20 29 3b 0d 0a 20 20 64 6f 20 7b  of==0 );..  do {
33d90 0d 0a 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d  ..    pAnd->bNom
33da0 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 62  atch = 0;..    b
33db0 4d 61 74 63 68 20 3d 20 31 3b 0d 0a 20 20 20 20  Match = 1;..    
33dc0 66 6f 72 28 69 43 68 69 6c 64 3d 30 3b 20 69 43  for(iChild=0; iC
33dd0 68 69 6c 64 3c 70 41 6e 64 2d 3e 6e 43 68 69 6c  hild<pAnd->nChil
33de0 64 3b 20 69 43 68 69 6c 64 2b 2b 29 7b 0d 0a 20  d; iChild++){.. 
33df0 20 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64       Fts5ExprNod
33e00 65 20 2a 70 43 68 69 6c 64 20 3d 20 70 41 6e 64  e *pChild = pAnd
33e10 2d 3e 61 70 43 68 69 6c 64 5b 69 43 68 69 6c 64  ->apChild[iChild
33e20 5d 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20 63 6d  ];..      int cm
33e30 70 20 3d 20 66 74 73 35 52 6f 77 69 64 43 6d 70  p = fts5RowidCmp
33e40 28 70 45 78 70 72 2c 20 69 4c 61 73 74 2c 20 70  (pExpr, iLast, p
33e50 43 68 69 6c 64 2d 3e 69 52 6f 77 69 64 29 3b 0d  Child->iRowid);.
33e60 0a 20 20 20 20 20 20 69 66 28 20 63 6d 70 3e 30  .      if( cmp>0
33e70 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20   ){..        /* 
33e80 41 64 76 61 6e 63 65 20 70 43 68 69 6c 64 20 75  Advance pChild u
33e90 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
33ea0 6f 20 69 4c 61 73 74 20 6f 72 20 6c 61 73 74 65  o iLast or laste
33eb0 72 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 72 63  r */..        rc
33ec0 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e   = fts5ExprNodeN
33ed0 65 78 74 28 70 45 78 70 72 2c 20 70 43 68 69 6c  ext(pExpr, pChil
33ee0 64 2c 20 31 2c 20 69 4c 61 73 74 29 3b 0d 0a 20  d, 1, iLast);.. 
33ef0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
33f10 20 20 20 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f         pAnd->bNo
33f20 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20  match = 0;..    
33f30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
33f40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
33f50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a     }....      /*
33f60 20 49 66 20 74 68 65 20 63 68 69 6c 64 20 6e 6f   If the child no
33f70 64 65 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46  de is now at EOF
33f80 2c 20 73 6f 20 69 73 20 74 68 65 20 70 61 72 65  , so is the pare
33f90 6e 74 20 41 4e 44 20 6e 6f 64 65 2e 20 4f 74 68  nt AND node. Oth
33fa0 65 72 77 69 73 65 2c 0d 0a 20 20 20 20 20 20 2a  erwise,..      *
33fb0 2a 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65  * the child node
33fc0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
33fd0 6f 20 68 61 76 65 20 61 64 76 61 6e 63 65 64 20  o have advanced 
33fe0 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20  at least as far 
33ff0 61 73 0d 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77  as..      ** row
34000 69 64 20 69 4c 61 73 74 2e 20 53 6f 20 69 66 20  id iLast. So if 
34010 69 74 20 69 73 20 6e 6f 74 20 61 74 20 65 78 61  it is not at exa
34020 63 74 6c 79 20 69 4c 61 73 74 2c 20 70 43 68 69  ctly iLast, pChi
34030 6c 64 2d 3e 69 52 6f 77 69 64 20 69 73 20 74 68  ld->iRowid is th
34040 65 0d 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 20  e..      ** new 
34050 6c 61 73 74 65 73 74 20 72 6f 77 69 64 20 73 65  lastest rowid se
34060 65 6e 20 73 6f 20 66 61 72 2e 20 20 2a 2f 0d 0a  en so far.  */..
34070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
34080 68 69 6c 64 2d 3e 62 45 6f 66 20 7c 7c 20 66 74  hild->bEof || ft
34090 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72  s5RowidCmp(pExpr
340a0 2c 20 69 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d  , iLast, pChild-
340b0 3e 69 52 6f 77 69 64 29 3c 3d 30 20 29 3b 0d 0a  >iRowid)<=0 );..
340c0 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64        if( pChild
340d0 2d 3e 62 45 6f 66 20 29 7b 0d 0a 20 20 20 20 20  ->bEof ){..     
340e0 20 20 20 66 74 73 35 45 78 70 72 53 65 74 45 6f     fts5ExprSetEo
340f0 66 28 70 41 6e 64 29 3b 0d 0a 20 20 20 20 20 20  f(pAnd);..      
34100 20 20 62 4d 61 74 63 68 20 3d 20 31 3b 0d 0a 20    bMatch = 1;.. 
34110 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
34120 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
34130 4c 61 73 74 21 3d 70 43 68 69 6c 64 2d 3e 69 52  Last!=pChild->iR
34140 6f 77 69 64 20 29 7b 0d 0a 20 20 20 20 20 20 20  owid ){..       
34150 20 62 4d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20   bMatch = 0;..  
34160 20 20 20 20 20 20 69 4c 61 73 74 20 3d 20 70 43        iLast = pC
34170 68 69 6c 64 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20  hild->iRowid;.. 
34180 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
34190 69 66 28 20 70 43 68 69 6c 64 2d 3e 62 4e 6f 6d  if( pChild->bNom
341a0 61 74 63 68 20 29 7b 0d 0a 20 20 20 20 20 20 20  atch ){..       
341b0 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63 68 20   pAnd->bNomatch 
341c0 3d 20 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  = 1;..      }.. 
341d0 20 20 20 7d 0d 0a 20 20 7d 77 68 69 6c 65 28 20     }..  }while( 
341e0 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a  bMatch==0 );....
341f0 20 20 69 66 28 20 70 41 6e 64 2d 3e 62 4e 6f 6d    if( pAnd->bNom
34200 61 74 63 68 20 26 26 20 70 41 6e 64 21 3d 70 45  atch && pAnd!=pE
34210 78 70 72 2d 3e 70 52 6f 6f 74 20 29 7b 0d 0a 20  xpr->pRoot ){.. 
34220 20 20 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a     fts5ExprNodeZ
34230 65 72 6f 50 6f 73 6c 69 73 74 28 70 41 6e 64 29  eroPoslist(pAnd)
34240 3b 0d 0a 20 20 7d 0d 0a 20 20 70 41 6e 64 2d 3e  ;..  }..  pAnd->
34250 69 52 6f 77 69 64 20 3d 20 69 4c 61 73 74 3b 0d  iRowid = iLast;.
34260 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34270 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69  _OK;..}....stati
34280 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f  c int fts5ExprNo
34290 64 65 4e 65 78 74 5f 41 4e 44 28 0d 0a 20 20 46  deNext_AND(..  F
342a0 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ts5Expr *pExpr, 
342b0 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ..  Fts5ExprNode
342c0 20 2a 70 4e 6f 64 65 2c 0d 0a 20 20 69 6e 74 20   *pNode,..  int 
342d0 62 46 72 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20 69  bFromValid,..  i
342e0 36 34 20 69 46 72 6f 6d 0d 0a 29 7b 0d 0a 20 20  64 iFrom..){..  
342f0 69 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78 70  int rc = fts5Exp
34300 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c  rNodeNext(pExpr,
34310 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
34320 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20  0], bFromValid, 
34330 69 46 72 6f 6d 29 3b 0d 0a 20 20 69 66 28 20 72  iFrom);..  if( r
34340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
34350 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78  .    rc = fts5Ex
34360 70 72 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28 70  prNodeTest_AND(p
34370 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20  Expr, pNode);.. 
34380 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 4e 6f   }else{..    pNo
34390 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30  de->bNomatch = 0
343a0 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e  ;..  }..  return
343b0 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69   rc;..}....stati
343c0 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f  c int fts5ExprNo
343d0 64 65 54 65 73 74 5f 4e 4f 54 28 0d 0a 20 20 46  deTest_NOT(..  F
343e0 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ts5Expr *pExpr, 
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34400 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68  * Expression pPh
34410 72 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rase belongs to 
34420 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  */..  Fts5ExprNo
34430 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20 20 20  de *pNode       
34440 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4e 4f        /* FTS5_NO
34450 54 20 6e 6f 64 65 20 74 6f 20 61 64 76 61 6e 63  T node to advanc
34460 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  e */..){..  int 
34470 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d  rc = SQLITE_OK;.
34480 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
34490 2a 70 31 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43  *p1 = pNode->apC
344a0 68 69 6c 64 5b 30 5d 3b 0d 0a 20 20 46 74 73 35  hild[0];..  Fts5
344b0 45 78 70 72 4e 6f 64 65 20 2a 70 32 20 3d 20 70  ExprNode *p2 = p
344c0 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 31 5d  Node->apChild[1]
344d0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f  ;..  assert( pNo
344e0 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 32 20 29 3b  de->nChild==2 );
344f0 0d 0a 0d 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  ....  while( rc=
34500 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31  =SQLITE_OK && p1
34510 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0d 0a 20 20  ->bEof==0 ){..  
34520 20 20 69 6e 74 20 63 6d 70 20 3d 20 66 74 73 35    int cmp = fts5
34530 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45 78 70  NodeCompare(pExp
34540 72 2c 20 70 31 2c 20 70 32 29 3b 0d 0a 20 20 20  r, p1, p2);..   
34550 20 69 66 28 20 63 6d 70 3e 30 20 29 7b 0d 0a 20   if( cmp>0 ){.. 
34560 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78       rc = fts5Ex
34570 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72  prNodeNext(pExpr
34580 2c 20 70 32 2c 20 31 2c 20 70 31 2d 3e 69 52 6f  , p2, 1, p1->iRo
34590 77 69 64 29 3b 0d 0a 20 20 20 20 20 20 63 6d 70  wid);..      cmp
345a0 20 3d 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61   = fts5NodeCompa
345b0 72 65 28 70 45 78 70 72 2c 20 70 31 2c 20 70 32  re(pExpr, p1, p2
345c0 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 61  );..    }..    a
345d0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
345e0 45 5f 4f 4b 20 7c 7c 20 63 6d 70 3c 3d 30 20 29  E_OK || cmp<=0 )
345f0 3b 0d 0a 20 20 20 20 69 66 28 20 63 6d 70 20 7c  ;..    if( cmp |
34600 7c 20 70 32 2d 3e 62 4e 6f 6d 61 74 63 68 20 29  | p2->bNomatch )
34610 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 72 63 20   break;..    rc 
34620 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  = fts5ExprNodeNe
34630 78 74 28 70 45 78 70 72 2c 20 70 31 2c 20 30 2c  xt(pExpr, p1, 0,
34640 20 30 29 3b 0d 0a 20 20 7d 0d 0a 20 20 70 4e 6f   0);..  }..  pNo
34650 64 65 2d 3e 62 45 6f 66 20 3d 20 70 31 2d 3e 62  de->bEof = p1->b
34660 45 6f 66 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62  Eof;..  pNode->b
34670 4e 6f 6d 61 74 63 68 20 3d 20 70 31 2d 3e 62 4e  Nomatch = p1->bN
34680 6f 6d 61 74 63 68 3b 0d 0a 20 20 70 4e 6f 64 65  omatch;..  pNode
34690 2d 3e 69 52 6f 77 69 64 20 3d 20 70 31 2d 3e 69  ->iRowid = p1->i
346a0 52 6f 77 69 64 3b 0d 0a 20 20 69 66 28 20 70 31  Rowid;..  if( p1
346b0 2d 3e 62 45 6f 66 20 29 7b 0d 0a 20 20 20 20 66  ->bEof ){..    f
346c0 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
346d0 6f 73 6c 69 73 74 28 70 32 29 3b 0d 0a 20 20 7d  oslist(p2);..  }
346e0 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
346f0 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  }....static int 
34700 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
34710 5f 4e 4f 54 28 0d 0a 20 20 46 74 73 35 45 78 70  _NOT(..  Fts5Exp
34720 72 20 2a 70 45 78 70 72 2c 20 0d 0a 20 20 46 74  r *pExpr, ..  Ft
34730 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
34740 65 2c 0d 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56  e,..  int bFromV
34750 61 6c 69 64 2c 0d 0a 20 20 69 36 34 20 69 46 72  alid,..  i64 iFr
34760 6f 6d 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63  om..){..  int rc
34770 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e   = fts5ExprNodeN
34780 65 78 74 28 70 45 78 70 72 2c 20 70 4e 6f 64 65  ext(pExpr, pNode
34790 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2c 20 62 46  ->apChild[0], bF
347a0 72 6f 6d 56 61 6c 69 64 2c 20 69 46 72 6f 6d 29  romValid, iFrom)
347b0 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
347c0 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72  ITE_OK ){..    r
347d0 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
347e0 54 65 73 74 5f 4e 4f 54 28 70 45 78 70 72 2c 20  Test_NOT(pExpr, 
347f0 70 4e 6f 64 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20  pNode);..  }..  
34800 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34810 4b 20 29 7b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d  K ){..    pNode-
34820 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a  >bNomatch = 0;..
34830 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
34840 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49  ;..}..../*..** I
34850 66 20 70 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  f pNode currentl
34860 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6d 61  y points to a ma
34870 74 63 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69  tch, this functi
34880 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
34890 45 5f 4f 4b 0d 0a 2a 2a 20 77 69 74 68 6f 75 74  E_OK..** without
348a0 20 6d 6f 64 69 66 79 69 6e 67 20 69 74 2e 20 4f   modifying it. O
348b0 74 68 65 72 77 69 73 65 2c 20 70 4e 6f 64 65 20  therwise, pNode 
348c0 69 73 20 61 64 76 61 6e 63 65 64 20 75 6e 74 69  is advanced unti
348d0 6c 20 69 74 20 64 6f 65 73 20 70 6f 69 6e 74 0d  l it does point.
348e0 0a 2a 2a 20 74 6f 20 61 20 6d 61 74 63 68 20 6f  .** to a match o
348f0 72 20 45 4f 46 20 69 73 20 72 65 61 63 68 65 64  r EOF is reached
34900 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
34910 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65  t fts5ExprNodeTe
34920 73 74 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20  st(..  Fts5Expr 
34930 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
34940 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
34950 73 69 6f 6e 20 6f 66 20 77 68 69 63 68 20 70 4e  sion of which pN
34960 6f 64 65 20 69 73 20 61 20 70 61 72 74 20 2a 2f  ode is a part */
34970 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ..  Fts5ExprNode
34980 20 2a 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20   *pNode         
34990 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
349a0 6e 20 6e 6f 64 65 20 74 6f 20 74 65 73 74 20 2a  n node to test *
349b0 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20  /..){..  int rc 
349c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  = SQLITE_OK;..  
349d0 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d  if( pNode->bEof=
349e0 3d 30 20 29 7b 0d 0a 20 20 20 20 73 77 69 74 63  =0 ){..    switc
349f0 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20  h( pNode->eType 
34a00 29 7b 0d 0a 0d 0a 20 20 20 20 20 20 63 61 73 65  ){....      case
34a10 20 46 54 53 35 5f 53 54 52 49 4e 47 3a 20 7b 0d   FTS5_STRING: {.
34a20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
34a30 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 53  s5ExprNodeTest_S
34a40 54 52 49 4e 47 28 70 45 78 70 72 2c 20 70 4e 6f  TRING(pExpr, pNo
34a50 64 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 62 72  de);..        br
34a60 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  eak;..      }...
34a70 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53 35  .      case FTS5
34a80 5f 54 45 52 4d 3a 20 7b 0d 0a 20 20 20 20 20 20  _TERM: {..      
34a90 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
34aa0 6f 64 65 54 65 73 74 5f 54 45 52 4d 28 70 45 78  odeTest_TERM(pEx
34ab0 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 20  pr, pNode);..   
34ac0 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
34ad0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 63 61     }....      ca
34ae0 73 65 20 46 54 53 35 5f 41 4e 44 3a 20 7b 0d 0a  se FTS5_AND: {..
34af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
34b00 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 41 4e  5ExprNodeTest_AN
34b10 44 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b  D(pExpr, pNode);
34b20 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
34b30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
34b40 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a     case FTS5_OR:
34b50 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35   {..        fts5
34b60 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f 52 28  ExprNodeTest_OR(
34b70 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a  pExpr, pNode);..
34b80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
34b90 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
34ba0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
34bb0 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d  ( pNode->eType==
34bc0 46 54 53 35 5f 4e 4f 54 20 29 3b 20 7b 0d 0a 20  FTS5_NOT ); {.. 
34bd0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
34be0 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4e 4f 54  ExprNodeTest_NOT
34bf0 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d  (pExpr, pNode);.
34c00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
34c10 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
34c20 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
34c30 63 3b 0d 0a 7d 0d 0a 0d 0a 20 0d 0a 2f 2a 0d 0a  c;..}.... ../*..
34c40 2a 2a 20 53 65 74 20 6e 6f 64 65 20 70 4e 6f 64  ** Set node pNod
34c50 65 2c 20 77 68 69 63 68 20 69 73 20 70 61 72 74  e, which is part
34c60 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
34c70 45 78 70 72 2c 20 74 6f 20 70 6f 69 6e 74 20 74  Expr, to point t
34c80 6f 20 74 68 65 20 66 69 72 73 74 0d 0a 2a 2a 20  o the first..** 
34c90 6d 61 74 63 68 2e 20 49 66 20 74 68 65 72 65 20  match. If there 
34ca0 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20  are no matches, 
34cb0 73 65 74 20 74 68 65 20 4e 6f 64 65 2e 62 45 6f  set the Node.bEo
34cc0 66 20 66 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  f flag to indica
34cd0 74 65 20 45 4f 46 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  te EOF...**..** 
34ce0 52 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  Return an SQLite
34cf0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
34d00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
34d10 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 74 68  or SQLITE_OK oth
34d20 65 72 77 69 73 65 2e 0d 0a 2a 2a 20 49 74 20 69  erwise...** It i
34d30 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  s not an error i
34d40 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
34d50 61 74 63 68 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61  atches...*/..sta
34d60 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
34d70 4e 6f 64 65 46 69 72 73 74 28 46 74 73 35 45 78  NodeFirst(Fts5Ex
34d80 70 72 20 2a 70 45 78 70 72 2c 20 46 74 73 35 45  pr *pExpr, Fts5E
34d90 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b  xprNode *pNode){
34da0 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
34db0 49 54 45 5f 4f 4b 3b 0d 0a 20 20 70 4e 6f 64 65  ITE_OK;..  pNode
34dc0 2d 3e 62 45 6f 66 20 3d 20 30 3b 0d 0a 20 20 70  ->bEof = 0;..  p
34dd0 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d  Node->bNomatch =
34de0 20 30 3b 0d 0a 0d 0a 20 20 69 66 28 20 46 74 73   0;....  if( Fts
34df0 35 4e 6f 64 65 49 73 53 74 72 69 6e 67 28 70 4e  5NodeIsString(pN
34e00 6f 64 65 29 20 29 7b 0d 0a 20 20 20 20 2f 2a 20  ode) ){..    /* 
34e10 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 74  Initialize all t
34e20 65 72 6d 20 69 74 65 72 61 74 6f 72 73 20 69 6e  erm iterators in
34e30 20 74 68 65 20 4e 45 41 52 20 6f 62 6a 65 63 74   the NEAR object
34e40 2e 20 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 66  . */..    rc = f
34e50 74 73 35 45 78 70 72 4e 65 61 72 49 6e 69 74 41  ts5ExprNearInitA
34e60 6c 6c 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29  ll(pExpr, pNode)
34e70 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ;..  }else if( p
34e80 4e 6f 64 65 2d 3e 78 4e 65 78 74 3d 3d 30 20 29  Node->xNext==0 )
34e90 7b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45  {..    pNode->bE
34ea0 6f 66 20 3d 20 31 3b 0d 0a 20 20 7d 65 6c 73 65  of = 1;..  }else
34eb0 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20  {..    int i;.. 
34ec0 20 20 20 69 6e 74 20 6e 45 6f 66 20 3d 20 30 3b     int nEof = 0;
34ed0 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
34ee0 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 20 26  <pNode->nChild &
34ef0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
34f00 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 46 74   i++){..      Ft
34f10 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 43 68 69  s5ExprNode *pChi
34f20 6c 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68  ld = pNode->apCh
34f30 69 6c 64 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 72  ild[i];..      r
34f40 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
34f50 46 69 72 73 74 28 70 45 78 70 72 2c 20 70 4e 6f  First(pExpr, pNo
34f60 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b  de->apChild[i]);
34f70 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
34f80 70 43 68 69 6c 64 2d 3e 62 45 6f 66 3d 3d 30 20  pChild->bEof==0 
34f90 7c 7c 20 70 43 68 69 6c 64 2d 3e 62 45 6f 66 3d  || pChild->bEof=
34fa0 3d 31 20 29 3b 0d 0a 20 20 20 20 20 20 6e 45 6f  =1 );..      nEo
34fb0 66 20 2b 3d 20 70 43 68 69 6c 64 2d 3e 62 45 6f  f += pChild->bEo
34fc0 66 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70  f;..    }..    p
34fd0 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70  Node->iRowid = p
34fe0 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d  Node->apChild[0]
34ff0 2d 3e 69 52 6f 77 69 64 3b 0d 0a 0d 0a 20 20 20  ->iRowid;....   
35000 20 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e   switch( pNode->
35010 65 54 79 70 65 20 29 7b 0d 0a 20 20 20 20 20 20  eType ){..      
35020 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a 0d 0a  case FTS5_AND:..
35030 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 6f 66          if( nEof
35040 3e 30 20 29 20 66 74 73 35 45 78 70 72 53 65 74  >0 ) fts5ExprSet
35050 45 6f 66 28 70 4e 6f 64 65 29 3b 0d 0a 20 20 20  Eof(pNode);..   
35060 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20       break;.... 
35070 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f       case FTS5_O
35080 52 3a 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20  R:..        if( 
35090 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 6e  pNode->nChild==n
350a0 45 6f 66 20 29 20 66 74 73 35 45 78 70 72 53 65  Eof ) fts5ExprSe
350b0 74 45 6f 66 28 70 4e 6f 64 65 29 3b 0d 0a 20 20  tEof(pNode);..  
350c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a        break;....
350d0 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a        default:..
350e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
350f0 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
35100 53 35 5f 4e 4f 54 20 29 3b 0d 0a 20 20 20 20 20  S5_NOT );..     
35110 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d     pNode->bEof =
35120 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
35130 30 5d 2d 3e 62 45 6f 66 3b 0d 0a 20 20 20 20 20  0]->bEof;..     
35140 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d     break;..    }
35150 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72  ..  }....  if( r
35160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
35170 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78  .    rc = fts5Ex
35180 70 72 4e 6f 64 65 54 65 73 74 28 70 45 78 70 72  prNodeTest(pExpr
35190 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 7d 0d 0a  , pNode);..  }..
351a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
351b0 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 42 65 67 69  ...../*..** Begi
351c0 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  n iterating thro
351d0 75 67 68 20 74 68 65 20 73 65 74 20 6f 66 20 64  ugh the set of d
351e0 6f 63 75 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65  ocuments in inde
351f0 78 20 70 49 64 78 20 6d 61 74 63 68 65 64 20 62  x pIdx matched b
35200 79 0d 0a 2a 2a 20 74 68 65 20 4d 41 54 43 48 20  y..** the MATCH 
35210 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
35220 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
35230 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  rgument. If the 
35240 22 62 44 65 73 63 22 20 0d 0a 2a 2a 20 70 61 72  "bDesc" ..** par
35250 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
35260 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
35270 65 2c 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20  e, iteration is 
35280 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  in descending ro
35290 77 69 64 20 0d 0a 2a 2a 20 6f 72 64 65 72 2e 20  wid ..** order. 
352a0 4f 72 2c 20 69 66 20 69 74 20 69 73 20 7a 65 72  Or, if it is zer
352b0 6f 2c 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  o, in ascending 
352c0 6f 72 64 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49  order...**..** I
352d0 66 20 69 74 65 72 61 74 69 6e 67 20 69 6e 20 61  f iterating in a
352e0 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f  scending rowid o
352f0 72 64 65 72 20 28 62 44 65 73 63 3d 3d 30 29 2c  rder (bDesc==0),
35300 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 75 6d   the first docum
35310 65 6e 74 0d 0a 2a 2a 20 76 69 73 69 74 65 64 20  ent..** visited 
35320 69 73 20 74 68 61 74 20 77 69 74 68 20 74 68 65  is that with the
35330 20 73 6d 61 6c 6c 65 73 74 20 72 6f 77 69 64 20   smallest rowid 
35340 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
35350 68 61 6e 20 6f 72 20 65 71 75 61 6c 0d 0a 2a 2a  han or equal..**
35360 20 74 6f 20 70 61 72 61 6d 65 74 65 72 20 69 46   to parameter iF
35370 69 72 73 74 2e 20 4f 72 2c 20 69 66 20 69 74 65  irst. Or, if ite
35380 72 61 74 69 6e 67 20 69 6e 20 61 73 63 65 6e 64  rating in ascend
35390 69 6e 67 20 6f 72 64 65 72 20 28 62 44 65 73 63  ing order (bDesc
353a0 3d 3d 31 29 2c 0d 0a 2a 2a 20 74 68 65 6e 20 74  ==1),..** then t
353b0 68 65 20 66 69 72 73 74 20 64 6f 63 75 6d 65 6e  he first documen
353c0 74 20 76 69 73 69 74 65 64 20 6d 75 73 74 20 68  t visited must h
353d0 61 76 65 20 61 20 72 6f 77 69 64 20 73 6d 61 6c  ave a rowid smal
353e0 6c 65 72 20 74 68 61 6e 20 6f 72 0d 0a 2a 2a 20  ler than or..** 
353f0 65 71 75 61 6c 20 74 6f 20 69 46 69 72 73 74 2e  equal to iFirst.
35400 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20  ..**..** Return 
35410 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
35420 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
35430 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
35440 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 0d 0a   otherwise. It..
35450 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
35460 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
35470 20 74 68 65 20 71 75 65 72 79 20 64 6f 65 73 20   the query does 
35480 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 64 6f  not match any do
35490 63 75 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74  cuments...*/..st
354a0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
354b0 46 74 73 35 45 78 70 72 46 69 72 73 74 28 46 74  Fts5ExprFirst(Ft
354c0 73 35 45 78 70 72 20 2a 70 2c 20 46 74 73 35 49  s5Expr *p, Fts5I
354d0 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 36 34 20  ndex *pIdx, i64 
354e0 69 46 69 72 73 74 2c 20 69 6e 74 20 62 44 65 73  iFirst, int bDes
354f0 63 29 7b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e  c){..  Fts5ExprN
35500 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e  ode *pRoot = p->
35510 70 52 6f 6f 74 3b 0d 0a 20 20 69 6e 74 20 72 63  pRoot;..  int rc
35520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
35540 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20  urn code */.... 
35550 20 70 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64   p->pIndex = pId
35560 78 3b 0d 0a 20 20 70 2d 3e 62 44 65 73 63 20 3d  x;..  p->bDesc =
35570 20 62 44 65 73 63 3b 0d 0a 20 20 72 63 20 3d 20   bDesc;..  rc = 
35580 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72 73  fts5ExprNodeFirs
35590 74 28 70 2c 20 70 52 6f 6f 74 29 3b 0d 0a 0d 0a  t(p, pRoot);....
355a0 20 20 2f 2a 20 49 66 20 6e 6f 74 20 61 74 20 45    /* If not at E
355b0 4f 46 20 62 75 74 20 74 68 65 20 63 75 72 72 65  OF but the curre
355c0 6e 74 20 72 6f 77 69 64 20 6f 63 63 75 72 73 20  nt rowid occurs 
355d0 65 61 72 6c 69 65 72 20 74 68 61 6e 20 69 46 69  earlier than iFi
355e0 72 73 74 20 69 6e 0d 0a 20 20 2a 2a 20 74 68 65  rst in..  ** the
355f0 20 69 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72   iteration order
35600 2c 20 6d 6f 76 65 20 74 6f 20 64 6f 63 75 6d 65  , move to docume
35610 6e 74 20 69 46 69 72 73 74 20 6f 72 20 6c 61 74  nt iFirst or lat
35620 65 72 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63  er. */..  if( rc
35630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0d 0a 20 20  ==SQLITE_OK ..  
35640 20 26 26 20 30 3d 3d 70 52 6f 6f 74 2d 3e 62 45   && 0==pRoot->bE
35650 6f 66 20 0d 0a 20 20 20 26 26 20 66 74 73 35 52  of ..   && fts5R
35660 6f 77 69 64 43 6d 70 28 70 2c 20 70 52 6f 6f 74  owidCmp(p, pRoot
35670 2d 3e 69 52 6f 77 69 64 2c 20 69 46 69 72 73 74  ->iRowid, iFirst
35680 29 3c 30 20 0d 0a 20 20 29 7b 0d 0a 20 20 20 20  )<0 ..  ){..    
35690 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
356a0 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74 2c 20  eNext(p, pRoot, 
356b0 31 2c 20 69 46 69 72 73 74 29 3b 0d 0a 20 20 7d  1, iFirst);..  }
356c0 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ....  /* If the 
356d0 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20  iterator is not 
356e0 61 74 20 61 20 72 65 61 6c 20 6d 61 74 63 68 2c  at a real match,
356f0 20 73 6b 69 70 20 66 6f 72 77 61 72 64 20 75 6e   skip forward un
35700 74 69 6c 20 69 74 20 69 73 2e 20 2a 2f 0d 0a 20  til it is. */.. 
35710 20 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e 62   while( pRoot->b
35720 4e 6f 6d 61 74 63 68 20 29 7b 0d 0a 20 20 20 20  Nomatch ){..    
35730 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62  assert( pRoot->b
35740 45 6f 66 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  Eof==0 && rc==SQ
35750 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20  LITE_OK );..    
35760 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
35770 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74 2c 20  eNext(p, pRoot, 
35780 30 2c 20 30 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72  0, 0);..  }..  r
35790 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
357a0 2f 2a 0d 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  /*..** Move to t
357b0 68 65 20 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74  he next document
357c0 20 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e   ..**..** Return
357d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
357e0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
357f0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
35800 65 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 0d  e otherwise. It.
35810 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
35820 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
35830 66 20 74 68 65 20 71 75 65 72 79 20 64 6f 65 73  f the query does
35840 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 64   not match any d
35850 6f 63 75 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73  ocuments...*/..s
35860 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
35870 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 46 74  3Fts5ExprNext(Ft
35880 73 35 45 78 70 72 20 2a 70 2c 20 69 36 34 20 69  s5Expr *p, i64 i
35890 4c 61 73 74 29 7b 0d 0a 20 20 69 6e 74 20 72 63  Last){..  int rc
358a0 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  ;..  Fts5ExprNod
358b0 65 20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52  e *pRoot = p->pR
358c0 6f 6f 74 3b 0d 0a 20 20 61 73 73 65 72 74 28 20  oot;..  assert( 
358d0 70 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26  pRoot->bEof==0 &
358e0 26 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63  & pRoot->bNomatc
358f0 68 3d 3d 30 20 29 3b 0d 0a 20 20 64 6f 20 7b 0d  h==0 );..  do {.
35900 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78  .    rc = fts5Ex
35910 70 72 4e 6f 64 65 4e 65 78 74 28 70 2c 20 70 52  prNodeNext(p, pR
35920 6f 6f 74 2c 20 30 2c 20 30 29 3b 0d 0a 20 20 20  oot, 0, 0);..   
35930 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
35940 62 4e 6f 6d 61 74 63 68 3d 3d 30 20 7c 7c 20 28  bNomatch==0 || (
35950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35960 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 29   pRoot->bEof==0)
35970 20 29 3b 0d 0a 20 20 7d 77 68 69 6c 65 28 20 70   );..  }while( p
35980 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 20 29  Root->bNomatch )
35990 3b 0d 0a 20 20 69 66 28 20 66 74 73 35 52 6f 77  ;..  if( fts5Row
359a0 69 64 43 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e  idCmp(p, pRoot->
359b0 69 52 6f 77 69 64 2c 20 69 4c 61 73 74 29 3e 30  iRowid, iLast)>0
359c0 20 29 7b 0d 0a 20 20 20 20 70 52 6f 6f 74 2d 3e   ){..    pRoot->
359d0 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 7d 0d 0a  bEof = 1;..  }..
359e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
359f0 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ...static int sq
35a00 6c 69 74 65 33 46 74 73 35 45 78 70 72 45 6f 66  lite3Fts5ExprEof
35a10 28 46 74 73 35 45 78 70 72 20 2a 70 29 7b 0d 0a  (Fts5Expr *p){..
35a20 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f    return p->pRoo
35a30 74 2d 3e 62 45 6f 66 3b 0d 0a 7d 0d 0a 0d 0a 73  t->bEof;..}....s
35a40 74 61 74 69 63 20 69 36 34 20 73 71 6c 69 74 65  tatic i64 sqlite
35a50 33 46 74 73 35 45 78 70 72 52 6f 77 69 64 28 46  3Fts5ExprRowid(F
35a60 74 73 35 45 78 70 72 20 2a 70 29 7b 0d 0a 20 20  ts5Expr *p){..  
35a70 72 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d  return p->pRoot-
35a80 3e 69 52 6f 77 69 64 3b 0d 0a 7d 0d 0a 0d 0a 73  >iRowid;..}....s
35a90 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 61  tatic int fts5Pa
35aa0 72 73 65 53 74 72 69 6e 67 46 72 6f 6d 54 6f 6b  rseStringFromTok
35ab0 65 6e 28 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54  en(Fts5Token *pT
35ac0 6f 6b 65 6e 2c 20 63 68 61 72 20 2a 2a 70 7a 29  oken, char **pz)
35ad0 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  {..  int rc = SQ
35ae0 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 2a 70 7a 20  LITE_OK;..  *pz 
35af0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 72  = sqlite3Fts5Str
35b00 6e 64 75 70 28 26 72 63 2c 20 70 54 6f 6b 65 6e  ndup(&rc, pToken
35b10 2d 3e 70 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->p, pToken->n);
35b20 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
35b30 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65  }..../*..** Free
35b40 20 74 68 65 20 70 68 72 61 73 65 20 6f 62 6a 65   the phrase obje
35b50 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
35b60 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d   only argument..
35b70 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
35b80 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65 46   fts5ExprPhraseF
35b90 72 65 65 28 46 74 73 35 45 78 70 72 50 68 72 61  ree(Fts5ExprPhra
35ba0 73 65 20 2a 70 50 68 72 61 73 65 29 7b 0d 0a 20  se *pPhrase){.. 
35bb0 20 69 66 28 20 70 50 68 72 61 73 65 20 29 7b 0d   if( pPhrase ){.
35bc0 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20  .    int i;..   
35bd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72   for(i=0; i<pPhr
35be0 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  ase->nTerm; i++)
35bf0 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  {..      Fts5Exp
35c00 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0d 0a 20 20  rTerm *pSyn;..  
35c10 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
35c20 20 2a 70 4e 65 78 74 3b 0d 0a 20 20 20 20 20 20   *pNext;..      
35c30 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
35c40 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e  erm = &pPhrase->
35c50 61 54 65 72 6d 5b 69 5d 3b 0d 0a 20 20 20 20 20  aTerm[i];..     
35c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
35c70 65 72 6d 2d 3e 7a 54 65 72 6d 29 3b 0d 0a 20 20  erm->zTerm);..  
35c80 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
35c90 74 65 72 43 6c 6f 73 65 28 70 54 65 72 6d 2d 3e  terClose(pTerm->
35ca0 70 49 74 65 72 29 3b 0d 0a 20 20 20 20 20 20 66  pIter);..      f
35cb0 6f 72 28 70 53 79 6e 3d 70 54 65 72 6d 2d 3e 70  or(pSyn=pTerm->p
35cc0 53 79 6e 6f 6e 79 6d 3b 20 70 53 79 6e 3b 20 70  Synonym; pSyn; p
35cd0 53 79 6e 3d 70 4e 65 78 74 29 7b 0d 0a 20 20 20  Syn=pNext){..   
35ce0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 79       pNext = pSy
35cf0 6e 2d 3e 70 53 79 6e 6f 6e 79 6d 3b 0d 0a 20 20  n->pSynonym;..  
35d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
35d10 35 49 74 65 72 43 6c 6f 73 65 28 70 53 79 6e 2d  5IterClose(pSyn-
35d20 3e 70 49 74 65 72 29 3b 0d 0a 20 20 20 20 20 20  >pIter);..      
35d30 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
35d40 28 28 46 74 73 35 42 75 66 66 65 72 2a 29 26 70  ((Fts5Buffer*)&p
35d50 53 79 6e 5b 31 5d 29 3b 0d 0a 20 20 20 20 20 20  Syn[1]);..      
35d60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
35d70 53 79 6e 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  Syn);..      }..
35d80 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 70      }..    if( p
35d90 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
35da0 6e 53 70 61 63 65 3e 30 20 29 20 66 74 73 35 42  nSpace>0 ) fts5B
35db0 75 66 66 65 72 46 72 65 65 28 26 70 50 68 72 61  ufferFree(&pPhra
35dc0 73 65 2d 3e 70 6f 73 6c 69 73 74 29 3b 0d 0a 20  se->poslist);.. 
35dd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
35de0 70 50 68 72 61 73 65 29 3b 0d 0a 20 20 7d 0d 0a  pPhrase);..  }..
35df0 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20  }..../*..** Set 
35e00 74 68 65 20 22 62 46 69 72 73 74 22 20 66 6c 61  the "bFirst" fla
35e10 67 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 74  g on the first t
35e20 6f 6b 65 6e 20 6f 66 20 74 68 65 20 70 68 72 61  oken of the phra
35e30 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
35e40 0d 0a 2a 2a 20 6f 6e 6c 79 20 61 72 67 75 6d 65  ..** only argume
35e50 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  nt...*/..static 
35e60 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
35e70 50 61 72 73 65 53 65 74 43 61 72 65 74 28 46 74  ParseSetCaret(Ft
35e80 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
35e90 68 72 61 73 65 29 7b 0d 0a 20 20 69 66 28 20 70  hrase){..  if( p
35ea0 50 68 72 61 73 65 20 26 26 20 70 50 68 72 61 73  Phrase && pPhras
35eb0 65 2d 3e 6e 54 65 72 6d 20 29 7b 0d 0a 20 20 20  e->nTerm ){..   
35ec0 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b   pPhrase->aTerm[
35ed0 30 5d 2e 62 46 69 72 73 74 20 3d 20 31 3b 0d 0a  0].bFirst = 1;..
35ee0 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a    }..}..../*..**
35ef0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 4e 65   If argument pNe
35f00 61 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  ar is NULL, then
35f10 20 61 20 6e 65 77 20 46 74 73 35 45 78 70 72 4e   a new Fts5ExprN
35f20 65 61 72 73 65 74 20 6f 62 6a 65 63 74 20 69 73  earset object is
35f30 20 61 6c 6c 6f 63 61 74 65 64 0d 0a 2a 2a 20 61   allocated..** a
35f40 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
35f50 68 20 70 50 68 72 61 73 65 2e 20 4f 72 2c 20 69  h pPhrase. Or, i
35f60 66 20 70 4e 65 61 72 20 69 73 20 6e 6f 74 20 4e  f pNear is not N
35f70 55 4c 4c 2c 20 70 68 72 61 73 65 20 70 50 68 72  ULL, phrase pPhr
35f80 61 73 65 20 69 73 0d 0a 2a 2a 20 61 70 70 65 6e  ase is..** appen
35f90 64 65 64 20 74 6f 20 69 74 20 61 6e 64 20 74 68  ded to it and th
35fa0 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
35fb0 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61  ed...**..** If a
35fc0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
35fd0 72 73 2c 20 62 6f 74 68 20 74 68 65 20 70 4e 65  rs, both the pNe
35fe0 61 72 20 61 6e 64 20 70 50 68 72 61 73 65 20 6f  ar and pPhrase o
35ff0 62 6a 65 63 74 73 20 61 72 65 20 66 72 65 65 64  bjects are freed
36000 20 61 6e 64 0d 0a 2a 2a 20 4e 55 4c 4c 20 72 65   and..** NULL re
36010 74 75 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61  turned...*/..sta
36020 74 69 63 20 46 74 73 35 45 78 70 72 4e 65 61 72  tic Fts5ExprNear
36030 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35  set *sqlite3Fts5
36040 50 61 72 73 65 4e 65 61 72 73 65 74 28 0d 0a 20  ParseNearset(.. 
36050 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
36060 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
36070 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
36080 74 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72  t */..  Fts5Expr
36090 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 2c 20  Nearset *pNear, 
360a0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74          /* Exist
360b0 69 6e 67 20 6e 65 61 72 73 65 74 2c 20 6f 72 20  ing nearset, or 
360c0 4e 55 4c 4c 20 2a 2f 0d 0a 20 20 46 74 73 35 45  NULL */..  Fts5E
360d0 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61  xprPhrase *pPhra
360e0 73 65 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  se         /* Re
360f0 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 70 68  cently parsed ph
36100 72 61 73 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 63  rase */..){..  c
36110 6f 6e 73 74 20 69 6e 74 20 53 5a 41 4c 4c 4f 43  onst int SZALLOC
36120 20 3d 20 38 3b 0d 0a 20 20 46 74 73 35 45 78 70   = 8;..  Fts5Exp
36130 72 4e 65 61 72 73 65 74 20 2a 70 52 65 74 20 3d  rNearset *pRet =
36140 20 30 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 50 61   0;....  if( pPa
36150 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
36160 4f 4b 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 70  OK ){..    if( p
36170 50 68 72 61 73 65 3d 3d 30 20 29 7b 0d 0a 20 20  Phrase==0 ){..  
36180 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65 61 72      return pNear
36190 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66  ;..    }..    if
361a0 28 20 70 4e 65 61 72 3d 3d 30 20 29 7b 0d 0a 20  ( pNear==0 ){.. 
361b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
361c0 36 34 20 6e 42 79 74 65 3b 0d 0a 20 20 20 20 20  64 nByte;..     
361d0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
361e0 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 29  Fts5ExprNearset)
361f0 20 2b 20 53 5a 41 4c 4c 4f 43 20 2a 20 73 69 7a   + SZALLOC * siz
36200 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61  eof(Fts5ExprPhra
36210 73 65 2a 29 3b 0d 0a 20 20 20 20 20 20 70 52 65  se*);..      pRe
36220 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
36230 6f 63 36 34 28 6e 42 79 74 65 29 3b 0d 0a 20 20  oc64(nByte);..  
36240 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
36250 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 50 61 72  ){..        pPar
36260 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
36270 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 7d 65  NOMEM;..      }e
36280 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 6d 65  lse{..        me
36290 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42  mset(pRet, 0, nB
362a0 79 74 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  yte);..      }..
362b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
362c0 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20 25 20  Near->nPhrase % 
362d0 53 5a 41 4c 4c 4f 43 29 3d 3d 30 20 29 7b 0d 0a  SZALLOC)==0 ){..
362e0 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
362f0 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20   pNear->nPhrase 
36300 2b 20 53 5a 41 4c 4c 4f 43 3b 0d 0a 20 20 20 20  + SZALLOC;..    
36310 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
36320 6e 42 79 74 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  nByte;....      
36330 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
36340 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 29 20  ts5ExprNearset) 
36350 2b 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66 28  + nNew * sizeof(
36360 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29  Fts5ExprPhrase*)
36370 3b 0d 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  ;..      pRet = 
36380 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74  (Fts5ExprNearset
36390 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
363a0 63 36 34 28 70 4e 65 61 72 2c 20 6e 42 79 74 65  c64(pNear, nByte
363b0 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 52  );..      if( pR
363c0 65 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  et==0 ){..      
363d0 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
363e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20  QLITE_NOMEM;..  
363f0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65      }..    }else
36400 7b 0d 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  {..      pRet = 
36410 70 4e 65 61 72 3b 0d 0a 20 20 20 20 7d 0d 0a 20  pNear;..    }.. 
36420 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 52 65 74   }....  if( pRet
36430 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 61 73 73 65  ==0 ){..    asse
36440 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 21 3d  rt( pParse->rc!=
36450 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20  SQLITE_OK );..  
36460 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
36470 73 65 4e 65 61 72 73 65 74 46 72 65 65 28 70 4e  seNearsetFree(pN
36480 65 61 72 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74  ear);..    sqlit
36490 65 33 46 74 73 35 50 61 72 73 65 50 68 72 61 73  e3Fts5ParsePhras
364a0 65 46 72 65 65 28 70 50 68 72 61 73 65 29 3b 0d  eFree(pPhrase);.
364b0 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69  .  }else{..    i
364c0 66 28 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65  f( pRet->nPhrase
364d0 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 46 74 73  >0 ){..      Fts
364e0 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 4c 61  5ExprPhrase *pLa
364f0 73 74 20 3d 20 70 52 65 74 2d 3e 61 70 50 68 72  st = pRet->apPhr
36500 61 73 65 5b 70 52 65 74 2d 3e 6e 50 68 72 61 73  ase[pRet->nPhras
36510 65 2d 31 5d 3b 0d 0a 20 20 20 20 20 20 61 73 73  e-1];..      ass
36520 65 72 74 28 20 70 4c 61 73 74 3d 3d 70 50 61 72  ert( pLast==pPar
36530 73 65 2d 3e 61 70 50 68 72 61 73 65 5b 70 50 61  se->apPhrase[pPa
36540 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d 32 5d 20  rse->nPhrase-2] 
36550 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
36560 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d 30 20  hrase->nTerm==0 
36570 29 7b 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35  ){..        fts5
36580 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28 70  ExprPhraseFree(p
36590 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20 20 20  Phrase);..      
365a0 20 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65 2d    pRet->nPhrase-
365b0 2d 3b 0d 0a 20 20 20 20 20 20 20 20 70 50 61 72  -;..        pPar
365c0 73 65 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0d 0a  se->nPhrase--;..
365d0 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65 20          pPhrase 
365e0 3d 20 70 4c 61 73 74 3b 0d 0a 20 20 20 20 20 20  = pLast;..      
365f0 7d 65 6c 73 65 20 69 66 28 20 70 4c 61 73 74 2d  }else if( pLast-
36600 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0d 0a 20 20  >nTerm==0 ){..  
36610 20 20 20 20 20 20 66 74 73 35 45 78 70 72 50 68        fts5ExprPh
36620 72 61 73 65 46 72 65 65 28 70 4c 61 73 74 29 3b  raseFree(pLast);
36630 0d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ..        pParse
36640 2d 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73  ->apPhrase[pPars
36650 65 2d 3e 6e 50 68 72 61 73 65 2d 32 5d 20 3d 20  e->nPhrase-2] = 
36660 70 50 68 72 61 73 65 3b 0d 0a 20 20 20 20 20 20  pPhrase;..      
36670 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73    pParse->nPhras
36680 65 2d 2d 3b 0d 0a 20 20 20 20 20 20 20 20 70 52  e--;..        pR
36690 65 74 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0d 0a  et->nPhrase--;..
366a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
366b0 20 20 20 20 70 52 65 74 2d 3e 61 70 50 68 72 61      pRet->apPhra
366c0 73 65 5b 70 52 65 74 2d 3e 6e 50 68 72 61 73 65  se[pRet->nPhrase
366d0 2b 2b 5d 20 3d 20 70 50 68 72 61 73 65 3b 0d 0a  ++] = pPhrase;..
366e0 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
366f0 65 74 3b 0d 0a 7d 0d 0a 0d 0a 74 79 70 65 64 65  et;..}....typede
36700 66 20 73 74 72 75 63 74 20 54 6f 6b 65 6e 43 74  f struct TokenCt
36710 78 20 54 6f 6b 65 6e 43 74 78 3b 0d 0a 73 74 72  x TokenCtx;..str
36720 75 63 74 20 54 6f 6b 65 6e 43 74 78 20 7b 0d 0a  uct TokenCtx {..
36730 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
36740 20 2a 70 50 68 72 61 73 65 3b 0d 0a 20 20 69 6e   *pPhrase;..  in
36750 74 20 72 63 3b 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d  t rc;..};..../*.
36760 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  .** Callback for
36770 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 74 65 72 6d   tokenizing term
36780 73 20 75 73 65 64 20 62 79 20 50 61 72 73 65 54  s used by ParseT
36790 65 72 6d 28 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  erm()...*/..stat
367a0 69 63 20 69 6e 74 20 66 74 73 35 50 61 72 73 65  ic int fts5Parse
367b0 54 6f 6b 65 6e 69 7a 65 28 0d 0a 20 20 76 6f 69  Tokenize(..  voi
367c0 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20  d *pContext,    
367d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
367e0 50 6f 69 6e 74 65 72 20 74 6f 20 46 74 73 35 49  Pointer to Fts5I
367f0 6e 73 65 72 74 43 74 78 20 6f 62 6a 65 63 74 20  nsertCtx object 
36800 2a 2f 0d 0a 20 20 69 6e 74 20 74 66 6c 61 67 73  */..  int tflags
36810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36820 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
36830 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66 6c   FTS5_TOKEN_* fl
36840 61 67 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20  ags */..  const 
36850 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  char *pToken,   
36860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
36870 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
36880 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e  oken */..  int n
36890 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
368a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
368b0 7a 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62  ze of token in b
368c0 79 74 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 69  ytes */..  int i
368d0 55 6e 75 73 65 64 31 2c 20 20 20 20 20 20 20 20  Unused1,        
368e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
368f0 61 72 74 20 6f 66 66 73 65 74 20 6f 66 20 74 6f  art offset of to
36900 6b 65 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 55  ken */..  int iU
36910 6e 75 73 65 64 32 20 20 20 20 20 20 20 20 20 20  nused2          
36920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
36930 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e   offset of token
36940 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72   */..){..  int r
36950 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  c = SQLITE_OK;..
36960 20 20 63 6f 6e 73 74 20 69 6e 74 20 53 5a 41 4c    const int SZAL
36970 4c 4f 43 20 3d 20 38 3b 0d 0a 20 20 54 6f 6b 65  LOC = 8;..  Toke
36980 6e 43 74 78 20 2a 70 43 74 78 20 3d 20 28 54 6f  nCtx *pCtx = (To
36990 6b 65 6e 43 74 78 2a 29 70 43 6f 6e 74 65 78 74  kenCtx*)pContext
369a0 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68 72  ;..  Fts5ExprPhr
369b0 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
369c0 43 74 78 2d 3e 70 50 68 72 61 73 65 3b 0d 0a 0d  Ctx->pPhrase;...
369d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32  .  UNUSED_PARAM2
369e0 28 69 55 6e 75 73 65 64 31 2c 20 69 55 6e 75 73  (iUnused1, iUnus
369f0 65 64 32 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66  ed2);....  /* If
36a00 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
36a10 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
36a20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  this is a no-op 
36a30 2a 2f 0d 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  */..  if( pCtx->
36a40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
36a50 72 65 74 75 72 6e 20 70 43 74 78 2d 3e 72 63 3b  return pCtx->rc;
36a60 0d 0a 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3e 46  ..  if( nToken>F
36a70 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53 49  TS5_MAX_TOKEN_SI
36a80 5a 45 20 29 20 6e 54 6f 6b 65 6e 20 3d 20 46 54  ZE ) nToken = FT
36a90 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53 49 5a  S5_MAX_TOKEN_SIZ
36aa0 45 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 50 68 72  E;....  if( pPhr
36ab0 61 73 65 20 26 26 20 70 50 68 72 61 73 65 2d 3e  ase && pPhrase->
36ac0 6e 54 65 72 6d 3e 30 20 26 26 20 28 74 66 6c 61  nTerm>0 && (tfla
36ad0 67 73 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e 5f  gs & FTS5_TOKEN_
36ae0 43 4f 4c 4f 43 41 54 45 44 29 20 29 7b 0d 0a 20  COLOCATED) ){.. 
36af0 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
36b00 2a 70 53 79 6e 3b 0d 0a 20 20 20 20 73 71 6c 69  *pSyn;..    sqli
36b10 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20  te3_int64 nByte 
36b20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  = sizeof(Fts5Exp
36b30 72 54 65 72 6d 29 20 2b 20 73 69 7a 65 6f 66 28  rTerm) + sizeof(
36b40 46 74 73 35 42 75 66 66 65 72 29 20 2b 20 6e 54  Fts5Buffer) + nT
36b50 6f 6b 65 6e 2b 31 3b 0d 0a 20 20 20 20 70 53 79  oken+1;..    pSy
36b60 6e 20 3d 20 28 46 74 73 35 45 78 70 72 54 65 72  n = (Fts5ExprTer
36b70 6d 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  m*)sqlite3_mallo
36b80 63 36 34 28 6e 42 79 74 65 29 3b 0d 0a 20 20 20  c64(nByte);..   
36b90 20 69 66 28 20 70 53 79 6e 3d 3d 30 20 29 7b 0d   if( pSyn==0 ){.
36ba0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
36bb0 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 7d  TE_NOMEM;..    }
36bc0 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 6d 65 6d  else{..      mem
36bd0 73 65 74 28 70 53 79 6e 2c 20 30 2c 20 6e 42 79  set(pSyn, 0, nBy
36be0 74 65 29 3b 0d 0a 20 20 20 20 20 20 70 53 79 6e  te);..      pSyn
36bf0 2d 3e 7a 54 65 72 6d 20 3d 20 28 28 63 68 61 72  ->zTerm = ((char
36c00 2a 29 70 53 79 6e 29 20 2b 20 73 69 7a 65 6f 66  *)pSyn) + sizeof
36c10 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 20 2b  (Fts5ExprTerm) +
36c20 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
36c30 65 72 29 3b 0d 0a 20 20 20 20 20 20 6d 65 6d 63  er);..      memc
36c40 70 79 28 70 53 79 6e 2d 3e 7a 54 65 72 6d 2c 20  py(pSyn->zTerm, 
36c50 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
36c60 0d 0a 20 20 20 20 20 20 70 53 79 6e 2d 3e 70 53  ..      pSyn->pS
36c70 79 6e 6f 6e 79 6d 20 3d 20 70 50 68 72 61 73 65  ynonym = pPhrase
36c80 2d 3e 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d  ->aTerm[pPhrase-
36c90 3e 6e 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e  >nTerm-1].pSynon
36ca0 79 6d 3b 0d 0a 20 20 20 20 20 20 70 50 68 72 61  ym;..      pPhra
36cb0 73 65 2d 3e 61 54 65 72 6d 5b 70 50 68 72 61 73  se->aTerm[pPhras
36cc0 65 2d 3e 6e 54 65 72 6d 2d 31 5d 2e 70 53 79 6e  e->nTerm-1].pSyn
36cd0 6f 6e 79 6d 20 3d 20 70 53 79 6e 3b 0d 0a 20 20  onym = pSyn;..  
36ce0 20 20 7d 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20    }..  }else{.. 
36cf0 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
36d00 2a 70 54 65 72 6d 3b 0d 0a 20 20 20 20 69 66 28  *pTerm;..    if(
36d10 20 70 50 68 72 61 73 65 3d 3d 30 20 7c 7c 20 28   pPhrase==0 || (
36d20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20 25  pPhrase->nTerm %
36d30 20 53 5a 41 4c 4c 4f 43 29 3d 3d 30 20 29 7b 0d   SZALLOC)==0 ){.
36d40 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50  .      Fts5ExprP
36d50 68 72 61 73 65 20 2a 70 4e 65 77 3b 0d 0a 20 20  hrase *pNew;..  
36d60 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 53      int nNew = S
36d70 5a 41 4c 4c 4f 43 20 2b 20 28 70 50 68 72 61 73  ZALLOC + (pPhras
36d80 65 20 3f 20 70 50 68 72 61 73 65 2d 3e 6e 54 65  e ? pPhrase->nTe
36d90 72 6d 20 3a 20 30 29 3b 0d 0a 0d 0a 20 20 20 20  rm : 0);....    
36da0 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 45 78    pNew = (Fts5Ex
36db0 70 72 50 68 72 61 73 65 2a 29 73 71 6c 69 74 65  prPhrase*)sqlite
36dc0 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 50 68 72  3_realloc64(pPhr
36dd0 61 73 65 2c 20 0d 0a 20 20 20 20 20 20 20 20 20  ase, ..         
36de0 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
36df0 50 68 72 61 73 65 29 20 2b 20 73 69 7a 65 6f 66  Phrase) + sizeof
36e00 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 20 2a  (Fts5ExprTerm) *
36e10 20 6e 4e 65 77 0d 0a 20 20 20 20 20 20 29 3b 0d   nNew..      );.
36e20 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d  .      if( pNew=
36e30 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72  =0 ){..        r
36e40 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
36e50 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d  ;..      }else{.
36e60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 68  .        if( pPh
36e70 72 61 73 65 3d 3d 30 20 29 20 6d 65 6d 73 65 74  rase==0 ) memset
36e80 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
36e90 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 29  (Fts5ExprPhrase)
36ea0 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 43 74 78  );..        pCtx
36eb0 2d 3e 70 50 68 72 61 73 65 20 3d 20 70 50 68 72  ->pPhrase = pPhr
36ec0 61 73 65 20 3d 20 70 4e 65 77 3b 0d 0a 20 20 20  ase = pNew;..   
36ed0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d       pNew->nTerm
36ee0 20 3d 20 6e 4e 65 77 20 2d 20 53 5a 41 4c 4c 4f   = nNew - SZALLO
36ef0 43 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  C;..      }..   
36f00 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20 72 63   }....    if( rc
36f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
36f20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
36f30 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 70 50  Phrase->aTerm[pP
36f40 68 72 61 73 65 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  hrase->nTerm++];
36f50 0d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ..      memset(p
36f60 54 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Term, 0, sizeof(
36f70 46 74 73 35 45 78 70 72 54 65 72 6d 29 29 3b 0d  Fts5ExprTerm));.
36f80 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 7a 54  .      pTerm->zT
36f90 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 46 74 73  erm = sqlite3Fts
36fa0 35 53 74 72 6e 64 75 70 28 26 72 63 2c 20 70 54  5Strndup(&rc, pT
36fb0 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0d 0a  oken, nToken);..
36fc0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
36fd0 70 43 74 78 2d 3e 72 63 20 3d 20 72 63 3b 0d 0a  pCtx->rc = rc;..
36fe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
36ff0 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65  ...../*..** Free
37000 20 74 68 65 20 70 68 72 61 73 65 20 6f 62 6a 65   the phrase obje
37010 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
37020 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d   only argument..
37030 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
37040 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
37050 65 50 68 72 61 73 65 46 72 65 65 28 46 74 73 35  ePhraseFree(Fts5
37060 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
37070 61 73 65 29 7b 0d 0a 20 20 66 74 73 35 45 78 70  ase){..  fts5Exp
37080 72 50 68 72 61 73 65 46 72 65 65 28 70 50 68 72  rPhraseFree(pPhr
37090 61 73 65 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a  ase);..}..../*..
370a0 2a 2a 20 46 72 65 65 20 74 68 65 20 70 68 72 61  ** Free the phra
370b0 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  se object passed
370c0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
370d0 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74  rgument...*/..st
370e0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
370f0 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65  3Fts5ParseNearse
37100 74 46 72 65 65 28 46 74 73 35 45 78 70 72 4e 65  tFree(Fts5ExprNe
37110 61 72 73 65 74 20 2a 70 4e 65 61 72 29 7b 0d 0a  arset *pNear){..
37120 20 20 69 66 28 20 70 4e 65 61 72 20 29 7b 0d 0a    if( pNear ){..
37130 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20      int i;..    
37140 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72  for(i=0; i<pNear
37150 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b  ->nPhrase; i++){
37160 0d 0a 20 20 20 20 20 20 66 74 73 35 45 78 70 72  ..      fts5Expr
37170 50 68 72 61 73 65 46 72 65 65 28 70 4e 65 61 72  PhraseFree(pNear
37180 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 29 3b 0d  ->apPhrase[i]);.
37190 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
371a0 74 65 33 5f 66 72 65 65 28 70 4e 65 61 72 2d 3e  te3_free(pNear->
371b0 70 43 6f 6c 73 65 74 29 3b 0d 0a 20 20 20 20 73  pColset);..    s
371c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 61  qlite3_free(pNea
371d0 72 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73  r);..  }..}....s
371e0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
371f0 65 33 46 74 73 35 50 61 72 73 65 46 69 6e 69 73  e3Fts5ParseFinis
37200 68 65 64 28 46 74 73 35 50 61 72 73 65 20 2a 70  hed(Fts5Parse *p
37210 50 61 72 73 65 2c 20 46 74 73 35 45 78 70 72 4e  Parse, Fts5ExprN
37220 6f 64 65 20 2a 70 29 7b 0d 0a 20 20 61 73 73 65  ode *p){..  asse
37230 72 74 28 20 70 50 61 72 73 65 2d 3e 70 45 78 70  rt( pParse->pExp
37240 72 3d 3d 30 20 29 3b 0d 0a 20 20 70 50 61 72 73  r==0 );..  pPars
37250 65 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0d 0a 7d  e->pExpr = p;..}
37260 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20  ..../*..** This 
37270 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
37280 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
37290 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 74   to process a st
372a0 72 69 6e 67 20 74 6f 6b 65 6e 2e 20 54 68 65 0d  ring token. The.
372b0 0a 2a 2a 20 73 74 72 69 6e 67 20 6d 61 79 20 6f  .** string may o
372c0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 6f  r may not be quo
372d0 74 65 64 2e 20 49 6e 20 61 6e 79 20 63 61 73 65  ted. In any case
372e0 20 69 74 20 69 73 20 74 6f 6b 65 6e 69 7a 65 64   it is tokenized
372f0 20 61 6e 64 20 61 0d 0a 2a 2a 20 70 68 72 61 73   and a..** phras
37300 65 20 6f 62 6a 65 63 74 20 63 6f 6e 73 69 73 74  e object consist
37310 69 6e 67 20 6f 66 20 61 6c 6c 20 74 6f 6b 65 6e  ing of all token
37320 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2f 0d  s returned...*/.
37330 0a 73 74 61 74 69 63 20 46 74 73 35 45 78 70 72  .static Fts5Expr
37340 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65 33 46  Phrase *sqlite3F
37350 74 73 35 50 61 72 73 65 54 65 72 6d 28 0d 0a 20  ts5ParseTerm(.. 
37360 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
37370 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
37380 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
37390 74 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72  t */..  Fts5Expr
373a0 50 68 72 61 73 65 20 2a 70 41 70 70 65 6e 64 2c  Phrase *pAppend,
373b0 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
373c0 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a  e to append to *
373d0 2f 0d 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a  /..  Fts5Token *
373e0 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  pToken,         
373f0 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74       /* String t
37400 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0d 0a 20  o tokenize */.. 
37410 20 69 6e 74 20 62 50 72 65 66 69 78 20 20 20 20   int bPrefix    
37420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37430 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
37440 65 20 69 73 20 61 20 74 72 61 69 6c 69 6e 67 20  e is a trailing 
37450 22 2a 22 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 46 74  "*" */..){..  Ft
37460 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
37470 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  g = pParse->pCon
37480 66 69 67 3b 0d 0a 20 20 54 6f 6b 65 6e 43 74 78  fig;..  TokenCtx
37490 20 73 43 74 78 3b 20 20 20 20 20 20 20 20 20 20   sCtx;          
374a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
374b0 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  xt object passed
374c0 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0d   to callback */.
374d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
374e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374f0 20 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 20 72     /* Tokenize r
37500 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20  eturn code */.. 
37510 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0d 0a 0d   char *z = 0;...
37520 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c  .  memset(&sCtx,
37530 20 30 2c 20 73 69 7a 65 6f 66 28 54 6f 6b 65 6e   0, sizeof(Token
37540 43 74 78 29 29 3b 0d 0a 20 20 73 43 74 78 2e 70  Ctx));..  sCtx.p
37550 50 68 72 61 73 65 20 3d 20 70 41 70 70 65 6e 64  Phrase = pAppend
37560 3b 0d 0a 0d 0a 20 20 72 63 20 3d 20 66 74 73 35  ;....  rc = fts5
37570 50 61 72 73 65 53 74 72 69 6e 67 46 72 6f 6d 54  ParseStringFromT
37580 6f 6b 65 6e 28 70 54 6f 6b 65 6e 2c 20 26 7a 29  oken(pToken, &z)
37590 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
375a0 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 69  ITE_OK ){..    i
375b0 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 5f  nt flags = FTS5_
375c0 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 20 7c  TOKENIZE_QUERY |
375d0 20 28 62 50 72 65 66 69 78 20 3f 20 46 54 53 35   (bPrefix ? FTS5
375e0 5f 54 4f 4b 45 4e 49 5a 45 5f 50 52 45 46 49 58  _TOKENIZE_PREFIX
375f0 20 3a 20 30 29 3b 0d 0a 20 20 20 20 69 6e 74 20   : 0);..    int 
37600 6e 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46  n;..    sqlite3F
37610 74 73 35 44 65 71 75 6f 74 65 28 7a 29 3b 0d 0a  ts5Dequote(z);..
37620 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72      n = (int)str
37630 6c 65 6e 28 7a 29 3b 0d 0a 20 20 20 20 72 63 20  len(z);..    rc 
37640 3d 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b  = sqlite3Fts5Tok
37650 65 6e 69 7a 65 28 70 43 6f 6e 66 69 67 2c 20 66  enize(pConfig, f
37660 6c 61 67 73 2c 20 7a 2c 20 6e 2c 20 26 73 43 74  lags, z, n, &sCt
37670 78 2c 20 66 74 73 35 50 61 72 73 65 54 6f 6b 65  x, fts5ParseToke
37680 6e 69 7a 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73  nize);..  }..  s
37690 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0d  qlite3_free(z);.
376a0 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 28 72 63  .  if( rc || (rc
376b0 20 3d 20 73 43 74 78 2e 72 63 29 20 29 7b 0d 0a   = sCtx.rc) ){..
376c0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
376d0 20 72 63 3b 0d 0a 20 20 20 20 66 74 73 35 45 78   rc;..    fts5Ex
376e0 70 72 50 68 72 61 73 65 46 72 65 65 28 73 43 74  prPhraseFree(sCt
376f0 78 2e 70 50 68 72 61 73 65 29 3b 0d 0a 20 20 20  x.pPhrase);..   
37700 20 73 43 74 78 2e 70 50 68 72 61 73 65 20 3d 20   sCtx.pPhrase = 
37710 30 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 0d 0a  0;..  }else{....
37720 20 20 20 20 69 66 28 20 70 41 70 70 65 6e 64 3d      if( pAppend=
37730 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28  =0 ){..      if(
37740 20 28 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73   (pParse->nPhras
37750 65 20 25 20 38 29 3d 3d 30 20 29 7b 0d 0a 20 20  e % 8)==0 ){..  
37760 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
37770 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
37780 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73  of(Fts5ExprPhras
37790 65 2a 29 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e  e*) * (pParse->n
377a0 50 68 72 61 73 65 20 2b 20 38 29 3b 0d 0a 20 20  Phrase + 8);..  
377b0 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68        Fts5ExprPh
377c0 72 61 73 65 20 2a 2a 61 70 4e 65 77 3b 0d 0a 20  rase **apNew;.. 
377d0 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 28         apNew = (
377e0 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 2a  Fts5ExprPhrase**
377f0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
37800 36 34 28 70 50 61 72 73 65 2d 3e 61 70 50 68 72  64(pParse->apPhr
37810 61 73 65 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20  ase, nByte);..  
37820 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d        if( apNew=
37830 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20  =0 ){..         
37840 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
37850 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20  LITE_NOMEM;..   
37860 20 20 20 20 20 20 20 66 74 73 35 45 78 70 72 50         fts5ExprP
37870 68 72 61 73 65 46 72 65 65 28 73 43 74 78 2e 70  hraseFree(sCtx.p
37880 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20 20 20  Phrase);..      
37890 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20      return 0;.. 
378a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
378b0 20 20 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61    pParse->apPhra
378c0 73 65 20 3d 20 61 70 4e 65 77 3b 0d 0a 20 20 20  se = apNew;..   
378d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 70 50 61 72     }..      pPar
378e0 73 65 2d 3e 6e 50 68 72 61 73 65 2b 2b 3b 0d 0a  se->nPhrase++;..
378f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28      }....    if(
37900 20 73 43 74 78 2e 70 50 68 72 61 73 65 3d 3d 30   sCtx.pPhrase==0
37910 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68   ){..      /* Th
37920 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
37930 70 61 72 73 69 6e 67 20 61 20 74 6f 6b 65 6e 20  parsing a token 
37940 6f 72 20 71 75 6f 74 65 64 20 70 68 72 61 73 65  or quoted phrase
37950 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0d 0a   that contains..
37960 20 20 20 20 20 20 2a 2a 20 6e 6f 20 74 6f 6b 65        ** no toke
37970 6e 20 63 68 61 72 61 63 74 65 72 73 20 61 74 20  n characters at 
37980 61 6c 6c 2e 20 28 65 2e 67 20 2e 2e 2e 20 4d 41  all. (e.g ... MA
37990 54 43 48 20 27 22 22 27 29 2e 20 2a 2f 0d 0a 20  TCH '""'). */.. 
379a0 20 20 20 20 20 73 43 74 78 2e 70 50 68 72 61 73       sCtx.pPhras
379b0 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  e = sqlite3Fts5M
379c0 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 50 61 72 73  allocZero(&pPars
379d0 65 2d 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74  e->rc, sizeof(Ft
379e0 73 35 45 78 70 72 50 68 72 61 73 65 29 29 3b 0d  s5ExprPhrase));.
379f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
37a00 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e 54 65  Ctx.pPhrase->nTe
37a10 72 6d 20 29 7b 0d 0a 20 20 20 20 20 20 73 43 74  rm ){..      sCt
37a20 78 2e 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  x.pPhrase->aTerm
37a30 5b 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e  [sCtx.pPhrase->n
37a40 54 65 72 6d 2d 31 5d 2e 62 50 72 65 66 69 78 20  Term-1].bPrefix 
37a50 3d 20 28 75 38 29 62 50 72 65 66 69 78 3b 0d 0a  = (u8)bPrefix;..
37a60 20 20 20 20 7d 0d 0a 20 20 20 20 70 50 61 72 73      }..    pPars
37a70 65 2d 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72  e->apPhrase[pPar
37a80 73 65 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 20 3d  se->nPhrase-1] =
37a90 20 73 43 74 78 2e 70 50 68 72 61 73 65 3b 0d 0a   sCtx.pPhrase;..
37aa0 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20    }....  return 
37ab0 73 43 74 78 2e 70 50 68 72 61 73 65 3b 0d 0a 7d  sCtx.pPhrase;..}
37ac0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74  ..../*..** Creat
37ad0 65 20 61 20 6e 65 77 20 46 54 53 35 20 65 78 70  e a new FTS5 exp
37ae0 72 65 73 73 69 6f 6e 20 62 79 20 63 6c 6f 6e 69  ression by cloni
37af0 6e 67 20 70 68 72 61 73 65 20 69 50 68 72 61 73  ng phrase iPhras
37b00 65 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 65 78 70  e of the..** exp
37b10 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
37b20 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
37b30 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  ument...*/..stat
37b40 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
37b50 73 35 45 78 70 72 43 6c 6f 6e 65 50 68 72 61 73  s5ExprClonePhras
37b60 65 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a  e(..  Fts5Expr *
37b70 70 45 78 70 72 2c 20 0d 0a 20 20 69 6e 74 20 69  pExpr, ..  int i
37b80 50 68 72 61 73 65 2c 20 0d 0a 20 20 46 74 73 35  Phrase, ..  Fts5
37b90 45 78 70 72 20 2a 2a 70 70 4e 65 77 0d 0a 29 7b  Expr **ppNew..){
37ba0 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
37bb0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
37bc0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37bd0 64 65 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70  de */..  Fts5Exp
37be0 72 50 68 72 61 73 65 20 2a 70 4f 72 69 67 3b 20  rPhrase *pOrig; 
37bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
37c00 70 68 72 61 73 65 20 65 78 74 72 61 63 74 65 64  phrase extracted
37c10 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0d 0a   from pExpr */..
37c20 20 20 46 74 73 35 45 78 70 72 20 2a 70 4e 65 77    Fts5Expr *pNew
37c30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
37c40 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
37c50 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
37c60 70 4e 65 77 20 2a 2f 0d 0a 20 20 54 6f 6b 65 6e  pNew */..  Token
37c70 43 74 78 20 73 43 74 78 20 3d 20 7b 30 2c 30 7d  Ctx sCtx = {0,0}
37c80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
37c90 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72  ntext object for
37ca0 20 66 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69   fts5ParseTokeni
37cb0 7a 65 20 2a 2f 0d 0a 0d 0a 20 20 70 4f 72 69 67  ze */....  pOrig
37cc0 20 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72   = pExpr->apExpr
37cd0 50 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d 3b  Phrase[iPhrase];
37ce0 0d 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35  ..  pNew = (Fts5
37cf0 45 78 70 72 2a 29 73 71 6c 69 74 65 33 46 74 73  Expr*)sqlite3Fts
37d00 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
37d10 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
37d20 29 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  ));..  if( rc==S
37d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
37d40 20 70 4e 65 77 2d 3e 61 70 45 78 70 72 50 68 72   pNew->apExprPhr
37d50 61 73 65 20 3d 20 28 46 74 73 35 45 78 70 72 50  ase = (Fts5ExprP
37d60 68 72 61 73 65 2a 2a 29 73 71 6c 69 74 65 33 46  hrase**)sqlite3F
37d70 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
37d80 63 2c 20 0d 0a 20 20 20 20 20 20 20 20 73 69 7a  c, ..        siz
37d90 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61  eof(Fts5ExprPhra
37da0 73 65 2a 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69  se*));..  }..  i
37db0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37dc0 20 29 7b 0d 0a 20 20 20 20 70 4e 65 77 2d 3e 70   ){..    pNew->p
37dd0 52 6f 6f 74 20 3d 20 28 46 74 73 35 45 78 70 72  Root = (Fts5Expr
37de0 4e 6f 64 65 2a 29 73 71 6c 69 74 65 33 46 74 73  Node*)sqlite3Fts
37df0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
37e00 20 0d 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f   ..        sizeo
37e10 66 28 46 74 73 35 45 78 70 72 4e 6f 64 65 29 29  f(Fts5ExprNode))
37e20 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63  ;..  }..  if( rc
37e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
37e40 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d      pNew->pRoot-
37e50 3e 70 4e 65 61 72 20 3d 20 28 46 74 73 35 45 78  >pNear = (Fts5Ex
37e60 70 72 4e 65 61 72 73 65 74 2a 29 73 71 6c 69 74  prNearset*)sqlit
37e70 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
37e80 28 26 72 63 2c 20 0d 0a 20 20 20 20 20 20 20 20  (&rc, ..        
37e90 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e  sizeof(Fts5ExprN
37ea0 65 61 72 73 65 74 29 20 2b 20 73 69 7a 65 6f 66  earset) + sizeof
37eb0 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a  (Fts5ExprPhrase*
37ec0 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20  ));..  }..  if( 
37ed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37ee0 0d 0a 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74  ..    Fts5Colset
37ef0 20 2a 70 43 6f 6c 73 65 74 4f 72 69 67 20 3d 20   *pColsetOrig = 
37f00 70 4f 72 69 67 2d 3e 70 4e 6f 64 65 2d 3e 70 4e  pOrig->pNode->pN
37f10 65 61 72 2d 3e 70 43 6f 6c 73 65 74 3b 0d 0a 20  ear->pColset;.. 
37f20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 4f 72     if( pColsetOr
37f30 69 67 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c  ig ){..      sql
37f40 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
37f50 3b 0d 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6c  ;..      Fts5Col
37f60 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 0d 0a 20  set *pColset;.. 
37f70 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a       nByte = siz
37f80 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74 29 20  eof(Fts5Colset) 
37f90 2b 20 28 70 43 6f 6c 73 65 74 4f 72 69 67 2d 3e  + (pColsetOrig->
37fa0 6e 43 6f 6c 2d 31 29 20 2a 20 73 69 7a 65 6f 66  nCol-1) * sizeof
37fb0 28 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20 70 43  (int);..      pC
37fc0 6f 6c 73 65 74 20 3d 20 28 46 74 73 35 43 6f 6c  olset = (Fts5Col
37fd0 73 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  set*)sqlite3Fts5
37fe0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
37ff0 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 20 20 69  nByte);..      i
38000 66 28 20 70 43 6f 6c 73 65 74 20 29 7b 20 0d 0a  f( pColset ){ ..
38010 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
38020 43 6f 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74 4f  Colset, pColsetO
38030 72 69 67 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20  rig, nByte);..  
38040 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 70 4e 65      }..      pNe
38050 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 2d  w->pRoot->pNear-
38060 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73  >pColset = pCols
38070 65 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  et;..    }..  }.
38080 0a 0d 0a 20 20 69 66 28 20 70 4f 72 69 67 2d 3e  ...  if( pOrig->
38090 6e 54 65 72 6d 20 29 7b 0d 0a 20 20 20 20 69 6e  nTerm ){..    in
380a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
380b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
380c0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
380d0 20 74 68 72 6f 75 67 68 20 70 68 72 61 73 65 20   through phrase 
380e0 74 65 72 6d 73 20 2a 2f 0d 0a 20 20 20 20 66 6f  terms */..    fo
380f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
38100 45 5f 4f 4b 20 26 26 20 69 3c 70 4f 72 69 67 2d  E_OK && i<pOrig-
38110 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a 20  >nTerm; i++){.. 
38120 20 20 20 20 20 69 6e 74 20 74 66 6c 61 67 73 20       int tflags 
38130 3d 20 30 3b 0d 0a 20 20 20 20 20 20 46 74 73 35  = 0;..      Fts5
38140 45 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a 20 20  ExprTerm *p;..  
38150 20 20 20 20 66 6f 72 28 70 3d 26 70 4f 72 69 67      for(p=&pOrig
38160 2d 3e 61 54 65 72 6d 5b 69 5d 3b 20 70 20 26 26  ->aTerm[i]; p &&
38170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
38180 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0d  p=p->pSynonym){.
38190 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
381a0 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70 2d 3e  har *zTerm = p->
381b0 7a 54 65 72 6d 3b 0d 0a 20 20 20 20 20 20 20 20  zTerm;..        
381c0 72 63 20 3d 20 66 74 73 35 50 61 72 73 65 54 6f  rc = fts5ParseTo
381d0 6b 65 6e 69 7a 65 28 28 76 6f 69 64 2a 29 26 73  kenize((void*)&s
381e0 43 74 78 2c 20 74 66 6c 61 67 73 2c 20 7a 54 65  Ctx, tflags, zTe
381f0 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rm, (int)strlen(
38200 7a 54 65 72 6d 29 2c 0d 0a 20 20 20 20 20 20 20  zTerm),..       
38210 20 20 20 20 20 30 2c 20 30 29 3b 0d 0a 20 20 20       0, 0);..   
38220 20 20 20 20 20 74 66 6c 61 67 73 20 3d 20 46 54       tflags = FT
38230 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54  S5_TOKEN_COLOCAT
38240 45 44 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ED;..      }..  
38250 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38260 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
38270 20 20 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e    sCtx.pPhrase->
38280 61 54 65 72 6d 5b 69 5d 2e 62 50 72 65 66 69 78  aTerm[i].bPrefix
38290 20 3d 20 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b   = pOrig->aTerm[
382a0 69 5d 2e 62 50 72 65 66 69 78 3b 0d 0a 20 20 20  i].bPrefix;..   
382b0 20 20 20 20 20 73 43 74 78 2e 70 50 68 72 61 73       sCtx.pPhras
382c0 65 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 46 69 72  e->aTerm[i].bFir
382d0 73 74 20 3d 20 70 4f 72 69 67 2d 3e 61 54 65 72  st = pOrig->aTer
382e0 6d 5b 69 5d 2e 62 46 69 72 73 74 3b 0d 0a 20 20  m[i].bFirst;..  
382f0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
38300 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2f 2a 20 54  }else{..    /* T
38310 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
38320 20 70 61 72 73 69 6e 67 20 61 20 74 6f 6b 65 6e   parsing a token
38330 20 6f 72 20 71 75 6f 74 65 64 20 70 68 72 61 73   or quoted phras
38340 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e