System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 045e281e9c15dcf16b8dbf810bf25ca074744581:


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 74   part of..**   t
1b30: 68 65 20 73 61 6d 65 20 4d 41 54 43 48 20 71 75  he same MATCH qu
1b40: 65 72 79 20 75 73 69 6e 67 20 74 68 65 20 78 47  ery using the xG
1b50: 65 74 41 75 78 64 61 74 61 28 29 20 41 50 49 2e  etAuxdata() API.
1b60: 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 45 61 63 68 20  ..**..**   Each 
1b70: 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e 63 74 69  extension functi
1b80: 6f 6e 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  on is allocated 
1b90: 61 20 73 69 6e 67 6c 65 20 61 75 78 69 6c 69 61  a single auxilia
1ba0: 72 79 20 64 61 74 61 20 73 6c 6f 74 20 66 6f 72  ry data slot for
1bb0: 0d 0a 2a 2a 20 20 20 65 61 63 68 20 46 54 53 20  ..**   each FTS 
1bc0: 71 75 65 72 79 20 28 4d 41 54 43 48 20 65 78 70  query (MATCH exp
1bd0: 72 65 73 73 69 6f 6e 29 2e 20 49 66 20 74 68 65  ression). If the
1be0: 20 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e 63 74   extension funct
1bf0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 0d  ion is invoked .
1c00: 0a 2a 2a 20 20 20 6d 6f 72 65 20 74 68 61 6e 20  .**   more than 
1c10: 6f 6e 63 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  once for a singl
1c20: 65 20 46 54 53 20 71 75 65 72 79 2c 20 74 68 65  e FTS query, the
1c30: 6e 20 61 6c 6c 20 69 6e 76 6f 63 61 74 69 6f 6e  n all invocation
1c40: 73 20 73 68 61 72 65 20 61 20 0d 0a 2a 2a 20 20  s share a ..**  
1c50: 20 73 69 6e 67 6c 65 20 61 75 78 69 6c 69 61 72   single auxiliar
1c60: 79 20 64 61 74 61 20 63 6f 6e 74 65 78 74 2e 0d  y data context..
1c70: 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 66 20 74 68 65  .**..**   If the
1c80: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
1c90: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
1ca0: 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68 69  pointer when thi
1cb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0d 0a 2a  s function is..*
1cc0: 2a 20 20 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65  *   invoked, the
1cd0: 6e 20 69 74 20 69 73 20 72 65 70 6c 61 63 65 64  n it is replaced
1ce0: 20 62 79 20 74 68 65 20 6e 65 77 20 70 6f 69 6e   by the new poin
1cf0: 74 65 72 2e 20 49 66 20 61 6e 20 78 44 65 6c 65  ter. If an xDele
1d00: 74 65 20 63 61 6c 6c 62 61 63 6b 0d 0a 2a 2a 20  te callback..** 
1d10: 20 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20    was specified 
1d20: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 6f  along with the o
1d30: 72 69 67 69 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  riginal pointer,
1d40: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   it is invoked a
1d50: 74 20 74 68 69 73 0d 0a 2a 2a 20 20 20 70 6f 69  t this..**   poi
1d60: 6e 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68  nt...**..**   Th
1d70: 65 20 78 44 65 6c 65 74 65 20 63 61 6c 6c 62 61  e xDelete callba
1d80: 63 6b 2c 20 69 66 20 6f 6e 65 20 69 73 20 73 70  ck, if one is sp
1d90: 65 63 69 66 69 65 64 2c 20 69 73 20 61 6c 73 6f  ecified, is also
1da0: 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 0d   invoked on the.
1db0: 0a 2a 2a 20 20 20 61 75 78 69 6c 69 61 72 79 20  .**   auxiliary 
1dc0: 64 61 74 61 20 70 6f 69 6e 74 65 72 20 61 66 74  data pointer aft
1dd0: 65 72 20 74 68 65 20 46 54 53 35 20 71 75 65 72  er the FTS5 quer
1de0: 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0d  y has finished..
1df0: 0a 2a 2a 0d 0a 2a 2a 20 20 20 49 66 20 61 6e 20  .**..**   If an 
1e00: 65 72 72 6f 72 20 28 65 2e 67 2e 20 61 6e 20 4f  error (e.g. an O
1e10: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63  OM condition) oc
1e20: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 69 73  curs within this
1e30: 20 66 75 6e 63 74 69 6f 6e 2c 0d 0a 2a 2a 20 20   function,..**  
1e40: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
1e50: 61 74 61 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ata is set to NU
1e60: 4c 4c 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  LL and an error 
1e70: 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 49  code returned. I
1e80: 66 20 74 68 65 0d 0a 2a 2a 20 20 20 78 44 65 6c  f the..**   xDel
1e90: 65 74 65 20 70 61 72 61 6d 65 74 65 72 20 77 61  ete parameter wa
1ea0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 69  s not NULL, it i
1eb0: 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65  s invoked on the
1ec0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 0d   auxiliary data.
1ed0: 0a 2a 2a 20 20 20 70 6f 69 6e 74 65 72 20 62 65  .**   pointer be
1ee0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d  fore returning..
1ef0: 0a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 78 47 65 74  .**..**..** xGet
1f00: 41 75 78 64 61 74 61 28 70 46 74 73 35 2c 20 62  Auxdata(pFts5, b
1f10: 43 6c 65 61 72 29 0d 0a 2a 2a 0d 0a 2a 2a 20 20  Clear)..**..**  
1f20: 20 52 65 74 75 72 6e 73 20 74 68 65 20 63 75 72   Returns the cur
1f30: 72 65 6e 74 20 61 75 78 69 6c 69 61 72 79 20 64  rent auxiliary d
1f40: 61 74 61 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  ata pointer for 
1f50: 74 68 65 20 66 74 73 35 20 65 78 74 65 6e 73 69  the fts5 extensi
1f60: 6f 6e 20 0d 0a 2a 2a 20 20 20 66 75 6e 63 74 69  on ..**   functi
1f70: 6f 6e 2e 20 53 65 65 20 74 68 65 20 78 53 65 74  on. See the xSet
1f80: 41 75 78 64 61 74 61 28 29 20 6d 65 74 68 6f 64  Auxdata() method
1f90: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0d 0a 2a   for details...*
1fa0: 2a 0d 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 62  *..**   If the b
1fb0: 43 6c 65 61 72 20 61 72 67 75 6d 65 6e 74 20 69  Clear argument i
1fc0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1fd0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
1fe0: 61 74 61 20 69 73 20 63 6c 65 61 72 65 64 0d 0a  ata is cleared..
1ff0: 2a 2a 20 20 20 28 73 65 74 20 74 6f 20 4e 55 4c  **   (set to NUL
2000: 4c 29 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  L) before this f
2010: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2020: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2030: 65 20 78 44 65 6c 65 74 65 2c 0d 0a 2a 2a 20 20  e xDelete,..**  
2040: 20 69 66 20 61 6e 79 2c 20 69 73 20 6e 6f 74 20   if any, is not 
2050: 69 6e 76 6f 6b 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a  invoked...**..**
2060: 0d 0a 2a 2a 20 78 52 6f 77 43 6f 75 6e 74 28 70  ..** xRowCount(p
2070: 46 74 73 35 2c 20 70 6e 52 6f 77 29 0d 0a 2a 2a  Fts5, pnRow)..**
2080: 0d 0a 2a 2a 20 20 20 54 68 69 73 20 66 75 6e 63  ..**   This func
2090: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
20a0: 72 65 74 72 69 65 76 65 20 74 68 65 20 74 6f 74  retrieve the tot
20b0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
20c0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0d  s in the table..
20d0: 0a 2a 2a 20 20 20 49 6e 20 6f 74 68 65 72 20 77  .**   In other w
20e0: 6f 72 64 73 2c 20 74 68 65 20 73 61 6d 65 20 76  ords, the same v
20f0: 61 6c 75 65 20 74 68 61 74 20 77 6f 75 6c 64 20  alue that would 
2100: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 3a 0d  be returned by:.
2110: 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 20 53  .**..**        S
2120: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2130: 52 4f 4d 20 66 74 73 74 61 62 6c 65 3b 0d 0a 2a  ROM ftstable;..*
2140: 2a 0d 0a 2a 2a 20 78 50 68 72 61 73 65 46 69 72  *..** xPhraseFir
2150: 73 74 28 29 0d 0a 2a 2a 20 20 20 54 68 69 73 20  st()..**   This 
2160: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2170: 2c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 79 70  , along with typ
2180: 65 20 46 74 73 35 50 68 72 61 73 65 49 74 65 72  e Fts5PhraseIter
2190: 20 61 6e 64 20 74 68 65 20 78 50 68 72 61 73 65   and the xPhrase
21a0: 4e 65 78 74 0d 0a 2a 2a 20 20 20 6d 65 74 68 6f  Next..**   metho
21b0: 64 2c 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  d, to iterate th
21c0: 72 6f 75 67 68 20 61 6c 6c 20 69 6e 73 74 61 6e  rough all instan
21d0: 63 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ces of a single 
21e0: 71 75 65 72 79 20 70 68 72 61 73 65 20 77 69 74  query phrase wit
21f0: 68 69 6e 0d 0a 2a 2a 20 20 20 74 68 65 20 63 75  hin..**   the cu
2200: 72 72 65 6e 74 20 72 6f 77 2e 20 54 68 69 73 20  rrent row. This 
2210: 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 66 6f  is the same info
2220: 72 6d 61 74 69 6f 6e 20 61 73 20 69 73 20 61 63  rmation as is ac
2230: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
2240: 0d 0a 2a 2a 20 20 20 78 49 6e 73 74 43 6f 75 6e  ..**   xInstCoun
2250: 74 2f 78 49 6e 73 74 20 41 50 49 73 2e 20 57 68  t/xInst APIs. Wh
2260: 69 6c 65 20 74 68 65 20 78 49 6e 73 74 43 6f 75  ile the xInstCou
2270: 6e 74 2f 78 49 6e 73 74 20 41 50 49 73 20 61 72  nt/xInst APIs ar
2280: 65 20 6d 6f 72 65 20 63 6f 6e 76 65 6e 69 65 6e  e more convenien
2290: 74 0d 0a 2a 2a 20 20 20 74 6f 20 75 73 65 2c 20  t..**   to use, 
22a0: 74 68 69 73 20 41 50 49 20 6d 61 79 20 62 65 20  this API may be 
22b0: 66 61 73 74 65 72 20 75 6e 64 65 72 20 73 6f 6d  faster under som
22c0: 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  e circumstances.
22d0: 20 54 6f 20 69 74 65 72 61 74 65 20 0d 0a 2a 2a   To iterate ..**
22e0: 20 20 20 74 68 72 6f 75 67 68 20 69 6e 73 74 61     through insta
22f0: 6e 63 65 73 20 6f 66 20 70 68 72 61 73 65 20 69  nces of phrase i
2300: 50 68 72 61 73 65 2c 20 75 73 65 20 74 68 65 20  Phrase, use the 
2310: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 3a 0d  following code:.
2320: 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 46 74  .**..**       Ft
2330: 73 35 50 68 72 61 73 65 49 74 65 72 20 69 74 65  s5PhraseIter ite
2340: 72 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  r;..**       int
2350: 20 69 43 6f 6c 2c 20 69 4f 66 66 3b 0d 0a 2a 2a   iCol, iOff;..**
2360: 20 20 20 20 20 20 20 66 6f 72 28 70 41 70 69 2d         for(pApi-
2370: 3e 78 50 68 72 61 73 65 46 69 72 73 74 28 70 46  >xPhraseFirst(pF
2380: 74 73 2c 20 69 50 68 72 61 73 65 2c 20 26 69 74  ts, iPhrase, &it
2390: 65 72 2c 20 26 69 43 6f 6c 2c 20 26 69 4f 66 66  er, &iCol, &iOff
23a0: 29 3b 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  );..**          
23b0: 20 69 43 6f 6c 3e 3d 30 3b 0d 0a 2a 2a 20 20 20   iCol>=0;..**   
23c0: 20 20 20 20 20 20 20 20 70 41 70 69 2d 3e 78 50          pApi->xP
23d0: 68 72 61 73 65 4e 65 78 74 28 70 46 74 73 2c 20  hraseNext(pFts, 
23e0: 26 69 74 65 72 2c 20 26 69 43 6f 6c 2c 20 26 69  &iter, &iCol, &i
23f0: 4f 66 66 29 0d 0a 2a 2a 20 20 20 20 20 20 20 29  Off)..**       )
2400: 7b 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f  {..**         //
2410: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2420: 70 68 72 61 73 65 20 69 50 68 72 61 73 65 20 61  phrase iPhrase a
2430: 74 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66  t offset iOff of
2440: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 0d 0a 2a 2a   column iCol..**
2450: 20 20 20 20 20 20 20 7d 0d 0a 2a 2a 0d 0a 2a 2a         }..**..**
2460: 20 20 20 54 68 65 20 46 74 73 35 50 68 72 61 73     The Fts5Phras
2470: 65 49 74 65 72 20 73 74 72 75 63 74 75 72 65 20  eIter structure 
2480: 69 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65  is defined above
2490: 2e 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  . Applications s
24a0: 68 6f 75 6c 64 20 6e 6f 74 0d 0a 2a 2a 20 20 20  hould not..**   
24b0: 6d 6f 64 69 66 79 20 74 68 69 73 20 73 74 72 75  modify this stru
24c0: 63 74 75 72 65 20 64 69 72 65 63 74 6c 79 20 2d  cture directly -
24d0: 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   it should only 
24e0: 62 65 20 75 73 65 64 20 61 73 20 73 68 6f 77 6e  be used as shown
24f0: 20 61 62 6f 76 65 0d 0a 2a 2a 20 20 20 77 69 74   above..**   wit
2500: 68 20 74 68 65 20 78 50 68 72 61 73 65 46 69 72  h the xPhraseFir
2510: 73 74 28 29 20 61 6e 64 20 78 50 68 72 61 73 65  st() and xPhrase
2520: 4e 65 78 74 28 29 20 41 50 49 20 6d 65 74 68 6f  Next() API metho
2530: 64 73 20 28 61 6e 64 20 62 79 0d 0a 2a 2a 20 20  ds (and by..**  
2540: 20 78 50 68 72 61 73 65 46 69 72 73 74 43 6f 6c   xPhraseFirstCol
2550: 75 6d 6e 28 29 20 61 6e 64 20 78 50 68 72 61 73  umn() and xPhras
2560: 65 4e 65 78 74 43 6f 6c 75 6d 6e 28 29 20 61 73  eNextColumn() as
2570: 20 69 6c 6c 75 73 74 72 61 74 65 64 20 62 65 6c   illustrated bel
2580: 6f 77 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54  ow)...**..**   T
2590: 68 69 73 20 41 50 49 20 63 61 6e 20 62 65 20 71  his API can be q
25a0: 75 69 74 65 20 73 6c 6f 77 20 69 66 20 75 73 65  uite slow if use
25b0: 64 20 77 69 74 68 20 61 6e 20 46 54 53 35 20 74  d with an FTS5 t
25c0: 61 62 6c 65 20 63 72 65 61 74 65 64 20 77 69 74  able created wit
25d0: 68 20 74 68 65 0d 0a 2a 2a 20 20 20 22 64 65 74  h the..**   "det
25e0: 61 69 6c 3d 6e 6f 6e 65 22 20 6f 72 20 22 64 65  ail=none" or "de
25f0: 74 61 69 6c 3d 63 6f 6c 75 6d 6e 22 20 6f 70 74  tail=column" opt
2600: 69 6f 6e 2e 20 49 66 20 74 68 65 20 46 54 53 35  ion. If the FTS5
2610: 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65   table is create
2620: 64 20 0d 0a 2a 2a 20 20 20 77 69 74 68 20 65 69  d ..**   with ei
2630: 74 68 65 72 20 22 64 65 74 61 69 6c 3d 6e 6f 6e  ther "detail=non
2640: 65 22 20 6f 72 20 22 64 65 74 61 69 6c 3d 63 6f  e" or "detail=co
2650: 6c 75 6d 6e 22 20 61 6e 64 20 22 63 6f 6e 74 65  lumn" and "conte
2660: 6e 74 3d 22 20 6f 70 74 69 6f 6e 20 0d 0a 2a 2a  nt=" option ..**
2670: 20 20 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69     (i.e. if it i
2680: 73 20 61 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20  s a contentless 
2690: 74 61 62 6c 65 29 2c 20 74 68 65 6e 20 74 68 69  table), then thi
26a0: 73 20 41 50 49 20 61 6c 77 61 79 73 20 69 74 65  s API always ite
26b0: 72 61 74 65 73 0d 0a 2a 2a 20 20 20 74 68 72 6f  rates..**   thro
26c0: 75 67 68 20 61 6e 20 65 6d 70 74 79 20 73 65 74  ugh an empty set
26d0: 20 28 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78   (all calls to x
26e0: 50 68 72 61 73 65 46 69 72 73 74 28 29 20 73 65  PhraseFirst() se
26f0: 74 20 69 43 6f 6c 20 74 6f 20 2d 31 29 2e 0d 0a  t iCol to -1)...
2700: 2a 2a 0d 0a 2a 2a 20 78 50 68 72 61 73 65 4e 65  **..** xPhraseNe
2710: 78 74 28 29 0d 0a 2a 2a 20 20 20 53 65 65 20 78  xt()..**   See x
2720: 50 68 72 61 73 65 46 69 72 73 74 20 61 62 6f 76  PhraseFirst abov
2730: 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 78 50 68 72 61  e...**..** xPhra
2740: 73 65 46 69 72 73 74 43 6f 6c 75 6d 6e 28 29 0d  seFirstColumn().
2750: 0a 2a 2a 20 20 20 54 68 69 73 20 66 75 6e 63 74  .**   This funct
2760: 69 6f 6e 20 61 6e 64 20 78 50 68 72 61 73 65 4e  ion and xPhraseN
2770: 65 78 74 43 6f 6c 75 6d 6e 28 29 20 61 72 65 20  extColumn() are 
2780: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 78  similar to the x
2790: 50 68 72 61 73 65 46 69 72 73 74 28 29 0d 0a 2a  PhraseFirst()..*
27a0: 2a 20 20 20 61 6e 64 20 78 50 68 72 61 73 65 4e  *   and xPhraseN
27b0: 65 78 74 28 29 20 41 50 49 73 20 64 65 73 63 72  ext() APIs descr
27c0: 69 62 65 64 20 61 62 6f 76 65 2e 20 54 68 65 20  ibed above. The 
27d0: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 74 68  difference is th
27e0: 61 74 20 69 6e 73 74 65 61 64 0d 0a 2a 2a 20 20  at instead..**  
27f0: 20 6f 66 20 69 74 65 72 61 74 69 6e 67 20 74 68   of iterating th
2800: 72 6f 75 67 68 20 61 6c 6c 20 69 6e 73 74 61 6e  rough all instan
2810: 63 65 73 20 6f 66 20 61 20 70 68 72 61 73 65 20  ces of a phrase 
2820: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  in the current r
2830: 6f 77 2c 20 74 68 65 73 65 0d 0a 2a 2a 20 20 20  ow, these..**   
2840: 41 50 49 73 20 61 72 65 20 75 73 65 64 20 74 6f  APIs are used to
2850: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2860: 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
2870: 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
2880: 6e 74 20 72 6f 77 0d 0a 2a 2a 20 20 20 74 68 61  nt row..**   tha
2890: 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 65 20 6f 72  t contain one or
28a0: 20 6d 6f 72 65 20 69 6e 73 74 61 6e 63 65 73 20   more instances 
28b0: 6f 66 20 61 20 73 70 65 63 69 66 69 65 64 20 70  of a specified p
28c0: 68 72 61 73 65 2e 20 46 6f 72 20 65 78 61 6d 70  hrase. For examp
28d0: 6c 65 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20  le:..**..**     
28e0: 20 20 46 74 73 35 50 68 72 61 73 65 49 74 65 72    Fts5PhraseIter
28f0: 20 69 74 65 72 3b 0d 0a 2a 2a 20 20 20 20 20 20   iter;..**      
2900: 20 69 6e 74 20 69 43 6f 6c 3b 0d 0a 2a 2a 20 20   int iCol;..**  
2910: 20 20 20 20 20 66 6f 72 28 70 41 70 69 2d 3e 78       for(pApi->x
2920: 50 68 72 61 73 65 46 69 72 73 74 43 6f 6c 75 6d  PhraseFirstColum
2930: 6e 28 70 46 74 73 2c 20 69 50 68 72 61 73 65 2c  n(pFts, iPhrase,
2940: 20 26 69 74 65 72 2c 20 26 69 43 6f 6c 29 3b 0d   &iter, &iCol);.
2950: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 43  .**           iC
2960: 6f 6c 3e 3d 30 3b 0d 0a 2a 2a 20 20 20 20 20 20  ol>=0;..**      
2970: 20 20 20 20 20 70 41 70 69 2d 3e 78 50 68 72 61       pApi->xPhra
2980: 73 65 4e 65 78 74 43 6f 6c 75 6d 6e 28 70 46 74  seNextColumn(pFt
2990: 73 2c 20 26 69 74 65 72 2c 20 26 69 43 6f 6c 29  s, &iter, &iCol)
29a0: 0d 0a 2a 2a 20 20 20 20 20 20 20 29 7b 0d 0a 2a  ..**       ){..*
29b0: 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 43 6f 6c  *         // Col
29c0: 75 6d 6e 20 69 43 6f 6c 20 63 6f 6e 74 61 69 6e  umn iCol contain
29d0: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 69  s at least one i
29e0: 6e 73 74 61 6e 63 65 20 6f 66 20 70 68 72 61 73  nstance of phras
29f0: 65 20 69 50 68 72 61 73 65 0d 0a 2a 2a 20 20 20  e iPhrase..**   
2a00: 20 20 20 20 7d 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20      }..**..**   
2a10: 54 68 69 73 20 41 50 49 20 63 61 6e 20 62 65 20  This API can be 
2a20: 71 75 69 74 65 20 73 6c 6f 77 20 69 66 20 75 73  quite slow if us
2a30: 65 64 20 77 69 74 68 20 61 6e 20 46 54 53 35 20  ed with an FTS5 
2a40: 74 61 62 6c 65 20 63 72 65 61 74 65 64 20 77 69  table created wi
2a50: 74 68 20 74 68 65 0d 0a 2a 2a 20 20 20 22 64 65  th the..**   "de
2a60: 74 61 69 6c 3d 6e 6f 6e 65 22 20 6f 70 74 69 6f  tail=none" optio
2a70: 6e 2e 20 49 66 20 74 68 65 20 46 54 53 35 20 74  n. If the FTS5 t
2a80: 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64 20  able is created 
2a90: 77 69 74 68 20 65 69 74 68 65 72 20 0d 0a 2a 2a  with either ..**
2aa0: 20 20 20 22 64 65 74 61 69 6c 3d 6e 6f 6e 65 22     "detail=none"
2ab0: 20 22 63 6f 6e 74 65 6e 74 3d 22 20 6f 70 74 69   "content=" opti
2ac0: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69  on (i.e. if it i
2ad0: 73 20 61 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20  s a contentless 
2ae0: 74 61 62 6c 65 29 2c 20 0d 0a 2a 2a 20 20 20 74  table), ..**   t
2af0: 68 65 6e 20 74 68 69 73 20 41 50 49 20 61 6c 77  hen this API alw
2b00: 61 79 73 20 69 74 65 72 61 74 65 73 20 74 68 72  ays iterates thr
2b10: 6f 75 67 68 20 61 6e 20 65 6d 70 74 79 20 73 65  ough an empty se
2b20: 74 20 28 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20  t (all calls to 
2b30: 0d 0a 2a 2a 20 20 20 78 50 68 72 61 73 65 46 69  ..**   xPhraseFi
2b40: 72 73 74 43 6f 6c 75 6d 6e 28 29 20 73 65 74 20  rstColumn() set 
2b50: 69 43 6f 6c 20 74 6f 20 2d 31 29 2e 0d 0a 2a 2a  iCol to -1)...**
2b60: 0d 0a 2a 2a 20 20 20 54 68 65 20 69 6e 66 6f 72  ..**   The infor
2b70: 6d 61 74 69 6f 6e 20 61 63 63 65 73 73 65 64 20  mation accessed 
2b80: 75 73 69 6e 67 20 74 68 69 73 20 41 50 49 20 61  using this API a
2b90: 6e 64 20 69 74 73 20 63 6f 6d 70 61 6e 69 6f 6e  nd its companion
2ba0: 0d 0a 2a 2a 20 20 20 78 50 68 72 61 73 65 46 69  ..**   xPhraseFi
2bb0: 72 73 74 43 6f 6c 75 6d 6e 28 29 20 6d 61 79 20  rstColumn() may 
2bc0: 61 6c 73 6f 20 62 65 20 6f 62 74 61 69 6e 65 64  also be obtained
2bd0: 20 75 73 69 6e 67 20 78 50 68 72 61 73 65 46 69   using xPhraseFi
2be0: 72 73 74 2f 78 50 68 72 61 73 65 4e 65 78 74 0d  rst/xPhraseNext.
2bf0: 0a 2a 2a 20 20 20 28 6f 72 20 78 49 6e 73 74 2f  .**   (or xInst/
2c00: 78 49 6e 73 74 43 6f 75 6e 74 29 2e 20 54 68 65  xInstCount). The
2c10: 20 63 68 69 65 66 20 61 64 76 61 6e 74 61 67 65   chief advantage
2c20: 20 6f 66 20 74 68 69 73 20 41 50 49 20 69 73 20   of this API is 
2c30: 74 68 61 74 20 69 74 20 69 73 0d 0a 2a 2a 20 20  that it is..**  
2c40: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 6d   significantly m
2c50: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 74 68  ore efficient th
2c60: 61 6e 20 74 68 6f 73 65 20 61 6c 74 65 72 6e 61  an those alterna
2c70: 74 69 76 65 73 20 77 68 65 6e 20 75 73 65 64 20  tives when used 
2c80: 77 69 74 68 0d 0a 2a 2a 20 20 20 22 64 65 74 61  with..**   "deta
2c90: 69 6c 3d 63 6f 6c 75 6d 6e 22 20 74 61 62 6c 65  il=column" table
2ca0: 73 2e 20 20 0d 0a 2a 2a 0d 0a 2a 2a 20 78 50 68  s.  ..**..** xPh
2cb0: 72 61 73 65 4e 65 78 74 43 6f 6c 75 6d 6e 28 29  raseNextColumn()
2cc0: 0d 0a 2a 2a 20 20 20 53 65 65 20 78 50 68 72 61  ..**   See xPhra
2cd0: 73 65 46 69 72 73 74 43 6f 6c 75 6d 6e 20 61 62  seFirstColumn ab
2ce0: 6f 76 65 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74  ove...*/..struct
2cf0: 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70   Fts5ExtensionAp
2d00: 69 20 7b 0d 0a 20 20 69 6e 74 20 69 56 65 72 73  i {..  int iVers
2d10: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
2d20: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2d30: 74 6c 79 20 61 6c 77 61 79 73 20 73 65 74 20 74  tly always set t
2d40: 6f 20 33 20 2a 2f 0d 0a 0d 0a 20 20 76 6f 69 64  o 3 */....  void
2d50: 20 2a 28 2a 78 55 73 65 72 44 61 74 61 29 28 46   *(*xUserData)(F
2d60: 74 73 35 43 6f 6e 74 65 78 74 2a 29 3b 0d 0a 0d  ts5Context*);...
2d70: 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6c 75 6d 6e  .  int (*xColumn
2d80: 43 6f 75 6e 74 29 28 46 74 73 35 43 6f 6e 74 65  Count)(Fts5Conte
2d90: 78 74 2a 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78  xt*);..  int (*x
2da0: 52 6f 77 43 6f 75 6e 74 29 28 46 74 73 35 43 6f  RowCount)(Fts5Co
2db0: 6e 74 65 78 74 2a 2c 20 73 71 6c 69 74 65 33 5f  ntext*, sqlite3_
2dc0: 69 6e 74 36 34 20 2a 70 6e 52 6f 77 29 3b 0d 0a  int64 *pnRow);..
2dd0: 20 20 69 6e 74 20 28 2a 78 43 6f 6c 75 6d 6e 54    int (*xColumnT
2de0: 6f 74 61 6c 53 69 7a 65 29 28 46 74 73 35 43 6f  otalSize)(Fts5Co
2df0: 6e 74 65 78 74 2a 2c 20 69 6e 74 20 69 43 6f 6c  ntext*, int iCol
2e00: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
2e10: 2a 70 6e 54 6f 6b 65 6e 29 3b 0d 0a 0d 0a 20 20  *pnToken);....  
2e20: 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 69 7a 65 29  int (*xTokenize)
2e30: 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 0d  (Fts5Context*, .
2e40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2e50: 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78  *pText, int nTex
2e60: 74 2c 20 2f 2a 20 54 65 78 74 20 74 6f 20 74 6f  t, /* Text to to
2e70: 6b 65 6e 69 7a 65 20 2a 2f 0d 0a 20 20 20 20 76  kenize */..    v
2e80: 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ea0: 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64 20 74  Context passed t
2eb0: 6f 20 78 54 6f 6b 65 6e 28 29 20 2a 2f 0d 0a 20  o xToken() */.. 
2ec0: 20 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29     int (*xToken)
2ed0: 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e  (void*, int, con
2ee0: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69  st char*, int, i
2ef0: 6e 74 2c 20 69 6e 74 29 20 20 20 20 20 20 20 2f  nt, int)       /
2f00: 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 20  * Callback */.. 
2f10: 20 29 3b 0d 0a 0d 0a 20 20 69 6e 74 20 28 2a 78   );....  int (*x
2f20: 50 68 72 61 73 65 43 6f 75 6e 74 29 28 46 74 73  PhraseCount)(Fts
2f30: 35 43 6f 6e 74 65 78 74 2a 29 3b 0d 0a 20 20 69  5Context*);..  i
2f40: 6e 74 20 28 2a 78 50 68 72 61 73 65 53 69 7a 65  nt (*xPhraseSize
2f50: 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20  )(Fts5Context*, 
2f60: 69 6e 74 20 69 50 68 72 61 73 65 29 3b 0d 0a 0d  int iPhrase);...
2f70: 0a 20 20 69 6e 74 20 28 2a 78 49 6e 73 74 43 6f  .  int (*xInstCo
2f80: 75 6e 74 29 28 46 74 73 35 43 6f 6e 74 65 78 74  unt)(Fts5Context
2f90: 2a 2c 20 69 6e 74 20 2a 70 6e 49 6e 73 74 29 3b  *, int *pnInst);
2fa0: 0d 0a 20 20 69 6e 74 20 28 2a 78 49 6e 73 74 29  ..  int (*xInst)
2fb0: 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 69  (Fts5Context*, i
2fc0: 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 2a 70 69  nt iIdx, int *pi
2fd0: 50 68 72 61 73 65 2c 20 69 6e 74 20 2a 70 69 43  Phrase, int *piC
2fe0: 6f 6c 2c 20 69 6e 74 20 2a 70 69 4f 66 66 29 3b  ol, int *piOff);
2ff0: 0d 0a 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  ....  sqlite3_in
3000: 74 36 34 20 28 2a 78 52 6f 77 69 64 29 28 46 74  t64 (*xRowid)(Ft
3010: 73 35 43 6f 6e 74 65 78 74 2a 29 3b 0d 0a 20 20  s5Context*);..  
3020: 69 6e 74 20 28 2a 78 43 6f 6c 75 6d 6e 54 65 78  int (*xColumnTex
3030: 74 29 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c  t)(Fts5Context*,
3040: 20 69 6e 74 20 69 43 6f 6c 2c 20 63 6f 6e 73 74   int iCol, const
3050: 20 63 68 61 72 20 2a 2a 70 7a 2c 20 69 6e 74 20   char **pz, int 
3060: 2a 70 6e 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78  *pn);..  int (*x
3070: 43 6f 6c 75 6d 6e 53 69 7a 65 29 28 46 74 73 35  ColumnSize)(Fts5
3080: 43 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 20 69 43  Context*, int iC
3090: 6f 6c 2c 20 69 6e 74 20 2a 70 6e 54 6f 6b 65 6e  ol, int *pnToken
30a0: 29 3b 0d 0a 0d 0a 20 20 69 6e 74 20 28 2a 78 51  );....  int (*xQ
30b0: 75 65 72 79 50 68 72 61 73 65 29 28 46 74 73 35  ueryPhrase)(Fts5
30c0: 43 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 20 69 50  Context*, int iP
30d0: 68 72 61 73 65 2c 20 76 6f 69 64 20 2a 70 55 73  hrase, void *pUs
30e0: 65 72 44 61 74 61 2c 0d 0a 20 20 20 20 69 6e 74  erData,..    int
30f0: 28 2a 29 28 63 6f 6e 73 74 20 46 74 73 35 45 78  (*)(const Fts5Ex
3100: 74 65 6e 73 69 6f 6e 41 70 69 2a 2c 46 74 73 35  tensionApi*,Fts5
3110: 43 6f 6e 74 65 78 74 2a 2c 76 6f 69 64 2a 29 0d  Context*,void*).
3120: 0a 20 20 29 3b 0d 0a 20 20 69 6e 74 20 28 2a 78  .  );..  int (*x
3130: 53 65 74 41 75 78 64 61 74 61 29 28 46 74 73 35  SetAuxdata)(Fts5
3140: 43 6f 6e 74 65 78 74 2a 2c 20 76 6f 69 64 20 2a  Context*, void *
3150: 70 41 75 78 2c 20 76 6f 69 64 28 2a 78 44 65 6c  pAux, void(*xDel
3160: 65 74 65 29 28 76 6f 69 64 2a 29 29 3b 0d 0a 20  ete)(void*));.. 
3170: 20 76 6f 69 64 20 2a 28 2a 78 47 65 74 41 75 78   void *(*xGetAux
3180: 64 61 74 61 29 28 46 74 73 35 43 6f 6e 74 65 78  data)(Fts5Contex
3190: 74 2a 2c 20 69 6e 74 20 62 43 6c 65 61 72 29 3b  t*, int bClear);
31a0: 0d 0a 0d 0a 20 20 69 6e 74 20 28 2a 78 50 68 72  ....  int (*xPhr
31b0: 61 73 65 46 69 72 73 74 29 28 46 74 73 35 43 6f  aseFirst)(Fts5Co
31c0: 6e 74 65 78 74 2a 2c 20 69 6e 74 20 69 50 68 72  ntext*, int iPhr
31d0: 61 73 65 2c 20 46 74 73 35 50 68 72 61 73 65 49  ase, Fts5PhraseI
31e0: 74 65 72 2a 2c 20 69 6e 74 2a 2c 20 69 6e 74 2a  ter*, int*, int*
31f0: 29 3b 0d 0a 20 20 76 6f 69 64 20 28 2a 78 50 68  );..  void (*xPh
3200: 72 61 73 65 4e 65 78 74 29 28 46 74 73 35 43 6f  raseNext)(Fts5Co
3210: 6e 74 65 78 74 2a 2c 20 46 74 73 35 50 68 72 61  ntext*, Fts5Phra
3220: 73 65 49 74 65 72 2a 2c 20 69 6e 74 20 2a 70 69  seIter*, int *pi
3230: 43 6f 6c 2c 20 69 6e 74 20 2a 70 69 4f 66 66 29  Col, int *piOff)
3240: 3b 0d 0a 0d 0a 20 20 69 6e 74 20 28 2a 78 50 68  ;....  int (*xPh
3250: 72 61 73 65 46 69 72 73 74 43 6f 6c 75 6d 6e 29  raseFirstColumn)
3260: 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 69  (Fts5Context*, i
3270: 6e 74 20 69 50 68 72 61 73 65 2c 20 46 74 73 35  nt iPhrase, Fts5
3280: 50 68 72 61 73 65 49 74 65 72 2a 2c 20 69 6e 74  PhraseIter*, int
3290: 2a 29 3b 0d 0a 20 20 76 6f 69 64 20 28 2a 78 50  *);..  void (*xP
32a0: 68 72 61 73 65 4e 65 78 74 43 6f 6c 75 6d 6e 29  hraseNextColumn)
32b0: 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 46  (Fts5Context*, F
32c0: 74 73 35 50 68 72 61 73 65 49 74 65 72 2a 2c 20  ts5PhraseIter*, 
32d0: 69 6e 74 20 2a 70 69 43 6f 6c 29 3b 0d 0a 7d 3b  int *piCol);..};
32e0: 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20 43 55 53 54  ..../* ..** CUST
32f0: 4f 4d 20 41 55 58 49 4c 49 41 52 59 20 46 55 4e  OM AUXILIARY FUN
3300: 43 54 49 4f 4e 53 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a  CTIONS..********
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 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 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: 0d 0a 2a 2a 20 43 55 53 54 4f 4d 20 54 4f 4b 45  ..** CUSTOM TOKE
33b0: 4e 49 5a 45 52 53 0d 0a 2a 2a 0d 0a 2a 2a 20 41  NIZERS..**..** A
33c0: 70 70 6c 69 63 61 74 69 6f 6e 73 20 6d 61 79 20  pplications may 
33d0: 61 6c 73 6f 20 72 65 67 69 73 74 65 72 20 63 75  also register cu
33e0: 73 74 6f 6d 20 74 6f 6b 65 6e 69 7a 65 72 20 74  stom tokenizer t
33f0: 79 70 65 73 2e 20 41 20 74 6f 6b 65 6e 69 7a 65  ypes. A tokenize
3400: 72 20 0d 0a 2a 2a 20 69 73 20 72 65 67 69 73 74  r ..** is regist
3410: 65 72 65 64 20 62 79 20 70 72 6f 76 69 64 69 6e  ered by providin
3420: 67 20 66 74 73 35 20 77 69 74 68 20 61 20 70 6f  g fts5 with a po
3430: 70 75 6c 61 74 65 64 20 69 6e 73 74 61 6e 63 65  pulated instance
3440: 20 6f 66 20 74 68 65 20 0d 0a 2a 2a 20 66 6f 6c   of the ..** fol
3450: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3460: 2e 20 41 6c 6c 20 73 74 72 75 63 74 75 72 65 20  . All structure 
3470: 6d 65 74 68 6f 64 73 20 6d 75 73 74 20 62 65 20  methods must be 
3480: 64 65 66 69 6e 65 64 2c 20 73 65 74 74 69 6e 67  defined, setting
3490: 0d 0a 2a 2a 20 61 6e 79 20 6d 65 6d 62 65 72 20  ..** any member 
34a0: 6f 66 20 74 68 65 20 66 74 73 35 5f 74 6f 6b 65  of the fts5_toke
34b0: 6e 69 7a 65 72 20 73 74 72 75 63 74 20 74 6f 20  nizer struct to 
34c0: 4e 55 4c 4c 20 6c 65 61 64 73 20 74 6f 20 75 6e  NULL leads to un
34d0: 64 65 66 69 6e 65 64 0d 0a 2a 2a 20 62 65 68 61  defined..** beha
34e0: 76 69 6f 75 72 2e 20 54 68 65 20 73 74 72 75 63  viour. The struc
34f0: 74 75 72 65 20 6d 65 74 68 6f 64 73 20 61 72 65  ture methods are
3500: 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 75 6e   expected to fun
3510: 63 74 69 6f 6e 20 61 73 20 66 6f 6c 6c 6f 77 73  ction as follows
3520: 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 78 43 72 65 61 74  :..**..** xCreat
3530: 65 3a 0d 0a 2a 2a 20 20 20 54 68 69 73 20 66 75  e:..**   This fu
3540: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
3550: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  o allocate and i
3560: 6e 69 74 69 61 6c 69 7a 65 20 61 20 74 6f 6b 65  nitialize a toke
3570: 6e 69 7a 65 72 20 69 6e 73 74 61 6e 63 65 2e 0d  nizer instance..
3580: 0a 2a 2a 20 20 20 41 20 74 6f 6b 65 6e 69 7a 65  .**   A tokenize
3590: 72 20 69 6e 73 74 61 6e 63 65 20 69 73 20 72 65  r instance is re
35a0: 71 75 69 72 65 64 20 74 6f 20 61 63 74 75 61 6c  quired to actual
35b0: 6c 79 20 74 6f 6b 65 6e 69 7a 65 20 74 65 78 74  ly tokenize text
35c0: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 65 20  ...**..**   The 
35d0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
35e0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
35f0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 70 79  nction is a copy
3600: 20 6f 66 20 74 68 65 20 28 76 6f 69 64 2a 29 0d   of the (void*).
3610: 0a 2a 2a 20 20 20 70 6f 69 6e 74 65 72 20 70 72  .**   pointer pr
3620: 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 61 70  ovided by the ap
3630: 70 6c 69 63 61 74 69 6f 6e 20 77 68 65 6e 20 74  plication when t
3640: 68 65 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  he fts5_tokenize
3650: 72 20 6f 62 6a 65 63 74 0d 0a 2a 2a 20 20 20 77  r object..**   w
3660: 61 73 20 72 65 67 69 73 74 65 72 65 64 20 77 69  as registered wi
3670: 74 68 20 46 54 53 35 20 28 74 68 65 20 74 68 69  th FTS5 (the thi
3680: 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  rd argument to x
3690: 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 28  CreateTokenizer(
36a0: 29 29 2e 20 0d 0a 2a 2a 20 20 20 54 68 65 20 73  )). ..**   The s
36b0: 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
36c0: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 6e  arguments are an
36d0: 20 61 72 72 61 79 20 6f 66 20 6e 75 6c 2d 74 65   array of nul-te
36e0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 73  rminated strings
36f0: 0d 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 69 6e  ..**   containin
3700: 67 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20  g the tokenizer 
3710: 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e  arguments, if an
3720: 79 2c 20 73 70 65 63 69 66 69 65 64 20 66 6f 6c  y, specified fol
3730: 6c 6f 77 69 6e 67 20 74 68 65 0d 0a 2a 2a 20 20  lowing the..**  
3740: 20 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65 20   tokenizer name 
3750: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 43  as part of the C
3760: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
3770: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73  BLE statement us
3780: 65 64 0d 0a 2a 2a 20 20 20 74 6f 20 63 72 65 61  ed..**   to crea
3790: 74 65 20 74 68 65 20 46 54 53 35 20 74 61 62 6c  te the FTS5 tabl
37a0: 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 65  e...**..**   The
37b0: 20 66 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20   final argument 
37c0: 69 73 20 61 6e 20 6f 75 74 70 75 74 20 76 61 72  is an output var
37d0: 69 61 62 6c 65 2e 20 49 66 20 73 75 63 63 65 73  iable. If succes
37e0: 73 66 75 6c 2c 20 28 2a 70 70 4f 75 74 29 20 0d  sful, (*ppOut) .
37f0: 0a 2a 2a 20 20 20 73 68 6f 75 6c 64 20 62 65 20  .**   should be 
3800: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
3810: 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65  the new tokenize
3820: 72 20 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c  r handle and SQL
3830: 49 54 45 5f 4f 4b 0d 0a 2a 2a 20 20 20 72 65 74  ITE_OK..**   ret
3840: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
3850: 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20  or occurs, some 
3860: 76 61 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e  value other than
3870: 20 53 51 4c 49 54 45 5f 4f 4b 20 73 68 6f 75 6c   SQLITE_OK shoul
3880: 64 0d 0a 2a 2a 20 20 20 62 65 20 72 65 74 75 72  d..**   be retur
3890: 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
38a0: 65 2c 20 66 74 73 35 20 61 73 73 75 6d 65 73 20  e, fts5 assumes 
38b0: 74 68 61 74 20 74 68 65 20 66 69 6e 61 6c 20 76  that the final v
38c0: 61 6c 75 65 20 6f 66 20 2a 70 70 4f 75 74 20 0d  alue of *ppOut .
38d0: 0a 2a 2a 20 20 20 69 73 20 75 6e 64 65 66 69 6e  .**   is undefin
38e0: 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 78 44 65 6c  ed...**..** xDel
38f0: 65 74 65 3a 0d 0a 2a 2a 20 20 20 54 68 69 73 20  ete:..**   This 
3900: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
3910: 6b 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 20  ked to delete a 
3920: 74 6f 6b 65 6e 69 7a 65 72 20 68 61 6e 64 6c 65  tokenizer handle
3930: 20 70 72 65 76 69 6f 75 73 6c 79 0d 0a 2a 2a 20   previously..** 
3940: 20 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e    allocated usin
3950: 67 20 78 43 72 65 61 74 65 28 29 2e 20 46 74 73  g xCreate(). Fts
3960: 35 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  5 guarantees tha
3970: 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
3980: 77 69 6c 6c 0d 0a 2a 2a 20 20 20 62 65 20 69 6e  will..**   be in
3990: 76 6f 6b 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  voked exactly on
39a0: 63 65 20 66 6f 72 20 65 61 63 68 20 73 75 63 63  ce for each succ
39b0: 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 20 78  essful call to x
39c0: 43 72 65 61 74 65 28 29 2e 0d 0a 2a 2a 0d 0a 2a  Create()...**..*
39d0: 2a 20 78 54 6f 6b 65 6e 69 7a 65 3a 0d 0a 2a 2a  * xTokenize:..**
39e0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
39f0: 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
3a00: 74 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e 54 65  tokenize the nTe
3a10: 78 74 20 62 79 74 65 20 73 74 72 69 6e 67 20 69  xt byte string i
3a20: 6e 64 69 63 61 74 65 64 20 0d 0a 2a 2a 20 20 20  ndicated ..**   
3a30: 62 79 20 61 72 67 75 6d 65 6e 74 20 70 54 65 78  by argument pTex
3a40: 74 2e 20 70 54 65 78 74 20 6d 61 79 20 6f 72 20  t. pText may or 
3a50: 6d 61 79 20 6e 6f 74 20 62 65 20 6e 75 6c 2d 74  may not be nul-t
3a60: 65 72 6d 69 6e 61 74 65 64 2e 20 54 68 65 20 66  erminated. The f
3a70: 69 72 73 74 0d 0a 2a 2a 20 20 20 61 72 67 75 6d  irst..**   argum
3a80: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
3a90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
3aa0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46   pointer to an F
3ab0: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 6f 62 6a  ts5Tokenizer obj
3ac0: 65 63 74 0d 0a 2a 2a 20 20 20 72 65 74 75 72 6e  ect..**   return
3ad0: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
3ae0: 20 63 61 6c 6c 20 74 6f 20 78 43 72 65 61 74 65   call to xCreate
3af0: 28 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68  ()...**..**   Th
3b00: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
3b10: 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  t indicates the 
3b20: 72 65 61 73 6f 6e 20 74 68 61 74 20 46 54 53 35  reason that FTS5
3b30: 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0d 0a   is requesting..
3b40: 2a 2a 20 20 20 74 6f 6b 65 6e 69 7a 61 74 69 6f  **   tokenizatio
3b50: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
3b60: 64 20 74 65 78 74 2e 20 54 68 69 73 20 69 73 20  d text. This is 
3b70: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 74 68  always one of th
3b80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0d 0a 2a 2a 20  e following..** 
3b90: 20 20 66 6f 75 72 20 76 61 6c 75 65 73 3a 0d 0a    four values:..
3ba0: 2a 2a 0d 0a 2a 2a 20 20 20 3c 75 6c 3e 3c 6c 69  **..**   <ul><li
3bb0: 3e 20 3c 62 3e 46 54 53 35 5f 54 4f 4b 45 4e 49  > <b>FTS5_TOKENI
3bc0: 5a 45 5f 44 4f 43 55 4d 45 4e 54 3c 2f 62 3e 20  ZE_DOCUMENT</b> 
3bd0: 2d 20 41 20 64 6f 63 75 6d 65 6e 74 20 69 73 20  - A document is 
3be0: 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69  being inserted i
3bf0: 6e 74 6f 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  nto..**         
3c00: 20 20 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72     or removed fr
3c10: 6f 6d 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  om the FTS table
3c20: 2e 20 54 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20  . The tokenizer 
3c30: 69 73 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  is being invoked
3c40: 20 74 6f 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20   to..**         
3c50: 20 20 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65     determine the
3c60: 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 73 20 74   set of tokens t
3c70: 6f 20 61 64 64 20 74 6f 20 28 6f 72 20 64 65 6c  o add to (or del
3c80: 65 74 65 20 66 72 6f 6d 29 20 74 68 65 0d 0a 2a  ete from) the..*
3c90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  *            FTS
3ca0: 20 69 6e 64 65 78 2e 0d 0a 2a 2a 0d 0a 2a 2a 20   index...**..** 
3cb0: 20 20 20 20 20 20 3c 6c 69 3e 20 3c 62 3e 46 54        <li> <b>FT
3cc0: 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52  S5_TOKENIZE_QUER
3cd0: 59 3c 2f 62 3e 20 2d 20 41 20 4d 41 54 43 48 20  Y</b> - A MATCH 
3ce0: 71 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 65  query is being e
3cf0: 78 65 63 75 74 65 64 20 0d 0a 2a 2a 20 20 20 20  xecuted ..**    
3d00: 20 20 20 20 20 20 20 20 61 67 61 69 6e 73 74 20          against 
3d10: 74 68 65 20 46 54 53 20 69 6e 64 65 78 2e 20 54  the FTS index. T
3d20: 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20  he tokenizer is 
3d30: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20  being called to 
3d40: 74 6f 6b 65 6e 69 7a 65 20 0d 0a 2a 2a 20 20 20  tokenize ..**   
3d50: 20 20 20 20 20 20 20 20 20 61 20 62 61 72 65 77           a barew
3d60: 6f 72 64 20 6f 72 20 71 75 6f 74 65 64 20 73 74  ord or quoted st
3d70: 72 69 6e 67 20 73 70 65 63 69 66 69 65 64 20 61  ring specified a
3d80: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 71 75  s part of the qu
3d90: 65 72 79 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20  ery...**..**    
3da0: 20 20 20 3c 6c 69 3e 20 3c 62 3e 28 46 54 53 35     <li> <b>(FTS5
3db0: 5f 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 20  _TOKENIZE_QUERY 
3dc0: 7c 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f  | FTS5_TOKENIZE_
3dd0: 50 52 45 46 49 58 29 3c 2f 62 3e 20 2d 20 53 61  PREFIX)</b> - Sa
3de0: 6d 65 20 61 73 0d 0a 2a 2a 20 20 20 20 20 20 20  me as..**       
3df0: 20 20 20 20 20 46 54 53 35 5f 54 4f 4b 45 4e 49       FTS5_TOKENI
3e00: 5a 45 5f 51 55 45 52 59 2c 20 65 78 63 65 70 74  ZE_QUERY, except
3e10: 20 74 68 61 74 20 74 68 65 20 62 61 72 65 77 6f   that the barewo
3e20: 72 64 20 6f 72 20 71 75 6f 74 65 64 20 73 74 72  rd or quoted str
3e30: 69 6e 67 20 69 73 0d 0a 2a 2a 20 20 20 20 20 20  ing is..**      
3e40: 20 20 20 20 20 20 66 6f 6c 6c 6f 77 65 64 20 62        followed b
3e50: 79 20 61 20 22 2a 22 20 63 68 61 72 61 63 74 65  y a "*" characte
3e60: 72 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  r, indicating th
3e70: 61 74 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  at the last toke
3e80: 6e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n..**           
3e90: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
3ea0: 20 74 6f 6b 65 6e 69 7a 65 72 20 77 69 6c 6c 20   tokenizer will 
3eb0: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 61 20  be treated as a 
3ec0: 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0d 0a 2a  token prefix...*
3ed0: 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 69 3e  *..**       <li>
3ee0: 20 3c 62 3e 46 54 53 35 5f 54 4f 4b 45 4e 49 5a   <b>FTS5_TOKENIZ
3ef0: 45 5f 41 55 58 3c 2f 62 3e 20 2d 20 54 68 65 20  E_AUX</b> - The 
3f00: 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 62 65 69  tokenizer is bei
3f10: 6e 67 20 69 6e 76 6f 6b 65 64 20 74 6f 20 0d 0a  ng invoked to ..
3f20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 61  **            sa
3f30: 74 69 73 66 79 20 61 6e 20 66 74 73 35 5f 61 70  tisfy an fts5_ap
3f40: 69 2e 78 54 6f 6b 65 6e 69 7a 65 28 29 20 72 65  i.xTokenize() re
3f50: 71 75 65 73 74 20 6d 61 64 65 20 62 79 20 61 6e  quest made by an
3f60: 20 61 75 78 69 6c 69 61 72 79 0d 0a 2a 2a 20 20   auxiliary..**  
3f70: 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69            functi
3f80: 6f 6e 2e 20 4f 72 20 61 6e 20 66 74 73 35 5f 61  on. Or an fts5_a
3f90: 70 69 2e 78 43 6f 6c 75 6d 6e 53 69 7a 65 28 29  pi.xColumnSize()
3fa0: 20 72 65 71 75 65 73 74 20 6d 61 64 65 20 62 79   request made by
3fb0: 20 74 68 65 20 73 61 6d 65 0d 0a 2a 2a 20 20 20   the same..**   
3fc0: 20 20 20 20 20 20 20 20 20 6f 6e 20 61 20 63 6f           on a co
3fd0: 6c 75 6d 6e 73 69 7a 65 3d 30 20 64 61 74 61 62  lumnsize=0 datab
3fe0: 61 73 65 2e 20 20 0d 0a 2a 2a 20 20 20 3c 2f 75  ase.  ..**   </u
3ff0: 6c 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 46 6f 72  l>..**..**   For
4000: 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
4010: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2c  he input string,
4020: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63 61   the supplied ca
4030: 6c 6c 62 61 63 6b 20 78 54 6f 6b 65 6e 28 29 20  llback xToken() 
4040: 6d 75 73 74 0d 0a 2a 2a 20 20 20 62 65 20 69 6e  must..**   be in
4050: 76 6f 6b 65 64 2e 20 54 68 65 20 66 69 72 73 74  voked. The first
4060: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 20   argument to it 
4070: 73 68 6f 75 6c 64 20 62 65 20 61 20 63 6f 70 79  should be a copy
4080: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 0d   of the pointer.
4090: 0a 2a 2a 20 20 20 70 61 73 73 65 64 20 61 73 20  .**   passed as 
40a0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
40b0: 65 6e 74 20 74 6f 20 78 54 6f 6b 65 6e 69 7a 65  ent to xTokenize
40c0: 28 29 2e 20 54 68 65 20 74 68 69 72 64 20 61 6e  (). The third an
40d0: 64 20 66 6f 75 72 74 68 0d 0a 2a 2a 20 20 20 61  d fourth..**   a
40e0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 20 70  rguments are a p
40f0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
4100: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
4110: 65 20 74 6f 6b 65 6e 20 74 65 78 74 2c 20 61 6e  e token text, an
4120: 64 20 74 68 65 0d 0a 2a 2a 20 20 20 73 69 7a 65  d the..**   size
4130: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 69 6e   of the token in
4140: 20 62 79 74 65 73 2e 20 54 68 65 20 34 74 68 20   bytes. The 4th 
4150: 61 6e 64 20 35 74 68 20 61 72 67 75 6d 65 6e 74  and 5th argument
4160: 73 20 61 72 65 20 74 68 65 20 62 79 74 65 20 6f  s are the byte o
4170: 66 66 73 65 74 73 0d 0a 2a 2a 20 20 20 6f 66 20  ffsets..**   of 
4180: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
4190: 66 20 61 6e 64 20 66 69 72 73 74 20 62 79 74 65  f and first byte
41a0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
41b0: 6c 6f 77 69 6e 67 20 74 68 65 20 74 65 78 74 20  lowing the text 
41c0: 66 72 6f 6d 0d 0a 2a 2a 20 20 20 77 68 69 63 68  from..**   which
41d0: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 64 65   the token is de
41e0: 72 69 76 65 64 20 77 69 74 68 69 6e 20 74 68 65  rived within the
41f0: 20 69 6e 70 75 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20   input...**..** 
4200: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67    The second arg
4210: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
4220: 74 68 65 20 78 54 6f 6b 65 6e 28 29 20 63 61 6c  the xToken() cal
4230: 6c 62 61 63 6b 20 28 22 74 66 6c 61 67 73 22 29  lback ("tflags")
4240: 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 20 20 6e 6f   should..**   no
4250: 72 6d 61 6c 6c 79 20 62 65 20 73 65 74 20 74 6f  rmally be set to
4260: 20 30 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f   0. The exceptio
4270: 6e 20 69 73 20 69 66 20 74 68 65 20 74 6f 6b 65  n is if the toke
4280: 6e 69 7a 65 72 20 73 75 70 70 6f 72 74 73 20 0d  nizer supports .
4290: 0a 2a 2a 20 20 20 73 79 6e 6f 6e 79 6d 73 2e 20  .**   synonyms. 
42a0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 65 65  In this case see
42b0: 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
42c0: 62 65 6c 6f 77 20 66 6f 72 20 64 65 74 61 69 6c  below for detail
42d0: 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 46 54 53  s...**..**   FTS
42e0: 35 20 61 73 73 75 6d 65 73 20 74 68 65 20 78 54  5 assumes the xT
42f0: 6f 6b 65 6e 28 29 20 63 61 6c 6c 62 61 63 6b 20  oken() callback 
4300: 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 65  is invoked for e
4310: 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
4320: 20 0d 0a 2a 2a 20 20 20 6f 72 64 65 72 20 74 68   ..**   order th
4330: 61 74 20 74 68 65 79 20 6f 63 63 75 72 20 77 69  at they occur wi
4340: 74 68 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74  thin the input t
4350: 65 78 74 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 49  ext...**..**   I
4360: 66 20 61 6e 20 78 54 6f 6b 65 6e 28 29 20 63 61  f an xToken() ca
4370: 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 61  llback returns a
4380: 6e 79 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74  ny value other t
4390: 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74  han SQLITE_OK, t
43a0: 68 65 6e 0d 0a 2a 2a 20 20 20 74 68 65 20 74 6f  hen..**   the to
43b0: 6b 65 6e 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  kenization shoul
43c0: 64 20 62 65 20 61 62 61 6e 64 6f 6e 65 64 20 61  d be abandoned a
43d0: 6e 64 20 74 68 65 20 78 54 6f 6b 65 6e 69 7a 65  nd the xTokenize
43e0: 28 29 20 6d 65 74 68 6f 64 20 73 68 6f 75 6c 64  () method should
43f0: 0d 0a 2a 2a 20 20 20 69 6d 6d 65 64 69 61 74 65  ..**   immediate
4400: 6c 79 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79  ly return a copy
4410: 20 6f 66 20 74 68 65 20 78 54 6f 6b 65 6e 28 29   of the xToken()
4420: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 4f   return value. O
4430: 72 2c 20 69 66 20 74 68 65 0d 0a 2a 2a 20 20 20  r, if the..**   
4440: 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20  input buffer is 
4450: 65 78 68 61 75 73 74 65 64 2c 20 78 54 6f 6b 65  exhausted, xToke
4460: 6e 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 72 65  nize() should re
4470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
4480: 46 69 6e 61 6c 6c 79 2c 0d 0a 2a 2a 20 20 20 69  Finally,..**   i
4490: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
44a0: 73 20 77 69 74 68 20 74 68 65 20 78 54 6f 6b 65  s with the xToke
44b0: 6e 69 7a 65 28 29 20 69 6d 70 6c 65 6d 65 6e 74  nize() implement
44c0: 61 74 69 6f 6e 20 69 74 73 65 6c 66 2c 20 69 74  ation itself, it
44d0: 0d 0a 2a 2a 20 20 20 6d 61 79 20 61 62 61 6e 64  ..**   may aband
44e0: 6f 6e 20 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74  on the tokenizat
44f0: 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ion and return a
4500: 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  ny error code ot
4510: 68 65 72 20 74 68 61 6e 0d 0a 2a 2a 20 20 20 53  her than..**   S
4520: 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
4530: 54 45 5f 44 4f 4e 45 2e 0d 0a 2a 2a 0d 0a 2a 2a  TE_DONE...**..**
4540: 20 53 59 4e 4f 4e 59 4d 20 53 55 50 50 4f 52 54   SYNONYM SUPPORT
4550: 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 43 75 73 74 6f  ..**..**   Custo
4560: 6d 20 74 6f 6b 65 6e 69 7a 65 72 73 20 6d 61 79  m tokenizers may
4570: 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 73 79   also support sy
4580: 6e 6f 6e 79 6d 73 2e 20 43 6f 6e 73 69 64 65 72  nonyms. Consider
4590: 20 61 20 63 61 73 65 20 69 6e 20 77 68 69 63 68   a case in which
45a0: 20 61 0d 0a 2a 2a 20 20 20 75 73 65 72 20 77 69   a..**   user wi
45b0: 73 68 65 73 20 74 6f 20 71 75 65 72 79 20 66 6f  shes to query fo
45c0: 72 20 61 20 70 68 72 61 73 65 20 73 75 63 68 20  r a phrase such 
45d0: 61 73 20 22 66 69 72 73 74 20 70 6c 61 63 65 22  as "first place"
45e0: 2e 20 55 73 69 6e 67 20 74 68 65 20 0d 0a 2a 2a  . Using the ..**
45f0: 20 20 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b 65     built-in toke
4600: 6e 69 7a 65 72 73 2c 20 74 68 65 20 46 54 53 35  nizers, the FTS5
4610: 20 71 75 65 72 79 20 27 66 69 72 73 74 20 2b 20   query 'first + 
4620: 70 6c 61 63 65 27 20 77 69 6c 6c 20 6d 61 74 63  place' will matc
4630: 68 20 69 6e 73 74 61 6e 63 65 73 0d 0a 2a 2a 20  h instances..** 
4640: 20 20 6f 66 20 22 66 69 72 73 74 20 70 6c 61 63    of "first plac
4650: 65 22 20 77 69 74 68 69 6e 20 74 68 65 20 64 6f  e" within the do
4660: 63 75 6d 65 6e 74 20 73 65 74 2c 20 62 75 74 20  cument set, but 
4670: 6e 6f 74 20 61 6c 74 65 72 6e 61 74 69 76 65 20  not alternative 
4680: 66 6f 72 6d 73 0d 0a 2a 2a 20 20 20 73 75 63 68  forms..**   such
4690: 20 61 73 20 22 31 73 74 20 70 6c 61 63 65 22 2e   as "1st place".
46a0: 20 49 6e 20 73 6f 6d 65 20 61 70 70 6c 69 63 61   In some applica
46b0: 74 69 6f 6e 73 2c 20 69 74 20 77 6f 75 6c 64 20  tions, it would 
46c0: 62 65 20 62 65 74 74 65 72 20 74 6f 20 6d 61 74  be better to mat
46d0: 63 68 0d 0a 2a 2a 20 20 20 61 6c 6c 20 69 6e 73  ch..**   all ins
46e0: 74 61 6e 63 65 73 20 6f 66 20 22 66 69 72 73 74  tances of "first
46f0: 20 70 6c 61 63 65 22 20 6f 72 20 22 31 73 74 20   place" or "1st 
4700: 70 6c 61 63 65 22 20 72 65 67 61 72 64 6c 65 73  place" regardles
4710: 73 20 6f 66 20 77 68 69 63 68 20 66 6f 72 6d 0d  s of which form.
4720: 0a 2a 2a 20 20 20 74 68 65 20 75 73 65 72 20 73  .**   the user s
4730: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
4740: 4d 41 54 43 48 20 71 75 65 72 79 20 74 65 78 74  MATCH query text
4750: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 54 68 65 72  ...**..**   Ther
4760: 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 77 61  e are several wa
4770: 79 73 20 74 6f 20 61 70 70 72 6f 61 63 68 20 74  ys to approach t
4780: 68 69 73 20 69 6e 20 46 54 53 35 3a 0d 0a 2a 2a  his in FTS5:..**
4790: 0d 0a 2a 2a 20 20 20 3c 6f 6c 3e 3c 6c 69 3e 20  ..**   <ol><li> 
47a0: 42 79 20 6d 61 70 70 69 6e 67 20 61 6c 6c 20 73  By mapping all s
47b0: 79 6e 6f 6e 79 6d 73 20 74 6f 20 61 20 73 69 6e  ynonyms to a sin
47c0: 67 6c 65 20 74 6f 6b 65 6e 2e 20 49 6e 20 74 68  gle token. In th
47d0: 69 73 20 63 61 73 65 2c 20 74 68 65 20 0d 0a 2a  is case, the ..*
47e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 20  *            In 
47f0: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
4800: 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  e, this means th
4810: 61 74 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  at the tokenizer
4820: 20 72 65 74 75 72 6e 73 20 74 68 65 0d 0a 2a 2a   returns the..**
4830: 20 20 20 20 20 20 20 20 20 20 20 20 73 61 6d 65              same
4840: 20 74 6f 6b 65 6e 20 66 6f 72 20 69 6e 70 75 74   token for input
4850: 73 20 22 66 69 72 73 74 22 20 61 6e 64 20 22 31  s "first" and "1
4860: 73 74 22 2e 20 53 61 79 20 74 68 61 74 20 74 6f  st". Say that to
4870: 6b 65 6e 20 69 73 20 69 6e 0d 0a 2a 2a 20 20 20  ken is in..**   
4880: 20 20 20 20 20 20 20 20 20 66 61 63 74 20 22 66           fact "f
4890: 69 72 73 74 22 2c 20 73 6f 20 74 68 61 74 20 77  irst", so that w
48a0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 69 6e 73  hen the user ins
48b0: 65 72 74 73 20 74 68 65 20 64 6f 63 75 6d 65 6e  erts the documen
48c0: 74 20 22 49 20 77 6f 6e 0d 0a 2a 2a 20 20 20 20  t "I won..**    
48d0: 20 20 20 20 20 20 20 20 31 73 74 20 70 6c 61 63          1st plac
48e0: 65 22 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  e" entries are a
48f0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
4900: 78 20 66 6f 72 20 74 6f 6b 65 6e 73 20 22 69 22  x for tokens "i"
4910: 2c 20 22 77 6f 6e 22 2c 0d 0a 2a 2a 20 20 20 20  , "won",..**    
4920: 20 20 20 20 20 20 20 20 22 66 69 72 73 74 22 20          "first" 
4930: 61 6e 64 20 22 70 6c 61 63 65 22 2e 20 49 66 20  and "place". If 
4940: 74 68 65 20 75 73 65 72 20 74 68 65 6e 20 71 75  the user then qu
4950: 65 72 69 65 73 20 66 6f 72 20 27 31 73 74 20 2b  eries for '1st +
4960: 20 70 6c 61 63 65 27 2c 0d 0a 2a 2a 20 20 20 20   place',..**    
4970: 20 20 20 20 20 20 20 20 74 68 65 20 74 6f 6b 65          the toke
4980: 6e 69 7a 65 72 20 73 75 62 73 74 69 74 75 74 65  nizer substitute
4990: 73 20 22 66 69 72 73 74 22 20 66 6f 72 20 22 31  s "first" for "1
49a0: 73 74 22 20 61 6e 64 20 74 68 65 20 71 75 65 72  st" and the quer
49b0: 79 20 77 6f 72 6b 73 0d 0a 2a 2a 20 20 20 20 20  y works..**     
49c0: 20 20 20 20 20 20 20 61 73 20 65 78 70 65 63 74         as expect
49d0: 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20  ed...**..**     
49e0: 20 20 3c 6c 69 3e 20 42 79 20 71 75 65 72 79 69    <li> By queryi
49f0: 6e 67 20 74 68 65 20 69 6e 64 65 78 20 66 6f 72  ng the index for
4a00: 20 61 6c 6c 20 73 79 6e 6f 6e 79 6d 73 20 6f 66   all synonyms of
4a10: 20 65 61 63 68 20 71 75 65 72 79 20 74 65 72 6d   each query term
4a20: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
4a30: 73 65 70 61 72 61 74 65 6c 79 2e 20 49 6e 20 74  separately. In t
4a40: 68 69 73 20 63 61 73 65 2c 20 77 68 65 6e 20 74  his case, when t
4a50: 6f 6b 65 6e 69 7a 69 6e 67 20 71 75 65 72 79 20  okenizing query 
4a60: 74 65 78 74 2c 20 74 68 65 0d 0a 2a 2a 20 20 20  text, the..**   
4a70: 20 20 20 20 20 20 20 20 20 74 6f 6b 65 6e 69 7a           tokeniz
4a80: 65 72 20 6d 61 79 20 70 72 6f 76 69 64 65 20 6d  er may provide m
4a90: 75 6c 74 69 70 6c 65 20 73 79 6e 6f 6e 79 6d 73  ultiple synonyms
4aa0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
4ab0: 72 6d 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  rm ..**         
4ac0: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 64 6f     within the do
4ad0: 63 75 6d 65 6e 74 2e 20 46 54 53 35 20 74 68 65  cument. FTS5 the
4ae0: 6e 20 71 75 65 72 69 65 73 20 74 68 65 20 69 6e  n queries the in
4af0: 64 65 78 20 66 6f 72 20 65 61 63 68 20 0d 0a 2a  dex for each ..*
4b00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e  *            syn
4b10: 6f 6e 79 6d 20 69 6e 64 69 76 69 64 75 61 6c 6c  onym individuall
4b20: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
4b30: 66 61 63 65 64 20 77 69 74 68 20 74 68 65 20 71  faced with the q
4b40: 75 65 72 79 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  uery:..**..**   
4b50: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a 20  <codeblock>..** 
4b60: 20 20 20 20 2e 2e 2e 20 4d 41 54 43 48 20 27 66      ... MATCH 'f
4b70: 69 72 73 74 20 70 6c 61 63 65 27 3c 2f 63 6f 64  irst place'</cod
4b80: 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a 0d 0a 2a 2a 20  eblock>..**..** 
4b90: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
4ba0: 6f 6b 65 6e 69 7a 65 72 20 6f 66 66 65 72 73 20  okenizer offers 
4bb0: 62 6f 74 68 20 22 31 73 74 22 20 61 6e 64 20 22  both "1st" and "
4bc0: 66 69 72 73 74 22 20 61 73 20 73 79 6e 6f 6e 79  first" as synony
4bd0: 6d 73 20 66 6f 72 20 74 68 65 0d 0a 2a 2a 20 20  ms for the..**  
4be0: 20 20 20 20 20 20 20 20 20 20 66 69 72 73 74 20            first 
4bf0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 4d 41 54  token in the MAT
4c00: 43 48 20 71 75 65 72 79 20 61 6e 64 20 46 54 53  CH query and FTS
4c10: 35 20 65 66 66 65 63 74 69 76 65 6c 79 20 72 75  5 effectively ru
4c20: 6e 73 20 61 20 71 75 65 72 79 20 0d 0a 2a 2a 20  ns a query ..** 
4c30: 20 20 20 20 20 20 20 20 20 20 20 73 69 6d 69 6c             simil
4c40: 61 72 20 74 6f 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20  ar to:..**..**  
4c50: 20 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a   <codeblock>..**
4c60: 20 20 20 20 20 2e 2e 2e 20 4d 41 54 43 48 20 27       ... MATCH '
4c70: 28 66 69 72 73 74 20 4f 52 20 31 73 74 29 20 70  (first OR 1st) p
4c80: 6c 61 63 65 27 3c 2f 63 6f 64 65 62 6c 6f 63 6b  lace'</codeblock
4c90: 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20  >..**..**       
4ca0: 20 20 20 20 20 65 78 63 65 70 74 20 74 68 61 74       except that
4cb0: 2c 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  , for the purpos
4cc0: 65 73 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  es of auxiliary 
4cd0: 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 65 20 71  functions, the q
4ce0: 75 65 72 79 0d 0a 2a 2a 20 20 20 20 20 20 20 20  uery..**        
4cf0: 20 20 20 20 73 74 69 6c 6c 20 61 70 70 65 61 72      still appear
4d00: 73 20 74 6f 20 63 6f 6e 74 61 69 6e 20 6a 75 73  s to contain jus
4d10: 74 20 74 77 6f 20 70 68 72 61 73 65 73 20 2d 20  t two phrases - 
4d20: 22 28 66 69 72 73 74 20 4f 52 20 31 73 74 29 22  "(first OR 1st)"
4d30: 20 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   ..**           
4d40: 20 62 65 69 6e 67 20 74 72 65 61 74 65 64 20 61   being treated a
4d50: 73 20 61 20 73 69 6e 67 6c 65 20 70 68 72 61 73  s a single phras
4d60: 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20  e...**..**      
4d70: 20 3c 6c 69 3e 20 42 79 20 61 64 64 69 6e 67 20   <li> By adding 
4d80: 6d 75 6c 74 69 70 6c 65 20 73 79 6e 6f 6e 79 6d  multiple synonym
4d90: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
4da0: 65 72 6d 20 74 6f 20 74 68 65 20 46 54 53 20 69  erm to the FTS i
4db0: 6e 64 65 78 2e 0d 0a 2a 2a 20 20 20 20 20 20 20  ndex...**       
4dc0: 20 20 20 20 20 55 73 69 6e 67 20 74 68 69 73 20       Using this 
4dd0: 6d 65 74 68 6f 64 2c 20 77 68 65 6e 20 74 6f 6b  method, when tok
4de0: 65 6e 69 7a 69 6e 67 20 64 6f 63 75 6d 65 6e 74  enizing document
4df0: 20 74 65 78 74 2c 20 74 68 65 20 74 6f 6b 65 6e   text, the token
4e00: 69 7a 65 72 0d 0a 2a 2a 20 20 20 20 20 20 20 20  izer..**        
4e10: 20 20 20 20 70 72 6f 76 69 64 65 73 20 6d 75 6c      provides mul
4e20: 74 69 70 6c 65 20 73 79 6e 6f 6e 79 6d 73 20 66  tiple synonyms f
4e30: 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 2e 20 53  or each token. S
4e40: 6f 20 74 68 61 74 20 77 68 65 6e 20 61 20 0d 0a  o that when a ..
4e50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f  **            do
4e60: 63 75 6d 65 6e 74 20 73 75 63 68 20 61 73 20 22  cument such as "
4e70: 49 20 77 6f 6e 20 66 69 72 73 74 20 70 6c 61 63  I won first plac
4e80: 65 22 20 69 73 20 74 6f 6b 65 6e 69 7a 65 64 2c  e" is tokenized,
4e90: 20 65 6e 74 72 69 65 73 20 61 72 65 0d 0a 2a 2a   entries are..**
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 65              adde
4eb0: 64 20 74 6f 20 74 68 65 20 46 54 53 20 69 6e 64  d to the FTS ind
4ec0: 65 78 20 66 6f 72 20 22 69 22 2c 20 22 77 6f 6e  ex for "i", "won
4ed0: 22 2c 20 22 66 69 72 73 74 22 2c 20 22 31 73 74  ", "first", "1st
4ee0: 22 20 61 6e 64 0d 0a 2a 2a 20 20 20 20 20 20 20  " and..**       
4ef0: 20 20 20 20 20 22 70 6c 61 63 65 22 2e 0d 0a 2a       "place"...*
4f00: 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  *..**           
4f10: 20 54 68 69 73 20 77 61 79 2c 20 65 76 65 6e 20   This way, even 
4f20: 69 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  if the tokenizer
4f30: 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64   does not provid
4f40: 65 20 73 79 6e 6f 6e 79 6d 73 0d 0a 2a 2a 20 20  e synonyms..**  
4f50: 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 74            when t
4f60: 6f 6b 65 6e 69 7a 69 6e 67 20 71 75 65 72 79 20  okenizing query 
4f70: 74 65 78 74 20 28 69 74 20 73 68 6f 75 6c 64 20  text (it should 
4f80: 6e 6f 74 20 2d 20 74 6f 20 64 6f 20 73 6f 20 77  not - to do so w
4f90: 6f 75 6c 64 20 62 65 0d 0a 2a 2a 20 20 20 20 20  ould be..**     
4fa0: 20 20 20 20 20 20 20 69 6e 65 66 66 69 63 69 65         inefficie
4fb0: 6e 74 29 2c 20 69 74 20 64 6f 65 73 6e 27 74 20  nt), it doesn't 
4fc0: 6d 61 74 74 65 72 20 69 66 20 74 68 65 20 75 73  matter if the us
4fd0: 65 72 20 71 75 65 72 69 65 73 20 66 6f 72 20 0d  er queries for .
4fe0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 27  .**            '
4ff0: 66 69 72 73 74 20 2b 20 70 6c 61 63 65 27 20 6f  first + place' o
5000: 72 20 27 31 73 74 20 2b 20 70 6c 61 63 65 27 2c  r '1st + place',
5010: 20 61 73 20 74 68 65 72 65 20 61 72 65 20 65 6e   as there are en
5020: 74 72 69 65 73 20 69 6e 20 74 68 65 0d 0a 2a 2a  tries in the..**
5030: 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53 20              FTS 
5040: 69 6e 64 65 78 20 63 6f 72 72 65 73 70 6f 6e 64  index correspond
5050: 69 6e 67 20 74 6f 20 62 6f 74 68 20 66 6f 72 6d  ing to both form
5060: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  s of the first t
5070: 6f 6b 65 6e 2e 0d 0a 2a 2a 20 20 20 3c 2f 6f 6c  oken...**   </ol
5080: 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 57 68 65 74  >..**..**   Whet
5090: 68 65 72 20 69 74 20 69 73 20 70 61 72 73 69 6e  her it is parsin
50a0: 67 20 64 6f 63 75 6d 65 6e 74 20 6f 72 20 71 75  g document or qu
50b0: 65 72 79 20 74 65 78 74 2c 20 61 6e 79 20 63 61  ery text, any ca
50c0: 6c 6c 20 74 6f 20 78 54 6f 6b 65 6e 20 74 68 61  ll to xToken tha
50d0: 74 0d 0a 2a 2a 20 20 20 73 70 65 63 69 66 69 65  t..**   specifie
50e0: 73 20 61 20 3c 69 3e 74 66 6c 61 67 73 3c 2f 69  s a <i>tflags</i
50f0: 3e 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  > argument with 
5100: 74 68 65 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43  the FTS5_TOKEN_C
5110: 4f 4c 4f 43 41 54 45 44 20 62 69 74 0d 0a 2a 2a  OLOCATED bit..**
5120: 20 20 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64     is considered
5130: 20 74 6f 20 73 75 70 70 6c 79 20 61 20 73 79 6e   to supply a syn
5140: 6f 6e 79 6d 20 66 6f 72 20 74 68 65 20 70 72 65  onym for the pre
5150: 76 69 6f 75 73 20 74 6f 6b 65 6e 2e 20 46 6f 72  vious token. For
5160: 20 65 78 61 6d 70 6c 65 2c 0d 0a 2a 2a 20 20 20   example,..**   
5170: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65  when parsing the
5180: 20 64 6f 63 75 6d 65 6e 74 20 22 49 20 77 6f 6e   document "I won
5190: 20 66 69 72 73 74 20 70 6c 61 63 65 22 2c 20 61   first place", a
51a0: 20 74 6f 6b 65 6e 69 7a 65 72 20 74 68 61 74 20   tokenizer that 
51b0: 73 75 70 70 6f 72 74 73 0d 0a 2a 2a 20 20 20 73  supports..**   s
51c0: 79 6e 6f 6e 79 6d 73 20 77 6f 75 6c 64 20 63 61  ynonyms would ca
51d0: 6c 6c 20 78 54 6f 6b 65 6e 28 29 20 35 20 74 69  ll xToken() 5 ti
51e0: 6d 65 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  mes, as follows:
51f0: 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 3c 63 6f 64 65  ..**..**   <code
5200: 62 6c 6f 63 6b 3e 0d 0a 2a 2a 20 20 20 20 20 20  block>..**      
5210: 20 78 54 6f 6b 65 6e 28 70 43 74 78 2c 20 30 2c   xToken(pCtx, 0,
5220: 20 22 69 22 2c 20 20 20 20 20 20 20 20 20 20 20   "i",           
5230: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 30             1,  0
5240: 2c 20 20 31 29 3b 0d 0a 2a 2a 20 20 20 20 20 20  ,  1);..**      
5250: 20 78 54 6f 6b 65 6e 28 70 43 74 78 2c 20 30 2c   xToken(pCtx, 0,
5260: 20 22 77 6f 6e 22 2c 20 20 20 20 20 20 20 20 20   "won",         
5270: 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 20 32             3,  2
5280: 2c 20 20 35 29 3b 0d 0a 2a 2a 20 20 20 20 20 20  ,  5);..**      
5290: 20 78 54 6f 6b 65 6e 28 70 43 74 78 2c 20 30 2c   xToken(pCtx, 0,
52a0: 20 22 66 69 72 73 74 22 2c 20 20 20 20 20 20 20   "first",       
52b0: 20 20 20 20 20 20 20 20 20 20 20 35 2c 20 20 36             5,  6
52c0: 2c 20 31 31 29 3b 0d 0a 2a 2a 20 20 20 20 20 20  , 11);..**      
52d0: 20 78 54 6f 6b 65 6e 28 70 43 74 78 2c 20 46 54   xToken(pCtx, FT
52e0: 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54  S5_TOKEN_COLOCAT
52f0: 45 44 2c 20 22 31 73 74 22 2c 20 33 2c 20 20 36  ED, "1st", 3,  6
5300: 2c 20 31 31 29 3b 0d 0a 2a 2a 20 20 20 20 20 20  , 11);..**      
5310: 20 78 54 6f 6b 65 6e 28 70 43 74 78 2c 20 30 2c   xToken(pCtx, 0,
5320: 20 22 70 6c 61 63 65 22 2c 20 20 20 20 20 20 20   "place",       
5330: 20 20 20 20 20 20 20 20 20 20 20 35 2c 20 31 32             5, 12
5340: 2c 20 31 37 29 3b 0d 0a 2a 2a 3c 2f 63 6f 64 65  , 17);..**</code
5350: 62 6c 6f 63 6b 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 20  block>..**..**  
5360: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
5370: 74 6f 20 73 70 65 63 69 66 79 20 74 68 65 20 46  to specify the F
5380: 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41  TS5_TOKEN_COLOCA
5390: 54 45 44 20 66 6c 61 67 20 74 68 65 20 66 69 72  TED flag the fir
53a0: 73 74 20 74 69 6d 65 0d 0a 2a 2a 20 20 20 78 54  st time..**   xT
53b0: 6f 6b 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  oken() is called
53c0: 2e 20 4d 75 6c 74 69 70 6c 65 20 73 79 6e 6f 6e  . Multiple synon
53d0: 79 6d 73 20 6d 61 79 20 62 65 20 73 70 65 63 69  yms may be speci
53e0: 66 69 65 64 20 66 6f 72 20 61 20 73 69 6e 67 6c  fied for a singl
53f0: 65 20 74 6f 6b 65 6e 0d 0a 2a 2a 20 20 20 62 79  e token..**   by
5400: 20 6d 61 6b 69 6e 67 20 6d 75 6c 74 69 70 6c 65   making multiple
5410: 20 63 61 6c 6c 73 20 74 6f 20 78 54 6f 6b 65 6e   calls to xToken
5420: 28 46 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f  (FTS5_TOKEN_COLO
5430: 43 41 54 45 44 29 20 69 6e 20 73 65 71 75 65 6e  CATED) in sequen
5440: 63 65 2e 20 0d 0a 2a 2a 20 20 20 54 68 65 72 65  ce. ..**   There
5450: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 74 6f 20   is no limit to 
5460: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
5470: 6e 6f 6e 79 6d 73 20 74 68 61 74 20 6d 61 79 20  nonyms that may 
5480: 62 65 20 70 72 6f 76 69 64 65 64 20 66 6f 72 20  be provided for 
5490: 61 0d 0a 2a 2a 20 20 20 73 69 6e 67 6c 65 20 74  a..**   single t
54a0: 6f 6b 65 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  oken...**..**   
54b0: 49 6e 20 6d 61 6e 79 20 63 61 73 65 73 2c 20 6d  In many cases, m
54c0: 65 74 68 6f 64 20 28 31 29 20 61 62 6f 76 65 20  ethod (1) above 
54d0: 69 73 20 74 68 65 20 62 65 73 74 20 61 70 70 72  is the best appr
54e0: 6f 61 63 68 2e 20 49 74 20 64 6f 65 73 20 6e 6f  oach. It does no
54f0: 74 20 61 64 64 20 0d 0a 2a 2a 20 20 20 65 78 74  t add ..**   ext
5500: 72 61 20 64 61 74 61 20 74 6f 20 74 68 65 20 46  ra data to the F
5510: 54 53 20 69 6e 64 65 78 20 6f 72 20 72 65 71 75  TS index or requ
5520: 69 72 65 20 46 54 53 35 20 74 6f 20 71 75 65 72  ire FTS5 to quer
5530: 79 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 74  y for multiple t
5540: 65 72 6d 73 2c 0d 0a 2a 2a 20 20 20 73 6f 20 69  erms,..**   so i
5550: 74 20 69 73 20 65 66 66 69 63 69 65 6e 74 20 69  t is efficient i
5560: 6e 20 74 65 72 6d 73 20 6f 66 20 64 69 73 6b 20  n terms of disk 
5570: 73 70 61 63 65 20 61 6e 64 20 71 75 65 72 79 20  space and query 
5580: 73 70 65 65 64 2e 20 48 6f 77 65 76 65 72 2c 20  speed. However, 
5590: 69 74 0d 0a 2a 2a 20 20 20 64 6f 65 73 20 6e 6f  it..**   does no
55a0: 74 20 73 75 70 70 6f 72 74 20 70 72 65 66 69 78  t support prefix
55b0: 20 71 75 65 72 69 65 73 20 76 65 72 79 20 77 65   queries very we
55c0: 6c 6c 2e 20 49 66 2c 20 61 73 20 73 75 67 67 65  ll. If, as sugge
55d0: 73 74 65 64 20 61 62 6f 76 65 2c 20 74 68 65 0d  sted above, the.
55e0: 0a 2a 2a 20 20 20 74 6f 6b 65 6e 20 22 66 69 72  .**   token "fir
55f0: 73 74 22 20 69 73 20 73 75 62 73 74 69 74 75 74  st" is substitut
5600: 65 64 20 66 6f 72 20 22 31 73 74 22 20 62 79 20  ed for "1st" by 
5610: 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74  the tokenizer, t
5620: 68 65 6e 20 74 68 65 20 71 75 65 72 79 3a 0d 0a  hen the query:..
5630: 2a 2a 0d 0a 2a 2a 20 20 20 3c 63 6f 64 65 62 6c  **..**   <codebl
5640: 6f 63 6b 3e 0d 0a 2a 2a 20 20 20 20 20 2e 2e 2e  ock>..**     ...
5650: 20 4d 41 54 43 48 20 27 31 73 2a 27 3c 2f 63 6f   MATCH '1s*'</co
5660: 64 65 62 6c 6f 63 6b 3e 0d 0a 2a 2a 0d 0a 2a 2a  deblock>..**..**
5670: 20 20 20 77 69 6c 6c 20 6e 6f 74 20 6d 61 74 63     will not matc
5680: 68 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  h documents that
5690: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 6f 6b   contain the tok
56a0: 65 6e 20 22 31 73 74 22 20 28 61 73 20 74 68 65  en "1st" (as the
56b0: 20 74 6f 6b 65 6e 69 7a 65 72 0d 0a 2a 2a 20 20   tokenizer..**  
56c0: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
56d0: 6f 74 20 6d 61 70 20 22 31 73 22 20 74 6f 20 61  ot map "1s" to a
56e0: 6e 79 20 70 72 65 66 69 78 20 6f 66 20 22 66 69  ny prefix of "fi
56f0: 72 73 74 22 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20  rst")...**..**  
5700: 20 46 6f 72 20 66 75 6c 6c 20 70 72 65 66 69 78   For full prefix
5710: 20 73 75 70 70 6f 72 74 2c 20 6d 65 74 68 6f 64   support, method
5720: 20 28 33 29 20 6d 61 79 20 62 65 20 70 72 65 66   (3) may be pref
5730: 65 72 72 65 64 2e 20 49 6e 20 74 68 69 73 20 63  erred. In this c
5740: 61 73 65 2c 20 0d 0a 2a 2a 20 20 20 62 65 63 61  ase, ..**   beca
5750: 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  use the index co
5760: 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
5770: 6f 72 20 62 6f 74 68 20 22 66 69 72 73 74 22 20  or both "first" 
5780: 61 6e 64 20 22 31 73 74 22 2c 20 70 72 65 66 69  and "1st", prefi
5790: 78 0d 0a 2a 2a 20 20 20 71 75 65 72 69 65 73 20  x..**   queries 
57a0: 73 75 63 68 20 61 73 20 27 66 69 2a 27 20 6f 72  such as 'fi*' or
57b0: 20 27 31 73 2a 27 20 77 69 6c 6c 20 6d 61 74 63   '1s*' will matc
57c0: 68 20 63 6f 72 72 65 63 74 6c 79 2e 20 48 6f 77  h correctly. How
57d0: 65 76 65 72 2c 20 62 65 63 61 75 73 65 0d 0a 2a  ever, because..*
57e0: 2a 20 20 20 65 78 74 72 61 20 65 6e 74 72 69 65  *   extra entrie
57f0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
5800: 68 65 20 46 54 53 20 69 6e 64 65 78 2c 20 74 68  he FTS index, th
5810: 69 73 20 6d 65 74 68 6f 64 20 75 73 65 73 20 6d  is method uses m
5820: 6f 72 65 20 73 70 61 63 65 0d 0a 2a 2a 20 20 20  ore space..**   
5830: 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62  within the datab
5840: 61 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 4d  ase...**..**   M
5850: 65 74 68 6f 64 20 28 32 29 20 6f 66 66 65 72 73  ethod (2) offers
5860: 20 61 20 6d 69 64 70 6f 69 6e 74 20 62 65 74 77   a midpoint betw
5870: 65 65 6e 20 28 31 29 20 61 6e 64 20 28 33 29 2e  een (1) and (3).
5880: 20 55 73 69 6e 67 20 74 68 69 73 20 6d 65 74 68   Using this meth
5890: 6f 64 2c 0d 0a 2a 2a 20 20 20 61 20 71 75 65 72  od,..**   a quer
58a0: 79 20 73 75 63 68 20 61 73 20 27 31 73 2a 27 20  y such as '1s*' 
58b0: 77 69 6c 6c 20 6d 61 74 63 68 20 64 6f 63 75 6d  will match docum
58c0: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
58d0: 6e 20 74 68 65 20 6c 69 74 65 72 61 6c 20 0d 0a  n the literal ..
58e0: 2a 2a 20 20 20 74 6f 6b 65 6e 20 22 31 73 74 22  **   token "1st"
58f0: 2c 20 62 75 74 20 6e 6f 74 20 22 66 69 72 73 74  , but not "first
5900: 22 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  " (assuming the 
5910: 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 6e 6f 74  tokenizer is not
5920: 20 61 62 6c 65 20 74 6f 0d 0a 2a 2a 20 20 20 70   able to..**   p
5930: 72 6f 76 69 64 65 20 73 79 6e 6f 6e 79 6d 73 20  rovide synonyms 
5940: 66 6f 72 20 70 72 65 66 69 78 65 73 29 2e 20 48  for prefixes). H
5950: 6f 77 65 76 65 72 2c 20 61 20 6e 6f 6e 2d 70 72  owever, a non-pr
5960: 65 66 69 78 20 71 75 65 72 79 20 6c 69 6b 65 20  efix query like 
5970: 27 31 73 74 27 0d 0a 2a 2a 20 20 20 77 69 6c 6c  '1st'..**   will
5980: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 22   match against "
5990: 31 73 74 22 20 61 6e 64 20 22 66 69 72 73 74 22  1st" and "first"
59a0: 2e 20 54 68 69 73 20 6d 65 74 68 6f 64 20 64 6f  . This method do
59b0: 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 0d 0a  es not require..
59c0: 2a 2a 20 20 20 65 78 74 72 61 20 64 69 73 6b 20  **   extra disk 
59d0: 73 70 61 63 65 2c 20 61 73 20 6e 6f 20 65 78 74  space, as no ext
59e0: 72 61 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ra entries are a
59f0: 64 64 65 64 20 74 6f 20 74 68 65 20 46 54 53 20  dded to the FTS 
5a00: 69 6e 64 65 78 2e 20 0d 0a 2a 2a 20 20 20 4f 6e  index. ..**   On
5a10: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
5a20: 20 69 74 20 6d 61 79 20 72 65 71 75 69 72 65 20   it may require 
5a30: 6d 6f 72 65 20 43 50 55 20 63 79 63 6c 65 73 20  more CPU cycles 
5a40: 74 6f 20 72 75 6e 20 4d 41 54 43 48 20 71 75 65  to run MATCH que
5a50: 72 69 65 73 2c 0d 0a 2a 2a 20 20 20 61 73 20 73  ries,..**   as s
5a60: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
5a70: 6f 66 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  of the FTS index
5a80: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f   are required fo
5a90: 72 20 65 61 63 68 20 73 79 6e 6f 6e 79 6d 2e 0d  r each synonym..
5aa0: 0a 2a 2a 0d 0a 2a 2a 20 20 20 57 68 65 6e 20 75  .**..**   When u
5ab0: 73 69 6e 67 20 6d 65 74 68 6f 64 73 20 28 32 29  sing methods (2)
5ac0: 20 6f 72 20 28 33 29 2c 20 69 74 20 69 73 20 69   or (3), it is i
5ad0: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 74 68  mportant that th
5ae0: 65 20 74 6f 6b 65 6e 69 7a 65 72 20 6f 6e 6c 79  e tokenizer only
5af0: 0d 0a 2a 2a 20 20 20 70 72 6f 76 69 64 65 20 73  ..**   provide s
5b00: 79 6e 6f 6e 79 6d 73 20 77 68 65 6e 20 74 6f 6b  ynonyms when tok
5b10: 65 6e 69 7a 69 6e 67 20 64 6f 63 75 6d 65 6e 74  enizing document
5b20: 20 74 65 78 74 20 28 6d 65 74 68 6f 64 20 28 32   text (method (2
5b30: 29 29 20 6f 72 20 71 75 65 72 79 0d 0a 2a 2a 20  )) or query..** 
5b40: 20 20 74 65 78 74 20 28 6d 65 74 68 6f 64 20 28    text (method (
5b50: 33 29 29 2c 20 6e 6f 74 20 62 6f 74 68 2e 20 44  3)), not both. D
5b60: 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6e 6f 74  oing so will not
5b70: 20 63 61 75 73 65 20 61 6e 79 20 65 72 72 6f 72   cause any error
5b80: 73 2c 20 62 75 74 20 69 73 0d 0a 2a 2a 20 20 20  s, but is..**   
5b90: 69 6e 65 66 66 69 63 69 65 6e 74 2e 0d 0a 2a 2f  inefficient...*/
5ba0: 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
5bb0: 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 46   Fts5Tokenizer F
5bc0: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 3b 0d 0a 74  ts5Tokenizer;..t
5bd0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 66 74  ypedef struct ft
5be0: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 66 74 73  s5_tokenizer fts
5bf0: 35 5f 74 6f 6b 65 6e 69 7a 65 72 3b 0d 0a 73 74  5_tokenizer;..st
5c00: 72 75 63 74 20 66 74 73 35 5f 74 6f 6b 65 6e 69  ruct fts5_tokeni
5c10: 7a 65 72 20 7b 0d 0a 20 20 69 6e 74 20 28 2a 78  zer {..  int (*x
5c20: 43 72 65 61 74 65 29 28 76 6f 69 64 2a 2c 20 63  Create)(void*, c
5c30: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
5c40: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 46 74 73  g, int nArg, Fts
5c50: 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 2a 70 70 4f  5Tokenizer **ppO
5c60: 75 74 29 3b 0d 0a 20 20 76 6f 69 64 20 28 2a 78  ut);..  void (*x
5c70: 44 65 6c 65 74 65 29 28 46 74 73 35 54 6f 6b 65  Delete)(Fts5Toke
5c80: 6e 69 7a 65 72 2a 29 3b 0d 0a 20 20 69 6e 74 20  nizer*);..  int 
5c90: 28 2a 78 54 6f 6b 65 6e 69 7a 65 29 28 46 74 73  (*xTokenize)(Fts
5ca0: 35 54 6f 6b 65 6e 69 7a 65 72 2a 2c 20 0d 0a 20  5Tokenizer*, .. 
5cb0: 20 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c       void *pCtx,
5cc0: 0d 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ..      int flag
5cd0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
5ce0: 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 54 4f   Mask of FTS5_TO
5cf0: 4b 45 4e 49 5a 45 5f 2a 20 66 6c 61 67 73 20 2a  KENIZE_* flags *
5d00: 2f 0d 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  /..      const c
5d10: 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74 20  har *pText, int 
5d20: 6e 54 65 78 74 2c 20 0d 0a 20 20 20 20 20 20 69  nText, ..      i
5d30: 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28 0d 0a 20  nt (*xToken)(.. 
5d40: 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 74         void *pCt
5d50: 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  x,         /* Co
5d60: 70 79 20 6f 66 20 32 6e 64 20 61 72 67 75 6d 65  py of 2nd argume
5d70: 6e 74 20 74 6f 20 78 54 6f 6b 65 6e 69 7a 65 28  nt to xTokenize(
5d80: 29 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69 6e  ) */..        in
5d90: 74 20 74 66 6c 61 67 73 2c 20 20 20 20 20 20 20  t tflags,       
5da0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
5db0: 35 5f 54 4f 4b 45 4e 5f 2a 20 66 6c 61 67 73 20  5_TOKEN_* flags 
5dc0: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  */..        cons
5dd0: 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
5de0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
5df0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
5e00: 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 20 20 20 20  token */..      
5e10: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
5e20: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
5e30: 20 74 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20   token in bytes 
5e40: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20  */..        int 
5e50: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
5e60: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f  /* Byte offset o
5e70: 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 69  f token within i
5e80: 6e 70 75 74 20 74 65 78 74 20 2a 2f 0d 0a 20 20  nput text */..  
5e90: 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 20 20        int iEnd  
5ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
5eb0: 65 20 6f 66 66 73 65 74 20 6f 66 20 65 6e 64 20  e offset of end 
5ec0: 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
5ed0: 69 6e 70 75 74 20 74 65 78 74 20 2a 2f 0d 0a 20  input text */.. 
5ee0: 20 20 20 20 20 29 0d 0a 20 20 29 3b 0d 0a 7d 3b       )..  );..};
5ef0: 0d 0a 0d 0a 2f 2a 20 46 6c 61 67 73 20 74 68 61  ..../* Flags tha
5f00: 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20  t may be passed 
5f10: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
5f20: 75 6d 65 6e 74 20 74 6f 20 78 54 6f 6b 65 6e 69  ument to xTokeni
5f30: 7a 65 28 29 20 2a 2f 0d 0a 23 64 65 66 69 6e 65  ze() */..#define
5f40: 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 51   FTS5_TOKENIZE_Q
5f50: 55 45 52 59 20 20 20 20 20 30 78 30 30 30 31 0d  UERY     0x0001.
5f60: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 54 4f  .#define FTS5_TO
5f70: 4b 45 4e 49 5a 45 5f 50 52 45 46 49 58 20 20 20  KENIZE_PREFIX   
5f80: 20 30 78 30 30 30 32 0d 0a 23 64 65 66 69 6e 65   0x0002..#define
5f90: 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44   FTS5_TOKENIZE_D
5fa0: 4f 43 55 4d 45 4e 54 20 20 30 78 30 30 30 34 0d  OCUMENT  0x0004.
5fb0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 54 4f  .#define FTS5_TO
5fc0: 4b 45 4e 49 5a 45 5f 41 55 58 20 20 20 20 20 20  KENIZE_AUX      
5fd0: 20 30 78 30 30 30 38 0d 0a 0d 0a 2f 2a 20 46 6c   0x0008..../* Fl
5fe0: 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ags that may be 
5ff0: 70 61 73 73 65 64 20 62 79 20 74 68 65 20 74 6f  passed by the to
6000: 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e  kenizer implemen
6010: 74 61 74 69 6f 6e 20 62 61 63 6b 20 74 6f 20 46  tation back to F
6020: 54 53 35 0d 0a 2a 2a 20 61 73 20 74 68 65 20 74  TS5..** as the t
6030: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
6040: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 78 54   the supplied xT
6050: 6f 6b 65 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 2a  oken callback. *
6060: 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  /..#define FTS5_
6070: 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 20  TOKEN_COLOCATED 
6080: 20 20 20 30 78 30 30 30 31 20 20 20 20 20 20 2f     0x0001      /
6090: 2a 20 53 61 6d 65 20 70 6f 73 69 74 69 6f 6e 20  * Same position 
60a0: 61 73 20 70 72 65 76 2e 20 74 6f 6b 65 6e 20 2a  as prev. token *
60b0: 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 4e 44 20  /..../*..** END 
60c0: 4f 46 20 43 55 53 54 4f 4d 20 54 4f 4b 45 4e 49  OF CUSTOM TOKENI
60d0: 5a 45 52 53 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ZERS..**********
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 2f  ***************/
6120: 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 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 0d 0a  **************..
6170: 2a 2a 20 46 54 53 35 20 45 58 54 45 4e 53 49 4f  ** FTS5 EXTENSIO
6180: 4e 20 52 45 47 49 53 54 52 41 54 49 4f 4e 20 41  N REGISTRATION A
6190: 50 49 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20  PI..*/..typedef 
61a0: 73 74 72 75 63 74 20 66 74 73 35 5f 61 70 69 20  struct fts5_api 
61b0: 66 74 73 35 5f 61 70 69 3b 0d 0a 73 74 72 75 63  fts5_api;..struc
61c0: 74 20 66 74 73 35 5f 61 70 69 20 7b 0d 0a 20 20  t fts5_api {..  
61d0: 69 6e 74 20 69 56 65 72 73 69 6f 6e 3b 20 20 20  int iVersion;   
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61f0: 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 61 6c 77  /* Currently alw
6200: 61 79 73 20 73 65 74 20 74 6f 20 32 20 2a 2f 0d  ays set to 2 */.
6210: 0a 0d 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61  ...  /* Create a
6220: 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 2a   new tokenizer *
6230: 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 43 72 65 61  /..  int (*xCrea
6240: 74 65 54 6f 6b 65 6e 69 7a 65 72 29 28 0d 0a 20  teTokenizer)(.. 
6250: 20 20 20 66 74 73 35 5f 61 70 69 20 2a 70 41 70     fts5_api *pAp
6260: 69 2c 0d 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  i,..    const ch
6270: 61 72 20 2a 7a 4e 61 6d 65 2c 0d 0a 20 20 20 20  ar *zName,..    
6280: 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 0d  void *pContext,.
6290: 0a 20 20 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69  .    fts5_tokeni
62a0: 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c  zer *pTokenizer,
62b0: 0d 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 44 65  ..    void (*xDe
62c0: 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 0d 0a 20  stroy)(void*).. 
62d0: 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 46 69 6e 64   );....  /* Find
62e0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 6f 6b   an existing tok
62f0: 65 6e 69 7a 65 72 20 2a 2f 0d 0a 20 20 69 6e 74  enizer */..  int
6300: 20 28 2a 78 46 69 6e 64 54 6f 6b 65 6e 69 7a 65   (*xFindTokenize
6310: 72 29 28 0d 0a 20 20 20 20 66 74 73 35 5f 61 70  r)(..    fts5_ap
6320: 69 20 2a 70 41 70 69 2c 0d 0a 20 20 20 20 63 6f  i *pApi,..    co
6330: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
6340: 0d 0a 20 20 20 20 76 6f 69 64 20 2a 2a 70 70 43  ..    void **ppC
6350: 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 66 74 73  ontext,..    fts
6360: 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  5_tokenizer *pTo
6370: 6b 65 6e 69 7a 65 72 0d 0a 20 20 29 3b 0d 0a 0d  kenizer..  );...
6380: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e  .  /* Create a n
6390: 65 77 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e  ew auxiliary fun
63a0: 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20  ction */..  int 
63b0: 28 2a 78 43 72 65 61 74 65 46 75 6e 63 74 69 6f  (*xCreateFunctio
63c0: 6e 29 28 0d 0a 20 20 20 20 66 74 73 35 5f 61 70  n)(..    fts5_ap
63d0: 69 20 2a 70 41 70 69 2c 0d 0a 20 20 20 20 63 6f  i *pApi,..    co
63e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
63f0: 0d 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 6f 6e  ..    void *pCon
6400: 74 65 78 74 2c 0d 0a 20 20 20 20 66 74 73 35 5f  text,..    fts5_
6410: 65 78 74 65 6e 73 69 6f 6e 5f 66 75 6e 63 74 69  extension_functi
6420: 6f 6e 20 78 46 75 6e 63 74 69 6f 6e 2c 0d 0a 20  on xFunction,.. 
6430: 20 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72     void (*xDestr
6440: 6f 79 29 28 76 6f 69 64 2a 29 0d 0a 20 20 29 3b  oy)(void*)..  );
6450: 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45  ..};..../*..** E
6460: 4e 44 20 4f 46 20 52 45 47 49 53 54 52 41 54 49  ND OF REGISTRATI
6470: 4f 4e 20 41 50 49 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a  ON 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 2f 0d 0a 0d 0a 23 69 66 64 65 66 20 5f 5f 63  */....#ifdef __c
64d0: 70 6c 75 73 70 6c 75 73 0d 0a 7d 20 20 2f 2a 20  plusplus..}  /* 
64e0: 65 6e 64 20 6f 66 20 74 68 65 20 27 65 78 74 65  end of the 'exte
64f0: 72 6e 20 22 43 22 27 20 62 6c 6f 63 6b 20 2a 2f  rn "C"' block */
6500: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 65 6e 64  ..#endif....#end
6510: 69 66 20 2f 2a 20 5f 46 54 53 35 5f 48 20 2a 2f  if /* _FTS5_H */
6520: 0d 0a 0d 0a 23 6c 69 6e 65 20 31 20 22 66 74 73  ....#line 1 "fts
6530: 35 49 6e 74 2e 68 22 0d 0a 2f 2a 0d 0a 2a 2a 20  5Int.h"../*..** 
6540: 32 30 31 34 20 4d 61 79 20 33 31 0d 0a 2a 2a 0d  2014 May 31..**.
6550: 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64  .** The author d
6560: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
6570: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
6580: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
6590: 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c  e of..** a legal
65a0: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
65b0: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a   a blessing:..**
65c0: 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  ..**    May you 
65d0: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
65e0: 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79  evil...**    May
65f0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
6600: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
6610: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
6620: 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61  thers...**    Ma
6630: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
6640: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
6650: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
6660: 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a  ive...**..******
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 0d 0a 2a 2a 0d 0a 2a 2f  ********..**..*/
66c0: 0d 0a 23 69 66 6e 64 65 66 20 5f 46 54 53 35 49  ..#ifndef _FTS5I
66d0: 4e 54 5f 48 0d 0a 23 64 65 66 69 6e 65 20 5f 46  NT_H..#define _F
66e0: 54 53 35 49 4e 54 5f 48 0d 0a 0d 0a 2f 2a 20 23  TS5INT_H..../* #
66f0: 69 6e 63 6c 75 64 65 20 22 66 74 73 35 2e 68 22  include "fts5.h"
6700: 20 2a 2f 0d 0a 23 69 6e 63 6c 75 64 65 20 22 73   */..#include "s
6710: 71 6c 69 74 65 33 65 78 74 2e 68 22 0d 0a 53 51  qlite3ext.h"..SQ
6720: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6730: 4e 49 54 31 0d 0a 0d 0a 23 69 6e 63 6c 75 64 65  NIT1....#include
6740: 20 3c 73 74 72 69 6e 67 2e 68 3e 0d 0a 23 69 6e   <string.h>..#in
6750: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
6760: 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
6770: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0d  TE_AMALGAMATION.
6780: 0a 0d 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  ...typedef unsig
6790: 6e 65 64 20 63 68 61 72 20 20 75 38 3b 0d 0a 74  ned char  u8;..t
67a0: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
67b0: 69 6e 74 20 20 20 75 33 32 3b 0d 0a 74 79 70 65  int   u32;..type
67c0: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  def unsigned sho
67d0: 72 74 20 75 31 36 3b 0d 0a 74 79 70 65 64 65 66  rt u16;..typedef
67e0: 20 73 68 6f 72 74 20 69 31 36 3b 0d 0a 74 79 70   short i16;..typ
67f0: 65 64 65 66 20 73 71 6c 69 74 65 33 5f 69 6e 74  edef sqlite3_int
6800: 36 34 20 69 36 34 3b 0d 0a 74 79 70 65 64 65 66  64 i64;..typedef
6810: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
6820: 75 36 34 3b 0d 0a 0d 0a 23 69 66 6e 64 65 66 20  u64;....#ifndef 
6830: 41 72 72 61 79 53 69 7a 65 0d 0a 23 20 64 65 66  ArraySize..# def
6840: 69 6e 65 20 41 72 72 61 79 53 69 7a 65 28 78 29  ine ArraySize(x)
6850: 20 28 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 78   ((int)(sizeof(x
6860: 29 20 2f 20 73 69 7a 65 6f 66 28 78 5b 30 5d 29  ) / sizeof(x[0])
6870: 29 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 64  ))..#endif....#d
6880: 65 66 69 6e 65 20 74 65 73 74 63 61 73 65 28 78  efine testcase(x
6890: 29 0d 0a 23 64 65 66 69 6e 65 20 41 4c 57 41 59  )..#define ALWAY
68a0: 53 28 78 29 20 31 0d 0a 23 64 65 66 69 6e 65 20  S(x) 1..#define 
68b0: 4e 45 56 45 52 28 78 29 20 30 0d 0a 0d 0a 23 64  NEVER(x) 0....#d
68c0: 65 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29 20 28  efine MIN(x,y) (
68d0: 28 28 78 29 20 3c 20 28 79 29 29 20 3f 20 28 78  ((x) < (y)) ? (x
68e0: 29 20 3a 20 28 79 29 29 0d 0a 23 64 65 66 69 6e  ) : (y))..#defin
68f0: 65 20 4d 41 58 28 78 2c 79 29 20 28 28 28 78 29  e MAX(x,y) (((x)
6900: 20 3e 20 28 79 29 29 20 3f 20 28 78 29 20 3a 20   > (y)) ? (x) : 
6910: 28 79 29 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43  (y))..../*..** C
6920: 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 74 68 65  onstants for the
6930: 20 6c 61 72 67 65 73 74 20 61 6e 64 20 73 6d 61   largest and sma
6940: 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 36  llest possible 6
6950: 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
6960: 65 67 65 72 73 2e 0d 0a 2a 2f 0d 0a 23 20 64 65  egers...*/..# de
6970: 66 69 6e 65 20 4c 41 52 47 45 53 54 5f 49 4e 54  fine LARGEST_INT
6980: 36 34 20 20 28 30 78 66 66 66 66 66 66 66 66 7c  64  (0xffffffff|
6990: 28 28 28 69 36 34 29 30 78 37 66 66 66 66 66 66  (((i64)0x7ffffff
69a0: 66 29 3c 3c 33 32 29 29 0d 0a 23 20 64 65 66 69  f)<<32))..# defi
69b0: 6e 65 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  ne SMALLEST_INT6
69c0: 34 20 28 28 28 69 36 34 29 2d 31 29 20 2d 20 4c  4 (((i64)-1) - L
69d0: 41 52 47 45 53 54 5f 49 4e 54 36 34 29 0d 0a 0d  ARGEST_INT64)...
69e0: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 54 72  .#endif..../* Tr
69f0: 75 6e 63 61 74 65 20 76 65 72 79 20 6c 6f 6e 67  uncate very long
6a00: 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68 69 73 20   tokens to this 
6a10: 6d 61 6e 79 20 62 79 74 65 73 2e 20 48 61 72 64  many bytes. Hard
6a20: 20 6c 69 6d 69 74 20 69 73 20 0d 0a 2a 2a 20 28   limit is ..** (
6a30: 36 35 35 33 36 2d 31 2d 31 2d 34 2d 39 29 3d 3d  65536-1-1-4-9)==
6a40: 36 35 35 32 31 20 62 79 74 65 73 2e 20 54 68 65  65521 bytes. The
6a50: 20 6c 69 6d 69 74 69 6e 67 20 66 61 63 74 6f 72   limiting factor
6a60: 20 69 73 20 74 68 65 20 31 36 2d 62 69 74 20 6f   is the 16-bit o
6a70: 66 66 73 65 74 0d 0a 2a 2a 20 66 69 65 6c 64 20  ffset..** field 
6a80: 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
6a90: 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
6aa0: 20 6c 65 61 66 20 70 61 67 65 20 28 73 65 65 20   leaf page (see 
6ab0: 66 74 73 35 5f 69 6e 64 65 78 2e 63 29 2e 20 2a  fts5_index.c). *
6ac0: 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  /..#define FTS5_
6ad0: 4d 41 58 5f 54 4f 4b 45 4e 5f 53 49 5a 45 20 33  MAX_TOKEN_SIZE 3
6ae0: 32 37 36 38 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d  2768..../*..** M
6af0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
6b00: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   prefix indexes 
6b10: 6f 6e 20 73 69 6e 67 6c 65 20 46 54 53 35 20 74  on single FTS5 t
6b20: 61 62 6c 65 2e 20 54 68 69 73 20 6d 75 73 74 20  able. This must 
6b30: 62 65 0d 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e  be..** less than
6b40: 20 33 32 2e 20 49 66 20 69 74 20 69 73 20 73 65   32. If it is se
6b50: 74 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 6c 61  t to anything la
6b60: 72 67 65 20 74 68 61 6e 20 74 68 61 74 2c 20 61  rge than that, a
6b70: 6e 20 23 65 72 72 6f 72 0d 0a 2a 2a 20 64 69 72  n #error..** dir
6b80: 65 63 74 69 76 65 20 69 6e 20 66 74 73 35 5f 69  ective in fts5_i
6b90: 6e 64 65 78 2e 63 20 77 69 6c 6c 20 63 61 75 73  ndex.c will caus
6ba0: 65 20 74 68 65 20 62 75 69 6c 64 20 74 6f 20 66  e the build to f
6bb0: 61 69 6c 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e  ail...*/..#defin
6bc0: 65 20 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49  e FTS5_MAX_PREFI
6bd0: 58 5f 49 4e 44 45 58 45 53 20 33 31 0d 0a 0d 0a  X_INDEXES 31....
6be0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46  #define FTS5_DEF
6bf0: 41 55 4c 54 5f 4e 45 41 52 44 49 53 54 20 31 30  AULT_NEARDIST 10
6c00: 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  ..#define FTS5_D
6c10: 45 46 41 55 4c 54 5f 52 41 4e 4b 20 20 20 20 20  EFAULT_RANK     
6c20: 22 62 6d 32 35 22 0d 0a 0d 0a 2f 2a 20 4e 61 6d  "bm25"..../* Nam
6c30: 65 20 6f 66 20 72 61 6e 6b 20 61 6e 64 20 72 6f  e of rank and ro
6c40: 77 69 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0d 0a  wid columns */..
6c50: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 52 41 4e  #define FTS5_RAN
6c60: 4b 5f 4e 41 4d 45 20 22 72 61 6e 6b 22 0d 0a 23  K_NAME "rank"..#
6c70: 64 65 66 69 6e 65 20 46 54 53 35 5f 52 4f 57 49  define FTS5_ROWI
6c80: 44 5f 4e 41 4d 45 20 22 72 6f 77 69 64 22 0d 0a  D_NAME "rowid"..
6c90: 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6ca0: 44 45 42 55 47 0d 0a 23 20 64 65 66 69 6e 65 20  DEBUG..# define 
6cb0: 46 54 53 35 5f 43 4f 52 52 55 50 54 20 73 71 6c  FTS5_CORRUPT sql
6cc0: 69 74 65 33 46 74 73 35 43 6f 72 72 75 70 74 28  ite3Fts5Corrupt(
6cd0: 29 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  )..static int sq
6ce0: 6c 69 74 65 33 46 74 73 35 43 6f 72 72 75 70 74  lite3Fts5Corrupt
6cf0: 28 76 6f 69 64 29 3b 0d 0a 23 65 6c 73 65 0d 0a  (void);..#else..
6d00: 23 20 64 65 66 69 6e 65 20 46 54 53 35 5f 43 4f  # define FTS5_CO
6d10: 52 52 55 50 54 20 53 51 4c 49 54 45 5f 43 4f 52  RRUPT SQLITE_COR
6d20: 52 55 50 54 5f 56 54 41 42 0d 0a 23 65 6e 64 69  RUPT_VTAB..#endi
6d30: 66 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20  f..../*..** The 
6d40: 61 73 73 65 72 74 5f 6e 63 28 29 20 6d 61 63 72  assert_nc() macr
6d50: 6f 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  o is similar to 
6d60: 74 68 65 20 61 73 73 65 72 74 28 29 20 6d 61 63  the assert() mac
6d70: 72 6f 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ro, except that 
6d80: 69 74 0d 0a 2a 2a 20 69 73 20 75 73 65 64 20 66  it..** is used f
6d90: 6f 72 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64  or assert() cond
6da0: 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  itions that are 
6db0: 74 72 75 65 20 6f 6e 6c 79 20 69 66 20 69 74 20  true only if it 
6dc0: 63 61 6e 20 62 65 20 0d 0a 2a 2a 20 67 75 72 61  can be ..** gura
6dd0: 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
6de0: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 63  atabase is not c
6df0: 6f 72 72 75 70 74 2e 0d 0a 2a 2f 0d 0a 23 69 66  orrupt...*/..#if
6e00: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6e10: 0d 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ..extern int sql
6e20: 69 74 65 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65  ite3_fts5_may_be
6e30: 5f 63 6f 72 72 75 70 74 3b 0d 0a 23 20 64 65 66  _corrupt;..# def
6e40: 69 6e 65 20 61 73 73 65 72 74 5f 6e 63 28 78 29  ine assert_nc(x)
6e50: 20 61 73 73 65 72 74 28 73 71 6c 69 74 65 33 5f   assert(sqlite3_
6e60: 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f 72 72  fts5_may_be_corr
6e70: 75 70 74 20 7c 7c 20 28 78 29 29 0d 0a 23 65 6c  upt || (x))..#el
6e80: 73 65 0d 0a 23 20 64 65 66 69 6e 65 20 61 73 73  se..# define ass
6e90: 65 72 74 5f 6e 63 28 78 29 20 61 73 73 65 72 74  ert_nc(x) assert
6ea0: 28 78 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f  (x)..#endif..../
6eb0: 2a 0d 0a 2a 2a 20 41 20 76 65 72 73 69 6f 6e 20  *..** A version 
6ec0: 6f 66 20 6d 65 6d 63 6d 70 28 29 20 74 68 61 74  of memcmp() that
6ed0: 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
6ee0: 61 73 61 6e 20 65 72 72 6f 72 73 20 69 66 20 6f  asan errors if o
6ef0: 6e 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ne of the pointe
6f00: 72 0d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  r..** parameters
6f10: 20 69 73 20 4e 55 4c 4c 20 61 6e 64 20 74 68 65   is NULL and the
6f20: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6f30: 20 74 6f 20 63 6f 6d 70 61 72 65 20 69 73 20 7a   to compare is z
6f40: 65 72 6f 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e  ero...*/..#defin
6f50: 65 20 66 74 73 35 4d 65 6d 63 6d 70 28 73 31 2c  e fts5Memcmp(s1,
6f60: 20 73 32 2c 20 6e 29 20 28 28 6e 29 3d 3d 30 20   s2, n) ((n)==0 
6f70: 3f 20 30 20 3a 20 6d 65 6d 63 6d 70 28 28 73 31  ? 0 : memcmp((s1
6f80: 29 2c 20 28 73 32 29 2c 20 28 6e 29 29 29 0d 0a  ), (s2), (n)))..
6f90: 0d 0a 2f 2a 20 4d 61 72 6b 20 61 20 66 75 6e 63  ../* Mark a func
6fa0: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 61  tion parameter a
6fb0: 73 20 75 6e 75 73 65 64 2c 20 74 6f 20 73 75 70  s unused, to sup
6fc0: 70 72 65 73 73 20 6e 75 69 73 61 6e 63 65 20 63  press nuisance c
6fd0: 6f 6d 70 69 6c 65 72 0d 0a 2a 2a 20 77 61 72 6e  ompiler..** warn
6fe0: 69 6e 67 73 2e 20 2a 2f 0d 0a 23 69 66 6e 64 65  ings. */..#ifnde
6ff0: 66 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 0d 0a  f UNUSED_PARAM..
7000: 23 20 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  # define UNUSED_
7010: 50 41 52 41 4d 28 58 29 20 20 28 76 6f 69 64 29  PARAM(X)  (void)
7020: 28 58 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23  (X)..#endif....#
7030: 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 50 41  ifndef UNUSED_PA
7040: 52 41 4d 32 0d 0a 23 20 64 65 66 69 6e 65 20 55  RAM2..# define U
7050: 4e 55 53 45 44 5f 50 41 52 41 4d 32 28 58 2c 20  NUSED_PARAM2(X, 
7060: 59 29 20 20 28 76 6f 69 64 29 28 58 29 2c 20 28  Y)  (void)(X), (
7070: 76 6f 69 64 29 28 59 29 0d 0a 23 65 6e 64 69 66  void)(Y)..#endif
7080: 0d 0a 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75  ....typedef stru
7090: 63 74 20 46 74 73 35 47 6c 6f 62 61 6c 20 46 74  ct Fts5Global Ft
70a0: 73 35 47 6c 6f 62 61 6c 3b 0d 0a 74 79 70 65 64  s5Global;..typed
70b0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43 6f  ef struct Fts5Co
70c0: 6c 73 65 74 20 46 74 73 35 43 6f 6c 73 65 74 3b  lset Fts5Colset;
70d0: 0d 0a 0d 0a 2f 2a 20 49 66 20 61 20 4e 45 41 52  ..../* If a NEAR
70e0: 28 29 20 63 6c 75 6d 70 20 6f 72 20 70 68 72 61  () clump or phra
70f0: 73 65 20 6d 61 79 20 6f 6e 6c 79 20 6d 61 74 63  se may only matc
7100: 68 20 61 20 73 70 65 63 69 66 69 63 20 73 65 74  h a specific set
7110: 20 6f 66 20 63 6f 6c 75 6d 6e 73 2c 20 0d 0a 2a   of columns, ..*
7120: 2a 20 74 68 65 6e 20 61 6e 20 6f 62 6a 65 63 74  * then an object
7130: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
7140: 67 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  g type is used t
7150: 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 65 74  o record the set
7160: 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 0d 0a 2a 2a   of columns...**
7170: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
7180: 68 65 20 61 69 43 6f 6c 5b 5d 20 61 72 72 61 79  he aiCol[] array
7190: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61   is a column tha
71a0: 74 20 6d 61 79 20 62 65 20 6d 61 74 63 68 65 64  t may be matched
71b0: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 6f  ...**..** This o
71c0: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 62 79  bject is used by
71d0: 20 66 74 73 35 5f 65 78 70 72 2e 63 20 61 6e 64   fts5_expr.c and
71e0: 20 66 74 73 35 5f 69 6e 64 65 78 2e 63 2e 0d 0a   fts5_index.c...
71f0: 2a 2f 0d 0a 73 74 72 75 63 74 20 46 74 73 35 43  */..struct Fts5C
7200: 6f 6c 73 65 74 20 7b 0d 0a 20 20 69 6e 74 20 6e  olset {..  int n
7210: 43 6f 6c 3b 0d 0a 20 20 69 6e 74 20 61 69 43 6f  Col;..  int aiCo
7220: 6c 5b 31 5d 3b 0d 0a 7d 3b 0d 0a 0d 0a 0d 0a 0d  l[1];..};.......
7230: 0a 2f 2a 2a 2a 2a 2a 2a 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 0d 0a 2a 2a  ************..**
7280: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
7290: 64 65 20 69 6e 20 66 74 73 35 5f 63 6f 6e 66 69  de in fts5_confi
72a0: 67 2e 63 2e 20 66 74 73 35 5f 63 6f 6e 66 69 67  g.c. fts5_config
72b0: 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74  .c contains cont
72c0: 61 69 6e 73 20 63 6f 64 65 0d 0a 2a 2a 20 74 6f  ains code..** to
72d0: 20 70 61 72 73 65 20 74 68 65 20 61 72 67 75 6d   parse the argum
72e0: 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74  ents passed to t
72f0: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
7300: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
7310: 74 2e 0d 0a 2a 2f 0d 0a 0d 0a 74 79 70 65 64 65  t...*/....typede
7320: 66 20 73 74 72 75 63 74 20 46 74 73 35 43 6f 6e  f struct Fts5Con
7330: 66 69 67 20 46 74 73 35 43 6f 6e 66 69 67 3b 0d  fig Fts5Config;.
7340: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69 6e 73  .../*..** An ins
7350: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
7360: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
7370: 20 65 6e 63 6f 64 65 73 20 61 6c 6c 20 69 6e 66   encodes all inf
7380: 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 63 61  ormation that ca
7390: 6e 0d 0a 2a 2a 20 62 65 20 67 6c 65 61 6e 65 64  n..** be gleaned
73a0: 20 66 72 6f 6d 20 74 68 65 20 43 52 45 41 54 45   from the CREATE
73b0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
73c0: 74 61 74 65 6d 65 6e 74 2e 0d 0a 2a 2a 0d 0a 2a  tatement...**..*
73d0: 2a 20 41 6e 64 20 61 6c 6c 20 69 6e 66 6f 72 6d  * And all inform
73e0: 61 74 69 6f 6e 20 6c 6f 61 64 65 64 20 66 72 6f  ation loaded fro
73f0: 6d 20 74 68 65 20 25 5f 63 6f 6e 66 69 67 20 74  m the %_config t
7400: 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 6e 41  able...**..** nA
7410: 75 74 6f 6d 65 72 67 65 3a 0d 0a 2a 2a 20 20 20  utomerge:..**   
7420: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62  The minimum numb
7430: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
7440: 68 61 74 20 61 6e 20 61 75 74 6f 2d 6d 65 72 67  hat an auto-merg
7450: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 68 6f 75  e operation shou
7460: 6c 64 0d 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74  ld..**   attempt
7470: 20 74 6f 20 6d 65 72 67 65 20 74 6f 67 65 74 68   to merge togeth
7480: 65 72 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 31  er. A value of 1
7490: 20 73 65 74 73 20 74 68 65 20 6f 62 6a 65 63 74   sets the object
74a0: 20 74 6f 20 75 73 65 20 74 68 65 20 0d 0a 2a 2a   to use the ..**
74b0: 20 20 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20     compile time 
74c0: 64 65 66 61 75 6c 74 2e 20 5a 65 72 6f 20 64 69  default. Zero di
74d0: 73 61 62 6c 65 73 20 61 75 74 6f 2d 6d 65 72 67  sables auto-merg
74e0: 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 0d 0a 2a  e altogether...*
74f0: 2a 0d 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 3a 0d  *..** zContent:.
7500: 0a 2a 2a 0d 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74  .**..** zContent
7510: 52 6f 77 69 64 3a 0d 0a 2a 2a 20 20 20 54 68 65  Rowid:..**   The
7520: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
7530: 6e 74 65 6e 74 5f 72 6f 77 69 64 3d 20 6f 70 74  ntent_rowid= opt
7540: 69 6f 6e 2c 20 69 66 20 6f 6e 65 20 77 61 73 20  ion, if one was 
7550: 73 70 65 63 69 66 69 65 64 2e 20 4f 72 20 0d 0a  specified. Or ..
7560: 2a 2a 20 20 20 74 68 65 20 73 74 72 69 6e 67 20  **   the string 
7570: 22 72 6f 77 69 64 22 20 6f 74 68 65 72 77 69 73  "rowid" otherwis
7580: 65 2e 20 54 68 69 73 20 74 65 78 74 20 69 73 20  e. This text is 
7590: 6e 6f 74 20 71 75 6f 74 65 64 20 2d 20 69 66 20  not quoted - if 
75a0: 69 74 20 69 73 0d 0a 2a 2a 20 20 20 75 73 65 64  it is..**   used
75b0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 53   as part of an S
75c0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 74 20  QL statement it 
75d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 71 75 6f 74  needs to be quot
75e0: 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  ed appropriately
75f0: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 7a 43 6f 6e 74 65  ...**..** zConte
7600: 6e 74 45 78 70 72 6c 69 73 74 3a 0d 0a 2a 2a 0d  ntExprlist:..**.
7610: 0a 2a 2a 20 70 7a 45 72 72 6d 73 67 3a 0d 0a 2a  .** pzErrmsg:..*
7620: 2a 20 20 20 54 68 69 73 20 65 78 69 73 74 73 20  *   This exists 
7630: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f  in order to allo
7640: 77 20 74 68 65 20 66 74 73 35 5f 69 6e 64 65 78  w the fts5_index
7650: 2e 63 20 6d 6f 64 75 6c 65 20 74 6f 20 72 65 74  .c module to ret
7660: 75 72 6e 20 61 20 0d 0a 2a 2a 20 20 20 64 65 63  urn a ..**   dec
7670: 65 6e 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ent error messag
7680: 65 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  e if it encounte
7690: 72 73 20 61 20 66 69 6c 65 2d 66 6f 72 6d 61 74  rs a file-format
76a0: 20 76 65 72 73 69 6f 6e 20 69 74 20 64 6f 65 73   version it does
76b0: 0d 0a 2a 2a 20 20 20 6e 6f 74 20 75 6e 64 65 72  ..**   not under
76c0: 73 74 61 6e 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 62  stand...**..** b
76d0: 43 6f 6c 75 6d 6e 73 69 7a 65 3a 0d 0a 2a 2a 20  Columnsize:..** 
76e0: 20 20 54 72 75 65 20 69 66 20 74 68 65 20 25 5f    True if the %_
76f0: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 69 73  docsize table is
7700: 20 63 72 65 61 74 65 64 2e 0d 0a 2a 2a 0d 0a 2a   created...**..*
7710: 2a 20 62 50 72 65 66 69 78 49 6e 64 65 78 3a 0d  * bPrefixIndex:.
7720: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 6f 6e  .**   This is on
7730: 6c 79 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  ly used for debu
7740: 67 67 69 6e 67 2e 20 49 66 20 73 65 74 20 74 6f  gging. If set to
7750: 20 66 61 6c 73 65 2c 20 61 6e 79 20 70 72 65 66   false, any pref
7760: 69 78 20 69 6e 64 65 78 65 73 0d 0a 2a 2a 20 20  ix indexes..**  
7770: 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 54 68   are ignored. Th
7780: 69 73 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 66  is value is conf
7790: 69 67 75 72 65 64 20 75 73 69 6e 67 3a 0d 0a 2a  igured using:..*
77a0: 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 49 4e 53 45  *..**       INSE
77b0: 52 54 20 49 4e 54 4f 20 74 62 6c 28 74 62 6c 2c  RT INTO tbl(tbl,
77c0: 20 72 61 6e 6b 29 20 56 41 4c 55 45 53 28 27 70   rank) VALUES('p
77d0: 72 65 66 69 78 2d 69 6e 64 65 78 27 2c 20 24 62  refix-index', $b
77e0: 50 72 65 66 69 78 49 6e 64 65 78 29 3b 0d 0a 2a  PrefixIndex);..*
77f0: 2a 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 46 74  *..*/..struct Ft
7800: 73 35 43 6f 6e 66 69 67 20 7b 0d 0a 20 20 73 71  s5Config {..  sq
7810: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7830: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
7840: 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 44 62   */..  char *zDb
7850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7860: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7870: 73 65 20 68 6f 6c 64 69 6e 67 20 46 54 53 20 69  se holding FTS i
7880: 6e 64 65 78 20 28 65 2e 67 2e 20 22 6d 61 69 6e  ndex (e.g. "main
7890: 22 29 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a  ") */..  char *z
78a0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
78b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
78c0: 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f   of FTS index */
78d0: 0d 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  ..  int nCol;   
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7900: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0d 0a 20 20 63   columns */..  c
7910: 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20  har **azCol;    
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7930: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  * Column names *
7940: 2f 0d 0a 20 20 75 38 20 2a 61 62 55 6e 69 6e 64  /..  u8 *abUnind
7950: 65 78 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  exed;           
7960: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
7970: 20 75 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d   unindexed colum
7980: 6e 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 50 72  ns */..  int nPr
7990: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
79a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
79b0: 65 72 20 6f 66 20 70 72 65 66 69 78 20 69 6e 64  er of prefix ind
79c0: 65 78 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a  exes */..  int *
79d0: 61 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  aPrefix;        
79e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
79f0: 7a 65 73 20 69 6e 20 62 79 74 65 73 20 6f 66 20  zes in bytes of 
7a00: 6e 50 72 65 66 69 78 20 70 72 65 66 69 78 20 69  nPrefix prefix i
7a10: 6e 64 65 78 65 73 20 2a 2f 0d 0a 20 20 69 6e 74  ndexes */..  int
7a20: 20 65 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20   eContent;      
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7a40: 41 6e 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 20  An FTS5_CONTENT 
7a50: 76 61 6c 75 65 20 2a 2f 0d 0a 20 20 63 68 61 72  value */..  char
7a60: 20 2a 7a 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20   *zContent;     
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
7a80: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 20  ontent table */ 
7a90: 0d 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  ..  char *zConte
7aa0: 6e 74 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  ntRowid;        
7ab0: 20 20 20 20 2f 2a 20 22 63 6f 6e 74 65 6e 74 5f      /* "content_
7ac0: 72 6f 77 69 64 3d 22 20 6f 70 74 69 6f 6e 20 76  rowid=" option v
7ad0: 61 6c 75 65 20 2a 2f 20 0d 0a 20 20 69 6e 74 20  alue */ ..  int 
7ae0: 62 43 6f 6c 75 6d 6e 73 69 7a 65 3b 20 20 20 20  bColumnsize;    
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22              /* "
7b00: 63 6f 6c 75 6d 6e 73 69 7a 65 3d 22 20 6f 70 74  columnsize=" opt
7b10: 69 6f 6e 20 76 61 6c 75 65 20 28 64 66 6c 74 3d  ion value (dflt=
7b20: 3d 31 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 65 44  =1) */..  int eD
7b30: 65 74 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20  etail;          
7b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
7b50: 35 5f 44 45 54 41 49 4c 5f 58 58 58 20 76 61 6c  5_DETAIL_XXX val
7b60: 75 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a  ue */..  char *z
7b70: 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 3b  ContentExprlist;
7b80: 0d 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ..  Fts5Tokenize
7b90: 72 20 2a 70 54 6f 6b 3b 0d 0a 20 20 66 74 73 35  r *pTok;..  fts5
7ba0: 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b  _tokenizer *pTok
7bb0: 41 70 69 3b 0d 0a 0d 0a 20 20 2f 2a 20 56 61 6c  Api;....  /* Val
7bc0: 75 65 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20  ues loaded from 
7bd0: 74 68 65 20 25 5f 63 6f 6e 66 69 67 20 74 61 62  the %_config tab
7be0: 6c 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 43 6f  le */..  int iCo
7bf0: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
7c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
7c10: 65 6d 65 6e 74 65 64 20 77 68 65 6e 20 25 5f 63  emented when %_c
7c20: 6f 6e 66 69 67 20 69 73 20 6d 6f 64 69 66 69 65  onfig is modifie
7c30: 64 20 2a 2f 0d 0a 20 20 69 6e 74 20 70 67 73 7a  d */..  int pgsz
7c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c50: 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 72 6f          /* Appro
7c60: 78 69 6d 61 74 65 20 70 61 67 65 20 73 69 7a 65  ximate page size
7c70: 20 75 73 65 64 20 69 6e 20 25 5f 64 61 74 61 20   used in %_data 
7c80: 2a 2f 0d 0a 20 20 69 6e 74 20 6e 41 75 74 6f 6d  */..  int nAutom
7c90: 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  erge;           
7ca0: 20 20 20 20 20 20 2f 2a 20 27 61 75 74 6f 6d 65        /* 'autome
7cb0: 72 67 65 27 20 73 65 74 74 69 6e 67 20 2a 2f 0d  rge' setting */.
7cc0: 0a 20 20 69 6e 74 20 6e 43 72 69 73 69 73 4d 65  .  int nCrisisMe
7cd0: 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rge;            
7ce0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
7cf0: 6c 6f 77 65 64 20 73 65 67 6d 65 6e 74 73 20 70  lowed segments p
7d00: 65 72 20 6c 65 76 65 6c 20 2a 2f 0d 0a 20 20 69  er level */..  i
7d10: 6e 74 20 6e 55 73 65 72 6d 65 72 67 65 3b 20 20  nt nUsermerge;  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7d30: 2a 20 27 75 73 65 72 6d 65 72 67 65 27 20 73 65  * 'usermerge' se
7d40: 74 74 69 6e 67 20 2a 2f 0d 0a 20 20 69 6e 74 20  tting */..  int 
7d50: 6e 48 61 73 68 53 69 7a 65 3b 20 20 20 20 20 20  nHashSize;      
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7d70: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 66  ytes of memory f
7d80: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  or in-memory has
7d90: 68 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 52  h */..  char *zR
7da0: 61 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ank;            
7db0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
7dc0: 6f 66 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e  of rank function
7dd0: 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 52 61   */..  char *zRa
7de0: 6e 6b 41 72 67 73 3b 20 20 20 20 20 20 20 20 20  nkArgs;         
7df0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
7e00: 6e 74 73 20 74 6f 20 72 61 6e 6b 20 66 75 6e 63  nts to rank func
7e10: 74 69 6f 6e 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20  tion */....  /* 
7e20: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 70 6f 69  If non-NULL, poi
7e30: 6e 74 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  nts to sqlite3_v
7e40: 74 61 62 2e 62 61 73 65 2e 7a 45 72 72 6d 73 67  tab.base.zErrmsg
7e50: 2e 20 4f 66 74 65 6e 20 4e 55 4c 4c 2e 20 2a 2f  . Often NULL. */
7e60: 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ..  char **pzErr
7e70: 6d 73 67 3b 0d 0a 0d 0a 23 69 66 64 65 66 20 53  msg;....#ifdef S
7e80: 51 4c 49 54 45 5f 44 45 42 55 47 0d 0a 20 20 69  QLITE_DEBUG..  i
7e90: 6e 74 20 62 50 72 65 66 69 78 49 6e 64 65 78 3b  nt bPrefixIndex;
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7eb0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 70 72  * True to use pr
7ec0: 65 66 69 78 2d 69 6e 64 65 78 65 73 20 2a 2f 0d  efix-indexes */.
7ed0: 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 2f  .#endif..};..../
7ee0: 2a 20 43 75 72 72 65 6e 74 20 65 78 70 65 63 74  * Current expect
7ef0: 65 64 20 76 61 6c 75 65 20 6f 66 20 25 5f 63 6f  ed value of %_co
7f00: 6e 66 69 67 20 74 61 62 6c 65 20 27 76 65 72 73  nfig table 'vers
7f10: 69 6f 6e 27 20 66 69 65 6c 64 20 2a 2f 0d 0a 23  ion' field */..#
7f20: 64 65 66 69 6e 65 20 46 54 53 35 5f 43 55 52 52  define FTS5_CURR
7f30: 45 4e 54 5f 56 45 52 53 49 4f 4e 20 34 0d 0a 0d  ENT_VERSION 4...
7f40: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 43 4f  .#define FTS5_CO
7f50: 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 20 20 30  NTENT_NORMAL   0
7f60: 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 43  ..#define FTS5_C
7f70: 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20 20 20 20 20  ONTENT_NONE     
7f80: 31 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  1..#define FTS5_
7f90: 43 4f 4e 54 45 4e 54 5f 45 58 54 45 52 4e 41 4c  CONTENT_EXTERNAL
7fa0: 20 32 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 46 54   2....#define FT
7fb0: 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 20  S5_DETAIL_FULL  
7fc0: 20 20 30 0d 0a 23 64 65 66 69 6e 65 20 46 54 53    0..#define FTS
7fd0: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 20 20  5_DETAIL_NONE   
7fe0: 20 31 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35   1..#define FTS5
7ff0: 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20  _DETAIL_COLUMNS 
8000: 32 0d 0a 0d 0a 0d 0a 0d 0a 73 74 61 74 69 63 20  2........static 
8010: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
8020: 6f 6e 66 69 67 50 61 72 73 65 28 0d 0a 20 20 20  onfigParse(..   
8030: 20 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71   Fts5Global*, sq
8040: 6c 69 74 65 33 2a 2c 20 69 6e 74 2c 20 63 6f 6e  lite3*, int, con
8050: 73 74 20 63 68 61 72 20 2a 2a 2c 20 46 74 73 35  st char **, Fts5
8060: 43 6f 6e 66 69 67 2a 2a 2c 20 63 68 61 72 2a 2a  Config**, char**
8070: 0d 0a 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69  ..);..static voi
8080: 64 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  d sqlite3Fts5Con
8090: 66 69 67 46 72 65 65 28 46 74 73 35 43 6f 6e 66  figFree(Fts5Conf
80a0: 69 67 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20  ig*);....static 
80b0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
80c0: 6f 6e 66 69 67 44 65 63 6c 61 72 65 56 74 61 62  onfigDeclareVtab
80d0: 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f  (Fts5Config *pCo
80e0: 6e 66 69 67 29 3b 0d 0a 0d 0a 73 74 61 74 69 63  nfig);....static
80f0: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
8100: 54 6f 6b 65 6e 69 7a 65 28 0d 0a 20 20 46 74 73  Tokenize(..  Fts
8110: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
8120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
8130: 46 54 53 35 20 43 6f 6e 66 69 67 75 72 61 74 69  FTS5 Configurati
8140: 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20  on object */..  
8150: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 2f 2a 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45  /* FTS5_TOKENIZE
8180: 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 63  _* flags */..  c
8190: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 78 74  onst char *pText
81a0: 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20 20 20 2f  , int nText,   /
81b0: 2a 20 54 65 78 74 20 74 6f 20 74 6f 6b 65 6e 69  * Text to tokeni
81c0: 7a 65 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 70  ze */..  void *p
81d0: 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
81e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
81f0: 65 78 74 20 70 61 73 73 65 64 20 74 6f 20 78 54  ext passed to xT
8200: 6f 6b 65 6e 28 29 20 2a 2f 0d 0a 20 20 69 6e 74  oken() */..  int
8210: 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a   (*xToken)(void*
8220: 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61  , int, const cha
8230: 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e  r*, int, int, in
8240: 74 29 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  t)    /* Callbac
8250: 6b 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 73 74 61 74  k */..);....stat
8260: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
8270: 74 73 35 44 65 71 75 6f 74 65 28 63 68 61 72 20  ts5Dequote(char 
8280: 2a 7a 29 3b 0d 0a 0d 0a 2f 2a 20 4c 6f 61 64 20  *z);..../* Load 
8290: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
82a0: 74 68 65 20 25 5f 63 6f 6e 66 69 67 20 74 61 62  the %_config tab
82b0: 6c 65 20 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  le */..static in
82c0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  t sqlite3Fts5Con
82d0: 66 69 67 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66  figLoad(Fts5Conf
82e0: 69 67 2a 2c 20 69 6e 74 29 3b 0d 0a 0d 0a 2f 2a  ig*, int);..../*
82f0: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
8300: 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 66 69  f a single confi
8310: 67 20 61 74 74 72 69 62 75 74 65 20 2a 2f 0d 0a  g attribute */..
8320: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8330: 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74 56  e3Fts5ConfigSetV
8340: 61 6c 75 65 28 46 74 73 35 43 6f 6e 66 69 67 2a  alue(Fts5Config*
8350: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73  , const char*, s
8360: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 69  qlite3_value*, i
8370: 6e 74 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20  nt*);....static 
8380: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
8390: 6f 6e 66 69 67 50 61 72 73 65 52 61 6e 6b 28 63  onfigParseRank(c
83a0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 63 68 61 72  onst char*, char
83b0: 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0d 0a 0d 0a  **, char**);....
83c0: 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  /*..** End of in
83d0: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
83e0: 69 6e 20 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63  in fts5_config.c
83f0: 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ...*************
8400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a  *************/..
8440: 0d 0a 2f 2a 2a 2a 2a 2a 2a 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 0d 0a 2a  *************..*
8490: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63  * Interface to c
84a0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 62 75 66 66  ode in fts5_buff
84b0: 65 72 2e 63 2e 0d 0a 2a 2f 0d 0a 0d 0a 2f 2a 0d  er.c...*/..../*.
84c0: 0a 2a 2a 20 42 75 66 66 65 72 20 6f 62 6a 65 63  .** Buffer objec
84d0: 74 20 66 6f 72 20 74 68 65 20 69 6e 63 72 65 6d  t for the increm
84e0: 65 6e 74 61 6c 20 62 75 69 6c 64 69 6e 67 20 6f  ental building o
84f0: 66 20 73 74 72 69 6e 67 20 64 61 74 61 2e 0d 0a  f string data...
8500: 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75  */..typedef stru
8510: 63 74 20 46 74 73 35 42 75 66 66 65 72 20 46 74  ct Fts5Buffer Ft
8520: 73 35 42 75 66 66 65 72 3b 0d 0a 73 74 72 75 63  s5Buffer;..struc
8530: 74 20 46 74 73 35 42 75 66 66 65 72 20 7b 0d 0a  t Fts5Buffer {..
8540: 20 20 75 38 20 2a 70 3b 0d 0a 20 20 69 6e 74 20    u8 *p;..  int 
8550: 6e 3b 0d 0a 20 20 69 6e 74 20 6e 53 70 61 63 65  n;..  int nSpace
8560: 3b 0d 0a 7d 3b 0d 0a 0d 0a 73 74 61 74 69 63 20  ;..};....static 
8570: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 42  int sqlite3Fts5B
8580: 75 66 66 65 72 53 69 7a 65 28 69 6e 74 2a 2c 20  ufferSize(int*, 
8590: 46 74 73 35 42 75 66 66 65 72 2a 2c 20 75 33 32  Fts5Buffer*, u32
85a0: 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  );..static void 
85b0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
85c0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 69 6e  rAppendVarint(in
85d0: 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c  t*, Fts5Buffer*,
85e0: 20 69 36 34 29 3b 0d 0a 73 74 61 74 69 63 20 76   i64);..static v
85f0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
8600: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
8610: 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72  int*, Fts5Buffer
8620: 2a 2c 20 75 33 32 2c 20 63 6f 6e 73 74 20 75 38  *, u32, const u8
8630: 2a 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  *);..static void
8640: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
8650: 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28 69  erAppendString(i
8660: 6e 74 20 2a 2c 20 46 74 73 35 42 75 66 66 65 72  nt *, Fts5Buffer
8670: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
8680: 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  ..static void sq
8690: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
86a0: 72 65 65 28 46 74 73 35 42 75 66 66 65 72 2a 29  ree(Fts5Buffer*)
86b0: 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  ;..static void s
86c0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
86d0: 5a 65 72 6f 28 46 74 73 35 42 75 66 66 65 72 2a  Zero(Fts5Buffer*
86e0: 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  );..static void 
86f0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
8700: 72 53 65 74 28 69 6e 74 2a 2c 20 46 74 73 35 42  rSet(int*, Fts5B
8710: 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e  uffer*, int, con
8720: 73 74 20 75 38 2a 29 3b 0d 0a 73 74 61 74 69 63  st u8*);..static
8730: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
8740: 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
8750: 6e 74 66 28 69 6e 74 20 2a 2c 20 46 74 73 35 42  ntf(int *, Fts5B
8760: 75 66 66 65 72 2a 2c 20 63 68 61 72 20 2a 7a 46  uffer*, char *zF
8770: 6d 74 2c 20 2e 2e 2e 29 3b 0d 0a 0d 0a 73 74 61  mt, ...);....sta
8780: 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65  tic char *sqlite
8790: 33 46 74 73 35 4d 70 72 69 6e 74 66 28 69 6e 74  3Fts5Mprintf(int
87a0: 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61   *pRc, const cha
87b0: 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0d 0a  r *zFmt, ...);..
87c0: 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
87d0: 66 66 65 72 5a 65 72 6f 28 78 29 20 20 20 20 20  fferZero(x)     
87e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
87f0: 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 78 29  ts5BufferZero(x)
8800: 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
8810: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8820: 28 61 2c 62 2c 63 29 20 73 71 6c 69 74 65 33 46  (a,b,c) sqlite3F
8830: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8840: 61 72 69 6e 74 28 61 2c 62 2c 63 29 0d 0a 23 64  arint(a,b,c)..#d
8850: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
8860: 46 72 65 65 28 61 29 20 20 20 20 20 20 20 20 20  Free(a)         
8870: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
8880: 75 66 66 65 72 46 72 65 65 28 61 29 0d 0a 23 64  ufferFree(a)..#d
8890: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
88a0: 41 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c 63  AppendBlob(a,b,c
88b0: 2c 64 29 20 73 71 6c 69 74 65 33 46 74 73 35 42  ,d) sqlite3Fts5B
88c0: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
88d0: 61 2c 62 2c 63 2c 64 29 0d 0a 23 64 65 66 69 6e  a,b,c,d)..#defin
88e0: 65 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28  e fts5BufferSet(
88f0: 61 2c 62 2c 63 2c 64 29 20 20 20 20 20 20 20 20  a,b,c,d)        
8900: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
8910: 72 53 65 74 28 61 2c 62 2c 63 2c 64 29 0d 0a 0d  rSet(a,b,c,d)...
8920: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66  .#define fts5Buf
8930: 66 65 72 47 72 6f 77 28 70 52 63 2c 70 42 75 66  ferGrow(pRc,pBuf
8940: 2c 6e 6e 29 20 28 20 5c 0d 0a 20 20 28 75 33 32  ,nn) ( \..  (u32
8950: 29 28 28 70 42 75 66 29 2d 3e 6e 29 20 2b 20 28  )((pBuf)->n) + (
8960: 75 33 32 29 28 6e 6e 29 20 3c 3d 20 28 75 33 32  u32)(nn) <= (u32
8970: 29 28 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  )((pBuf)->nSpace
8980: 29 20 3f 20 30 20 3a 20 5c 0d 0a 20 20 20 20 73  ) ? 0 : \..    s
8990: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
89a0: 53 69 7a 65 28 28 70 52 63 29 2c 28 70 42 75 66  Size((pRc),(pBuf
89b0: 29 2c 28 6e 6e 29 2b 28 70 42 75 66 29 2d 3e 6e  ),(nn)+(pBuf)->n
89c0: 29 20 5c 0d 0a 29 0d 0a 0d 0a 2f 2a 20 57 72 69  ) \..)..../* Wri
89d0: 74 65 20 61 6e 64 20 64 65 63 6f 64 65 20 62 69  te and decode bi
89e0: 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 20  g-endian 32-bit 
89f0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 2a  integer values *
8a00: 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  /..static void s
8a10: 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
8a20: 75 38 2a 2c 20 69 6e 74 29 3b 0d 0a 73 74 61 74  u8*, int);..stat
8a30: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
8a40: 73 35 47 65 74 33 32 28 63 6f 6e 73 74 20 75 38  s5Get32(const u8
8a50: 2a 29 3b 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 46  *);....#define F
8a60: 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69  TS5_POS2COLUMN(i
8a70: 50 6f 73 29 20 28 69 6e 74 29 28 69 50 6f 73 20  Pos) (int)(iPos 
8a80: 3e 3e 20 33 32 29 0d 0a 23 64 65 66 69 6e 65 20  >> 32)..#define 
8a90: 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28  FTS5_POS2OFFSET(
8aa0: 69 50 6f 73 29 20 28 69 6e 74 29 28 69 50 6f 73  iPos) (int)(iPos
8ab0: 20 26 20 30 78 37 46 46 46 46 46 46 46 29 0d 0a   & 0x7FFFFFFF)..
8ac0: 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
8ad0: 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
8ae0: 65 72 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65  er Fts5PoslistRe
8af0: 61 64 65 72 3b 0d 0a 73 74 72 75 63 74 20 46 74  ader;..struct Ft
8b00: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
8b10: 7b 0d 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  {..  /* Variable
8b20: 73 20 75 73 65 64 20 6f 6e 6c 79 20 62 79 20 73  s used only by s
8b30: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
8b40: 74 49 74 65 72 58 58 58 28 29 20 66 75 6e 63 74  tIterXXX() funct
8b50: 69 6f 6e 73 2e 20 2a 2f 0d 0a 20 20 63 6f 6e 73  ions. */..  cons
8b60: 74 20 75 38 20 2a 61 3b 20 20 20 20 20 20 20 20  t u8 *a;        
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8b80: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 6f 20  osition list to 
8b90: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
8ba0: 2a 2f 0d 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  */..  int n;    
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8bd0: 20 62 75 66 66 65 72 20 61 74 20 61 5b 5d 20 69   buffer at a[] i
8be0: 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20 69 6e  n bytes */..  in
8bf0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c10: 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   Current offset 
8c20: 69 6e 20 61 5b 5d 20 2a 2f 0d 0a 0d 0a 20 20 75  in a[] */....  u
8c30: 38 20 62 46 6c 61 67 3b 20 20 20 20 20 20 20 20  8 bFlag;        
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c50: 2a 20 46 6f 72 20 63 6c 69 65 6e 74 20 75 73 65  * For client use
8c60: 20 28 61 6e 79 20 63 75 73 74 6f 6d 20 70 75 72   (any custom pur
8c70: 70 6f 73 65 29 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a  pose) */....  /*
8c80: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
8c90: 73 20 2a 2f 0d 0a 20 20 75 38 20 62 45 6f 66 3b  s */..  u8 bEof;
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
8cc0: 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  o true at EOF */
8cd0: 0d 0a 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20  ..  i64 iPos;   
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 20 20 20 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33 32      /* (iCol<<32
8d00: 29 20 2b 20 69 50 6f 73 20 2a 2f 0d 0a 7d 3b 0d  ) + iPos */..};.
8d10: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8d20: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
8d30: 61 64 65 72 49 6e 69 74 28 0d 0a 20 20 63 6f 6e  aderInit(..  con
8d40: 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c  st u8 *a, int n,
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d60: 50 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 74  Poslist buffer t
8d70: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
8d80: 68 20 2a 2f 0d 0a 20 20 46 74 73 35 50 6f 73 6c  h */..  Fts5Posl
8d90: 69 73 74 52 65 61 64 65 72 20 2a 70 49 74 65 72  istReader *pIter
8da0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
8db0: 74 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 69 6e  tor object to in
8dc0: 69 74 69 61 6c 69 7a 65 20 2a 2f 0d 0a 29 3b 0d  itialize */..);.
8dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8de0: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
8df0: 61 64 65 72 4e 65 78 74 28 46 74 73 35 50 6f 73  aderNext(Fts5Pos
8e00: 6c 69 73 74 52 65 61 64 65 72 2a 29 3b 0d 0a 0d  listReader*);...
8e10: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
8e20: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
8e30: 72 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69  r Fts5PoslistWri
8e40: 74 65 72 3b 0d 0a 73 74 72 75 63 74 20 46 74 73  ter;..struct Fts
8e50: 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 7b  5PoslistWriter {
8e60: 0d 0a 20 20 69 36 34 20 69 50 72 65 76 3b 0d 0a  ..  i64 iPrev;..
8e70: 7d 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  };..static int s
8e80: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
8e90: 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 46 74  tWriterAppend(Ft
8ea0: 73 35 42 75 66 66 65 72 2a 2c 20 46 74 73 35 50  s5Buffer*, Fts5P
8eb0: 6f 73 6c 69 73 74 57 72 69 74 65 72 2a 2c 20 69  oslistWriter*, i
8ec0: 36 34 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69  64);..static voi
8ed0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  d sqlite3Fts5Pos
8ee0: 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 46  listSafeAppend(F
8ef0: 74 73 35 42 75 66 66 65 72 2a 2c 20 69 36 34 2a  ts5Buffer*, i64*
8f00: 2c 20 69 36 34 29 3b 0d 0a 0d 0a 73 74 61 74 69  , i64);....stati
8f10: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
8f20: 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 0d  5PoslistNext64(.
8f30: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  .  const u8 *a, 
8f40: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
8f50: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
8f60: 74 61 69 6e 69 6e 67 20 70 6f 73 6c 69 73 74 20  taining poslist 
8f70: 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 69 2c 20 20  */..  int *pi,  
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
8fa0: 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 61   Offset within a
8fb0: 5b 5d 20 2a 2f 0d 0a 20 20 69 36 34 20 2a 70 69  [] */..  i64 *pi
8fc0: 4f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Off             
8fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
8fe0: 55 54 3a 20 43 75 72 72 65 6e 74 20 6f 66 66 73  UT: Current offs
8ff0: 65 74 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 20  et */..);..../* 
9000: 4d 61 6c 6c 6f 63 20 75 74 69 6c 69 74 79 20 2a  Malloc utility *
9010: 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  /..static void *
9020: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
9030: 63 5a 65 72 6f 28 69 6e 74 20 2a 70 52 63 2c 20  cZero(int *pRc, 
9040: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
9050: 79 74 65 29 3b 0d 0a 73 74 61 74 69 63 20 63 68  yte);..static ch
9060: 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 53  ar *sqlite3Fts5S
9070: 74 72 6e 64 75 70 28 69 6e 74 20 2a 70 52 63 2c  trndup(int *pRc,
9080: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e   const char *pIn
9090: 2c 20 69 6e 74 20 6e 49 6e 29 3b 0d 0a 0d 0a 2f  , int nIn);..../
90a0: 2a 20 43 68 61 72 61 63 74 65 72 20 73 65 74 20  * Character set 
90b0: 74 65 73 74 73 20 28 6c 69 6b 65 20 69 73 73 70  tests (like issp
90c0: 61 63 65 28 29 2c 20 69 73 61 6c 70 68 61 28 29  ace(), isalpha()
90d0: 20 65 74 63 2e 29 20 2a 2f 0d 0a 73 74 61 74 69   etc.) */..stati
90e0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
90f0: 35 49 73 42 61 72 65 77 6f 72 64 28 63 68 61 72  5IsBareword(char
9100: 20 74 29 3b 0d 0a 0d 0a 0d 0a 2f 2a 20 42 75 63   t);....../* Buc
9110: 6b 65 74 20 6f 66 20 74 65 72 6d 73 20 6f 62 6a  ket of terms obj
9120: 65 63 74 20 75 73 65 64 20 62 79 20 74 68 65 20  ect used by the 
9130: 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
9140: 69 6e 20 6f 66 66 73 65 74 73 3d 30 20 6d 6f 64  in offsets=0 mod
9150: 65 2e 20 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73  e. */..typedef s
9160: 74 72 75 63 74 20 46 74 73 35 54 65 72 6d 73 65  truct Fts5Termse
9170: 74 20 46 74 73 35 54 65 72 6d 73 65 74 3b 0d 0a  t Fts5Termset;..
9180: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
9190: 65 33 46 74 73 35 54 65 72 6d 73 65 74 4e 65 77  e3Fts5TermsetNew
91a0: 28 46 74 73 35 54 65 72 6d 73 65 74 2a 2a 29 3b  (Fts5Termset**);
91b0: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
91c0: 69 74 65 33 46 74 73 35 54 65 72 6d 73 65 74 41  ite3Fts5TermsetA
91d0: 64 64 28 46 74 73 35 54 65 72 6d 73 65 74 2a 2c  dd(Fts5Termset*,
91e0: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72   int, const char
91f0: 2a 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 70 62 50  *, int, int *pbP
9200: 72 65 73 65 6e 74 29 3b 0d 0a 73 74 61 74 69 63  resent);..static
9210: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
9220: 35 54 65 72 6d 73 65 74 46 72 65 65 28 46 74 73  5TermsetFree(Fts
9230: 35 54 65 72 6d 73 65 74 2a 29 3b 0d 0a 0d 0a 2f  5Termset*);..../
9240: 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  *..** End of int
9250: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
9260: 6e 20 66 74 73 35 5f 62 75 66 66 65 72 2e 63 2e  n fts5_buffer.c.
9270: 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
9280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d  ************/...
92c0: 0a 2f 2a 2a 2a 2a 2a 2a 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 0d 0a 2a 2a  ************..**
9310: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
9320: 64 65 20 69 6e 20 66 74 73 35 5f 69 6e 64 65 78  de in fts5_index
9330: 2e 63 2e 20 66 74 73 35 5f 69 6e 64 65 78 2e 63  .c. fts5_index.c
9340: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69   contains contai
9350: 6e 73 20 63 6f 64 65 0d 0a 2a 2a 20 74 6f 20 61  ns code..** to a
9360: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 20 73  ccess the data s
9370: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f 64  tored in the %_d
9380: 61 74 61 20 74 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a  ata table...*/..
9390: 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
93a0: 20 46 74 73 35 49 6e 64 65 78 20 46 74 73 35 49   Fts5Index Fts5I
93b0: 6e 64 65 78 3b 0d 0a 74 79 70 65 64 65 66 20 73  ndex;..typedef s
93c0: 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 49  truct Fts5IndexI
93d0: 74 65 72 20 46 74 73 35 49 6e 64 65 78 49 74 65  ter Fts5IndexIte
93e0: 72 3b 0d 0a 0d 0a 73 74 72 75 63 74 20 46 74 73  r;....struct Fts
93f0: 35 49 6e 64 65 78 49 74 65 72 20 7b 0d 0a 20 20  5IndexIter {..  
9400: 69 36 34 20 69 52 6f 77 69 64 3b 0d 0a 20 20 63  i64 iRowid;..  c
9410: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 3b 0d  onst u8 *pData;.
9420: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0d 0a 20  .  int nData;.. 
9430: 20 75 38 20 62 45 6f 66 3b 0d 0a 7d 3b 0d 0a 0d   u8 bEof;..};...
9440: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
9450: 46 74 73 35 49 74 65 72 45 6f 66 28 78 29 20 28  Fts5IterEof(x) (
9460: 28 78 29 2d 3e 62 45 6f 66 29 0d 0a 0d 0a 2f 2a  (x)->bEof)..../*
9470: 0d 0a 2a 2a 20 56 61 6c 75 65 73 20 75 73 65 64  ..** Values used
9480: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
9490: 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 70  flags argument p
94a0: 61 73 73 65 64 20 74 6f 20 49 6e 64 65 78 51 75  assed to IndexQu
94b0: 65 72 79 28 29 2e 0d 0a 2a 2f 0d 0a 23 64 65 66  ery()...*/..#def
94c0: 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  ine FTS5INDEX_QU
94d0: 45 52 59 5f 50 52 45 46 49 58 20 20 20 20 20 30  ERY_PREFIX     0
94e0: 78 30 30 30 31 20 20 20 2f 2a 20 50 72 65 66 69  x0001   /* Prefi
94f0: 78 20 71 75 65 72 79 20 2a 2f 0d 0a 23 64 65 66  x query */..#def
9500: 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  ine FTS5INDEX_QU
9510: 45 52 59 5f 44 45 53 43 20 20 20 20 20 20 20 30  ERY_DESC       0
9520: 78 30 30 30 32 20 20 20 2f 2a 20 44 6f 63 73 20  x0002   /* Docs 
9530: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  in descending ro
9540: 77 69 64 20 6f 72 64 65 72 20 2a 2f 0d 0a 23 64  wid order */..#d
9550: 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f  efine FTS5INDEX_
9560: 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
9570: 20 30 78 30 30 30 34 20 20 20 2f 2a 20 44 6f 20   0x0004   /* Do 
9580: 6e 6f 74 20 75 73 65 20 70 72 65 66 69 78 20 69  not use prefix i
9590: 6e 64 65 78 20 2a 2f 0d 0a 23 64 65 66 69 6e 65  ndex */..#define
95a0: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
95b0: 5f 53 43 41 4e 20 20 20 20 20 20 20 30 78 30 30  _SCAN       0x00
95c0: 30 38 20 20 20 2f 2a 20 53 63 61 6e 20 71 75 65  08   /* Scan que
95d0: 72 79 20 28 66 74 73 35 76 6f 63 61 62 29 20 2a  ry (fts5vocab) *
95e0: 2f 0d 0a 0d 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  /..../* The foll
95f0: 6f 77 69 6e 67 20 61 72 65 20 75 73 65 64 20 69  owing are used i
9600: 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 65  nternally by the
9610: 20 66 74 73 35 5f 69 6e 64 65 78 2e 63 20 6d 6f   fts5_index.c mo
9620: 64 75 6c 65 2e 20 54 68 65 79 20 61 72 65 0d 0a  dule. They are..
9630: 2a 2a 20 64 65 66 69 6e 65 64 20 68 65 72 65 20  ** defined here 
9640: 6f 6e 6c 79 20 74 6f 20 6d 61 6b 65 20 69 74 20  only to make it 
9650: 65 61 73 69 65 72 20 74 6f 20 61 76 6f 69 64 20  easier to avoid 
9660: 63 6c 61 73 68 65 73 20 77 69 74 68 20 74 68 65  clashes with the
9670: 20 66 6c 61 67 73 0d 0a 2a 2a 20 61 62 6f 76 65   flags..** above
9680: 2e 20 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46 54  . */..#define FT
9690: 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b  S5INDEX_QUERY_SK
96a0: 49 50 45 4d 50 54 59 20 20 30 78 30 30 31 30 0d  IPEMPTY  0x0010.
96b0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44  .#define FTS5IND
96c0: 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55  EX_QUERY_NOOUTPU
96d0: 54 20 20 20 30 78 30 30 32 30 0d 0a 0d 0a 2f 2a  T   0x0020..../*
96e0: 0d 0a 2a 2a 20 43 72 65 61 74 65 2f 64 65 73 74  ..** Create/dest
96f0: 72 6f 79 20 61 6e 20 46 74 73 35 49 6e 64 65 78  roy an Fts5Index
9700: 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2f 0d 0a 73 74   object...*/..st
9710: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
9720: 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 46 74  Fts5IndexOpen(Ft
9730: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
9740: 67 2c 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20  g, int bCreate, 
9750: 46 74 73 35 49 6e 64 65 78 2a 2a 2c 20 63 68 61  Fts5Index**, cha
9760: 72 2a 2a 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e  r**);..static in
9770: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
9780: 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  exClose(Fts5Inde
9790: 78 20 2a 70 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  x *p);..../*..**
97a0: 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65   Return a simple
97b0: 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
97c0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67  based on the arg
97d0: 75 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61  uments...*/..sta
97e0: 74 69 63 20 75 36 34 20 73 71 6c 69 74 65 33 46  tic u64 sqlite3F
97f0: 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
9800: 75 6d 28 0d 0a 20 20 69 36 34 20 69 52 6f 77 69  um(..  i64 iRowi
9810: 64 2c 20 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  d, ..  int iCol,
9820: 20 0d 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0d   ..  int iPos, .
9830: 0a 20 20 69 6e 74 20 69 49 64 78 2c 0d 0a 20 20  .  int iIdx,..  
9840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72  const char *pTer
9850: 6d 2c 0d 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0d  m,..  int nTerm.
9860: 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72  .);..../*..** Ar
9870: 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20  gument p points 
9880: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
9890: 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78  aining utf-8 tex
98a0: 74 20 74 68 61 74 20 69 73 20 6e 20 62 79 74 65  t that is n byte
98b0: 73 20 69 6e 20 0d 0a 2a 2a 20 73 69 7a 65 2e 20  s in ..** size. 
98c0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
98d0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
98e0: 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  e nChar characte
98f0: 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 0d  r prefix of the.
9900: 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
9910: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
9920: 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
9930: 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
9940: 6c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69  l...*/..static i
9950: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
9960: 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
9970: 6c 65 6e 28 0d 0a 20 20 63 6f 6e 73 74 20 63 68  len(..  const ch
9980: 61 72 20 2a 70 2c 20 0d 0a 20 20 69 6e 74 20 6e  ar *p, ..  int n
9990: 42 79 74 65 2c 20 0d 0a 20 20 69 6e 74 20 6e 43  Byte, ..  int nC
99a0: 68 61 72 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a  har..);..../*..*
99b0: 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65  * Open a new ite
99c0: 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65  rator to iterate
99d0: 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69   though all rowi
99e0: 64 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  ds that match th
99f0: 65 20 0d 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  e ..** specified
9a00: 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20   token or token 
9a10: 70 72 65 66 69 78 2e 0d 0a 2a 2f 0d 0a 73 74 61  prefix...*/..sta
9a20: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
9a30: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 0d 0a  ts5IndexQuery(..
9a40: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74    /* FTS index t
9a70: 6f 20 71 75 65 72 79 20 2a 2f 0d 0a 20 20 63 6f  o query */..  co
9a80: 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
9a90: 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a  , int nToken, /*
9aa0: 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69   Token (or prefi
9ab0: 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  x) to query for 
9ac0: 2a 2f 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  */..  int flags,
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
9af0: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
9b00: 5f 58 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 46  _X flags */..  F
9b10: 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
9b20: 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
9b30: 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20 63 6f  * Match these co
9b40: 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0d 0a 20  lumns only */.. 
9b50: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
9b60: 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
9b70: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65   /* OUT: New ite
9b80: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0d  rator object */.
9b90: 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68  .);..../*..** Th
9ba0: 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61 74  e various operat
9bb0: 69 6f 6e 73 20 6f 6e 20 6f 70 65 6e 20 74 6f 6b  ions on open tok
9bc0: 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
9bd0: 69 78 20 69 74 65 72 61 74 6f 72 73 20 6f 70 65  ix iterators ope
9be0: 6e 65 64 0d 0a 2a 2a 20 75 73 69 6e 67 20 73 71  ned..** using sq
9bf0: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
9c00: 65 72 79 28 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  ery()...*/..stat
9c10: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
9c20: 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  s5IterNext(Fts5I
9c30: 6e 64 65 78 49 74 65 72 2a 29 3b 0d 0a 73 74 61  ndexIter*);..sta
9c40: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
9c50: 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ts5IterNextFrom(
9c60: 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 2c 20  Fts5IndexIter*, 
9c70: 69 36 34 20 69 4d 61 74 63 68 29 3b 0d 0a 0d 0a  i64 iMatch);....
9c80: 2f 2a 0d 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  /*..** Close an 
9c90: 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20  iterator opened 
9ca0: 62 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  by sqlite3Fts5In
9cb0: 64 65 78 51 75 65 72 79 28 29 2e 0d 0a 2a 2f 0d  dexQuery()...*/.
9cc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
9cd0: 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
9ce0: 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a  e(Fts5IndexIter*
9cf0: 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69  );..../*..** Thi
9d00: 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75  s interface is u
9d10: 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76  sed by the fts5v
9d20: 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0d 0a 2a 2f  ocab module...*/
9d30: 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
9d40: 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35  har *sqlite3Fts5
9d50: 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64  IterTerm(Fts5Ind
9d60: 65 78 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0d  exIter*, int*);.
9d70: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9d80: 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53  te3Fts5IterNextS
9d90: 63 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65  can(Fts5IndexIte
9da0: 72 2a 29 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  r*);....../*..**
9db0: 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76   Insert or remov
9dc0: 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f  e data to or fro
9dd0: 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63  m the index. Eac
9de0: 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e  h time a documen
9df0: 74 20 69 73 20 0d 0a 2a 2a 20 61 64 64 65 64 20  t is ..** added 
9e00: 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
9e10: 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  om the index, th
9e20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
9e30: 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  alled one or mor
9e40: 65 0d 0a 2a 2a 20 74 69 6d 65 73 2e 0d 0a 2a 2a  e..** times...**
9e50: 0d 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  ..** For an inse
9e60: 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
9e70: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
9e80: 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
9e90: 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0d 0a   new document...
9ea0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  ** If the operat
9eb0: 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c  ion is a delete,
9ec0: 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c   it must be call
9ed0: 65 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e  ed (at least) on
9ee0: 63 65 20 66 6f 72 20 65 61 63 68 0d 0a 2a 2a 20  ce for each..** 
9ef0: 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20  unique token in 
9f00: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
9f10: 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20  h an iCol value 
9f20: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20  less than zero. 
9f30: 54 68 65 20 69 50 6f 73 0d 0a 2a 2a 20 61 72 67  The iPos..** arg
9f40: 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64  ument is ignored
9f50: 20 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0d 0a   for a delete...
9f60: 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
9f70: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57  qlite3Fts5IndexW
9f80: 72 69 74 65 28 0d 0a 20 20 46 74 73 35 49 6e 64  rite(..  Fts5Ind
9f90: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
9fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9fb0: 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  x to write to */
9fc0: 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  ..  int iCol,   
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
9ff0: 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28  ken appears in (
a000: 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a  -ve -> delete) *
a010: 2f 0d 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  /..  int iPos,  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
a040: 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
a050: 20 63 6f 6c 75 6d 6e 20 2a 2f 0d 0a 20 20 63 6f   column */..  co
a060: 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
a070: 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
a080: 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
a090: 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
a0a0: 6f 6d 20 69 6e 64 65 78 20 2a 2f 0d 0a 29 3b 0d  om index */..);.
a0b0: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 64 69 63 61  .../*..** Indica
a0c0: 74 65 20 74 68 61 74 20 73 75 62 73 65 71 75 65  te that subseque
a0d0: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
a0e0: 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
a0f0: 65 28 29 20 70 65 72 74 61 69 6e 20 74 6f 0d 0a  e() pertain to..
a100: 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 69 44 6f 63  ** document iDoc
a110: 69 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  id...*/..static 
a120: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
a130: 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 0d  ndexBeginWrite(.
a140: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
a170: 72 69 74 65 20 74 6f 20 2a 2f 0d 0a 20 20 69 6e  rite to */..  in
a180: 74 20 62 44 65 6c 65 74 65 2c 20 20 20 20 20 20  t bDelete,      
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a1a0: 20 54 72 75 65 20 69 66 20 63 75 72 72 65 6e 74   True if current
a1b0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
a1c0: 64 65 6c 65 74 65 20 2a 2f 0d 0a 20 20 69 36 34  delete */..  i64
a1d0: 20 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20   iDocid         
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a1f0: 44 6f 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20  Docid to add or 
a200: 72 65 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d  remove data from
a210: 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a   */..);..../*..*
a220: 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61  * Flush any data
a230: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
a240: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
a250: 62 6c 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  bles to the data
a260: 62 61 73 65 2e 0d 0a 2a 2a 20 41 6c 73 6f 20 63  base...** Also c
a270: 6c 6f 73 65 20 61 6e 79 20 6f 70 65 6e 20 62 6c  lose any open bl
a280: 6f 62 20 68 61 6e 64 6c 65 73 2e 0d 0a 2a 2f 0d  ob handles...*/.
a290: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a2a0: 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63  te3Fts5IndexSync
a2b0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0d  (Fts5Index *p);.
a2c0: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 69 73 63 61 72  .../*..** Discar
a2d0: 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  d any data store
a2e0: 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
a2f0: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ry hash tables. 
a300: 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0d  Do not write it.
a310: 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
a320: 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
a330: 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
a340: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
a350: 68 65 20 25 5f 64 61 74 61 0d 0a 2a 2a 20 74 61  he %_data..** ta
a360: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68 61  ble may have cha
a370: 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  nged on disk. So
a380: 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   any in-memory c
a390: 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20  aches of %_data 
a3a0: 0d 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73  ..** records mus
a3b0: 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  t be invalidated
a3c0: 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
a3d0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
a3e0: 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49  exRollback(Fts5I
a3f0: 6e 64 65 78 20 2a 70 29 3b 0d 0a 0d 0a 2f 2a 0d  ndex *p);..../*.
a400: 0a 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74  .** Get or set t
a410: 68 65 20 22 61 76 65 72 61 67 65 73 22 20 76 61  he "averages" va
a420: 6c 75 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  lues...*/..stati
a430: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
a440: 35 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65  5IndexGetAverage
a450: 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
a460: 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20  i64 *pnRow, i64 
a470: 2a 61 6e 53 69 7a 65 29 3b 0d 0a 73 74 61 74 69  *anSize);..stati
a480: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
a490: 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65  5IndexSetAverage
a4a0: 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
a4b0: 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 3b  const u8*, int);
a4c0: 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 75 6e 63 74  ..../*..** Funct
a4d0: 69 6f 6e 73 20 63 61 6c 6c 65 64 20 62 79 20 74  ions called by t
a4e0: 68 65 20 73 74 6f 72 61 67 65 20 6d 6f 64 75 6c  he storage modul
a4f0: 65 20 61 73 20 70 61 72 74 20 6f 66 20 69 6e 74  e as part of int
a500: 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0d 0a 2a  egrity-check...*
a510: 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  /..static int sq
a520: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
a530: 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73  tegrityCheck(Fts
a540: 35 49 6e 64 65 78 2a 2c 20 75 36 34 20 63 6b 73  5Index*, u64 cks
a550: 75 6d 29 3b 0d 0a 0d 0a 2f 2a 20 0d 0a 2a 2a 20  um);..../* ..** 
a560: 43 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 76 69  Called during vi
a570: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 69 6e 69  rtual module ini
a580: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 20 72  tialization to r
a590: 65 67 69 73 74 65 72 20 55 44 46 20 0d 0a 2a 2a  egister UDF ..**
a5a0: 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 77   fts5_decode() w
a5b0: 69 74 68 20 53 51 4c 69 74 65 20 0d 0a 2a 2f 0d  ith SQLite ..*/.
a5c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a5d0: 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74  te3Fts5IndexInit
a5e0: 28 73 71 6c 69 74 65 33 2a 29 3b 0d 0a 0d 0a 73  (sqlite3*);....s
a5f0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
a600: 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f  3Fts5IndexSetCoo
a610: 6b 69 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  kie(Fts5Index*, 
a620: 69 6e 74 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  int);..../*..** 
a630: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
a640: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
a650: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
a660: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 62 79   %_data table by
a670: 20 0d 0a 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65   ..** this conne
a680: 63 74 69 6f 6e 20 73 69 6e 63 65 20 69 74 20 77  ction since it w
a690: 61 73 20 63 72 65 61 74 65 64 2e 0d 0a 2a 2f 0d  as created...*/.
a6a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a6b0: 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64  te3Fts5IndexRead
a6c0: 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b  s(Fts5Index *p);
a6d0: 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ....static int s
a6e0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
a6f0: 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20  einit(Fts5Index 
a700: 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74  *p);..static int
a710: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
a720: 78 4f 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e  xOptimize(Fts5In
a730: 64 65 78 20 2a 70 29 3b 0d 0a 73 74 61 74 69 63  dex *p);..static
a740: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
a750: 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49  IndexMerge(Fts5I
a760: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65  ndex *p, int nMe
a770: 72 67 65 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e  rge);..static in
a780: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
a790: 65 78 52 65 73 65 74 28 46 74 73 35 49 6e 64 65  exReset(Fts5Inde
a7a0: 78 20 2a 70 29 3b 0d 0a 0d 0a 73 74 61 74 69 63  x *p);....static
a7b0: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
a7c0: 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28  IndexLoadConfig(
a7d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0d 0a  Fts5Index *p);..
a7e0: 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20  ../*..** End of 
a7f0: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  interface to cod
a800: 65 20 69 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e  e in fts5_index.
a810: 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  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 2f 0d  **************/.
a860: 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 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 0d 0a  **************..
a8b0: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
a8c0: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 76 61 72  code in fts5_var
a8d0: 69 6e 74 2e 63 2e 20 0d 0a 2a 2f 0d 0a 73 74 61  int.c. ..*/..sta
a8e0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
a8f0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 63  ts5GetVarint32(c
a900: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
a910: 61 72 20 2a 70 2c 20 75 33 32 20 2a 76 29 3b 0d  ar *p, u32 *v);.
a920: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a930: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
a940: 4c 65 6e 28 75 33 32 20 69 56 61 6c 29 3b 0d 0a  Len(u32 iVal);..
a950: 73 74 61 74 69 63 20 75 38 20 73 71 6c 69 74 65  static u8 sqlite
a960: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 63  3Fts5GetVarint(c
a970: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
a980: 61 72 2a 2c 20 75 36 34 2a 29 3b 0d 0a 73 74 61  ar*, u64*);..sta
a990: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
a9a0: 74 73 35 50 75 74 56 61 72 69 6e 74 28 75 6e 73  ts5PutVarint(uns
a9b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75  igned char *p, u
a9c0: 36 34 20 76 29 3b 0d 0a 0d 0a 23 64 65 66 69 6e  64 v);....#defin
a9d0: 65 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  e fts5GetVarint3
a9e0: 32 28 61 2c 62 29 20 73 71 6c 69 74 65 33 46 74  2(a,b) sqlite3Ft
a9f0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  s5GetVarint32(a,
aa00: 28 75 33 32 2a 29 26 62 29 0d 0a 23 64 65 66 69  (u32*)&b)..#defi
aa10: 6e 65 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  ne fts5GetVarint
aa20: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 47      sqlite3Fts5G
aa30: 65 74 56 61 72 69 6e 74 0d 0a 0d 0a 23 64 65 66  etVarint....#def
aa40: 69 6e 65 20 66 74 73 35 46 61 73 74 47 65 74 56  ine fts5FastGetV
aa50: 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c  arint32(a, iOff,
aa60: 20 6e 56 61 6c 29 20 7b 20 20 20 20 20 20 5c 0d   nVal) {      \.
aa70: 0a 20 20 6e 56 61 6c 20 3d 20 28 61 29 5b 69 4f  .  nVal = (a)[iO
aa80: 66 66 2b 2b 5d 3b 20 20 20 20 20 20 20 20 20 20  ff++];          
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 20 5c 0d 0a 20 20 69 66 28 20 6e 56 61 6c     \..  if( nVal
aab0: 20 26 20 30 78 38 30 20 29 7b 20 20 20 20 20 20   & 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 5c 0d 0a 20 20 20 20 69          \..    i
aae0: 4f 66 66 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Off--;          
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 5c 0d 0a               \..
ab10: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
ab20: 47 65 74 56 61 72 69 6e 74 33 32 28 26 28 61 29  GetVarint32(&(a)
ab30: 5b 69 4f 66 66 5d 2c 20 6e 56 61 6c 29 3b 20 20  [iOff], nVal);  
ab40: 20 20 5c 0d 0a 20 20 7d 20 20 20 20 20 20 20 20    \..  }        
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 5c 0d 0a 7d 0d 0a 0d 0a 0d         \..}.....
ab80: 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ./*..** End of i
ab90: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
aba0: 20 69 6e 20 66 74 73 35 5f 76 61 72 69 6e 74 2e   in fts5_varint.
abb0: 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  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 2f 0d  **************/.
ac00: 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 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: 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  ..** Interface t
ac60: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 6d  o code in fts5_m
ac70: 61 69 6e 2e 63 2e 20 0d 0a 2a 2f 0d 0a 0d 0a 2f  ain.c. ..*/..../
ac80: 2a 0d 0a 2a 2a 20 56 69 72 74 75 61 6c 2d 74 61  *..** Virtual-ta
ac90: 62 6c 65 20 6f 62 6a 65 63 74 2e 0d 0a 2a 2f 0d  ble object...*/.
aca0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
acb0: 46 74 73 35 54 61 62 6c 65 20 46 74 73 35 54 61  Fts5Table Fts5Ta
acc0: 62 6c 65 3b 0d 0a 73 74 72 75 63 74 20 46 74 73  ble;..struct Fts
acd0: 35 54 61 62 6c 65 20 7b 0d 0a 20 20 73 71 6c 69  5Table {..  sqli
ace0: 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20  te3_vtab base;  
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ad00: 61 73 65 20 63 6c 61 73 73 20 75 73 65 64 20 62  ase class used b
ad10: 79 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  y SQLite core */
ad20: 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  ..  Fts5Config *
ad30: 70 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20  pConfig;        
ad40: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
ad50: 61 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69  able configurati
ad60: 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73 35 49 6e 64  on */..  Fts5Ind
ad70: 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
ad80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c           /* Full
ad90: 2d 74 65 78 74 20 69 6e 64 65 78 20 2a 2f 0d 0a  -text index */..
ada0: 7d 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  };....static int
adb0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 54   sqlite3Fts5GetT
adc0: 6f 6b 65 6e 69 7a 65 72 28 0d 0a 20 20 46 74 73  okenizer(..  Fts
add0: 35 47 6c 6f 62 61 6c 2a 2c 20 0d 0a 20 20 63 6f  5Global*, ..  co
ade0: 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  nst char **azArg
adf0: 2c 0d 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0d 0a  ,..  int nArg,..
ae00: 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a    Fts5Tokenizer*
ae10: 2a 2c 0d 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e  *,..  fts5_token
ae20: 69 7a 65 72 2a 2a 2c 0d 0a 20 20 63 68 61 72 20  izer**,..  char 
ae30: 2a 2a 70 7a 45 72 72 0d 0a 29 3b 0d 0a 0d 0a 73  **pzErr..);....s
ae40: 74 61 74 69 63 20 46 74 73 35 54 61 62 6c 65 20  tatic Fts5Table 
ae50: 2a 73 71 6c 69 74 65 33 46 74 73 35 54 61 62 6c  *sqlite3Fts5Tabl
ae60: 65 46 72 6f 6d 43 73 72 69 64 28 46 74 73 35 47  eFromCsrid(Fts5G
ae70: 6c 6f 62 61 6c 2a 2c 20 69 36 34 29 3b 0d 0a 0d  lobal*, i64);...
ae80: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
ae90: 74 65 33 46 74 73 35 46 6c 75 73 68 54 6f 44 69  te3Fts5FlushToDi
aea0: 73 6b 28 46 74 73 35 54 61 62 6c 65 2a 29 3b 0d  sk(Fts5Table*);.
aeb0: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66  .../*..** End of
aec0: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   interface to co
aed0: 64 65 20 69 6e 20 66 74 73 35 2e 63 2e 0d 0a 2a  de in fts5.c...*
aee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0d 0a 0d 0a 2f 2a  *********/..../*
af30: 2a 2a 2a 2a 2a 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 0d 0a 2a 2a 20 49 6e  *********..** In
af80: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
af90: 69 6e 20 66 74 73 35 5f 68 61 73 68 2e 63 2e 20  in fts5_hash.c. 
afa0: 0d 0a 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74  ..*/..typedef st
afb0: 72 75 63 74 20 46 74 73 35 48 61 73 68 20 46 74  ruct Fts5Hash Ft
afc0: 73 35 48 61 73 68 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a  s5Hash;..../*..*
afd0: 2a 20 43 72 65 61 74 65 20 61 20 68 61 73 68 20  * Create a hash 
afe0: 74 61 62 6c 65 2c 20 66 72 65 65 20 61 20 68 61  table, free a ha
aff0: 73 68 20 74 61 62 6c 65 2e 0d 0a 2a 2f 0d 0a 73  sh table...*/..s
b000: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
b010: 33 46 74 73 35 48 61 73 68 4e 65 77 28 46 74 73  3Fts5HashNew(Fts
b020: 35 43 6f 6e 66 69 67 2a 2c 20 46 74 73 35 48 61  5Config*, Fts5Ha
b030: 73 68 2a 2a 2c 20 69 6e 74 20 2a 70 6e 53 69 7a  sh**, int *pnSiz
b040: 65 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  e);..static void
b050: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
b060: 46 72 65 65 28 46 74 73 35 48 61 73 68 2a 29 3b  Free(Fts5Hash*);
b070: 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ....static int s
b080: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
b090: 69 74 65 28 0d 0a 20 20 46 74 73 35 48 61 73 68  ite(..  Fts5Hash
b0a0: 2a 2c 0d 0a 20 20 69 36 34 20 69 52 6f 77 69 64  *,..  i64 iRowid
b0b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b0c0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
b0d0: 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 2a 2f  or this entry */
b0e0: 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  ..  int iCol,   
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
b110: 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28  ken appears in (
b120: 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a  -ve -> delete) *
b130: 2f 0d 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  /..  int iPos,  
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
b160: 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
b170: 20 63 6f 6c 75 6d 6e 20 2a 2f 0d 0a 20 20 63 68   column */..  ch
b180: 61 72 20 62 42 79 74 65 2c 0d 0a 20 20 63 6f 6e  ar bByte,..  con
b190: 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
b1a0: 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
b1b0: 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
b1c0: 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
b1d0: 6d 20 69 6e 64 65 78 20 2a 2f 0d 0a 29 3b 0d 0a  m index */..);..
b1e0: 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6d 70 74 79 20 28  ../*..** Empty (
b1f0: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
b200: 65 29 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e  e) a hash table.
b210: 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69  ..*/..static voi
b220: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
b230: 68 43 6c 65 61 72 28 46 74 73 35 48 61 73 68 2a  hClear(Fts5Hash*
b240: 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  );....static int
b250: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
b260: 51 75 65 72 79 28 0d 0a 20 20 46 74 73 35 48 61  Query(..  Fts5Ha
b270: 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20  sh*,            
b280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
b290: 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72 79  h table to query
b2a0: 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 50 72 65 2c   */..  int nPre,
b2b0: 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
b2c0: 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
b2d0: 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 74 65 72  ,   /* Query ter
b2e0: 6d 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a 2a 70  m */..  void **p
b2f0: 70 4f 62 6a 2c 20 20 20 20 20 20 20 20 20 20 20  pObj,           
b300: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
b310: 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  Pointer to docli
b320: 73 74 20 66 6f 72 20 70 54 65 72 6d 20 2a 2f 0d  st for pTerm */.
b330: 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69 73  .  int *pnDoclis
b340: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
b350: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
b360: 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79  of doclist in by
b370: 74 65 73 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 73 74  tes */..);....st
b380: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
b390: 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74  Fts5HashScanInit
b3a0: 28 0d 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 20  (..  Fts5Hash*, 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
b3d0: 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0d 0a  le to query */..
b3e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
b3f0: 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
b400: 20 20 2f 2a 20 51 75 65 72 79 20 70 72 65 66 69    /* Query prefi
b410: 78 20 2a 2f 0d 0a 29 3b 0d 0a 73 74 61 74 69 63  x */..);..static
b420: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
b430: 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 46 74  5HashScanNext(Ft
b440: 73 35 48 61 73 68 2a 29 3b 0d 0a 73 74 61 74 69  s5Hash*);..stati
b450: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
b460: 35 48 61 73 68 53 63 61 6e 45 6f 66 28 46 74 73  5HashScanEof(Fts
b470: 35 48 61 73 68 2a 29 3b 0d 0a 73 74 61 74 69 63  5Hash*);..static
b480: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
b490: 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 46  5HashScanEntry(F
b4a0: 74 73 35 48 61 73 68 20 2a 2c 0d 0a 20 20 63 6f  ts5Hash *,..  co
b4b0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 65 72  nst char **pzTer
b4c0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
b4d0: 20 4f 55 54 3a 20 74 65 72 6d 20 28 6e 75 6c 2d   OUT: term (nul-
b4e0: 74 65 72 6d 69 6e 61 74 65 64 29 20 2a 2f 0d 0a  terminated) */..
b4f0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 44    const u8 **ppD
b500: 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20  oclist,         
b510: 20 20 2f 2a 20 4f 55 54 3a 20 70 6f 69 6e 74 65    /* OUT: pointe
b520: 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 2a 2f 0d  r to doclist */.
b530: 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69 73  .  int *pnDoclis
b540: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
b550: 20 20 20 2f 2a 20 4f 55 54 3a 20 73 69 7a 65 20     /* OUT: size 
b560: 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79  of doclist in by
b570: 74 65 73 20 2a 2f 0d 0a 29 3b 0d 0a 0d 0a 0d 0a  tes */..);......
b580: 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  /*..** End of in
b590: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
b5a0: 69 6e 20 66 74 73 35 5f 68 61 73 68 2e 63 2e 0d  in fts5_hash.c..
b5b0: 0a 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 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a  ***********/....
b600: 2f 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 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20  ***********..** 
b650: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
b660: 65 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67  e in fts5_storag
b670: 65 2e 63 2e 20 66 74 73 35 5f 73 74 6f 72 61 67  e.c. fts5_storag
b680: 65 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e  e.c contains con
b690: 74 61 69 6e 73 20 0d 0a 2a 2a 20 63 6f 64 65 20  tains ..** code 
b6a0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
b6b0: 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
b6c0: 20 25 5f 63 6f 6e 74 65 6e 74 20 61 6e 64 20 25   %_content and %
b6d0: 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 73 2e  _docsize tables.
b6e0: 0d 0a 2a 2f 0d 0a 0d 0a 23 64 65 66 69 6e 65 20  ..*/....#define 
b6f0: 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e 5f 41  FTS5_STMT_SCAN_A
b700: 53 43 20 20 30 20 20 20 20 20 2f 2a 20 53 45 4c  SC  0     /* SEL
b710: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
b720: 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 31  M ... ORDER BY 1
b730: 20 41 53 43 20 2a 2f 0d 0a 23 64 65 66 69 6e 65   ASC */..#define
b740: 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e 5f   FTS5_STMT_SCAN_
b750: 44 45 53 43 20 31 20 20 20 20 20 2f 2a 20 53 45  DESC 1     /* SE
b760: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
b770: 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
b780: 31 20 44 45 53 43 20 2a 2f 0d 0a 23 64 65 66 69  1 DESC */..#defi
b790: 6e 65 20 46 54 53 35 5f 53 54 4d 54 5f 4c 4f 4f  ne FTS5_STMT_LOO
b7a0: 4b 55 50 20 20 20 20 32 20 20 20 20 20 2f 2a 20  KUP    2     /* 
b7b0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
b7c0: 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 72  FROM ... WHERE r
b7d0: 6f 77 69 64 3d 3f 20 2a 2f 0d 0a 0d 0a 74 79 70  owid=? */....typ
b7e0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
b7f0: 53 74 6f 72 61 67 65 20 46 74 73 35 53 74 6f 72  Storage Fts5Stor
b800: 61 67 65 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69  age;....static i
b810: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
b820: 6f 72 61 67 65 4f 70 65 6e 28 46 74 73 35 43 6f  orageOpen(Fts5Co
b830: 6e 66 69 67 2a 2c 20 46 74 73 35 49 6e 64 65 78  nfig*, Fts5Index
b840: 2a 2c 20 69 6e 74 2c 20 46 74 73 35 53 74 6f 72  *, int, Fts5Stor
b850: 61 67 65 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0d  age**, char**);.
b860: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
b870: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6c  te3Fts5StorageCl
b880: 6f 73 65 28 46 74 73 35 53 74 6f 72 61 67 65 20  ose(Fts5Storage 
b890: 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74  *p);..static int
b8a0: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
b8b0: 61 67 65 52 65 6e 61 6d 65 28 46 74 73 35 53 74  ageRename(Fts5St
b8c0: 6f 72 61 67 65 2a 2c 20 63 6f 6e 73 74 20 63 68  orage*, const ch
b8d0: 61 72 20 2a 7a 4e 61 6d 65 29 3b 0d 0a 0d 0a 73  ar *zName);....s
b8e0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
b8f0: 33 46 74 73 35 44 72 6f 70 41 6c 6c 28 46 74 73  3Fts5DropAll(Fts
b900: 35 43 6f 6e 66 69 67 2a 29 3b 0d 0a 73 74 61 74  5Config*);..stat
b910: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
b920: 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 46 74  s5CreateTable(Ft
b930: 73 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74  s5Config*, const
b940: 20 63 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68   char*, const ch
b950: 61 72 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a  ar*, int, char *
b960: 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  *);....static in
b970: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
b980: 72 61 67 65 44 65 6c 65 74 65 28 46 74 73 35 53  rageDelete(Fts5S
b990: 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 2c 20  torage *p, i64, 
b9a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
b9b0: 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ;..static int sq
b9c0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
b9d0: 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 28 46 74  ContentInsert(Ft
b9e0: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 73 71  s5Storage *p, sq
b9f0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 2c 20 69  lite3_value**, i
ba00: 36 34 2a 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e  64*);..static in
ba10: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
ba20: 72 61 67 65 49 6e 64 65 78 49 6e 73 65 72 74 28  rageIndexInsert(
ba30: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
ba40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 2c  sqlite3_value**,
ba50: 20 69 36 34 29 3b 0d 0a 0d 0a 73 74 61 74 69 63   i64);....static
ba60: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
ba70: 53 74 6f 72 61 67 65 49 6e 74 65 67 72 69 74 79  StorageIntegrity
ba80: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29  (Fts5Storage *p)
ba90: 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  ;....static int 
baa0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
bab0: 67 65 53 74 6d 74 28 46 74 73 35 53 74 6f 72 61  geStmt(Fts5Stora
bac0: 67 65 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74  ge *p, int eStmt
bad0: 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2a  , sqlite3_stmt**
bae0: 2c 20 63 68 61 72 2a 2a 29 3b 0d 0a 73 74 61 74  , char**);..stat
baf0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
bb00: 74 73 35 53 74 6f 72 61 67 65 53 74 6d 74 52 65  ts5StorageStmtRe
bb10: 6c 65 61 73 65 28 46 74 73 35 53 74 6f 72 61 67  lease(Fts5Storag
bb20: 65 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c  e *p, int eStmt,
bb30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b   sqlite3_stmt*);
bb40: 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ....static int s
bb50: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
bb60: 65 44 6f 63 73 69 7a 65 28 46 74 73 35 53 74 6f  eDocsize(Fts5Sto
bb70: 72 61 67 65 20 2a 70 2c 20 69 36 34 20 69 52 6f  rage *p, i64 iRo
bb80: 77 69 64 2c 20 69 6e 74 20 2a 61 43 6f 6c 29 3b  wid, int *aCol);
bb90: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
bba0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
bbb0: 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65 20  ize(Fts5Storage 
bbc0: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 36  *p, int iCol, i6
bbd0: 34 20 2a 70 6e 41 76 67 29 3b 0d 0a 73 74 61 74  4 *pnAvg);..stat
bbe0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
bbf0: 73 35 53 74 6f 72 61 67 65 52 6f 77 43 6f 75 6e  s5StorageRowCoun
bc00: 74 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  t(Fts5Storage *p
bc10: 2c 20 69 36 34 20 2a 70 6e 52 6f 77 29 3b 0d 0a  , i64 *pnRow);..
bc20: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
bc30: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
bc40: 79 6e 63 28 46 74 73 35 53 74 6f 72 61 67 65 20  ync(Fts5Storage 
bc50: 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74  *p);..static int
bc60: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
bc70: 61 67 65 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35  ageRollback(Fts5
bc80: 53 74 6f 72 61 67 65 20 2a 70 29 3b 0d 0a 0d 0a  Storage *p);....
bc90: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
bca0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e  e3Fts5StorageCon
bcb0: 66 69 67 56 61 6c 75 65 28 0d 0a 20 20 20 20 46  figValue(..    F
bcc0: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 63  ts5Storage *p, c
bcd0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69  onst char*, sqli
bce0: 74 65 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 0d  te3_value*, int.
bcf0: 0a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  .);....static in
bd00: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
bd10: 72 61 67 65 44 65 6c 65 74 65 41 6c 6c 28 46 74  rageDeleteAll(Ft
bd20: 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0d 0a  s5Storage *p);..
bd30: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
bd40: 65 33 46 74 73 35 53 74 6f 72 61 67 65 52 65 62  e3Fts5StorageReb
bd50: 75 69 6c 64 28 46 74 73 35 53 74 6f 72 61 67 65  uild(Fts5Storage
bd60: 20 2a 70 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e   *p);..static in
bd70: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
bd80: 72 61 67 65 4f 70 74 69 6d 69 7a 65 28 46 74 73  rageOptimize(Fts
bd90: 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0d 0a 73  5Storage *p);..s
bda0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
bdb0: 33 46 74 73 35 53 74 6f 72 61 67 65 4d 65 72 67  3Fts5StorageMerg
bdc0: 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  e(Fts5Storage *p
bdd0: 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 3b 0d 0a  , int nMerge);..
bde0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
bdf0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 52 65 73  e3Fts5StorageRes
be00: 65 74 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  et(Fts5Storage *
be10: 70 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e  p);..../*..** En
be20: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
be30: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 73  o code in fts5_s
be40: 74 6f 72 61 67 65 2e 63 2e 0d 0a 2a 2a 2a 2a 2a  torage.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 2a 2a  ****************
be90: 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 0d 0a 2f 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: 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74 65  *******..** Inte
bef0: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
bf00: 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 20 0d 0a   fts5_expr.c. ..
bf10: 2a 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75  */..typedef stru
bf20: 63 74 20 46 74 73 35 45 78 70 72 20 46 74 73 35  ct Fts5Expr Fts5
bf30: 45 78 70 72 3b 0d 0a 74 79 70 65 64 65 66 20 73  Expr;..typedef s
bf40: 74 72 75 63 74 20 46 74 73 35 45 78 70 72 4e 6f  truct Fts5ExprNo
bf50: 64 65 20 46 74 73 35 45 78 70 72 4e 6f 64 65 3b  de Fts5ExprNode;
bf60: 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
bf70: 20 46 74 73 35 50 61 72 73 65 20 46 74 73 35 50   Fts5Parse Fts5P
bf80: 61 72 73 65 3b 0d 0a 74 79 70 65 64 65 66 20 73  arse;..typedef s
bf90: 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e 20  truct Fts5Token 
bfa0: 46 74 73 35 54 6f 6b 65 6e 3b 0d 0a 74 79 70 65  Fts5Token;..type
bfb0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 45  def struct Fts5E
bfc0: 78 70 72 50 68 72 61 73 65 20 46 74 73 35 45 78  xprPhrase Fts5Ex
bfd0: 70 72 50 68 72 61 73 65 3b 0d 0a 74 79 70 65 64  prPhrase;..typed
bfe0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 45 78  ef struct Fts5Ex
bff0: 70 72 4e 65 61 72 73 65 74 20 46 74 73 35 45 78  prNearset Fts5Ex
c000: 70 72 4e 65 61 72 73 65 74 3b 0d 0a 0d 0a 73 74  prNearset;....st
c010: 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e 20 7b  ruct Fts5Token {
c020: 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
c030: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
c040: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 65 78      /* Token tex
c050: 74 20 28 6e 6f 74 20 4e 55 4c 4c 20 74 65 72 6d  t (not NULL term
c060: 69 6e 61 74 65 64 29 20 2a 2f 0d 0a 20 20 69 6e  inated) */..  in
c070: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c090: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
c0a0: 70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 7d  p in bytes */..}
c0b0: 3b 0d 0a 0d 0a 2f 2a 20 50 61 72 73 65 20 61 20  ;..../* Parse a 
c0c0: 4d 41 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e  MATCH expression
c0d0: 2e 20 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
c0e0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
c0f0: 4e 65 77 28 0d 0a 20 20 46 74 73 35 43 6f 6e 66  New(..  Fts5Conf
c100: 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0d 0a 20  ig *pConfig, .. 
c110: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 6e 20 4c 48   /* Column on LH
c140: 53 20 6f 66 20 4d 41 54 43 48 20 6f 70 65 72 61  S of MATCH opera
c150: 74 6f 72 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20  tor */..  const 
c160: 63 68 61 72 20 2a 7a 45 78 70 72 2c 0d 0a 20 20  char *zExpr,..  
c170: 46 74 73 35 45 78 70 72 20 2a 2a 70 70 4e 65 77  Fts5Expr **ppNew
c180: 2c 20 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  , ..  char **pzE
c190: 72 72 0d 0a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  rr..);..../*..**
c1a0: 20 66 6f 72 28 72 63 20 3d 20 73 71 6c 69 74 65   for(rc = sqlite
c1b0: 33 46 74 73 35 45 78 70 72 46 69 72 73 74 28 70  3Fts5ExprFirst(p
c1c0: 45 78 70 72 2c 20 70 49 64 78 2c 20 62 44 65 73  Expr, pIdx, bDes
c1d0: 63 29 3b 0d 0a 2a 2a 20 20 20 20 20 72 63 3d 3d  c);..**     rc==
c1e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
c1f0: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 45  sqlite3Fts5ExprE
c200: 6f 66 28 70 45 78 70 72 29 3b 0d 0a 2a 2a 20 20  of(pExpr);..**  
c210: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
c220: 74 73 35 45 78 70 72 4e 65 78 74 28 70 45 78 70  ts5ExprNext(pExp
c230: 72 29 0d 0a 2a 2a 20 29 7b 0d 0a 2a 2a 20 20 20  r)..** ){..**   
c240: 2f 2f 20 54 68 65 20 64 6f 63 75 6d 65 6e 74 20  // The document 
c250: 77 69 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69  with rowid iRowi
c260: 64 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78  d matches the ex
c270: 70 72 65 73 73 69 6f 6e 21 0d 0a 2a 2a 20 20 20  pression!..**   
c280: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  i64 iRowid = sql
c290: 69 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69  ite3Fts5ExprRowi
c2a0: 64 28 70 45 78 70 72 29 3b 0d 0a 2a 2a 20 7d 0d  d(pExpr);..** }.
c2b0: 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
c2c0: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46  sqlite3Fts5ExprF
c2d0: 69 72 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20  irst(Fts5Expr*, 
c2e0: 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78 2c  Fts5Index *pIdx,
c2f0: 20 69 36 34 20 69 4d 69 6e 2c 20 69 6e 74 20 62   i64 iMin, int b
c300: 44 65 73 63 29 3b 0d 0a 73 74 61 74 69 63 20 69  Desc);..static i
c310: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
c320: 70 72 4e 65 78 74 28 46 74 73 35 45 78 70 72 2a  prNext(Fts5Expr*
c330: 2c 20 69 36 34 20 69 4d 61 78 29 3b 0d 0a 73 74  , i64 iMax);..st
c340: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
c350: 46 74 73 35 45 78 70 72 45 6f 66 28 46 74 73 35  Fts5ExprEof(Fts5
c360: 45 78 70 72 2a 29 3b 0d 0a 73 74 61 74 69 63 20  Expr*);..static 
c370: 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 45  i64 sqlite3Fts5E
c380: 78 70 72 52 6f 77 69 64 28 46 74 73 35 45 78 70  xprRowid(Fts5Exp
c390: 72 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 76  r*);....static v
c3a0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 45  oid sqlite3Fts5E
c3b0: 78 70 72 46 72 65 65 28 46 74 73 35 45 78 70 72  xprFree(Fts5Expr
c3c0: 2a 29 3b 0d 0a 0d 0a 2f 2a 20 43 61 6c 6c 65 64  *);..../* Called
c3d0: 20 64 75 72 69 6e 67 20 73 74 61 72 74 75 70 20   during startup 
c3e0: 74 6f 20 72 65 67 69 73 74 65 72 20 61 20 55 44  to register a UD
c3f0: 46 20 77 69 74 68 20 53 51 4c 69 74 65 20 2a 2f  F with SQLite */
c400: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
c410: 69 74 65 33 46 74 73 35 45 78 70 72 49 6e 69 74  ite3Fts5ExprInit
c420: 28 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71  (Fts5Global*, sq
c430: 6c 69 74 65 33 2a 29 3b 0d 0a 0d 0a 73 74 61 74  lite3*);....stat
c440: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
c450: 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 75 6e  s5ExprPhraseCoun
c460: 74 28 46 74 73 35 45 78 70 72 2a 29 3b 0d 0a 73  t(Fts5Expr*);..s
c470: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
c480: 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65 53  3Fts5ExprPhraseS
c490: 69 7a 65 28 46 74 73 35 45 78 70 72 2a 2c 20 69  ize(Fts5Expr*, i
c4a0: 6e 74 20 69 50 68 72 61 73 65 29 3b 0d 0a 73 74  nt iPhrase);..st
c4b0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
c4c0: 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73 74 28  Fts5ExprPoslist(
c4d0: 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20  Fts5Expr*, int, 
c4e0: 63 6f 6e 73 74 20 75 38 20 2a 2a 29 3b 0d 0a 0d  const u8 **);...
c4f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
c500: 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
c510: 61 74 6f 72 20 46 74 73 35 50 6f 73 6c 69 73 74  ator Fts5Poslist
c520: 50 6f 70 75 6c 61 74 6f 72 3b 0d 0a 73 74 61 74  Populator;..stat
c530: 69 63 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f  ic Fts5PoslistPo
c540: 70 75 6c 61 74 6f 72 20 2a 73 71 6c 69 74 65 33  pulator *sqlite3
c550: 46 74 73 35 45 78 70 72 43 6c 65 61 72 50 6f 73  Fts5ExprClearPos
c560: 6c 69 73 74 73 28 46 74 73 35 45 78 70 72 2a 2c  lists(Fts5Expr*,
c570: 20 69 6e 74 29 3b 0d 0a 73 74 61 74 69 63 20 69   int);..static i
c580: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
c590: 70 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73  prPopulatePoslis
c5a0: 74 73 28 0d 0a 20 20 20 20 46 74 73 35 43 6f 6e  ts(..    Fts5Con
c5b0: 66 69 67 2a 2c 20 46 74 73 35 45 78 70 72 2a 2c  fig*, Fts5Expr*,
c5c0: 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75   Fts5PoslistPopu
c5d0: 6c 61 74 6f 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e  lator*, int, con
c5e0: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 0d 0a 29  st char*, int..)
c5f0: 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  ;..static void s
c600: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 43 68  qlite3Fts5ExprCh
c610: 65 63 6b 50 6f 73 6c 69 73 74 73 28 46 74 73 35  eckPoslists(Fts5
c620: 45 78 70 72 2a 2c 20 69 36 34 29 3b 0d 0a 0d 0a  Expr*, i64);....
c630: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
c640: 65 33 46 74 73 35 45 78 70 72 43 6c 6f 6e 65 50  e3Fts5ExprCloneP
c650: 68 72 61 73 65 28 46 74 73 35 45 78 70 72 2a 2c  hrase(Fts5Expr*,
c660: 20 69 6e 74 2c 20 46 74 73 35 45 78 70 72 2a 2a   int, Fts5Expr**
c670: 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  );....static int
c680: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
c690: 50 68 72 61 73 65 43 6f 6c 6c 69 73 74 28 46 74  PhraseCollist(Ft
c6a0: 73 35 45 78 70 72 20 2a 2c 20 69 6e 74 2c 20 63  s5Expr *, int, c
c6b0: 6f 6e 73 74 20 75 38 20 2a 2a 2c 20 69 6e 74 20  onst u8 **, int 
c6c0: 2a 29 3b 0d 0a 0d 0a 2f 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 2a 2a 2a 2a  ****************
c6f0: 2a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 74 73 35  ***..** The fts5
c700: 5f 65 78 70 72 2e 63 20 41 50 49 20 61 62 6f 76  _expr.c API abov
c710: 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  e this point is 
c720: 75 73 65 64 20 62 79 20 74 68 65 20 6f 74 68 65  used by the othe
c730: 72 20 68 61 6e 64 2d 77 72 69 74 74 65 6e 0d 0a  r hand-written..
c740: 2a 2a 20 43 20 63 6f 64 65 20 69 6e 20 74 68 69  ** C code in thi
c750: 73 20 6d 6f 64 75 6c 65 2e 20 54 68 65 20 69 6e  s module. The in
c760: 74 65 72 66 61 63 65 73 20 62 65 6c 6f 77 20 74  terfaces below t
c770: 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 63 61  his point are ca
c780: 6c 6c 65 64 20 62 79 0d 0a 2a 2a 20 74 68 65 20  lled by..** the 
c790: 70 61 72 73 65 72 20 63 6f 64 65 20 69 6e 20 66  parser code in f
c7a0: 74 73 35 70 61 72 73 65 2e 79 2e 20 20 2a 2f 0d  ts5parse.y.  */.
c7b0: 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  ...static void s
c7c0: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 45  qlite3Fts5ParseE
c7d0: 72 72 6f 72 28 46 74 73 35 50 61 72 73 65 20 2a  rror(Fts5Parse *
c7e0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
c7f0: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0d  ar *zFmt, ...);.
c800: 0a 0d 0a 73 74 61 74 69 63 20 46 74 73 35 45 78  ...static Fts5Ex
c810: 70 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65 33 46  prNode *sqlite3F
c820: 74 73 35 50 61 72 73 65 4e 6f 64 65 28 0d 0a 20  ts5ParseNode(.. 
c830: 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
c840: 73 65 2c 0d 0a 20 20 69 6e 74 20 65 54 79 70 65  se,..  int eType
c850: 2c 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  ,..  Fts5ExprNod
c860: 65 20 2a 70 4c 65 66 74 2c 0d 0a 20 20 46 74 73  e *pLeft,..  Fts
c870: 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 69 67 68  5ExprNode *pRigh
c880: 74 2c 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 65  t,..  Fts5ExprNe
c890: 61 72 73 65 74 20 2a 70 4e 65 61 72 0d 0a 29 3b  arset *pNear..);
c8a0: 0d 0a 0d 0a 73 74 61 74 69 63 20 46 74 73 35 45  ....static Fts5E
c8b0: 78 70 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65 33  xprNode *sqlite3
c8c0: 46 74 73 35 50 61 72 73 65 49 6d 70 6c 69 63 69  Fts5ParseImplici
c8d0: 74 41 6e 64 28 0d 0a 20 20 46 74 73 35 50 61 72  tAnd(..  Fts5Par
c8e0: 73 65 20 2a 70 50 61 72 73 65 2c 0d 0a 20 20 46  se *pParse,..  F
c8f0: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4c 65  ts5ExprNode *pLe
c900: 66 74 2c 0d 0a 20 20 46 74 73 35 45 78 70 72 4e  ft,..  Fts5ExprN
c910: 6f 64 65 20 2a 70 52 69 67 68 74 0d 0a 29 3b 0d  ode *pRight..);.
c920: 0a 0d 0a 73 74 61 74 69 63 20 46 74 73 35 45 78  ...static Fts5Ex
c930: 70 72 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65  prPhrase *sqlite
c940: 33 46 74 73 35 50 61 72 73 65 54 65 72 6d 28 0d  3Fts5ParseTerm(.
c950: 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
c960: 61 72 73 65 2c 20 0d 0a 20 20 46 74 73 35 45 78  arse, ..  Fts5Ex
c970: 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
c980: 65 2c 20 0d 0a 20 20 46 74 73 35 54 6f 6b 65 6e  e, ..  Fts5Token
c990: 20 2a 70 54 6f 6b 65 6e 2c 0d 0a 20 20 69 6e 74   *pToken,..  int
c9a0: 20 62 50 72 65 66 69 78 0d 0a 29 3b 0d 0a 0d 0a   bPrefix..);....
c9b0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
c9c0: 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74 43  te3Fts5ParseSetC
c9d0: 61 72 65 74 28 46 74 73 35 45 78 70 72 50 68 72  aret(Fts5ExprPhr
c9e0: 61 73 65 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69 63  ase*);....static
c9f0: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
ca00: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72   *sqlite3Fts5Par
ca10: 73 65 4e 65 61 72 73 65 74 28 0d 0a 20 20 46 74  seNearset(..  Ft
ca20: 73 35 50 61 72 73 65 2a 2c 20 0d 0a 20 20 46 74  s5Parse*, ..  Ft
ca30: 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 0d  s5ExprNearset*,.
ca40: 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73  .  Fts5ExprPhras
ca50: 65 2a 20 0d 0a 29 3b 0d 0a 0d 0a 73 74 61 74 69  e* ..);....stati
ca60: 63 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 73 71  c Fts5Colset *sq
ca70: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43 6f  lite3Fts5ParseCo
ca80: 6c 73 65 74 28 0d 0a 20 20 46 74 73 35 50 61 72  lset(..  Fts5Par
ca90: 73 65 2a 2c 20 0d 0a 20 20 46 74 73 35 43 6f 6c  se*, ..  Fts5Col
caa0: 73 65 74 2a 2c 20 0d 0a 20 20 46 74 73 35 54 6f  set*, ..  Fts5To
cab0: 6b 65 6e 20 2a 0d 0a 29 3b 0d 0a 0d 0a 73 74 61  ken *..);....sta
cac0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
cad0: 46 74 73 35 50 61 72 73 65 50 68 72 61 73 65 46  Fts5ParsePhraseF
cae0: 72 65 65 28 46 74 73 35 45 78 70 72 50 68 72 61  ree(Fts5ExprPhra
caf0: 73 65 2a 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f  se*);..static vo
cb00: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
cb10: 72 73 65 4e 65 61 72 73 65 74 46 72 65 65 28 46  rseNearsetFree(F
cb20: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 29  ts5ExprNearset*)
cb30: 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  ;..static void s
cb40: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
cb50: 6f 64 65 46 72 65 65 28 46 74 73 35 45 78 70 72  odeFree(Fts5Expr
cb60: 4e 6f 64 65 2a 29 3b 0d 0a 0d 0a 73 74 61 74 69  Node*);....stati
cb70: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
cb80: 73 35 50 61 72 73 65 53 65 74 44 69 73 74 61 6e  s5ParseSetDistan
cb90: 63 65 28 46 74 73 35 50 61 72 73 65 2a 2c 20 46  ce(Fts5Parse*, F
cba0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c  ts5ExprNearset*,
cbb0: 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0d 0a 73   Fts5Token*);..s
cbc0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
cbd0: 65 33 46 74 73 35 50 61 72 73 65 53 65 74 43 6f  e3Fts5ParseSetCo
cbe0: 6c 73 65 74 28 46 74 73 35 50 61 72 73 65 2a 2c  lset(Fts5Parse*,
cbf0: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 2c 20   Fts5ExprNode*, 
cc00: 46 74 73 35 43 6f 6c 73 65 74 2a 29 3b 0d 0a 73  Fts5Colset*);..s
cc10: 74 61 74 69 63 20 46 74 73 35 43 6f 6c 73 65 74  tatic Fts5Colset
cc20: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72   *sqlite3Fts5Par
cc30: 73 65 43 6f 6c 73 65 74 49 6e 76 65 72 74 28 46  seColsetInvert(F
cc40: 74 73 35 50 61 72 73 65 2a 2c 20 46 74 73 35 43  ts5Parse*, Fts5C
cc50: 6f 6c 73 65 74 2a 29 3b 0d 0a 73 74 61 74 69 63  olset*);..static
cc60: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
cc70: 35 50 61 72 73 65 46 69 6e 69 73 68 65 64 28 46  5ParseFinished(F
cc80: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
cc90: 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  , Fts5ExprNode *
cca0: 70 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  p);..static void
ccb0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
ccc0: 65 4e 65 61 72 28 46 74 73 35 50 61 72 73 65 20  eNear(Fts5Parse 
ccd0: 2a 70 50 61 72 73 65 2c 20 46 74 73 35 54 6f 6b  *pParse, Fts5Tok
cce0: 65 6e 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  en*);..../*..** 
ccf0: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
cd00: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
cd10: 5f 65 78 70 72 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a  _expr.c...******
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 2a 2a 2a  ****************
cd60: 2a 2a 2a 2a 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e 74  ********..** Int
cdc0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
cdd0: 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 20 0d 0a  n fts5_aux.c. ..
cde0: 2a 2f 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  */....static int
cdf0: 20 73 71 6c 69 74 65 33 46 74 73 35 41 75 78 49   sqlite3Fts5AuxI
ce00: 6e 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0d  nit(fts5_api*);.
ce10: 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ./*..** End of i
ce20: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
ce30: 20 69 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 0d   in fts5_aux.c..
ce40: 0a 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 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a  ***********/....
ce90: 2f 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 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20  ***********..** 
cee0: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
cef0: 65 20 69 6e 20 66 74 73 35 5f 74 6f 6b 65 6e 69  e in fts5_tokeni
cf00: 7a 65 72 2e 63 2e 20 0d 0a 2a 2f 0d 0a 0d 0a 73  zer.c. ..*/....s
cf10: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
cf20: 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e  3Fts5TokenizerIn
cf30: 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0d 0a  it(fts5_api*);..
cf40: 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  /*..** End of in
cf50: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
cf60: 69 6e 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  in fts5_tokenize
cf70: 72 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  r.c...**********
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 2a 2a 2a 2a 2a 2a 2a  ****************
cfc0: 2f 0d 0a 0d 0a 2f 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 2a 2a 2a 2a 2a 2a 2a  ****************
d010: 0d 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  ..** Interface t
d020: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 76  o code in fts5_v
d030: 6f 63 61 62 2e 63 2e 20 0d 0a 2a 2f 0d 0a 0d 0a  ocab.c. ..*/....
d040: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
d050: 65 33 46 74 73 35 56 6f 63 61 62 49 6e 69 74 28  e3Fts5VocabInit(
d060: 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c  Fts5Global*, sql
d070: 69 74 65 33 2a 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a  ite3*);..../*..*
d080: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
d090: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
d0a0: 73 35 5f 76 6f 63 61 62 2e 63 2e 0d 0a 2a 2a 2a  s5_vocab.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: 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 0d 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 49 6e  *********..** In
d150: 74 65 72 66 61 63 65 20 74 6f 20 61 75 74 6f 6d  terface to autom
d160: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
d170: 65 64 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  ed code in fts5_
d180: 75 6e 69 63 6f 64 65 32 2e 63 2e 20 0d 0a 2a 2f  unicode2.c. ..*/
d190: 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
d1a0: 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65 49  ite3Fts5UnicodeI
d1b0: 73 64 69 61 63 72 69 74 69 63 28 69 6e 74 20 63  sdiacritic(int c
d1c0: 29 3b 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  );..static int s
d1d0: 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64  qlite3Fts5Unicod
d1e0: 65 46 6f 6c 64 28 69 6e 74 20 63 2c 20 69 6e 74  eFold(int c, int
d1f0: 20 62 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69   bRemoveDiacriti
d200: 63 29 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  c);....static in
d210: 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  t sqlite3Fts5Uni
d220: 63 6f 64 65 43 61 74 50 61 72 73 65 28 63 6f 6e  codeCatParse(con
d230: 73 74 20 63 68 61 72 2a 2c 20 75 38 2a 29 3b 0d  st char*, u8*);.
d240: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
d250: 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65 43 61  te3Fts5UnicodeCa
d260: 74 65 67 6f 72 79 28 75 33 32 20 69 43 6f 64 65  tegory(u32 iCode
d270: 29 3b 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  );..static void 
d280: 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f  sqlite3Fts5Unico
d290: 64 65 41 73 63 69 69 28 75 38 2a 2c 20 75 38 2a  deAscii(u8*, u8*
d2a0: 29 3b 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 64 20 6f  );../*..** End o
d2b0: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
d2c0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 75 6e 69 63  ode in fts5_unic
d2d0: 6f 64 65 32 2e 63 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a  ode2.c...*******
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 2a 2a 2a 2a  ****************
d320: 2a 2a 2a 2f 0d 0a 0d 0a 23 65 6e 64 69 66 0d 0a  ***/....#endif..
d330: 0d 0a 23 6c 69 6e 65 20 31 20 22 66 74 73 35 70  ..#line 1 "fts5p
d340: 61 72 73 65 2e 68 22 0d 0a 23 64 65 66 69 6e 65  arse.h"..#define
d350: 20 46 54 53 35 5f 4f 52 20 20 20 20 20 20 20 20   FTS5_OR        
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 20 20 20 20 31 0d 0a 23 64 65 66 69 6e         1..#defin
d380: 65 20 46 54 53 35 5f 41 4e 44 20 20 20 20 20 20  e FTS5_AND      
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 20 20 20 20 20 20 32 0d 0a 23 64 65 66 69          2..#defi
d3b0: 6e 65 20 46 54 53 35 5f 4e 4f 54 20 20 20 20 20  ne FTS5_NOT     
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 20 20 20 20 20 20 33 0d 0a 23 64 65 66           3..#def
d3e0: 69 6e 65 20 46 54 53 35 5f 54 45 52 4d 20 20 20  ine FTS5_TERM   
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 20 20 20 20 20 20 20 34 0d 0a 23 64 65            4..#de
d410: 66 69 6e 65 20 46 54 53 35 5f 43 4f 4c 4f 4e 20  fine FTS5_COLON 
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 20 20 20 20 20 20 20 35 0d 0a 23 64             5..#d
d440: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 55 53  efine FTS5_MINUS
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 20 20 20 20 20 20 20 20 20 36 0d 0a 23              6..#
d470: 64 65 66 69 6e 65 20 46 54 53 35 5f 4c 43 50 20  define 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 20 20 20 20 20 20 20 37 0d 0a               7..
d4a0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 52 43 50  #define 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 20 20 20 20 20 20 20 38 0d                8.
d4d0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
d4e0: 52 49 4e 47 20 20 20 20 20 20 20 20 20 20 20 20  RING            
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39                 9
d500: 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4c  ..#define FTS5_L
d510: 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P               
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
d530: 30 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  0..#define FTS5_
d540: 52 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20  RP              
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 31 31 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35  11..#define FTS5
d570: 5f 43 41 52 45 54 20 20 20 20 20 20 20 20 20 20  _CARET          
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 31 32 0d 0a 23 64 65 66 69 6e 65 20 46 54 53   12..#define FTS
d5a0: 35 5f 43 4f 4d 4d 41 20 20 20 20 20 20 20 20 20  5_COMMA         
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 31 33 0d 0a 23 64 65 66 69 6e 65 20 46 54    13..#define FT
d5d0: 53 35 5f 50 4c 55 53 20 20 20 20 20 20 20 20 20  S5_PLUS         
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 31 34 0d 0a 23 64 65 66 69 6e 65 20 46     14..#define F
d600: 54 53 35 5f 53 54 41 52 20 20 20 20 20 20 20 20  TS5_STAR        
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 20 20 31 35 0d 0a 0d 0a 23 6c 69 6e 65 20      15....#line 
d630: 31 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  1 "fts5parse.c".
d640: 0a 2f 2a 0d 0a 2a 2a 20 32 30 30 30 2d 30 35 2d  ./*..** 2000-05-
d650: 32 39 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61  29..**..** The a
d660: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
d670: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
d680: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
d690: 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20  In place of..** 
d6a0: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
d6b0: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
d6c0: 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d  ng:..**..**    M
d6d0: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
d6e0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a  nd not evil...**
d6f0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
d700: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
d710: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
d720: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a  rgive others...*
d730: 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  *    May you sha
d740: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
d750: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
d760: 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d  n you give...**.
d770: 0a 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 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 20 44  **********..** D
d7c0: 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66  river template f
d7d0: 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
d7e0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0d 0a  ser generator...
d7f0: 2a 2a 0d 0a 2a 2a 20 54 68 65 20 22 6c 65 6d 6f  **..** The "lemo
d800: 6e 22 20 70 72 6f 67 72 61 6d 20 70 72 6f 63 65  n" program proce
d810: 73 73 65 73 20 61 6e 20 4c 41 4c 52 28 31 29 20  sses an LALR(1) 
d820: 69 6e 70 75 74 20 67 72 61 6d 6d 61 72 20 66 69  input grammar fi
d830: 6c 65 2c 20 74 68 65 6e 20 75 73 65 73 0d 0a 2a  le, then uses..*
d840: 2a 20 74 68 69 73 20 74 65 6d 70 6c 61 74 65 20  * this template 
d850: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 70  to construct a p
d860: 61 72 73 65 72 2e 20 20 54 68 65 20 22 6c 65 6d  arser.  The "lem
d870: 6f 6e 22 20 70 72 6f 67 72 61 6d 20 69 6e 73 65  on" program inse
d880: 72 74 73 20 74 65 78 74 0d 0a 2a 2a 20 61 74 20  rts text..** at 
d890: 65 61 63 68 20 22 25 25 22 20 6c 69 6e 65 2e 20  each "%%" line. 
d8a0: 20 41 6c 73 6f 2c 20 61 6e 79 20 22 50 2d 61 2d   Also, any "P-a-
d8b0: 72 2d 73 2d 65 22 20 69 64 65 6e 74 69 66 65 72  r-s-e" identifer
d8c0: 20 70 72 65 66 69 78 20 28 77 69 74 68 6f 75 74   prefix (without
d8d0: 20 74 68 65 0d 0a 2a 2a 20 69 6e 74 65 72 73 74   the..** interst
d8e0: 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72 61 63  itial "-" charac
d8f0: 74 65 72 73 29 20 63 6f 6e 74 61 69 6e 65 64 20  ters) contained 
d900: 69 6e 20 74 68 69 73 20 74 65 6d 70 6c 61 74 65  in this template
d910: 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f   is changed into
d920: 0d 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ..** the value o
d930: 66 20 74 68 65 20 25 6e 61 6d 65 20 64 69 72 65  f the %name dire
d940: 63 74 69 76 65 20 66 72 6f 6d 20 74 68 65 20 67  ctive from the g
d950: 72 61 6d 6d 61 72 2e 20 20 4f 74 68 65 72 77 69  rammar.  Otherwi
d960: 73 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 0d  se, the content.
d970: 0a 2a 2a 20 6f 66 20 74 68 69 73 20 74 65 6d 70  .** of this temp
d980: 6c 61 74 65 20 69 73 20 63 6f 70 69 65 64 20 73  late is copied s
d990: 74 72 61 69 67 68 74 20 74 68 72 6f 75 67 68 20  traight through 
d9a0: 69 6e 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  into the generat
d9b0: 65 20 70 61 72 73 65 72 0d 0a 2a 2a 20 73 6f 75  e parser..** sou
d9c0: 72 63 65 20 66 69 6c 65 2e 0d 0a 2a 2a 0d 0a 2a  rce file...**..*
d9d0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
d9e0: 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  is the concatena
d9f0: 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 25 69 6e 63  tion of all %inc
da00: 6c 75 64 65 20 64 69 72 65 63 74 69 76 65 73 20  lude directives 
da10: 66 72 6f 6d 20 74 68 65 0d 0a 2a 2a 20 69 6e 70  from the..** inp
da20: 75 74 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 3a  ut grammar file:
da30: 0d 0a 2a 2f 0d 0a 23 69 6e 63 6c 75 64 65 20 3c  ..*/..#include <
da40: 73 74 64 69 6f 2e 68 3e 0d 0a 23 69 6e 63 6c 75  stdio.h>..#inclu
da50: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0d 0a 2f  de <assert.h>../
da60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
da70: 69 6e 20 25 69 6e 63 6c 75 64 65 20 73 65 63 74  in %include sect
da80: 69 6f 6e 73 20 66 72 6f 6d 20 74 68 65 20 67 72  ions from the gr
da90: 61 6d 6d 61 72 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ammar **********
daa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d  **************/.
dab0: 0a 23 6c 69 6e 65 20 34 37 20 22 66 74 73 35 70  .#line 47 "fts5p
dac0: 61 72 73 65 2e 79 22 0d 0a 0d 0a 2f 2a 20 23 69  arse.y"..../* #i
dad0: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
dae0: 68 22 20 2a 2f 0d 0a 2f 2a 20 23 69 6e 63 6c 75  h" */../* #inclu
daf0: 64 65 20 22 66 74 73 35 70 61 72 73 65 2e 68 22  de "fts5parse.h"
db00: 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 44 69   */..../*..** Di
db10: 73 61 62 6c 65 20 61 6c 6c 20 65 72 72 6f 72 20  sable all error 
db20: 72 65 63 6f 76 65 72 79 20 70 72 6f 63 65 73 73  recovery process
db30: 69 6e 67 20 69 6e 20 74 68 65 20 70 61 72 73 65  ing in the parse
db40: 72 20 70 75 73 68 2d 64 6f 77 6e 0d 0a 2a 2a 20  r push-down..** 
db50: 61 75 74 6f 6d 61 74 6f 6e 2e 0d 0a 2a 2f 0d 0a  automaton...*/..
db60: 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 4e 4f  #define fts5YYNO
db70: 45 52 52 4f 52 52 45 43 4f 56 45 52 59 20 31 0d  ERRORRECOVERY 1.
db80: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4d 61 6b 65 20 66  .../*..** Make f
db90: 74 73 35 79 79 74 65 73 74 63 61 73 65 28 29 20  ts5yytestcase() 
dba0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 65 73 74  the same as test
dbb0: 63 61 73 65 28 29 0d 0a 2a 2f 0d 0a 23 64 65 66  case()..*/..#def
dbc0: 69 6e 65 20 66 74 73 35 79 79 74 65 73 74 63 61  ine fts5yytestca
dbd0: 73 65 28 58 29 20 74 65 73 74 63 61 73 65 28 58  se(X) testcase(X
dbe0: 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 64 69  )..../*..** Indi
dbf0: 63 61 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  cate that sqlite
dc00: 33 50 61 72 73 65 72 46 72 65 65 28 29 20 77 69  3ParserFree() wi
dc10: 6c 6c 20 6e 65 76 65 72 20 62 65 20 63 61 6c 6c  ll never be call
dc20: 65 64 20 77 69 74 68 20 61 20 6e 75 6c 6c 0d 0a  ed with a null..
dc30: 2a 2a 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2f 0d  ** pointer...*/.
dc40: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 50  .#define fts5YYP
dc50: 41 52 53 45 46 52 45 45 4e 4f 54 4e 55 4c 4c 20  ARSEFREENOTNULL 
dc60: 31 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 74 65  1..../*..** Alte
dc70: 72 6e 61 74 69 76 65 20 64 61 74 61 74 79 70 65  rnative datatype
dc80: 20 66 6f 72 20 74 68 65 20 61 72 67 75 6d 65 6e   for the argumen
dc90: 74 20 74 6f 20 74 68 65 20 6d 61 6c 6c 6f 63 28  t to the malloc(
dca0: 29 20 72 6f 75 74 69 6e 65 20 70 61 73 73 65 64  ) routine passed
dcb0: 0d 0a 2a 2a 20 69 6e 74 6f 20 73 71 6c 69 74 65  ..** into sqlite
dcc0: 33 50 61 72 73 65 72 41 6c 6c 6f 63 28 29 2e 20  3ParserAlloc(). 
dcd0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
dce0: 73 69 7a 65 5f 74 2e 0d 0a 2a 2f 0d 0a 23 64 65  size_t...*/..#de
dcf0: 66 69 6e 65 20 66 74 73 35 59 59 4d 41 4c 4c 4f  fine fts5YYMALLO
dd00: 43 41 52 47 54 59 50 45 20 20 75 36 34 0d 0a 0d  CARGTYPE  u64...
dd10: 0a 23 6c 69 6e 65 20 35 37 20 22 66 74 73 35 70  .#line 57 "fts5p
dd20: 61 72 73 65 2e 63 22 0d 0a 2f 2a 2a 2a 2a 2a 2a  arse.c"../******
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
dd40: 66 20 25 69 6e 63 6c 75 64 65 20 64 69 72 65 63  f %include direc
dd50: 74 69 76 65 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tives **********
dd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd70: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 20 54 68  ********/../* Th
dd80: 65 73 65 20 63 6f 6e 73 74 61 6e 74 73 20 73 70  ese constants sp
dd90: 65 63 69 66 79 20 74 68 65 20 76 61 72 69 6f 75  ecify the variou
dda0: 73 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  s numeric values
ddb0: 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79   for terminal sy
ddc0: 6d 62 6f 6c 73 0d 0a 2a 2a 20 69 6e 20 61 20 66  mbols..** in a f
ddd0: 6f 72 6d 61 74 20 75 6e 64 65 72 73 74 61 6e 64  ormat understand
dde0: 61 62 6c 65 20 74 6f 20 22 6d 61 6b 65 68 65 61  able to "makehea
ddf0: 64 65 72 73 22 2e 20 20 54 68 69 73 20 73 65 63  ders".  This sec
de00: 74 69 6f 6e 20 69 73 20 62 6c 61 6e 6b 20 75 6e  tion is blank un
de10: 6c 65 73 73 0d 0a 2a 2a 20 22 6c 65 6d 6f 6e 22  less..** "lemon"
de20: 20 69 73 20 72 75 6e 20 77 69 74 68 20 74 68 65   is run with the
de30: 20 22 2d 6d 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69   "-m" command-li
de40: 6e 65 20 6f 70 74 69 6f 6e 2e 0d 0a 2a 2a 2a 2a  ne option...****
de50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
de60: 67 69 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20  gin makeheaders 
de70: 74 6f 6b 65 6e 20 64 65 66 69 6e 69 74 69 6f 6e  token definition
de80: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
de90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a  ***********/../*
dea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
deb0: 45 6e 64 20 6d 61 6b 65 68 65 61 64 65 72 73 20  End makeheaders 
dec0: 74 6f 6b 65 6e 20 64 65 66 69 6e 69 74 69 6f 6e  token definition
ded0: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
dee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a  *************/..
def0: 0d 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 73 65  ../* The next se
df00: 63 74 69 6f 6e 73 20 69 73 20 61 20 73 65 72 69  ctions is a seri
df10: 65 73 20 6f 66 20 63 6f 6e 74 72 6f 6c 20 23 64  es of control #d
df20: 65 66 69 6e 65 73 2e 0d 0a 2a 2a 20 76 61 72 69  efines...** vari
df30: 6f 75 73 20 61 73 70 65 63 74 73 20 6f 66 20 74  ous aspects of t
df40: 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61 72  he generated par
df50: 73 65 72 2e 0d 0a 2a 2a 20 20 20 20 66 74 73 35  ser...**    fts5
df60: 59 59 43 4f 44 45 54 59 50 45 20 20 20 20 20 20  YYCODETYPE      
df70: 20 20 20 69 73 20 74 68 65 20 64 61 74 61 20 74     is the data t
df80: 79 70 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ype used to stor
df90: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 63 6f  e the integer co
dfa0: 64 65 73 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  des..**         
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
dfc0: 61 74 20 72 65 70 72 65 73 65 6e 74 20 74 65 72  at represent ter
dfd0: 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 2d 74 65  minal and non-te
dfe0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 0d  rminal symbols..
dff0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e000: 20 20 20 20 20 20 20 20 20 20 22 75 6e 73 69 67            "unsig
e010: 6e 65 64 20 63 68 61 72 22 20 69 73 20 75 73 65  ned char" is use
e020: 64 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  d if there are f
e030: 65 77 65 72 20 74 68 61 6e 0d 0a 2a 2a 20 20 20  ewer than..**   
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 20 32 35 36 20 73 79 6d 62 6f 6c 73 2e      256 symbols.
e060: 20 20 4c 61 72 67 65 72 20 74 79 70 65 73 20 6f    Larger types o
e070: 74 68 65 72 77 69 73 65 2e 0d 0a 2a 2a 20 20 20  therwise...**   
e080: 20 66 74 73 35 59 59 4e 4f 43 4f 44 45 20 20 20   fts5YYNOCODE   
e090: 20 20 20 20 20 20 20 20 69 73 20 61 20 6e 75 6d          is a num
e0a0: 62 65 72 20 6f 66 20 74 79 70 65 20 66 74 73 35  ber of type fts5
e0b0: 59 59 43 4f 44 45 54 59 50 45 20 74 68 61 74 20  YYCODETYPE that 
e0c0: 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0d  is not used for.
e0d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e0e0: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 74 65            any te
e0f0: 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72  rminal or nonter
e100: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 2e 0d 0a 2a  minal symbol...*
e110: 2a 20 20 20 20 66 74 73 35 59 59 46 41 4c 4c 42  *    fts5YYFALLB
e120: 41 43 4b 20 20 20 20 20 20 20 20 20 49 66 20 64  ACK         If d
e130: 65 66 69 6e 65 64 2c 20 74 68 69 73 20 69 6e 64  efined, this ind
e140: 69 63 61 74 65 73 20 74 68 61 74 20 6f 6e 65 20  icates that one 
e150: 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e 73 0d 0a  or more tokens..
e160: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e170: 20 20 20 20 20 20 20 20 20 28 61 6c 73 6f 20 6b           (also k
e180: 6e 6f 77 6e 20 61 73 3a 20 22 74 65 72 6d 69 6e  nown as: "termin
e190: 61 6c 20 73 79 6d 62 6f 6c 73 22 29 20 68 61 76  al symbols") hav
e1a0: 65 20 66 61 6c 6c 2d 62 61 63 6b 0d 0a 2a 2a 20  e fall-back..** 
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 20 20 76 61 6c 75 65 73 20 77 68 69        values whi
e1d0: 63 68 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ch should be use
e1e0: 64 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  d if the origina
e1f0: 6c 20 73 79 6d 62 6f 6c 0d 0a 2a 2a 20 20 20 20  l symbol..**    
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 77 6f 75 6c 64 20 6e 6f 74 20 70 61 72     would not par
e220: 73 65 2e 20 20 54 68 69 73 20 70 65 72 6d 69 74  se.  This permit
e230: 73 20 6b 65 79 77 6f 72 64 73 20 74 6f 20 73 6f  s keywords to so
e240: 6d 65 74 69 6d 65 73 0d 0a 2a 2a 20 20 20 20 20  metimes..**     
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 62 65 20 75 73 65 64 20 61 73 20 69 64 65    be used as ide
e270: 6e 74 69 66 69 65 72 73 2c 20 66 6f 72 20 65 78  ntifiers, for ex
e280: 61 6d 70 6c 65 2e 0d 0a 2a 2a 20 20 20 20 66 74  ample...**    ft
e290: 73 35 59 59 41 43 54 49 4f 4e 54 59 50 45 20 20  s5YYACTIONTYPE  
e2a0: 20 20 20 20 20 69 73 20 74 68 65 20 64 61 74 61       is the data
e2b0: 20 74 79 70 65 20 75 73 65 64 20 66 6f 72 20 22   type used for "
e2c0: 61 63 74 69 6f 6e 20 63 6f 64 65 73 22 20 2d 20  action codes" - 
e2d0: 6e 75 6d 62 65 72 73 0d 0a 2a 2a 20 20 20 20 20  numbers..**     
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20    that indicate 
e300: 77 68 61 74 20 74 6f 20 64 6f 20 69 6e 20 72 65  what to do in re
e310: 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 6e 65  sponse to the ne
e320: 78 74 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  xt..**          
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6b               tok
e340: 65 6e 2e 0d 0a 2a 2a 20 20 20 20 73 71 6c 69 74  en...**    sqlit
e350: 65 33 46 74 73 35 50 61 72 73 65 72 46 54 53 35  e3Fts5ParserFTS5
e360: 54 4f 4b 45 4e 54 59 50 45 20 20 20 20 20 69 73  TOKENTYPE     is
e370: 20 74 68 65 20 64 61 74 61 20 74 79 70 65 20 75   the data type u
e380: 73 65 64 20 66 6f 72 20 6d 69 6e 6f 72 20 74 79  sed for minor ty
e390: 70 65 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 0d  pe for terminal.
e3a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e3b0: 20 20 20 20 20 20 20 20 20 20 73 79 6d 62 6f 6c            symbol
e3c0: 73 2e 20 20 42 61 63 6b 67 72 6f 75 6e 64 3a 20  s.  Background: 
e3d0: 41 20 22 6d 69 6e 6f 72 20 74 79 70 65 22 20 69  A "minor type" i
e3e0: 73 20 61 20 73 65 6d 61 6e 74 69 63 0d 0a 2a 2a  s a semantic..**
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 20 20 20 76 61 6c 75 65 20 61 73 73         value ass
e410: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 74  ociated with a t
e420: 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 2d 74  erminal or non-t
e430: 65 72 6d 69 6e 61 6c 0d 0a 2a 2a 20 20 20 20 20  erminal..**     
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 73 79 6d 62 6f 6c 73 2e 20 20 46 6f 72 20    symbols.  For 
e460: 65 78 61 6d 70 6c 65 2c 20 66 6f 72 20 61 6e 20  example, for an 
e470: 22 49 44 22 20 74 65 72 6d 69 6e 61 6c 20 73 79  "ID" terminal sy
e480: 6d 62 6f 6c 2c 0d 0a 2a 2a 20 20 20 20 20 20 20  mbol,..**       
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 74 68 65 20 6d 69 6e 6f 72 20 74 79 70 65 20 6d  the minor type m
e4b0: 69 67 68 74 20 62 65 20 74 68 65 20 6e 61 6d 65  ight be the name
e4c0: 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
e4d0: 65 72 2e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  er...**         
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 61                Ea
e4f0: 63 68 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  ch non-terminal 
e500: 63 61 6e 20 68 61 76 65 20 61 20 64 69 66 66 65  can have a diffe
e510: 72 65 6e 74 20 6d 69 6e 6f 72 20 74 79 70 65 2e  rent minor type.
e520: 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
e530: 20 20 20 20 20 20 20 20 20 20 20 54 65 72 6d 69             Termi
e540: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 61 6c 6c 20  nal symbols all 
e550: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6d 69  have the same mi
e560: 6e 6f 72 20 74 79 70 65 2c 20 74 68 6f 75 67 68  nor type, though
e570: 2e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
e580: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73              This
e590: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 73 20   macros defines 
e5a0: 74 68 65 20 6d 69 6e 6f 72 20 74 79 70 65 20 66  the minor type f
e5b0: 6f 72 20 74 65 72 6d 69 6e 61 6c 20 0d 0a 2a 2a  or terminal ..**
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 20 20 20 20 20 73 79 6d 62 6f 6c 73 2e 0d         symbols..
e5e0: 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 4d 49 4e  .**    fts5YYMIN
e5f0: 4f 52 54 59 50 45 20 20 20 20 20 20 20 20 69 73  ORTYPE        is
e600: 20 74 68 65 20 64 61 74 61 20 74 79 70 65 20 75   the data type u
e610: 73 65 64 20 66 6f 72 20 61 6c 6c 20 6d 69 6e 6f  sed for all mino
e620: 72 20 74 79 70 65 73 2e 0d 0a 2a 2a 20 20 20 20  r types...**    
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 54 68 69 73 20 69 73 20 74 79 70 69 63     This is typic
e650: 61 6c 6c 79 20 61 20 75 6e 69 6f 6e 20 6f 66 20  ally a union of 
e660: 6d 61 6e 79 20 74 79 70 65 73 2c 20 6f 6e 65 20  many types, one 
e670: 6f 66 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  of..**          
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69               whi
e690: 63 68 20 69 73 20 73 71 6c 69 74 65 33 46 74 73  ch is sqlite3Fts
e6a0: 35 50 61 72 73 65 72 46 54 53 35 54 4f 4b 45 4e  5ParserFTS5TOKEN
e6b0: 54 59 50 45 2e 20 20 54 68 65 20 65 6e 74 72 79  TYPE.  The entry
e6c0: 20 69 6e 20 74 68 65 20 75 6e 69 6f 6e 0d 0a 2a   in the union..*
e6d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
e6e0: 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 72 6d          for term
e6f0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 73 20  inal symbols is 
e700: 63 61 6c 6c 65 64 20 22 66 74 73 35 79 79 30 22  called "fts5yy0"
e710: 2e 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 53  ...**    fts5YYS
e720: 54 41 43 4b 44 45 50 54 48 20 20 20 20 20 20 20  TACKDEPTH       
e730: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  is the maximum d
e740: 65 70 74 68 20 6f 66 20 74 68 65 20 70 61 72 73  epth of the pars
e750: 65 72 27 73 20 73 74 61 63 6b 2e 20 20 49 66 0d  er's stack.  If.
e760: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e770: 20 20 20 20 20 20 20 20 20 20 7a 65 72 6f 20 74            zero t
e780: 68 65 20 73 74 61 63 6b 20 69 73 20 64 79 6e 61  he stack is dyna
e790: 6d 69 63 61 6c 6c 79 20 73 69 7a 65 64 20 75 73  mically sized us
e7a0: 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 0d 0a 2a  ing realloc()..*
e7b0: 2a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  *    sqlite3Fts5
e7c0: 50 61 72 73 65 72 41 52 47 5f 53 44 45 43 4c 20  ParserARG_SDECL 
e7d0: 20 20 20 20 41 20 73 74 61 74 69 63 20 76 61 72      A static var
e7e0: 69 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f  iable declaratio
e7f0: 6e 20 66 6f 72 20 74 68 65 20 25 65 78 74 72 61  n for the %extra
e800: 5f 61 72 67 75 6d 65 6e 74 0d 0a 2a 2a 20 20 20  _argument..**   
e810: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
e820: 65 72 41 52 47 5f 50 44 45 43 4c 20 20 20 20 20  erARG_PDECL     
e830: 41 20 70 61 72 61 6d 65 74 65 72 20 64 65 63 6c  A parameter decl
e840: 61 72 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  aration for the 
e850: 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 0d  %extra_argument.
e860: 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 46 74  .**    sqlite3Ft
e870: 73 35 50 61 72 73 65 72 41 52 47 5f 50 41 52 41  s5ParserARG_PARA
e880: 4d 20 20 20 20 20 43 6f 64 65 20 74 6f 20 70 61  M     Code to pa
e890: 73 73 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65  ss %extra_argume
e8a0: 6e 74 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  nt as a subrouti
e8b0: 6e 65 20 70 61 72 61 6d 65 74 65 72 0d 0a 2a 2a  ne parameter..**
e8c0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
e8d0: 61 72 73 65 72 41 52 47 5f 53 54 4f 52 45 20 20  arserARG_STORE  
e8e0: 20 20 20 43 6f 64 65 20 74 6f 20 73 74 6f 72 65     Code to store
e8f0: 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74   %extra_argument
e900: 20 69 6e 74 6f 20 66 74 73 35 79 79 70 50 61 72   into fts5yypPar
e910: 73 65 72 0d 0a 2a 2a 20 20 20 20 73 71 6c 69 74  ser..**    sqlit
e920: 65 33 46 74 73 35 50 61 72 73 65 72 41 52 47 5f  e3Fts5ParserARG_
e930: 46 45 54 43 48 20 20 20 20 20 43 6f 64 65 20 74  FETCH     Code t
e940: 6f 20 65 78 74 72 61 63 74 20 25 65 78 74 72 61  o extract %extra
e950: 5f 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 66  _argument from f
e960: 74 73 35 79 79 70 50 61 72 73 65 72 0d 0a 2a 2a  ts5yypParser..**
e970: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
e980: 61 72 73 65 72 43 54 58 5f 2a 20 20 20 20 20 20  arserCTX_*      
e990: 20 20 20 41 73 20 73 71 6c 69 74 65 33 46 74 73     As sqlite3Fts
e9a0: 35 50 61 72 73 65 72 41 52 47 5f 20 65 78 63 65  5ParserARG_ exce
e9b0: 70 74 20 66 6f 72 20 25 65 78 74 72 61 5f 63 6f  pt for %extra_co
e9c0: 6e 74 65 78 74 0d 0a 2a 2a 20 20 20 20 66 74 73  ntext..**    fts
e9d0: 35 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 20  5YYERRORSYMBOL  
e9e0: 20 20 20 20 69 73 20 74 68 65 20 63 6f 64 65 20      is the code 
e9f0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 65 72  number of the er
ea00: 72 6f 72 20 73 79 6d 62 6f 6c 2e 20 20 49 66 20  ror symbol.  If 
ea10: 6e 6f 74 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20  not..**         
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
ea30: 66 69 6e 65 64 2c 20 74 68 65 6e 20 64 6f 20 6e  fined, then do n
ea40: 6f 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  o error processi
ea50: 6e 67 2e 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59  ng...**    fts5Y
ea60: 59 4e 53 54 41 54 45 20 20 20 20 20 20 20 20 20  YNSTATE         
ea70: 20 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 6e    the combined n
ea80: 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 2e  umber of states.
ea90: 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 4e 52  ..**    fts5YYNR
eaa0: 55 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 74  ULE            t
eab0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c  he number of rul
eac0: 65 73 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  es in the gramma
ead0: 72 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 4e  r..**    fts5YYN
eae0: 46 54 53 35 54 4f 4b 45 4e 20 20 20 20 20 20 20  FTS5TOKEN       
eaf0: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 74 65      Number of te
eb00: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 0d 0a  rminal symbols..
eb10: 2a 2a 20 20 20 20 66 74 73 35 59 59 5f 4d 41 58  **    fts5YY_MAX
eb20: 5f 53 48 49 46 54 20 20 20 20 20 20 20 4d 61 78  _SHIFT       Max
eb30: 69 6d 75 6d 20 76 61 6c 75 65 20 66 6f 72 20 73  imum value for s
eb40: 68 69 66 74 20 61 63 74 69 6f 6e 73 0d 0a 2a 2a  hift actions..**
eb50: 20 20 20 20 66 74 73 35 59 59 5f 4d 49 4e 5f 53      fts5YY_MIN_S
eb60: 48 49 46 54 52 45 44 55 43 45 20 4d 69 6e 69 6d  HIFTREDUCE Minim
eb70: 75 6d 20 76 61 6c 75 65 20 66 6f 72 20 73 68 69  um value for shi
eb80: 66 74 2d 72 65 64 75 63 65 20 61 63 74 69 6f 6e  ft-reduce action
eb90: 73 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 5f  s..**    fts5YY_
eba0: 4d 41 58 5f 53 48 49 46 54 52 45 44 55 43 45 20  MAX_SHIFTREDUCE 
ebb0: 4d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 66 6f  Maximum value fo
ebc0: 72 20 73 68 69 66 74 2d 72 65 64 75 63 65 20 61  r shift-reduce a
ebd0: 63 74 69 6f 6e 73 0d 0a 2a 2a 20 20 20 20 66 74  ctions..**    ft
ebe0: 73 35 59 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f  s5YY_ERROR_ACTIO
ebf0: 4e 20 20 20 20 54 68 65 20 66 74 73 35 79 79 5f  N    The fts5yy_
ec00: 61 63 74 69 6f 6e 5b 5d 20 63 6f 64 65 20 66 6f  action[] code fo
ec10: 72 20 73 79 6e 74 61 78 20 65 72 72 6f 72 0d 0a  r syntax error..
ec20: 2a 2a 20 20 20 20 66 74 73 35 59 59 5f 41 43 43  **    fts5YY_ACC
ec30: 45 50 54 5f 41 43 54 49 4f 4e 20 20 20 54 68 65  EPT_ACTION   The
ec40: 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e 5b 5d   fts5yy_action[]
ec50: 20 63 6f 64 65 20 66 6f 72 20 61 63 63 65 70 74   code for accept
ec60: 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 5f 4e  ..**    fts5YY_N
ec70: 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 20 54  O_ACTION       T
ec80: 68 65 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e  he fts5yy_action
ec90: 5b 5d 20 63 6f 64 65 20 66 6f 72 20 6e 6f 2d 6f  [] code for no-o
eca0: 70 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 5f  p..**    fts5YY_
ecb0: 4d 49 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20  MIN_REDUCE      
ecc0: 4d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 66 6f  Minimum value fo
ecd0: 72 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73  r reduce actions
ece0: 0d 0a 2a 2a 20 20 20 20 66 74 73 35 59 59 5f 4d  ..**    fts5YY_M
ecf0: 41 58 5f 52 45 44 55 43 45 20 20 20 20 20 20 4d  AX_REDUCE      M
ed00: 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 66 6f 72  aximum value for
ed10: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 0d   reduce actions.
ed20: 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 49 4e 54  .*/..#ifndef INT
ed30: 45 52 46 41 43 45 0d 0a 23 20 64 65 66 69 6e 65  ERFACE..# define
ed40: 20 49 4e 54 45 52 46 41 43 45 20 31 0d 0a 23 65   INTERFACE 1..#e
ed50: 6e 64 69 66 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ndif../*********
ed60: 2a 2a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 74 72  **** Begin contr
ed70: 6f 6c 20 23 64 65 66 69 6e 65 73 20 2a 2a 2a 2a  ol #defines ****
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 2a 2a  ****************
eda0: 2a 2a 2a 2a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20  *****/..#define 
edb0: 66 74 73 35 59 59 43 4f 44 45 54 59 50 45 20 75  fts5YYCODETYPE u
edc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 0d 0a 23 64  nsigned char..#d
edd0: 65 66 69 6e 65 20 66 74 73 35 59 59 4e 4f 43 4f  efine fts5YYNOCO
ede0: 44 45 20 32 37 0d 0a 23 64 65 66 69 6e 65 20 66  DE 27..#define f
edf0: 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50 45 20  ts5YYACTIONTYPE 
ee00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 0d 0a 23  unsigned char..#
ee10: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 46 74  define sqlite3Ft
ee20: 73 35 50 61 72 73 65 72 46 54 53 35 54 4f 4b 45  s5ParserFTS5TOKE
ee30: 4e 54 59 50 45 20 46 74 73 35 54 6f 6b 65 6e 0d  NTYPE Fts5Token.
ee40: 0a 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b  .typedef union {
ee50: 0d 0a 20 20 69 6e 74 20 66 74 73 35 79 79 69 6e  ..  int fts5yyin
ee60: 69 74 3b 0d 0a 20 20 73 71 6c 69 74 65 33 46 74  it;..  sqlite3Ft
ee70: 73 35 50 61 72 73 65 72 46 54 53 35 54 4f 4b 45  s5ParserFTS5TOKE
ee80: 4e 54 59 50 45 20 66 74 73 35 79 79 30 3b 0d 0a  NTYPE fts5yy0;..
ee90: 20 20 69 6e 74 20 66 74 73 35 79 79 34 3b 0d 0a    int fts5yy4;..
eea0: 20 20 46 74 73 35 43 6f 6c 73 65 74 2a 20 66 74    Fts5Colset* ft
eeb0: 73 35 79 79 31 31 3b 0d 0a 20 20 46 74 73 35 45  s5yy11;..  Fts5E
eec0: 78 70 72 4e 6f 64 65 2a 20 66 74 73 35 79 79 32  xprNode* fts5yy2
eed0: 34 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 65  4;..  Fts5ExprNe
eee0: 61 72 73 65 74 2a 20 66 74 73 35 79 79 34 36 3b  arset* fts5yy46;
eef0: 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61  ..  Fts5ExprPhra
ef00: 73 65 2a 20 66 74 73 35 79 79 35 33 3b 0d 0a 7d  se* fts5yy53;..}
ef10: 20 66 74 73 35 59 59 4d 49 4e 4f 52 54 59 50 45   fts5YYMINORTYPE
ef20: 3b 0d 0a 23 69 66 6e 64 65 66 20 66 74 73 35 59  ;..#ifndef fts5Y
ef30: 59 53 54 41 43 4b 44 45 50 54 48 0d 0a 23 64 65  YSTACKDEPTH..#de
ef40: 66 69 6e 65 20 66 74 73 35 59 59 53 54 41 43 4b  fine fts5YYSTACK
ef50: 44 45 50 54 48 20 31 30 30 0d 0a 23 65 6e 64 69  DEPTH 100..#endi
ef60: 66 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  f..#define sqlit
ef70: 65 33 46 74 73 35 50 61 72 73 65 72 41 52 47 5f  e3Fts5ParserARG_
ef80: 53 44 45 43 4c 20 46 74 73 35 50 61 72 73 65 20  SDECL Fts5Parse 
ef90: 2a 70 50 61 72 73 65 3b 0d 0a 23 64 65 66 69 6e  *pParse;..#defin
efa0: 65 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  e sqlite3Fts5Par
efb0: 73 65 72 41 52 47 5f 50 44 45 43 4c 20 2c 46 74  serARG_PDECL ,Ft
efc0: 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 0d  s5Parse *pParse.
efd0: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
efe0: 46 74 73 35 50 61 72 73 65 72 41 52 47 5f 50 41  Fts5ParserARG_PA
eff0: 52 41 4d 20 2c 70 50 61 72 73 65 0d 0a 23 64 65  RAM ,pParse..#de
f000: 66 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73 35  fine sqlite3Fts5
f010: 50 61 72 73 65 72 41 52 47 5f 46 45 54 43 48 20  ParserARG_FETCH 
f020: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
f030: 65 3d 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  e=fts5yypParser-
f040: 3e 70 50 61 72 73 65 3b 0d 0a 23 64 65 66 69 6e  >pParse;..#defin
f050: 65 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  e sqlite3Fts5Par
f060: 73 65 72 41 52 47 5f 53 54 4f 52 45 20 66 74 73  serARG_STORE fts
f070: 35 79 79 70 50 61 72 73 65 72 2d 3e 70 50 61 72  5yypParser->pPar
f080: 73 65 3d 70 50 61 72 73 65 3b 0d 0a 23 64 65 66  se=pParse;..#def
f090: 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73 35 50  ine sqlite3Fts5P
f0a0: 61 72 73 65 72 43 54 58 5f 53 44 45 43 4c 0d 0a  arserCTX_SDECL..
f0b0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 46  #define sqlite3F
f0c0: 74 73 35 50 61 72 73 65 72 43 54 58 5f 50 44 45  ts5ParserCTX_PDE
f0d0: 43 4c 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  CL..#define sqli
f0e0: 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54 58  te3Fts5ParserCTX
f0f0: 5f 50 41 52 41 4d 0d 0a 23 64 65 66 69 6e 65 20  _PARAM..#define 
f100: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
f110: 72 43 54 58 5f 46 45 54 43 48 0d 0a 23 64 65 66  rCTX_FETCH..#def
f120: 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73 35 50  ine sqlite3Fts5P
f130: 61 72 73 65 72 43 54 58 5f 53 54 4f 52 45 0d 0a  arserCTX_STORE..
f140: 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 4e 53  #define fts5YYNS
f150: 54 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20  TATE            
f160: 20 33 35 0d 0a 23 64 65 66 69 6e 65 20 66 74 73   35..#define fts
f170: 35 59 59 4e 52 55 4c 45 20 20 20 20 20 20 20 20  5YYNRULE        
f180: 20 20 20 20 20 20 32 38 0d 0a 23 64 65 66 69 6e        28..#defin
f190: 65 20 66 74 73 35 59 59 4e 46 54 53 35 54 4f 4b  e fts5YYNFTS5TOK
f1a0: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 31  EN             1
f1b0: 36 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59  6..#define fts5Y
f1c0: 59 5f 4d 41 58 5f 53 48 49 46 54 20 20 20 20 20  Y_MAX_SHIFT     
f1d0: 20 20 20 20 33 34 0d 0a 23 64 65 66 69 6e 65 20      34..#define 
f1e0: 66 74 73 35 59 59 5f 4d 49 4e 5f 53 48 49 46 54  fts5YY_MIN_SHIFT
f1f0: 52 45 44 55 43 45 20 20 20 35 32 0d 0a 23 64 65  REDUCE   52..#de
f200: 66 69 6e 65 20 66 74 73 35 59 59 5f 4d 41 58 5f  fine fts5YY_MAX_
f210: 53 48 49 46 54 52 45 44 55 43 45 20 20 20 37 39  SHIFTREDUCE   79
f220: 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59  ..#define fts5YY
f230: 5f 45 52 52 4f 52 5f 41 43 54 49 4f 4e 20 20 20  _ERROR_ACTION   
f240: 20 20 20 38 30 0d 0a 23 64 65 66 69 6e 65 20 66     80..#define f
f250: 74 73 35 59 59 5f 41 43 43 45 50 54 5f 41 43 54  ts5YY_ACCEPT_ACT
f260: 49 4f 4e 20 20 20 20 20 38 31 0d 0a 23 64 65 66  ION     81..#def
f270: 69 6e 65 20 66 74 73 35 59 59 5f 4e 4f 5f 41 43  ine fts5YY_NO_AC
f280: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 38 32 0d  TION         82.
f290: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f  .#define fts5YY_
f2a0: 4d 49 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20  MIN_REDUCE      
f2b0: 20 20 38 33 0d 0a 23 64 65 66 69 6e 65 20 66 74    83..#define ft
f2c0: 73 35 59 59 5f 4d 41 58 5f 52 45 44 55 43 45 20  s5YY_MAX_REDUCE 
f2d0: 20 20 20 20 20 20 20 31 31 30 0d 0a 2f 2a 2a 2a         110../***
f2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 63  ********** End c
f2f0: 6f 6e 74 72 6f 6c 20 23 64 65 66 69 6e 65 73 20  ontrol #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 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 23 64  ***********/..#d
f330: 65 66 69 6e 65 20 66 74 73 35 59 59 5f 4e 4c 4f  efine fts5YY_NLO
f340: 4f 4b 41 48 45 41 44 20 28 28 69 6e 74 29 28 73  OKAHEAD ((int)(s
f350: 69 7a 65 6f 66 28 66 74 73 35 79 79 5f 6c 6f 6f  izeof(fts5yy_loo
f360: 6b 61 68 65 61 64 29 2f 73 69 7a 65 6f 66 28 66  kahead)/sizeof(f
f370: 74 73 35 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  ts5yy_lookahead[
f380: 30 5d 29 29 29 0d 0a 0d 0a 2f 2a 20 44 65 66 69  0])))..../* Defi
f390: 6e 65 20 74 68 65 20 66 74 73 35 79 79 74 65 73  ne the fts5yytes
f3a0: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
f3b0: 20 62 65 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69   be a no-op if i
f3c0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 64 65  s not already de
f3d0: 66 69 6e 65 64 0d 0a 2a 2a 20 6f 74 68 65 72 77  fined..** otherw
f3e0: 69 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 70 70  ise...**..** App
f3f0: 6c 69 63 61 74 69 6f 6e 73 20 63 61 6e 20 63 68  lications can ch
f400: 6f 6f 73 65 20 74 6f 20 64 65 66 69 6e 65 20 66  oose to define f
f410: 74 73 35 79 79 74 65 73 74 63 61 73 65 28 29 20  ts5yytestcase() 
f420: 69 6e 20 74 68 65 20 25 69 6e 63 6c 75 64 65 20  in the %include 
f430: 73 65 63 74 69 6f 6e 0d 0a 2a 2a 20 74 6f 20 61  section..** to a
f440: 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6e 20   macro that can 
f450: 61 73 73 69 73 74 20 69 6e 20 76 65 72 69 66 79  assist in verify
f460: 69 6e 67 20 63 6f 64 65 20 63 6f 76 65 72 61 67  ing code coverag
f470: 65 2e 20 20 46 6f 72 20 70 72 6f 64 75 63 74 69  e.  For producti
f480: 6f 6e 0d 0a 2a 2a 20 63 6f 64 65 20 74 68 65 20  on..** code the 
f490: 66 74 73 35 79 79 74 65 73 74 63 61 73 65 28 29  fts5yytestcase()
f4a0: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
f4b0: 20 74 75 72 6e 65 64 20 6f 66 66 2e 20 20 42 75   turned off.  Bu
f4c0: 74 20 69 74 20 69 73 20 75 73 65 66 75 6c 0d 0a  t it is useful..
f4d0: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0d  ** for testing..
f4e0: 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20 66 74 73  .*/..#ifndef fts
f4f0: 35 79 79 74 65 73 74 63 61 73 65 0d 0a 23 20 64  5yytestcase..# d
f500: 65 66 69 6e 65 20 66 74 73 35 79 79 74 65 73 74  efine fts5yytest
f510: 63 61 73 65 28 58 29 0d 0a 23 65 6e 64 69 66 0d  case(X)..#endif.
f520: 0a 0d 0a 0d 0a 2f 2a 20 4e 65 78 74 20 61 72 65  ...../* Next are
f530: 20 74 68 65 20 74 61 62 6c 65 73 20 75 73 65 64   the tables used
f540: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
f550: 61 74 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b  at action to tak
f560: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0d 0a  e based on the..
f570: 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
f580: 20 61 6e 64 20 6c 6f 6f 6b 61 68 65 61 64 20 74   and lookahead t
f590: 6f 6b 65 6e 2e 20 20 54 68 65 73 65 20 74 61 62  oken.  These tab
f5a0: 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  les are used to 
f5b0: 69 6d 70 6c 65 6d 65 6e 74 0d 0a 2a 2a 20 66 75  implement..** fu
f5c0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 74 61 6b  nctions that tak
f5d0: 65 20 61 20 73 74 61 74 65 20 6e 75 6d 62 65 72  e a state number
f5e0: 20 61 6e 64 20 6c 6f 6f 6b 61 68 65 61 64 20 76   and lookahead v
f5f0: 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20  alue and return 
f600: 61 6e 0d 0a 2a 2a 20 61 63 74 69 6f 6e 20 69 6e  an..** action in
f610: 74 65 67 65 72 2e 20 20 0d 0a 2a 2a 0d 0a 2a 2a  teger.  ..**..**
f620: 20 53 75 70 70 6f 73 65 20 74 68 65 20 61 63 74   Suppose the act
f630: 69 6f 6e 20 69 6e 74 65 67 65 72 20 69 73 20 4e  ion integer is N
f640: 2e 20 20 54 68 65 6e 20 74 68 65 20 61 63 74 69  .  Then the acti
f650: 6f 6e 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  on is determined
f660: 20 61 73 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 0d   as..** follows.
f670: 0a 2a 2a 0d 0a 2a 2a 20 20 20 30 20 3c 3d 20 4e  .**..**   0 <= N
f680: 20 3c 3d 20 66 74 73 35 59 59 5f 4d 41 58 5f 53   <= fts5YY_MAX_S
f690: 48 49 46 54 20 20 20 20 20 20 20 20 20 20 20 20  HIFT            
f6a0: 20 53 68 69 66 74 20 4e 2e 20 20 54 68 61 74 20   Shift N.  That 
f6b0: 69 73 2c 20 70 75 73 68 20 74 68 65 20 6c 6f 6f  is, push the loo
f6c0: 6b 61 68 65 61 64 0d 0a 2a 2a 20 20 20 20 20 20  kahead..**      
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 20 20 20 20 20 20 20                  
f6f0: 74 6f 6b 65 6e 20 6f 6e 74 6f 20 74 68 65 20 73  token onto the s
f700: 74 61 63 6b 20 61 6e 64 20 67 6f 74 6f 20 73 74  tack and goto st
f710: 61 74 65 20 4e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 20  ate N...**..**  
f720: 20 4e 20 62 65 74 77 65 65 6e 20 66 74 73 35 59   N between fts5Y
f730: 59 5f 4d 49 4e 5f 53 48 49 46 54 52 45 44 55 43  Y_MIN_SHIFTREDUC
f740: 45 20 20 20 20 20 20 20 53 68 69 66 74 20 74 6f  E       Shift to
f750: 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 73 74   an arbitrary st
f760: 61 74 65 20 74 68 65 6e 0d 0a 2a 2a 20 20 20 20  ate then..**    
f770: 20 61 6e 64 20 66 74 73 35 59 59 5f 4d 41 58 5f   and fts5YY_MAX_
f780: 53 48 49 46 54 52 45 44 55 43 45 20 20 20 20 20  SHIFTREDUCE     
f790: 20 20 20 20 20 20 72 65 64 75 63 65 20 62 79 20        reduce by 
f7a0: 72 75 6c 65 20 4e 2d 66 74 73 35 59 59 5f 4d 49  rule N-fts5YY_MI
f7b0: 4e 5f 53 48 49 46 54 52 45 44 55 43 45 2e 0d 0a  N_SHIFTREDUCE...
f7c0: 2a 2a 0d 0a 2a 2a 20 20 20 4e 20 3d 3d 20 66 74  **..**   N == ft
f7d0: 73 35 59 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f  s5YY_ERROR_ACTIO
f7e0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
f7f0: 41 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 68  A syntax error h
f800: 61 73 20 6f 63 63 75 72 72 65 64 2e 0d 0a 2a 2a  as occurred...**
f810: 0d 0a 2a 2a 20 20 20 4e 20 3d 3d 20 66 74 73 35  ..**   N == fts5
f820: 59 59 5f 41 43 43 45 50 54 5f 41 43 54 49 4f 4e  YY_ACCEPT_ACTION
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
f840: 65 20 70 61 72 73 65 72 20 61 63 63 65 70 74 73  e parser accepts
f850: 20 69 74 73 20 69 6e 70 75 74 2e 0d 0a 2a 2a 0d   its input...**.
f860: 0a 2a 2a 20 20 20 4e 20 3d 3d 20 66 74 73 35 59  .**   N == fts5Y
f870: 59 5f 4e 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20  Y_NO_ACTION     
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 20               No 
f890: 73 75 63 68 20 61 63 74 69 6f 6e 2e 20 20 44 65  such action.  De
f8a0: 6e 6f 74 65 73 20 75 6e 75 73 65 64 0d 0a 2a 2a  notes unused..**
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 20                  
f8d0: 20 20 20 20 20 20 73 6c 6f 74 73 20 69 6e 20 74        slots in t
f8e0: 68 65 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e  he fts5yy_action
f8f0: 5b 5d 20 74 61 62 6c 65 2e 0d 0a 2a 2a 0d 0a 2a  [] table...**..*
f900: 2a 20 20 20 4e 20 62 65 74 77 65 65 6e 20 66 74  *   N between ft
f910: 73 35 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45 20  s5YY_MIN_REDUCE 
f920: 20 20 20 20 20 20 20 20 20 20 20 52 65 64 75 63             Reduc
f930: 65 20 62 79 20 72 75 6c 65 20 4e 2d 66 74 73 35  e by rule N-fts5
f940: 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45 0d 0a 2a  YY_MIN_REDUCE..*
f950: 2a 20 20 20 20 20 61 6e 64 20 66 74 73 35 59 59  *     and fts5YY
f960: 5f 4d 41 58 5f 52 45 44 55 43 45 0d 0a 2a 2a 0d  _MAX_REDUCE..**.
f970: 0a 2a 2a 20 54 68 65 20 61 63 74 69 6f 6e 20 74  .** The action t
f980: 61 62 6c 65 20 69 73 20 63 6f 6e 73 74 72 75 63  able is construc
f990: 74 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ted as a single 
f9a0: 6c 61 72 67 65 20 74 61 62 6c 65 20 6e 61 6d 65  large table name
f9b0: 64 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e 5b  d fts5yy_action[
f9c0: 5d 2e 0d 0a 2a 2a 20 47 69 76 65 6e 20 73 74 61  ]...** Given sta
f9d0: 74 65 20 53 20 61 6e 64 20 6c 6f 6f 6b 61 68 65  te S and lookahe
f9e0: 61 64 20 58 2c 20 74 68 65 20 61 63 74 69 6f 6e  ad X, the action
f9f0: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 73 20   is computed as 
fa00: 65 69 74 68 65 72 3a 0d 0a 2a 2a 0d 0a 2a 2a 20  either:..**..** 
fa10: 20 20 20 28 41 29 20 20 20 4e 20 3d 20 66 74 73     (A)   N = fts
fa20: 35 79 79 5f 61 63 74 69 6f 6e 5b 20 66 74 73 35  5yy_action[ fts5
fa30: 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 53 5d  yy_shift_ofst[S]
fa40: 20 2b 20 58 20 5d 0d 0a 2a 2a 20 20 20 20 28 42   + X ]..**    (B
fa50: 29 20 20 20 4e 20 3d 20 66 74 73 35 79 79 5f 64  )   N = fts5yy_d
fa60: 65 66 61 75 6c 74 5b 53 5d 0d 0a 2a 2a 0d 0a 2a  efault[S]..**..*
fa70: 2a 20 54 68 65 20 28 41 29 20 66 6f 72 6d 75 6c  * The (A) formul
fa80: 61 20 69 73 20 70 72 65 66 65 72 72 65 64 2e 20  a is preferred. 
fa90: 20 54 68 65 20 42 20 66 6f 72 6d 75 6c 61 20 69   The B formula i
faa0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 69  s used instead i
fab0: 66 0d 0a 2a 2a 20 66 74 73 35 79 79 5f 6c 6f 6f  f..** fts5yy_loo
fac0: 6b 61 68 65 61 64 5b 66 74 73 35 79 79 5f 73 68  kahead[fts5yy_sh
fad0: 69 66 74 5f 6f 66 73 74 5b 53 5d 2b 58 5d 20 69  ift_ofst[S]+X] i
fae0: 73 20 6e 6f 74 20 65 71 75 61 6c 20 74 6f 20 58  s not equal to X
faf0: 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f  ...**..** The fo
fb00: 72 6d 75 6c 61 73 20 61 62 6f 76 65 20 61 72 65  rmulas above are
fb10: 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
fb20: 68 65 20 61 63 74 69 6f 6e 20 77 68 65 6e 20 74  he action when t
fb30: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 0d  he lookahead is.
fb40: 0a 2a 2a 20 61 20 74 65 72 6d 69 6e 61 6c 20 73  .** a terminal s
fb50: 79 6d 62 6f 6c 2e 20 20 49 66 20 74 68 65 20 6c  ymbol.  If the l
fb60: 6f 6f 6b 61 68 65 61 64 20 69 73 20 61 20 6e 6f  ookahead is a no
fb70: 6e 2d 74 65 72 6d 69 6e 61 6c 20 28 61 73 20 6f  n-terminal (as o
fb80: 63 63 75 72 73 20 61 66 74 65 72 0d 0a 2a 2a 20  ccurs after..** 
fb90: 61 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 29  a reduce action)
fba0: 20 74 68 65 6e 20 74 68 65 20 66 74 73 35 79 79   then the fts5yy
fbb0: 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 61  _reduce_ofst[] a
fbc0: 72 72 61 79 20 69 73 20 75 73 65 64 20 69 6e 20  rray is used in 
fbd0: 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 74 68 65  place of..** the
fbe0: 20 66 74 73 35 79 79 5f 73 68 69 66 74 5f 6f 66   fts5yy_shift_of
fbf0: 73 74 5b 5d 20 61 72 72 61 79 2e 0d 0a 2a 2a 0d  st[] array...**.
fc00: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
fc10: 67 20 61 72 65 20 74 68 65 20 74 61 62 6c 65 73  g are the tables
fc20: 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
fc30: 69 73 20 73 65 63 74 69 6f 6e 3a 0d 0a 2a 2a 0d  is section:..**.
fc40: 0a 2a 2a 20 20 66 74 73 35 79 79 5f 61 63 74 69  .**  fts5yy_acti
fc50: 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69  on[]        A si
fc60: 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61  ngle table conta
fc70: 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e  ining all action
fc80: 73 2e 0d 0a 2a 2a 20 20 66 74 73 35 79 79 5f 6c  s...**  fts5yy_l
fc90: 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20 20 41  ookahead[]     A
fca0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
fcb0: 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  g the lookahead 
fcc0: 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79 20 69  for each entry i
fcd0: 6e 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n..**           
fce0: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 79 79            fts5yy
fcf0: 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20 74  _action.  Used t
fd00: 6f 20 64 65 74 65 63 74 20 68 61 73 68 20 63 6f  o detect hash co
fd10: 6c 6c 69 73 69 6f 6e 73 2e 0d 0a 2a 2a 20 20 66  llisions...**  f
fd20: 74 73 35 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  ts5yy_shift_ofst
fd30: 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73  []    For each s
fd40: 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
fd50: 20 69 6e 74 6f 20 66 74 73 35 79 79 5f 61 63 74   into fts5yy_act
fd60: 69 6f 6e 20 66 6f 72 0d 0a 2a 2a 20 20 20 20 20  ion for..**     
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61  shifting termina
fd90: 6c 73 2e 0d 0a 2a 2a 20 20 66 74 73 35 79 79 5f  ls...**  fts5yy_
fda0: 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20  reduce_ofst[]   
fdb0: 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20  For each state, 
fdc0: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
fdd0: 66 74 73 35 79 79 5f 61 63 74 69 6f 6e 20 66 6f  fts5yy_action fo
fde0: 72 0d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r..**           
fdf0: 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74 69            shifti
fe00: 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  ng non-terminals
fe10: 20 61 66 74 65 72 20 61 20 72 65 64 75 63 65 2e   after a reduce.
fe20: 0d 0a 2a 2a 20 20 66 74 73 35 79 79 5f 64 65 66  ..**  fts5yy_def
fe30: 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44 65 66  ault[]       Def
fe40: 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  ault action for 
fe50: 65 61 63 68 20 73 74 61 74 65 2e 0d 0a 2a 2a 0d  each state...**.
fe60: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  .*********** Beg
fe70: 69 6e 20 70 61 72 73 69 6e 67 20 74 61 62 6c 65  in parsing table
fe80: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
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 2a 2a 2a 2a 2a 2a 2a  ****************
feb0: 2f 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35 59  /..#define fts5Y
fec0: 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28  Y_ACTTAB_COUNT (
fed0: 31 30 35 29 0d 0a 73 74 61 74 69 63 20 63 6f 6e  105)..static con
fee0: 73 74 20 66 74 73 35 59 59 41 43 54 49 4f 4e 54  st fts5YYACTIONT
fef0: 59 50 45 20 66 74 73 35 79 79 5f 61 63 74 69 6f  YPE fts5yy_actio
ff00: 6e 5b 5d 20 3d 20 7b 0d 0a 20 2f 2a 20 20 20 20  n[] = {.. /*    
ff10: 20 30 20 2a 2f 20 20 20 20 38 31 2c 20 20 20 32   0 */    81,   2
ff20: 30 2c 20 20 20 39 36 2c 20 20 20 20 36 2c 20 20  0,   96,    6,  
ff30: 20 32 38 2c 20 20 20 39 39 2c 20 20 20 39 38 2c   28,   99,   98,
ff40: 20 20 20 32 36 2c 20 20 20 32 36 2c 20 20 20 31     26,   26,   1
ff50: 38 2c 0d 0a 20 2f 2a 20 20 20 20 31 30 20 2a 2f  8,.. /*    10 */
ff60: 20 20 20 20 39 36 2c 20 20 20 20 36 2c 20 20 20      96,    6,   
ff70: 32 38 2c 20 20 20 31 37 2c 20 20 20 39 38 2c 20  28,   17,   98, 
ff80: 20 20 35 36 2c 20 20 20 32 36 2c 20 20 20 31 39    56,   26,   19
ff90: 2c 20 20 20 39 36 2c 20 20 20 20 36 2c 0d 0a 20  ,   96,    6,.. 
ffa0: 2f 2a 20 20 20 20 32 30 20 2a 2f 20 20 20 20 32  /*    20 */    2
ffb0: 38 2c 20 20 20 31 34 2c 20 20 20 39 38 2c 20 20  8,   14,   98,  
ffc0: 20 31 34 2c 20 20 20 32 36 2c 20 20 20 33 31 2c   14,   26,   31,
ffd0: 20 20 20 39 32 2c 20 20 20 39 36 2c 20 20 20 20     92,   96,    
ffe0: 36 2c 20 20 20 32 38 2c 0d 0a 20 2f 2a 20 20 20  6,   28,.. /*   
fff0: 20 33 30 20 2a 2f 20 20 20 31 30 38 2c 20 20 20   30 */   108,   
10000 39 38 2c 20 20 20 32 35 2c 20 20 20 32 36 2c 20  98,   25,   26, 
10010 20 20 32 31 2c 20 20 20 39 36 2c 20 20 20 20 36    21,   96,    6
10020 2c 20 20 20 32 38 2c 20 20 20 37 38 2c 20 20 20  ,   28,   78,   
10030 39 38 2c 0d 0a 20 2f 2a 20 20 20 20 34 30 20 2a  98,.. /*    40 *
10040 2f 20 20 20 20 35 38 2c 20 20 20 32 36 2c 20 20  /    58,   26,  
10050 20 32 39 2c 20 20 20 39 36 2c 20 20 20 20 36 2c   29,   96,    6,
10060 20 20 20 32 38 2c 20 20 31 30 37 2c 20 20 20 39     28,  107,   9
10070 38 2c 20 20 20 32 32 2c 20 20 20 32 36 2c 0d 0a  8,   22,   26,..
10080 20 2f 2a 20 20 20 20 35 30 20 2a 2f 20 20 20 20   /*    50 */    
10090 32 34 2c 20 20 20 31 36 2c 20 20 20 31 32 2c 20  24,   16,   12, 
100a0 20 20 31 31 2c 20 20 20 20 31 2c 20 20 20 31 33    11,    1,   13
100b0 2c 20 20 20 31 33 2c 20 20 20 32 34 2c 20 20 20  ,   13,   24,   
100c0 31 36 2c 20 20 20 32 33 2c 0d 0a 20 2f 2a 20 20  16,   23,.. /*  
100d0 20 20 36 30 20 2a 2f 20 20 20 20 31 31 2c 20 20    60 */    11,  
100e0 20 33 33 2c 20 20 20 33 34 2c 20 20 20 31 33 2c   33,   34,   13,
100f0 20 20 20 39 37 2c 20 20 20 20 38 2c 20 20 20 32     97,    8,   2
10100 37 2c 20 20 20 33 32 2c 20 20 20 39 38 2c 20 20  7,   32,   98,  
10110 20 20 37 2c 0d 0a 20 2f 2a 20 20 20 20 37 30 20    7,.. /*    70 
10120 2a 2f 20 20 20 20 32 36 2c 20 20 20 20 33 2c 20  */    26,    3, 
10130 20 20 20 34 2c 20 20 20 20 35 2c 20 20 20 20 33     4,    5,    3
10140 2c 20 20 20 20 34 2c 20 20 20 20 35 2c 20 20 20  ,    4,    5,   
10150 20 33 2c 20 20 20 38 33 2c 20 20 20 20 34 2c 0d   3,   83,    4,.
10160 0a 20 2f 2a 20 20 20 20 38 30 20 2a 2f 20 20 20  . /*    80 */   
10170 20 20 35 2c 20 20 20 20 33 2c 20 20 20 36 33 2c    5,    3,   63,
10180 20 20 20 20 35 2c 20 20 20 20 33 2c 20 20 20 36      5,    3,   6
10190 32 2c 20 20 20 31 32 2c 20 20 20 20 32 2c 20 20  2,   12,    2,  
101a0 20 38 36 2c 20 20 20 31 33 2c 0d 0a 20 2f 2a 20   86,   13,.. /* 
101b0 20 20 20 39 30 20 2a 2f 20 20 20 20 20 39 2c 20     90 */     9, 
101c0 20 20 33 30 2c 20 20 20 31 30 2c 20 20 20 31 30    30,   10,   10
101d0 2c 20 20 20 35 34 2c 20 20 20 35 37 2c 20 20 20  ,   54,   57,   
101e0 37 35 2c 20 20 20 37 38 2c 20 20 20 37 38 2c 20  75,   78,   78, 
101f0 20 20 35 33 2c 0d 0a 20 2f 2a 20 20 20 31 30 30    53,.. /*   100
10200 20 2a 2f 20 20 20 20 35 37 2c 20 20 20 31 35 2c   */    57,   15,
10210 20 20 20 38 32 2c 20 20 20 38 32 2c 20 20 20 37     82,   82,   7
10220 31 2c 0d 0a 7d 3b 0d 0a 73 74 61 74 69 63 20 63  1,..};..static c
10230 6f 6e 73 74 20 66 74 73 35 59 59 43 4f 44 45 54  onst fts5YYCODET
10240 59 50 45 20 66 74 73 35 79 79 5f 6c 6f 6f 6b 61  YPE fts5yy_looka
10250 68 65 61 64 5b 5d 20 3d 20 7b 0d 0a 20 2f 2a 20  head[] = {.. /* 
10260 20 20 20 20 30 20 2a 2f 20 20 20 20 31 36 2c 20      0 */    16, 
10270 20 20 31 37 2c 20 20 20 31 38 2c 20 20 20 31 39    17,   18,   19
10280 2c 20 20 20 32 30 2c 20 20 20 32 32 2c 20 20 20  ,   20,   22,   
10290 32 32 2c 20 20 20 32 34 2c 20 20 20 32 34 2c 20  22,   24,   24, 
102a0 20 20 31 37 2c 0d 0a 20 2f 2a 20 20 20 20 31 30    17,.. /*    10
102b0 20 2a 2f 20 20 20 20 31 38 2c 20 20 20 31 39 2c   */    18,   19,
102c0 20 20 20 32 30 2c 20 20 20 20 37 2c 20 20 20 32     20,    7,   2
102d0 32 2c 20 20 20 20 39 2c 20 20 20 32 34 2c 20 20  2,    9,   24,  
102e0 20 31 37 2c 20 20 20 31 38 2c 20 20 20 31 39 2c   17,   18,   19,
102f0 0d 0a 20 2f 2a 20 20 20 20 32 30 20 2a 2f 20 20  .. /*    20 */  
10300 20 20 32 30 2c 20 20 20 20 39 2c 20 20 20 32 32    20,    9,   22
10310 2c 20 20 20 20 39 2c 20 20 20 32 34 2c 20 20 20  ,    9,   24,   
10320 31 33 2c 20 20 20 31 37 2c 20 20 20 31 38 2c 20  13,   17,   18, 
10330 20 20 31 39 2c 20 20 20 32 30 2c 0d 0a 20 2f 2a    19,   20,.. /*
10340 20 20 20 20 33 30 20 2a 2f 20 20 20 20 32 36 2c      30 */    26,
10350 20 20 20 32 32 2c 20 20 20 32 34 2c 20 20 20 32     22,   24,   2
10360 34 2c 20 20 20 31 37 2c 20 20 20 31 38 2c 20 20  4,   17,   18,  
10370 20 31 39 2c 20 20 20 32 30 2c 20 20 20 31 35 2c   19,   20,   15,
10380 20 20 20 32 32 2c 0d 0a 20 2f 2a 20 20 20 20 34     22,.. /*    4
10390 30 20 2a 2f 20 20 20 20 20 39 2c 20 20 20 32 34  0 */     9,   24
103a0 2c 20 20 20 31 37 2c 20 20 20 31 38 2c 20 20 20  ,   17,   18,   
103b0 31 39 2c 20 20 20 32 30 2c 20 20 20 32 36 2c 20  19,   20,   26, 
103c0 20 20 32 32 2c 20 20 20 32 31 2c 20 20 20 32 34    22,   21,   24
103d0 2c 0d 0a 20 2f 2a 20 20 20 20 35 30 20 2a 2f 20  ,.. /*    50 */ 
103e0 20 20 20 20 36 2c 20 20 20 20 37 2c 20 20 20 20      6,    7,    
103f0 39 2c 20 20 20 20 39 2c 20 20 20 31 30 2c 20 20  9,    9,   10,  
10400 20 31 32 2c 20 20 20 31 32 2c 20 20 20 20 36 2c   12,   12,    6,
10410 20 20 20 20 37 2c 20 20 20 32 31 2c 0d 0a 20 2f      7,   21,.. /
10420 2a 20 20 20 20 36 30 20 2a 2f 20 20 20 20 20 39  *    60 */     9
10430 2c 20 20 20 32 34 2c 20 20 20 32 35 2c 20 20 20  ,   24,   25,   
10440 31 32 2c 20 20 20 31 38 2c 20 20 20 20 35 2c 20  12,   18,    5, 
10450 20 20 32 30 2c 20 20 20 31 34 2c 20 20 20 32 32    20,   14,   22
10460 2c 20 20 20 20 35 2c 0d 0a 20 2f 2a 20 20 20 20  ,    5,.. /*    
10470 37 30 20 2a 2f 20 20 20 20 32 34 2c 20 20 20 20  70 */    24,    
10480 33 2c 20 20 20 20 31 2c 20 20 20 20 32 2c 20 20  3,    1,    2,  
10490 20 20 33 2c 20 20 20 20 31 2c 20 20 20 20 32 2c    3,    1,    2,
104a0 20 20 20 20 33 2c 20 20 20 20 30 2c 20 20 20 20      3,    0,    
104b0 31 2c 0d 0a 20 2f 2a 20 20 20 20 38 30 20 2a 2f  1,.. /*    80 */
104c0 20 20 20 20 20 32 2c 20 20 20 20 33 2c 20 20 20       2,    3,   
104d0 31 31 2c 20 20 20 20 32 2c 20 20 20 20 33 2c 20  11,    2,    3, 
104e0 20 20 31 31 2c 20 20 20 20 39 2c 20 20 20 31 30    11,    9,   10
104f0 2c 20 20 20 20 35 2c 20 20 20 31 32 2c 0d 0a 20  ,    5,   12,.. 
10500 2f 2a 20 20 20 20 39 30 20 2a 2f 20 20 20 20 32  /*    90 */    2
10510 33 2c 20 20 20 32 34 2c 20 20 20 31 30 2c 20 20  3,   24,   10,  
10520 20 31 30 2c 20 20 20 20 38 2c 20 20 20 20 39 2c   10,    8,    9,
10530 20 20 20 20 39 2c 20 20 20 31 35 2c 20 20 20 31      9,   15,   1
10540 35 2c 20 20 20 20 38 2c 0d 0a 20 2f 2a 20 20 20  5,    8,.. /*   
10550 31 30 30 20 2a 2f 20 20 20 20 20 39 2c 20 20 20  100 */     9,   
10560 20 39 2c 20 20 20 32 37 2c 20 20 20 32 37 2c 20   9,   27,   27, 
10570 20 20 31 31 2c 20 20 20 32 37 2c 20 20 20 32 37    11,   27,   27
10580 2c 20 20 20 32 37 2c 20 20 20 32 37 2c 20 20 20  ,   27,   27,   
10590 32 37 2c 0d 0a 20 2f 2a 20 20 20 31 31 30 20 2a  27,.. /*   110 *
105a0 2f 20 20 20 20 32 37 2c 20 20 20 32 37 2c 20 20  /    27,   27,  
105b0 20 32 37 2c 20 20 20 32 37 2c 20 20 20 32 37 2c   27,   27,   27,
105c0 20 20 20 32 37 2c 20 20 20 32 37 2c 20 20 20 32     27,   27,   2
105d0 37 2c 20 20 20 32 37 2c 20 20 20 32 37 2c 0d 0a  7,   27,   27,..
105e0 20 2f 2a 20 20 20 31 32 30 20 2a 2f 20 20 20 20   /*   120 */    
105f0 32 37 2c 0d 0a 7d 3b 0d 0a 23 64 65 66 69 6e 65  27,..};..#define
10600 20 66 74 73 35 59 59 5f 53 48 49 46 54 5f 43 4f   fts5YY_SHIFT_CO
10610 55 4e 54 20 20 20 20 28 33 34 29 0d 0a 23 64 65  UNT    (34)..#de
10620 66 69 6e 65 20 66 74 73 35 59 59 5f 53 48 49 46  fine fts5YY_SHIF
10630 54 5f 4d 49 4e 20 20 20 20 20 20 28 30 29 0d 0a  T_MIN      (0)..
10640 23 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f 53  #define fts5YY_S
10650 48 49 46 54 5f 4d 41 58 20 20 20 20 20 20 28 39  HIFT_MAX      (9
10660 33 29 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  3)..static const
10670 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66   unsigned char f
10680 74 73 35 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  ts5yy_shift_ofst
10690 5b 5d 20 3d 20 7b 0d 0a 20 2f 2a 20 20 20 20 20  [] = {.. /*     
106a0 30 20 2a 2f 20 20 20 20 34 34 2c 20 20 20 34 34  0 */    44,   44
106b0 2c 20 20 20 34 34 2c 20 20 20 34 34 2c 20 20 20  ,   44,   44,   
106c0 34 34 2c 20 20 20 34 34 2c 20 20 20 35 31 2c 20  44,   44,   51, 
106d0 20 20 37 37 2c 20 20 20 34 33 2c 20 20 20 31 32    77,   43,   12
106e0 2c 0d 0a 20 2f 2a 20 20 20 20 31 30 20 2a 2f 20  ,.. /*    10 */ 
106f0 20 20 20 31 34 2c 20 20 20 38 33 2c 20 20 20 38     14,   83,   8
10700 32 2c 20 20 20 31 34 2c 20 20 20 32 33 2c 20 20  2,   14,   23,  
10710 20 32 33 2c 20 20 20 33 31 2c 20 20 20 33 31 2c   23,   31,   31,
10720 20 20 20 37 31 2c 20 20 20 37 34 2c 0d 0a 20 2f     71,   74,.. /
10730 2a 20 20 20 20 32 30 20 2a 2f 20 20 20 20 37 38  *    20 */    78
10740 2c 20 20 20 38 31 2c 20 20 20 38 36 2c 20 20 20  ,   81,   86,   
10750 39 31 2c 20 20 20 20 36 2c 20 20 20 35 33 2c 20  91,    6,   53, 
10760 20 20 35 33 2c 20 20 20 36 30 2c 20 20 20 36 34    53,   60,   64
10770 2c 20 20 20 36 38 2c 0d 0a 20 2f 2a 20 20 20 20  ,   68,.. /*    
10780 33 30 20 2a 2f 20 20 20 20 35 33 2c 20 20 20 38  30 */    53,   8
10790 37 2c 20 20 20 39 32 2c 20 20 20 35 33 2c 20 20  7,   92,   53,  
107a0 20 39 33 2c 0d 0a 7d 3b 0d 0a 23 64 65 66 69 6e   93,..};..#defin
107b0 65 20 66 74 73 35 59 59 5f 52 45 44 55 43 45 5f  e fts5YY_REDUCE_
107c0 43 4f 55 4e 54 20 28 31 37 29 0d 0a 23 64 65 66  COUNT (17)..#def
107d0 69 6e 65 20 66 74 73 35 59 59 5f 52 45 44 55 43  ine fts5YY_REDUC
107e0 45 5f 4d 49 4e 20 20 20 28 2d 31 37 29 0d 0a 23  E_MIN   (-17)..#
107f0 64 65 66 69 6e 65 20 66 74 73 35 59 59 5f 52 45  define fts5YY_RE
10800 44 55 43 45 5f 4d 41 58 20 20 20 28 36 37 29 0d  DUCE_MAX   (67).
10810 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 69  .static const si
10820 67 6e 65 64 20 63 68 61 72 20 66 74 73 35 79 79  gned char fts5yy
10830 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d  _reduce_ofst[] =
10840 20 7b 0d 0a 20 2f 2a 20 20 20 20 20 30 20 2a 2f   {.. /*     0 */
10850 20 20 20 2d 31 36 2c 20 20 20 2d 38 2c 20 20 20     -16,   -8,   
10860 20 30 2c 20 20 20 20 39 2c 20 20 20 31 37 2c 20   0,    9,   17, 
10870 20 20 32 35 2c 20 20 20 34 36 2c 20 20 2d 31 37    25,   46,  -17
10880 2c 20 20 2d 31 37 2c 20 20 20 33 37 2c 0d 0a 20  ,  -17,   37,.. 
10890 2f 2a 20 20 20 20 31 30 20 2a 2f 20 20 20 20 36  /*    10 */    6
108a0 37 2c 20 20 20 20 34 2c 20 20 20 20 34 2c 20 20  7,    4,    4,  
108b0 20 20 38 2c 20 20 20 20 34 2c 20 20 20 32 30 2c    8,    4,   20,
108c0 20 20 20 32 37 2c 20 20 20 33 38 2c 0d 0a 7d 3b     27,   38,..};
108d0 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 66  ..static const f
108e0 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50 45 20  ts5YYACTIONTYPE 
108f0 66 74 73 35 79 79 5f 64 65 66 61 75 6c 74 5b 5d  fts5yy_default[]
10900 20 3d 20 7b 0d 0a 20 2f 2a 20 20 20 20 20 30 20   = {.. /*     0 
10910 2a 2f 20 20 20 20 38 30 2c 20 20 20 38 30 2c 20  */    80,   80, 
10920 20 20 38 30 2c 20 20 20 38 30 2c 20 20 20 38 30    80,   80,   80
10930 2c 20 20 20 38 30 2c 20 20 20 39 35 2c 20 20 20  ,   80,   95,   
10940 38 30 2c 20 20 20 38 30 2c 20 20 31 30 35 2c 0d  80,   80,  105,.
10950 0a 20 2f 2a 20 20 20 20 31 30 20 2a 2f 20 20 20  . /*    10 */   
10960 20 38 30 2c 20 20 31 31 30 2c 20 20 31 31 30 2c   80,  110,  110,
10970 20 20 20 38 30 2c 20 20 31 31 30 2c 20 20 31 31     80,  110,  11
10980 30 2c 20 20 20 38 30 2c 20 20 20 38 30 2c 20 20  0,   80,   80,  
10990 20 38 30 2c 20 20 20 38 30 2c 0d 0a 20 2f 2a 20   80,   80,.. /* 
109a0 20 20 20 32 30 20 2a 2f 20 20 20 20 38 30 2c 20     20 */    80, 
109b0 20 20 39 31 2c 20 20 20 38 30 2c 20 20 20 38 30    91,   80,   80
109c0 2c 20 20 20 38 30 2c 20 20 31 30 31 2c 20 20 31  ,   80,  101,  1
109d0 30 30 2c 20 20 20 38 30 2c 20 20 20 38 30 2c 20  00,   80,   80, 
109e0 20 20 39 30 2c 0d 0a 20 2f 2a 20 20 20 20 33 30    90,.. /*    30
109f0 20 2a 2f 20 20 20 31 30 33 2c 20 20 20 38 30 2c   */   103,   80,
10a00 20 20 20 38 30 2c 20 20 31 30 34 2c 20 20 20 38     80,  104,   8
10a10 30 2c 0d 0a 7d 3b 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a  0,..};../*******
10a20 2a 2a 2a 20 45 6e 64 20 6f 66 20 6c 65 6d 6f 6e  *** End of lemon
10a30 2d 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 69  -generated parsi
10a40 6e 67 20 74 61 62 6c 65 73 20 2a 2a 2a 2a 2a 2a  ng tables ******
10a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a60 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 20 54  *******/..../* T
10a70 68 65 20 6e 65 78 74 20 74 61 62 6c 65 20 6d 61  he next table ma
10a80 70 73 20 74 6f 6b 65 6e 73 20 28 74 65 72 6d 69  ps tokens (termi
10a90 6e 61 6c 20 73 79 6d 62 6f 6c 73 29 20 69 6e 74  nal symbols) int
10aa0 6f 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e  o fallback token
10ab0 73 2e 20 20 0d 0a 2a 2a 20 49 66 20 61 20 63 6f  s.  ..** If a co
10ac0 6e 73 74 72 75 63 74 20 6c 69 6b 65 20 74 68 65  nstruct like the
10ad0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0d 0a 2a 2a 20   following:..** 
10ae0 0d 0a 2a 2a 20 20 20 20 20 20 25 66 61 6c 6c 62  ..**      %fallb
10af0 61 63 6b 20 49 44 20 58 20 59 20 5a 2e 0d 0a 2a  ack ID X Y Z...*
10b00 2a 0d 0a 2a 2a 20 61 70 70 65 61 72 73 20 69 6e  *..** appears in
10b10 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 74 68   the grammar, th
10b20 65 6e 20 49 44 20 62 65 63 6f 6d 65 73 20 61 20  en ID becomes a 
10b30 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 66  fallback token f
10b40 6f 72 20 58 2c 20 59 2c 0d 0a 2a 2a 20 61 6e 64  or X, Y,..** and
10b50 20 5a 2e 20 20 57 68 65 6e 65 76 65 72 20 6f 6e   Z.  Whenever on
10b60 65 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 73 20  e of the tokens 
10b70 58 2c 20 59 2c 20 6f 72 20 5a 20 69 73 20 69 6e  X, Y, or Z is in
10b80 70 75 74 20 74 6f 20 74 68 65 20 70 61 72 73 65  put to the parse
10b90 72 0d 0a 2a 2a 20 62 75 74 20 69 74 20 64 6f 65  r..** but it doe
10ba0 73 20 6e 6f 74 20 70 61 72 73 65 2c 20 74 68 65  s not parse, the
10bb0 20 74 79 70 65 20 6f 66 20 74 68 65 20 74 6f 6b   type of the tok
10bc0 65 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  en is changed to
10bd0 20 49 44 20 61 6e 64 0d 0a 2a 2a 20 74 68 65 20   ID and..** the 
10be0 70 61 72 73 65 20 69 73 20 72 65 74 72 69 65 64  parse is retried
10bf0 20 62 65 66 6f 72 65 20 61 6e 20 65 72 72 6f 72   before an error
10c00 20 69 73 20 74 68 72 6f 77 6e 2e 0d 0a 2a 2a 0d   is thrown...**.
10c10 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
10c20 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 66 6f   can be used, fo
10c30 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 63 61  r example, to ca
10c40 75 73 65 20 73 6f 6d 65 20 6b 65 79 77 6f 72 64  use some keyword
10c50 73 20 69 6e 20 61 20 6c 61 6e 67 75 61 67 65 0d  s in a language.
10c60 0a 2a 2a 20 74 6f 20 72 65 76 65 72 74 20 74 6f  .** to revert to
10c70 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 66 20   identifiers if 
10c80 74 68 65 79 20 6b 65 79 77 6f 72 64 20 64 6f 65  they keyword doe
10c90 73 20 6e 6f 74 20 61 70 70 6c 79 20 69 6e 20 74  s not apply in t
10ca0 68 65 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65  he context where
10cb0 0d 0a 2a 2a 20 69 74 20 61 70 70 65 61 72 73 2e  ..** it appears.
10cc0 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 66 74 73  ..*/..#ifdef fts
10cd0 35 59 59 46 41 4c 4c 42 41 43 4b 0d 0a 73 74 61  5YYFALLBACK..sta
10ce0 74 69 63 20 63 6f 6e 73 74 20 66 74 73 35 59 59  tic const fts5YY
10cf0 43 4f 44 45 54 59 50 45 20 66 74 73 35 79 79 46  CODETYPE fts5yyF
10d00 61 6c 6c 62 61 63 6b 5b 5d 20 3d 20 7b 0d 0a 7d  allback[] = {..}
10d10 3b 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 66 74 73  ;..#endif /* fts
10d20 35 59 59 46 41 4c 4c 42 41 43 4b 20 2a 2f 0d 0a  5YYFALLBACK */..
10d30 0d 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ../* The followi
10d40 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65 70  ng structure rep
10d50 72 65 73 65 6e 74 73 20 61 20 73 69 6e 67 6c 65  resents a single
10d60 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 0d   element of the.
10d70 0a 2a 2a 20 70 61 72 73 65 72 27 73 20 73 74 61  .** parser's sta
10d80 63 6b 2e 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  ck.  Information
10d90 20 73 74 6f 72 65 64 20 69 6e 63 6c 75 64 65 73   stored includes
10da0 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2b 20 20 54  :..**..**   +  T
10db0 68 65 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20  he state number 
10dc0 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 61  for the parser a
10dd0 74 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20  t this level of 
10de0 74 68 65 20 73 74 61 63 6b 2e 0d 0a 2a 2a 0d 0a  the stack...**..
10df0 2a 2a 20 20 20 2b 20 20 54 68 65 20 76 61 6c 75  **   +  The valu
10e00 65 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 73  e of the token s
10e10 74 6f 72 65 64 20 61 74 20 74 68 69 73 20 6c 65  tored at this le
10e20 76 65 6c 20 6f 66 20 74 68 65 20 73 74 61 63 6b  vel of the stack
10e30 2e 0d 0a 2a 2a 20 20 20 20 20 20 28 49 6e 20 6f  ...**      (In o
10e40 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
10e50 22 6d 61 6a 6f 72 22 20 74 6f 6b 65 6e 2e 29 0d  "major" token.).
10e60 0a 2a 2a 0d 0a 2a 2a 20 20 20 2b 20 20 54 68 65  .**..**   +  The
10e70 20 73 65 6d 61 6e 74 69 63 20 76 61 6c 75 65 20   semantic value 
10e80 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 20 6c  stored at this l
10e90 65 76 65 6c 20 6f 66 20 74 68 65 20 73 74 61 63  evel of the stac
10ea0 6b 2e 20 20 54 68 69 73 20 69 73 0d 0a 2a 2a 20  k.  This is..** 
10eb0 20 20 20 20 20 74 68 65 20 69 6e 66 6f 72 6d 61       the informa
10ec0 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
10ed0 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
10ee0 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   in the grammar.
10ef0 0d 0a 2a 2a 20 20 20 20 20 20 49 74 20 69 73 20  ..**      It is 
10f00 73 6f 6d 65 74 69 6d 65 73 20 63 61 6c 6c 65 64  sometimes called
10f10 20 74 68 65 20 22 6d 69 6e 6f 72 22 20 74 6f 6b   the "minor" tok
10f20 65 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 41 66 74 65  en...**..** Afte
10f30 72 20 74 68 65 20 22 73 68 69 66 74 22 20 68 61  r the "shift" ha
10f40 6c 66 20 6f 66 20 61 20 53 48 49 46 54 52 45 44  lf of a SHIFTRED
10f50 55 43 45 20 61 63 74 69 6f 6e 2c 20 74 68 65 20  UCE action, the 
10f60 73 74 61 74 65 6e 6f 20 66 69 65 6c 64 0d 0a 2a  stateno field..*
10f70 2a 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 74 61  * actually conta
10f80 69 6e 73 20 74 68 65 20 72 65 64 75 63 65 20 61  ins the reduce a
10f90 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 65  ction for the se
10fa0 63 6f 6e 64 20 68 61 6c 66 20 6f 66 20 74 68 65  cond half of the
10fb0 0d 0a 2a 2a 20 53 48 49 46 54 52 45 44 55 43 45  ..** SHIFTREDUCE
10fc0 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63 74 20 66 74  ...*/..struct ft
10fd0 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79 20 7b  s5yyStackEntry {
10fe0 0d 0a 20 20 66 74 73 35 59 59 41 43 54 49 4f 4e  ..  fts5YYACTION
10ff0 54 59 50 45 20 73 74 61 74 65 6e 6f 3b 20 20 2f  TYPE stateno;  /
11000 2a 20 54 68 65 20 73 74 61 74 65 2d 6e 75 6d 62  * The state-numb
11010 65 72 2c 20 6f 72 20 72 65 64 75 63 65 20 61 63  er, or reduce ac
11020 74 69 6f 6e 20 69 6e 20 53 48 49 46 54 52 45 44  tion in SHIFTRED
11030 55 43 45 20 2a 2f 0d 0a 20 20 66 74 73 35 59 59  UCE */..  fts5YY
11040 43 4f 44 45 54 59 50 45 20 6d 61 6a 6f 72 3b 20  CODETYPE major; 
11050 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 6a 6f       /* The majo
11060 72 20 74 6f 6b 65 6e 20 76 61 6c 75 65 2e 20 20  r token value.  
11070 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 64 65  This is the code
11080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11090 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 75             ** nu
110a0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 6f 6b  mber for the tok
110b0 65 6e 20 61 74 20 74 68 69 73 20 73 74 61 63 6b  en at this stack
110c0 20 6c 65 76 65 6c 20 2a 2f 0d 0a 20 20 66 74 73   level */..  fts
110d0 35 59 59 4d 49 4e 4f 52 54 59 50 45 20 6d 69 6e  5YYMINORTYPE min
110e0 6f 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75  or;     /* The u
110f0 73 65 72 2d 73 75 70 70 6c 69 65 64 20 6d 69 6e  ser-supplied min
11100 6f 72 20 74 6f 6b 65 6e 20 76 61 6c 75 65 2e 20  or token value. 
11110 20 54 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20   This..         
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 2a 2a 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  ** is the value 
11140 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 20 2a 2f  of the token  */
11150 0d 0a 7d 3b 0d 0a 74 79 70 65 64 65 66 20 73 74  ..};..typedef st
11160 72 75 63 74 20 66 74 73 35 79 79 53 74 61 63 6b  ruct fts5yyStack
11170 45 6e 74 72 79 20 66 74 73 35 79 79 53 74 61 63  Entry fts5yyStac
11180 6b 45 6e 74 72 79 3b 0d 0a 0d 0a 2f 2a 20 54 68  kEntry;..../* Th
11190 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
111a0 61 72 73 65 72 20 69 73 20 63 6f 6d 70 6c 65 74  arser is complet
111b0 65 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ely contained in
111c0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0d   an instance of.
111d0 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
111e0 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0d 0a  g structure */..
111f0 73 74 72 75 63 74 20 66 74 73 35 79 79 50 61 72  struct fts5yyPar
11200 73 65 72 20 7b 0d 0a 20 20 66 74 73 35 79 79 53  ser {..  fts5yyS
11210 74 61 63 6b 45 6e 74 72 79 20 2a 66 74 73 35 79  tackEntry *fts5y
11220 79 74 6f 73 3b 20 20 20 20 20 20 20 20 20 20 2f  ytos;          /
11230 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 6f 70  * Pointer to top
11240 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
11250 73 74 61 63 6b 20 2a 2f 0d 0a 23 69 66 64 65 66  stack */..#ifdef
11260 20 66 74 73 35 59 59 54 52 41 43 4b 4d 41 58 53   fts5YYTRACKMAXS
11270 54 41 43 4b 44 45 50 54 48 0d 0a 20 20 69 6e 74  TACKDEPTH..  int
11280 20 66 74 73 35 79 79 68 77 6d 3b 20 20 20 20 20   fts5yyhwm;     
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
112a0 2a 20 48 69 67 68 2d 77 61 74 65 72 20 6d 61 72  * High-water mar
112b0 6b 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 2a  k of the stack *
112c0 2f 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 6e 64  /..#endif..#ifnd
112d0 65 66 20 66 74 73 35 59 59 4e 4f 45 52 52 4f 52  ef fts5YYNOERROR
112e0 52 45 43 4f 56 45 52 59 0d 0a 20 20 69 6e 74 20  RECOVERY..  int 
112f0 66 74 73 35 79 79 65 72 72 63 6e 74 3b 20 20 20  fts5yyerrcnt;   
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11310 20 53 68 69 66 74 73 20 6c 65 66 74 20 62 65 66   Shifts left bef
11320 6f 72 65 20 6f 75 74 20 6f 66 20 74 68 65 20 65  ore out of the e
11330 72 72 6f 72 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d  rror */..#endif.
11340 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  .  sqlite3Fts5Pa
11350 72 73 65 72 41 52 47 5f 53 44 45 43 4c 20 20 20  rserARG_SDECL   
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11370 41 20 70 6c 61 63 65 20 74 6f 20 68 6f 6c 64 20  A place to hold 
11380 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 20  %extra_argument 
11390 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73  */..  sqlite3Fts
113a0 35 50 61 72 73 65 72 43 54 58 5f 53 44 45 43 4c  5ParserCTX_SDECL
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113c0 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 68 6f  /* A place to ho
113d0 6c 64 20 25 65 78 74 72 61 5f 63 6f 6e 74 65 78  ld %extra_contex
113e0 74 20 2a 2f 0d 0a 23 69 66 20 66 74 73 35 59 59  t */..#if fts5YY
113f0 53 54 41 43 4b 44 45 50 54 48 3c 3d 30 0d 0a 20  STACKDEPTH<=0.. 
11400 20 69 6e 74 20 66 74 73 35 79 79 73 74 6b 73 7a   int fts5yystksz
11410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11420 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
11430 64 65 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  de of the stack 
11440 2a 2f 0d 0a 20 20 66 74 73 35 79 79 53 74 61 63  */..  fts5yyStac
11450 6b 45 6e 74 72 79 20 2a 66 74 73 35 79 79 73 74  kEntry *fts5yyst
11460 61 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ack;        /* T
11470 68 65 20 70 61 72 73 65 72 27 73 20 73 74 61 63  he parser's stac
11480 6b 20 2a 2f 0d 0a 20 20 66 74 73 35 79 79 53 74  k */..  fts5yySt
11490 61 63 6b 45 6e 74 72 79 20 66 74 73 35 79 79 73  ackEntry fts5yys
114a0 74 6b 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tk0;          /*
114b0 20 46 69 72 73 74 20 73 74 61 63 6b 20 65 6e 74   First stack ent
114c0 72 79 20 2a 2f 0d 0a 23 65 6c 73 65 0d 0a 20 20  ry */..#else..  
114d0 66 74 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79  fts5yyStackEntry
114e0 20 66 74 73 35 79 79 73 74 61 63 6b 5b 66 74 73   fts5yystack[fts
114f0 35 59 59 53 54 41 43 4b 44 45 50 54 48 5d 3b 20  5YYSTACKDEPTH]; 
11500 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 27 73   /* The parser's
11510 20 73 74 61 63 6b 20 2a 2f 0d 0a 20 20 66 74 73   stack */..  fts
11520 35 79 79 53 74 61 63 6b 45 6e 74 72 79 20 2a 66  5yyStackEntry *f
11530 74 73 35 79 79 73 74 61 63 6b 45 6e 64 3b 20 20  ts5yystackEnd;  
11540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
11550 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  t entry in the s
11560 74 61 63 6b 20 2a 2f 0d 0a 23 65 6e 64 69 66 0d  tack */..#endif.
11570 0a 7d 3b 0d 0a 74 79 70 65 64 65 66 20 73 74 72  .};..typedef str
11580 75 63 74 20 66 74 73 35 79 79 50 61 72 73 65 72  uct fts5yyParser
11590 20 66 74 73 35 79 79 50 61 72 73 65 72 3b 0d 0a   fts5yyParser;..
115a0 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
115b0 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  ..#include <stdi
115c0 6f 2e 68 3e 0d 0a 73 74 61 74 69 63 20 46 49 4c  o.h>..static FIL
115d0 45 20 2a 66 74 73 35 79 79 54 72 61 63 65 46 49  E *fts5yyTraceFI
115e0 4c 45 20 3d 20 30 3b 0d 0a 73 74 61 74 69 63 20  LE = 0;..static 
115f0 63 68 61 72 20 2a 66 74 73 35 79 79 54 72 61 63  char *fts5yyTrac
11600 65 50 72 6f 6d 70 74 20 3d 20 30 3b 0d 0a 23 65  ePrompt = 0;..#e
11610 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
11620 2f 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45  /....#ifndef NDE
11630 42 55 47 0d 0a 2f 2a 20 0d 0a 2a 2a 20 54 75 72  BUG../* ..** Tur
11640 6e 20 70 61 72 73 65 72 20 74 72 61 63 69 6e 67  n parser tracing
11650 20 6f 6e 20 62 79 20 67 69 76 69 6e 67 20 61 20   on by giving a 
11660 73 74 72 65 61 6d 20 74 6f 20 77 68 69 63 68 20  stream to which 
11670 74 6f 20 77 72 69 74 65 20 74 68 65 20 74 72 61  to write the tra
11680 63 65 0d 0a 2a 2a 20 61 6e 64 20 61 20 70 72 6f  ce..** and a pro
11690 6d 70 74 20 74 6f 20 70 72 65 66 61 63 65 20 65  mpt to preface e
116a0 61 63 68 20 74 72 61 63 65 20 6d 65 73 73 61 67  ach trace messag
116b0 65 2e 20 20 54 72 61 63 69 6e 67 20 69 73 20 74  e.  Tracing is t
116c0 75 72 6e 65 64 20 6f 66 66 0d 0a 2a 2a 20 62 79  urned off..** by
116d0 20 6d 61 6b 69 6e 67 20 65 69 74 68 65 72 20 61   making either a
116e0 72 67 75 6d 65 6e 74 20 4e 55 4c 4c 20 0d 0a 2a  rgument NULL ..*
116f0 2a 0d 0a 2a 2a 20 49 6e 70 75 74 73 3a 0d 0a 2a  *..** Inputs:..*
11700 2a 20 3c 75 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e 20  * <ul>..** <li> 
11710 41 20 46 49 4c 45 2a 20 74 6f 20 77 68 69 63 68  A FILE* to which
11720 20 74 72 61 63 65 20 6f 75 74 70 75 74 20 73 68   trace output sh
11730 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 2e  ould be written.
11740 0d 0a 2a 2a 20 20 20 20 20 20 49 66 20 4e 55 4c  ..**      If NUL
11750 4c 2c 20 74 68 65 6e 20 74 72 61 63 69 6e 67 20  L, then tracing 
11760 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0d 0a  is turned off...
11770 2a 2a 20 3c 6c 69 3e 20 41 20 70 72 65 66 69 78  ** <li> A prefix
11780 20 73 74 72 69 6e 67 20 77 72 69 74 74 65 6e 20   string written 
11790 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
117a0 20 6f 66 20 65 76 65 72 79 0d 0a 2a 2a 20 20 20   of every..**   
117b0 20 20 20 6c 69 6e 65 20 6f 66 20 74 72 61 63 65     line of trace
117c0 20 6f 75 74 70 75 74 2e 20 20 49 66 20 4e 55 4c   output.  If NUL
117d0 4c 2c 20 74 68 65 6e 20 74 72 61 63 69 6e 67 20  L, then tracing 
117e0 69 73 0d 0a 2a 2a 20 20 20 20 20 20 74 75 72 6e  is..**      turn
117f0 65 64 20 6f 66 66 2e 0d 0a 2a 2a 20 3c 2f 75 6c  ed off...** </ul
11800 3e 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 75 74 70 75 74  >..**..** Output
11810 73 3a 0d 0a 2a 2a 20 4e 6f 6e 65 2e 0d 0a 2a 2f  s:..** None...*/
11820 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  ..static void sq
11830 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 54  lite3Fts5ParserT
11840 72 61 63 65 28 46 49 4c 45 20 2a 54 72 61 63 65  race(FILE *Trace
11850 46 49 4c 45 2c 20 63 68 61 72 20 2a 7a 54 72 61  FILE, char *zTra
11860 63 65 50 72 6f 6d 70 74 29 7b 0d 0a 20 20 66 74  cePrompt){..  ft
11870 73 35 79 79 54 72 61 63 65 46 49 4c 45 20 3d 20  s5yyTraceFILE = 
11880 54 72 61 63 65 46 49 4c 45 3b 0d 0a 20 20 66 74  TraceFILE;..  ft
11890 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74 20  s5yyTracePrompt 
118a0 3d 20 7a 54 72 61 63 65 50 72 6f 6d 70 74 3b 0d  = zTracePrompt;.
118b0 0a 20 20 69 66 28 20 66 74 73 35 79 79 54 72 61  .  if( fts5yyTra
118c0 63 65 46 49 4c 45 3d 3d 30 20 29 20 66 74 73 35  ceFILE==0 ) fts5
118d0 79 79 54 72 61 63 65 50 72 6f 6d 70 74 20 3d 20  yyTracePrompt = 
118e0 30 3b 0d 0a 20 20 65 6c 73 65 20 69 66 28 20 66  0;..  else if( f
118f0 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74  ts5yyTracePrompt
11900 3d 3d 30 20 29 20 66 74 73 35 79 79 54 72 61 63  ==0 ) fts5yyTrac
11910 65 46 49 4c 45 20 3d 20 30 3b 0d 0a 7d 0d 0a 23  eFILE = 0;..}..#
11920 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
11930 2a 2f 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65  */....#if define
11940 64 28 66 74 73 35 59 59 43 4f 56 45 52 41 47 45  d(fts5YYCOVERAGE
11950 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
11960 45 42 55 47 29 0d 0a 2f 2a 20 46 6f 72 20 74 72  EBUG)../* For tr
11970 61 63 69 6e 67 20 73 68 69 66 74 73 2c 20 74 68  acing shifts, th
11980 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 74  e names of all t
11990 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
119a0 74 65 72 6d 69 6e 61 6c 73 0d 0a 2a 2a 20 61 72  terminals..** ar
119b0 65 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 65  e required.  The
119c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
119d0 20 73 75 70 70 6c 69 65 73 20 74 68 65 73 65 20   supplies these 
119e0 6e 61 6d 65 73 20 2a 2f 0d 0a 73 74 61 74 69 63  names */..static
119f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
11a00 73 74 20 66 74 73 35 79 79 54 6f 6b 65 6e 4e 61  st fts5yyTokenNa
11a10 6d 65 5b 5d 20 3d 20 7b 20 0d 0a 20 20 2f 2a 20  me[] = { ..  /* 
11a20 20 20 20 30 20 2a 2f 20 22 24 22 2c 0d 0a 20 20     0 */ "$",..  
11a30 2f 2a 20 20 20 20 31 20 2a 2f 20 22 4f 52 22 2c  /*    1 */ "OR",
11a40 0d 0a 20 20 2f 2a 20 20 20 20 32 20 2a 2f 20 22  ..  /*    2 */ "
11a50 41 4e 44 22 2c 0d 0a 20 20 2f 2a 20 20 20 20 33  AND",..  /*    3
11a60 20 2a 2f 20 22 4e 4f 54 22 2c 0d 0a 20 20 2f 2a   */ "NOT",..  /*
11a70 20 20 20 20 34 20 2a 2f 20 22 54 45 52 4d 22 2c      4 */ "TERM",
11a80 0d 0a 20 20 2f 2a 20 20 20 20 35 20 2a 2f 20 22  ..  /*    5 */ "
11a90 43 4f 4c 4f 4e 22 2c 0d 0a 20 20 2f 2a 20 20 20  COLON",..  /*   
11aa0 20 36 20 2a 2f 20 22 4d 49 4e 55 53 22 2c 0d 0a   6 */ "MINUS",..
11ab0 20 20 2f 2a 20 20 20 20 37 20 2a 2f 20 22 4c 43    /*    7 */ "LC
11ac0 50 22 2c 0d 0a 20 20 2f 2a 20 20 20 20 38 20 2a  P",..  /*    8 *
11ad0 2f 20 22 52 43 50 22 2c 0d 0a 20 20 2f 2a 20 20  / "RCP",..  /*  
11ae0 20 20 39 20 2a 2f 20 22 53 54 52 49 4e 47 22 2c    9 */ "STRING",
11af0 0d 0a 20 20 2f 2a 20 20 20 31 30 20 2a 2f 20 22  ..  /*   10 */ "
11b00 4c 50 22 2c 0d 0a 20 20 2f 2a 20 20 20 31 31 20  LP",..  /*   11 
11b10 2a 2f 20 22 52 50 22 2c 0d 0a 20 20 2f 2a 20 20  */ "RP",..  /*  
11b20 20 31 32 20 2a 2f 20 22 43 41 52 45 54 22 2c 0d   12 */ "CARET",.
11b30 0a 20 20 2f 2a 20 20 20 31 33 20 2a 2f 20 22 43  .  /*   13 */ "C
11b40 4f 4d 4d 41 22 2c 0d 0a 20 20 2f 2a 20 20 20 31  OMMA",..  /*   1
11b50 34 20 2a 2f 20 22 50 4c 55 53 22 2c 0d 0a 20 20  4 */ "PLUS",..  
11b60 2f 2a 20 20 20 31 35 20 2a 2f 20 22 53 54 41 52  /*   15 */ "STAR
11b70 22 2c 0d 0a 20 20 2f 2a 20 20 20 31 36 20 2a 2f  ",..  /*   16 */
11b80 20 22 69 6e 70 75 74 22 2c 0d 0a 20 20 2f 2a 20   "input",..  /* 
11b90 20 20 31 37 20 2a 2f 20 22 65 78 70 72 22 2c 0d    17 */ "expr",.
11ba0 0a 20 20 2f 2a 20 20 20 31 38 20 2a 2f 20 22 63  .  /*   18 */ "c
11bb0 6e 65 61 72 73 65 74 22 2c 0d 0a 20 20 2f 2a 20  nearset",..  /* 
11bc0 20 20 31 39 20 2a 2f 20 22 65 78 70 72 6c 69 73    19 */ "exprlis
11bd0 74 22 2c 0d 0a 20 20 2f 2a 20 20 20 32 30 20 2a  t",..  /*   20 *
11be0 2f 20 22 63 6f 6c 73 65 74 22 2c 0d 0a 20 20 2f  / "colset",..  /
11bf0 2a 20 20 20 32 31 20 2a 2f 20 22 63 6f 6c 73 65  *   21 */ "colse
11c00 74 6c 69 73 74 22 2c 0d 0a 20 20 2f 2a 20 20 20  tlist",..  /*   
11c10 32 32 20 2a 2f 20 22 6e 65 61 72 73 65 74 22 2c  22 */ "nearset",
11c20 0d 0a 20 20 2f 2a 20 20 20 32 33 20 2a 2f 20 22  ..  /*   23 */ "
11c30 6e 65 61 72 70 68 72 61 73 65 73 22 2c 0d 0a 20  nearphrases",.. 
11c40 20 2f 2a 20 20 20 32 34 20 2a 2f 20 22 70 68 72   /*   24 */ "phr
11c50 61 73 65 22 2c 0d 0a 20 20 2f 2a 20 20 20 32 35  ase",..  /*   25
11c60 20 2a 2f 20 22 6e 65 61 72 64 69 73 74 5f 6f 70   */ "neardist_op
11c70 74 22 2c 0d 0a 20 20 2f 2a 20 20 20 32 36 20 2a  t",..  /*   26 *
11c80 2f 20 22 73 74 61 72 5f 6f 70 74 22 2c 0d 0a 7d  / "star_opt",..}
11c90 3b 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ;..#endif /* def
11ca0 69 6e 65 64 28 66 74 73 35 59 59 43 4f 56 45 52  ined(fts5YYCOVER
11cb0 41 47 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  AGE) || !defined
11cc0 28 4e 44 45 42 55 47 29 20 2a 2f 0d 0a 0d 0a 23  (NDEBUG) */....#
11cd0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 2f  ifndef NDEBUG../
11ce0 2a 20 46 6f 72 20 74 72 61 63 69 6e 67 20 72 65  * For tracing re
11cf0 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 74 68  duce actions, th
11d00 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72  e names of all r
11d10 75 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  ules are require
11d20 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 63  d...*/..static c
11d30 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
11d40 20 66 74 73 35 79 79 52 75 6c 65 4e 61 6d 65 5b   fts5yyRuleName[
11d50 5d 20 3d 20 7b 0d 0a 20 2f 2a 20 20 20 30 20 2a  ] = {.. /*   0 *
11d60 2f 20 22 69 6e 70 75 74 20 3a 3a 3d 20 65 78 70  / "input ::= exp
11d70 72 22 2c 0d 0a 20 2f 2a 20 20 20 31 20 2a 2f 20  r",.. /*   1 */ 
11d80 22 63 6f 6c 73 65 74 20 3a 3a 3d 20 4d 49 4e 55  "colset ::= MINU
11d90 53 20 4c 43 50 20 63 6f 6c 73 65 74 6c 69 73 74  S LCP colsetlist
11da0 20 52 43 50 22 2c 0d 0a 20 2f 2a 20 20 20 32 20   RCP",.. /*   2 
11db0 2a 2f 20 22 63 6f 6c 73 65 74 20 3a 3a 3d 20 4c  */ "colset ::= L
11dc0 43 50 20 63 6f 6c 73 65 74 6c 69 73 74 20 52 43  CP colsetlist RC
11dd0 50 22 2c 0d 0a 20 2f 2a 20 20 20 33 20 2a 2f 20  P",.. /*   3 */ 
11de0 22 63 6f 6c 73 65 74 20 3a 3a 3d 20 53 54 52 49  "colset ::= STRI
11df0 4e 47 22 2c 0d 0a 20 2f 2a 20 20 20 34 20 2a 2f  NG",.. /*   4 */
11e00 20 22 63 6f 6c 73 65 74 20 3a 3a 3d 20 4d 49 4e   "colset ::= MIN
11e10 55 53 20 53 54 52 49 4e 47 22 2c 0d 0a 20 2f 2a  US STRING",.. /*
11e20 20 20 20 35 20 2a 2f 20 22 63 6f 6c 73 65 74 6c     5 */ "colsetl
11e30 69 73 74 20 3a 3a 3d 20 63 6f 6c 73 65 74 6c 69  ist ::= colsetli
11e40 73 74 20 53 54 52 49 4e 47 22 2c 0d 0a 20 2f 2a  st STRING",.. /*
11e50 20 20 20 36 20 2a 2f 20 22 63 6f 6c 73 65 74 6c     6 */ "colsetl
11e60 69 73 74 20 3a 3a 3d 20 53 54 52 49 4e 47 22 2c  ist ::= STRING",
11e70 0d 0a 20 2f 2a 20 20 20 37 20 2a 2f 20 22 65 78  .. /*   7 */ "ex
11e80 70 72 20 3a 3a 3d 20 65 78 70 72 20 41 4e 44 20  pr ::= expr AND 
11e90 65 78 70 72 22 2c 0d 0a 20 2f 2a 20 20 20 38 20  expr",.. /*   8 
11ea0 2a 2f 20 22 65 78 70 72 20 3a 3a 3d 20 65 78 70  */ "expr ::= exp
11eb0 72 20 4f 52 20 65 78 70 72 22 2c 0d 0a 20 2f 2a  r OR expr",.. /*
11ec0 20 20 20 39 20 2a 2f 20 22 65 78 70 72 20 3a 3a     9 */ "expr ::
11ed0 3d 20 65 78 70 72 20 4e 4f 54 20 65 78 70 72 22  = expr NOT expr"
11ee0 2c 0d 0a 20 2f 2a 20 20 31 30 20 2a 2f 20 22 65  ,.. /*  10 */ "e
11ef0 78 70 72 20 3a 3a 3d 20 63 6f 6c 73 65 74 20 43  xpr ::= colset C
11f00 4f 4c 4f 4e 20 4c 50 20 65 78 70 72 20 52 50 22  OLON LP expr RP"
11f10 2c 0d 0a 20 2f 2a 20 20 31 31 20 2a 2f 20 22 65  ,.. /*  11 */ "e
11f20 78 70 72 20 3a 3a 3d 20 4c 50 20 65 78 70 72 20  xpr ::= LP expr 
11f30 52 50 22 2c 0d 0a 20 2f 2a 20 20 31 32 20 2a 2f  RP",.. /*  12 */
11f40 20 22 65 78 70 72 20 3a 3a 3d 20 65 78 70 72 6c   "expr ::= exprl
11f50 69 73 74 22 2c 0d 0a 20 2f 2a 20 20 31 33 20 2a  ist",.. /*  13 *
11f60 2f 20 22 65 78 70 72 6c 69 73 74 20 3a 3a 3d 20  / "exprlist ::= 
11f70 63 6e 65 61 72 73 65 74 22 2c 0d 0a 20 2f 2a 20  cnearset",.. /* 
11f80 20 31 34 20 2a 2f 20 22 65 78 70 72 6c 69 73 74   14 */ "exprlist
11f90 20 3a 3a 3d 20 65 78 70 72 6c 69 73 74 20 63 6e   ::= exprlist cn
11fa0 65 61 72 73 65 74 22 2c 0d 0a 20 2f 2a 20 20 31  earset",.. /*  1
11fb0 35 20 2a 2f 20 22 63 6e 65 61 72 73 65 74 20 3a  5 */ "cnearset :
11fc0 3a 3d 20 6e 65 61 72 73 65 74 22 2c 0d 0a 20 2f  := nearset",.. /
11fd0 2a 20 20 31 36 20 2a 2f 20 22 63 6e 65 61 72 73  *  16 */ "cnears
11fe0 65 74 20 3a 3a 3d 20 63 6f 6c 73 65 74 20 43 4f  et ::= colset CO
11ff0 4c 4f 4e 20 6e 65 61 72 73 65 74 22 2c 0d 0a 20  LON nearset",.. 
12000 2f 2a 20 20 31 37 20 2a 2f 20 22 6e 65 61 72 73  /*  17 */ "nears
12010 65 74 20 3a 3a 3d 20 70 68 72 61 73 65 22 2c 0d  et ::= phrase",.
12020 0a 20 2f 2a 20 20 31 38 20 2a 2f 20 22 6e 65 61  . /*  18 */ "nea
12030 72 73 65 74 20 3a 3a 3d 20 43 41 52 45 54 20 70  rset ::= CARET p
12040 68 72 61 73 65 22 2c 0d 0a 20 2f 2a 20 20 31 39  hrase",.. /*  19
12050 20 2a 2f 20 22 6e 65 61 72 73 65 74 20 3a 3a 3d   */ "nearset ::=
12060 20 53 54 52 49 4e 47 20 4c 50 20 6e 65 61 72 70   STRING LP nearp
12070 68 72 61 73 65 73 20 6e 65 61 72 64 69 73 74 5f  hrases neardist_
12080 6f 70 74 20 52 50 22 2c 0d 0a 20 2f 2a 20 20 32  opt RP",.. /*  2
12090 30 20 2a 2f 20 22 6e 65 61 72 70 68 72 61 73 65  0 */ "nearphrase
120a0 73 20 3a 3a 3d 20 70 68 72 61 73 65 22 2c 0d 0a  s ::= phrase",..
120b0 20 2f 2a 20 20 32 31 20 2a 2f 20 22 6e 65 61 72   /*  21 */ "near
120c0 70 68 72 61 73 65 73 20 3a 3a 3d 20 6e 65 61 72  phrases ::= near
120d0 70 68 72 61 73 65 73 20 70 68 72 61 73 65 22 2c  phrases phrase",
120e0 0d 0a 20 2f 2a 20 20 32 32 20 2a 2f 20 22 6e 65  .. /*  22 */ "ne
120f0 61 72 64 69 73 74 5f 6f 70 74 20 3a 3a 3d 22 2c  ardist_opt ::=",
12100 0d 0a 20 2f 2a 20 20 32 33 20 2a 2f 20 22 6e 65  .. /*  23 */ "ne
12110 61 72 64 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 43  ardist_opt ::= C
12120 4f 4d 4d 41 20 53 54 52 49 4e 47 22 2c 0d 0a 20  OMMA STRING",.. 
12130 2f 2a 20 20 32 34 20 2a 2f 20 22 70 68 72 61 73  /*  24 */ "phras
12140 65 20 3a 3a 3d 20 70 68 72 61 73 65 20 50 4c 55  e ::= phrase PLU
12150 53 20 53 54 52 49 4e 47 20 73 74 61 72 5f 6f 70  S STRING star_op
12160 74 22 2c 0d 0a 20 2f 2a 20 20 32 35 20 2a 2f 20  t",.. /*  25 */ 
12170 22 70 68 72 61 73 65 20 3a 3a 3d 20 53 54 52 49  "phrase ::= STRI
12180 4e 47 20 73 74 61 72 5f 6f 70 74 22 2c 0d 0a 20  NG star_opt",.. 
12190 2f 2a 20 20 32 36 20 2a 2f 20 22 73 74 61 72 5f  /*  26 */ "star_
121a0 6f 70 74 20 3a 3a 3d 20 53 54 41 52 22 2c 0d 0a  opt ::= STAR",..
121b0 20 2f 2a 20 20 32 37 20 2a 2f 20 22 73 74 61 72   /*  27 */ "star
121c0 5f 6f 70 74 20 3a 3a 3d 22 2c 0d 0a 7d 3b 0d 0a  _opt ::=",..};..
121d0 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
121e0 20 2a 2f 0d 0a 0d 0a 0d 0a 23 69 66 20 66 74 73   */......#if fts
121f0 35 59 59 53 54 41 43 4b 44 45 50 54 48 3c 3d 30  5YYSTACKDEPTH<=0
12200 0d 0a 2f 2a 0d 0a 2a 2a 20 54 72 79 20 74 6f 20  ../*..** Try to 
12210 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
12220 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
12230 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
12240 68 65 20 6e 75 6d 62 65 72 0d 0a 2a 2a 20 6f 66  he number..** of
12250 20 65 72 72 6f 72 73 2e 20 20 52 65 74 75 72 6e   errors.  Return
12260 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a   0 on success...
12270 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */..static int f
12280 74 73 35 79 79 47 72 6f 77 53 74 61 63 6b 28 66  ts5yyGrowStack(f
12290 74 73 35 79 79 50 61 72 73 65 72 20 2a 70 29 7b  ts5yyParser *p){
122a0 0d 0a 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b  ..  int newSize;
122b0 0d 0a 20 20 69 6e 74 20 69 64 78 3b 0d 0a 20 20  ..  int idx;..  
122c0 66 74 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79  fts5yyStackEntry
122d0 20 2a 70 4e 65 77 3b 0d 0a 0d 0a 20 20 6e 65 77   *pNew;....  new
122e0 53 69 7a 65 20 3d 20 70 2d 3e 66 74 73 35 79 79  Size = p->fts5yy
122f0 73 74 6b 73 7a 2a 32 20 2b 20 31 30 30 3b 0d 0a  stksz*2 + 100;..
12300 20 20 69 64 78 20 3d 20 70 2d 3e 66 74 73 35 79    idx = p->fts5y
12310 79 74 6f 73 20 3f 20 28 69 6e 74 29 28 70 2d 3e  ytos ? (int)(p->
12320 66 74 73 35 79 79 74 6f 73 20 2d 20 70 2d 3e 66  fts5yytos - p->f
12330 74 73 35 79 79 73 74 61 63 6b 29 20 3a 20 30 3b  ts5yystack) : 0;
12340 0d 0a 20 20 69 66 28 20 70 2d 3e 66 74 73 35 79  ..  if( p->fts5y
12350 79 73 74 61 63 6b 3d 3d 26 70 2d 3e 66 74 73 35  ystack==&p->fts5
12360 79 79 73 74 6b 30 20 29 7b 0d 0a 20 20 20 20 70  yystk0 ){..    p
12370 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 6e 65 77  New = malloc(new
12380 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70 4e 65 77  Size*sizeof(pNew
12390 5b 30 5d 29 29 3b 0d 0a 20 20 20 20 69 66 28 20  [0]));..    if( 
123a0 70 4e 65 77 20 29 20 70 4e 65 77 5b 30 5d 20 3d  pNew ) pNew[0] =
123b0 20 70 2d 3e 66 74 73 35 79 79 73 74 6b 30 3b 0d   p->fts5yystk0;.
123c0 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70  .  }else{..    p
123d0 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d  New = realloc(p-
123e0 3e 66 74 73 35 79 79 73 74 61 63 6b 2c 20 6e 65  >fts5yystack, ne
123f0 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70 4e 65  wSize*sizeof(pNe
12400 77 5b 30 5d 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20  w[0]));..  }..  
12410 69 66 28 20 70 4e 65 77 20 29 7b 0d 0a 20 20 20  if( pNew ){..   
12420 20 70 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 20   p->fts5yystack 
12430 3d 20 70 4e 65 77 3b 0d 0a 20 20 20 20 70 2d 3e  = pNew;..    p->
12440 66 74 73 35 79 79 74 6f 73 20 3d 20 26 70 2d 3e  fts5yytos = &p->
12450 66 74 73 35 79 79 73 74 61 63 6b 5b 69 64 78 5d  fts5yystack[idx]
12460 3b 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
12470 47 0d 0a 20 20 20 20 69 66 28 20 66 74 73 35 79  G..    if( fts5y
12480 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20  yTraceFILE ){.. 
12490 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 74 73       fprintf(fts
124a0 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22 25 73  5yyTraceFILE,"%s
124b0 53 74 61 63 6b 20 67 72 6f 77 73 20 66 72 6f 6d  Stack grows from
124c0 20 25 64 20 74 6f 20 25 64 20 65 6e 74 72 69 65   %d to %d entrie
124d0 73 2e 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20  s.\n",..        
124e0 20 20 20 20 20 20 66 74 73 35 79 79 54 72 61 63        fts5yyTrac
124f0 65 50 72 6f 6d 70 74 2c 20 70 2d 3e 66 74 73 35  ePrompt, p->fts5
12500 79 79 73 74 6b 73 7a 2c 20 6e 65 77 53 69 7a 65  yystksz, newSize
12510 29 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64 69  );..    }..#endi
12520 66 0d 0a 20 20 20 20 70 2d 3e 66 74 73 35 79 79  f..    p->fts5yy
12530 73 74 6b 73 7a 20 3d 20 6e 65 77 53 69 7a 65 3b  stksz = newSize;
12540 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20  ..  }..  return 
12550 70 4e 65 77 3d 3d 30 3b 20 0d 0a 7d 0d 0a 23 65  pNew==0; ..}..#e
12560 6e 64 69 66 0d 0a 0d 0a 2f 2a 20 44 61 74 61 74  ndif..../* Datat
12570 79 70 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d  ype of the argum
12580 65 6e 74 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72  ent to the memor
12590 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 73 73  y allocated pass
125a0 65 64 20 61 73 20 74 68 65 0d 0a 2a 2a 20 73 65  ed as the..** se
125b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
125c0 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
125d0 65 72 41 6c 6c 6f 63 28 29 20 62 65 6c 6f 77 2e  erAlloc() below.
125e0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 63 68    This can be ch
125f0 61 6e 67 65 64 20 62 79 0d 0a 2a 2a 20 70 75 74  anged by..** put
12600 74 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ting an appropri
12610 61 74 65 20 23 64 65 66 69 6e 65 20 69 6e 20 74  ate #define in t
12620 68 65 20 25 69 6e 63 6c 75 64 65 20 73 65 63 74  he %include sect
12630 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ion of the input
12640 0d 0a 2a 2a 20 67 72 61 6d 6d 61 72 2e 0d 0a 2a  ..** grammar...*
12650 2f 0d 0a 23 69 66 6e 64 65 66 20 66 74 73 35 59  /..#ifndef fts5Y
12660 59 4d 41 4c 4c 4f 43 41 52 47 54 59 50 45 0d 0a  YMALLOCARGTYPE..
12670 23 20 64 65 66 69 6e 65 20 66 74 73 35 59 59 4d  # define fts5YYM
12680 41 4c 4c 4f 43 41 52 47 54 59 50 45 20 73 69 7a  ALLOCARGTYPE siz
12690 65 5f 74 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f  e_t..#endif..../
126a0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  * Initialize a n
126b0 65 77 20 70 61 72 73 65 72 20 74 68 61 74 20 68  ew parser that h
126c0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
126d0 61 6c 6c 6f 63 61 74 65 64 2e 0d 0a 2a 2f 0d 0a  allocated...*/..
126e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
126f0 74 65 33 46 74 73 35 50 61 72 73 65 72 49 6e 69  te3Fts5ParserIni
12700 74 28 76 6f 69 64 20 2a 66 74 73 35 79 79 70 52  t(void *fts5yypR
12710 61 77 50 61 72 73 65 72 20 73 71 6c 69 74 65 33  awParser sqlite3
12720 46 74 73 35 50 61 72 73 65 72 43 54 58 5f 50 44  Fts5ParserCTX_PD
12730 45 43 4c 29 7b 0d 0a 20 20 66 74 73 35 79 79 50  ECL){..  fts5yyP
12740 61 72 73 65 72 20 2a 66 74 73 35 79 79 70 50 61  arser *fts5yypPa
12750 72 73 65 72 20 3d 20 28 66 74 73 35 79 79 50 61  rser = (fts5yyPa
12760 72 73 65 72 2a 29 66 74 73 35 79 79 70 52 61 77  rser*)fts5yypRaw
12770 50 61 72 73 65 72 3b 0d 0a 20 20 73 71 6c 69 74  Parser;..  sqlit
12780 65 33 46 74 73 35 50 61 72 73 65 72 43 54 58 5f  e3Fts5ParserCTX_
12790 53 54 4f 52 45 0d 0a 23 69 66 64 65 66 20 66 74  STORE..#ifdef ft
127a0 73 35 59 59 54 52 41 43 4b 4d 41 58 53 54 41 43  s5YYTRACKMAXSTAC
127b0 4b 44 45 50 54 48 0d 0a 20 20 66 74 73 35 79 79  KDEPTH..  fts5yy
127c0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 68  pParser->fts5yyh
127d0 77 6d 20 3d 20 30 3b 0d 0a 23 65 6e 64 69 66 0d  wm = 0;..#endif.
127e0 0a 23 69 66 20 66 74 73 35 59 59 53 54 41 43 4b  .#if fts5YYSTACK
127f0 44 45 50 54 48 3c 3d 30 0d 0a 20 20 66 74 73 35  DEPTH<=0..  fts5
12800 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
12810 79 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20  ytos = NULL;..  
12820 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
12830 74 73 35 79 79 73 74 61 63 6b 20 3d 20 4e 55 4c  ts5yystack = NUL
12840 4c 3b 0d 0a 20 20 66 74 73 35 79 79 70 50 61 72  L;..  fts5yypPar
12850 73 65 72 2d 3e 66 74 73 35 79 79 73 74 6b 73 7a  ser->fts5yystksz
12860 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 66 74 73   = 0;..  if( fts
12870 35 79 79 47 72 6f 77 53 74 61 63 6b 28 66 74 73  5yyGrowStack(fts
12880 35 79 79 70 50 61 72 73 65 72 29 20 29 7b 0d 0a  5yypParser) ){..
12890 20 20 20 20 66 74 73 35 79 79 70 50 61 72 73 65      fts5yypParse
128a0 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 20 3d  r->fts5yystack =
128b0 20 26 66 74 73 35 79 79 70 50 61 72 73 65 72 2d   &fts5yypParser-
128c0 3e 66 74 73 35 79 79 73 74 6b 30 3b 0d 0a 20 20  >fts5yystk0;..  
128d0 20 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d    fts5yypParser-
128e0 3e 66 74 73 35 79 79 73 74 6b 73 7a 20 3d 20 31  >fts5yystksz = 1
128f0 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a  ;..  }..#endif..
12900 23 69 66 6e 64 65 66 20 66 74 73 35 59 59 4e 4f  #ifndef fts5YYNO
12910 45 52 52 4f 52 52 45 43 4f 56 45 52 59 0d 0a 20  ERRORRECOVERY.. 
12920 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
12930 66 74 73 35 79 79 65 72 72 63 6e 74 20 3d 20 2d  fts5yyerrcnt = -
12940 31 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 66 74  1;..#endif..  ft
12950 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73  s5yypParser->fts
12960 35 79 79 74 6f 73 20 3d 20 66 74 73 35 79 79 70  5yytos = fts5yyp
12970 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74  Parser->fts5yyst
12980 61 63 6b 3b 0d 0a 20 20 66 74 73 35 79 79 70 50  ack;..  fts5yypP
12990 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61  arser->fts5yysta
129a0 63 6b 5b 30 5d 2e 73 74 61 74 65 6e 6f 20 3d 20  ck[0].stateno = 
129b0 30 3b 0d 0a 20 20 66 74 73 35 79 79 70 50 61 72  0;..  fts5yypPar
129c0 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b  ser->fts5yystack
129d0 5b 30 5d 2e 6d 61 6a 6f 72 20 3d 20 30 3b 0d 0a  [0].major = 0;..
129e0 23 69 66 20 66 74 73 35 59 59 53 54 41 43 4b 44  #if fts5YYSTACKD
129f0 45 50 54 48 3e 30 0d 0a 20 20 66 74 73 35 79 79  EPTH>0..  fts5yy
12a00 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73  pParser->fts5yys
12a10 74 61 63 6b 45 6e 64 20 3d 20 26 66 74 73 35 79  tackEnd = &fts5y
12a20 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
12a30 73 74 61 63 6b 5b 66 74 73 35 59 59 53 54 41 43  stack[fts5YYSTAC
12a40 4b 44 45 50 54 48 2d 31 5d 3b 0d 0a 23 65 6e 64  KDEPTH-1];..#end
12a50 69 66 0d 0a 7d 0d 0a 0d 0a 23 69 66 6e 64 65 66  if..}....#ifndef
12a60 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
12a70 65 72 5f 45 4e 47 49 4e 45 41 4c 57 41 59 53 4f  er_ENGINEALWAYSO
12a80 4e 53 54 41 43 4b 0d 0a 2f 2a 20 0d 0a 2a 2a 20  NSTACK../* ..** 
12a90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
12aa0 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 70 61  locates a new pa
12ab0 72 73 65 72 2e 0d 0a 2a 2a 20 54 68 65 20 6f 6e  rser...** The on
12ac0 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ly argument is a
12ad0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
12ae0 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 77 6f 72  nction which wor
12af0 6b 73 20 6c 69 6b 65 0d 0a 2a 2a 20 6d 61 6c 6c  ks like..** mall
12b00 6f 63 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 6e 70 75  oc...**..** Inpu
12b10 74 73 3a 0d 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ts:..** A pointe
12b20 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  r to the functio
12b30 6e 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  n used to alloca
12b40 74 65 20 6d 65 6d 6f 72 79 2e 0d 0a 2a 2a 0d 0a  te memory...**..
12b50 2a 2a 20 4f 75 74 70 75 74 73 3a 0d 0a 2a 2a 20  ** Outputs:..** 
12b60 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  A pointer to a p
12b70 61 72 73 65 72 2e 20 20 54 68 69 73 20 70 6f 69  arser.  This poi
12b80 6e 74 65 72 20 69 73 20 75 73 65 64 20 69 6e 20  nter is used in 
12b90 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
12ba0 0d 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 46  ..** to sqlite3F
12bb0 74 73 35 50 61 72 73 65 72 20 61 6e 64 20 73 71  ts5Parser and sq
12bc0 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 46  lite3Fts5ParserF
12bd0 72 65 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ree...*/..static
12be0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 46 74   void *sqlite3Ft
12bf0 73 35 50 61 72 73 65 72 41 6c 6c 6f 63 28 76 6f  s5ParserAlloc(vo
12c00 69 64 20 2a 28 2a 6d 61 6c 6c 6f 63 50 72 6f 63  id *(*mallocProc
12c10 29 28 66 74 73 35 59 59 4d 41 4c 4c 4f 43 41 52  )(fts5YYMALLOCAR
12c20 47 54 59 50 45 29 20 73 71 6c 69 74 65 33 46 74  GTYPE) sqlite3Ft
12c30 73 35 50 61 72 73 65 72 43 54 58 5f 50 44 45 43  s5ParserCTX_PDEC
12c40 4c 29 7b 0d 0a 20 20 66 74 73 35 79 79 50 61 72  L){..  fts5yyPar
12c50 73 65 72 20 2a 66 74 73 35 79 79 70 50 61 72 73  ser *fts5yypPars
12c60 65 72 3b 0d 0a 20 20 66 74 73 35 79 79 70 50 61  er;..  fts5yypPa
12c70 72 73 65 72 20 3d 20 28 66 74 73 35 79 79 50 61  rser = (fts5yyPa
12c80 72 73 65 72 2a 29 28 2a 6d 61 6c 6c 6f 63 50 72  rser*)(*mallocPr
12c90 6f 63 29 28 20 28 66 74 73 35 59 59 4d 41 4c 4c  oc)( (fts5YYMALL
12ca0 4f 43 41 52 47 54 59 50 45 29 73 69 7a 65 6f 66  OCARGTYPE)sizeof
12cb0 28 66 74 73 35 79 79 50 61 72 73 65 72 29 20 29  (fts5yyParser) )
12cc0 3b 0d 0a 20 20 69 66 28 20 66 74 73 35 79 79 70  ;..  if( fts5yyp
12cd0 50 61 72 73 65 72 20 29 7b 0d 0a 20 20 20 20 73  Parser ){..    s
12ce0 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
12cf0 43 54 58 5f 53 54 4f 52 45 0d 0a 20 20 20 20 73  CTX_STORE..    s
12d00 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
12d10 49 6e 69 74 28 66 74 73 35 79 79 70 50 61 72 73  Init(fts5yypPars
12d20 65 72 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  er sqlite3Fts5Pa
12d30 72 73 65 72 43 54 58 5f 50 41 52 41 4d 29 3b 0d  rserCTX_PARAM);.
12d40 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
12d50 76 6f 69 64 2a 29 66 74 73 35 79 79 70 50 61 72  void*)fts5yypPar
12d60 73 65 72 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20  ser;..}..#endif 
12d70 2f 2a 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  /* sqlite3Fts5Pa
12d80 72 73 65 72 5f 45 4e 47 49 4e 45 41 4c 57 41 59  rser_ENGINEALWAY
12d90 53 4f 4e 53 54 41 43 4b 20 2a 2f 0d 0a 0d 0a 0d  SONSTACK */.....
12da0 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
12db0 67 20 66 75 6e 63 74 69 6f 6e 20 64 65 6c 65 74  g function delet
12dc0 65 73 20 74 68 65 20 22 6d 69 6e 6f 72 20 74 79  es the "minor ty
12dd0 70 65 22 20 6f 72 20 73 65 6d 61 6e 74 69 63 20  pe" or semantic 
12de0 76 61 6c 75 65 0d 0a 2a 2a 20 61 73 73 6f 63 69  value..** associ
12df0 61 74 65 64 20 77 69 74 68 20 61 20 73 79 6d 62  ated with a symb
12e00 6f 6c 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 20  ol.  The symbol 
12e10 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20  can be either a 
12e20 74 65 72 6d 69 6e 61 6c 0d 0a 2a 2a 20 6f 72 20  terminal..** or 
12e30 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 22 66 74  nonterminal. "ft
12e40 73 35 79 79 6d 61 6a 6f 72 22 20 69 73 20 74 68  s5yymajor" is th
12e50 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 2c 20 61  e symbol code, a
12e60 6e 64 20 22 66 74 73 35 79 79 70 6d 69 6e 6f 72  nd "fts5yypminor
12e70 22 20 69 73 0d 0a 2a 2a 20 61 20 70 6f 69 6e 74  " is..** a point
12e80 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
12e90 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20  to be deleted.  
12ea0 54 68 65 20 63 6f 64 65 20 75 73 65 64 20 74 6f  The code used to
12eb0 20 64 6f 20 74 68 65 20 0d 0a 2a 2a 20 64 65 6c   do the ..** del
12ec0 65 74 69 6f 6e 73 20 69 73 20 64 65 72 69 76 65  etions is derive
12ed0 64 20 66 72 6f 6d 20 74 68 65 20 25 64 65 73 74  d from the %dest
12ee0 72 75 63 74 6f 72 20 61 6e 64 2f 6f 72 20 25 74  ructor and/or %t
12ef0 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 0d  oken_destructor.
12f00 0a 2a 2a 20 64 69 72 65 63 74 69 76 65 73 20 6f  .** directives o
12f10 66 20 74 68 65 20 69 6e 70 75 74 20 67 72 61 6d  f the input gram
12f20 6d 61 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  mar...*/..static
12f30 20 76 6f 69 64 20 66 74 73 35 79 79 5f 64 65 73   void fts5yy_des
12f40 74 72 75 63 74 6f 72 28 0d 0a 20 20 66 74 73 35  tructor(..  fts5
12f50 79 79 50 61 72 73 65 72 20 2a 66 74 73 35 79 79  yyParser *fts5yy
12f60 70 50 61 72 73 65 72 2c 20 20 20 20 2f 2a 20 54  pParser,    /* T
12f70 68 65 20 70 61 72 73 65 72 20 2a 2f 0d 0a 20 20  he parser */..  
12f80 66 74 73 35 59 59 43 4f 44 45 54 59 50 45 20 66  fts5YYCODETYPE f
12f90 74 73 35 79 79 6d 61 6a 6f 72 2c 20 20 20 20 20  ts5yymajor,     
12fa0 2f 2a 20 54 79 70 65 20 63 6f 64 65 20 66 6f 72  /* Type code for
12fb0 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 74 72   object to destr
12fc0 6f 79 20 2a 2f 0d 0a 20 20 66 74 73 35 59 59 4d  oy */..  fts5YYM
12fd0 49 4e 4f 52 54 59 50 45 20 2a 66 74 73 35 79 79  INORTYPE *fts5yy
12fe0 70 6d 69 6e 6f 72 20 20 20 2f 2a 20 54 68 65 20  pminor   /* The 
12ff0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 64 65 73  object to be des
13000 74 72 6f 79 65 64 20 2a 2f 0d 0a 29 7b 0d 0a 20  troyed */..){.. 
13010 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
13020 65 72 41 52 47 5f 46 45 54 43 48 0d 0a 20 20 73  erARG_FETCH..  s
13030 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
13040 43 54 58 5f 46 45 54 43 48 0d 0a 20 20 73 77 69  CTX_FETCH..  swi
13050 74 63 68 28 20 66 74 73 35 79 79 6d 61 6a 6f 72  tch( fts5yymajor
13060 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 48 65 72 65   ){..    /* Here
13070 20 69 73 20 69 6e 73 65 72 74 65 64 20 74 68 65   is inserted the
13080 20 61 63 74 69 6f 6e 73 20 77 68 69 63 68 20 74   actions which t
13090 61 6b 65 20 70 6c 61 63 65 20 77 68 65 6e 20 61  ake place when a
130a0 0d 0a 20 20 20 20 2a 2a 20 74 65 72 6d 69 6e 61  ..    ** termina
130b0 6c 20 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  l or non-termina
130c0 6c 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 20  l is destroyed. 
130d0 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
130e0 0d 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68  ..    ** when th
130f0 65 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70  e symbol is popp
13100 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
13110 6b 20 64 75 72 69 6e 67 20 61 0d 0a 20 20 20 20  k during a..    
13120 2a 2a 20 72 65 64 75 63 65 20 6f 72 20 64 75 72  ** reduce or dur
13130 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73  ing error proces
13140 73 69 6e 67 20 6f 72 20 77 68 65 6e 20 61 20 70  sing or when a p
13150 61 72 73 65 72 20 69 73 20 0d 0a 20 20 20 20 2a  arser is ..    *
13160 2a 20 62 65 69 6e 67 20 64 65 73 74 72 6f 79 65  * being destroye
13170 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 66  d before it is f
13180 69 6e 69 73 68 65 64 20 70 61 72 73 69 6e 67 2e  inished parsing.
13190 0d 0a 20 20 20 20 2a 2a 0d 0a 20 20 20 20 2a 2a  ..    **..    **
131a0 20 4e 6f 74 65 3a 20 64 75 72 69 6e 67 20 61 20   Note: during a 
131b0 72 65 64 75 63 65 2c 20 74 68 65 20 6f 6e 6c 79  reduce, the only
131c0 20 73 79 6d 62 6f 6c 73 20 64 65 73 74 72 6f 79   symbols destroy
131d0 65 64 20 61 72 65 20 74 68 6f 73 65 0d 0a 20 20  ed are those..  
131e0 20 20 2a 2a 20 77 68 69 63 68 20 61 70 70 65 61    ** which appea
131f0 72 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  r on the RHS of 
13200 74 68 65 20 72 75 6c 65 2c 20 62 75 74 20 77 68  the rule, but wh
13210 69 63 68 20 61 72 65 20 2a 6e 6f 74 2a 20 75 73  ich are *not* us
13220 65 64 0d 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64  ed..    ** insid
13230 65 20 74 68 65 20 43 20 63 6f 64 65 2e 0d 0a 20  e the C code... 
13240 20 20 20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a     */../********
13250 2a 20 42 65 67 69 6e 20 64 65 73 74 72 75 63 74  * Begin destruct
13260 6f 72 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 2a  or definitions *
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 2a  ****************
13290 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20 20 20 63 61 73  ******/..    cas
132a0 65 20 31 36 3a 20 2f 2a 20 69 6e 70 75 74 20 2a  e 16: /* input *
132b0 2f 0d 0a 7b 0d 0a 23 6c 69 6e 65 20 38 33 20 22  /..{..#line 83 "
132c0 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 20 28  fts5parse.y".. (
132d0 76 6f 69 64 29 70 50 61 72 73 65 3b 20 0d 0a 23  void)pParse; ..#
132e0 6c 69 6e 65 20 35 37 30 20 22 66 74 73 35 70 61  line 570 "fts5pa
132f0 72 73 65 2e 63 22 0d 0a 7d 0d 0a 20 20 20 20 20  rse.c"..}..     
13300 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73   break;..    cas
13310 65 20 31 37 3a 20 2f 2a 20 65 78 70 72 20 2a 2f  e 17: /* expr */
13320 0d 0a 20 20 20 20 63 61 73 65 20 31 38 3a 20 2f  ..    case 18: /
13330 2a 20 63 6e 65 61 72 73 65 74 20 2a 2f 0d 0a 20  * cnearset */.. 
13340 20 20 20 63 61 73 65 20 31 39 3a 20 2f 2a 20 65     case 19: /* e
13350 78 70 72 6c 69 73 74 20 2a 2f 0d 0a 7b 0d 0a 23  xprlist */..{..#
13360 6c 69 6e 65 20 38 39 20 22 66 74 73 35 70 61 72  line 89 "fts5par
13370 73 65 2e 79 22 0d 0a 20 73 71 6c 69 74 65 33 46  se.y".. sqlite3F
13380 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65  ts5ParseNodeFree
13390 28 28 66 74 73 35 79 79 70 6d 69 6e 6f 72 2d 3e  ((fts5yypminor->
133a0 66 74 73 35 79 79 32 34 29 29 3b 20 0d 0a 23 6c  fts5yy24)); ..#l
133b0 69 6e 65 20 35 37 39 20 22 66 74 73 35 70 61 72  ine 579 "fts5par
133c0 73 65 2e 63 22 0d 0a 7d 0d 0a 20 20 20 20 20 20  se.c"..}..      
133d0 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65  break;..    case
133e0 20 32 30 3a 20 2f 2a 20 63 6f 6c 73 65 74 20 2a   20: /* colset *
133f0 2f 0d 0a 20 20 20 20 63 61 73 65 20 32 31 3a 20  /..    case 21: 
13400 2f 2a 20 63 6f 6c 73 65 74 6c 69 73 74 20 2a 2f  /* colsetlist */
13410 0d 0a 7b 0d 0a 23 6c 69 6e 65 20 39 33 20 22 66  ..{..#line 93 "f
13420 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 20 73 71  ts5parse.y".. sq
13430 6c 69 74 65 33 5f 66 72 65 65 28 28 66 74 73 35  lite3_free((fts5
13440 79 79 70 6d 69 6e 6f 72 2d 3e 66 74 73 35 79 79  yypminor->fts5yy
13450 31 31 29 29 3b 20 0d 0a 23 6c 69 6e 65 20 35 38  11)); ..#line 58
13460 37 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  7 "fts5parse.c".
13470 0a 7d 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  .}..      break;
13480 0d 0a 20 20 20 20 63 61 73 65 20 32 32 3a 20 2f  ..    case 22: /
13490 2a 20 6e 65 61 72 73 65 74 20 2a 2f 0d 0a 20 20  * nearset */..  
134a0 20 20 63 61 73 65 20 32 33 3a 20 2f 2a 20 6e 65    case 23: /* ne
134b0 61 72 70 68 72 61 73 65 73 20 2a 2f 0d 0a 7b 0d  arphrases */..{.
134c0 0a 23 6c 69 6e 65 20 31 34 38 20 22 66 74 73 35  .#line 148 "fts5
134d0 70 61 72 73 65 2e 79 22 0d 0a 20 73 71 6c 69 74  parse.y".. sqlit
134e0 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73  e3Fts5ParseNears
134f0 65 74 46 72 65 65 28 28 66 74 73 35 79 79 70 6d  etFree((fts5yypm
13500 69 6e 6f 72 2d 3e 66 74 73 35 79 79 34 36 29 29  inor->fts5yy46))
13510 3b 20 0d 0a 23 6c 69 6e 65 20 35 39 35 20 22 66  ; ..#line 595 "f
13520 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 7d 0d 0a  ts5parse.c"..}..
13530 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
13540 20 20 63 61 73 65 20 32 34 3a 20 2f 2a 20 70 68    case 24: /* ph
13550 72 61 73 65 20 2a 2f 0d 0a 7b 0d 0a 23 6c 69 6e  rase */..{..#lin
13560 65 20 31 38 33 20 22 66 74 73 35 70 61 72 73 65  e 183 "fts5parse
13570 2e 79 22 0d 0a 20 73 71 6c 69 74 65 33 46 74 73  .y".. sqlite3Fts
13580 35 50 61 72 73 65 50 68 72 61 73 65 46 72 65 65  5ParsePhraseFree
13590 28 28 66 74 73 35 79 79 70 6d 69 6e 6f 72 2d 3e  ((fts5yypminor->
135a0 66 74 73 35 79 79 35 33 29 29 3b 20 0d 0a 23 6c  fts5yy53)); ..#l
135b0 69 6e 65 20 36 30 32 20 22 66 74 73 35 70 61 72  ine 602 "fts5par
135c0 73 65 2e 63 22 0d 0a 7d 0d 0a 20 20 20 20 20 20  se.c"..}..      
135d0 62 72 65 61 6b 3b 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a  break;../*******
135e0 2a 2a 20 45 6e 64 20 64 65 73 74 72 75 63 74 6f  ** End destructo
135f0 72 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2a  r definitions **
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 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20 20 20 64 65  *******/..    de
13630 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 20 20  fault:  break;  
13640 20 2f 2a 20 49 66 20 6e 6f 20 64 65 73 74 72 75   /* If no destru
13650 63 74 6f 72 20 61 63 74 69 6f 6e 20 73 70 65 63  ctor action spec
13660 69 66 69 65 64 3a 20 64 6f 20 6e 6f 74 68 69 6e  ified: do nothin
13670 67 20 2a 2f 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a  g */..  }..}....
13680 2f 2a 0d 0a 2a 2a 20 50 6f 70 20 74 68 65 20 70  /*..** Pop the p
13690 61 72 73 65 72 27 73 20 73 74 61 63 6b 20 6f 6e  arser's stack on
136a0 63 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74  ce...**..** If t
136b0 68 65 72 65 20 69 73 20 61 20 64 65 73 74 72 75  here is a destru
136c0 63 74 6f 72 20 72 6f 75 74 69 6e 65 20 61 73 73  ctor routine ass
136d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
136e0 20 74 6f 6b 65 6e 20 77 68 69 63 68 0d 0a 2a 2a   token which..**
136f0 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 20   is popped from 
13700 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65 6e 20  the stack, then 
13710 63 61 6c 6c 20 69 74 2e 0d 0a 2a 2f 0d 0a 73 74  call it...*/..st
13720 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 79 79  atic void fts5yy
13730 5f 70 6f 70 5f 70 61 72 73 65 72 5f 73 74 61 63  _pop_parser_stac
13740 6b 28 66 74 73 35 79 79 50 61 72 73 65 72 20 2a  k(fts5yyParser *
13750 70 50 61 72 73 65 72 29 7b 0d 0a 20 20 66 74 73  pParser){..  fts
13760 35 79 79 53 74 61 63 6b 45 6e 74 72 79 20 2a 66  5yyStackEntry *f
13770 74 73 35 79 79 74 6f 73 3b 0d 0a 20 20 61 73 73  ts5yytos;..  ass
13780 65 72 74 28 20 70 50 61 72 73 65 72 2d 3e 66 74  ert( pParser->ft
13790 73 35 79 79 74 6f 73 21 3d 30 20 29 3b 0d 0a 20  s5yytos!=0 );.. 
137a0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 72   assert( pParser
137b0 2d 3e 66 74 73 35 79 79 74 6f 73 20 3e 20 70 50  ->fts5yytos > pP
137c0 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61  arser->fts5yysta
137d0 63 6b 20 29 3b 0d 0a 20 20 66 74 73 35 79 79 74  ck );..  fts5yyt
137e0 6f 73 20 3d 20 70 50 61 72 73 65 72 2d 3e 66 74  os = pParser->ft
137f0 73 35 79 79 74 6f 73 2d 2d 3b 0d 0a 23 69 66 6e  s5yytos--;..#ifn
13800 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 69 66  def NDEBUG..  if
13810 28 20 66 74 73 35 79 79 54 72 61 63 65 46 49 4c  ( fts5yyTraceFIL
13820 45 20 29 7b 0d 0a 20 20 20 20 66 70 72 69 6e 74  E ){..    fprint
13830 66 28 66 74 73 35 79 79 54 72 61 63 65 46 49 4c  f(fts5yyTraceFIL
13840 45 2c 22 25 73 50 6f 70 70 69 6e 67 20 25 73 5c  E,"%sPopping %s\
13850 6e 22 2c 0d 0a 20 20 20 20 20 20 66 74 73 35 79  n",..      fts5y
13860 79 54 72 61 63 65 50 72 6f 6d 70 74 2c 0d 0a 20  yTracePrompt,.. 
13870 20 20 20 20 20 66 74 73 35 79 79 54 6f 6b 65 6e       fts5yyToken
13880 4e 61 6d 65 5b 66 74 73 35 79 79 74 6f 73 2d 3e  Name[fts5yytos->
13890 6d 61 6a 6f 72 5d 29 3b 0d 0a 20 20 7d 0d 0a 23  major]);..  }..#
138a0 65 6e 64 69 66 0d 0a 20 20 66 74 73 35 79 79 5f  endif..  fts5yy_
138b0 64 65 73 74 72 75 63 74 6f 72 28 70 50 61 72 73  destructor(pPars
138c0 65 72 2c 20 66 74 73 35 79 79 74 6f 73 2d 3e 6d  er, fts5yytos->m
138d0 61 6a 6f 72 2c 20 26 66 74 73 35 79 79 74 6f 73  ajor, &fts5yytos
138e0 2d 3e 6d 69 6e 6f 72 29 3b 0d 0a 7d 0d 0a 0d 0a  ->minor);..}....
138f0 2f 2a 0d 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  /*..** Clear all
13900 20 73 65 63 6f 6e 64 61 72 79 20 6d 65 6d 6f 72   secondary memor
13910 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 66 72  y allocations fr
13920 6f 6d 20 74 68 65 20 70 61 72 73 65 72 0d 0a 2a  om the parser..*
13930 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  /..static void s
13940 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
13950 46 69 6e 61 6c 69 7a 65 28 76 6f 69 64 20 2a 70  Finalize(void *p
13960 29 7b 0d 0a 20 20 66 74 73 35 79 79 50 61 72 73  ){..  fts5yyPars
13970 65 72 20 2a 70 50 61 72 73 65 72 20 3d 20 28 66  er *pParser = (f
13980 74 73 35 79 79 50 61 72 73 65 72 2a 29 70 3b 0d  ts5yyParser*)p;.
13990 0a 20 20 77 68 69 6c 65 28 20 70 50 61 72 73 65  .  while( pParse
139a0 72 2d 3e 66 74 73 35 79 79 74 6f 73 3e 70 50 61  r->fts5yytos>pPa
139b0 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63  rser->fts5yystac
139c0 6b 20 29 20 66 74 73 35 79 79 5f 70 6f 70 5f 70  k ) fts5yy_pop_p
139d0 61 72 73 65 72 5f 73 74 61 63 6b 28 70 50 61 72  arser_stack(pPar
139e0 73 65 72 29 3b 0d 0a 23 69 66 20 66 74 73 35 59  ser);..#if fts5Y
139f0 59 53 54 41 43 4b 44 45 50 54 48 3c 3d 30 0d 0a  YSTACKDEPTH<=0..
13a00 20 20 69 66 28 20 70 50 61 72 73 65 72 2d 3e 66    if( pParser->f
13a10 74 73 35 79 79 73 74 61 63 6b 21 3d 26 70 50 61  ts5yystack!=&pPa
13a20 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 6b 30  rser->fts5yystk0
13a30 20 29 20 66 72 65 65 28 70 50 61 72 73 65 72 2d   ) free(pParser-
13a40 3e 66 74 73 35 79 79 73 74 61 63 6b 29 3b 0d 0a  >fts5yystack);..
13a50 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 23 69 66  #endif..}....#if
13a60 6e 64 65 66 20 73 71 6c 69 74 65 33 46 74 73 35  ndef sqlite3Fts5
13a70 50 61 72 73 65 72 5f 45 4e 47 49 4e 45 41 4c 57  Parser_ENGINEALW
13a80 41 59 53 4f 4e 53 54 41 43 4b 0d 0a 2f 2a 20 0d  AYSONSTACK../* .
13a90 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
13aa0 6e 64 20 64 65 73 74 72 6f 79 20 61 20 70 61 72  nd destroy a par
13ab0 73 65 72 2e 20 20 44 65 73 74 72 75 63 74 6f 72  ser.  Destructor
13ac0 73 20 61 72 65 20 63 61 6c 6c 65 64 20 66 6f 72  s are called for
13ad0 0d 0a 2a 2a 20 61 6c 6c 20 73 74 61 63 6b 20 65  ..** all stack e
13ae0 6c 65 6d 65 6e 74 73 20 62 65 66 6f 72 65 20 73  lements before s
13af0 68 75 74 74 69 6e 67 20 74 68 65 20 70 61 72 73  hutting the pars
13b00 65 72 20 64 6f 77 6e 2e 0d 0a 2a 2a 0d 0a 2a 2a  er down...**..**
13b10 20 49 66 20 74 68 65 20 66 74 73 35 59 59 50 41   If the fts5YYPA
13b20 52 53 45 46 52 45 45 4e 45 56 45 52 4e 55 4c 4c  RSEFREENEVERNULL
13b30 20 6d 61 63 72 6f 20 65 78 69 73 74 73 20 28 66   macro exists (f
13b40 6f 72 20 65 78 61 6d 70 6c 65 20 62 65 63 61 75  or example becau
13b50 73 65 20 69 74 0d 0a 2a 2a 20 69 73 20 64 65 66  se it..** is def
13b60 69 6e 65 64 20 69 6e 20 61 20 25 69 6e 63 6c 75  ined in a %inclu
13b70 64 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  de section of th
13b80 65 20 69 6e 70 75 74 20 67 72 61 6d 6d 61 72 29  e input grammar)
13b90 20 74 68 65 6e 20 69 74 20 69 73 0d 0a 2a 2a 20   then it is..** 
13ba0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
13bb0 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
13bc0 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 0d 0a 2a  s never NULL...*
13bd0 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  /..static void s
13be0 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
13bf0 46 72 65 65 28 0d 0a 20 20 76 6f 69 64 20 2a 70  Free(..  void *p
13c00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13c10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
13c20 65 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  er to be deleted
13c30 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 28 2a 66 72   */..  void (*fr
13c40 65 65 50 72 6f 63 29 28 76 6f 69 64 2a 29 20 20  eeProc)(void*)  
13c50 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 75     /* Function u
13c60 73 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d  sed to reclaim m
13c70 65 6d 6f 72 79 20 2a 2f 0d 0a 29 7b 0d 0a 23 69  emory */..){..#i
13c80 66 6e 64 65 66 20 66 74 73 35 59 59 50 41 52 53  fndef fts5YYPARS
13c90 45 46 52 45 45 4e 45 56 45 52 4e 55 4c 4c 0d 0a  EFREENEVERNULL..
13ca0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
13cb0 75 72 6e 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20  urn;..#endif..  
13cc0 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
13cd0 72 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0d 0a 20  rFinalize(p);.. 
13ce0 20 28 2a 66 72 65 65 50 72 6f 63 29 28 70 29 3b   (*freeProc)(p);
13cf0 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20 73  ..}..#endif /* s
13d00 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
13d10 5f 45 4e 47 49 4e 45 41 4c 57 41 59 53 4f 4e 53  _ENGINEALWAYSONS
13d20 54 41 43 4b 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a  TACK */..../*..*
13d30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 65 61  * Return the pea
13d40 6b 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 73  k depth of the s
13d50 74 61 63 6b 20 66 6f 72 20 61 20 70 61 72 73 65  tack for a parse
13d60 72 2e 0d 0a 2a 2f 0d 0a 23 69 66 64 65 66 20 66  r...*/..#ifdef f
13d70 74 73 35 59 59 54 52 41 43 4b 4d 41 58 53 54 41  ts5YYTRACKMAXSTA
13d80 43 4b 44 45 50 54 48 0d 0a 73 74 61 74 69 63 20  CKDEPTH..static 
13d90 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
13da0 61 72 73 65 72 53 74 61 63 6b 50 65 61 6b 28 76  arserStackPeak(v
13db0 6f 69 64 20 2a 70 29 7b 0d 0a 20 20 66 74 73 35  oid *p){..  fts5
13dc0 79 79 50 61 72 73 65 72 20 2a 70 50 61 72 73 65  yyParser *pParse
13dd0 72 20 3d 20 28 66 74 73 35 79 79 50 61 72 73 65  r = (fts5yyParse
13de0 72 2a 29 70 3b 0d 0a 20 20 72 65 74 75 72 6e 20  r*)p;..  return 
13df0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 68  pParser->fts5yyh
13e00 77 6d 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a  wm;..}..#endif..
13e10 0d 0a 2f 2a 20 54 68 69 73 20 61 72 72 61 79 20  ../* This array 
13e20 6f 66 20 62 6f 6f 6c 65 61 6e 73 20 6b 65 65 70  of booleans keep
13e30 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 70  s track of the p
13e40 61 72 73 65 72 20 73 74 61 74 65 6d 65 6e 74 0d  arser statement.
13e50 0a 2a 2a 20 63 6f 76 65 72 61 67 65 2e 20 20 54  .** coverage.  T
13e60 68 65 20 65 6c 65 6d 65 6e 74 20 66 74 73 35 79  he element fts5y
13e70 79 63 6f 76 65 72 61 67 65 5b 58 5d 5b 59 5d 20  ycoverage[X][Y] 
13e80 69 73 20 73 65 74 20 77 68 65 6e 20 74 68 65 20  is set when the 
13e90 70 61 72 73 65 72 0d 0a 2a 2a 20 69 73 20 69 6e  parser..** is in
13ea0 20 73 74 61 74 65 20 58 20 61 6e 64 20 68 61 73   state X and has
13eb0 20 61 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b   a lookahead tok
13ec0 65 6e 20 59 2e 20 20 49 6e 20 61 20 77 65 6c 6c  en Y.  In a well
13ed0 2d 74 65 73 74 65 64 0d 0a 2a 2a 20 73 79 73 74  -tested..** syst
13ee0 65 6d 73 2c 20 65 76 65 72 79 20 65 6c 65 6d 65  ems, every eleme
13ef0 6e 74 20 6f 66 20 74 68 69 73 20 6d 61 74 72 69  nt of this matri
13f00 78 20 73 68 6f 75 6c 64 20 65 6e 64 20 75 70 20  x should end up 
13f10 62 65 69 6e 67 20 73 65 74 2e 0d 0a 2a 2f 0d 0a  being set...*/..
13f20 23 69 66 20 64 65 66 69 6e 65 64 28 66 74 73 35  #if defined(fts5
13f30 59 59 43 4f 56 45 52 41 47 45 29 0d 0a 73 74 61  YYCOVERAGE)..sta
13f40 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
13f50 72 20 66 74 73 35 79 79 63 6f 76 65 72 61 67 65  r fts5yycoverage
13f60 5b 66 74 73 35 59 59 4e 53 54 41 54 45 5d 5b 66  [fts5YYNSTATE][f
13f70 74 73 35 59 59 4e 46 54 53 35 54 4f 4b 45 4e 5d  ts5YYNFTS5TOKEN]
13f80 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d  ;..#endif..../*.
13f90 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 6f  .** Write into o
13fa0 75 74 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ut a description
13fb0 20 6f 66 20 65 76 65 72 79 20 73 74 61 74 65 2f   of every state/
13fc0 6c 6f 6f 6b 61 68 65 61 64 20 63 6f 6d 62 69 6e  lookahead combin
13fd0 61 74 69 6f 6e 20 74 68 61 74 0d 0a 2a 2a 0d 0a  ation that..**..
13fe0 2a 2a 20 20 20 28 31 29 20 20 68 61 73 20 6e 6f  **   (1)  has no
13ff0 74 20 62 65 65 6e 20 75 73 65 64 20 62 79 20 74  t been used by t
14000 68 65 20 70 61 72 73 65 72 2c 20 61 6e 64 0d 0a  he parser, and..
14010 2a 2a 20 20 20 28 32 29 20 20 69 73 20 6e 6f 74  **   (2)  is not
14020 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e   a syntax error.
14030 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20  ..**..** Return 
14040 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
14050 73 73 65 64 20 73 74 61 74 65 2f 6c 6f 6f 6b 61  ssed state/looka
14060 68 65 61 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  head combination
14070 73 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 66 69  s...*/..#if defi
14080 6e 65 64 28 66 74 73 35 59 59 43 4f 56 45 52 41  ned(fts5YYCOVERA
14090 47 45 29 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  GE)..static int 
140a0 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
140b0 72 43 6f 76 65 72 61 67 65 28 46 49 4c 45 20 2a  rCoverage(FILE *
140c0 6f 75 74 29 7b 0d 0a 20 20 69 6e 74 20 73 74 61  out){..  int sta
140d0 74 65 6e 6f 2c 20 69 4c 6f 6f 6b 41 68 65 61 64  teno, iLookAhead
140e0 2c 20 69 3b 0d 0a 20 20 69 6e 74 20 6e 4d 69 73  , i;..  int nMis
140f0 73 65 64 20 3d 20 30 3b 0d 0a 20 20 66 6f 72 28  sed = 0;..  for(
14100 73 74 61 74 65 6e 6f 3d 30 3b 20 73 74 61 74 65  stateno=0; state
14110 6e 6f 3c 66 74 73 35 59 59 4e 53 54 41 54 45 3b  no<fts5YYNSTATE;
14120 20 73 74 61 74 65 6e 6f 2b 2b 29 7b 0d 0a 20 20   stateno++){..  
14130 20 20 69 20 3d 20 66 74 73 35 79 79 5f 73 68 69    i = fts5yy_shi
14140 66 74 5f 6f 66 73 74 5b 73 74 61 74 65 6e 6f 5d  ft_ofst[stateno]
14150 3b 0d 0a 20 20 20 20 66 6f 72 28 69 4c 6f 6f 6b  ;..    for(iLook
14160 41 68 65 61 64 3d 30 3b 20 69 4c 6f 6f 6b 41 68  Ahead=0; iLookAh
14170 65 61 64 3c 66 74 73 35 59 59 4e 46 54 53 35 54  ead<fts5YYNFTS5T
14180 4f 4b 45 4e 3b 20 69 4c 6f 6f 6b 41 68 65 61 64  OKEN; iLookAhead
14190 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20  ++){..      if( 
141a0 66 74 73 35 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  fts5yy_lookahead
141b0 5b 69 2b 69 4c 6f 6f 6b 41 68 65 61 64 5d 21 3d  [i+iLookAhead]!=
141c0 69 4c 6f 6f 6b 41 68 65 61 64 20 29 20 63 6f 6e  iLookAhead ) con
141d0 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 69 66  tinue;..      if
141e0 28 20 66 74 73 35 79 79 63 6f 76 65 72 61 67 65  ( fts5yycoverage
141f0 5b 73 74 61 74 65 6e 6f 5d 5b 69 4c 6f 6f 6b 41  [stateno][iLookA
14200 68 65 61 64 5d 3d 3d 30 20 29 20 6e 4d 69 73 73  head]==0 ) nMiss
14210 65 64 2b 2b 3b 0d 0a 20 20 20 20 20 20 69 66 28  ed++;..      if(
14220 20 6f 75 74 20 29 7b 0d 0a 20 20 20 20 20 20 20   out ){..       
14230 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 53 74   fprintf(out,"St
14240 61 74 65 20 25 64 20 6c 6f 6f 6b 61 68 65 61 64  ate %d lookahead
14250 20 25 73 20 25 73 5c 6e 22 2c 20 73 74 61 74 65   %s %s\n", state
14260 6e 6f 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  no,..           
14270 20 20 20 20 20 66 74 73 35 79 79 54 6f 6b 65 6e       fts5yyToken
14280 4e 61 6d 65 5b 69 4c 6f 6f 6b 41 68 65 61 64 5d  Name[iLookAhead]
14290 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
142a0 20 20 20 66 74 73 35 79 79 63 6f 76 65 72 61 67     fts5yycoverag
142b0 65 5b 73 74 61 74 65 6e 6f 5d 5b 69 4c 6f 6f 6b  e[stateno][iLook
142c0 41 68 65 61 64 5d 20 3f 20 22 6f 6b 22 20 3a 20  Ahead] ? "ok" : 
142d0 22 6d 69 73 73 65 64 22 29 3b 0d 0a 20 20 20 20  "missed");..    
142e0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d    }..    }..  }.
142f0 0a 20 20 72 65 74 75 72 6e 20 6e 4d 69 73 73 65  .  return nMisse
14300 64 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d  d;..}..#endif...
14310 0a 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ./*..** Find the
14320 20 61 70 70 72 6f 70 72 69 61 74 65 20 61 63 74   appropriate act
14330 69 6f 6e 20 66 6f 72 20 61 20 70 61 72 73 65 72  ion for a parser
14340 20 67 69 76 65 6e 20 74 68 65 20 74 65 72 6d 69   given the termi
14350 6e 61 6c 0d 0a 2a 2a 20 6c 6f 6f 6b 2d 61 68 65  nal..** look-ahe
14360 61 64 20 74 6f 6b 65 6e 20 69 4c 6f 6f 6b 41 68  ad token iLookAh
14370 65 61 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ead...*/..static
14380 20 66 74 73 35 59 59 41 43 54 49 4f 4e 54 59 50   fts5YYACTIONTYP
14390 45 20 66 74 73 35 79 79 5f 66 69 6e 64 5f 73 68  E fts5yy_find_sh
143a0 69 66 74 5f 61 63 74 69 6f 6e 28 0d 0a 20 20 66  ift_action(..  f
143b0 74 73 35 59 59 43 4f 44 45 54 59 50 45 20 69 4c  ts5YYCODETYPE iL
143c0 6f 6f 6b 41 68 65 61 64 2c 20 20 20 20 2f 2a 20  ookAhead,    /* 
143d0 54 68 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 74  The look-ahead t
143e0 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 66 74 73 35 59  oken */..  fts5Y
143f0 59 41 43 54 49 4f 4e 54 59 50 45 20 73 74 61 74  YACTIONTYPE stat
14400 65 6e 6f 20 20 20 20 20 20 2f 2a 20 43 75 72 72  eno      /* Curr
14410 65 6e 74 20 73 74 61 74 65 20 6e 75 6d 62 65 72  ent state number
14420 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 69   */..){..  int i
14430 3b 0d 0a 0d 0a 20 20 69 66 28 20 73 74 61 74 65  ;....  if( state
14440 6e 6f 3e 66 74 73 35 59 59 5f 4d 41 58 5f 53 48  no>fts5YY_MAX_SH
14450 49 46 54 20 29 20 72 65 74 75 72 6e 20 73 74 61  IFT ) return sta
14460 74 65 6e 6f 3b 0d 0a 20 20 61 73 73 65 72 74 28  teno;..  assert(
14470 20 73 74 61 74 65 6e 6f 20 3c 3d 20 66 74 73 35   stateno <= fts5
14480 59 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 29  YY_SHIFT_COUNT )
14490 3b 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 66  ;..#if defined(f
144a0 74 73 35 59 59 43 4f 56 45 52 41 47 45 29 0d 0a  ts5YYCOVERAGE)..
144b0 20 20 66 74 73 35 79 79 63 6f 76 65 72 61 67 65    fts5yycoverage
144c0 5b 73 74 61 74 65 6e 6f 5d 5b 69 4c 6f 6f 6b 41  [stateno][iLookA
144d0 68 65 61 64 5d 20 3d 20 31 3b 0d 0a 23 65 6e 64  head] = 1;..#end
144e0 69 66 0d 0a 20 20 64 6f 7b 0d 0a 20 20 20 20 69  if..  do{..    i
144f0 20 3d 20 66 74 73 35 79 79 5f 73 68 69 66 74 5f   = fts5yy_shift_
14500 6f 66 73 74 5b 73 74 61 74 65 6e 6f 5d 3b 0d 0a  ofst[stateno];..
14510 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
14520 20 29 3b 0d 0a 20 20 20 20 2f 2a 20 61 73 73 65   );..    /* asse
14530 72 74 28 20 69 2b 66 74 73 35 59 59 4e 46 54 53  rt( i+fts5YYNFTS
14540 35 54 4f 4b 45 4e 3c 3d 28 69 6e 74 29 66 74 73  5TOKEN<=(int)fts
14550 35 59 59 5f 4e 4c 4f 4f 4b 41 48 45 41 44 20 29  5YY_NLOOKAHEAD )
14560 3b 20 2a 2f 0d 0a 20 20 20 20 61 73 73 65 72 74  ; */..    assert
14570 28 20 69 4c 6f 6f 6b 41 68 65 61 64 21 3d 66 74  ( iLookAhead!=ft
14580 73 35 59 59 4e 4f 43 4f 44 45 20 29 3b 0d 0a 20  s5YYNOCODE );.. 
14590 20 20 20 61 73 73 65 72 74 28 20 69 4c 6f 6f 6b     assert( iLook
145a0 41 68 65 61 64 20 3c 20 66 74 73 35 59 59 4e 46  Ahead < fts5YYNF
145b0 54 53 35 54 4f 4b 45 4e 20 29 3b 0d 0a 20 20 20  TS5TOKEN );..   
145c0 20 69 20 2b 3d 20 69 4c 6f 6f 6b 41 68 65 61 64   i += iLookAhead
145d0 3b 0d 0a 20 20 20 20 69 66 28 20 69 3e 3d 66 74  ;..    if( i>=ft
145e0 73 35 59 59 5f 4e 4c 4f 4f 4b 41 48 45 41 44 20  s5YY_NLOOKAHEAD 
145f0 7c 7c 20 66 74 73 35 79 79 5f 6c 6f 6f 6b 61 68  || fts5yy_lookah
14600 65 61 64 5b 69 5d 21 3d 69 4c 6f 6f 6b 41 68 65  ead[i]!=iLookAhe
14610 61 64 20 29 7b 0d 0a 23 69 66 64 65 66 20 66 74  ad ){..#ifdef ft
14620 73 35 59 59 46 41 4c 4c 42 41 43 4b 0d 0a 20 20  s5YYFALLBACK..  
14630 20 20 20 20 66 74 73 35 59 59 43 4f 44 45 54 59      fts5YYCODETY
14640 50 45 20 69 46 61 6c 6c 62 61 63 6b 3b 20 20 20  PE iFallback;   
14650 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c           /* Fall
14660 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20  back token */.. 
14670 20 20 20 20 20 69 66 28 20 69 4c 6f 6f 6b 41 68       if( iLookAh
14680 65 61 64 3c 73 69 7a 65 6f 66 28 66 74 73 35 79  ead<sizeof(fts5y
14690 79 46 61 6c 6c 62 61 63 6b 29 2f 73 69 7a 65 6f  yFallback)/sizeo
146a0 66 28 66 74 73 35 79 79 46 61 6c 6c 62 61 63 6b  f(fts5yyFallback
146b0 5b 30 5d 29 0d 0a 20 20 20 20 20 20 20 20 20 20  [0])..          
146c0 20 20 20 26 26 20 28 69 46 61 6c 6c 62 61 63 6b     && (iFallback
146d0 20 3d 20 66 74 73 35 79 79 46 61 6c 6c 62 61 63   = fts5yyFallbac
146e0 6b 5b 69 4c 6f 6f 6b 41 68 65 61 64 5d 29 21 3d  k[iLookAhead])!=
146f0 30 20 29 7b 0d 0a 23 69 66 6e 64 65 66 20 4e 44  0 ){..#ifndef ND
14700 45 42 55 47 0d 0a 20 20 20 20 20 20 20 20 69 66  EBUG..        if
14710 28 20 66 74 73 35 79 79 54 72 61 63 65 46 49 4c  ( fts5yyTraceFIL
14720 45 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  E ){..          
14730 66 70 72 69 6e 74 66 28 66 74 73 35 79 79 54 72  fprintf(fts5yyTr
14740 61 63 65 46 49 4c 45 2c 20 22 25 73 46 41 4c 4c  aceFILE, "%sFALL
14750 42 41 43 4b 20 25 73 20 3d 3e 20 25 73 5c 6e 22  BACK %s => %s\n"
14760 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
14770 66 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70  fts5yyTracePromp
14780 74 2c 20 66 74 73 35 79 79 54 6f 6b 65 6e 4e 61  t, fts5yyTokenNa
14790 6d 65 5b 69 4c 6f 6f 6b 41 68 65 61 64 5d 2c 20  me[iLookAhead], 
147a0 66 74 73 35 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b  fts5yyTokenName[
147b0 69 46 61 6c 6c 62 61 63 6b 5d 29 3b 0d 0a 20 20  iFallback]);..  
147c0 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d        }..#endif.
147d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
147e0 20 66 74 73 35 79 79 46 61 6c 6c 62 61 63 6b 5b   fts5yyFallback[
147f0 69 46 61 6c 6c 62 61 63 6b 5d 3d 3d 30 20 29 3b  iFallback]==0 );
14800 20 2f 2a 20 46 61 6c 6c 62 61 63 6b 20 6c 6f 6f   /* Fallback loo
14810 70 20 6d 75 73 74 20 74 65 72 6d 69 6e 61 74 65  p must terminate
14820 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 69 4c 6f   */..        iLo
14830 6f 6b 41 68 65 61 64 20 3d 20 69 46 61 6c 6c 62  okAhead = iFallb
14840 61 63 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63 6f  ack;..        co
14850 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 7d  ntinue;..      }
14860 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66  ..#endif..#ifdef
14870 20 66 74 73 35 59 59 57 49 4c 44 43 41 52 44 0d   fts5YYWILDCARD.
14880 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
14890 20 20 69 6e 74 20 6a 20 3d 20 69 20 2d 20 69 4c    int j = i - iL
148a0 6f 6f 6b 41 68 65 61 64 20 2b 20 66 74 73 35 59  ookAhead + fts5Y
148b0 59 57 49 4c 44 43 41 52 44 3b 0d 0a 20 20 20 20  YWILDCARD;..    
148c0 20 20 20 20 69 66 28 20 0d 0a 23 69 66 20 66 74      if( ..#if ft
148d0 73 35 59 59 5f 53 48 49 46 54 5f 4d 49 4e 2b 66  s5YY_SHIFT_MIN+f
148e0 74 73 35 59 59 57 49 4c 44 43 41 52 44 3c 30 0d  ts5YYWILDCARD<0.
148f0 0a 20 20 20 20 20 20 20 20 20 20 6a 3e 3d 30 20  .          j>=0 
14900 26 26 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20  &&..#endif..#if 
14910 66 74 73 35 59 59 5f 53 48 49 46 54 5f 4d 41 58  fts5YY_SHIFT_MAX
14920 2b 66 74 73 35 59 59 57 49 4c 44 43 41 52 44 3e  +fts5YYWILDCARD>
14930 3d 66 74 73 35 59 59 5f 41 43 54 54 41 42 5f 43  =fts5YY_ACTTAB_C
14940 4f 55 4e 54 0d 0a 20 20 20 20 20 20 20 20 20 20  OUNT..          
14950 6a 3c 66 74 73 35 59 59 5f 41 43 54 54 41 42 5f  j<fts5YY_ACTTAB_
14960 43 4f 55 4e 54 20 26 26 0d 0a 23 65 6e 64 69 66  COUNT &&..#endif
14970 0d 0a 20 20 20 20 20 20 20 20 20 20 6a 3c 28 69  ..          j<(i
14980 6e 74 29 28 73 69 7a 65 6f 66 28 66 74 73 35 79  nt)(sizeof(fts5y
14990 79 5f 6c 6f 6f 6b 61 68 65 61 64 29 2f 73 69 7a  y_lookahead)/siz
149a0 65 6f 66 28 66 74 73 35 79 79 5f 6c 6f 6f 6b 61  eof(fts5yy_looka
149b0 68 65 61 64 5b 30 5d 29 29 20 26 26 0d 0a 20 20  head[0])) &&..  
149c0 20 20 20 20 20 20 20 20 66 74 73 35 79 79 5f 6c          fts5yy_l
149d0 6f 6f 6b 61 68 65 61 64 5b 6a 5d 3d 3d 66 74 73  ookahead[j]==fts
149e0 35 59 59 57 49 4c 44 43 41 52 44 20 26 26 20 69  5YYWILDCARD && i
149f0 4c 6f 6f 6b 41 68 65 61 64 3e 30 0d 0a 20 20 20  LookAhead>0..   
14a00 20 20 20 20 20 29 7b 0d 0a 23 69 66 6e 64 65 66       ){..#ifndef
14a10 20 4e 44 45 42 55 47 0d 0a 20 20 20 20 20 20 20   NDEBUG..       
14a20 20 20 20 69 66 28 20 66 74 73 35 79 79 54 72 61     if( fts5yyTra
14a30 63 65 46 49 4c 45 20 29 7b 0d 0a 20 20 20 20 20  ceFILE ){..     
14a40 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
14a50 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 20  ts5yyTraceFILE, 
14a60 22 25 73 57 49 4c 44 43 41 52 44 20 25 73 20 3d  "%sWILDCARD %s =
14a70 3e 20 25 73 5c 6e 22 2c 0d 0a 20 20 20 20 20 20  > %s\n",..      
14a80 20 20 20 20 20 20 20 20 20 66 74 73 35 79 79 54           fts5yyT
14a90 72 61 63 65 50 72 6f 6d 70 74 2c 20 66 74 73 35  racePrompt, fts5
14aa0 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 69 4c 6f 6f  yyTokenName[iLoo
14ab0 6b 41 68 65 61 64 5d 2c 0d 0a 20 20 20 20 20 20  kAhead],..      
14ac0 20 20 20 20 20 20 20 20 20 66 74 73 35 79 79 54           fts5yyT
14ad0 6f 6b 65 6e 4e 61 6d 65 5b 66 74 73 35 59 59 57  okenName[fts5YYW
14ae0 49 4c 44 43 41 52 44 5d 29 3b 0d 0a 20 20 20 20  ILDCARD]);..    
14af0 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 20        }..#endif 
14b00 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0d 0a 20 20  /* NDEBUG */..  
14b10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
14b20 74 73 35 79 79 5f 61 63 74 69 6f 6e 5b 6a 5d 3b  ts5yy_action[j];
14b30 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
14b40 20 20 20 7d 0d 0a 23 65 6e 64 69 66 20 2f 2a 20     }..#endif /* 
14b50 66 74 73 35 59 59 57 49 4c 44 43 41 52 44 20 2a  fts5YYWILDCARD *
14b60 2f 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  /..      return 
14b70 66 74 73 35 79 79 5f 64 65 66 61 75 6c 74 5b 73  fts5yy_default[s
14b80 74 61 74 65 6e 6f 5d 3b 0d 0a 20 20 20 20 7d 65  tateno];..    }e
14b90 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 65 74 75  lse{..      retu
14ba0 72 6e 20 66 74 73 35 79 79 5f 61 63 74 69 6f 6e  rn fts5yy_action
14bb0 5b 69 5d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  [i];..    }..  }
14bc0 77 68 69 6c 65 28 31 29 3b 0d 0a 7d 0d 0a 0d 0a  while(1);..}....
14bd0 2f 2a 0d 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  /*..** Find the 
14be0 61 70 70 72 6f 70 72 69 61 74 65 20 61 63 74 69  appropriate acti
14bf0 6f 6e 20 66 6f 72 20 61 20 70 61 72 73 65 72 20  on for a parser 
14c00 67 69 76 65 6e 20 74 68 65 20 6e 6f 6e 2d 74 65  given the non-te
14c10 72 6d 69 6e 61 6c 0d 0a 2a 2a 20 6c 6f 6f 6b 2d  rminal..** look-
14c20 61 68 65 61 64 20 74 6f 6b 65 6e 20 69 4c 6f 6f  ahead token iLoo
14c30 6b 41 68 65 61 64 2e 0d 0a 2a 2f 0d 0a 73 74 61  kAhead...*/..sta
14c40 74 69 63 20 66 74 73 35 59 59 41 43 54 49 4f 4e  tic fts5YYACTION
14c50 54 59 50 45 20 66 74 73 35 79 79 5f 66 69 6e 64  TYPE fts5yy_find
14c60 5f 72 65 64 75 63 65 5f 61 63 74 69 6f 6e 28 0d  _reduce_action(.
14c70 0a 20 20 66 74 73 35 59 59 41 43 54 49 4f 4e 54  .  fts5YYACTIONT
14c80 59 50 45 20 73 74 61 74 65 6e 6f 2c 20 20 20 20  YPE stateno,    
14c90 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
14ca0 65 20 6e 75 6d 62 65 72 20 2a 2f 0d 0a 20 20 66  e number */..  f
14cb0 74 73 35 59 59 43 4f 44 45 54 59 50 45 20 69 4c  ts5YYCODETYPE iL
14cc0 6f 6f 6b 41 68 65 61 64 20 20 20 20 20 2f 2a 20  ookAhead     /* 
14cd0 54 68 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 74  The look-ahead t
14ce0 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69  oken */..){..  i
14cf0 6e 74 20 69 3b 0d 0a 23 69 66 64 65 66 20 66 74  nt i;..#ifdef ft
14d00 73 35 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 0d  s5YYERRORSYMBOL.
14d10 0a 20 20 69 66 28 20 73 74 61 74 65 6e 6f 3e 66  .  if( stateno>f
14d20 74 73 35 59 59 5f 52 45 44 55 43 45 5f 43 4f 55  ts5YY_REDUCE_COU
14d30 4e 54 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72  NT ){..    retur
14d40 6e 20 66 74 73 35 79 79 5f 64 65 66 61 75 6c 74  n fts5yy_default
14d50 5b 73 74 61 74 65 6e 6f 5d 3b 0d 0a 20 20 7d 0d  [stateno];..  }.
14d60 0a 23 65 6c 73 65 0d 0a 20 20 61 73 73 65 72 74  .#else..  assert
14d70 28 20 73 74 61 74 65 6e 6f 3c 3d 66 74 73 35 59  ( stateno<=fts5Y
14d80 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54 20 29  Y_REDUCE_COUNT )
14d90 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 20 3d  ;..#endif..  i =
14da0 20 66 74 73 35 79 79 5f 72 65 64 75 63 65 5f 6f   fts5yy_reduce_o
14db0 66 73 74 5b 73 74 61 74 65 6e 6f 5d 3b 0d 0a 20  fst[stateno];.. 
14dc0 20 61 73 73 65 72 74 28 20 69 4c 6f 6f 6b 41 68   assert( iLookAh
14dd0 65 61 64 21 3d 66 74 73 35 59 59 4e 4f 43 4f 44  ead!=fts5YYNOCOD
14de0 45 20 29 3b 0d 0a 20 20 69 20 2b 3d 20 69 4c 6f  E );..  i += iLo
14df0 6f 6b 41 68 65 61 64 3b 0d 0a 23 69 66 64 65 66  okAhead;..#ifdef
14e00 20 66 74 73 35 59 59 45 52 52 4f 52 53 59 4d 42   fts5YYERRORSYMB
14e10 4f 4c 0d 0a 20 20 69 66 28 20 69 3c 30 20 7c 7c  OL..  if( i<0 ||
14e20 20 69 3e 3d 66 74 73 35 59 59 5f 41 43 54 54 41   i>=fts5YY_ACTTA
14e30 42 5f 43 4f 55 4e 54 20 7c 7c 20 66 74 73 35 79  B_COUNT || fts5y
14e40 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 69 5d 21 3d  y_lookahead[i]!=
14e50 69 4c 6f 6f 6b 41 68 65 61 64 20 29 7b 0d 0a 20  iLookAhead ){.. 
14e60 20 20 20 72 65 74 75 72 6e 20 66 74 73 35 79 79     return fts5yy
14e70 5f 64 65 66 61 75 6c 74 5b 73 74 61 74 65 6e 6f  _default[stateno
14e80 5d 3b 0d 0a 20 20 7d 0d 0a 23 65 6c 73 65 0d 0a  ];..  }..#else..
14e90 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
14ea0 26 20 69 3c 66 74 73 35 59 59 5f 41 43 54 54 41  & i<fts5YY_ACTTA
14eb0 42 5f 43 4f 55 4e 54 20 29 3b 0d 0a 20 20 61 73  B_COUNT );..  as
14ec0 73 65 72 74 28 20 66 74 73 35 79 79 5f 6c 6f 6f  sert( fts5yy_loo
14ed0 6b 61 68 65 61 64 5b 69 5d 3d 3d 69 4c 6f 6f 6b  kahead[i]==iLook
14ee0 41 68 65 61 64 20 29 3b 0d 0a 23 65 6e 64 69 66  Ahead );..#endif
14ef0 0d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 79  ..  return fts5y
14f00 79 5f 61 63 74 69 6f 6e 5b 69 5d 3b 0d 0a 7d 0d  y_action[i];..}.
14f10 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f  .../*..** The fo
14f20 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
14f30 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  is called if the
14f40 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73   stack overflows
14f50 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f  ...*/..static vo
14f60 69 64 20 66 74 73 35 79 79 53 74 61 63 6b 4f 76  id fts5yyStackOv
14f70 65 72 66 6c 6f 77 28 66 74 73 35 79 79 50 61 72  erflow(fts5yyPar
14f80 73 65 72 20 2a 66 74 73 35 79 79 70 50 61 72 73  ser *fts5yypPars
14f90 65 72 29 7b 0d 0a 20 20 20 73 71 6c 69 74 65 33  er){..   sqlite3
14fa0 46 74 73 35 50 61 72 73 65 72 41 52 47 5f 46 45  Fts5ParserARG_FE
14fb0 54 43 48 0d 0a 20 20 20 73 71 6c 69 74 65 33 46  TCH..   sqlite3F
14fc0 74 73 35 50 61 72 73 65 72 43 54 58 5f 46 45 54  ts5ParserCTX_FET
14fd0 43 48 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  CH..#ifndef NDEB
14fe0 55 47 0d 0a 20 20 20 69 66 28 20 66 74 73 35 79  UG..   if( fts5y
14ff0 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20  yTraceFILE ){.. 
15000 20 20 20 20 66 70 72 69 6e 74 66 28 66 74 73 35      fprintf(fts5
15010 79 79 54 72 61 63 65 46 49 4c 45 2c 22 25 73 53  yyTraceFILE,"%sS
15020 74 61 63 6b 20 4f 76 65 72 66 6c 6f 77 21 5c 6e  tack Overflow!\n
15030 22 2c 66 74 73 35 79 79 54 72 61 63 65 50 72 6f  ",fts5yyTracePro
15040 6d 70 74 29 3b 0d 0a 20 20 20 7d 0d 0a 23 65 6e  mpt);..   }..#en
15050 64 69 66 0d 0a 20 20 20 77 68 69 6c 65 28 20 66  dif..   while( f
15060 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
15070 73 35 79 79 74 6f 73 3e 66 74 73 35 79 79 70 50  s5yytos>fts5yypP
15080 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61  arser->fts5yysta
15090 63 6b 20 29 20 66 74 73 35 79 79 5f 70 6f 70 5f  ck ) fts5yy_pop_
150a0 70 61 72 73 65 72 5f 73 74 61 63 6b 28 66 74 73  parser_stack(fts
150b0 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 20 20  5yypParser);..  
150c0 20 2f 2a 20 48 65 72 65 20 63 6f 64 65 20 69 73   /* Here code is
150d0 20 69 6e 73 65 72 74 65 64 20 77 68 69 63 68 20   inserted which 
150e0 77 69 6c 6c 20 65 78 65 63 75 74 65 20 69 66 20  will execute if 
150f0 74 68 65 20 70 61 72 73 65 72 0d 0a 20 20 20 2a  the parser..   *
15100 2a 20 73 74 61 63 6b 20 65 76 65 72 79 20 6f 76  * stack every ov
15110 65 72 66 6c 6f 77 73 20 2a 2f 0d 0a 2f 2a 2a 2a  erflows */../***
15120 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 25 73 74 61  ***** Begin %sta
15130 63 6b 5f 6f 76 65 72 66 6c 6f 77 20 63 6f 64 65  ck_overflow code
15140 20 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 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 23 6c  ***********/..#l
15170 69 6e 65 20 33 36 20 22 66 74 73 35 70 61 72 73  ine 36 "fts5pars
15180 65 2e 79 22 0d 0a 0d 0a 20 20 73 71 6c 69 74 65  e.y"....  sqlite
15190 33 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28  3Fts5ParseError(
151a0 70 50 61 72 73 65 2c 20 22 66 74 73 35 3a 20 70  pParse, "fts5: p
151b0 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72  arser stack over
151c0 66 6c 6f 77 22 29 3b 0d 0a 23 6c 69 6e 65 20 38  flow");..#line 8
151d0 32 37 20 22 66 74 73 35 70 61 72 73 65 2e 63 22  27 "fts5parse.c"
151e0 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  ../******** End 
151f0 25 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 20  %stack_overflow 
15200 63 6f 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  code ***********
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 2a 2a 2a 2a 2a 2a  ****************
15230 2a 2f 0d 0a 20 20 20 73 71 6c 69 74 65 33 46 74  */..   sqlite3Ft
15240 73 35 50 61 72 73 65 72 41 52 47 5f 53 54 4f 52  s5ParserARG_STOR
15250 45 20 2f 2a 20 53 75 70 70 72 65 73 73 20 77 61  E /* Suppress wa
15260 72 6e 69 6e 67 20 61 62 6f 75 74 20 75 6e 75 73  rning about unus
15270 65 64 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65  ed %extra_argume
15280 6e 74 20 76 61 72 20 2a 2f 0d 0a 20 20 20 73 71  nt var */..   sq
15290 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43  lite3Fts5ParserC
152a0 54 58 5f 53 54 4f 52 45 0d 0a 7d 0d 0a 0d 0a 2f  TX_STORE..}..../
152b0 2a 0d 0a 2a 2a 20 50 72 69 6e 74 20 74 72 61 63  *..** Print trac
152c0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
152d0 66 6f 72 20 61 20 53 48 49 46 54 20 61 63 74 69  for a SHIFT acti
152e0 6f 6e 0d 0a 2a 2f 0d 0a 23 69 66 6e 64 65 66 20  on..*/..#ifndef 
152f0 4e 44 45 42 55 47 0d 0a 73 74 61 74 69 63 20 76  NDEBUG..static v
15300 6f 69 64 20 66 74 73 35 79 79 54 72 61 63 65 53  oid fts5yyTraceS
15310 68 69 66 74 28 66 74 73 35 79 79 50 61 72 73 65  hift(fts5yyParse
15320 72 20 2a 66 74 73 35 79 79 70 50 61 72 73 65 72  r *fts5yypParser
15330 2c 20 69 6e 74 20 66 74 73 35 79 79 4e 65 77 53  , int fts5yyNewS
15340 74 61 74 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  tate, const char
15350 20 2a 7a 54 61 67 29 7b 0d 0a 20 20 69 66 28 20   *zTag){..  if( 
15360 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 20  fts5yyTraceFILE 
15370 29 7b 0d 0a 20 20 20 20 69 66 28 20 66 74 73 35  ){..    if( fts5
15380 79 79 4e 65 77 53 74 61 74 65 3c 66 74 73 35 59  yyNewState<fts5Y
15390 59 4e 53 54 41 54 45 20 29 7b 0d 0a 20 20 20 20  YNSTATE ){..    
153a0 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79 79    fprintf(fts5yy
153b0 54 72 61 63 65 46 49 4c 45 2c 22 25 73 25 73 20  TraceFILE,"%s%s 
153c0 27 25 73 27 2c 20 67 6f 20 74 6f 20 73 74 61 74  '%s', go to stat
153d0 65 20 25 64 5c 6e 22 2c 0d 0a 20 20 20 20 20 20  e %d\n",..      
153e0 20 20 20 66 74 73 35 79 79 54 72 61 63 65 50 72     fts5yyTracePr
153f0 6f 6d 70 74 2c 20 7a 54 61 67 2c 20 66 74 73 35  ompt, zTag, fts5
15400 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 66 74 73 35  yyTokenName[fts5
15410 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
15420 79 74 6f 73 2d 3e 6d 61 6a 6f 72 5d 2c 0d 0a 20  ytos->major],.. 
15430 20 20 20 20 20 20 20 20 66 74 73 35 79 79 4e 65          fts5yyNe
15440 77 53 74 61 74 65 29 3b 0d 0a 20 20 20 20 7d 65  wState);..    }e
15450 6c 73 65 7b 0d 0a 20 20 20 20 20 20 66 70 72 69  lse{..      fpri
15460 6e 74 66 28 66 74 73 35 79 79 54 72 61 63 65 46  ntf(fts5yyTraceF
15470 49 4c 45 2c 22 25 73 25 73 20 27 25 73 27 2c 20  ILE,"%s%s '%s', 
15480 70 65 6e 64 69 6e 67 20 72 65 64 75 63 65 20 25  pending reduce %
15490 64 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  d\n",..         
154a0 66 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70  fts5yyTracePromp
154b0 74 2c 20 7a 54 61 67 2c 20 66 74 73 35 79 79 54  t, zTag, fts5yyT
154c0 6f 6b 65 6e 4e 61 6d 65 5b 66 74 73 35 79 79 70  okenName[fts5yyp
154d0 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f  Parser->fts5yyto
154e0 73 2d 3e 6d 61 6a 6f 72 5d 2c 0d 0a 20 20 20 20  s->major],..    
154f0 20 20 20 20 20 66 74 73 35 79 79 4e 65 77 53 74       fts5yyNewSt
15500 61 74 65 20 2d 20 66 74 73 35 59 59 5f 4d 49 4e  ate - fts5YY_MIN
15510 5f 52 45 44 55 43 45 29 3b 0d 0a 20 20 20 20 7d  _REDUCE);..    }
15520 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 65 6c 73 65 0d  ..  }..}..#else.
15530 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 79 79  .# define fts5yy
15540 54 72 61 63 65 53 68 69 66 74 28 58 2c 59 2c 5a  TraceShift(X,Y,Z
15550 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d  )..#endif..../*.
15560 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 68  .** Perform a sh
15570 69 66 74 20 61 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d  ift action...*/.
15580 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15590 35 79 79 5f 73 68 69 66 74 28 0d 0a 20 20 66 74  5yy_shift(..  ft
155a0 73 35 79 79 50 61 72 73 65 72 20 2a 66 74 73 35  s5yyParser *fts5
155b0 79 79 70 50 61 72 73 65 72 2c 20 20 20 20 20 20  yypParser,      
155c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
155d0 72 20 74 6f 20 62 65 20 73 68 69 66 74 65 64 20  r to be shifted 
155e0 2a 2f 0d 0a 20 20 66 74 73 35 59 59 41 43 54 49  */..  fts5YYACTI
155f0 4f 4e 54 59 50 45 20 66 74 73 35 79 79 4e 65 77  ONTYPE fts5yyNew
15600 53 74 61 74 65 2c 20 20 20 20 20 20 2f 2a 20 54  State,      /* T
15610 68 65 20 6e 65 77 20 73 74 61 74 65 20 74 6f 20  he new state to 
15620 73 68 69 66 74 20 69 6e 20 2a 2f 0d 0a 20 20 66  shift in */..  f
15630 74 73 35 59 59 43 4f 44 45 54 59 50 45 20 66 74  ts5YYCODETYPE ft
15640 73 35 79 79 4d 61 6a 6f 72 2c 20 20 20 20 20 20  s5yyMajor,      
15650 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 6a 6f       /* The majo
15660 72 20 74 6f 6b 65 6e 20 74 6f 20 73 68 69 66 74  r token to shift
15670 20 69 6e 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65   in */..  sqlite
15680 33 46 74 73 35 50 61 72 73 65 72 46 54 53 35 54  3Fts5ParserFTS5T
15690 4f 4b 45 4e 54 59 50 45 20 66 74 73 35 79 79 4d  OKENTYPE fts5yyM
156a0 69 6e 6f 72 20 20 20 20 20 20 20 20 2f 2a 20 54  inor        /* T
156b0 68 65 20 6d 69 6e 6f 72 20 74 6f 6b 65 6e 20 74  he minor token t
156c0 6f 20 73 68 69 66 74 20 69 6e 20 2a 2f 0d 0a 29  o shift in */..)
156d0 7b 0d 0a 20 20 66 74 73 35 79 79 53 74 61 63 6b  {..  fts5yyStack
156e0 45 6e 74 72 79 20 2a 66 74 73 35 79 79 74 6f 73  Entry *fts5yytos
156f0 3b 0d 0a 20 20 66 74 73 35 79 79 70 50 61 72 73  ;..  fts5yypPars
15700 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 2b 2b 3b  er->fts5yytos++;
15710 0d 0a 23 69 66 64 65 66 20 66 74 73 35 59 59 54  ..#ifdef fts5YYT
15720 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54  RACKMAXSTACKDEPT
15730 48 0d 0a 20 20 69 66 28 20 28 69 6e 74 29 28 66  H..  if( (int)(f
15740 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
15750 73 35 79 79 74 6f 73 20 2d 20 66 74 73 35 79 79  s5yytos - fts5yy
15760 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73  pParser->fts5yys
15770 74 61 63 6b 29 3e 66 74 73 35 79 79 70 50 61 72  tack)>fts5yypPar
15780 73 65 72 2d 3e 66 74 73 35 79 79 68 77 6d 20 29  ser->fts5yyhwm )
15790 7b 0d 0a 20 20 20 20 66 74 73 35 79 79 70 50 61  {..    fts5yypPa
157a0 72 73 65 72 2d 3e 66 74 73 35 79 79 68 77 6d 2b  rser->fts5yyhwm+
157b0 2b 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20  +;..    assert( 
157c0 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
157d0 74 73 35 79 79 68 77 6d 20 3d 3d 20 28 69 6e 74  ts5yyhwm == (int
157e0 29 28 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  )(fts5yypParser-
157f0 3e 66 74 73 35 79 79 74 6f 73 20 2d 20 66 74 73  >fts5yytos - fts
15800 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
15810 79 79 73 74 61 63 6b 29 20 29 3b 0d 0a 20 20 7d  yystack) );..  }
15820 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20 66 74  ..#endif..#if ft
15830 73 35 59 59 53 54 41 43 4b 44 45 50 54 48 3e 30  s5YYSTACKDEPTH>0
15840 20 0d 0a 20 20 69 66 28 20 66 74 73 35 79 79 70   ..  if( fts5yyp
15850 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f  Parser->fts5yyto
15860 73 3e 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  s>fts5yypParser-
15870 3e 66 74 73 35 79 79 73 74 61 63 6b 45 6e 64 20  >fts5yystackEnd 
15880 29 7b 0d 0a 20 20 20 20 66 74 73 35 79 79 70 50  ){..    fts5yypP
15890 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73  arser->fts5yytos
158a0 2d 2d 3b 0d 0a 20 20 20 20 66 74 73 35 79 79 53  --;..    fts5yyS
158b0 74 61 63 6b 4f 76 65 72 66 6c 6f 77 28 66 74 73  tackOverflow(fts
158c0 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 20 20  5yypParser);..  
158d0 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 7d 0d 0a    return;..  }..
158e0 23 65 6c 73 65 0d 0a 20 20 69 66 28 20 66 74 73  #else..  if( fts
158f0 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
15900 79 79 74 6f 73 3e 3d 26 66 74 73 35 79 79 70 50  yytos>=&fts5yypP
15910 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61  arser->fts5yysta
15920 63 6b 5b 66 74 73 35 79 79 70 50 61 72 73 65 72  ck[fts5yypParser
15930 2d 3e 66 74 73 35 79 79 73 74 6b 73 7a 5d 20 29  ->fts5yystksz] )
15940 7b 0d 0a 20 20 20 20 69 66 28 20 66 74 73 35 79  {..    if( fts5y
15950 79 47 72 6f 77 53 74 61 63 6b 28 66 74 73 35 79  yGrowStack(fts5y
15960 79 70 50 61 72 73 65 72 29 20 29 7b 0d 0a 20 20  ypParser) ){..  
15970 20 20 20 20 66 74 73 35 79 79 70 50 61 72 73 65      fts5yypParse
15980 72 2d 3e 66 74 73 35 79 79 74 6f 73 2d 2d 3b 0d  r->fts5yytos--;.
15990 0a 20 20 20 20 20 20 66 74 73 35 79 79 53 74 61  .      fts5yySta
159a0 63 6b 4f 76 65 72 66 6c 6f 77 28 66 74 73 35 79  ckOverflow(fts5y
159b0 79 70 50 61 72 73 65 72 29 3b 0d 0a 20 20 20 20  ypParser);..    
159c0 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 7d    return;..    }
159d0 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20  ..  }..#endif.. 
159e0 20 69 66 28 20 66 74 73 35 79 79 4e 65 77 53 74   if( fts5yyNewSt
159f0 61 74 65 20 3e 20 66 74 73 35 59 59 5f 4d 41 58  ate > fts5YY_MAX
15a00 5f 53 48 49 46 54 20 29 7b 0d 0a 20 20 20 20 66  _SHIFT ){..    f
15a10 74 73 35 79 79 4e 65 77 53 74 61 74 65 20 2b 3d  ts5yyNewState +=
15a20 20 66 74 73 35 59 59 5f 4d 49 4e 5f 52 45 44 55   fts5YY_MIN_REDU
15a30 43 45 20 2d 20 66 74 73 35 59 59 5f 4d 49 4e 5f  CE - fts5YY_MIN_
15a40 53 48 49 46 54 52 45 44 55 43 45 3b 0d 0a 20 20  SHIFTREDUCE;..  
15a50 7d 0d 0a 20 20 66 74 73 35 79 79 74 6f 73 20 3d  }..  fts5yytos =
15a60 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
15a70 66 74 73 35 79 79 74 6f 73 3b 0d 0a 20 20 66 74  fts5yytos;..  ft
15a80 73 35 79 79 74 6f 73 2d 3e 73 74 61 74 65 6e 6f  s5yytos->stateno
15a90 20 3d 20 66 74 73 35 79 79 4e 65 77 53 74 61 74   = fts5yyNewStat
15aa0 65 3b 0d 0a 20 20 66 74 73 35 79 79 74 6f 73 2d  e;..  fts5yytos-
15ab0 3e 6d 61 6a 6f 72 20 3d 20 66 74 73 35 79 79 4d  >major = fts5yyM
15ac0 61 6a 6f 72 3b 0d 0a 20 20 66 74 73 35 79 79 74  ajor;..  fts5yyt
15ad0 6f 73 2d 3e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  os->minor.fts5yy
15ae0 30 20 3d 20 66 74 73 35 79 79 4d 69 6e 6f 72 3b  0 = fts5yyMinor;
15af0 0d 0a 20 20 66 74 73 35 79 79 54 72 61 63 65 53  ..  fts5yyTraceS
15b00 68 69 66 74 28 66 74 73 35 79 79 70 50 61 72 73  hift(fts5yypPars
15b10 65 72 2c 20 66 74 73 35 79 79 4e 65 77 53 74 61  er, fts5yyNewSta
15b20 74 65 2c 20 22 53 68 69 66 74 22 29 3b 0d 0a 7d  te, "Shift");..}
15b30 0d 0a 0d 0a 2f 2a 20 46 6f 72 20 72 75 6c 65 20  ..../* For rule 
15b40 4a 2c 20 66 74 73 35 79 79 52 75 6c 65 49 6e 66  J, fts5yyRuleInf
15b50 6f 4c 68 73 5b 4a 5d 20 63 6f 6e 74 61 69 6e 73  oLhs[J] contains
15b60 20 74 68 65 20 73 79 6d 62 6f 6c 20 6f 6e 20 74   the symbol on t
15b70 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
15b80 65 0d 0a 2a 2a 20 6f 66 20 74 68 61 74 20 72 75  e..** of that ru
15b90 6c 65 20 2a 2f 0d 0a 73 74 61 74 69 63 20 63 6f  le */..static co
15ba0 6e 73 74 20 66 74 73 35 59 59 43 4f 44 45 54 59  nst fts5YYCODETY
15bb0 50 45 20 66 74 73 35 79 79 52 75 6c 65 49 6e 66  PE fts5yyRuleInf
15bc0 6f 4c 68 73 5b 5d 20 3d 20 7b 0d 0a 20 20 20 20  oLhs[] = {..    
15bd0 31 36 2c 20 20 2f 2a 20 28 30 29 20 69 6e 70 75  16,  /* (0) inpu
15be0 74 20 3a 3a 3d 20 65 78 70 72 20 2a 2f 0d 0a 20  t ::= expr */.. 
15bf0 20 20 20 32 30 2c 20 20 2f 2a 20 28 31 29 20 63     20,  /* (1) c
15c00 6f 6c 73 65 74 20 3a 3a 3d 20 4d 49 4e 55 53 20  olset ::= MINUS 
15c10 4c 43 50 20 63 6f 6c 73 65 74 6c 69 73 74 20 52  LCP colsetlist R
15c20 43 50 20 2a 2f 0d 0a 20 20 20 20 32 30 2c 20 20  CP */..    20,  
15c30 2f 2a 20 28 32 29 20 63 6f 6c 73 65 74 20 3a 3a  /* (2) colset ::
15c40 3d 20 4c 43 50 20 63 6f 6c 73 65 74 6c 69 73 74  = LCP colsetlist
15c50 20 52 43 50 20 2a 2f 0d 0a 20 20 20 20 32 30 2c   RCP */..    20,
15c60 20 20 2f 2a 20 28 33 29 20 63 6f 6c 73 65 74 20    /* (3) colset 
15c70 3a 3a 3d 20 53 54 52 49 4e 47 20 2a 2f 0d 0a 20  ::= STRING */.. 
15c80 20 20 20 32 30 2c 20 20 2f 2a 20 28 34 29 20 63     20,  /* (4) c
15c90 6f 6c 73 65 74 20 3a 3a 3d 20 4d 49 4e 55 53 20  olset ::= MINUS 
15ca0 53 54 52 49 4e 47 20 2a 2f 0d 0a 20 20 20 20 32  STRING */..    2
15cb0 31 2c 20 20 2f 2a 20 28 35 29 20 63 6f 6c 73 65  1,  /* (5) colse
15cc0 74 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 73 65 74  tlist ::= colset
15cd0 6c 69 73 74 20 53 54 52 49 4e 47 20 2a 2f 0d 0a  list STRING */..
15ce0 20 20 20 20 32 31 2c 20 20 2f 2a 20 28 36 29 20      21,  /* (6) 
15cf0 63 6f 6c 73 65 74 6c 69 73 74 20 3a 3a 3d 20 53  colsetlist ::= S
15d00 54 52 49 4e 47 20 2a 2f 0d 0a 20 20 20 20 31 37  TRING */..    17
15d10 2c 20 20 2f 2a 20 28 37 29 20 65 78 70 72 20 3a  ,  /* (7) expr :
15d20 3a 3d 20 65 78 70 72 20 41 4e 44 20 65 78 70 72  := expr AND expr
15d30 20 2a 2f 0d 0a 20 20 20 20 31 37 2c 20 20 2f 2a   */..    17,  /*
15d40 20 28 38 29 20 65 78 70 72 20 3a 3a 3d 20 65 78   (8) expr ::= ex
15d50 70 72 20 4f 52 20 65 78 70 72 20 2a 2f 0d 0a 20  pr OR expr */.. 
15d60 20 20 20 31 37 2c 20 20 2f 2a 20 28 39 29 20 65     17,  /* (9) e
15d70 78 70 72 20 3a 3a 3d 20 65 78 70 72 20 4e 4f 54  xpr ::= expr NOT
15d80 20 65 78 70 72 20 2a 2f 0d 0a 20 20 20 20 31 37   expr */..    17
15d90 2c 20 20 2f 2a 20 28 31 30 29 20 65 78 70 72 20  ,  /* (10) expr 
15da0 3a 3a 3d 20 63 6f 6c 73 65 74 20 43 4f 4c 4f 4e  ::= colset COLON
15db0 20 4c 50 20 65 78 70 72 20 52 50 20 2a 2f 0d 0a   LP expr RP */..
15dc0 20 20 20 20 31 37 2c 20 20 2f 2a 20 28 31 31 29      17,  /* (11)
15dd0 20 65 78 70 72 20 3a 3a 3d 20 4c 50 20 65 78 70   expr ::= LP exp
15de0 72 20 52 50 20 2a 2f 0d 0a 20 20 20 20 31 37 2c  r RP */..    17,
15df0 20 20 2f 2a 20 28 31 32 29 20 65 78 70 72 20 3a    /* (12) expr :
15e00 3a 3d 20 65 78 70 72 6c 69 73 74 20 2a 2f 0d 0a  := exprlist */..
15e10 20 20 20 20 31 39 2c 20 20 2f 2a 20 28 31 33 29      19,  /* (13)
15e20 20 65 78 70 72 6c 69 73 74 20 3a 3a 3d 20 63 6e   exprlist ::= cn
15e30 65 61 72 73 65 74 20 2a 2f 0d 0a 20 20 20 20 31  earset */..    1
15e40 39 2c 20 20 2f 2a 20 28 31 34 29 20 65 78 70 72  9,  /* (14) expr
15e50 6c 69 73 74 20 3a 3a 3d 20 65 78 70 72 6c 69 73  list ::= exprlis
15e60 74 20 63 6e 65 61 72 73 65 74 20 2a 2f 0d 0a 20  t cnearset */.. 
15e70 20 20 20 31 38 2c 20 20 2f 2a 20 28 31 35 29 20     18,  /* (15) 
15e80 63 6e 65 61 72 73 65 74 20 3a 3a 3d 20 6e 65 61  cnearset ::= nea
15e90 72 73 65 74 20 2a 2f 0d 0a 20 20 20 20 31 38 2c  rset */..    18,
15ea0 20 20 2f 2a 20 28 31 36 29 20 63 6e 65 61 72 73    /* (16) cnears
15eb0 65 74 20 3a 3a 3d 20 63 6f 6c 73 65 74 20 43 4f  et ::= colset CO
15ec0 4c 4f 4e 20 6e 65 61 72 73 65 74 20 2a 2f 0d 0a  LON nearset */..
15ed0 20 20 20 20 32 32 2c 20 20 2f 2a 20 28 31 37 29      22,  /* (17)
15ee0 20 6e 65 61 72 73 65 74 20 3a 3a 3d 20 70 68 72   nearset ::= phr
15ef0 61 73 65 20 2a 2f 0d 0a 20 20 20 20 32 32 2c 20  ase */..    22, 
15f00 20 2f 2a 20 28 31 38 29 20 6e 65 61 72 73 65 74   /* (18) nearset
15f10 20 3a 3a 3d 20 43 41 52 45 54 20 70 68 72 61 73   ::= CARET phras
15f20 65 20 2a 2f 0d 0a 20 20 20 20 32 32 2c 20 20 2f  e */..    22,  /
15f30 2a 20 28 31 39 29 20 6e 65 61 72 73 65 74 20 3a  * (19) nearset :
15f40 3a 3d 20 53 54 52 49 4e 47 20 4c 50 20 6e 65 61  := STRING LP nea
15f50 72 70 68 72 61 73 65 73 20 6e 65 61 72 64 69 73  rphrases neardis
15f60 74 5f 6f 70 74 20 52 50 20 2a 2f 0d 0a 20 20 20  t_opt RP */..   
15f70 20 32 33 2c 20 20 2f 2a 20 28 32 30 29 20 6e 65   23,  /* (20) ne
15f80 61 72 70 68 72 61 73 65 73 20 3a 3a 3d 20 70 68  arphrases ::= ph
15f90 72 61 73 65 20 2a 2f 0d 0a 20 20 20 20 32 33 2c  rase */..    23,
15fa0 20 20 2f 2a 20 28 32 31 29 20 6e 65 61 72 70 68    /* (21) nearph
15fb0 72 61 73 65 73 20 3a 3a 3d 20 6e 65 61 72 70 68  rases ::= nearph
15fc0 72 61 73 65 73 20 70 68 72 61 73 65 20 2a 2f 0d  rases phrase */.
15fd0 0a 20 20 20 20 32 35 2c 20 20 2f 2a 20 28 32 32  .    25,  /* (22
15fe0 29 20 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 3a  ) neardist_opt :
15ff0 3a 3d 20 2a 2f 0d 0a 20 20 20 20 32 35 2c 20 20  := */..    25,  
16000 2f 2a 20 28 32 33 29 20 6e 65 61 72 64 69 73 74  /* (23) neardist
16010 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4d 4d 41 20 53  _opt ::= COMMA S
16020 54 52 49 4e 47 20 2a 2f 0d 0a 20 20 20 20 32 34  TRING */..    24
16030 2c 20 20 2f 2a 20 28 32 34 29 20 70 68 72 61 73  ,  /* (24) phras
16040 65 20 3a 3a 3d 20 70 68 72 61 73 65 20 50 4c 55  e ::= phrase PLU
16050 53 20 53 54 52 49 4e 47 20 73 74 61 72 5f 6f 70  S STRING star_op
16060 74 20 2a 2f 0d 0a 20 20 20 20 32 34 2c 20 20 2f  t */..    24,  /
16070 2a 20 28 32 35 29 20 70 68 72 61 73 65 20 3a 3a  * (25) phrase ::
16080 3d 20 53 54 52 49 4e 47 20 73 74 61 72 5f 6f 70  = STRING star_op
16090 74 20 2a 2f 0d 0a 20 20 20 20 32 36 2c 20 20 2f  t */..    26,  /
160a0 2a 20 28 32 36 29 20 73 74 61 72 5f 6f 70 74 20  * (26) star_opt 
160b0 3a 3a 3d 20 53 54 41 52 20 2a 2f 0d 0a 20 20 20  ::= STAR */..   
160c0 20 32 36 2c 20 20 2f 2a 20 28 32 37 29 20 73 74   26,  /* (27) st
160d0 61 72 5f 6f 70 74 20 3a 3a 3d 20 2a 2f 0d 0a 7d  ar_opt ::= */..}
160e0 3b 0d 0a 0d 0a 2f 2a 20 46 6f 72 20 72 75 6c 65  ;..../* For rule
160f0 20 4a 2c 20 66 74 73 35 79 79 52 75 6c 65 49 6e   J, fts5yyRuleIn
16100 66 6f 4e 52 68 73 5b 4a 5d 20 63 6f 6e 74 61 69  foNRhs[J] contai
16110 6e 73 20 74 68 65 20 6e 65 67 61 74 69 76 65 20  ns the negative 
16120 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0d 0a 2a  of the number..*
16130 2a 20 6f 66 20 73 79 6d 62 6f 6c 73 20 6f 6e 20  * of symbols on 
16140 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
16150 69 64 65 20 6f 66 20 74 68 61 74 20 72 75 6c 65  ide of that rule
16160 2e 20 2a 2f 0d 0a 73 74 61 74 69 63 20 63 6f 6e  . */..static con
16170 73 74 20 73 69 67 6e 65 64 20 63 68 61 72 20 66  st signed char f
16180 74 73 35 79 79 52 75 6c 65 49 6e 66 6f 4e 52 68  ts5yyRuleInfoNRh
16190 73 5b 5d 20 3d 20 7b 0d 0a 20 20 20 2d 31 2c 20  s[] = {..   -1, 
161a0 20 2f 2a 20 28 30 29 20 69 6e 70 75 74 20 3a 3a   /* (0) input ::
161b0 3d 20 65 78 70 72 20 2a 2f 0d 0a 20 20 20 2d 34  = expr */..   -4
161c0 2c 20 20 2f 2a 20 28 31 29 20 63 6f 6c 73 65 74  ,  /* (1) colset
161d0 20 3a 3a 3d 20 4d 49 4e 55 53 20 4c 43 50 20 63   ::= MINUS LCP c
161e0 6f 6c 73 65 74 6c 69 73 74 20 52 43 50 20 2a 2f  olsetlist RCP */
161f0 0d 0a 20 20 20 2d 33 2c 20 20 2f 2a 20 28 32 29  ..   -3,  /* (2)
16200 20 63 6f 6c 73 65 74 20 3a 3a 3d 20 4c 43 50 20   colset ::= LCP 
16210 63 6f 6c 73 65 74 6c 69 73 74 20 52 43 50 20 2a  colsetlist RCP *
16220 2f 0d 0a 20 20 20 2d 31 2c 20 20 2f 2a 20 28 33  /..   -1,  /* (3
16230 29 20 63 6f 6c 73 65 74 20 3a 3a 3d 20 53 54 52  ) colset ::= STR
16240 49 4e 47 20 2a 2f 0d 0a 20 20 20 2d 32 2c 20 20  ING */..   -2,  
16250 2f 2a 20 28 34 29 20 63 6f 6c 73 65 74 20 3a 3a  /* (4) colset ::
16260 3d 20 4d 49 4e 55 53 20 53 54 52 49 4e 47 20 2a  = MINUS STRING *
16270 2f 0d 0a 20 20 20 2d 32 2c 20 20 2f 2a 20 28 35  /..   -2,  /* (5
16280 29 20 63 6f 6c 73 65 74 6c 69 73 74 20 3a 3a 3d  ) colsetlist ::=
16290 20 63 6f 6c 73 65 74 6c 69 73 74 20 53 54 52 49   colsetlist STRI
162a0 4e 47 20 2a 2f 0d 0a 20 20 20 2d 31 2c 20 20 2f  NG */..   -1,  /
162b0 2a 20 28 36 29 20 63 6f 6c 73 65 74 6c 69 73 74  * (6) colsetlist
162c0 20 3a 3a 3d 20 53 54 52 49 4e 47 20 2a 2f 0d 0a   ::= STRING */..
162d0 20 20 20 2d 33 2c 20 20 2f 2a 20 28 37 29 20 65     -3,  /* (7) e
162e0 78 70 72 20 3a 3a 3d 20 65 78 70 72 20 41 4e 44  xpr ::= expr AND
162f0 20 65 78 70 72 20 2a 2f 0d 0a 20 20 20 2d 33 2c   expr */..   -3,
16300 20 20 2f 2a 20 28 38 29 20 65 78 70 72 20 3a 3a    /* (8) expr ::
16310 3d 20 65 78 70 72 20 4f 52 20 65 78 70 72 20 2a  = expr OR expr *
16320 2f 0d 0a 20 20 20 2d 33 2c 20 20 2f 2a 20 28 39  /..   -3,  /* (9
16330 29 20 65 78 70 72 20 3a 3a 3d 20 65 78 70 72 20  ) expr ::= expr 
16340 4e 4f 54 20 65 78 70 72 20 2a 2f 0d 0a 20 20 20  NOT expr */..   
16350 2d 35 2c 20 20 2f 2a 20 28 31 30 29 20 65 78 70  -5,  /* (10) exp
16360 72 20 3a 3a 3d 20 63 6f 6c 73 65 74 20 43 4f 4c  r ::= colset COL
16370 4f 4e 20 4c 50 20 65 78 70 72 20 52 50 20 2a 2f  ON LP expr RP */
16380 0d 0a 20 20 20 2d 33 2c 20 20 2f 2a 20 28 31 31  ..   -3,  /* (11
16390 29 20 65 78 70 72 20 3a 3a 3d 20 4c 50 20 65 78  ) expr ::= LP ex
163a0 70 72 20 52 50 20 2a 2f 0d 0a 20 20 20 2d 31 2c  pr RP */..   -1,
163b0 20 20 2f 2a 20 28 31 32 29 20 65 78 70 72 20 3a    /* (12) expr :
163c0 3a 3d 20 65 78 70 72 6c 69 73 74 20 2a 2f 0d 0a  := exprlist */..
163d0 20 20 20 2d 31 2c 20 20 2f 2a 20 28 31 33 29 20     -1,  /* (13) 
163e0 65 78 70 72 6c 69 73 74 20 3a 3a 3d 20 63 6e 65  exprlist ::= cne
163f0 61 72 73 65 74 20 2a 2f 0d 0a 20 20 20 2d 32 2c  arset */..   -2,
16400 20 20 2f 2a 20 28 31 34 29 20 65 78 70 72 6c 69    /* (14) exprli
16410 73 74 20 3a 3a 3d 20 65 78 70 72 6c 69 73 74 20  st ::= exprlist 
16420 63 6e 65 61 72 73 65 74 20 2a 2f 0d 0a 20 20 20  cnearset */..   
16430 2d 31 2c 20 20 2f 2a 20 28 31 35 29 20 63 6e 65  -1,  /* (15) cne
16440 61 72 73 65 74 20 3a 3a 3d 20 6e 65 61 72 73 65  arset ::= nearse
16450 74 20 2a 2f 0d 0a 20 20 20 2d 33 2c 20 20 2f 2a  t */..   -3,  /*
16460 20 28 31 36 29 20 63 6e 65 61 72 73 65 74 20 3a   (16) cnearset :
16470 3a 3d 20 63 6f 6c 73 65 74 20 43 4f 4c 4f 4e 20  := colset COLON 
16480 6e 65 61 72 73 65 74 20 2a 2f 0d 0a 20 20 20 2d  nearset */..   -
16490 31 2c 20 20 2f 2a 20 28 31 37 29 20 6e 65 61 72  1,  /* (17) near
164a0 73 65 74 20 3a 3a 3d 20 70 68 72 61 73 65 20 2a  set ::= phrase *
164b0 2f 0d 0a 20 20 20 2d 32 2c 20 20 2f 2a 20 28 31  /..   -2,  /* (1
164c0 38 29 20 6e 65 61 72 73 65 74 20 3a 3a 3d 20 43  8) nearset ::= C
164d0 41 52 45 54 20 70 68 72 61 73 65 20 2a 2f 0d 0a  ARET phrase */..
164e0 20 20 20 2d 35 2c 20 20 2f 2a 20 28 31 39 29 20     -5,  /* (19) 
164f0 6e 65 61 72 73 65 74 20 3a 3a 3d 20 53 54 52 49  nearset ::= STRI
16500 4e 47 20 4c 50 20 6e 65 61 72 70 68 72 61 73 65  NG LP nearphrase
16510 73 20 6e 65 61 72 64 69 73 74 5f 6f 70 74 20 52  s neardist_opt R
16520 50 20 2a 2f 0d 0a 20 20 20 2d 31 2c 20 20 2f 2a  P */..   -1,  /*
16530 20 28 32 30 29 20 6e 65 61 72 70 68 72 61 73 65   (20) nearphrase
16540 73 20 3a 3a 3d 20 70 68 72 61 73 65 20 2a 2f 0d  s ::= phrase */.
16550 0a 20 20 20 2d 32 2c 20 20 2f 2a 20 28 32 31 29  .   -2,  /* (21)
16560 20 6e 65 61 72 70 68 72 61 73 65 73 20 3a 3a 3d   nearphrases ::=
16570 20 6e 65 61 72 70 68 72 61 73 65 73 20 70 68 72   nearphrases phr
16580 61 73 65 20 2a 2f 0d 0a 20 20 20 20 30 2c 20 20  ase */..    0,  
16590 2f 2a 20 28 32 32 29 20 6e 65 61 72 64 69 73 74  /* (22) neardist
165a0 5f 6f 70 74 20 3a 3a 3d 20 2a 2f 0d 0a 20 20 20  _opt ::= */..   
165b0 2d 32 2c 20 20 2f 2a 20 28 32 33 29 20 6e 65 61  -2,  /* (23) nea
165c0 72 64 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 43 4f  rdist_opt ::= CO
165d0 4d 4d 41 20 53 54 52 49 4e 47 20 2a 2f 0d 0a 20  MMA STRING */.. 
165e0 20 20 2d 34 2c 20 20 2f 2a 20 28 32 34 29 20 70    -4,  /* (24) p
165f0 68 72 61 73 65 20 3a 3a 3d 20 70 68 72 61 73 65  hrase ::= phrase
16600 20 50 4c 55 53 20 53 54 52 49 4e 47 20 73 74 61   PLUS STRING sta
16610 72 5f 6f 70 74 20 2a 2f 0d 0a 20 20 20 2d 32 2c  r_opt */..   -2,
16620 20 20 2f 2a 20 28 32 35 29 20 70 68 72 61 73 65    /* (25) phrase
16630 20 3a 3a 3d 20 53 54 52 49 4e 47 20 73 74 61 72   ::= STRING star
16640 5f 6f 70 74 20 2a 2f 0d 0a 20 20 20 2d 31 2c 20  _opt */..   -1, 
16650 20 2f 2a 20 28 32 36 29 20 73 74 61 72 5f 6f 70   /* (26) star_op
16660 74 20 3a 3a 3d 20 53 54 41 52 20 2a 2f 0d 0a 20  t ::= STAR */.. 
16670 20 20 20 30 2c 20 20 2f 2a 20 28 32 37 29 20 73     0,  /* (27) s
16680 74 61 72 5f 6f 70 74 20 3a 3a 3d 20 2a 2f 0d 0a  tar_opt ::= */..
16690 7d 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69  };....static voi
166a0 64 20 66 74 73 35 79 79 5f 61 63 63 65 70 74 28  d fts5yy_accept(
166b0 66 74 73 35 79 79 50 61 72 73 65 72 2a 29 3b 20  fts5yyParser*); 
166c0 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c   /* Forward Decl
166d0 61 72 61 74 69 6f 6e 20 2a 2f 0d 0a 0d 0a 2f 2a  aration */..../*
166e0 0d 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 72  ..** Perform a r
166f0 65 64 75 63 65 20 61 63 74 69 6f 6e 20 61 6e 64  educe action and
16700 20 74 68 65 20 73 68 69 66 74 20 74 68 61 74 20   the shift that 
16710 6d 75 73 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  must immediately
16720 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 20 74 68 65 20  ..** follow the 
16730 72 65 64 75 63 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  reduce...**..** 
16740 54 68 65 20 66 74 73 35 79 79 4c 6f 6f 6b 61 68  The fts5yyLookah
16750 65 61 64 20 61 6e 64 20 66 74 73 35 79 79 4c 6f  ead and fts5yyLo
16760 6f 6b 61 68 65 61 64 54 6f 6b 65 6e 20 70 61 72  okaheadToken par
16770 61 6d 65 74 65 72 73 20 70 72 6f 76 69 64 65 20  ameters provide 
16780 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 0d 0a  reduce actions..
16790 2a 2a 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ** access to the
167a0 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65 6e   lookahead token
167b0 20 28 69 66 20 61 6e 79 29 2e 20 20 54 68 65 20   (if any).  The 
167c0 66 74 73 35 79 79 4c 6f 6f 6b 61 68 65 61 64 20  fts5yyLookahead 
167d0 77 69 6c 6c 20 62 65 20 66 74 73 35 59 59 4e 4f  will be fts5YYNO
167e0 43 4f 44 45 0d 0a 2a 2a 20 69 66 20 74 68 65 20  CODE..** if the 
167f0 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65 6e 20  lookahead token 
16800 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
16810 20 63 6f 6e 73 75 6d 65 64 2e 20 20 41 73 20 74   consumed.  As t
16820 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
16830 0d 0a 2a 2a 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  ..** only called
16840 20 66 72 6f 6d 20 6f 6e 65 20 70 6c 61 63 65 2c   from one place,
16850 20 6f 70 74 69 6d 69 7a 69 6e 67 20 63 6f 6d 70   optimizing comp
16860 69 6c 65 72 73 20 77 69 6c 6c 20 69 6e 2d 6c 69  ilers will in-li
16870 6e 65 20 69 74 2c 20 77 68 69 63 68 0d 0a 2a 2a  ne it, which..**
16880 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
16890 65 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 73  extra parameters
168a0 20 68 61 76 65 20 6e 6f 20 70 65 72 66 6f 72 6d   have no perform
168b0 61 6e 63 65 20 69 6d 70 61 63 74 2e 0d 0a 2a 2f  ance impact...*/
168c0 0d 0a 73 74 61 74 69 63 20 66 74 73 35 59 59 41  ..static fts5YYA
168d0 43 54 49 4f 4e 54 59 50 45 20 66 74 73 35 79 79  CTIONTYPE fts5yy
168e0 5f 72 65 64 75 63 65 28 0d 0a 20 20 66 74 73 35  _reduce(..  fts5
168f0 79 79 50 61 72 73 65 72 20 2a 66 74 73 35 79 79  yyParser *fts5yy
16900 70 50 61 72 73 65 72 2c 20 20 20 20 20 20 20 20  pParser,        
16910 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 2a   /* The parser *
16920 2f 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  /..  unsigned in
16930 74 20 66 74 73 35 79 79 72 75 6c 65 6e 6f 2c 20  t fts5yyruleno, 
16940 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16950 6f 66 20 74 68 65 20 72 75 6c 65 20 62 79 20 77  of the rule by w
16960 68 69 63 68 20 74 6f 20 72 65 64 75 63 65 20 2a  hich to reduce *
16970 2f 0d 0a 20 20 69 6e 74 20 66 74 73 35 79 79 4c  /..  int fts5yyL
16980 6f 6f 6b 61 68 65 61 64 2c 20 20 20 20 20 20 20  ookahead,       
16990 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 61 68 65        /* Lookahe
169a0 61 64 20 74 6f 6b 65 6e 2c 20 6f 72 20 66 74 73  ad token, or fts
169b0 35 59 59 4e 4f 43 4f 44 45 20 69 66 20 6e 6f 6e  5YYNOCODE if non
169c0 65 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46  e */..  sqlite3F
169d0 74 73 35 50 61 72 73 65 72 46 54 53 35 54 4f 4b  ts5ParserFTS5TOK
169e0 45 4e 54 59 50 45 20 66 74 73 35 79 79 4c 6f 6f  ENTYPE fts5yyLoo
169f0 6b 61 68 65 61 64 54 6f 6b 65 6e 20 20 2f 2a 20  kaheadToken  /* 
16a00 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  Value of the loo
16a10 6b 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0d  kahead token */.
16a20 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  .  sqlite3Fts5Pa
16a30 72 73 65 72 43 54 58 5f 50 44 45 43 4c 20 20 20  rserCTX_PDECL   
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a50 2f 2a 20 25 65 78 74 72 61 5f 63 6f 6e 74 65 78  /* %extra_contex
16a60 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  t */..){..  int 
16a70 66 74 73 35 79 79 67 6f 74 6f 3b 20 20 20 20 20  fts5yygoto;     
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 2f 2a 20 54 68 65 20 6e 65 78 74 20 73 74 61 74  /* The next stat
16aa0 65 20 2a 2f 0d 0a 20 20 66 74 73 35 59 59 41 43  e */..  fts5YYAC
16ab0 54 49 4f 4e 54 59 50 45 20 66 74 73 35 79 79 61  TIONTYPE fts5yya
16ac0 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ct;             
16ad0 2f 2a 20 54 68 65 20 6e 65 78 74 20 61 63 74 69  /* The next acti
16ae0 6f 6e 20 2a 2f 0d 0a 20 20 66 74 73 35 79 79 53  on */..  fts5yyS
16af0 74 61 63 6b 45 6e 74 72 79 20 2a 66 74 73 35 79  tackEntry *fts5y
16b00 79 6d 73 70 3b 20 20 20 20 20 20 20 20 20 20 20  ymsp;           
16b10 20 2f 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74   /* The top of t
16b20 68 65 20 70 61 72 73 65 72 27 73 20 73 74 61 63  he parser's stac
16b30 6b 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 74 73 35  k */..  int fts5
16b40 79 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  yysize;         
16b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16b60 6d 6f 75 6e 74 20 74 6f 20 70 6f 70 20 74 68 65  mount to pop the
16b70 20 73 74 61 63 6b 20 2a 2f 0d 0a 20 20 73 71 6c   stack */..  sql
16b80 69 74 65 33 46 74 73 35 50 61 72 73 65 72 41 52  ite3Fts5ParserAR
16b90 47 5f 46 45 54 43 48 0d 0a 20 20 28 76 6f 69 64  G_FETCH..  (void
16ba0 29 66 74 73 35 79 79 4c 6f 6f 6b 61 68 65 61 64  )fts5yyLookahead
16bb0 3b 0d 0a 20 20 28 76 6f 69 64 29 66 74 73 35 79  ;..  (void)fts5y
16bc0 79 4c 6f 6f 6b 61 68 65 61 64 54 6f 6b 65 6e 3b  yLookaheadToken;
16bd0 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 20 3d 20  ..  fts5yymsp = 
16be0 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
16bf0 74 73 35 79 79 74 6f 73 3b 0d 0a 23 69 66 6e 64  ts5yytos;..#ifnd
16c00 65 66 20 4e 44 45 42 55 47 0d 0a 20 20 69 66 28  ef NDEBUG..  if(
16c10 20 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45   fts5yyTraceFILE
16c20 20 26 26 20 66 74 73 35 79 79 72 75 6c 65 6e 6f   && fts5yyruleno
16c30 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 66 74  <(int)(sizeof(ft
16c40 73 35 79 79 52 75 6c 65 4e 61 6d 65 29 2f 73 69  s5yyRuleName)/si
16c50 7a 65 6f 66 28 66 74 73 35 79 79 52 75 6c 65 4e  zeof(fts5yyRuleN
16c60 61 6d 65 5b 30 5d 29 29 20 29 7b 0d 0a 20 20 20  ame[0])) ){..   
16c70 20 66 74 73 35 79 79 73 69 7a 65 20 3d 20 66 74   fts5yysize = ft
16c80 73 35 79 79 52 75 6c 65 49 6e 66 6f 4e 52 68 73  s5yyRuleInfoNRhs
16c90 5b 66 74 73 35 79 79 72 75 6c 65 6e 6f 5d 3b 0d  [fts5yyruleno];.
16ca0 0a 20 20 20 20 69 66 28 20 66 74 73 35 79 79 73  .    if( fts5yys
16cb0 69 7a 65 20 29 7b 0d 0a 20 20 20 20 20 20 66 70  ize ){..      fp
16cc0 72 69 6e 74 66 28 66 74 73 35 79 79 54 72 61 63  rintf(fts5yyTrac
16cd0 65 46 49 4c 45 2c 20 22 25 73 52 65 64 75 63 65  eFILE, "%sReduce
16ce0 20 25 64 20 5b 25 73 5d 2c 20 67 6f 20 74 6f 20   %d [%s], go to 
16cf0 73 74 61 74 65 20 25 64 2e 5c 6e 22 2c 0d 0a 20  state %d.\n",.. 
16d00 20 20 20 20 20 20 20 66 74 73 35 79 79 54 72 61         fts5yyTra
16d10 63 65 50 72 6f 6d 70 74 2c 0d 0a 20 20 20 20 20  cePrompt,..     
16d20 20 20 20 66 74 73 35 79 79 72 75 6c 65 6e 6f 2c     fts5yyruleno,
16d30 20 66 74 73 35 79 79 52 75 6c 65 4e 61 6d 65 5b   fts5yyRuleName[
16d40 66 74 73 35 79 79 72 75 6c 65 6e 6f 5d 2c 20 66  fts5yyruleno], f
16d50 74 73 35 79 79 6d 73 70 5b 66 74 73 35 79 79 73  ts5yymsp[fts5yys
16d60 69 7a 65 5d 2e 73 74 61 74 65 6e 6f 29 3b 0d 0a  ize].stateno);..
16d70 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
16d80 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79 79    fprintf(fts5yy
16d90 54 72 61 63 65 46 49 4c 45 2c 20 22 25 73 52 65  TraceFILE, "%sRe
16da0 64 75 63 65 20 25 64 20 5b 25 73 5d 2e 5c 6e 22  duce %d [%s].\n"
16db0 2c 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35 79  ,..        fts5y
16dc0 79 54 72 61 63 65 50 72 6f 6d 70 74 2c 20 66 74  yTracePrompt, ft
16dd0 73 35 79 79 72 75 6c 65 6e 6f 2c 20 66 74 73 35  s5yyruleno, fts5
16de0 79 79 52 75 6c 65 4e 61 6d 65 5b 66 74 73 35 79  yyRuleName[fts5y
16df0 79 72 75 6c 65 6e 6f 5d 29 3b 0d 0a 20 20 20 20  yruleno]);..    
16e00 7d 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 20 2f  }..  }..#endif /
16e10 2a 20 4e 44 45 42 55 47 20 2a 2f 0d 0a 0d 0a 20  * NDEBUG */.... 
16e20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
16e30 68 65 20 73 74 61 63 6b 20 69 73 20 6c 61 72 67  he stack is larg
16e40 65 20 65 6e 6f 75 67 68 20 74 6f 20 67 72 6f 77  e enough to grow
16e50 20 62 79 20 61 20 73 69 6e 67 6c 65 20 65 6e 74   by a single ent
16e60 72 79 0d 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  ry..  ** if the 
16e70 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c 65 20  RHS of the rule 
16e80 69 73 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  is empty.  This 
16e90 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
16ea0 72 65 20 69 73 20 72 6f 6f 6d 0d 0a 20 20 2a 2a  re is room..  **
16eb0 20 65 6e 6f 75 67 68 20 6f 6e 20 74 68 65 20 73   enough on the s
16ec0 74 61 63 6b 20 74 6f 20 70 75 73 68 20 74 68 65  tack to push the
16ed0 20 4c 48 53 20 76 61 6c 75 65 20 2a 2f 0d 0a 20   LHS value */.. 
16ee0 20 69 66 28 20 66 74 73 35 79 79 52 75 6c 65 49   if( fts5yyRuleI
16ef0 6e 66 6f 4e 52 68 73 5b 66 74 73 35 79 79 72 75  nfoNRhs[fts5yyru
16f00 6c 65 6e 6f 5d 3d 3d 30 20 29 7b 0d 0a 23 69 66  leno]==0 ){..#if
16f10 64 65 66 20 66 74 73 35 59 59 54 52 41 43 4b 4d  def fts5YYTRACKM
16f20 41 58 53 54 41 43 4b 44 45 50 54 48 0d 0a 20 20  AXSTACKDEPTH..  
16f30 20 20 69 66 28 20 28 69 6e 74 29 28 66 74 73 35    if( (int)(fts5
16f40 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
16f50 79 74 6f 73 20 2d 20 66 74 73 35 79 79 70 50 61  ytos - fts5yypPa
16f60 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63  rser->fts5yystac
16f70 6b 29 3e 66 74 73 35 79 79 70 50 61 72 73 65 72  k)>fts5yypParser
16f80 2d 3e 66 74 73 35 79 79 68 77 6d 20 29 7b 0d 0a  ->fts5yyhwm ){..
16f90 20 20 20 20 20 20 66 74 73 35 79 79 70 50 61 72        fts5yypPar
16fa0 73 65 72 2d 3e 66 74 73 35 79 79 68 77 6d 2b 2b  ser->fts5yyhwm++
16fb0 3b 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
16fc0 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
16fd0 66 74 73 35 79 79 68 77 6d 20 3d 3d 20 28 69 6e  fts5yyhwm == (in
16fe0 74 29 28 66 74 73 35 79 79 70 50 61 72 73 65 72  t)(fts5yypParser
16ff0 2d 3e 66 74 73 35 79 79 74 6f 73 20 2d 20 66 74  ->fts5yytos - ft
17000 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73  s5yypParser->fts
17010 35 79 79 73 74 61 63 6b 29 29 3b 0d 0a 20 20 20  5yystack));..   
17020 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 20   }..#endif..#if 
17030 66 74 73 35 59 59 53 54 41 43 4b 44 45 50 54 48  fts5YYSTACKDEPTH
17040 3e 30 20 0d 0a 20 20 20 20 69 66 28 20 66 74 73  >0 ..    if( fts
17050 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
17060 79 79 74 6f 73 3e 3d 66 74 73 35 79 79 70 50 61  yytos>=fts5yypPa
17070 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74 61 63  rser->fts5yystac
17080 6b 45 6e 64 20 29 7b 0d 0a 20 20 20 20 20 20 66  kEnd ){..      f
17090 74 73 35 79 79 53 74 61 63 6b 4f 76 65 72 66 6c  ts5yyStackOverfl
170a0 6f 77 28 66 74 73 35 79 79 70 50 61 72 73 65 72  ow(fts5yypParser
170b0 29 3b 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
170c0 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 79 79 53   call to fts5yyS
170d0 74 61 63 6b 4f 76 65 72 66 6c 6f 77 28 29 20 61  tackOverflow() a
170e0 62 6f 76 65 20 70 6f 70 73 20 74 68 65 20 73 74  bove pops the st
170f0 61 63 6b 20 75 6e 74 69 6c 20 69 74 20 69 73 0d  ack until it is.
17100 0a 20 20 20 20 20 20 2a 2a 20 65 6d 70 74 79 2c  .      ** empty,
17110 20 63 61 75 73 69 6e 67 20 74 68 65 20 6d 61 69   causing the mai
17120 6e 20 70 61 72 73 65 72 20 6c 6f 6f 70 20 74 6f  n parser loop to
17130 20 65 78 69 74 2e 20 20 53 6f 20 74 68 65 20 72   exit.  So the r
17140 65 74 75 72 6e 20 76 61 6c 75 65 0d 0a 20 20 20  eturn value..   
17150 20 20 20 2a 2a 20 69 73 20 6e 65 76 65 72 20 75     ** is never u
17160 73 65 64 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  sed and does not
17170 20 6d 61 74 74 65 72 2e 20 2a 2f 0d 0a 20 20 20   matter. */..   
17180 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20     return 0;..  
17190 20 20 7d 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20    }..#else..    
171a0 69 66 28 20 66 74 73 35 79 79 70 50 61 72 73 65  if( fts5yypParse
171b0 72 2d 3e 66 74 73 35 79 79 74 6f 73 3e 3d 26 66  r->fts5yytos>=&f
171c0 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
171d0 73 35 79 79 73 74 61 63 6b 5b 66 74 73 35 79 79  s5yystack[fts5yy
171e0 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73  pParser->fts5yys
171f0 74 6b 73 7a 2d 31 5d 20 29 7b 0d 0a 20 20 20 20  tksz-1] ){..    
17200 20 20 69 66 28 20 66 74 73 35 79 79 47 72 6f 77    if( fts5yyGrow
17210 53 74 61 63 6b 28 66 74 73 35 79 79 70 50 61 72  Stack(fts5yypPar
17220 73 65 72 29 20 29 7b 0d 0a 20 20 20 20 20 20 20  ser) ){..       
17230 20 66 74 73 35 79 79 53 74 61 63 6b 4f 76 65 72   fts5yyStackOver
17240 66 6c 6f 77 28 66 74 73 35 79 79 70 50 61 72 73  flow(fts5yypPars
17250 65 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2a  er);..        /*
17260 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 66 74 73   The call to fts
17270 35 79 79 53 74 61 63 6b 4f 76 65 72 66 6c 6f 77  5yyStackOverflow
17280 28 29 20 61 62 6f 76 65 20 70 6f 70 73 20 74 68  () above pops th
17290 65 20 73 74 61 63 6b 20 75 6e 74 69 6c 20 69 74  e stack until it
172a0 20 69 73 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20   is..        ** 
172b0 65 6d 70 74 79 2c 20 63 61 75 73 69 6e 67 20 74  empty, causing t
172c0 68 65 20 6d 61 69 6e 20 70 61 72 73 65 72 20 6c  he main parser l
172d0 6f 6f 70 20 74 6f 20 65 78 69 74 2e 20 20 53 6f  oop to exit.  So
172e0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
172f0 65 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  e..        ** is
17300 20 6e 65 76 65 72 20 75 73 65 64 20 61 6e 64 20   never used and 
17310 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
17320 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 72 65 74   */..        ret
17330 75 72 6e 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d  urn 0;..      }.
17340 0a 20 20 20 20 20 20 66 74 73 35 79 79 6d 73 70  .      fts5yymsp
17350 20 3d 20 66 74 73 35 79 79 70 50 61 72 73 65 72   = fts5yypParser
17360 2d 3e 66 74 73 35 79 79 74 6f 73 3b 0d 0a 20 20  ->fts5yytos;..  
17370 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 7d    }..#endif..  }
17380 0d 0a 0d 0a 20 20 73 77 69 74 63 68 28 20 66 74  ....  switch( ft
17390 73 35 79 79 72 75 6c 65 6e 6f 20 29 7b 0d 0a 20  s5yyruleno ){.. 
173a0 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 68 65   /* Beginning he
173b0 72 65 20 61 72 65 20 74 68 65 20 72 65 64 75 63  re are the reduc
173c0 74 69 6f 6e 20 63 61 73 65 73 2e 20 20 41 20 74  tion cases.  A t
173d0 79 70 69 63 61 6c 20 65 78 61 6d 70 6c 65 0d 0a  ypical example..
173e0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 20    ** follows:.. 
173f0 20 2a 2a 20 20 20 63 61 73 65 20 30 3a 0d 0a 20   **   case 0:.. 
17400 20 2a 2a 20 20 23 6c 69 6e 65 20 3c 6c 69 6e 65   **  #line <line
17410 6e 6f 3e 20 3c 67 72 61 6d 6d 61 72 66 69 6c 65  no> <grammarfile
17420 3e 0d 0a 20 20 2a 2a 20 20 20 20 20 7b 20 2e 2e  >..  **     { ..
17430 2e 20 7d 20 20 20 20 20 20 20 20 20 20 20 2f 2f  . }           //
17440 20 55 73 65 72 20 73 75 70 70 6c 69 65 64 20 63   User supplied c
17450 6f 64 65 0d 0a 20 20 2a 2a 20 20 23 6c 69 6e 65  ode..  **  #line
17460 20 3c 6c 69 6e 65 6e 6f 3e 20 3c 74 68 69 73 66   <lineno> <thisf
17470 69 6c 65 3e 0d 0a 20 20 2a 2a 20 20 20 20 20 62  ile>..  **     b
17480 72 65 61 6b 3b 0d 0a 20 20 2a 2f 0d 0a 2f 2a 2a  reak;..  */../**
17490 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 72  ******** Begin r
174a0 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 2a 2a  educe actions **
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 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20  ************/.. 
174e0 20 20 20 20 20 20 20 66 74 73 35 59 59 4d 49 4e         fts5YYMIN
174f0 4f 52 54 59 50 45 20 66 74 73 35 79 79 6c 68 73  ORTYPE fts5yylhs
17500 6d 69 6e 6f 72 3b 0d 0a 20 20 20 20 20 20 63 61  minor;..      ca
17510 73 65 20 30 3a 20 2f 2a 20 69 6e 70 75 74 20 3a  se 0: /* input :
17520 3a 3d 20 65 78 70 72 20 2a 2f 0d 0a 23 6c 69 6e  := expr */..#lin
17530 65 20 38 32 20 22 66 74 73 35 70 61 72 73 65 2e  e 82 "fts5parse.
17540 79 22 0d 0a 7b 20 73 71 6c 69 74 65 33 46 74 73  y"..{ sqlite3Fts
17550 35 50 61 72 73 65 46 69 6e 69 73 68 65 64 28 70  5ParseFinished(p
17560 50 61 72 73 65 2c 20 66 74 73 35 79 79 6d 73 70  Parse, fts5yymsp
17570 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  [0].minor.fts5yy
17580 32 34 29 3b 20 7d 0d 0a 23 6c 69 6e 65 20 31 30  24); }..#line 10
17590 34 39 20 22 66 74 73 35 70 61 72 73 65 2e 63 22  49 "fts5parse.c"
175a0 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
175b0 0d 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 20  ..      case 1: 
175c0 2f 2a 20 63 6f 6c 73 65 74 20 3a 3a 3d 20 4d 49  /* colset ::= MI
175d0 4e 55 53 20 4c 43 50 20 63 6f 6c 73 65 74 6c 69  NUS LCP colsetli
175e0 73 74 20 52 43 50 20 2a 2f 0d 0a 23 6c 69 6e 65  st RCP */..#line
175f0 20 39 37 20 22 66 74 73 35 70 61 72 73 65 2e 79   97 "fts5parse.y
17600 22 0d 0a 7b 20 0d 0a 20 20 20 20 66 74 73 35 79  "..{ ..    fts5y
17610 79 6d 73 70 5b 2d 33 5d 2e 6d 69 6e 6f 72 2e 66  ymsp[-3].minor.f
17620 74 73 35 79 79 31 31 20 3d 20 73 71 6c 69 74 65  ts5yy11 = sqlite
17630 33 46 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74  3Fts5ParseColset
17640 49 6e 76 65 72 74 28 70 50 61 72 73 65 2c 20 66  Invert(pParse, f
17650 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e  ts5yymsp[-1].min
17660 6f 72 2e 66 74 73 35 79 79 31 31 29 3b 0d 0a 7d  or.fts5yy11);..}
17670 0d 0a 23 6c 69 6e 65 20 31 30 35 36 20 22 66 74  ..#line 1056 "ft
17680 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 20 20  s5parse.c"..    
17690 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
176a0 20 20 63 61 73 65 20 32 3a 20 2f 2a 20 63 6f 6c    case 2: /* col
176b0 73 65 74 20 3a 3a 3d 20 4c 43 50 20 63 6f 6c 73  set ::= LCP cols
176c0 65 74 6c 69 73 74 20 52 43 50 20 2a 2f 0d 0a 23  etlist RCP */..#
176d0 6c 69 6e 65 20 31 30 30 20 22 66 74 73 35 70 61  line 100 "fts5pa
176e0 72 73 65 2e 79 22 0d 0a 7b 20 66 74 73 35 79 79  rse.y"..{ fts5yy
176f0 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74  msp[-2].minor.ft
17700 73 35 79 79 31 31 20 3d 20 66 74 73 35 79 79 6d  s5yy11 = fts5yym
17710 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-1].minor.fts
17720 35 79 79 31 31 3b 20 7d 0d 0a 23 6c 69 6e 65 20  5yy11; }..#line 
17730 31 30 36 31 20 22 66 74 73 35 70 61 72 73 65 2e  1061 "fts5parse.
17740 63 22 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  c"..        brea
17750 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 33  k;..      case 3
17760 3a 20 2f 2a 20 63 6f 6c 73 65 74 20 3a 3a 3d 20  : /* colset ::= 
17770 53 54 52 49 4e 47 20 2a 2f 0d 0a 23 6c 69 6e 65  STRING */..#line
17780 20 31 30 31 20 22 66 74 73 35 70 61 72 73 65 2e   101 "fts5parse.
17790 79 22 0d 0a 7b 0d 0a 20 20 66 74 73 35 79 79 6c  y"..{..  fts5yyl
177a0 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31  hsminor.fts5yy11
177b0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   = sqlite3Fts5Pa
177c0 72 73 65 43 6f 6c 73 65 74 28 70 50 61 72 73 65  rseColset(pParse
177d0 2c 20 30 2c 20 26 66 74 73 35 79 79 6d 73 70 5b  , 0, &fts5yymsp[
177e0 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 30  0].minor.fts5yy0
177f0 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 30 36  );..}..#line 106
17800 38 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  8 "fts5parse.c".
17810 0a 20 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e  .  fts5yymsp[0].
17820 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 20 3d  minor.fts5yy11 =
17830 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e   fts5yylhsminor.
17840 66 74 73 35 79 79 31 31 3b 0d 0a 20 20 20 20 20  fts5yy11;..     
17850 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
17860 20 63 61 73 65 20 34 3a 20 2f 2a 20 63 6f 6c 73   case 4: /* cols
17870 65 74 20 3a 3a 3d 20 4d 49 4e 55 53 20 53 54 52  et ::= MINUS STR
17880 49 4e 47 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 30  ING */..#line 10
17890 34 20 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d  4 "fts5parse.y".
178a0 0a 7b 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 5b  .{..  fts5yymsp[
178b0 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  -1].minor.fts5yy
178c0 31 31 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  11 = sqlite3Fts5
178d0 50 61 72 73 65 43 6f 6c 73 65 74 28 70 50 61 72  ParseColset(pPar
178e0 73 65 2c 20 30 2c 20 26 66 74 73 35 79 79 6d 73  se, 0, &fts5yyms
178f0 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  p[0].minor.fts5y
17900 79 30 29 3b 0d 0a 20 20 66 74 73 35 79 79 6d 73  y0);..  fts5yyms
17910 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  p[-1].minor.fts5
17920 79 79 31 31 20 3d 20 73 71 6c 69 74 65 33 46 74  yy11 = sqlite3Ft
17930 73 35 50 61 72 73 65 43 6f 6c 73 65 74 49 6e 76  s5ParseColsetInv
17940 65 72 74 28 70 50 61 72 73 65 2c 20 66 74 73 35  ert(pParse, fts5
17950 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e  yymsp[-1].minor.
17960 66 74 73 35 79 79 31 31 29 3b 0d 0a 7d 0d 0a 23  fts5yy11);..}..#
17970 6c 69 6e 65 20 31 30 37 37 20 22 66 74 73 35 70  line 1077 "fts5p
17980 61 72 73 65 2e 63 22 0d 0a 20 20 20 20 20 20 20  arse.c"..       
17990 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63   break;..      c
179a0 61 73 65 20 35 3a 20 2f 2a 20 63 6f 6c 73 65 74  ase 5: /* colset
179b0 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 73 65 74 6c  list ::= colsetl
179c0 69 73 74 20 53 54 52 49 4e 47 20 2a 2f 0d 0a 23  ist STRING */..#
179d0 6c 69 6e 65 20 31 30 39 20 22 66 74 73 35 70 61  line 109 "fts5pa
179e0 72 73 65 2e 79 22 0d 0a 7b 20 0d 0a 20 20 66 74  rse.y"..{ ..  ft
179f0 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
17a00 35 79 79 31 31 20 3d 20 73 71 6c 69 74 65 33 46  5yy11 = sqlite3F
17a10 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28 70  ts5ParseColset(p
17a20 50 61 72 73 65 2c 20 66 74 73 35 79 79 6d 73 70  Parse, fts5yymsp
17a30 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-1].minor.fts5y
17a40 79 31 31 2c 20 26 66 74 73 35 79 79 6d 73 70 5b  y11, &fts5yymsp[
17a50 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 30  0].minor.fts5yy0
17a60 29 3b 20 7d 0d 0a 23 6c 69 6e 65 20 31 30 38 33  ); }..#line 1083
17a70 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a   "fts5parse.c"..
17a80 20 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e    fts5yymsp[-1].
17a90 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31 20 3d  minor.fts5yy11 =
17aa0 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e   fts5yylhsminor.
17ab0 66 74 73 35 79 79 31 31 3b 0d 0a 20 20 20 20 20  fts5yy11;..     
17ac0 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
17ad0 20 63 61 73 65 20 36 3a 20 2f 2a 20 63 6f 6c 73   case 6: /* cols
17ae0 65 74 6c 69 73 74 20 3a 3a 3d 20 53 54 52 49 4e  etlist ::= STRIN
17af0 47 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 31 31 20  G */..#line 111 
17b00 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b  "fts5parse.y"..{
17b10 20 0d 0a 20 20 66 74 73 35 79 79 6c 68 73 6d 69   ..  fts5yylhsmi
17b20 6e 6f 72 2e 66 74 73 35 79 79 31 31 20 3d 20 73  nor.fts5yy11 = s
17b30 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43  qlite3Fts5ParseC
17b40 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c  olset(pParse, 0,
17b50 20 26 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d   &fts5yymsp[0].m
17b60 69 6e 6f 72 2e 66 74 73 35 79 79 30 29 3b 20 0d  inor.fts5yy0); .
17b70 0a 7d 0d 0a 23 6c 69 6e 65 20 31 30 39 31 20 22  .}..#line 1091 "
17b80 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20  fts5parse.c"..  
17b90 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e  fts5yymsp[0].min
17ba0 6f 72 2e 66 74 73 35 79 79 31 31 20 3d 20 66 74  or.fts5yy11 = ft
17bb0 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
17bc0 35 79 79 31 31 3b 0d 0a 20 20 20 20 20 20 20 20  5yy11;..        
17bd0 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61  break;..      ca
17be0 73 65 20 37 3a 20 2f 2a 20 65 78 70 72 20 3a 3a  se 7: /* expr ::
17bf0 3d 20 65 78 70 72 20 41 4e 44 20 65 78 70 72 20  = expr AND expr 
17c00 2a 2f 0d 0a 23 6c 69 6e 65 20 31 31 35 20 22 66  */..#line 115 "f
17c10 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 0d 0a  ts5parse.y"..{..
17c20 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72    fts5yylhsminor
17c30 2e 66 74 73 35 79 79 32 34 20 3d 20 73 71 6c 69  .fts5yy24 = sqli
17c40 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
17c50 28 70 50 61 72 73 65 2c 20 46 54 53 35 5f 41 4e  (pParse, FTS5_AN
17c60 44 2c 20 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d  D, fts5yymsp[-2]
17c70 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 2c  .minor.fts5yy24,
17c80 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69   fts5yymsp[0].mi
17c90 6e 6f 72 2e 66 74 73 35 79 79 32 34 2c 20 30 29  nor.fts5yy24, 0)
17ca0 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 30 39 39  ;..}..#line 1099
17cb0 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a   "fts5parse.c"..
17cc0 20 20 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d 2e    fts5yymsp[-2].
17cd0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 20 3d  minor.fts5yy24 =
17ce0 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e   fts5yylhsminor.
17cf0 66 74 73 35 79 79 32 34 3b 0d 0a 20 20 20 20 20  fts5yy24;..     
17d00 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
17d10 20 63 61 73 65 20 38 3a 20 2f 2a 20 65 78 70 72   case 8: /* expr
17d20 20 3a 3a 3d 20 65 78 70 72 20 4f 52 20 65 78 70   ::= expr OR exp
17d30 72 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 31 38 20  r */..#line 118 
17d40 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b  "fts5parse.y"..{
17d50 0d 0a 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e  ..  fts5yylhsmin
17d60 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20 73 71  or.fts5yy24 = sq
17d70 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
17d80 64 65 28 70 50 61 72 73 65 2c 20 46 54 53 35 5f  de(pParse, FTS5_
17d90 4f 52 2c 20 66 74 73 35 79 79 6d 73 70 5b 2d 32  OR, fts5yymsp[-2
17da0 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34  ].minor.fts5yy24
17db0 2c 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d  , fts5yymsp[0].m
17dc0 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 2c 20 30  inor.fts5yy24, 0
17dd0 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20 31 31 30  );..}..#line 110
17de0 37 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  7 "fts5parse.c".
17df0 0a 20 20 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d  .  fts5yymsp[-2]
17e00 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 20  .minor.fts5yy24 
17e10 3d 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72  = fts5yylhsminor
17e20 2e 66 74 73 35 79 79 32 34 3b 0d 0a 20 20 20 20  .fts5yy24;..    
17e30 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
17e40 20 20 63 61 73 65 20 39 3a 20 2f 2a 20 65 78 70    case 9: /* exp
17e50 72 20 3a 3a 3d 20 65 78 70 72 20 4e 4f 54 20 65  r ::= expr NOT e
17e60 78 70 72 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 32  xpr */..#line 12
17e70 31 20 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d  1 "fts5parse.y".
17e80 0a 7b 0d 0a 20 20 66 74 73 35 79 79 6c 68 73 6d  .{..  fts5yylhsm
17e90 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20  inor.fts5yy24 = 
17ea0 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
17eb0 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 46 54 53  Node(pParse, FTS
17ec0 35 5f 4e 4f 54 2c 20 66 74 73 35 79 79 6d 73 70  5_NOT, fts5yymsp
17ed0 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-2].minor.fts5y
17ee0 79 32 34 2c 20 66 74 73 35 79 79 6d 73 70 5b 30  y24, fts5yymsp[0
17ef0 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34  ].minor.fts5yy24
17f00 2c 20 30 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20  , 0);..}..#line 
17f10 31 31 31 35 20 22 66 74 73 35 70 61 72 73 65 2e  1115 "fts5parse.
17f20 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 5b  c"..  fts5yymsp[
17f30 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  -2].minor.fts5yy
17f40 32 34 20 3d 20 66 74 73 35 79 79 6c 68 73 6d 69  24 = fts5yylhsmi
17f50 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b 0d 0a 20  nor.fts5yy24;.. 
17f60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
17f70 20 20 20 20 20 63 61 73 65 20 31 30 3a 20 2f 2a       case 10: /*
17f80 20 65 78 70 72 20 3a 3a 3d 20 63 6f 6c 73 65 74   expr ::= colset
17f90 20 43 4f 4c 4f 4e 20 4c 50 20 65 78 70 72 20 52   COLON LP expr R
17fa0 50 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 32 35 20  P */..#line 125 
17fb0 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b  "fts5parse.y"..{
17fc0 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
17fd0 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28 70 50  arseSetColset(pP
17fe0 61 72 73 65 2c 20 66 74 73 35 79 79 6d 73 70 5b  arse, fts5yymsp[
17ff0 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  -1].minor.fts5yy
18000 32 34 2c 20 66 74 73 35 79 79 6d 73 70 5b 2d 34  24, fts5yymsp[-4
18010 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 31 31  ].minor.fts5yy11
18020 29 3b 0d 0a 20 20 66 74 73 35 79 79 6c 68 73 6d  );..  fts5yylhsm
18030 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20  inor.fts5yy24 = 
18040 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69  fts5yymsp[-1].mi
18050 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b 0d 0a 7d  nor.fts5yy24;..}
18060 0d 0a 23 6c 69 6e 65 20 31 31 32 34 20 22 66 74  ..#line 1124 "ft
18070 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 66 74  s5parse.c"..  ft
18080 73 35 79 79 6d 73 70 5b 2d 34 5d 2e 6d 69 6e 6f  s5yymsp[-4].mino
18090 72 2e 66 74 73 35 79 79 32 34 20 3d 20 66 74 73  r.fts5yy24 = fts
180a0 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
180b0 79 79 32 34 3b 0d 0a 20 20 20 20 20 20 20 20 62  yy24;..        b
180c0 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
180d0 65 20 31 31 3a 20 2f 2a 20 65 78 70 72 20 3a 3a  e 11: /* expr ::
180e0 3d 20 4c 50 20 65 78 70 72 20 52 50 20 2a 2f 0d  = LP expr RP */.
180f0 0a 23 6c 69 6e 65 20 31 32 39 20 22 66 74 73 35  .#line 129 "fts5
18100 70 61 72 73 65 2e 79 22 0d 0a 7b 66 74 73 35 79  parse.y"..{fts5y
18110 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66  ymsp[-2].minor.f
18120 74 73 35 79 79 32 34 20 3d 20 66 74 73 35 79 79  ts5yy24 = fts5yy
18130 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74  msp[-1].minor.ft
18140 73 35 79 79 32 34 3b 7d 0d 0a 23 6c 69 6e 65 20  s5yy24;}..#line 
18150 31 31 33 30 20 22 66 74 73 35 70 61 72 73 65 2e  1130 "fts5parse.
18160 63 22 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  c"..        brea
18170 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 31  k;..      case 1
18180 32 3a 20 2f 2a 20 65 78 70 72 20 3a 3a 3d 20 65  2: /* expr ::= e
18190 78 70 72 6c 69 73 74 20 2a 2f 0d 0a 20 20 20 20  xprlist */..    
181a0 20 20 63 61 73 65 20 31 33 3a 20 2f 2a 20 65 78    case 13: /* ex
181b0 70 72 6c 69 73 74 20 3a 3a 3d 20 63 6e 65 61 72  prlist ::= cnear
181c0 73 65 74 20 2a 2f 20 66 74 73 35 79 79 74 65 73  set */ fts5yytes
181d0 74 63 61 73 65 28 66 74 73 35 79 79 72 75 6c 65  tcase(fts5yyrule
181e0 6e 6f 3d 3d 31 33 29 3b 0d 0a 23 6c 69 6e 65 20  no==13);..#line 
181f0 31 33 30 20 22 66 74 73 35 70 61 72 73 65 2e 79  130 "fts5parse.y
18200 22 0d 0a 7b 66 74 73 35 79 79 6c 68 73 6d 69 6e  "..{fts5yylhsmin
18210 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20 66 74  or.fts5yy24 = ft
18220 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72  s5yymsp[0].minor
18230 2e 66 74 73 35 79 79 32 34 3b 7d 0d 0a 23 6c 69  .fts5yy24;}..#li
18240 6e 65 20 31 31 33 36 20 22 66 74 73 35 70 61 72  ne 1136 "fts5par
18250 73 65 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d  se.c"..  fts5yym
18260 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  sp[0].minor.fts5
18270 79 79 32 34 20 3d 20 66 74 73 35 79 79 6c 68 73  yy24 = fts5yylhs
18280 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b 0d  minor.fts5yy24;.
18290 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
182a0 0a 20 20 20 20 20 20 63 61 73 65 20 31 34 3a 20  .      case 14: 
182b0 2f 2a 20 65 78 70 72 6c 69 73 74 20 3a 3a 3d 20  /* exprlist ::= 
182c0 65 78 70 72 6c 69 73 74 20 63 6e 65 61 72 73 65  exprlist cnearse
182d0 74 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 33 33 20  t */..#line 133 
182e0 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b  "fts5parse.y"..{
182f0 0d 0a 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e  ..  fts5yylhsmin
18300 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20 73 71  or.fts5yy24 = sq
18310 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 49 6d  lite3Fts5ParseIm
18320 70 6c 69 63 69 74 41 6e 64 28 70 50 61 72 73 65  plicitAnd(pParse
18330 2c 20 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e  , fts5yymsp[-1].
18340 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 2c 20  minor.fts5yy24, 
18350 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e  fts5yymsp[0].min
18360 6f 72 2e 66 74 73 35 79 79 32 34 29 3b 0d 0a 7d  or.fts5yy24);..}
18370 0d 0a 23 6c 69 6e 65 20 31 31 34 34 20 22 66 74  ..#line 1144 "ft
18380 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 66 74  s5parse.c"..  ft
18390 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f  s5yymsp[-1].mino
183a0 72 2e 66 74 73 35 79 79 32 34 20 3d 20 66 74 73  r.fts5yy24 = fts
183b0 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35  5yylhsminor.fts5
183c0 79 79 32 34 3b 0d 0a 20 20 20 20 20 20 20 20 62  yy24;..        b
183d0 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
183e0 65 20 31 35 3a 20 2f 2a 20 63 6e 65 61 72 73 65  e 15: /* cnearse
183f0 74 20 3a 3a 3d 20 6e 65 61 72 73 65 74 20 2a 2f  t ::= nearset */
18400 0d 0a 23 6c 69 6e 65 20 31 33 37 20 22 66 74 73  ..#line 137 "fts
18410 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 0d 0a 20  5parse.y"..{ .. 
18420 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e   fts5yylhsminor.
18430 66 74 73 35 79 79 32 34 20 3d 20 73 71 6c 69 74  fts5yy24 = sqlit
18440 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28  e3Fts5ParseNode(
18450 70 50 61 72 73 65 2c 20 46 54 53 35 5f 53 54 52  pParse, FTS5_STR
18460 49 4e 47 2c 20 30 2c 20 30 2c 20 66 74 73 35 79  ING, 0, 0, fts5y
18470 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74  ymsp[0].minor.ft
18480 73 35 79 79 34 36 29 3b 20 0d 0a 7d 0d 0a 23 6c  s5yy46); ..}..#l
18490 69 6e 65 20 31 31 35 32 20 22 66 74 73 35 70 61  ine 1152 "fts5pa
184a0 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35 79 79  rse.c"..  fts5yy
184b0 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73  msp[0].minor.fts
184c0 35 79 79 32 34 20 3d 20 66 74 73 35 79 79 6c 68  5yy24 = fts5yylh
184d0 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 3b  sminor.fts5yy24;
184e0 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
184f0 0d 0a 20 20 20 20 20 20 63 61 73 65 20 31 36 3a  ..      case 16:
18500 20 2f 2a 20 63 6e 65 61 72 73 65 74 20 3a 3a 3d   /* cnearset ::=
18510 20 63 6f 6c 73 65 74 20 43 4f 4c 4f 4e 20 6e 65   colset COLON ne
18520 61 72 73 65 74 20 2a 2f 0d 0a 23 6c 69 6e 65 20  arset */..#line 
18530 31 34 30 20 22 66 74 73 35 70 61 72 73 65 2e 79  140 "fts5parse.y
18540 22 0d 0a 7b 20 0d 0a 20 20 66 74 73 35 79 79 6c  "..{ ..  fts5yyl
18550 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34  hsminor.fts5yy24
18560 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   = sqlite3Fts5Pa
18570 72 73 65 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  rseNode(pParse, 
18580 46 54 53 35 5f 53 54 52 49 4e 47 2c 20 30 2c 20  FTS5_STRING, 0, 
18590 30 2c 20 66 74 73 35 79 79 6d 73 70 5b 30 5d 2e  0, fts5yymsp[0].
185a0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34 36 29 3b  minor.fts5yy46);
185b0 20 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35   ..  sqlite3Fts5
185c0 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28 70  ParseSetColset(p
185d0 50 61 72 73 65 2c 20 66 74 73 35 79 79 6c 68 73  Parse, fts5yylhs
185e0 6d 69 6e 6f 72 2e 66 74 73 35 79 79 32 34 2c 20  minor.fts5yy24, 
185f0 66 74 73 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69  fts5yymsp[-2].mi
18600 6e 6f 72 2e 66 74 73 35 79 79 31 31 29 3b 0d 0a  nor.fts5yy11);..
18610 7d 0d 0a 23 6c 69 6e 65 20 31 31 36 31 20 22 66  }..#line 1161 "f
18620 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 66  ts5parse.c"..  f
18630 74 73 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e  ts5yymsp[-2].min
18640 6f 72 2e 66 74 73 35 79 79 32 34 20 3d 20 66 74  or.fts5yy24 = ft
18650 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
18660 35 79 79 32 34 3b 0d 0a 20 20 20 20 20 20 20 20  5yy24;..        
18670 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61  break;..      ca
18680 73 65 20 31 37 3a 20 2f 2a 20 6e 65 61 72 73 65  se 17: /* nearse
18690 74 20 3a 3a 3d 20 70 68 72 61 73 65 20 2a 2f 0d  t ::= phrase */.
186a0 0a 23 6c 69 6e 65 20 31 35 31 20 22 66 74 73 35  .#line 151 "fts5
186b0 70 61 72 73 65 2e 79 22 0d 0a 7b 20 66 74 73 35  parse.y"..{ fts5
186c0 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79  yylhsminor.fts5y
186d0 79 34 36 20 3d 20 73 71 6c 69 74 65 33 46 74 73  y46 = sqlite3Fts
186e0 35 50 61 72 73 65 4e 65 61 72 73 65 74 28 70 50  5ParseNearset(pP
186f0 61 72 73 65 2c 20 30 2c 20 66 74 73 35 79 79 6d  arse, 0, fts5yym
18700 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  sp[0].minor.fts5
18710 79 79 35 33 29 3b 20 7d 0d 0a 23 6c 69 6e 65 20  yy53); }..#line 
18720 31 31 36 37 20 22 66 74 73 35 70 61 72 73 65 2e  1167 "fts5parse.
18730 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 5b  c"..  fts5yymsp[
18740 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34  0].minor.fts5yy4
18750 36 20 3d 20 66 74 73 35 79 79 6c 68 73 6d 69 6e  6 = fts5yylhsmin
18760 6f 72 2e 66 74 73 35 79 79 34 36 3b 0d 0a 20 20  or.fts5yy46;..  
18770 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
18780 20 20 20 20 63 61 73 65 20 31 38 3a 20 2f 2a 20      case 18: /* 
18790 6e 65 61 72 73 65 74 20 3a 3a 3d 20 43 41 52 45  nearset ::= CARE
187a0 54 20 70 68 72 61 73 65 20 2a 2f 0d 0a 23 6c 69  T phrase */..#li
187b0 6e 65 20 31 35 32 20 22 66 74 73 35 70 61 72 73  ne 152 "fts5pars
187c0 65 2e 79 22 0d 0a 7b 20 0d 0a 20 20 73 71 6c 69  e.y"..{ ..  sqli
187d0 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74 43  te3Fts5ParseSetC
187e0 61 72 65 74 28 66 74 73 35 79 79 6d 73 70 5b 30  aret(fts5yymsp[0
187f0 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 35 33  ].minor.fts5yy53
18800 29 3b 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 5b  );..  fts5yymsp[
18810 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  -1].minor.fts5yy
18820 34 36 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  46 = sqlite3Fts5
18830 50 61 72 73 65 4e 65 61 72 73 65 74 28 70 50 61  ParseNearset(pPa
18840 72 73 65 2c 20 30 2c 20 66 74 73 35 79 79 6d 73  rse, 0, fts5yyms
18850 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  p[0].minor.fts5y
18860 79 35 33 29 3b 20 0d 0a 7d 0d 0a 23 6c 69 6e 65  y53); ..}..#line
18870 20 31 31 37 36 20 22 66 74 73 35 70 61 72 73 65   1176 "fts5parse
18880 2e 63 22 0d 0a 20 20 20 20 20 20 20 20 62 72 65  .c"..        bre
18890 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
188a0 31 39 3a 20 2f 2a 20 6e 65 61 72 73 65 74 20 3a  19: /* nearset :
188b0 3a 3d 20 53 54 52 49 4e 47 20 4c 50 20 6e 65 61  := STRING LP nea
188c0 72 70 68 72 61 73 65 73 20 6e 65 61 72 64 69 73  rphrases neardis
188d0 74 5f 6f 70 74 20 52 50 20 2a 2f 0d 0a 23 6c 69  t_opt RP */..#li
188e0 6e 65 20 31 35 36 20 22 66 74 73 35 70 61 72 73  ne 156 "fts5pars
188f0 65 2e 79 22 0d 0a 7b 0d 0a 20 20 73 71 6c 69 74  e.y"..{..  sqlit
18900 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 28  e3Fts5ParseNear(
18910 70 50 61 72 73 65 2c 20 26 66 74 73 35 79 79 6d  pParse, &fts5yym
18920 73 70 5b 2d 34 5d 2e 6d 69 6e 6f 72 2e 66 74 73  sp[-4].minor.fts
18930 35 79 79 30 29 3b 0d 0a 20 20 73 71 6c 69 74 65  5yy0);..  sqlite
18940 33 46 74 73 35 50 61 72 73 65 53 65 74 44 69 73  3Fts5ParseSetDis
18950 74 61 6e 63 65 28 70 50 61 72 73 65 2c 20 66 74  tance(pParse, ft
18960 73 35 79 79 6d 73 70 5b 2d 32 5d 2e 6d 69 6e 6f  s5yymsp[-2].mino
18970 72 2e 66 74 73 35 79 79 34 36 2c 20 26 66 74 73  r.fts5yy46, &fts
18980 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72  5yymsp[-1].minor
18990 2e 66 74 73 35 79 79 30 29 3b 0d 0a 20 20 66 74  .fts5yy0);..  ft
189a0 73 35 79 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73  s5yylhsminor.fts
189b0 35 79 79 34 36 20 3d 20 66 74 73 35 79 79 6d 73  5yy46 = fts5yyms
189c0 70 5b 2d 32 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  p[-2].minor.fts5
189d0 79 79 34 36 3b 0d 0a 7d 0d 0a 23 6c 69 6e 65 20  yy46;..}..#line 
189e0 31 31 38 35 20 22 66 74 73 35 70 61 72 73 65 2e  1185 "fts5parse.
189f0 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 5b  c"..  fts5yymsp[
18a00 2d 34 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  -4].minor.fts5yy
18a10 34 36 20 3d 20 66 74 73 35 79 79 6c 68 73 6d 69  46 = fts5yylhsmi
18a20 6e 6f 72 2e 66 74 73 35 79 79 34 36 3b 0d 0a 20  nor.fts5yy46;.. 
18a30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
18a40 20 20 20 20 20 63 61 73 65 20 32 30 3a 20 2f 2a       case 20: /*
18a50 20 6e 65 61 72 70 68 72 61 73 65 73 20 3a 3a 3d   nearphrases ::=
18a60 20 70 68 72 61 73 65 20 2a 2f 0d 0a 23 6c 69 6e   phrase */..#lin
18a70 65 20 31 36 32 20 22 66 74 73 35 70 61 72 73 65  e 162 "fts5parse
18a80 2e 79 22 0d 0a 7b 20 0d 0a 20 20 66 74 73 35 79  .y"..{ ..  fts5y
18a90 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79  ylhsminor.fts5yy
18aa0 34 36 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  46 = sqlite3Fts5
18ab0 50 61 72 73 65 4e 65 61 72 73 65 74 28 70 50 61  ParseNearset(pPa
18ac0 72 73 65 2c 20 30 2c 20 66 74 73 35 79 79 6d 73  rse, 0, fts5yyms
18ad0 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  p[0].minor.fts5y
18ae0 79 35 33 29 3b 20 0d 0a 7d 0d 0a 23 6c 69 6e 65  y53); ..}..#line
18af0 20 31 31 39 33 20 22 66 74 73 35 70 61 72 73 65   1193 "fts5parse
18b00 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73 70  .c"..  fts5yymsp
18b10 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  [0].minor.fts5yy
18b20 34 36 20 3d 20 66 74 73 35 79 79 6c 68 73 6d 69  46 = fts5yylhsmi
18b30 6e 6f 72 2e 66 74 73 35 79 79 34 36 3b 0d 0a 20  nor.fts5yy46;.. 
18b40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
18b50 20 20 20 20 20 63 61 73 65 20 32 31 3a 20 2f 2a       case 21: /*
18b60 20 6e 65 61 72 70 68 72 61 73 65 73 20 3a 3a 3d   nearphrases ::=
18b70 20 6e 65 61 72 70 68 72 61 73 65 73 20 70 68 72   nearphrases phr
18b80 61 73 65 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31 36  ase */..#line 16
18b90 35 20 22 66 74 73 35 70 61 72 73 65 2e 79 22 0d  5 "fts5parse.y".
18ba0 0a 7b 0d 0a 20 20 66 74 73 35 79 79 6c 68 73 6d  .{..  fts5yylhsm
18bb0 69 6e 6f 72 2e 66 74 73 35 79 79 34 36 20 3d 20  inor.fts5yy46 = 
18bc0 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
18bd0 4e 65 61 72 73 65 74 28 70 50 61 72 73 65 2c 20  Nearset(pParse, 
18be0 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69  fts5yymsp[-1].mi
18bf0 6e 6f 72 2e 66 74 73 35 79 79 34 36 2c 20 66 74  nor.fts5yy46, ft
18c00 73 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72  s5yymsp[0].minor
18c10 2e 66 74 73 35 79 79 35 33 29 3b 0d 0a 7d 0d 0a  .fts5yy53);..}..
18c20 23 6c 69 6e 65 20 31 32 30 31 20 22 66 74 73 35  #line 1201 "fts5
18c30 70 61 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35  parse.c"..  fts5
18c40 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e  yymsp[-1].minor.
18c50 66 74 73 35 79 79 34 36 20 3d 20 66 74 73 35 79  fts5yy46 = fts5y
18c60 79 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79  ylhsminor.fts5yy
18c70 34 36 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65  46;..        bre
18c80 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
18c90 32 32 3a 20 2f 2a 20 6e 65 61 72 64 69 73 74 5f  22: /* neardist_
18ca0 6f 70 74 20 3a 3a 3d 20 2a 2f 0d 0a 23 6c 69 6e  opt ::= */..#lin
18cb0 65 20 31 37 32 20 22 66 74 73 35 70 61 72 73 65  e 172 "fts5parse
18cc0 2e 79 22 0d 0a 7b 20 66 74 73 35 79 79 6d 73 70  .y"..{ fts5yymsp
18cd0 5b 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79  [1].minor.fts5yy
18ce0 30 2e 70 20 3d 20 30 3b 20 66 74 73 35 79 79 6d  0.p = 0; fts5yym
18cf0 73 70 5b 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  sp[1].minor.fts5
18d00 79 79 30 2e 6e 20 3d 20 30 3b 20 7d 0d 0a 23 6c  yy0.n = 0; }..#l
18d10 69 6e 65 20 31 32 30 37 20 22 66 74 73 35 70 61  ine 1207 "fts5pa
18d20 72 73 65 2e 63 22 0d 0a 20 20 20 20 20 20 20 20  rse.c"..        
18d30 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 63 61  break;..      ca
18d40 73 65 20 32 33 3a 20 2f 2a 20 6e 65 61 72 64 69  se 23: /* neardi
18d50 73 74 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4d 4d 41  st_opt ::= COMMA
18d60 20 53 54 52 49 4e 47 20 2a 2f 0d 0a 23 6c 69 6e   STRING */..#lin
18d70 65 20 31 37 33 20 22 66 74 73 35 70 61 72 73 65  e 173 "fts5parse
18d80 2e 79 22 0d 0a 7b 20 66 74 73 35 79 79 6d 73 70  .y"..{ fts5yymsp
18d90 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79  [-1].minor.fts5y
18da0 79 30 20 3d 20 66 74 73 35 79 79 6d 73 70 5b 30  y0 = fts5yymsp[0
18db0 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 30 3b  ].minor.fts5yy0;
18dc0 20 7d 0d 0a 23 6c 69 6e 65 20 31 32 31 32 20 22   }..#line 1212 "
18dd0 66 74 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20  fts5parse.c"..  
18de0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
18df0 20 20 20 20 63 61 73 65 20 32 34 3a 20 2f 2a 20      case 24: /* 
18e00 70 68 72 61 73 65 20 3a 3a 3d 20 70 68 72 61 73  phrase ::= phras
18e10 65 20 50 4c 55 53 20 53 54 52 49 4e 47 20 73 74  e PLUS STRING st
18e20 61 72 5f 6f 70 74 20 2a 2f 0d 0a 23 6c 69 6e 65  ar_opt */..#line
18e30 20 31 38 35 20 22 66 74 73 35 70 61 72 73 65 2e   185 "fts5parse.
18e40 79 22 0d 0a 7b 20 0d 0a 20 20 66 74 73 35 79 79  y"..{ ..  fts5yy
18e50 6c 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 35  lhsminor.fts5yy5
18e60 33 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50  3 = sqlite3Fts5P
18e70 61 72 73 65 54 65 72 6d 28 70 50 61 72 73 65 2c  arseTerm(pParse,
18e80 20 66 74 73 35 79 79 6d 73 70 5b 2d 33 5d 2e 6d   fts5yymsp[-3].m
18e90 69 6e 6f 72 2e 66 74 73 35 79 79 35 33 2c 20 26  inor.fts5yy53, &
18ea0 66 74 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69  fts5yymsp[-1].mi
18eb0 6e 6f 72 2e 66 74 73 35 79 79 30 2c 20 66 74 73  nor.fts5yy0, fts
18ec0 35 79 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e  5yymsp[0].minor.
18ed0 66 74 73 35 79 79 34 29 3b 0d 0a 7d 0d 0a 23 6c  fts5yy4);..}..#l
18ee0 69 6e 65 20 31 32 31 39 20 22 66 74 73 35 70 61  ine 1219 "fts5pa
18ef0 72 73 65 2e 63 22 0d 0a 20 20 66 74 73 35 79 79  rse.c"..  fts5yy
18f00 6d 73 70 5b 2d 33 5d 2e 6d 69 6e 6f 72 2e 66 74  msp[-3].minor.ft
18f10 73 35 79 79 35 33 20 3d 20 66 74 73 35 79 79 6c  s5yy53 = fts5yyl
18f20 68 73 6d 69 6e 6f 72 2e 66 74 73 35 79 79 35 33  hsminor.fts5yy53
18f30 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;..        break
18f40 3b 0d 0a 20 20 20 20 20 20 63 61 73 65 20 32 35  ;..      case 25
18f50 3a 20 2f 2a 20 70 68 72 61 73 65 20 3a 3a 3d 20  : /* phrase ::= 
18f60 53 54 52 49 4e 47 20 73 74 61 72 5f 6f 70 74 20  STRING star_opt 
18f70 2a 2f 0d 0a 23 6c 69 6e 65 20 31 38 38 20 22 66  */..#line 188 "f
18f80 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 0d  ts5parse.y"..{ .
18f90 0a 20 20 66 74 73 35 79 79 6c 68 73 6d 69 6e 6f  .  fts5yylhsmino
18fa0 72 2e 66 74 73 35 79 79 35 33 20 3d 20 73 71 6c  r.fts5yy53 = sql
18fb0 69 74 65 33 46 74 73 35 50 61 72 73 65 54 65 72  ite3Fts5ParseTer
18fc0 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 66 74  m(pParse, 0, &ft
18fd0 73 35 79 79 6d 73 70 5b 2d 31 5d 2e 6d 69 6e 6f  s5yymsp[-1].mino
18fe0 72 2e 66 74 73 35 79 79 30 2c 20 66 74 73 35 79  r.fts5yy0, fts5y
18ff0 79 6d 73 70 5b 30 5d 2e 6d 69 6e 6f 72 2e 66 74  ymsp[0].minor.ft
19000 73 35 79 79 34 29 3b 0d 0a 7d 0d 0a 23 6c 69 6e  s5yy4);..}..#lin
19010 65 20 31 32 32 37 20 22 66 74 73 35 70 61 72 73  e 1227 "fts5pars
19020 65 2e 63 22 0d 0a 20 20 66 74 73 35 79 79 6d 73  e.c"..  fts5yyms
19030 70 5b 2d 31 5d 2e 6d 69 6e 6f 72 2e 66 74 73 35  p[-1].minor.fts5
19040 79 79 35 33 20 3d 20 66 74 73 35 79 79 6c 68 73  yy53 = fts5yylhs
19050 6d 69 6e 6f 72 2e 66 74 73 35 79 79 35 33 3b 0d  minor.fts5yy53;.
19060 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
19070 0a 20 20 20 20 20 20 63 61 73 65 20 32 36 3a 20  .      case 26: 
19080 2f 2a 20 73 74 61 72 5f 6f 70 74 20 3a 3a 3d 20  /* star_opt ::= 
19090 53 54 41 52 20 2a 2f 0d 0a 23 6c 69 6e 65 20 31  STAR */..#line 1
190a0 39 36 20 22 66 74 73 35 70 61 72 73 65 2e 79 22  96 "fts5parse.y"
190b0 0d 0a 7b 20 66 74 73 35 79 79 6d 73 70 5b 30 5d  ..{ fts5yymsp[0]
190c0 2e 6d 69 6e 6f 72 2e 66 74 73 35 79 79 34 20 3d  .minor.fts5yy4 =
190d0 20 31 3b 20 7d 0d 0a 23 6c 69 6e 65 20 31 32 33   1; }..#line 123
190e0 33 20 22 66 74 73 35 70 61 72 73 65 2e 63 22 0d  3 "fts5parse.c".
190f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
19100 0a 20 20 20 20 20 20 63 61 73 65 20 32 37 3a 20  .      case 27: 
19110 2f 2a 20 73 74 61 72 5f 6f 70 74 20 3a 3a 3d 20  /* star_opt ::= 
19120 2a 2f 0d 0a 23 6c 69 6e 65 20 31 39 37 20 22 66  */..#line 197 "f
19130 74 73 35 70 61 72 73 65 2e 79 22 0d 0a 7b 20 66  ts5parse.y"..{ f
19140 74 73 35 79 79 6d 73 70 5b 31 5d 2e 6d 69 6e 6f  ts5yymsp[1].mino
19150 72 2e 66 74 73 35 79 79 34 20 3d 20 30 3b 20 7d  r.fts5yy4 = 0; }
19160 0d 0a 23 6c 69 6e 65 20 31 32 33 38 20 22 66 74  ..#line 1238 "ft
19170 73 35 70 61 72 73 65 2e 63 22 0d 0a 20 20 20 20  s5parse.c"..    
19180 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
19190 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 20 20    default:..    
191a0 20 20 20 20 62 72 65 61 6b 3b 0d 0a 2f 2a 2a 2a      break;../***
191b0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 72 65 64 75  ******* End redu
191c0 63 65 20 61 63 74 69 6f 6e 73 20 2a 2a 2a 2a 2a  ce actions *****
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 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20  ***********/..  
19200 7d 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 66 74  };..  assert( ft
19210 73 35 79 79 72 75 6c 65 6e 6f 3c 73 69 7a 65 6f  s5yyruleno<sizeo
19220 66 28 66 74 73 35 79 79 52 75 6c 65 49 6e 66 6f  f(fts5yyRuleInfo
19230 4c 68 73 29 2f 73 69 7a 65 6f 66 28 66 74 73 35  Lhs)/sizeof(fts5
19240 79 79 52 75 6c 65 49 6e 66 6f 4c 68 73 5b 30 5d  yyRuleInfoLhs[0]
19250 29 20 29 3b 0d 0a 20 20 66 74 73 35 79 79 67 6f  ) );..  fts5yygo
19260 74 6f 20 3d 20 66 74 73 35 79 79 52 75 6c 65 49  to = fts5yyRuleI
19270 6e 66 6f 4c 68 73 5b 66 74 73 35 79 79 72 75 6c  nfoLhs[fts5yyrul
19280 65 6e 6f 5d 3b 0d 0a 20 20 66 74 73 35 79 79 73  eno];..  fts5yys
19290 69 7a 65 20 3d 20 66 74 73 35 79 79 52 75 6c 65  ize = fts5yyRule
192a0 49 6e 66 6f 4e 52 68 73 5b 66 74 73 35 79 79 72  InfoNRhs[fts5yyr
192b0 75 6c 65 6e 6f 5d 3b 0d 0a 20 20 66 74 73 35 79  uleno];..  fts5y
192c0 79 61 63 74 20 3d 20 66 74 73 35 79 79 5f 66 69  yact = fts5yy_fi
192d0 6e 64 5f 72 65 64 75 63 65 5f 61 63 74 69 6f 6e  nd_reduce_action
192e0 28 66 74 73 35 79 79 6d 73 70 5b 66 74 73 35 79  (fts5yymsp[fts5y
192f0 79 73 69 7a 65 5d 2e 73 74 61 74 65 6e 6f 2c 28  ysize].stateno,(
19300 66 74 73 35 59 59 43 4f 44 45 54 59 50 45 29 66  fts5YYCODETYPE)f
19310 74 73 35 79 79 67 6f 74 6f 29 3b 0d 0a 0d 0a 20  ts5yygoto);.... 
19320 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
19330 20 53 48 49 46 54 52 45 44 55 43 45 20 61 63 74   SHIFTREDUCE act
19340 69 6f 6e 73 20 6f 6e 20 6e 6f 6e 74 65 72 6d 69  ions on nontermi
19350 6e 61 6c 73 20 62 65 63 61 75 73 65 20 74 68 65  nals because the
19360 20 74 61 62 6c 65 0d 0a 20 20 2a 2a 20 67 65 6e   table..  ** gen
19370 65 72 61 74 6f 72 20 68 61 73 20 73 69 6d 70 6c  erator has simpl
19380 69 66 69 65 64 20 74 68 65 6d 20 74 6f 20 70 75  ified them to pu
19390 72 65 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  re REDUCE action
193a0 73 2e 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28  s. */..  assert(
193b0 20 21 28 66 74 73 35 79 79 61 63 74 3e 66 74 73   !(fts5yyact>fts
193c0 35 59 59 5f 4d 41 58 5f 53 48 49 46 54 20 26 26  5YY_MAX_SHIFT &&
193d0 20 66 74 73 35 79 79 61 63 74 3c 3d 66 74 73 35   fts5yyact<=fts5
193e0 59 59 5f 4d 41 58 5f 53 48 49 46 54 52 45 44 55  YY_MAX_SHIFTREDU
193f0 43 45 29 20 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49  CE) );....  /* I
19400 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
19410 65 20 66 6f 72 20 61 20 52 45 44 55 43 45 20 74  e for a REDUCE t
19420 6f 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  o be followed by
19430 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0d 0a 20 20   an error */..  
19440 61 73 73 65 72 74 28 20 66 74 73 35 79 79 61 63  assert( fts5yyac
19450 74 21 3d 66 74 73 35 59 59 5f 45 52 52 4f 52 5f  t!=fts5YY_ERROR_
19460 41 43 54 49 4f 4e 20 29 3b 0d 0a 0d 0a 20 20 66  ACTION );....  f
19470 74 73 35 79 79 6d 73 70 20 2b 3d 20 66 74 73 35  ts5yymsp += fts5
19480 79 79 73 69 7a 65 2b 31 3b 0d 0a 20 20 66 74 73  yysize+1;..  fts
19490 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
194a0 79 79 74 6f 73 20 3d 20 66 74 73 35 79 79 6d 73  yytos = fts5yyms
194b0 70 3b 0d 0a 20 20 66 74 73 35 79 79 6d 73 70 2d  p;..  fts5yymsp-
194c0 3e 73 74 61 74 65 6e 6f 20 3d 20 28 66 74 73 35  >stateno = (fts5
194d0 59 59 41 43 54 49 4f 4e 54 59 50 45 29 66 74 73  YYACTIONTYPE)fts
194e0 35 79 79 61 63 74 3b 0d 0a 20 20 66 74 73 35 79  5yyact;..  fts5y
194f0 79 6d 73 70 2d 3e 6d 61 6a 6f 72 20 3d 20 28 66  ymsp->major = (f
19500 74 73 35 59 59 43 4f 44 45 54 59 50 45 29 66 74  ts5YYCODETYPE)ft
19510 73 35 79 79 67 6f 74 6f 3b 0d 0a 20 20 66 74 73  s5yygoto;..  fts
19520 35 79 79 54 72 61 63 65 53 68 69 66 74 28 66 74  5yyTraceShift(ft
19530 73 35 79 79 70 50 61 72 73 65 72 2c 20 66 74 73  s5yypParser, fts
19540 35 79 79 61 63 74 2c 20 22 2e 2e 2e 20 74 68 65  5yyact, "... the
19550 6e 20 73 68 69 66 74 22 29 3b 0d 0a 20 20 72 65  n shift");..  re
19560 74 75 72 6e 20 66 74 73 35 79 79 61 63 74 3b 0d  turn fts5yyact;.
19570 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65  .}..../*..** The
19580 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
19590 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68  executes when th
195a0 65 20 70 61 72 73 65 20 66 61 69 6c 73 0d 0a 2a  e parse fails..*
195b0 2f 0d 0a 23 69 66 6e 64 65 66 20 66 74 73 35 59  /..#ifndef fts5Y
195c0 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59  YNOERRORRECOVERY
195d0 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
195e0 73 35 79 79 5f 70 61 72 73 65 5f 66 61 69 6c 65  s5yy_parse_faile
195f0 64 28 0d 0a 20 20 66 74 73 35 79 79 50 61 72 73  d(..  fts5yyPars
19600 65 72 20 2a 66 74 73 35 79 79 70 50 61 72 73 65  er *fts5yypParse
19610 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r           /* T
19620 68 65 20 70 61 72 73 65 72 20 2a 2f 0d 0a 29 7b  he parser */..){
19630 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
19640 61 72 73 65 72 41 52 47 5f 46 45 54 43 48 0d 0a  arserARG_FETCH..
19650 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
19660 73 65 72 43 54 58 5f 46 45 54 43 48 0d 0a 23 69  serCTX_FETCH..#i
19670 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 20 20  fndef NDEBUG..  
19680 69 66 28 20 66 74 73 35 79 79 54 72 61 63 65 46  if( fts5yyTraceF
19690 49 4c 45 20 29 7b 0d 0a 20 20 20 20 66 70 72 69  ILE ){..    fpri
196a0 6e 74 66 28 66 74 73 35 79 79 54 72 61 63 65 46  ntf(fts5yyTraceF
196b0 49 4c 45 2c 22 25 73 46 61 69 6c 21 5c 6e 22 2c  ILE,"%sFail!\n",
196c0 66 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70  fts5yyTracePromp
196d0 74 29 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66  t);..  }..#endif
196e0 0d 0a 20 20 77 68 69 6c 65 28 20 66 74 73 35 79  ..  while( fts5y
196f0 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
19700 74 6f 73 3e 66 74 73 35 79 79 70 50 61 72 73 65  tos>fts5yypParse
19710 72 2d 3e 66 74 73 35 79 79 73 74 61 63 6b 20 29  r->fts5yystack )
19720 20 66 74 73 35 79 79 5f 70 6f 70 5f 70 61 72 73   fts5yy_pop_pars
19730 65 72 5f 73 74 61 63 6b 28 66 74 73 35 79 79 70  er_stack(fts5yyp
19740 50 61 72 73 65 72 29 3b 0d 0a 20 20 2f 2a 20 48  Parser);..  /* H
19750 65 72 65 20 63 6f 64 65 20 69 73 20 69 6e 73 65  ere code is inse
19760 72 74 65 64 20 77 68 69 63 68 20 77 69 6c 6c 20  rted which will 
19770 62 65 20 65 78 65 63 75 74 65 64 20 77 68 65 6e  be executed when
19780 65 76 65 72 20 74 68 65 0d 0a 20 20 2a 2a 20 70  ever the..  ** p
19790 61 72 73 65 72 20 66 61 69 6c 73 20 2a 2f 0d 0a  arser fails */..
197a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  /************ Be
197b0 67 69 6e 20 25 70 61 72 73 65 5f 66 61 69 6c 75  gin %parse_failu
197c0 72 65 20 63 6f 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a  re code ********
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 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
197f0 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  ../************ 
19800 45 6e 64 20 25 70 61 72 73 65 5f 66 61 69 6c 75  End %parse_failu
19810 72 65 20 63 6f 64 65 20 2a 2a 2a 2a 2a 2a 2a 2a  re code ********
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 2a 2a 2a 2a 2a 2a  ****************
19840 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73  */..  sqlite3Fts
19850 35 50 61 72 73 65 72 41 52 47 5f 53 54 4f 52 45  5ParserARG_STORE
19860 20 2f 2a 20 53 75 70 70 72 65 73 73 20 77 61 72   /* Suppress war
19870 6e 69 6e 67 20 61 62 6f 75 74 20 75 6e 75 73 65  ning about unuse
19880 64 20 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  d %extra_argumen
19890 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0d 0a 20  t variable */.. 
198a0 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
198b0 65 72 43 54 58 5f 53 54 4f 52 45 0d 0a 7d 0d 0a  erCTX_STORE..}..
198c0 23 65 6e 64 69 66 20 2f 2a 20 66 74 73 35 59 59  #endif /* fts5YY
198d0 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59 20  NOERRORRECOVERY 
198e0 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65  */..../*..** The
198f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
19900 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 61 20  executes when a 
19910 73 79 6e 74 61 78 20 65 72 72 6f 72 20 66 69 72  syntax error fir
19920 73 74 20 6f 63 63 75 72 73 2e 0d 0a 2a 2f 0d 0a  st occurs...*/..
19930 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
19940 79 79 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 28  yy_syntax_error(
19950 0d 0a 20 20 66 74 73 35 79 79 50 61 72 73 65 72  ..  fts5yyParser
19960 20 2a 66 74 73 35 79 79 70 50 61 72 73 65 72 2c   *fts5yypParser,
19970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19980 65 20 70 61 72 73 65 72 20 2a 2f 0d 0a 20 20 69  e parser */..  i
19990 6e 74 20 66 74 73 35 79 79 6d 61 6a 6f 72 2c 20  nt fts5yymajor, 
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199b0 20 20 2f 2a 20 54 68 65 20 6d 61 6a 6f 72 20 74    /* The major t
199c0 79 70 65 20 6f 66 20 74 68 65 20 65 72 72 6f 72  ype of the error
199d0 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 73 71 6c   token */..  sql
199e0 69 74 65 33 46 74 73 35 50 61 72 73 65 72 46 54  ite3Fts5ParserFT
199f0 53 35 54 4f 4b 45 4e 54 59 50 45 20 66 74 73 35  S5TOKENTYPE fts5
19a00 79 79 6d 69 6e 6f 72 20 20 20 20 20 20 20 20 20  yyminor         
19a10 2f 2a 20 54 68 65 20 6d 69 6e 6f 72 20 74 79 70  /* The minor typ
19a20 65 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 74  e of the error t
19a30 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 73  oken */..){..  s
19a40 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
19a50 41 52 47 5f 46 45 54 43 48 0d 0a 20 20 73 71 6c  ARG_FETCH..  sql
19a60 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54  ite3Fts5ParserCT
19a70 58 5f 46 45 54 43 48 0d 0a 23 64 65 66 69 6e 65  X_FETCH..#define
19a80 20 46 54 53 35 54 4f 4b 45 4e 20 66 74 73 35 79   FTS5TOKEN fts5y
19a90 79 6d 69 6e 6f 72 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a  yminor../*******
19aa0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 25 73 79 6e  ***** Begin %syn
19ab0 74 61 78 5f 65 72 72 6f 72 20 63 6f 64 65 20 2a  tax_error 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 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 23 6c 69 6e 65 20  *******/..#line 
19af0 33 30 20 22 66 74 73 35 70 61 72 73 65 2e 79 22  30 "fts5parse.y"
19b00 0d 0a 0d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ....  UNUSED_PAR
19b10 41 4d 28 66 74 73 35 79 79 6d 61 6a 6f 72 29 3b  AM(fts5yymajor);
19b20 20 2f 2a 20 53 69 6c 65 6e 63 65 20 61 20 63 6f   /* Silence a co
19b30 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
19b40 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  /..  sqlite3Fts5
19b50 50 61 72 73 65 45 72 72 6f 72 28 0d 0a 20 20 20  ParseError(..   
19b60 20 70 50 61 72 73 65 2c 20 22 66 74 73 35 3a 20   pParse, "fts5: 
19b70 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6e 65 61  syntax error nea
19b80 72 20 5c 22 25 2e 2a 73 5c 22 22 2c 46 54 53 35  r \"%.*s\"",FTS5
19b90 54 4f 4b 45 4e 2e 6e 2c 46 54 53 35 54 4f 4b 45  TOKEN.n,FTS5TOKE
19ba0 4e 2e 70 0d 0a 20 20 29 3b 0d 0a 23 6c 69 6e 65  N.p..  );..#line
19bb0 20 31 33 30 36 20 22 66 74 73 35 70 61 72 73 65   1306 "fts5parse
19bc0 2e 63 22 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c"../**********
19bd0 2a 2a 20 45 6e 64 20 25 73 79 6e 74 61 78 5f 65  ** End %syntax_e
19be0 72 72 6f 72 20 63 6f 64 65 20 2a 2a 2a 2a 2a 2a  rror code ******
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 2a 2a 2a  ****************
19c10 2a 2a 2a 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33  ****/..  sqlite3
19c20 46 74 73 35 50 61 72 73 65 72 41 52 47 5f 53 54  Fts5ParserARG_ST
19c30 4f 52 45 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ORE /* Suppress 
19c40 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 75 6e  warning about un
19c50 75 73 65 64 20 25 65 78 74 72 61 5f 61 72 67 75  used %extra_argu
19c60 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 2a 2f  ment variable */
19c70 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
19c80 61 72 73 65 72 43 54 58 5f 53 54 4f 52 45 0d 0a  arserCTX_STORE..
19c90 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20  }..../*..** The 
19ca0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 65 78 65  following is exe
19cb0 63 75 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  cuted when the p
19cc0 61 72 73 65 72 20 61 63 63 65 70 74 73 0d 0a 2a  arser accepts..*
19cd0 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  /..static void f
19ce0 74 73 35 79 79 5f 61 63 63 65 70 74 28 0d 0a 20  ts5yy_accept(.. 
19cf0 20 66 74 73 35 79 79 50 61 72 73 65 72 20 2a 66   fts5yyParser *f
19d00 74 73 35 79 79 70 50 61 72 73 65 72 20 20 20 20  ts5yypParser    
19d10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
19d20 72 73 65 72 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 73  rser */..){..  s
19d30 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
19d40 41 52 47 5f 46 45 54 43 48 0d 0a 20 20 73 71 6c  ARG_FETCH..  sql
19d50 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43 54  ite3Fts5ParserCT
19d60 58 5f 46 45 54 43 48 0d 0a 23 69 66 6e 64 65 66  X_FETCH..#ifndef
19d70 20 4e 44 45 42 55 47 0d 0a 20 20 69 66 28 20 66   NDEBUG..  if( f
19d80 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 20 29  ts5yyTraceFILE )
19d90 7b 0d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  {..    fprintf(f
19da0 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22  ts5yyTraceFILE,"
19db0 25 73 41 63 63 65 70 74 21 5c 6e 22 2c 66 74 73  %sAccept!\n",fts
19dc0 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74 29 3b  5yyTracePrompt);
19dd0 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 23  ..  }..#endif..#
19de0 69 66 6e 64 65 66 20 66 74 73 35 59 59 4e 4f 45  ifndef fts5YYNOE
19df0 52 52 4f 52 52 45 43 4f 56 45 52 59 0d 0a 20 20  RRORRECOVERY..  
19e00 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
19e10 74 73 35 79 79 65 72 72 63 6e 74 20 3d 20 2d 31  ts5yyerrcnt = -1
19e20 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 61 73 73  ;..#endif..  ass
19e30 65 72 74 28 20 66 74 73 35 79 79 70 50 61 72 73  ert( fts5yypPars
19e40 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 3d 3d 66  er->fts5yytos==f
19e50 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
19e60 73 35 79 79 73 74 61 63 6b 20 29 3b 0d 0a 20 20  s5yystack );..  
19e70 2f 2a 20 48 65 72 65 20 63 6f 64 65 20 69 73 20  /* Here code is 
19e80 69 6e 73 65 72 74 65 64 20 77 68 69 63 68 20 77  inserted which w
19e90 69 6c 6c 20 62 65 20 65 78 65 63 75 74 65 64 20  ill be executed 
19ea0 77 68 65 6e 65 76 65 72 20 74 68 65 0d 0a 20 20  whenever the..  
19eb0 2a 2a 20 70 61 72 73 65 72 20 61 63 63 65 70 74  ** parser accept
19ec0 73 20 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  s */../*********
19ed0 2a 2a 20 42 65 67 69 6e 20 25 70 61 72 73 65 5f  ** Begin %parse_
19ee0 61 63 63 65 70 74 20 63 6f 64 65 20 2a 2a 2a 2a  accept 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 2a 2a  ****************
19f10 2a 2a 2a 2a 2a 2f 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
19f20 2a 2a 2a 2a 20 45 6e 64 20 25 70 61 72 73 65 5f  **** End %parse_
19f30 61 63 63 65 70 74 20 63 6f 64 65 20 2a 2a 2a 2a  accept 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 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 20 20 73 71 6c 69  *******/..  sqli
19f70 74 65 33 46 74 73 35 50 61 72 73 65 72 41 52 47  te3Fts5ParserARG
19f80 5f 53 54 4f 52 45 20 2f 2a 20 53 75 70 70 72 65  _STORE /* Suppre
19f90 73 73 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  ss warning about
19fa0 20 75 6e 75 73 65 64 20 25 65 78 74 72 61 5f 61   unused %extra_a
19fb0 72 67 75 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  rgument variable
19fc0 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 46 74   */..  sqlite3Ft
19fd0 73 35 50 61 72 73 65 72 43 54 58 5f 53 54 4f 52  s5ParserCTX_STOR
19fe0 45 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 54 68 65 20 6d  E..}..../* The m
19ff0 61 69 6e 20 70 61 72 73 65 72 20 70 72 6f 67 72  ain parser progr
1a000 61 6d 2e 0d 0a 2a 2a 20 54 68 65 20 66 69 72 73  am...** The firs
1a010 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1a020 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
1a030 75 63 74 75 72 65 20 6f 62 74 61 69 6e 65 64 20  ucture obtained 
1a040 66 72 6f 6d 0d 0a 2a 2a 20 22 73 71 6c 69 74 65  from..** "sqlite
1a050 33 46 74 73 35 50 61 72 73 65 72 41 6c 6c 6f 63  3Fts5ParserAlloc
1a060 22 20 77 68 69 63 68 20 64 65 73 63 72 69 62 65  " which describe
1a070 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  s the current st
1a080 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ate of the parse
1a090 72 2e 0d 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  r...** The secon
1a0a0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
1a0b0 65 20 6d 61 6a 6f 72 20 74 6f 6b 65 6e 20 6e 75  e major token nu
1a0c0 6d 62 65 72 2e 20 20 54 68 65 20 74 68 69 72 64  mber.  The third
1a0d0 20 69 73 0d 0a 2a 2a 20 74 68 65 20 6d 69 6e 6f   is..** the mino
1a0e0 72 20 74 6f 6b 65 6e 2e 20 20 54 68 65 20 66 6f  r token.  The fo
1a0f0 75 72 74 68 20 6f 70 74 69 6f 6e 61 6c 20 61 72  urth optional ar
1a100 67 75 6d 65 6e 74 20 69 73 20 77 68 61 74 65 76  gument is whatev
1a110 65 72 20 74 68 65 0d 0a 2a 2a 20 75 73 65 72 20  er the..** user 
1a120 77 61 6e 74 73 20 28 61 6e 64 20 73 70 65 63 69  wants (and speci
1a130 66 69 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d  fied in the gram
1a140 6d 61 72 29 20 61 6e 64 20 69 73 20 61 76 61 69  mar) and is avai
1a150 6c 61 62 6c 65 20 66 6f 72 0d 0a 2a 2a 20 75 73  lable for..** us
1a160 65 20 62 79 20 74 68 65 20 61 63 74 69 6f 6e 20  e by the action 
1a170 72 6f 75 74 69 6e 65 73 2e 0d 0a 2a 2a 0d 0a 2a  routines...**..*
1a180 2a 20 49 6e 70 75 74 73 3a 0d 0a 2a 2a 20 3c 75  * Inputs:..** <u
1a190 6c 3e 0d 0a 2a 2a 20 3c 6c 69 3e 20 41 20 70 6f  l>..** <li> A po
1a1a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 72  inter to the par
1a1b0 73 65 72 20 28 61 6e 20 6f 70 61 71 75 65 20 73  ser (an opaque s
1a1c0 74 72 75 63 74 75 72 65 2e 29 0d 0a 2a 2a 20 3c  tructure.)..** <
1a1d0 6c 69 3e 20 54 68 65 20 6d 61 6a 6f 72 20 74 6f  li> The major to
1a1e0 6b 65 6e 20 6e 75 6d 62 65 72 2e 0d 0a 2a 2a 20  ken number...** 
1a1f0 3c 6c 69 3e 20 54 68 65 20 6d 69 6e 6f 72 20 74  <li> The minor t
1a200 6f 6b 65 6e 20 6e 75 6d 62 65 72 2e 0d 0a 2a 2a  oken number...**
1a210 20 3c 6c 69 3e 20 41 6e 20 6f 70 74 69 6f 6e 20   <li> An option 
1a220 61 72 67 75 6d 65 6e 74 20 6f 66 20 61 20 67 72  argument of a gr
1a230 61 6d 6d 61 72 2d 73 70 65 63 69 66 69 65 64 20  ammar-specified 
1a240 74 79 70 65 2e 0d 0a 2a 2a 20 3c 2f 75 6c 3e 0d  type...** </ul>.
1a250 0a 2a 2a 0d 0a 2a 2a 20 4f 75 74 70 75 74 73 3a  .**..** Outputs:
1a260 0d 0a 2a 2a 20 4e 6f 6e 65 2e 0d 0a 2a 2f 0d 0a  ..** None...*/..
1a270 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1a280 74 65 33 46 74 73 35 50 61 72 73 65 72 28 0d 0a  te3Fts5Parser(..
1a290 20 20 76 6f 69 64 20 2a 66 74 73 35 79 79 70 2c    void *fts5yyp,
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2b0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1a2c0 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 74 73 35 79   */..  int fts5y
1a2d0 79 6d 61 6a 6f 72 2c 20 20 20 20 20 20 20 20 20  ymajor,         
1a2e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
1a2f0 61 6a 6f 72 20 74 6f 6b 65 6e 20 63 6f 64 65 20  ajor token code 
1a300 6e 75 6d 62 65 72 20 2a 2f 0d 0a 20 20 73 71 6c  number */..  sql
1a310 69 74 65 33 46 74 73 35 50 61 72 73 65 72 46 54  ite3Fts5ParserFT
1a320 53 35 54 4f 4b 45 4e 54 59 50 45 20 66 74 73 35  S5TOKENTYPE fts5
1a330 79 79 6d 69 6e 6f 72 20 20 20 20 20 20 20 2f 2a  yyminor       /*
1a340 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   The value for t
1a350 68 65 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 73  he token */..  s
1a360 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
1a370 41 52 47 5f 50 44 45 43 4c 20 20 20 20 20 20 20  ARG_PDECL       
1a380 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
1a390 6e 61 6c 20 25 65 78 74 72 61 5f 61 72 67 75 6d  nal %extra_argum
1a3a0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  ent parameter */
1a3b0 0d 0a 29 7b 0d 0a 20 20 66 74 73 35 59 59 4d 49  ..){..  fts5YYMI
1a3c0 4e 4f 52 54 59 50 45 20 66 74 73 35 79 79 6d 69  NORTYPE fts5yymi
1a3d0 6e 6f 72 75 6e 69 6f 6e 3b 0d 0a 20 20 66 74 73  norunion;..  fts
1a3e0 35 59 59 41 43 54 49 4f 4e 54 59 50 45 20 66 74  5YYACTIONTYPE ft
1a3f0 73 35 79 79 61 63 74 3b 20 20 20 2f 2a 20 54 68  s5yyact;   /* Th
1a400 65 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e  e parser action.
1a410 20 2a 2f 0d 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
1a420 64 28 66 74 73 35 59 59 45 52 52 4f 52 53 59 4d  d(fts5YYERRORSYM
1a430 42 4f 4c 29 20 26 26 20 21 64 65 66 69 6e 65 64  BOL) && !defined
1a440 28 66 74 73 35 59 59 4e 4f 45 52 52 4f 52 52 45  (fts5YYNOERRORRE
1a450 43 4f 56 45 52 59 29 0d 0a 20 20 69 6e 74 20 66  COVERY)..  int f
1a460 74 73 35 79 79 65 6e 64 6f 66 69 6e 70 75 74 3b  ts5yyendofinput;
1a470 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1a480 77 65 20 61 72 65 20 61 74 20 74 68 65 20 65 6e  we are at the en
1a490 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0d 0a 23  d of input */..#
1a4a0 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 66 74  endif..#ifdef ft
1a4b0 73 35 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 0d  s5YYERRORSYMBOL.
1a4c0 0a 20 20 69 6e 74 20 66 74 73 35 79 79 65 72 72  .  int fts5yyerr
1a4d0 6f 72 68 69 74 20 3d 20 30 3b 20 20 20 2f 2a 20  orhit = 0;   /* 
1a4e0 54 72 75 65 20 69 66 20 66 74 73 35 79 79 6d 61  True if fts5yyma
1a4f0 6a 6f 72 20 68 61 73 20 69 6e 76 6f 6b 65 64 20  jor has invoked 
1a500 61 6e 20 65 72 72 6f 72 20 2a 2f 0d 0a 23 65 6e  an error */..#en
1a510 64 69 66 0d 0a 20 20 66 74 73 35 79 79 50 61 72  dif..  fts5yyPar
1a520 73 65 72 20 2a 66 74 73 35 79 79 70 50 61 72 73  ser *fts5yypPars
1a530 65 72 20 3d 20 28 66 74 73 35 79 79 50 61 72 73  er = (fts5yyPars
1a540 65 72 2a 29 66 74 73 35 79 79 70 3b 20 20 2f 2a  er*)fts5yyp;  /*
1a550 20 54 68 65 20 70 61 72 73 65 72 20 2a 2f 0d 0a   The parser */..
1a560 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
1a570 73 65 72 43 54 58 5f 46 45 54 43 48 0d 0a 20 20  serCTX_FETCH..  
1a580 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
1a590 72 41 52 47 5f 53 54 4f 52 45 0d 0a 0d 0a 20 20  rARG_STORE....  
1a5a0 61 73 73 65 72 74 28 20 66 74 73 35 79 79 70 50  assert( fts5yypP
1a5b0 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73  arser->fts5yytos
1a5c0 21 3d 30 20 29 3b 0d 0a 23 69 66 20 21 64 65 66  !=0 );..#if !def
1a5d0 69 6e 65 64 28 66 74 73 35 59 59 45 52 52 4f 52  ined(fts5YYERROR
1a5e0 53 59 4d 42 4f 4c 29 20 26 26 20 21 64 65 66 69  SYMBOL) && !defi
1a5f0 6e 65 64 28 66 74 73 35 59 59 4e 4f 45 52 52 4f  ned(fts5YYNOERRO
1a600 52 52 45 43 4f 56 45 52 59 29 0d 0a 20 20 66 74  RRECOVERY)..  ft
1a610 73 35 79 79 65 6e 64 6f 66 69 6e 70 75 74 20 3d  s5yyendofinput =
1a620 20 28 66 74 73 35 79 79 6d 61 6a 6f 72 3d 3d 30   (fts5yymajor==0
1a630 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20  );..#endif....  
1a640 66 74 73 35 79 79 61 63 74 20 3d 20 66 74 73 35  fts5yyact = fts5
1a650 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79  yypParser->fts5y
1a660 79 74 6f 73 2d 3e 73 74 61 74 65 6e 6f 3b 0d 0a  ytos->stateno;..
1a670 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a  #ifndef NDEBUG..
1a680 20 20 69 66 28 20 66 74 73 35 79 79 54 72 61 63    if( fts5yyTrac
1a690 65 46 49 4c 45 20 29 7b 0d 0a 20 20 20 20 69 66  eFILE ){..    if
1a6a0 28 20 66 74 73 35 79 79 61 63 74 20 3c 20 66 74  ( fts5yyact < ft
1a6b0 73 35 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45 20  s5YY_MIN_REDUCE 
1a6c0 29 7b 0d 0a 20 20 20 20 20 20 66 70 72 69 6e 74  ){..      fprint
1a6d0 66 28 66 74 73 35 79 79 54 72 61 63 65 46 49 4c  f(fts5yyTraceFIL
1a6e0 45 2c 22 25 73 49 6e 70 75 74 20 27 25 73 27 20  E,"%sInput '%s' 
1a6f0 69 6e 20 73 74 61 74 65 20 25 64 5c 6e 22 2c 0d  in state %d\n",.
1a700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
1a710 74 73 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74  ts5yyTracePrompt
1a720 2c 66 74 73 35 79 79 54 6f 6b 65 6e 4e 61 6d 65  ,fts5yyTokenName
1a730 5b 66 74 73 35 79 79 6d 61 6a 6f 72 5d 2c 66 74  [fts5yymajor],ft
1a740 73 35 79 79 61 63 74 29 3b 0d 0a 20 20 20 20 7d  s5yyact);..    }
1a750 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 66 70 72  else{..      fpr
1a760 69 6e 74 66 28 66 74 73 35 79 79 54 72 61 63 65  intf(fts5yyTrace
1a770 46 49 4c 45 2c 22 25 73 49 6e 70 75 74 20 27 25  FILE,"%sInput '%
1a780 73 27 20 77 69 74 68 20 70 65 6e 64 69 6e 67 20  s' with pending 
1a790 72 65 64 75 63 65 20 25 64 5c 6e 22 2c 0d 0a 20  reduce %d\n",.. 
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
1a7b0 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74 2c 66  5yyTracePrompt,f
1a7c0 74 73 35 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 66  ts5yyTokenName[f
1a7d0 74 73 35 79 79 6d 61 6a 6f 72 5d 2c 66 74 73 35  ts5yymajor],fts5
1a7e0 79 79 61 63 74 2d 66 74 73 35 59 59 5f 4d 49 4e  yyact-fts5YY_MIN
1a7f0 5f 52 45 44 55 43 45 29 3b 0d 0a 20 20 20 20 7d  _REDUCE);..    }
1a800 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d  ..  }..#endif...
1a810 0a 20 20 64 6f 7b 0d 0a 20 20 20 20 61 73 73 65  .  do{..    asse
1a820 72 74 28 20 66 74 73 35 79 79 61 63 74 3d 3d 66  rt( fts5yyact==f
1a830 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
1a840 73 35 79 79 74 6f 73 2d 3e 73 74 61 74 65 6e 6f  s5yytos->stateno
1a850 20 29 3b 0d 0a 20 20 20 20 66 74 73 35 79 79 61   );..    fts5yya
1a860 63 74 20 3d 20 66 74 73 35 79 79 5f 66 69 6e 64  ct = fts5yy_find
1a870 5f 73 68 69 66 74 5f 61 63 74 69 6f 6e 28 28 66  _shift_action((f
1a880 74 73 35 59 59 43 4f 44 45 54 59 50 45 29 66 74  ts5YYCODETYPE)ft
1a890 73 35 79 79 6d 61 6a 6f 72 2c 66 74 73 35 79 79  s5yymajor,fts5yy
1a8a0 61 63 74 29 3b 0d 0a 20 20 20 20 69 66 28 20 66  act);..    if( f
1a8b0 74 73 35 79 79 61 63 74 20 3e 3d 20 66 74 73 35  ts5yyact >= fts5
1a8c0 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45 20 29 7b  YY_MIN_REDUCE ){
1a8d0 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79 61 63  ..      fts5yyac
1a8e0 74 20 3d 20 66 74 73 35 79 79 5f 72 65 64 75 63  t = fts5yy_reduc
1a8f0 65 28 66 74 73 35 79 79 70 50 61 72 73 65 72 2c  e(fts5yypParser,
1a900 66 74 73 35 79 79 61 63 74 2d 66 74 73 35 59 59  fts5yyact-fts5YY
1a910 5f 4d 49 4e 5f 52 45 44 55 43 45 2c 66 74 73 35  _MIN_REDUCE,fts5
1a920 79 79 6d 61 6a 6f 72 2c 0d 0a 20 20 20 20 20 20  yymajor,..      
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 66 74 73 35 79 79 6d 69 6e 6f 72 20 73 71    fts5yyminor sq
1a950 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 43  lite3Fts5ParserC
1a960 54 58 5f 50 41 52 41 4d 29 3b 0d 0a 20 20 20 20  TX_PARAM);..    
1a970 7d 65 6c 73 65 20 69 66 28 20 66 74 73 35 79 79  }else if( fts5yy
1a980 61 63 74 20 3c 3d 20 66 74 73 35 59 59 5f 4d 41  act <= fts5YY_MA
1a990 58 5f 53 48 49 46 54 52 45 44 55 43 45 20 29 7b  X_SHIFTREDUCE ){
1a9a0 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79 5f 73  ..      fts5yy_s
1a9b0 68 69 66 74 28 66 74 73 35 79 79 70 50 61 72 73  hift(fts5yypPars
1a9c0 65 72 2c 66 74 73 35 79 79 61 63 74 2c 28 66 74  er,fts5yyact,(ft
1a9d0 73 35 59 59 43 4f 44 45 54 59 50 45 29 66 74 73  s5YYCODETYPE)fts
1a9e0 35 79 79 6d 61 6a 6f 72 2c 66 74 73 35 79 79 6d  5yymajor,fts5yym
1a9f0 69 6e 6f 72 29 3b 0d 0a 23 69 66 6e 64 65 66 20  inor);..#ifndef 
1aa00 66 74 73 35 59 59 4e 4f 45 52 52 4f 52 52 45 43  fts5YYNOERRORREC
1aa10 4f 56 45 52 59 0d 0a 20 20 20 20 20 20 66 74 73  OVERY..      fts
1aa20 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
1aa30 79 79 65 72 72 63 6e 74 2d 2d 3b 0d 0a 23 65 6e  yyerrcnt--;..#en
1aa40 64 69 66 0d 0a 20 20 20 20 20 20 62 72 65 61 6b  dif..      break
1aa50 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ;..    }else if(
1aa60 20 66 74 73 35 79 79 61 63 74 3d 3d 66 74 73 35   fts5yyact==fts5
1aa70 59 59 5f 41 43 43 45 50 54 5f 41 43 54 49 4f 4e  YY_ACCEPT_ACTION
1aa80 20 29 7b 0d 0a 20 20 20 20 20 20 66 74 73 35 79   ){..      fts5y
1aa90 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
1aaa0 74 6f 73 2d 2d 3b 0d 0a 20 20 20 20 20 20 66 74  tos--;..      ft
1aab0 73 35 79 79 5f 61 63 63 65 70 74 28 66 74 73 35  s5yy_accept(fts5
1aac0 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 20 20 20  yypParser);..   
1aad0 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20     return;..    
1aae0 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61 73  }else{..      as
1aaf0 73 65 72 74 28 20 66 74 73 35 79 79 61 63 74 20  sert( fts5yyact 
1ab00 3d 3d 20 66 74 73 35 59 59 5f 45 52 52 4f 52 5f  == fts5YY_ERROR_
1ab10 41 43 54 49 4f 4e 20 29 3b 0d 0a 20 20 20 20 20  ACTION );..     
1ab20 20 66 74 73 35 79 79 6d 69 6e 6f 72 75 6e 69 6f   fts5yyminorunio
1ab30 6e 2e 66 74 73 35 79 79 30 20 3d 20 66 74 73 35  n.fts5yy0 = fts5
1ab40 79 79 6d 69 6e 6f 72 3b 0d 0a 23 69 66 64 65 66  yyminor;..#ifdef
1ab50 20 66 74 73 35 59 59 45 52 52 4f 52 53 59 4d 42   fts5YYERRORSYMB
1ab60 4f 4c 0d 0a 20 20 20 20 20 20 69 6e 74 20 66 74  OL..      int ft
1ab70 73 35 79 79 6d 78 3b 0d 0a 23 65 6e 64 69 66 0d  s5yymx;..#endif.
1ab80 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d  .#ifndef NDEBUG.
1ab90 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 79  .      if( fts5y
1aba0 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20  yTraceFILE ){.. 
1abb0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
1abc0 74 73 35 79 79 54 72 61 63 65 46 49 4c 45 2c 22  ts5yyTraceFILE,"
1abd0 25 73 53 79 6e 74 61 78 20 45 72 72 6f 72 21 5c  %sSyntax Error!\
1abe0 6e 22 2c 66 74 73 35 79 79 54 72 61 63 65 50 72  n",fts5yyTracePr
1abf0 6f 6d 70 74 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  ompt);..      }.
1ac00 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1ac10 66 74 73 35 59 59 45 52 52 4f 52 53 59 4d 42 4f  fts5YYERRORSYMBO
1ac20 4c 0d 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 79  L..      /* A sy
1ac30 6e 74 61 78 20 65 72 72 6f 72 20 68 61 73 20 6f  ntax error has o
1ac40 63 63 75 72 72 65 64 2e 0d 0a 20 20 20 20 20 20  ccurred...      
1ac50 2a 2a 20 54 68 65 20 72 65 73 70 6f 6e 73 65 20  ** The response 
1ac60 74 6f 20 61 6e 20 65 72 72 6f 72 20 64 65 70 65  to an error depe
1ac70 6e 64 73 20 75 70 6f 6e 20 77 68 65 74 68 65 72  nds upon whether
1ac80 20 6f 72 20 6e 6f 74 20 74 68 65 0d 0a 20 20 20   or not the..   
1ac90 20 20 20 2a 2a 20 67 72 61 6d 6d 61 72 20 64 65     ** grammar de
1aca0 66 69 6e 65 73 20 61 6e 20 65 72 72 6f 72 20 74  fines an error t
1acb0 6f 6b 65 6e 20 22 45 52 52 4f 52 22 2e 20 20 0d  oken "ERROR".  .
1acc0 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20  .      **..     
1acd0 20 2a 2a 20 54 68 69 73 20 69 73 20 77 68 61 74   ** This is what
1ace0 20 77 65 20 64 6f 20 69 66 20 74 68 65 20 67 72   we do if the gr
1acf0 61 6d 6d 61 72 20 64 6f 65 73 20 64 65 66 69 6e  ammar does defin
1ad00 65 20 45 52 52 4f 52 3a 0d 0a 20 20 20 20 20 20  e ERROR:..      
1ad10 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 20 2a 20  **..      **  * 
1ad20 43 61 6c 6c 20 74 68 65 20 25 73 79 6e 74 61 78  Call the %syntax
1ad30 5f 65 72 72 6f 72 20 66 75 6e 63 74 69 6f 6e 2e  _error function.
1ad40 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20  ..      **..    
1ad50 20 20 2a 2a 20 20 2a 20 42 65 67 69 6e 20 70 6f    **  * Begin po
1ad60 70 70 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20  pping the stack 
1ad70 75 6e 74 69 6c 20 77 65 20 65 6e 74 65 72 20 61  until we enter a
1ad80 20 73 74 61 74 65 20 77 68 65 72 65 0d 0a 20 20   state where..  
1ad90 20 20 20 20 2a 2a 20 20 20 20 69 74 20 69 73 20      **    it is 
1ada0 6c 65 67 61 6c 20 74 6f 20 73 68 69 66 74 20 74  legal to shift t
1adb0 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 2c  he error symbol,
1adc0 20 74 68 65 6e 20 73 68 69 66 74 0d 0a 20 20 20   then shift..   
1add0 20 20 20 2a 2a 20 20 20 20 74 68 65 20 65 72 72     **    the err
1ade0 6f 72 20 73 79 6d 62 6f 6c 2e 0d 0a 20 20 20 20  or symbol...    
1adf0 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 20    **..      **  
1ae00 2a 20 53 65 74 20 74 68 65 20 65 72 72 6f 72 20  * Set the error 
1ae10 63 6f 75 6e 74 20 74 6f 20 74 68 72 65 65 2e 0d  count to three..
1ae20 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20  .      **..     
1ae30 20 2a 2a 20 20 2a 20 42 65 67 69 6e 20 61 63 63   **  * Begin acc
1ae40 65 70 74 69 6e 67 20 61 6e 64 20 73 68 69 66 74  epting and shift
1ae50 69 6e 67 20 6e 65 77 20 74 6f 6b 65 6e 73 2e 20  ing new tokens. 
1ae60 20 4e 6f 20 6e 65 77 20 65 72 72 6f 72 0d 0a 20   No new error.. 
1ae70 20 20 20 20 20 2a 2a 20 20 20 20 70 72 6f 63 65       **    proce
1ae80 73 73 69 6e 67 20 77 69 6c 6c 20 6f 63 63 75 72  ssing will occur
1ae90 20 75 6e 74 69 6c 20 74 68 72 65 65 20 74 6f 6b   until three tok
1aea0 65 6e 73 20 68 61 76 65 20 62 65 65 6e 0d 0a 20  ens have been.. 
1aeb0 20 20 20 20 20 2a 2a 20 20 20 20 73 68 69 66 74       **    shift
1aec0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
1aed0 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20 20 20 20  ..      **..    
1aee0 20 20 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 20    */..      if( 
1aef0 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66  fts5yypParser->f
1af00 74 73 35 79 79 65 72 72 63 6e 74 3c 30 20 29 7b  ts5yyerrcnt<0 ){
1af10 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35 79 79  ..        fts5yy
1af20 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 28 66 74  _syntax_error(ft
1af30 73 35 79 79 70 50 61 72 73 65 72 2c 66 74 73 35  s5yypParser,fts5
1af40 79 79 6d 61 6a 6f 72 2c 66 74 73 35 79 79 6d 69  yymajor,fts5yymi
1af50 6e 6f 72 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  nor);..      }..
1af60 20 20 20 20 20 20 66 74 73 35 79 79 6d 78 20 3d        fts5yymx =
1af70 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
1af80 66 74 73 35 79 79 74 6f 73 2d 3e 6d 61 6a 6f 72  fts5yytos->major
1af90 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  ;..      if( fts
1afa0 35 79 79 6d 78 3d 3d 66 74 73 35 59 59 45 52 52  5yymx==fts5YYERR
1afb0 4f 52 53 59 4d 42 4f 4c 20 7c 7c 20 66 74 73 35  ORSYMBOL || fts5
1afc0 79 79 65 72 72 6f 72 68 69 74 20 29 7b 0d 0a 23  yyerrorhit ){..#
1afd0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a 20  ifndef NDEBUG.. 
1afe0 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 79         if( fts5y
1aff0 79 54 72 61 63 65 46 49 4c 45 20 29 7b 0d 0a 20  yTraceFILE ){.. 
1b000 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
1b010 28 66 74 73 35 79 79 54 72 61 63 65 46 49 4c 45  (fts5yyTraceFILE
1b020 2c 22 25 73 44 69 73 63 61 72 64 20 69 6e 70 75  ,"%sDiscard inpu
1b030 74 20 74 6f 6b 65 6e 20 25 73 5c 6e 22 2c 0d 0a  t token %s\n",..
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
1b050 35 79 79 54 72 61 63 65 50 72 6f 6d 70 74 2c 66  5yyTracePrompt,f
1b060 74 73 35 79 79 54 6f 6b 65 6e 4e 61 6d 65 5b 66  ts5yyTokenName[f
1b070 74 73 35 79 79 6d 61 6a 6f 72 5d 29 3b 0d 0a 20  ts5yymajor]);.. 
1b080 20 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66         }..#endif
1b090 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35 79 79  ..        fts5yy
1b0a0 5f 64 65 73 74 72 75 63 74 6f 72 28 66 74 73 35  _destructor(fts5
1b0b0 79 79 70 50 61 72 73 65 72 2c 20 28 66 74 73 35  yypParser, (fts5
1b0c0 59 59 43 4f 44 45 54 59 50 45 29 66 74 73 35 79  YYCODETYPE)fts5y
1b0d0 79 6d 61 6a 6f 72 2c 20 26 66 74 73 35 79 79 6d  ymajor, &fts5yym
1b0e0 69 6e 6f 72 75 6e 69 6f 6e 29 3b 0d 0a 20 20 20  inorunion);..   
1b0f0 20 20 20 20 20 66 74 73 35 79 79 6d 61 6a 6f 72       fts5yymajor
1b100 20 3d 20 66 74 73 35 59 59 4e 4f 43 4f 44 45 3b   = fts5YYNOCODE;
1b110 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a  ..      }else{..
1b120 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 66          while( f
1b130 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74  ts5yypParser->ft
1b140 73 35 79 79 74 6f 73 20 3e 3d 20 66 74 73 35 79  s5yytos >= fts5y
1b150 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
1b160 73 74 61 63 6b 0d 0a 20 20 20 20 20 20 20 20 20  stack..         
1b170 20 20 20 26 26 20 28 66 74 73 35 79 79 61 63 74     && (fts5yyact
1b180 20 3d 20 66 74 73 35 79 79 5f 66 69 6e 64 5f 72   = fts5yy_find_r
1b190 65 64 75 63 65 5f 61 63 74 69 6f 6e 28 0d 0a 20  educe_action(.. 
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1b0 20 20 20 20 20 20 20 66 74 73 35 79 79 70 50 61         fts5yypPa
1b1c0 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 2d  rser->fts5yytos-
1b1d0 3e 73 74 61 74 65 6e 6f 2c 0d 0a 20 20 20 20 20  >stateno,..     
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1f0 20 20 20 66 74 73 35 59 59 45 52 52 4f 52 53 59     fts5YYERRORSY
1b200 4d 42 4f 4c 29 29 20 3e 20 66 74 73 35 59 59 5f  MBOL)) > fts5YY_
1b210 4d 41 58 5f 53 48 49 46 54 52 45 44 55 43 45 0d  MAX_SHIFTREDUCE.
1b220 0a 20 20 20 20 20 20 20 20 29 7b 0d 0a 20 20 20  .        ){..   
1b230 20 20 20 20 20 20 20 66 74 73 35 79 79 5f 70 6f         fts5yy_po
1b240 70 5f 70 61 72 73 65 72 5f 73 74 61 63 6b 28 66  p_parser_stack(f
1b250 74 73 35 79 79 70 50 61 72 73 65 72 29 3b 0d 0a  ts5yypParser);..
1b260 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1b270 20 20 20 69 66 28 20 66 74 73 35 79 79 70 50 61     if( fts5yypPa
1b280 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73 20  rser->fts5yytos 
1b290 3c 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d  < fts5yypParser-
1b2a0 3e 66 74 73 35 79 79 73 74 61 63 6b 20 7c 7c 20  >fts5yystack || 
1b2b0 66 74 73 35 79 79 6d 61 6a 6f 72 3d 3d 30 20 29  fts5yymajor==0 )
1b2c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  {..          fts
1b2d0 35 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28 66  5yy_destructor(f
1b2e0 74 73 35 79 79 70 50 61 72 73 65 72 2c 28 66 74  ts5yypParser,(ft
1b2f0 73 35 59 59 43 4f 44 45 54 59 50 45 29 66 74 73  s5YYCODETYPE)fts
1b300 35 79 79 6d 61 6a 6f 72 2c 26 66 74 73 35 79 79  5yymajor,&fts5yy
1b310 6d 69 6e 6f 72 75 6e 69 6f 6e 29 3b 0d 0a 20 20  minorunion);..  
1b320 20 20 20 20 20 20 20 20 66 74 73 35 79 79 5f 70          fts5yy_p
1b330 61 72 73 65 5f 66 61 69 6c 65 64 28 66 74 73 35  arse_failed(fts5
1b340 79 79 70 50 61 72 73 65 72 29 3b 0d 0a 23 69 66  yypParser);..#if
1b350 6e 64 65 66 20 66 74 73 35 59 59 4e 4f 45 52 52  ndef fts5YYNOERR
1b360 4f 52 52 45 43 4f 56 45 52 59 0d 0a 20 20 20 20  ORRECOVERY..    
1b370 20 20 20 20 20 20 66 74 73 35 79 79 70 50 61 72        fts5yypPar
1b380 73 65 72 2d 3e 66 74 73 35 79 79 65 72 72 63 6e  ser->fts5yyerrcn
1b390 74 20 3d 20 2d 31 3b 0d 0a 23 65 6e 64 69 66 0d  t = -1;..#endif.
1b3a0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 79  .          fts5y
1b3b0 79 6d 61 6a 6f 72 20 3d 20 66 74 73 35 59 59 4e  ymajor = fts5YYN
1b3c0 4f 43 4f 44 45 3b 0d 0a 20 20 20 20 20 20 20 20  OCODE;..        
1b3d0 7d 65 6c 73 65 20 69 66 28 20 66 74 73 35 79 79  }else if( fts5yy
1b3e0 6d 78 21 3d 66 74 73 35 59 59 45 52 52 4f 52 53  mx!=fts5YYERRORS
1b3f0 59 4d 42 4f 4c 20 29 7b 0d 0a 20 20 20 20 20 20  YMBOL ){..      
1b400 20 20 20 20 66 74 73 35 79 79 5f 73 68 69 66 74      fts5yy_shift
1b410 28 66 74 73 35 79 79 70 50 61 72 73 65 72 2c 66  (fts5yypParser,f
1b420 74 73 35 79 79 61 63 74 2c 66 74 73 35 59 59 45  ts5yyact,fts5YYE
1b430 52 52 4f 52 53 59 4d 42 4f 4c 2c 66 74 73 35 79  RRORSYMBOL,fts5y
1b440 79 6d 69 6e 6f 72 29 3b 0d 0a 20 20 20 20 20 20  yminor);..      
1b450 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1b460 20 20 20 20 66 74 73 35 79 79 70 50 61 72 73 65      fts5yypParse
1b470 72 2d 3e 66 74 73 35 79 79 65 72 72 63 6e 74 20  r->fts5yyerrcnt 
1b480 3d 20 33 3b 0d 0a 20 20 20 20 20 20 66 74 73 35  = 3;..      fts5
1b490 79 79 65 72 72 6f 72 68 69 74 20 3d 20 31 3b 0d  yyerrorhit = 1;.
1b4a0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 79  .      if( fts5y
1b4b0 79 6d 61 6a 6f 72 3d 3d 66 74 73 35 59 59 4e 4f  ymajor==fts5YYNO
1b4c0 43 4f 44 45 20 29 20 62 72 65 61 6b 3b 0d 0a 20  CODE ) break;.. 
1b4d0 20 20 20 20 20 66 74 73 35 79 79 61 63 74 20 3d       fts5yyact =
1b4e0 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
1b4f0 66 74 73 35 79 79 74 6f 73 2d 3e 73 74 61 74 65  fts5yytos->state
1b500 6e 6f 3b 0d 0a 23 65 6c 69 66 20 64 65 66 69 6e  no;..#elif defin
1b510 65 64 28 66 74 73 35 59 59 4e 4f 45 52 52 4f 52  ed(fts5YYNOERROR
1b520 52 45 43 4f 56 45 52 59 29 0d 0a 20 20 20 20 20  RECOVERY)..     
1b530 20 2f 2a 20 49 66 20 74 68 65 20 66 74 73 35 59   /* If the fts5Y
1b540 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59  YNOERRORRECOVERY
1b550 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
1b560 64 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 61  d, then do not a
1b570 74 74 65 6d 70 74 20 74 6f 0d 0a 20 20 20 20 20  ttempt to..     
1b580 20 2a 2a 20 64 6f 20 61 6e 79 20 6b 69 6e 64 20   ** do any kind 
1b590 6f 66 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72  of error recover
1b5a0 79 2e 20 20 49 6e 73 74 65 61 64 2c 20 73 69 6d  y.  Instead, sim
1b5b0 70 6c 79 20 69 6e 76 6f 6b 65 20 74 68 65 20 73  ply invoke the s
1b5c0 79 6e 74 61 78 0d 0a 20 20 20 20 20 20 2a 2a 20  yntax..      ** 
1b5d0 65 72 72 6f 72 20 72 6f 75 74 69 6e 65 20 61 6e  error routine an
1b5e0 64 20 63 6f 6e 74 69 6e 75 65 20 67 6f 69 6e 67  d continue going
1b5f0 20 61 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 68   as if nothing h
1b600 61 64 20 68 61 70 70 65 6e 65 64 2e 0d 0a 20 20  ad happened...  
1b610 20 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a      **..      **
1b620 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 63 61   Applications ca
1b630 6e 20 73 65 74 20 74 68 69 73 20 6d 61 63 72 6f  n set this macro
1b640 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e   (for example in
1b650 73 69 64 65 20 25 69 6e 63 6c 75 64 65 29 20 69  side %include) i
1b660 66 0d 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 79  f..      ** they
1b670 20 69 6e 74 65 6e 64 20 74 6f 20 61 62 61 6e 64   intend to aband
1b680 6f 6e 20 74 68 65 20 70 61 72 73 65 20 75 70 6f  on the parse upo
1b690 6e 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 74  n the first synt
1b6a0 61 78 20 65 72 72 6f 72 20 73 65 65 6e 2e 0d 0a  ax error seen...
1b6b0 20 20 20 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20        */..      
1b6c0 66 74 73 35 79 79 5f 73 79 6e 74 61 78 5f 65 72  fts5yy_syntax_er
1b6d0 72 6f 72 28 66 74 73 35 79 79 70 50 61 72 73 65  ror(fts5yypParse
1b6e0 72 2c 66 74 73 35 79 79 6d 61 6a 6f 72 2c 20 66  r,fts5yymajor, f
1b6f0 74 73 35 79 79 6d 69 6e 6f 72 29 3b 0d 0a 20 20  ts5yyminor);..  
1b700 20 20 20 20 66 74 73 35 79 79 5f 64 65 73 74 72      fts5yy_destr
1b710 75 63 74 6f 72 28 66 74 73 35 79 79 70 50 61 72  uctor(fts5yypPar
1b720 73 65 72 2c 28 66 74 73 35 59 59 43 4f 44 45 54  ser,(fts5YYCODET
1b730 59 50 45 29 66 74 73 35 79 79 6d 61 6a 6f 72 2c  YPE)fts5yymajor,
1b740 26 66 74 73 35 79 79 6d 69 6e 6f 72 75 6e 69 6f  &fts5yyminorunio
1b750 6e 29 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b  n);..      break
1b760 3b 0d 0a 23 65 6c 73 65 20 20 2f 2a 20 66 74 73  ;..#else  /* fts
1b770 35 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 69  5YYERRORSYMBOL i
1b780 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f  s not defined */
1b790 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
1b7a0 69 73 20 77 68 61 74 20 77 65 20 64 6f 20 69 66  is what we do if
1b7b0 20 74 68 65 20 67 72 61 6d 6d 61 72 20 64 6f 65   the grammar doe
1b7c0 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 45 52 52  s not define ERR
1b7d0 4f 52 3a 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20  OR:..      **.. 
1b7e0 20 20 20 20 20 2a 2a 20 20 2a 20 52 65 70 6f 72       **  * Repor
1b7f0 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
1b800 67 65 2c 20 61 6e 64 20 74 68 72 6f 77 20 61 77  ge, and throw aw
1b810 61 79 20 74 68 65 20 69 6e 70 75 74 20 74 6f 6b  ay the input tok
1b820 65 6e 2e 0d 0a 20 20 20 20 20 20 2a 2a 0d 0a 20  en...      **.. 
1b830 20 20 20 20 20 2a 2a 20 20 2a 20 49 66 20 74 68       **  * If th
1b840 65 20 69 6e 70 75 74 20 74 6f 6b 65 6e 20 69 73  e input token is
1b850 20 24 2c 20 74 68 65 6e 20 66 61 69 6c 20 74 68   $, then fail th
1b860 65 20 70 61 72 73 65 2e 0d 0a 20 20 20 20 20 20  e parse...      
1b870 2a 2a 0d 0a 20 20 20 20 20 20 2a 2a 20 41 73 20  **..      ** As 
1b880 62 65 66 6f 72 65 2c 20 73 75 62 73 65 71 75 65  before, subseque
1b890 6e 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nt error message
1b8a0 73 20 61 72 65 20 73 75 70 70 72 65 73 73 65 64  s are suppressed
1b8b0 20 75 6e 74 69 6c 0d 0a 20 20 20 20 20 20 2a 2a   until..      **
1b8c0 20 74 68 72 65 65 20 69 6e 70 75 74 20 74 6f 6b   three input tok
1b8d0 65 6e 73 20 68 61 76 65 20 62 65 65 6e 20 73 75  ens have been su
1b8e0 63 63 65 73 73 66 75 6c 6c 79 20 73 68 69 66 74  ccessfully shift
1b8f0 65 64 2e 0d 0a 20 20 20 20 20 20 2a 2f 0d 0a 20  ed...      */.. 
1b900 20 20 20 20 20 69 66 28 20 66 74 73 35 79 79 70       if( fts5yyp
1b910 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 65 72  Parser->fts5yyer
1b920 72 63 6e 74 3c 3d 30 20 29 7b 0d 0a 20 20 20 20  rcnt<=0 ){..    
1b930 20 20 20 20 66 74 73 35 79 79 5f 73 79 6e 74 61      fts5yy_synta
1b940 78 5f 65 72 72 6f 72 28 66 74 73 35 79 79 70 50  x_error(fts5yypP
1b950 61 72 73 65 72 2c 66 74 73 35 79 79 6d 61 6a 6f  arser,fts5yymajo
1b960 72 2c 20 66 74 73 35 79 79 6d 69 6e 6f 72 29 3b  r, fts5yyminor);
1b970 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
1b980 20 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e   fts5yypParser->
1b990 66 74 73 35 79 79 65 72 72 63 6e 74 20 3d 20 33  fts5yyerrcnt = 3
1b9a0 3b 0d 0a 20 20 20 20 20 20 66 74 73 35 79 79 5f  ;..      fts5yy_
1b9b0 64 65 73 74 72 75 63 74 6f 72 28 66 74 73 35 79  destructor(fts5y
1b9c0 79 70 50 61 72 73 65 72 2c 28 66 74 73 35 59 59  ypParser,(fts5YY
1b9d0 43 4f 44 45 54 59 50 45 29 66 74 73 35 79 79 6d  CODETYPE)fts5yym
1b9e0 61 6a 6f 72 2c 26 66 74 73 35 79 79 6d 69 6e 6f  ajor,&fts5yymino
1b9f0 72 75 6e 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20  runion);..      
1ba00 69 66 28 20 66 74 73 35 79 79 65 6e 64 6f 66 69  if( fts5yyendofi
1ba10 6e 70 75 74 20 29 7b 0d 0a 20 20 20 20 20 20 20  nput ){..       
1ba20 20 66 74 73 35 79 79 5f 70 61 72 73 65 5f 66 61   fts5yy_parse_fa
1ba30 69 6c 65 64 28 66 74 73 35 79 79 70 50 61 72 73  iled(fts5yypPars
1ba40 65 72 29 3b 0d 0a 23 69 66 6e 64 65 66 20 66 74  er);..#ifndef ft
1ba50 73 35 59 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56  s5YYNOERRORRECOV
1ba60 45 52 59 0d 0a 20 20 20 20 20 20 20 20 66 74 73  ERY..        fts
1ba70 35 79 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35  5yypParser->fts5
1ba80 79 79 65 72 72 63 6e 74 20 3d 20 2d 31 3b 0d 0a  yyerrcnt = -1;..
1ba90 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 7d 0d  #endif..      }.
1baa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 23  .      break;..#
1bab0 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 20 20  endif..    }..  
1bac0 7d 77 68 69 6c 65 28 20 66 74 73 35 79 79 70 50  }while( fts5yypP
1bad0 61 72 73 65 72 2d 3e 66 74 73 35 79 79 74 6f 73  arser->fts5yytos
1bae0 3e 66 74 73 35 79 79 70 50 61 72 73 65 72 2d 3e  >fts5yypParser->
1baf0 66 74 73 35 79 79 73 74 61 63 6b 20 29 3b 0d 0a  fts5yystack );..
1bb00 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a  #ifndef NDEBUG..
1bb10 20 20 69 66 28 20 66 74 73 35 79 79 54 72 61 63    if( fts5yyTrac
1bb20 65 46 49 4c 45 20 29 7b 0d 0a 20 20 20 20 66 74  eFILE ){..    ft
1bb30 73 35 79 79 53 74 61 63 6b 45 6e 74 72 79 20 2a  s5yyStackEntry *
1bb40 69 3b 0d 0a 20 20 20 20 63 68 61 72 20 63 44 69  i;..    char cDi
1bb50 76 20 3d 20 27 5b 27 3b 0d 0a 20 20 20 20 66 70  v = '[';..    fp
1bb60 72 69 6e 74 66 28 66 74 73 35 79 79 54 72 61 63  rintf(fts5yyTrac
1bb70 65 46 49 4c 45 2c 22 25 73 52 65 74 75 72 6e 2e  eFILE,"%sReturn.
1bb80 20 53 74 61 63 6b 3d 22 2c 66 74 73 35 79 79 54   Stack=",fts5yyT
1bb90 72 61 63 65 50 72 6f 6d 70 74 29 3b 0d 0a 20 20  racePrompt);..  
1bba0 20 20 66 6f 72 28 69 3d 26 66 74 73 35 79 79 70    for(i=&fts5yyp
1bbb0 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79 73 74  Parser->fts5yyst
1bbc0 61 63 6b 5b 31 5d 3b 20 69 3c 3d 66 74 73 35 79  ack[1]; i<=fts5y
1bbd0 79 70 50 61 72 73 65 72 2d 3e 66 74 73 35 79 79  ypParser->fts5yy
1bbe0 74 6f 73 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20  tos; i++){..    
1bbf0 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79 79    fprintf(fts5yy
1bc00 54 72 61 63 65 46 49 4c 45 2c 22 25 63 25 73 22  TraceFILE,"%c%s"
1bc10 2c 20 63 44 69 76 2c 20 66 74 73 35 79 79 54 6f  , cDiv, fts5yyTo
1bc20 6b 65 6e 4e 61 6d 65 5b 69 2d 3e 6d 61 6a 6f 72  kenName[i->major
1bc30 5d 29 3b 0d 0a 20 20 20 20 20 20 63 44 69 76 20  ]);..      cDiv 
1bc40 3d 20 27 20 27 3b 0d 0a 20 20 20 20 7d 0d 0a 20  = ' ';..    }.. 
1bc50 20 20 20 66 70 72 69 6e 74 66 28 66 74 73 35 79     fprintf(fts5y
1bc60 79 54 72 61 63 65 46 49 4c 45 2c 22 5d 5c 6e 22  yTraceFILE,"]\n"
1bc70 29 3b 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d  );..  }..#endif.
1bc80 0a 20 20 72 65 74 75 72 6e 3b 0d 0a 7d 0d 0a 0d  .  return;..}...
1bc90 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ./*..** Return t
1bca0 68 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  he fallback toke
1bcb0 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  n corresponding 
1bcc0 74 6f 20 63 61 6e 6f 6e 69 63 61 6c 20 74 6f 6b  to canonical tok
1bcd0 65 6e 20 69 54 6f 6b 65 6e 2c 20 6f 72 0d 0a 2a  en iToken, or..*
1bce0 2a 20 30 20 69 66 20 69 54 6f 6b 65 6e 20 68 61  * 0 if iToken ha
1bcf0 73 20 6e 6f 20 66 61 6c 6c 62 61 63 6b 2e 0d 0a  s no fallback...
1bd00 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
1bd10 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
1bd20 46 61 6c 6c 62 61 63 6b 28 69 6e 74 20 69 54 6f  Fallback(int iTo
1bd30 6b 65 6e 29 7b 0d 0a 23 69 66 64 65 66 20 66 74  ken){..#ifdef ft
1bd40 73 35 59 59 46 41 4c 4c 42 41 43 4b 0d 0a 20 20  s5YYFALLBACK..  
1bd50 69 66 28 20 69 54 6f 6b 65 6e 3c 28 69 6e 74 29  if( iToken<(int)
1bd60 28 73 69 7a 65 6f 66 28 66 74 73 35 79 79 46 61  (sizeof(fts5yyFa
1bd70 6c 6c 62 61 63 6b 29 2f 73 69 7a 65 6f 66 28 66  llback)/sizeof(f
1bd80 74 73 35 79 79 46 61 6c 6c 62 61 63 6b 5b 30 5d  ts5yyFallback[0]
1bd90 29 29 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72  )) ){..    retur
1bda0 6e 20 66 74 73 35 79 79 46 61 6c 6c 62 61 63 6b  n fts5yyFallback
1bdb0 5b 69 54 6f 6b 65 6e 5d 3b 0d 0a 20 20 7d 0d 0a  [iToken];..  }..
1bdc0 23 65 6c 73 65 0d 0a 20 20 28 76 6f 69 64 29 69  #else..  (void)i
1bdd0 54 6f 6b 65 6e 3b 0d 0a 23 65 6e 64 69 66 0d 0a  Token;..#endif..
1bde0 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a    return 0;..}..
1bdf0 0d 0a 23 6c 69 6e 65 20 31 20 22 66 74 73 35 5f  ..#line 1 "fts5_
1be00 61 75 78 2e 63 22 0d 0a 2f 2a 0d 0a 2a 2a 20 32  aux.c"../*..** 2
1be10 30 31 34 20 4d 61 79 20 33 31 0d 0a 2a 2a 0d 0a  014 May 31..**..
1be20 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  ** The author di
1be30 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
1be40 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
1be50 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
1be60 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20   of..** a legal 
1be70 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
1be80 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d  a blessing:..**.
1be90 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64  .**    May you d
1bea0 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65  o good and not e
1beb0 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20  vil...**    May 
1bec0 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
1bed0 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
1bee0 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
1bef0 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79  hers...**    May
1bf00 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
1bf10 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
1bf20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
1bf30 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a  ve...**..*******
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 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2f 0d 0a 0d 0a 0d  *******..*/.....
1bf90 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 22 66 74  ./* #include "ft
1bfa0 73 35 49 6e 74 2e 68 22 20 2a 2f 0d 0a 23 69 6e  s5Int.h" */..#in
1bfb0 63 6c 75 64 65 20 3c 6d 61 74 68 2e 68 3e 20 20  clude <math.h>  
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bfd0 2a 20 61 6d 61 6c 67 61 6d 61 74 6f 72 3a 20 6b  * amalgamator: k
1bfe0 65 65 70 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  eep */..../*..**
1bff0 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
1c000 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1c010 61 6c 6c 20 22 63 6f 61 6c 65 73 63 65 64 20 70  all "coalesced p
1c020 68 72 61 73 65 20 69 6e 73 74 61 6e 63 65 73 22  hrase instances"
1c030 20 69 6e 20 0d 0a 2a 2a 20 61 20 73 69 6e 67 6c   in ..** a singl
1c040 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1c050 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20  current row. If 
1c060 74 68 65 20 70 68 72 61 73 65 20 69 6e 73 74 61  the phrase insta
1c070 6e 63 65 73 20 69 6e 20 74 68 65 0d 0a 2a 2a 20  nces in the..** 
1c080 63 6f 6c 75 6d 6e 20 62 65 69 6e 67 20 63 6f 6e  column being con
1c090 73 69 64 65 72 65 64 20 64 6f 20 6e 6f 74 20 6f  sidered do not o
1c0a0 76 65 72 6c 61 70 2c 20 74 68 69 73 20 6f 62 6a  verlap, this obj
1c0b0 65 63 74 20 73 69 6d 70 6c 79 20 69 74 65 72 61  ect simply itera
1c0c0 74 65 73 0d 0a 2a 2a 20 74 68 72 6f 75 67 68 20  tes..** through 
1c0d0 74 68 65 6d 2e 20 4f 72 2c 20 69 66 20 74 68 65  them. Or, if the
1c0e0 79 20 64 6f 20 6f 76 65 72 6c 61 70 20 28 73 68  y do overlap (sh
1c0f0 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
1c100 74 6f 6b 65 6e 73 20 69 6e 0d 0a 2a 2a 20 63 6f  tokens in..** co
1c110 6d 6d 6f 6e 29 2c 20 65 61 63 68 20 73 65 74 20  mmon), each set 
1c120 6f 66 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 69  of overlapping i
1c130 6e 73 74 61 6e 63 65 73 20 69 73 20 74 72 65 61  nstances is trea
1c140 74 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 0d  ted as a single.
1c150 0a 2a 2a 20 6d 61 74 63 68 2e 20 53 65 65 20 64  .** match. See d
1c160 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
1c170 20 74 68 65 20 68 69 67 68 6c 69 67 68 74 28 29   the highlight()
1c180 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
1c190 69 6f 6e 20 66 6f 72 0d 0a 2a 2a 20 64 65 74 61  ion for..** deta
1c1a0 69 6c 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 55 73 61  ils...**..** Usa
1c1b0 67 65 20 69 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20  ge is:..**..**  
1c1c0 20 66 6f 72 28 72 63 20 3d 20 66 74 73 35 43 49   for(rc = fts5CI
1c1d0 6e 73 74 49 74 65 72 4e 65 78 74 28 70 41 70 69  nstIterNext(pApi
1c1e0 2c 20 70 46 74 73 2c 20 69 43 6f 6c 2c 20 26 69  , pFts, iCol, &i
1c1f0 74 65 72 29 3b 0d 0a 2a 2a 20 20 20 20 20 20 28  ter);..**      (
1c200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c210 20 30 3d 3d 66 74 73 35 43 49 6e 73 74 49 74 65   0==fts5CInstIte
1c220 72 45 6f 66 28 26 69 74 65 72 29 3b 0d 0a 2a 2a  rEof(&iter);..**
1c230 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 43        rc = fts5C
1c240 49 6e 73 74 49 74 65 72 4e 65 78 74 28 26 69 74  InstIterNext(&it
1c250 65 72 29 0d 0a 2a 2a 20 20 20 29 7b 0d 0a 2a 2a  er)..**   ){..**
1c260 20 20 20 20 20 70 72 69 6e 74 66 28 22 69 6e 73       printf("ins
1c270 74 61 6e 63 65 20 73 74 61 72 74 73 20 61 74 20  tance starts at 
1c280 25 64 2c 20 65 6e 64 73 20 61 74 20 25 64 5c 6e  %d, ends at %d\n
1c290 22 2c 20 69 74 65 72 2e 69 53 74 61 72 74 2c 20  ", iter.iStart, 
1c2a0 69 74 65 72 2e 69 45 6e 64 29 3b 0d 0a 2a 2a 20  iter.iEnd);..** 
1c2b0 20 20 7d 0d 0a 2a 2a 0d 0a 2a 2f 0d 0a 74 79 70    }..**..*/..typ
1c2c0 65 64 65 66 20 73 74 72 75 63 74 20 43 49 6e 73  edef struct CIns
1c2d0 74 49 74 65 72 20 43 49 6e 73 74 49 74 65 72 3b  tIter CInstIter;
1c2e0 0d 0a 73 74 72 75 63 74 20 43 49 6e 73 74 49 74  ..struct CInstIt
1c2f0 65 72 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 46 74  er {..  const Ft
1c300 73 35 45 78 74 65 6e 73 69 6f 6e 41 70 69 20 2a  s5ExtensionApi *
1c310 70 41 70 69 3b 20 20 20 2f 2a 20 41 50 49 20 6f  pApi;   /* API o
1c320 66 66 65 72 65 64 20 62 79 20 63 75 72 72 65 6e  ffered by curren
1c330 74 20 46 54 53 20 76 65 72 73 69 6f 6e 20 2a 2f  t FTS version */
1c340 0d 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20  ..  Fts5Context 
1c350 2a 70 46 74 73 3b 20 20 20 20 20 20 20 20 20 20  *pFts;          
1c360 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1c370 20 74 6f 20 70 61 73 73 20 74 6f 20 70 41 70 69   to pass to pApi
1c380 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0d 0a 20   functions */.. 
1c390 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 65   /* Column to se
1c3c0 61 72 63 68 20 2a 2f 0d 0a 20 20 69 6e 74 20 69  arch */..  int i
1c3d0 49 6e 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Inst;           
1c3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1c3f0 78 74 20 70 68 72 61 73 65 20 69 6e 73 74 61 6e  xt phrase instan
1c400 63 65 20 69 6e 64 65 78 20 2a 2f 0d 0a 20 20 69  ce index */..  i
1c410 6e 74 20 6e 49 6e 73 74 3b 20 20 20 20 20 20 20  nt nInst;       
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c430 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1c440 66 20 70 68 72 61 73 65 20 69 6e 73 74 61 6e 63  f phrase instanc
1c450 65 73 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 4f 75  es */....  /* Ou
1c460 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a  tput variables *
1c470 2f 0d 0a 20 20 69 6e 74 20 69 53 74 61 72 74 3b  /..  int iStart;
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 6f       /* First to
1c4a0 6b 65 6e 20 69 6e 20 63 6f 61 6c 65 73 63 65 64  ken in coalesced
1c4b0 20 70 68 72 61 73 65 20 69 6e 73 74 61 6e 63 65   phrase instance
1c4c0 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 45 6e 64 3b   */..  int iEnd;
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 74         /* Last t
1c4f0 6f 6b 65 6e 20 69 6e 20 63 6f 61 6c 65 73 63 65  oken in coalesce
1c500 64 20 70 68 72 61 73 65 20 69 6e 73 74 61 6e 63  d phrase instanc
1c510 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a  e */..};..../*..
1c520 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
1c530 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
1c540 65 78 74 20 63 6f 61 6c 65 73 63 65 64 20 70 68  ext coalesced ph
1c550 72 61 73 65 20 69 6e 73 74 61 6e 63 65 2e 20 52  rase instance. R
1c560 65 74 75 72 6e 0d 0a 2a 2a 20 61 6e 20 53 51 4c  eturn..** an SQL
1c570 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1c580 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1c590 73 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20  s, or SQLITE_OK 
1c5a0 6f 74 68 65 72 77 69 73 65 2e 0d 0a 2a 2f 0d 0a  otherwise...*/..
1c5b0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43  static int fts5C
1c5c0 49 6e 73 74 49 74 65 72 4e 65 78 74 28 43 49 6e  InstIterNext(CIn
1c5d0 73 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0d  stIter *pIter){.
1c5e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c5f0 54 45 5f 4f 4b 3b 0d 0a 20 20 70 49 74 65 72 2d  TE_OK;..  pIter-
1c600 3e 69 53 74 61 72 74 20 3d 20 2d 31 3b 0d 0a 20  >iStart = -1;.. 
1c610 20 70 49 74 65 72 2d 3e 69 45 6e 64 20 3d 20 2d   pIter->iEnd = -
1c620 31 3b 0d 0a 0d 0a 20 20 77 68 69 6c 65 28 20 72  1;....  while( r
1c630 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c640 70 49 74 65 72 2d 3e 69 49 6e 73 74 3c 70 49 74  pIter->iInst<pIt
1c650 65 72 2d 3e 6e 49 6e 73 74 20 29 7b 0d 0a 20 20  er->nInst ){..  
1c660 20 20 69 6e 74 20 69 70 3b 20 69 6e 74 20 69 63    int ip; int ic
1c670 3b 20 69 6e 74 20 69 6f 3b 0d 0a 20 20 20 20 72  ; int io;..    r
1c680 63 20 3d 20 70 49 74 65 72 2d 3e 70 41 70 69 2d  c = pIter->pApi-
1c690 3e 78 49 6e 73 74 28 70 49 74 65 72 2d 3e 70 46  >xInst(pIter->pF
1c6a0 74 73 2c 20 70 49 74 65 72 2d 3e 69 49 6e 73 74  ts, pIter->iInst
1c6b0 2c 20 26 69 70 2c 20 26 69 63 2c 20 26 69 6f 29  , &ip, &ic, &io)
1c6c0 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
1c6d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
1c6e0 20 20 20 69 66 28 20 69 63 3d 3d 70 49 74 65 72     if( ic==pIter
1c6f0 2d 3e 69 43 6f 6c 20 29 7b 0d 0a 20 20 20 20 20  ->iCol ){..     
1c700 20 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 6f     int iEnd = io
1c710 20 2d 20 31 20 2b 20 70 49 74 65 72 2d 3e 70 41   - 1 + pIter->pA
1c720 70 69 2d 3e 78 50 68 72 61 73 65 53 69 7a 65 28  pi->xPhraseSize(
1c730 70 49 74 65 72 2d 3e 70 46 74 73 2c 20 69 70 29  pIter->pFts, ip)
1c740 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
1c750 49 74 65 72 2d 3e 69 53 74 61 72 74 3c 30 20 29  Iter->iStart<0 )
1c760 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  {..          pIt
1c770 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 69 6f 3b  er->iStart = io;
1c780 0d 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ..          pIte
1c790 72 2d 3e 69 45 6e 64 20 3d 20 69 45 6e 64 3b 0d  r->iEnd = iEnd;.
1c7a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c7b0 66 28 20 69 6f 3c 3d 70 49 74 65 72 2d 3e 69 45  f( io<=pIter->iE
1c7c0 6e 64 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20  nd ){..         
1c7d0 20 69 66 28 20 69 45 6e 64 3e 70 49 74 65 72 2d   if( iEnd>pIter-
1c7e0 3e 69 45 6e 64 20 29 20 70 49 74 65 72 2d 3e 69  >iEnd ) pIter->i
1c7f0 45 6e 64 20 3d 20 69 45 6e 64 3b 0d 0a 20 20 20  End = iEnd;..   
1c800 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20       }else{..   
1c810 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
1c820 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c830 7d 0d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  }..      pIter->
1c840 69 49 6e 73 74 2b 2b 3b 0d 0a 20 20 20 20 7d 0d  iInst++;..    }.
1c850 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e  .  }....  return
1c860 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a   rc;..}..../*..*
1c870 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1c880 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
1c890 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
1c8a0 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
1c8b0 72 20 74 6f 20 0d 0a 2a 2a 20 69 74 65 72 61 74  r to ..** iterat
1c8c0 65 20 74 68 72 6f 75 67 68 20 63 6f 61 6c 65 73  e through coales
1c8d0 63 65 64 20 70 68 72 61 73 65 20 69 6e 73 74 61  ced phrase insta
1c8e0 6e 63 65 73 20 69 6e 20 63 6f 6c 75 6d 6e 20 69  nces in column i
1c8f0 43 6f 6c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  Col...*/..static
1c900 20 69 6e 74 20 66 74 73 35 43 49 6e 73 74 49 74   int fts5CInstIt
1c910 65 72 49 6e 69 74 28 0d 0a 20 20 63 6f 6e 73 74  erInit(..  const
1c920 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70   Fts5ExtensionAp
1c930 69 20 2a 70 41 70 69 2c 0d 0a 20 20 46 74 73 35  i *pApi,..  Fts5
1c940 43 6f 6e 74 65 78 74 20 2a 70 46 74 73 2c 0d 0a  Context *pFts,..
1c950 20 20 69 6e 74 20 69 43 6f 6c 2c 0d 0a 20 20 43    int iCol,..  C
1c960 49 6e 73 74 49 74 65 72 20 2a 70 49 74 65 72 0d  InstIter *pIter.
1c970 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a  .){..  int rc;..
1c980 0d 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ..  memset(pIter
1c990 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 49 6e 73  , 0, sizeof(CIns
1c9a0 74 49 74 65 72 29 29 3b 0d 0a 20 20 70 49 74 65  tIter));..  pIte
1c9b0 72 2d 3e 70 41 70 69 20 3d 20 70 41 70 69 3b 0d  r->pApi = pApi;.
1c9c0 0a 20 20 70 49 74 65 72 2d 3e 70 46 74 73 20 3d  .  pIter->pFts =
1c9d0 20 70 46 74 73 3b 0d 0a 20 20 70 49 74 65 72 2d   pFts;..  pIter-
1c9e0 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0d 0a 20  >iCol = iCol;.. 
1c9f0 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 49 6e 73   rc = pApi->xIns
1ca00 74 43 6f 75 6e 74 28 70 46 74 73 2c 20 26 70 49  tCount(pFts, &pI
1ca10 74 65 72 2d 3e 6e 49 6e 73 74 29 3b 0d 0a 0d 0a  ter->nInst);....
1ca20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ca30 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d  _OK ){..    rc =
1ca40 20 66 74 73 35 43 49 6e 73 74 49 74 65 72 4e 65   fts5CInstIterNe
1ca50 78 74 28 70 49 74 65 72 29 3b 0d 0a 20 20 7d 0d  xt(pIter);..  }.
1ca60 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  ...  return rc;.
1ca70 0a 7d 0d 0a 0d 0a 0d 0a 0d 0a 2f 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 2a 2a 2a  ****************
1cac0 2a 2a 2a 2a 0d 0a 2a 2a 20 53 74 61 72 74 20 6f  ****..** Start o
1cad0 66 20 68 69 67 68 6c 69 67 68 74 28 29 20 69 6d  f highlight() im
1cae0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 2a  plementation...*
1caf0 2f 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
1cb00 74 20 48 69 67 68 6c 69 67 68 74 43 6f 6e 74 65  t HighlightConte
1cb10 78 74 20 48 69 67 68 6c 69 67 68 74 43 6f 6e 74  xt HighlightCont
1cb20 65 78 74 3b 0d 0a 73 74 72 75 63 74 20 48 69 67  ext;..struct Hig
1cb30 68 6c 69 67 68 74 43 6f 6e 74 65 78 74 20 7b 0d  hlightContext {.
1cb40 0a 20 20 43 49 6e 73 74 49 74 65 72 20 69 74 65  .  CInstIter ite
1cb50 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1cb60 20 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 64 20     /* Coalesced 
1cb70 49 6e 73 74 61 6e 63 65 20 49 74 65 72 61 74 6f  Instance Iterato
1cb80 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 50 6f 73  r */..  int iPos
1cb90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cba0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1cbb0 6e 74 20 74 6f 6b 65 6e 20 6f 66 66 73 65 74 20  nt token offset 
1cbc0 69 6e 20 7a 49 6e 5b 5d 20 2a 2f 0d 0a 20 20 69  in zIn[] */..  i
1cbd0 6e 74 20 69 52 61 6e 67 65 53 74 61 72 74 3b 20  nt iRangeStart; 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cbf0 2a 20 46 69 72 73 74 20 74 6f 6b 65 6e 20 74 6f  * First token to
1cc00 20 69 6e 63 6c 75 64 65 20 2a 2f 0d 0a 20 20 69   include */..  i
1cc10 6e 74 20 69 52 61 6e 67 65 45 6e 64 3b 20 20 20  nt iRangeEnd;   
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cc30 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6c  * If non-zero, l
1cc40 61 73 74 20 74 6f 6b 65 6e 20 74 6f 20 69 6e 63  ast token to inc
1cc50 6c 75 64 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74  lude */..  const
1cc60 20 63 68 61 72 20 2a 7a 4f 70 65 6e 3b 20 20 20   char *zOpen;   
1cc70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
1cc80 65 6e 69 6e 67 20 68 69 67 68 6c 69 67 68 74 20  ening highlight 
1cc90 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
1cca0 20 2a 7a 43 6c 6f 73 65 3b 20 20 20 20 20 20 20   *zClose;       
1ccb0 20 20 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67        /* Closing
1ccc0 20 68 69 67 68 6c 69 67 68 74 20 2a 2f 0d 0a 20   highlight */.. 
1ccd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
1cce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ccf0 20 2f 2a 20 49 6e 70 75 74 20 74 65 78 74 20 2a   /* Input text *
1cd00 2f 0d 0a 20 20 69 6e 74 20 6e 49 6e 3b 20 20 20  /..  int nIn;   
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1cd30 69 6e 70 75 74 20 74 65 78 74 20 69 6e 20 62 79  input text in by
1cd40 74 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 4f  tes */..  int iO
1cd50 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1cd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1cd70 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68  rent offset with
1cd80 69 6e 20 7a 49 6e 5b 5d 20 2a 2f 0d 0a 20 20 63  in zIn[] */..  c
1cd90 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20  har *zOut;      
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cdb0 2a 20 4f 75 74 70 75 74 20 76 61 6c 75 65 20 2a  * Output value *
1cdc0 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  /..};..../*..** 
1cdd0 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 74  Append text to t
1cde0 68 65 20 48 69 67 68 6c 69 67 68 74 43 6f 6e 74  he HighlightCont
1cdf0 65 78 74 20 6f 75 74 70 75 74 20 73 74 72 69 6e  ext output strin
1ce00 67 20 2d 20 70 2d 3e 7a 4f 75 74 2e 20 41 72 67  g - p->zOut. Arg
1ce10 75 6d 65 6e 74 0d 0a 2a 2a 20 7a 20 70 6f 69 6e  ument..** z poin
1ce20 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
1ce30 6f 6e 74 61 69 6e 69 6e 67 20 6e 20 62 79 74 65  ontaining n byte
1ce40 73 20 6f 66 20 74 65 78 74 20 74 6f 20 61 70 70  s of text to app
1ce50 65 6e 64 2e 20 49 66 20 6e 20 69 73 20 0d 0a 2a  end. If n is ..*
1ce60 2a 20 6e 65 67 61 74 69 76 65 2c 20 65 76 65 72  * negative, ever
1ce70 79 74 68 69 6e 67 20 75 70 20 75 6e 74 69 6c 20  ything up until 
1ce80 74 68 65 20 66 69 72 73 74 20 27 5c 30 27 20 69  the first '\0' i
1ce90 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
1cea0 65 20 6f 75 74 70 75 74 2e 0d 0a 2a 2a 0d 0a 2a  e output...**..*
1ceb0 2a 20 49 66 20 2a 70 52 63 20 69 73 20 73 65 74  * If *pRc is set
1cec0 20 74 6f 20 61 6e 79 20 76 61 6c 75 65 20 6f 74   to any value ot
1ced0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1cee0 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  OK when this fun
1cef0 63 74 69 6f 6e 20 69 73 20 0d 0a 2a 2a 20 63 61  ction is ..** ca
1cf00 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
1cf10 2d 6f 70 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  -op. If an error
1cf20 20 28 69 2e 65 2e 20 61 6e 20 4f 4f 4d 20 63 6f   (i.e. an OOM co
1cf30 6e 64 69 74 69 6f 6e 29 20 69 73 20 65 6e 63 6f  ndition) is enco
1cf40 75 6e 74 65 72 65 64 2c 20 0d 0a 2a 2a 20 2a 70  untered, ..** *p
1cf50 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Rc is set to an 
1cf60 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72  error code befor
1cf70 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0d 0a 2a  e returning. ..*
1cf80 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  /..static void f
1cf90 74 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65  ts5HighlightAppe
1cfa0 6e 64 28 0d 0a 20 20 69 6e 74 20 2a 70 52 63 2c  nd(..  int *pRc,
1cfb0 20 0d 0a 20 20 48 69 67 68 6c 69 67 68 74 43 6f   ..  HighlightCo
1cfc0 6e 74 65 78 74 20 2a 70 2c 20 0d 0a 20 20 63 6f  ntext *p, ..  co
1cfd0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
1cfe0 20 6e 0d 0a 29 7b 0d 0a 20 20 69 66 28 20 2a 70   n..){..  if( *p
1cff0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  Rc==SQLITE_OK &&
1d000 20 7a 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 6e   z ){..    if( n
1d010 3c 30 20 29 20 6e 20 3d 20 28 69 6e 74 29 73 74  <0 ) n = (int)st
1d020 72 6c 65 6e 28 7a 29 3b 0d 0a 20 20 20 20 70 2d  rlen(z);..    p-
1d030 3e 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f  >zOut = sqlite3_
1d040 6d 70 72 69 6e 74 66 28 22 25 7a 25 2e 2a 73 22  mprintf("%z%.*s"
1d050 2c 20 70 2d 3e 7a 4f 75 74 2c 20 6e 2c 20 7a 29  , p->zOut, n, z)
1d060 3b 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 4f  ;..    if( p->zO
1d070 75 74 3d 3d 30 20 29 20 2a 70 52 63 20 3d 20 53  ut==0 ) *pRc = S
1d080 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20  QLITE_NOMEM;..  
1d090 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54  }..}..../*..** T
1d0a0 6f 6b 65 6e 69 7a 65 72 20 63 61 6c 6c 62 61 63  okenizer callbac
1d0b0 6b 20 75 73 65 64 20 62 79 20 69 6d 70 6c 65 6d  k used by implem
1d0c0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 68 69 67 68  entation of high
1d0d0 6c 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  light() function
1d0e0 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
1d0f0 74 20 66 74 73 35 48 69 67 68 6c 69 67 68 74 43  t fts5HighlightC
1d100 62 28 0d 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  b(..  void *pCon
1d110 74 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  text,           
1d120 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1d130 20 74 6f 20 48 69 67 68 6c 69 67 68 74 43 6f 6e   to HighlightCon
1d140 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a  text object */..
1d150 20 20 69 6e 74 20 74 66 6c 61 67 73 2c 20 20 20    int tflags,   
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d170 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
1d180 35 5f 54 4f 4b 45 4e 5f 2a 20 66 6c 61 67 73 20  5_TOKEN_* flags 
1d190 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
1d1a0 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20   *pToken,       
1d1b0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1d1c0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e  containing token
1d1d0 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54 6f 6b 65   */..  int nToke
1d1e0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1d1f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d200 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73  f token in bytes
1d210 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 53 74 61 72   */..  int iStar
1d220 74 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20  tOff,           
1d230 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
1d240 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20  offset of token 
1d250 2a 2f 0d 0a 20 20 69 6e 74 20 69 45 6e 64 4f 66  */..  int iEndOf
1d260 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
1d270 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 66        /* End off
1d280 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0d  set of token */.
1d290 0a 29 7b 0d 0a 20 20 48 69 67 68 6c 69 67 68 74  .){..  Highlight
1d2a0 43 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28 48 69  Context *p = (Hi
1d2b0 67 68 6c 69 67 68 74 43 6f 6e 74 65 78 74 2a 29  ghlightContext*)
1d2c0 70 43 6f 6e 74 65 78 74 3b 0d 0a 20 20 69 6e 74  pContext;..  int
1d2d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d2e0 0d 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0d 0a 0d  ..  int iPos;...
1d2f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32  .  UNUSED_PARAM2
1d300 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  (pToken, nToken)
1d310 3b 0d 0a 0d 0a 20 20 69 66 28 20 74 66 6c 61 67  ;....  if( tflag
1d320 73 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43  s & FTS5_TOKEN_C
1d330 4f 4c 4f 43 41 54 45 44 20 29 20 72 65 74 75 72  OLOCATED ) retur
1d340 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  n SQLITE_OK;..  
1d350 69 50 6f 73 20 3d 20 70 2d 3e 69 50 6f 73 2b 2b  iPos = p->iPos++
1d360 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 2d 3e 69 52  ;....  if( p->iR
1d370 61 6e 67 65 45 6e 64 3e 30 20 29 7b 0d 0a 20 20  angeEnd>0 ){..  
1d380 20 20 69 66 28 20 69 50 6f 73 3c 70 2d 3e 69 52    if( iPos<p->iR
1d390 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 69 50 6f  angeStart || iPo
1d3a0 73 3e 70 2d 3e 69 52 61 6e 67 65 45 6e 64 20 29  s>p->iRangeEnd )
1d3b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d3c0 4b 3b 0d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  K;..    if( p->i
1d3d0 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 69 50  RangeStart && iP
1d3e0 6f 73 3d 3d 70 2d 3e 69 52 61 6e 67 65 53 74 61  os==p->iRangeSta
1d3f0 72 74 20 29 20 70 2d 3e 69 4f 66 66 20 3d 20 69  rt ) p->iOff = i
1d400 53 74 61 72 74 4f 66 66 3b 0d 0a 20 20 7d 0d 0a  StartOff;..  }..
1d410 0d 0a 20 20 69 66 28 20 69 50 6f 73 3d 3d 70 2d  ..  if( iPos==p-
1d420 3e 69 74 65 72 2e 69 53 74 61 72 74 20 29 7b 0d  >iter.iStart ){.
1d430 0a 20 20 20 20 66 74 73 35 48 69 67 68 6c 69 67  .    fts5Highlig
1d440 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20 70 2c  htAppend(&rc, p,
1d450 20 26 70 2d 3e 7a 49 6e 5b 70 2d 3e 69 4f 66 66   &p->zIn[p->iOff
1d460 5d 2c 20 69 53 74 61 72 74 4f 66 66 20 2d 20 70  ], iStartOff - p
1d470 2d 3e 69 4f 66 66 29 3b 0d 0a 20 20 20 20 66 74  ->iOff);..    ft
1d480 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65 6e  s5HighlightAppen
1d490 64 28 26 72 63 2c 20 70 2c 20 70 2d 3e 7a 4f 70  d(&rc, p, p->zOp
1d4a0 65 6e 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 70 2d  en, -1);..    p-
1d4b0 3e 69 4f 66 66 20 3d 20 69 53 74 61 72 74 4f 66  >iOff = iStartOf
1d4c0 66 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28  f;..  }....  if(
1d4d0 20 69 50 6f 73 3d 3d 70 2d 3e 69 74 65 72 2e 69   iPos==p->iter.i
1d4e0 45 6e 64 20 29 7b 0d 0a 20 20 20 20 69 66 28 20  End ){..    if( 
1d4f0 70 2d 3e 69 52 61 6e 67 65 45 6e 64 20 26 26 20  p->iRangeEnd && 
1d500 70 2d 3e 69 74 65 72 2e 69 53 74 61 72 74 3c 70  p->iter.iStart<p
1d510 2d 3e 69 52 61 6e 67 65 53 74 61 72 74 20 29 7b  ->iRangeStart ){
1d520 0d 0a 20 20 20 20 20 20 66 74 73 35 48 69 67 68  ..      fts5High
1d530 6c 69 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c  lightAppend(&rc,
1d540 20 70 2c 20 70 2d 3e 7a 4f 70 65 6e 2c 20 2d 31   p, p->zOpen, -1
1d550 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 66  );..    }..    f
1d560 74 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65  ts5HighlightAppe
1d570 6e 64 28 26 72 63 2c 20 70 2c 20 26 70 2d 3e 7a  nd(&rc, p, &p->z
1d580 49 6e 5b 70 2d 3e 69 4f 66 66 5d 2c 20 69 45 6e  In[p->iOff], iEn
1d590 64 4f 66 66 20 2d 20 70 2d 3e 69 4f 66 66 29 3b  dOff - p->iOff);
1d5a0 0d 0a 20 20 20 20 66 74 73 35 48 69 67 68 6c 69  ..    fts5Highli
1d5b0 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20 70  ghtAppend(&rc, p
1d5c0 2c 20 70 2d 3e 7a 43 6c 6f 73 65 2c 20 2d 31 29  , p->zClose, -1)
1d5d0 3b 0d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d  ;..    p->iOff =
1d5e0 20 69 45 6e 64 4f 66 66 3b 0d 0a 20 20 20 20 69   iEndOff;..    i
1d5f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d600 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20   ){..      rc = 
1d610 66 74 73 35 43 49 6e 73 74 49 74 65 72 4e 65 78  fts5CInstIterNex
1d620 74 28 26 70 2d 3e 69 74 65 72 29 3b 0d 0a 20 20  t(&p->iter);..  
1d630 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66    }..  }....  if
1d640 28 20 70 2d 3e 69 52 61 6e 67 65 45 6e 64 3e 30  ( p->iRangeEnd>0
1d650 20 26 26 20 69 50 6f 73 3d 3d 70 2d 3e 69 52 61   && iPos==p->iRa
1d660 6e 67 65 45 6e 64 20 29 7b 0d 0a 20 20 20 20 66  ngeEnd ){..    f
1d670 74 73 35 48 69 67 68 6c 69 67 68 74 41 70 70 65  ts5HighlightAppe
1d680 6e 64 28 26 72 63 2c 20 70 2c 20 26 70 2d 3e 7a  nd(&rc, p, &p->z
1d690 49 6e 5b 70 2d 3e 69 4f 66 66 5d 2c 20 69 45 6e  In[p->iOff], iEn
1d6a0 64 4f 66 66 20 2d 20 70 2d 3e 69 4f 66 66 29 3b  dOff - p->iOff);
1d6b0 0d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d 20  ..    p->iOff = 
1d6c0 69 45 6e 64 4f 66 66 3b 0d 0a 20 20 20 20 69 66  iEndOff;..    if
1d6d0 28 20 69 50 6f 73 3e 3d 70 2d 3e 69 74 65 72 2e  ( iPos>=p->iter.
1d6e0 69 53 74 61 72 74 20 26 26 20 69 50 6f 73 3c 70  iStart && iPos<p
1d6f0 2d 3e 69 74 65 72 2e 69 45 6e 64 20 29 7b 0d 0a  ->iter.iEnd ){..
1d700 20 20 20 20 20 20 66 74 73 35 48 69 67 68 6c 69        fts5Highli
1d710 67 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20 70  ghtAppend(&rc, p
1d720 2c 20 70 2d 3e 7a 43 6c 6f 73 65 2c 20 2d 31 29  , p->zClose, -1)
1d730 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
1d740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d  .  return rc;..}
1d750 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6d 70 6c 65  ..../*..** Imple
1d760 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 68 69 67  mentation of hig
1d770 68 6c 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f  hlight() functio
1d780 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  n...*/..static v
1d790 6f 69 64 20 66 74 73 35 48 69 67 68 6c 69 67 68  oid fts5Highligh
1d7a0 74 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 63 6f  tFunction(..  co
1d7b0 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f  nst Fts5Extensio
1d7c0 6e 41 70 69 20 2a 70 41 70 69 2c 20 20 20 2f 2a  nApi *pApi,   /*
1d7d0 20 41 50 49 20 6f 66 66 65 72 65 64 20 62 79 20   API offered by 
1d7e0 63 75 72 72 65 6e 74 20 46 54 53 20 76 65 72 73  current FTS vers
1d7f0 69 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f  ion */..  Fts5Co
1d800 6e 74 65 78 74 20 2a 70 46 74 73 2c 20 20 20 20  ntext *pFts,    
1d810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1d820 73 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74  st arg to pass t
1d830 6f 20 70 41 70 69 20 66 75 6e 63 74 69 6f 6e 73  o pApi functions
1d840 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 63   */..  sqlite3_c
1d850 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
1d860 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
1d870 74 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20  t for returning 
1d880 72 65 73 75 6c 74 2f 65 72 72 6f 72 20 2a 2f 0d  result/error */.
1d890 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20  .  int nVal,    
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d8c0 76 61 6c 75 65 73 20 69 6e 20 61 70 56 61 6c 5b  values in apVal[
1d8d0 5d 20 61 72 72 61 79 20 2a 2f 0d 0a 20 20 73 71  ] array */..  sq
1d8e0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1d8f0 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
1d900 20 41 72 72 61 79 20 6f 66 20 74 72 61 69 6c 69   Array of traili
1d910 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0d  ng arguments */.
1d920 0a 29 7b 0d 0a 20 20 48 69 67 68 6c 69 67 68 74  .){..  Highlight
1d930 43 6f 6e 74 65 78 74 20 63 74 78 3b 0d 0a 20 20  Context ctx;..  
1d940 69 6e 74 20 72 63 3b 0d 0a 20 20 69 6e 74 20 69  int rc;..  int i
1d950 43 6f 6c 3b 0d 0a 0d 0a 20 20 69 66 28 20 6e 56  Col;....  if( nV
1d960 61 6c 21 3d 33 20 29 7b 0d 0a 20 20 20 20 63 6f  al!=3 ){..    co
1d970 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
1d980 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
1d990 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
1d9a0 75 6e 63 74 69 6f 6e 20 68 69 67 68 6c 69 67 68  unction highligh
1d9b0 74 28 29 22 3b 0d 0a 20 20 20 20 73 71 6c 69 74  t()";..    sqlit
1d9c0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
1d9d0 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29 3b  pCtx, zErr, -1);
1d9e0 0d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20  ..    return;.. 
1d9f0 20 7d 0d 0a 0d 0a 20 20 69 43 6f 6c 20 3d 20 73   }....  iCol = s
1da00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1da10 28 61 70 56 61 6c 5b 30 5d 29 3b 0d 0a 20 20 6d  (apVal[0]);..  m
1da20 65 6d 73 65 74 28 26 63 74 78 2c 20 30 2c 20 73  emset(&ctx, 0, s
1da30 69 7a 65 6f 66 28 48 69 67 68 6c 69 67 68 74 43  izeof(HighlightC
1da40 6f 6e 74 65 78 74 29 29 3b 0d 0a 20 20 63 74 78  ontext));..  ctx
1da50 2e 7a 4f 70 65 6e 20 3d 20 28 63 6f 6e 73 74 20  .zOpen = (const 
1da60 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
1da70 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31  lue_text(apVal[1
1da80 5d 29 3b 0d 0a 20 20 63 74 78 2e 7a 43 6c 6f 73  ]);..  ctx.zClos
1da90 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
1daa0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1dab0 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0d 0a  ext(apVal[2]);..
1dac0 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 43 6f    rc = pApi->xCo
1dad0 6c 75 6d 6e 54 65 78 74 28 70 46 74 73 2c 20 69  lumnText(pFts, i
1dae0 43 6f 6c 2c 20 26 63 74 78 2e 7a 49 6e 2c 20 26  Col, &ctx.zIn, &
1daf0 63 74 78 2e 6e 49 6e 29 3b 0d 0a 0d 0a 20 20 69  ctx.nIn);....  i
1db00 66 28 20 63 74 78 2e 7a 49 6e 20 29 7b 0d 0a 20  f( ctx.zIn ){.. 
1db10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1db20 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72  E_OK ){..      r
1db30 63 20 3d 20 66 74 73 35 43 49 6e 73 74 49 74 65  c = fts5CInstIte
1db40 72 49 6e 69 74 28 70 41 70 69 2c 20 70 46 74 73  rInit(pApi, pFts
1db50 2c 20 69 43 6f 6c 2c 20 26 63 74 78 2e 69 74 65  , iCol, &ctx.ite
1db60 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  r);..    }....  
1db70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1db80 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 63  _OK ){..      rc
1db90 20 3d 20 70 41 70 69 2d 3e 78 54 6f 6b 65 6e 69   = pApi->xTokeni
1dba0 7a 65 28 70 46 74 73 2c 20 63 74 78 2e 7a 49 6e  ze(pFts, ctx.zIn
1dbb0 2c 20 63 74 78 2e 6e 49 6e 2c 20 28 76 6f 69 64  , ctx.nIn, (void
1dbc0 2a 29 26 63 74 78 2c 66 74 73 35 48 69 67 68 6c  *)&ctx,fts5Highl
1dbd0 69 67 68 74 43 62 29 3b 0d 0a 20 20 20 20 7d 0d  ightCb);..    }.
1dbe0 0a 20 20 20 20 66 74 73 35 48 69 67 68 6c 69 67  .    fts5Highlig
1dbf0 68 74 41 70 70 65 6e 64 28 26 72 63 2c 20 26 63  htAppend(&rc, &c
1dc00 74 78 2c 20 26 63 74 78 2e 7a 49 6e 5b 63 74 78  tx, &ctx.zIn[ctx
1dc10 2e 69 4f 66 66 5d 2c 20 63 74 78 2e 6e 49 6e 20  .iOff], ctx.nIn 
1dc20 2d 20 63 74 78 2e 69 4f 66 66 29 3b 0d 0a 0d 0a  - ctx.iOff);....
1dc30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dc40 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
1dc50 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1dc60 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73 74  ext(pCtx, (const
1dc70 20 63 68 61 72 2a 29 63 74 78 2e 7a 4f 75 74 2c   char*)ctx.zOut,
1dc80 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
1dc90 53 49 45 4e 54 29 3b 0d 0a 20 20 20 20 7d 0d 0a  SIENT);..    }..
1dca0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1dcb0 28 63 74 78 2e 7a 4f 75 74 29 3b 0d 0a 20 20 7d  (ctx.zOut);..  }
1dcc0 0d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
1dcd0 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 73 71  TE_OK ){..    sq
1dce0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1dcf0 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
1dd00 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 2f 2a 0d 0a  );..  }..}../*..
1dd10 2a 2a 20 45 6e 64 20 6f 66 20 68 69 67 68 6c 69  ** End of highli
1dd20 67 68 74 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61  ght() implementa
1dd30 74 69 6f 6e 2e 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion...*********
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 2a 2a 2a 2a 2a 2a  ****************
1dd80 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e  */..../*..** Con
1dd90 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
1dda0 65 64 20 74 6f 20 74 68 65 20 66 74 73 35 53 65  ed to the fts5Se
1ddb0 6e 74 65 6e 63 65 46 69 6e 64 65 72 43 62 28 29  ntenceFinderCb()
1ddc0 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a   function...*/..
1ddd0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
1dde0 74 73 35 53 46 69 6e 64 65 72 20 46 74 73 35 53  ts5SFinder Fts5S
1ddf0 46 69 6e 64 65 72 3b 0d 0a 73 74 72 75 63 74 20  Finder;..struct 
1de00 46 74 73 35 53 46 69 6e 64 65 72 20 7b 0d 0a 20  Fts5SFinder {.. 
1de10 20 69 6e 74 20 69 50 6f 73 3b 20 20 20 20 20 20   int iPos;      
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 6f 6b 65   /* Current toke
1de40 6e 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0d 0a 20  n position */.. 
1de50 20 69 6e 74 20 6e 46 69 72 73 74 41 6c 6c 6f 63   int nFirstAlloc
1de60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de70 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
1de80 7a 65 20 6f 66 20 61 46 69 72 73 74 5b 5d 20 2a  ze of aFirst[] *
1de90 2f 0d 0a 20 20 69 6e 74 20 6e 46 69 72 73 74 3b  /..  int nFirst;
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dec0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 46 69  f entries in aFi
1ded0 72 73 74 5b 5d 20 2a 2f 0d 0a 20 20 69 6e 74 20  rst[] */..  int 
1dee0 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *aFirst;        
1def0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1df00 72 72 61 79 20 6f 66 20 66 69 72 73 74 20 74 6f  rray of first to
1df10 6b 65 6e 20 69 6e 20 65 61 63 68 20 73 65 6e 74  ken in each sent
1df20 65 6e 63 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74  ence */..  const
1df30 20 63 68 61 72 20 2a 7a 44 6f 63 3b 20 20 20 20   char *zDoc;    
1df40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
1df50 63 75 6d 65 6e 74 20 62 65 69 6e 67 20 74 6f 6b  cument being tok
1df60 65 6e 69 7a 65 64 20 2a 2f 0d 0a 7d 3b 0d 0a 0d  enized */..};...
1df70 0a 2f 2a 0d 0a 2a 2a 20 41 64 64 20 61 6e 20 65  ./*..** Add an e
1df80 6e 74 72 79 20 74 6f 20 74 68 65 20 46 74 73 35  ntry to the Fts5
1df90 53 46 69 6e 64 65 72 2e 61 46 69 72 73 74 5b 5d  SFinder.aFirst[]
1dfa0 20 61 72 72 61 79 2e 20 47 72 6f 77 20 74 68 65   array. Grow the
1dfb0 20 61 72 72 61 79 20 69 66 0d 0a 2a 2a 20 6e 65   array if..** ne
1dfc0 63 65 73 73 61 72 79 2e 20 52 65 74 75 72 6e 20  cessary. Return 
1dfd0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
1dfe0 63 65 73 73 66 75 6c 2c 20 6f 72 20 53 51 4c 49  cessful, or SQLI
1dff0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 6e 0d 0a  TE_NOMEM if an..
1e000 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  ** error occurs.
1e010 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
1e020 20 66 74 73 35 53 65 6e 74 65 6e 63 65 46 69 6e   fts5SentenceFin
1e030 64 65 72 41 64 64 28 46 74 73 35 53 46 69 6e 64  derAdd(Fts5SFind
1e040 65 72 20 2a 70 2c 20 69 6e 74 20 69 41 64 64 29  er *p, int iAdd)
1e050 7b 0d 0a 20 20 69 66 28 20 70 2d 3e 6e 46 69 72  {..  if( p->nFir
1e060 73 74 41 6c 6c 6f 63 3d 3d 70 2d 3e 6e 46 69 72  stAlloc==p->nFir
1e070 73 74 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e  st ){..    int n
1e080 4e 65 77 20 3d 20 70 2d 3e 6e 46 69 72 73 74 41  New = p->nFirstA
1e090 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 46 69 72 73 74  lloc ? p->nFirst
1e0a0 41 6c 6c 6f 63 2a 32 20 3a 20 36 34 3b 0d 0a 20  Alloc*2 : 64;.. 
1e0b0 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0d 0a 0d     int *aNew;...
1e0c0 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 69 6e 74  .    aNew = (int
1e0d0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1e0e0 63 36 34 28 70 2d 3e 61 46 69 72 73 74 2c 20 6e  c64(p->aFirst, n
1e0f0 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  New*sizeof(int))
1e100 3b 0d 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  ;..    if( aNew=
1e110 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1e120 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 70  TE_NOMEM;..    p
1e130 2d 3e 61 46 69 72 73 74 20 3d 20 61 4e 65 77 3b  ->aFirst = aNew;
1e140 0d 0a 20 20 20 20 70 2d 3e 6e 46 69 72 73 74 41  ..    p->nFirstA
1e150 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0d 0a 20 20  lloc = nNew;..  
1e160 7d 0d 0a 20 20 70 2d 3e 61 46 69 72 73 74 5b 70  }..  p->aFirst[p
1e170 2d 3e 6e 46 69 72 73 74 2b 2b 5d 20 3d 20 69 41  ->nFirst++] = iA
1e180 64 64 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51  dd;..  return SQ
1e190 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f  LITE_OK;..}..../
1e1a0 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  *..** This funct
1e1b0 69 6f 6e 20 69 73 20 61 6e 20 78 54 6f 6b 65 6e  ion is an xToken
1e1c0 69 7a 65 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  ize() callback u
1e1d0 73 65 64 20 62 79 20 74 68 65 20 61 75 78 69 6c  sed by the auxil
1e1e0 69 61 72 79 20 73 6e 69 70 70 65 74 28 29 0d 0a  iary snippet()..
1e1f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 73  ** function. Its
1e200 20 6a 6f 62 20 69 73 20 74 6f 20 69 64 65 6e 74   job is to ident
1e210 69 66 79 20 74 6f 6b 65 6e 73 20 74 68 61 74 20  ify tokens that 
1e220 61 72 65 20 74 68 65 20 66 69 72 73 74 20 69 6e  are the first in
1e230 20 61 20 73 65 6e 74 65 6e 63 65 2e 0d 0a 2a 2a   a sentence...**
1e240 20 46 6f 72 20 65 61 63 68 20 73 75 63 68 20 74   For each such t
1e250 6f 6b 65 6e 2c 20 61 6e 20 65 6e 74 72 79 20 69  oken, an entry i
1e260 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53  s added to the S
1e270 46 69 6e 64 65 72 2e 61 46 69 72 73 74 5b 5d 20  Finder.aFirst[] 
1e280 61 72 72 61 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  array...*/..stat
1e290 69 63 20 69 6e 74 20 66 74 73 35 53 65 6e 74 65  ic int fts5Sente
1e2a0 6e 63 65 46 69 6e 64 65 72 43 62 28 0d 0a 20 20  nceFinderCb(..  
1e2b0 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20  void *pContext, 
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2d0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 48 69  /* Pointer to Hi
1e2e0 67 68 6c 69 67 68 74 43 6f 6e 74 65 78 74 20 6f  ghlightContext o
1e2f0 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 69 6e 74 20  bject */..  int 
1e300 74 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  tflags,         
1e310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1e320 61 73 6b 20 6f 66 20 46 54 53 35 5f 54 4f 4b 45  ask of FTS5_TOKE
1e330 4e 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20  N_* flags */..  
1e340 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
1e350 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1e360 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
1e370 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20  ning token */.. 
1e380 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20   int nToken,    
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65   /* Size of toke
1e3b0 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20  n in bytes */.. 
1e3c0 20 69 6e 74 20 69 53 74 61 72 74 4f 66 66 2c 20   int iStartOff, 
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 2f 2a 20 53 74 61 72 74 20 6f 66 66 73 65 74   /* Start offset
1e3f0 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20   of token */..  
1e400 69 6e 74 20 69 45 6e 64 4f 66 66 20 20 20 20 20  int iEndOff     
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e420 2f 2a 20 45 6e 64 20 6f 66 66 73 65 74 20 6f 66  /* End offset of
1e430 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b 0d 0a 20   token */..){.. 
1e440 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e450 5f 4f 4b 3b 0d 0a 0d 0a 20 20 55 4e 55 53 45 44  _OK;....  UNUSED
1e460 5f 50 41 52 41 4d 32 28 70 54 6f 6b 65 6e 2c 20  _PARAM2(pToken, 
1e470 6e 54 6f 6b 65 6e 29 3b 0d 0a 20 20 55 4e 55 53  nToken);..  UNUS
1e480 45 44 5f 50 41 52 41 4d 28 69 45 6e 64 4f 66 66  ED_PARAM(iEndOff
1e490 29 3b 0d 0a 0d 0a 20 20 69 66 28 20 28 74 66 6c  );....  if( (tfl
1e4a0 61 67 73 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e  ags & FTS5_TOKEN
1e4b0 5f 43 4f 4c 4f 43 41 54 45 44 29 3d 3d 30 20 29  _COLOCATED)==0 )
1e4c0 7b 0d 0a 20 20 20 20 46 74 73 35 53 46 69 6e 64  {..    Fts5SFind
1e4d0 65 72 20 2a 70 20 3d 20 28 46 74 73 35 53 46 69  er *p = (Fts5SFi
1e4e0 6e 64 65 72 2a 29 70 43 6f 6e 74 65 78 74 3b 0d  nder*)pContext;.
1e4f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 50 6f 73  .    if( p->iPos
1e500 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74  >0 ){..      int
1e510 20 69 3b 0d 0a 20 20 20 20 20 20 63 68 61 72 20   i;..      char 
1e520 63 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 66 6f  c = 0;..      fo
1e530 72 28 69 3d 69 53 74 61 72 74 4f 66 66 2d 31 3b  r(i=iStartOff-1;
1e540 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0d 0a 20 20   i>=0; i--){..  
1e550 20 20 20 20 20 20 63 20 3d 20 70 2d 3e 7a 44 6f        c = p->zDo
1e560 63 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 20 20 69  c[i];..        i
1e570 66 28 20 63 21 3d 27 20 27 20 26 26 20 63 21 3d  f( c!=' ' && c!=
1e580 27 5c 74 27 20 26 26 20 63 21 3d 27 5c 6e 27 20  '\t' && c!='\n' 
1e590 26 26 20 63 21 3d 27 5c 72 27 20 29 20 62 72 65  && c!='\r' ) bre
1e5a0 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ak;..      }..  
1e5b0 20 20 20 20 69 66 28 20 69 21 3d 69 53 74 61 72      if( i!=iStar
1e5c0 74 4f 66 66 2d 31 20 26 26 20 28 63 3d 3d 27 2e  tOff-1 && (c=='.
1e5d0 27 20 7c 7c 20 63 3d 3d 27 3a 27 29 20 29 7b 0d  ' || c==':') ){.
1e5e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
1e5f0 73 35 53 65 6e 74 65 6e 63 65 46 69 6e 64 65 72  s5SentenceFinder
1e600 41 64 64 28 70 2c 20 70 2d 3e 69 50 6f 73 29 3b  Add(p, p->iPos);
1e610 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1e620 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 20  else{..      rc 
1e630 3d 20 66 74 73 35 53 65 6e 74 65 6e 63 65 46 69  = fts5SentenceFi
1e640 6e 64 65 72 41 64 64 28 70 2c 20 30 29 3b 0d 0a  nderAdd(p, 0);..
1e650 20 20 20 20 7d 0d 0a 20 20 20 20 70 2d 3e 69 50      }..    p->iP
1e660 6f 73 2b 2b 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65  os++;..  }..  re
1e670 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73  turn rc;..}....s
1e680 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 6e  tatic int fts5Sn
1e690 69 70 70 65 74 53 63 6f 72 65 28 0d 0a 20 20 63  ippetScore(..  c
1e6a0 6f 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73 69  onst Fts5Extensi
1e6b0 6f 6e 41 70 69 20 2a 70 41 70 69 2c 20 20 20 2f  onApi *pApi,   /
1e6c0 2a 20 41 50 49 20 6f 66 66 65 72 65 64 20 62 79  * API offered by
1e6d0 20 63 75 72 72 65 6e 74 20 46 54 53 20 76 65 72   current FTS ver
1e6e0 73 69 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73 35 43  sion */..  Fts5C
1e6f0 6f 6e 74 65 78 74 20 2a 70 46 74 73 2c 20 20 20  ontext *pFts,   
1e700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1e710 72 73 74 20 61 72 67 20 74 6f 20 70 61 73 73 20  rst arg to pass 
1e720 74 6f 20 70 41 70 69 20 66 75 6e 63 74 69 6f 6e  to pApi function
1e730 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 44 6f 63  s */..  int nDoc
1e740 73 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  size,           
1e750 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1e760 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 6f 6b  of column in tok
1e770 65 6e 73 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e  ens */..  unsign
1e780 65 64 20 63 68 61 72 20 2a 61 53 65 65 6e 2c 20  ed char *aSeen, 
1e790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
1e7a0 61 79 20 77 69 74 68 20 6f 6e 65 20 65 6c 65 6d  ay with one elem
1e7b0 65 6e 74 20 70 65 72 20 71 75 65 72 79 20 70 68  ent per query ph
1e7c0 72 61 73 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 69  rase */..  int i
1e7d0 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
1e7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1e7f0 6c 75 6d 6e 20 74 6f 20 73 63 6f 72 65 20 2a 2f  lumn to score */
1e800 0d 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  ..  int iPos,   
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e820 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20      /* Starting 
1e830 6f 66 66 73 65 74 20 74 6f 20 73 63 6f 72 65 20  offset to score 
1e840 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e  */..  int nToken
1e850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e860 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 74 6f 6b        /* Max tok
1e870 65 6e 73 20 70 65 72 20 73 6e 69 70 70 65 74 20  ens per snippet 
1e880 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 6e 53 63 6f  */..  int *pnSco
1e890 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  re,             
1e8a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 63        /* OUT: Sc
1e8b0 6f 72 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70  ore */..  int *p
1e8c0 69 50 6f 73 20 20 20 20 20 20 20 20 20 20 20 20  iPos            
1e8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1e8e0 3a 20 41 64 6a 75 73 74 65 64 20 6f 66 66 73 65  : Adjusted offse
1e8f0 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  t */..){..  int 
1e900 72 63 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 20  rc;..  int i;.. 
1e910 20 69 6e 74 20 69 70 20 3d 20 30 3b 0d 0a 20 20   int ip = 0;..  
1e920 69 6e 74 20 69 63 20 3d 20 30 3b 0d 0a 20 20 69  int ic = 0;..  i
1e930 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0d 0a 20 20  nt iOff = 0;..  
1e940 69 6e 74 20 69 46 69 72 73 74 20 3d 20 2d 31 3b  int iFirst = -1;
1e950 0d 0a 20 20 69 6e 74 20 6e 49 6e 73 74 3b 0d 0a  ..  int nInst;..
1e960 20 20 69 6e 74 20 6e 53 63 6f 72 65 20 3d 20 30    int nScore = 0
1e970 3b 0d 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d  ;..  int iLast =
1e980 20 30 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69   0;..  sqlite3_i
1e990 6e 74 36 34 20 69 45 6e 64 20 3d 20 28 73 71 6c  nt64 iEnd = (sql
1e9a0 69 74 65 33 5f 69 6e 74 36 34 29 69 50 6f 73 20  ite3_int64)iPos 
1e9b0 2b 20 6e 54 6f 6b 65 6e 3b 0d 0a 0d 0a 20 20 72  + nToken;....  r
1e9c0 63 20 3d 20 70 41 70 69 2d 3e 78 49 6e 73 74 43  c = pApi->xInstC
1e9d0 6f 75 6e 74 28 70 46 74 73 2c 20 26 6e 49 6e 73  ount(pFts, &nIns
1e9e0 74 29 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t);..  for(i=0; 
1e9f0 69 3c 6e 49 6e 73 74 20 26 26 20 72 63 3d 3d 53  i<nInst && rc==S
1ea00 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0d  QLITE_OK; i++){.
1ea10 0a 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e  .    rc = pApi->
1ea20 78 49 6e 73 74 28 70 46 74 73 2c 20 69 2c 20 26  xInst(pFts, i, &
1ea30 69 70 2c 20 26 69 63 2c 20 26 69 4f 66 66 29 3b  ip, &ic, &iOff);
1ea40 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1ea50 4c 49 54 45 5f 4f 4b 20 26 26 20 69 63 3d 3d 69  LITE_OK && ic==i
1ea60 43 6f 6c 20 26 26 20 69 4f 66 66 3e 3d 69 50 6f  Col && iOff>=iPo
1ea70 73 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29  s && iOff<iEnd )
1ea80 7b 0d 0a 20 20 20 20 20 20 6e 53 63 6f 72 65 20  {..      nScore 
1ea90 2b 3d 20 28 61 53 65 65 6e 5b 69 70 5d 20 3f 20  += (aSeen[ip] ? 
1eaa0 31 20 3a 20 31 30 30 30 29 3b 0d 0a 20 20 20 20  1 : 1000);..    
1eab0 20 20 61 53 65 65 6e 5b 69 70 5d 20 3d 20 31 3b    aSeen[ip] = 1;
1eac0 0d 0a 20 20 20 20 20 20 69 66 28 20 69 46 69 72  ..      if( iFir
1ead0 73 74 3c 30 20 29 20 69 46 69 72 73 74 20 3d 20  st<0 ) iFirst = 
1eae0 69 4f 66 66 3b 0d 0a 20 20 20 20 20 20 69 4c 61  iOff;..      iLa
1eaf0 73 74 20 3d 20 69 4f 66 66 20 2b 20 70 41 70 69  st = iOff + pApi
1eb00 2d 3e 78 50 68 72 61 73 65 53 69 7a 65 28 70 46  ->xPhraseSize(pF
1eb10 74 73 2c 20 69 70 29 3b 0d 0a 20 20 20 20 7d 0d  ts, ip);..    }.
1eb20 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 6e 53 63 6f  .  }....  *pnSco
1eb30 72 65 20 3d 20 6e 53 63 6f 72 65 3b 0d 0a 20 20  re = nScore;..  
1eb40 69 66 28 20 70 69 50 6f 73 20 29 7b 0d 0a 20 20  if( piPos ){..  
1eb50 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1eb60 69 41 64 6a 20 3d 20 69 46 69 72 73 74 20 2d 20  iAdj = iFirst - 
1eb70 28 6e 54 6f 6b 65 6e 20 2d 20 28 69 4c 61 73 74  (nToken - (iLast
1eb80 2d 69 46 69 72 73 74 29 29 20 2f 20 32 3b 0d 0a  -iFirst)) / 2;..
1eb90 20 20 20 20 69 66 28 20 28 69 41 64 6a 2b 6e 54      if( (iAdj+nT
1eba0 6f 6b 65 6e 29 3e 6e 44 6f 63 73 69 7a 65 20 29  oken)>nDocsize )
1ebb0 20 69 41 64 6a 20 3d 20 6e 44 6f 63 73 69 7a 65   iAdj = nDocsize
1ebc0 20 2d 20 6e 54 6f 6b 65 6e 3b 0d 0a 20 20 20 20   - nToken;..    
1ebd0 69 66 28 20 69 41 64 6a 3c 30 20 29 20 69 41 64  if( iAdj<0 ) iAd
1ebe0 6a 20 3d 20 30 3b 0d 0a 20 20 20 20 2a 70 69 50  j = 0;..    *piP
1ebf0 6f 73 20 3d 20 28 69 6e 74 29 69 41 64 6a 3b 0d  os = (int)iAdj;.
1ec00 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e  .  }....  return
1ec10 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a   rc;..}..../*..*
1ec20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
1ec30 75 65 20 69 6e 20 70 56 61 6c 20 69 6e 74 65 72  ue in pVal inter
1ec40 70 72 65 74 65 64 20 61 73 20 75 74 66 2d 38 20  preted as utf-8 
1ec50 74 65 78 74 2e 20 45 78 63 65 70 74 2c 20 69 66  text. Except, if
1ec60 20 70 56 61 6c 20 0d 0a 2a 2a 20 63 6f 6e 74 61   pVal ..** conta
1ec70 69 6e 73 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ins a NULL value
1ec80 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
1ec90 65 72 20 74 6f 20 61 20 73 74 61 74 69 63 20 73  er to a static s
1eca0 74 72 69 6e 67 20 7a 65 72 6f 0d 0a 2a 2a 20 62  tring zero..** b
1ecb0 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 20 69  ytes in length i
1ecc0 6e 73 74 65 61 64 20 6f 66 20 61 20 4e 55 4c 4c  nstead of a NULL
1ecd0 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2f 0d 0a 73   pointer...*/..s
1ece0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1ecf0 20 2a 66 74 73 35 56 61 6c 75 65 54 6f 54 65 78   *fts5ValueToTex
1ed00 74 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t(sqlite3_value 
1ed10 2a 70 56 61 6c 29 7b 0d 0a 20 20 63 6f 6e 73 74  *pVal){..  const
1ed20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 28 63   char *zRet = (c
1ed30 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1ed40 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
1ed50 61 6c 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 7a  al);..  return z
1ed60 52 65 74 20 3f 20 7a 52 65 74 20 3a 20 22 22 3b  Ret ? zRet : "";
1ed70 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6d  ..}..../*..** Im
1ed80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1ed90 73 6e 69 70 70 65 74 28 29 20 66 75 6e 63 74 69  snippet() functi
1eda0 6f 6e 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  on...*/..static 
1edb0 76 6f 69 64 20 66 74 73 35 53 6e 69 70 70 65 74  void fts5Snippet
1edc0 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 63 6f 6e  Function(..  con
1edd0 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e  st Fts5Extension
1ede0 41 70 69 20 2a 70 41 70 69 2c 20 20 20 2f 2a 20  Api *pApi,   /* 
1edf0 41 50 49 20 6f 66 66 65 72 65 64 20 62 79 20 63  API offered by c
1ee00 75 72 72 65 6e 74 20 46 54 53 20 76 65 72 73 69  urrent FTS versi
1ee10 6f 6e 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f 6e  on */..  Fts5Con
1ee20 74 65 78 74 20 2a 70 46 74 73 2c 20 20 20 20 20  text *pFts,     
1ee30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1ee40 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f  t arg to pass to
1ee50 20 70 41 70 69 20 66 75 6e 63 74 69 6f 6e 73 20   pApi functions 
1ee60 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  */..  sqlite3_co
1ee70 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
1ee80 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
1ee90 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20 72   for returning r
1eea0 65 73 75 6c 74 2f 65 72 72 6f 72 20 2a 2f 0d 0a  esult/error */..
1eeb0 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20    int nVal,     
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
1eee0 61 6c 75 65 73 20 69 6e 20 61 70 56 61 6c 5b 5d  alues in apVal[]
1eef0 20 61 72 72 61 79 20 2a 2f 0d 0a 20 20 73 71 6c   array */..  sql
1ef00 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
1ef10 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
1ef20 41 72 72 61 79 20 6f 66 20 74 72 61 69 6c 69 6e  Array of trailin
1ef30 67 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0d 0a  g arguments */..
1ef40 29 7b 0d 0a 20 20 48 69 67 68 6c 69 67 68 74 43  ){..  HighlightC
1ef50 6f 6e 74 65 78 74 20 63 74 78 3b 0d 0a 20 20 69  ontext ctx;..  i
1ef60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ef70 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
1ef80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1ef90 0d 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  ..  int iCol;   
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 2f 2a 20 31 73 74 20 61 72 67 75 6d      /* 1st argum
1efc0 65 6e 74 20 74 6f 20 73 6e 69 70 70 65 74 28 29  ent to snippet()
1efd0 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61   */..  const cha
1efe0 72 20 2a 7a 45 6c 6c 69 70 73 3b 20 20 20 20 20  r *zEllips;     
1eff0 20 20 20 20 20 20 20 2f 2a 20 34 74 68 20 61 72         /* 4th ar
1f000 67 75 6d 65 6e 74 20 74 6f 20 73 6e 69 70 70 65  gument to snippe
1f010 74 28 29 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54  t() */..  int nT
1f020 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  oken;           
1f030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 74 68            /* 5th
1f040 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 6e 69   argument to sni
1f050 70 70 65 74 28 29 20 2a 2f 0d 0a 20 20 69 6e 74  ppet() */..  int
1f060 20 6e 49 6e 73 74 20 3d 20 30 3b 20 20 20 20 20   nInst = 0;     
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f080 4e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e  Number of instan
1f090 63 65 20 6d 61 74 63 68 65 73 20 74 68 69 73 20  ce matches this 
1f0a0 72 6f 77 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 3b  row */..  int i;
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1f0d0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1f0e0 6f 75 67 68 20 69 6e 73 74 61 6e 63 65 73 20 2a  ough instances *
1f0f0 2f 0d 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65  /..  int nPhrase
1f100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f110 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f120 66 20 70 68 72 61 73 65 73 20 69 6e 20 71 75 65  f phrases in que
1f130 72 79 20 2a 2f 0d 0a 20 20 75 6e 73 69 67 6e 65  ry */..  unsigne
1f140 64 20 63 68 61 72 20 2a 61 53 65 65 6e 3b 20 20  d char *aSeen;  
1f150 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
1f160 79 20 6f 66 20 22 73 65 65 6e 20 69 6e 73 74 61  y of "seen insta
1f170 6e 63 65 22 20 66 6c 61 67 73 20 2a 2f 0d 0a 20  nce" flags */.. 
1f180 20 69 6e 74 20 69 42 65 73 74 43 6f 6c 3b 20 20   int iBestCol;  
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 6e 74 61   /* Column conta
1f1b0 69 6e 69 6e 67 20 62 65 73 74 20 73 6e 69 70 70  ining best snipp
1f1c0 65 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 42 65  et */..  int iBe
1f1d0 73 74 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20  stStart = 0;    
1f1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1f1f0 74 20 74 6f 6b 65 6e 20 6f 66 20 62 65 73 74 20  t token of best 
1f200 73 6e 69 70 70 65 74 20 2a 2f 0d 0a 20 20 69 6e  snippet */..  in
1f210 74 20 6e 42 65 73 74 53 63 6f 72 65 20 3d 20 30  t nBestScore = 0
1f220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1f230 20 53 63 6f 72 65 20 6f 66 20 62 65 73 74 20 73   Score of best s
1f240 6e 69 70 70 65 74 20 2a 2f 0d 0a 20 20 69 6e 74  nippet */..  int
1f250 20 6e 43 6f 6c 53 69 7a 65 20 3d 20 30 3b 20 20   nColSize = 0;  
1f260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f270 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 69 42  Total size of iB
1f280 65 73 74 43 6f 6c 20 69 6e 20 74 6f 6b 65 6e 73  estCol in tokens
1f290 20 2a 2f 0d 0a 20 20 46 74 73 35 53 46 69 6e 64   */..  Fts5SFind
1f2a0 65 72 20 73 46 69 6e 64 65 72 3b 20 20 20 20 20  er sFinder;     
1f2b0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1f2c0 6f 20 66 69 6e 64 20 74 68 65 20 62 65 67 69 6e  o find the begin
1f2d0 6e 69 6e 67 73 20 6f 66 20 73 65 6e 74 65 6e 63  nings of sentenc
1f2e0 65 73 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 43 6f  es */..  int nCo
1f2f0 6c 3b 0d 0a 0d 0a 20 20 69 66 28 20 6e 56 61 6c  l;....  if( nVal
1f300 21 3d 35 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73  !=5 ){..    cons
1f310 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
1f320 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
1f330 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
1f340 63 74 69 6f 6e 20 73 6e 69 70 70 65 74 28 29 22  ction snippet()"
1f350 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ;..    sqlite3_r
1f360 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
1f370 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0d 0a 20 20  , zErr, -1);..  
1f380 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 7d 0d 0a    return;..  }..
1f390 0d 0a 20 20 6e 43 6f 6c 20 3d 20 70 41 70 69 2d  ..  nCol = pApi-
1f3a0 3e 78 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28 70 46  >xColumnCount(pF
1f3b0 74 73 29 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 26  ts);..  memset(&
1f3c0 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 48  ctx, 0, sizeof(H
1f3d0 69 67 68 6c 69 67 68 74 43 6f 6e 74 65 78 74 29  ighlightContext)
1f3e0 29 3b 0d 0a 20 20 69 43 6f 6c 20 3d 20 73 71 6c  );..  iCol = sql
1f3f0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
1f400 70 56 61 6c 5b 30 5d 29 3b 0d 0a 20 20 63 74 78  pVal[0]);..  ctx
1f410 2e 7a 4f 70 65 6e 20 3d 20 66 74 73 35 56 61 6c  .zOpen = fts5Val
1f420 75 65 54 6f 54 65 78 74 28 61 70 56 61 6c 5b 31  ueToText(apVal[1
1f430 5d 29 3b 0d 0a 20 20 63 74 78 2e 7a 43 6c 6f 73  ]);..  ctx.zClos
1f440 65 20 3d 20 66 74 73 35 56 61 6c 75 65 54 6f 54  e = fts5ValueToT
1f450 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0d 0a  ext(apVal[2]);..
1f460 20 20 7a 45 6c 6c 69 70 73 20 3d 20 66 74 73 35    zEllips = fts5
1f470 56 61 6c 75 65 54 6f 54 65 78 74 28 61 70 56 61  ValueToText(apVa
1f480 6c 5b 33 5d 29 3b 0d 0a 20 20 6e 54 6f 6b 65 6e  l[3]);..  nToken
1f490 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1f4a0 5f 69 6e 74 28 61 70 56 61 6c 5b 34 5d 29 3b 0d  _int(apVal[4]);.
1f4b0 0a 0d 0a 20 20 69 42 65 73 74 43 6f 6c 20 3d 20  ...  iBestCol = 
1f4c0 28 69 43 6f 6c 3e 3d 30 20 3f 20 69 43 6f 6c 20  (iCol>=0 ? iCol 
1f4d0 3a 20 30 29 3b 0d 0a 20 20 6e 50 68 72 61 73 65  : 0);..  nPhrase
1f4e0 20 3d 20 70 41 70 69 2d 3e 78 50 68 72 61 73 65   = pApi->xPhrase
1f4f0 43 6f 75 6e 74 28 70 46 74 73 29 3b 0d 0a 20 20  Count(pFts);..  
1f500 61 53 65 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f  aSeen = sqlite3_
1f510 6d 61 6c 6c 6f 63 28 6e 50 68 72 61 73 65 29 3b  malloc(nPhrase);
1f520 0d 0a 20 20 69 66 28 20 61 53 65 65 6e 3d 3d 30  ..  if( aSeen==0
1f530 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53 51   ){..    rc = SQ
1f540 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d  LITE_NOMEM;..  }
1f550 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1f560 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 63  TE_OK ){..    rc
1f570 20 3d 20 70 41 70 69 2d 3e 78 49 6e 73 74 43 6f   = pApi->xInstCo
1f580 75 6e 74 28 70 46 74 73 2c 20 26 6e 49 6e 73 74  unt(pFts, &nInst
1f590 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 6d 65 6d  );..  }....  mem
1f5a0 73 65 74 28 26 73 46 69 6e 64 65 72 2c 20 30 2c  set(&sFinder, 0,
1f5b0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 46 69 6e   sizeof(Fts5SFin
1f5c0 64 65 72 29 29 3b 0d 0a 20 20 66 6f 72 28 69 3d  der));..  for(i=
1f5d0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
1f5e0 0d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ..    if( iCol<0
1f5f0 20 7c 7c 20 69 43 6f 6c 3d 3d 69 20 29 7b 0d 0a   || iCol==i ){..
1f600 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 3b 0d        int nDoc;.
1f610 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 73  .      int nDocs
1f620 69 7a 65 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20  ize;..      int 
1f630 69 69 3b 0d 0a 20 20 20 20 20 20 73 46 69 6e 64  ii;..      sFind
1f640 65 72 2e 69 50 6f 73 20 3d 20 30 3b 0d 0a 20 20  er.iPos = 0;..  
1f650 20 20 20 20 73 46 69 6e 64 65 72 2e 6e 46 69 72      sFinder.nFir
1f660 73 74 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 72  st = 0;..      r
1f670 63 20 3d 20 70 41 70 69 2d 3e 78 43 6f 6c 75 6d  c = pApi->xColum
1f680 6e 54 65 78 74 28 70 46 74 73 2c 20 69 2c 20 26  nText(pFts, i, &
1f690 73 46 69 6e 64 65 72 2e 7a 44 6f 63 2c 20 26 6e  sFinder.zDoc, &n
1f6a0 44 6f 63 29 3b 0d 0a 20 20 20 20 20 20 69 66 28  Doc);..      if(
1f6b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f6c0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 72   break;..      r
1f6d0 63 20 3d 20 70 41 70 69 2d 3e 78 54 6f 6b 65 6e  c = pApi->xToken
1f6e0 69 7a 65 28 70 46 74 73 2c 20 0d 0a 20 20 20 20  ize(pFts, ..    
1f6f0 20 20 20 20 20 20 73 46 69 6e 64 65 72 2e 7a 44        sFinder.zD
1f700 6f 63 2c 20 6e 44 6f 63 2c 20 28 76 6f 69 64 2a  oc, nDoc, (void*
1f710 29 26 73 46 69 6e 64 65 72 2c 66 74 73 35 53 65  )&sFinder,fts5Se
1f720 6e 74 65 6e 63 65 46 69 6e 64 65 72 43 62 0d 0a  ntenceFinderCb..
1f730 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20 20        );..      
1f740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f750 4b 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20  K ) break;..    
1f760 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 43 6f    rc = pApi->xCo
1f770 6c 75 6d 6e 53 69 7a 65 28 70 46 74 73 2c 20 69  lumnSize(pFts, i
1f780 2c 20 26 6e 44 6f 63 73 69 7a 65 29 3b 0d 0a 20  , &nDocsize);.. 
1f790 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f7a0 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0d  ITE_OK ) break;.
1f7b0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  ...      for(ii=
1f7c0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
1f7d0 20 26 26 20 69 69 3c 6e 49 6e 73 74 3b 20 69 69   && ii<nInst; ii
1f7e0 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e  ++){..        in
1f7f0 74 20 69 70 2c 20 69 63 2c 20 69 6f 3b 0d 0a 20  t ip, ic, io;.. 
1f800 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 6a 3b         int iAdj;
1f810 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  ..        int nS
1f820 63 6f 72 65 3b 0d 0a 20 20 20 20 20 20 20 20 69  core;..        i
1f830 6e 74 20 6a 6a 3b 0d 0a 0d 0a 20 20 20 20 20 20  nt jj;....      
1f840 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 49 6e    rc = pApi->xIn
1f850 73 74 28 70 46 74 73 2c 20 69 69 2c 20 26 69 70  st(pFts, ii, &ip
1f860 2c 20 26 69 63 2c 20 26 69 6f 29 3b 0d 0a 20 20  , &ic, &io);..  
1f870 20 20 20 20 20 20 69 66 28 20 69 63 21 3d 69 20        if( ic!=i 
1f880 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20  ) continue;..   
1f890 20 20 20 20 20 69 66 28 20 69 6f 3e 6e 44 6f 63       if( io>nDoc
1f8a0 73 69 7a 65 20 29 20 72 63 20 3d 20 46 54 53 35  size ) rc = FTS5
1f8b0 5f 43 4f 52 52 55 50 54 3b 0d 0a 20 20 20 20 20  _CORRUPT;..     
1f8c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f8d0 45 5f 4f 4b 20 29 20 63 6f 6e 74 69 6e 75 65 3b  E_OK ) continue;
1f8e0 0d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ..        memset
1f8f0 28 61 53 65 65 6e 2c 20 30 2c 20 6e 50 68 72 61  (aSeen, 0, nPhra
1f900 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 63  se);..        rc
1f910 20 3d 20 66 74 73 35 53 6e 69 70 70 65 74 53 63   = fts5SnippetSc
1f920 6f 72 65 28 70 41 70 69 2c 20 70 46 74 73 2c 20  ore(pApi, pFts, 
1f930 6e 44 6f 63 73 69 7a 65 2c 20 61 53 65 65 6e 2c  nDocsize, aSeen,
1f940 20 69 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20   i,..           
1f950 20 69 6f 2c 20 6e 54 6f 6b 65 6e 2c 20 26 6e 53   io, nToken, &nS
1f960 63 6f 72 65 2c 20 26 69 41 64 6a 0d 0a 20 20 20  core, &iAdj..   
1f970 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20 20 20       );..       
1f980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f990 4f 4b 20 26 26 20 6e 53 63 6f 72 65 3e 6e 42 65  OK && nScore>nBe
1f9a0 73 74 53 63 6f 72 65 20 29 7b 0d 0a 20 20 20 20  stScore ){..    
1f9b0 20 20 20 20 20 20 6e 42 65 73 74 53 63 6f 72 65        nBestScore
1f9c0 20 3d 20 6e 53 63 6f 72 65 3b 0d 0a 20 20 20 20   = nScore;..    
1f9d0 20 20 20 20 20 20 69 42 65 73 74 43 6f 6c 20 3d        iBestCol =
1f9e0 20 69 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69   i;..          i
1f9f0 42 65 73 74 53 74 61 72 74 20 3d 20 69 41 64 6a  BestStart = iAdj
1fa00 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f  ;..          nCo
1fa10 6c 53 69 7a 65 20 3d 20 6e 44 6f 63 73 69 7a 65  lSize = nDocsize
1fa20 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ;..        }....
1fa30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1fa40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 46 69  SQLITE_OK && sFi
1fa50 6e 64 65 72 2e 6e 46 69 72 73 74 20 26 26 20 6e  nder.nFirst && n
1fa60 44 6f 63 73 69 7a 65 3e 6e 54 6f 6b 65 6e 20 29  Docsize>nToken )
1fa70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
1fa80 28 6a 6a 3d 30 3b 20 6a 6a 3c 28 73 46 69 6e 64  (jj=0; jj<(sFind
1fa90 65 72 2e 6e 46 69 72 73 74 2d 31 29 3b 20 6a 6a  er.nFirst-1); jj
1faa0 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ++){..          
1fab0 20 20 69 66 28 20 73 46 69 6e 64 65 72 2e 61 46    if( sFinder.aF
1fac0 69 72 73 74 5b 6a 6a 2b 31 5d 3e 69 6f 20 29 20  irst[jj+1]>io ) 
1fad0 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20  break;..        
1fae0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1faf0 20 69 66 28 20 73 46 69 6e 64 65 72 2e 61 46 69   if( sFinder.aFi
1fb00 72 73 74 5b 6a 6a 5d 3c 69 6f 20 29 7b 0d 0a 20  rst[jj]<io ){.. 
1fb10 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
1fb20 74 28 61 53 65 65 6e 2c 20 30 2c 20 6e 50 68 72  t(aSeen, 0, nPhr
1fb30 61 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ase);..         
1fb40 20 20 20 72 63 20 3d 20 66 74 73 35 53 6e 69 70     rc = fts5Snip
1fb50 70 65 74 53 63 6f 72 65 28 70 41 70 69 2c 20 70  petScore(pApi, p
1fb60 46 74 73 2c 20 6e 44 6f 63 73 69 7a 65 2c 20 61  Fts, nDocsize, a
1fb70 53 65 65 6e 2c 20 69 2c 20 0d 0a 20 20 20 20 20  Seen, i, ..     
1fb80 20 20 20 20 20 20 20 20 20 73 46 69 6e 64 65 72           sFinder
1fb90 2e 61 46 69 72 73 74 5b 6a 6a 5d 2c 20 6e 54 6f  .aFirst[jj], nTo
1fba0 6b 65 6e 2c 20 26 6e 53 63 6f 72 65 2c 20 30 0d  ken, &nScore, 0.
1fbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0d  .            );.
1fbc0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ...            n
1fbd0 53 63 6f 72 65 20 2b 3d 20 28 73 46 69 6e 64 65  Score += (sFinde
1fbe0 72 2e 61 46 69 72 73 74 5b 6a 6a 5d 3d 3d 30 20  r.aFirst[jj]==0 
1fbf0 3f 20 31 32 30 20 3a 20 31 30 30 29 3b 0d 0a 20  ? 120 : 100);.. 
1fc00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1fc10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1fc20 6e 53 63 6f 72 65 3e 6e 42 65 73 74 53 63 6f 72  nScore>nBestScor
1fc30 65 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  e ){..          
1fc40 20 20 20 20 6e 42 65 73 74 53 63 6f 72 65 20 3d      nBestScore =
1fc50 20 6e 53 63 6f 72 65 3b 0d 0a 20 20 20 20 20 20   nScore;..      
1fc60 20 20 20 20 20 20 20 20 69 42 65 73 74 43 6f 6c          iBestCol
1fc70 20 3d 20 69 3b 0d 0a 20 20 20 20 20 20 20 20 20   = i;..         
1fc80 20 20 20 20 20 69 42 65 73 74 53 74 61 72 74 20       iBestStart 
1fc90 3d 20 73 46 69 6e 64 65 72 2e 61 46 69 72 73 74  = sFinder.aFirst
1fca0 5b 6a 6a 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20  [jj];..         
1fcb0 20 20 20 20 20 6e 43 6f 6c 53 69 7a 65 20 3d 20       nColSize = 
1fcc0 6e 44 6f 63 73 69 7a 65 3b 0d 0a 20 20 20 20 20  nDocsize;..     
1fcd0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1fce0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1fcf0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1fd00 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72  ..  }....  if( r
1fd10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
1fd20 0a 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e  .    rc = pApi->
1fd30 78 43 6f 6c 75 6d 6e 54 65 78 74 28 70 46 74 73  xColumnText(pFts
1fd40 2c 20 69 42 65 73 74 43 6f 6c 2c 20 26 63 74 78  , iBestCol, &ctx
1fd50 2e 7a 49 6e 2c 20 26 63 74 78 2e 6e 49 6e 29 3b  .zIn, &ctx.nIn);
1fd60 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d  ..  }..  if( rc=
1fd70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 43  =SQLITE_OK && nC
1fd80 6f 6c 53 69 7a 65 3d 3d 30 20 29 7b 0d 0a 20 20  olSize==0 ){..  
1fd90 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 43 6f    rc = pApi->xCo
1fda0 6c 75 6d 6e 53 69 7a 65 28 70 46 74 73 2c 20 69  lumnSize(pFts, i
1fdb0 42 65 73 74 43 6f 6c 2c 20 26 6e 43 6f 6c 53 69  BestCol, &nColSi
1fdc0 7a 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28  ze);..  }..  if(
1fdd0 20 63 74 78 2e 7a 49 6e 20 29 7b 0d 0a 20 20 20   ctx.zIn ){..   
1fde0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fdf0 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20  OK ){..      rc 
1fe00 3d 20 66 74 73 35 43 49 6e 73 74 49 74 65 72 49  = fts5CInstIterI
1fe10 6e 69 74 28 70 41 70 69 2c 20 70 46 74 73 2c 20  nit(pApi, pFts, 
1fe20 69 42 65 73 74 43 6f 6c 2c 20 26 63 74 78 2e 69  iBestCol, &ctx.i
1fe30 74 65 72 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  ter);..    }....
1fe40 20 20 20 20 63 74 78 2e 69 52 61 6e 67 65 53 74      ctx.iRangeSt
1fe50 61 72 74 20 3d 20 69 42 65 73 74 53 74 61 72 74  art = iBestStart
1fe60 3b 0d 0a 20 20 20 20 63 74 78 2e 69 52 61 6e 67  ;..    ctx.iRang
1fe70 65 45 6e 64 20 3d 20 69 42 65 73 74 53 74 61 72  eEnd = iBestStar
1fe80 74 20 2b 20 6e 54 6f 6b 65 6e 20 2d 20 31 3b 0d  t + nToken - 1;.
1fe90 0a 0d 0a 20 20 20 20 69 66 28 20 69 42 65 73 74  ...    if( iBest
1fea0 53 74 61 72 74 3e 30 20 29 7b 0d 0a 20 20 20 20  Start>0 ){..    
1feb0 20 20 66 74 73 35 48 69 67 68 6c 69 67 68 74 41    fts5HighlightA
1fec0 70 70 65 6e 64 28 26 72 63 2c 20 26 63 74 78 2c  ppend(&rc, &ctx,
1fed0 20 7a 45 6c 6c 69 70 73 2c 20 2d 31 29 3b 0d 0a   zEllips, -1);..
1fee0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20      }....    /* 
1fef0 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
1ff00 20 63 74 78 2e 69 74 65 72 20 73 6f 20 74 68 61   ctx.iter so tha
1ff10 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
1ff20 68 65 20 66 69 72 73 74 20 63 6f 61 6c 65 73 63  he first coalesc
1ff30 65 64 0d 0a 20 20 20 20 2a 2a 20 70 68 72 61 73  ed..    ** phras
1ff40 65 20 69 6e 73 74 61 6e 63 65 20 61 74 20 6f 72  e instance at or
1ff50 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 6f 73 69 74   following posit
1ff60 69 6f 6e 20 69 42 65 73 74 53 74 61 72 74 2e 20  ion iBestStart. 
1ff70 2a 2f 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 63  */..    while( c
1ff80 74 78 2e 69 74 65 72 2e 69 53 74 61 72 74 3e 3d  tx.iter.iStart>=
1ff90 30 20 26 26 20 63 74 78 2e 69 74 65 72 2e 69 53  0 && ctx.iter.iS
1ffa0 74 61 72 74 3c 69 42 65 73 74 53 74 61 72 74 20  tart<iBestStart 
1ffb0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1ffc0 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20   ){..      rc = 
1ffd0 66 74 73 35 43 49 6e 73 74 49 74 65 72 4e 65 78  fts5CInstIterNex
1ffe0 74 28 26 63 74 78 2e 69 74 65 72 29 3b 0d 0a 20  t(&ctx.iter);.. 
1fff0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20     }....    if( 
20000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20010 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 41 70  ..      rc = pAp
20020 69 2d 3e 78 54 6f 6b 65 6e 69 7a 65 28 70 46 74  i->xTokenize(pFt
20030 73 2c 20 63 74 78 2e 7a 49 6e 2c 20 63 74 78 2e  s, ctx.zIn, ctx.
20040 6e 49 6e 2c 20 28 76 6f 69 64 2a 29 26 63 74 78  nIn, (void*)&ctx
20050 2c 66 74 73 35 48 69 67 68 6c 69 67 68 74 43 62  ,fts5HighlightCb
20060 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69  );..    }..    i
20070 66 28 20 63 74 78 2e 69 52 61 6e 67 65 45 6e 64  f( ctx.iRangeEnd
20080 3e 3d 28 6e 43 6f 6c 53 69 7a 65 2d 31 29 20 29  >=(nColSize-1) )
20090 7b 0d 0a 20 20 20 20 20 20 66 74 73 35 48 69 67  {..      fts5Hig
200a0 68 6c 69 67 68 74 41 70 70 65 6e 64 28 26 72 63  hlightAppend(&rc
200b0 2c 20 26 63 74 78 2c 20 26 63 74 78 2e 7a 49 6e  , &ctx, &ctx.zIn
200c0 5b 63 74 78 2e 69 4f 66 66 5d 2c 20 63 74 78 2e  [ctx.iOff], ctx.
200d0 6e 49 6e 20 2d 20 63 74 78 2e 69 4f 66 66 29 3b  nIn - ctx.iOff);
200e0 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20  ..    }else{..  
200f0 20 20 20 20 66 74 73 35 48 69 67 68 6c 69 67 68      fts5Highligh
20100 74 41 70 70 65 6e 64 28 26 72 63 2c 20 26 63 74  tAppend(&rc, &ct
20110 78 2c 20 7a 45 6c 6c 69 70 73 2c 20 2d 31 29 3b  x, zEllips, -1);
20120 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20  ..    }..  }..  
20130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20140 4b 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65  K ){..    sqlite
20150 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
20160 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  tx, (const char*
20170 29 63 74 78 2e 7a 4f 75 74 2c 20 2d 31 2c 20 53  )ctx.zOut, -1, S
20180 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
20190 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  ;..  }else{..   
201a0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
201b0 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c  error_code(pCtx,
201c0 20 72 63 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71   rc);..  }..  sq
201d0 6c 69 74 65 33 5f 66 72 65 65 28 63 74 78 2e 7a  lite3_free(ctx.z
201e0 4f 75 74 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33  Out);..  sqlite3
201f0 5f 66 72 65 65 28 61 53 65 65 6e 29 3b 0d 0a 20  _free(aSeen);.. 
20200 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 46   sqlite3_free(sF
20210 69 6e 64 65 72 2e 61 46 69 72 73 74 29 3b 0d 0a  inder.aFirst);..
20220 7d 0d 0a 0d 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d  **************/.
20270 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 69  .../*..** The fi
20280 72 73 74 20 74 69 6d 65 20 74 68 65 20 62 6d 32  rst time the bm2
20290 35 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  5() function is 
202a0 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 71 75 65  called for a que
202b0 72 79 2c 20 61 6e 20 69 6e 73 74 61 6e 63 65 0d  ry, an instance.
202c0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
202d0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
202e0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
202f0 70 6f 70 75 6c 61 74 65 64 2e 0d 0a 2a 2f 0d 0a  populated...*/..
20300 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
20310 74 73 35 42 6d 32 35 44 61 74 61 20 46 74 73 35  ts5Bm25Data Fts5
20320 42 6d 32 35 44 61 74 61 3b 0d 0a 73 74 72 75 63  Bm25Data;..struc
20330 74 20 46 74 73 35 42 6d 32 35 44 61 74 61 20 7b  t Fts5Bm25Data {
20340 0d 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65 3b  ..  int nPhrase;
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20360 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20370 20 70 68 72 61 73 65 73 20 69 6e 20 71 75 65 72   phrases in quer
20380 79 20 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 61  y */..  double a
20390 76 67 64 6c 3b 20 20 20 20 20 20 20 20 20 20 20  vgdl;           
203a0 20 20 20 20 20 20 20 20 2f 2a 20 41 76 65 72 61          /* Avera
203b0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  ge number of tok
203c0 65 6e 73 20 69 6e 20 65 61 63 68 20 72 6f 77 20  ens in each row 
203d0 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 2a 61 49  */..  double *aI
203e0 44 46 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  DF;             
203f0 20 20 20 20 20 20 2f 2a 20 49 44 46 20 66 6f 72        /* IDF for
20400 20 65 61 63 68 20 70 68 72 61 73 65 20 2a 2f 0d   each phrase */.
20410 0a 20 20 64 6f 75 62 6c 65 20 2a 61 46 72 65 71  .  double *aFreq
20420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20430 20 20 20 2f 2a 20 41 72 72 61 79 20 75 73 65 64     /* Array used
20440 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 70 68   to calculate ph
20450 72 61 73 65 20 66 72 65 71 2e 20 2a 2f 0d 0a 7d  rase freq. */..}
20460 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 61 6c 6c  ;..../*..** Call
20470 62 61 63 6b 20 75 73 65 64 20 62 79 20 66 74 73  back used by fts
20480 35 42 6d 32 35 47 65 74 44 61 74 61 28 29 20 74  5Bm25GetData() t
20490 6f 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  o count the numb
204a0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
204b0 65 0d 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 74 63  e..** table matc
204c0 68 65 64 20 62 79 20 65 61 63 68 20 69 6e 64 69  hed by each indi
204d0 76 69 64 75 61 6c 20 70 68 72 61 73 65 20 77 69  vidual phrase wi
204e0 74 68 69 6e 20 74 68 65 20 71 75 65 72 79 2e 0d  thin the query..
204f0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
20500 66 74 73 35 43 6f 75 6e 74 43 62 28 0d 0a 20 20  fts5CountCb(..  
20510 63 6f 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73  const Fts5Extens
20520 69 6f 6e 41 70 69 20 2a 70 41 70 69 2c 20 0d 0a  ionApi *pApi, ..
20530 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70    Fts5Context *p
20540 46 74 73 2c 0d 0a 20 20 76 6f 69 64 20 2a 70 55  Fts,..  void *pU
20550 73 65 72 44 61 74 61 20 20 20 20 20 20 20 20 20  serData         
20560 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
20570 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e  er to sqlite3_in
20580 74 36 34 20 76 61 72 69 61 62 6c 65 20 2a 2f 0d  t64 variable */.
20590 0a 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69  .){..  sqlite3_i
205a0 6e 74 36 34 20 2a 70 6e 20 3d 20 28 73 71 6c 69  nt64 *pn = (sqli
205b0 74 65 33 5f 69 6e 74 36 34 2a 29 70 55 73 65 72  te3_int64*)pUser
205c0 44 61 74 61 3b 0d 0a 20 20 55 4e 55 53 45 44 5f  Data;..  UNUSED_
205d0 50 41 52 41 4d 32 28 70 41 70 69 2c 20 70 46 74  PARAM2(pApi, pFt
205e0 73 29 3b 0d 0a 20 20 28 2a 70 6e 29 2b 2b 3b 0d  s);..  (*pn)++;.
205f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20600 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a  _OK;..}..../*..*
20610 2a 20 53 65 74 20 2a 70 70 44 61 74 61 20 74 6f  * Set *ppData to
20620 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 46 74   point to the Ft
20630 73 35 42 6d 32 35 44 61 74 61 20 6f 62 6a 65 63  s5Bm25Data objec
20640 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
20650 74 20 71 75 65 72 79 2e 20 0d 0a 2a 2a 20 49 66  t query. ..** If
20660 20 74 68 65 20 6f 62 6a 65 63 74 20 68 61 73 20   the object has 
20670 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
20680 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
20690 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
206a0 65 20 69 74 0d 0a 2a 2a 20 6e 6f 77 2e 0d 0a 2a  e it..** now...*
206b0 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
206c0 73 35 42 6d 32 35 47 65 74 44 61 74 61 28 0d 0a  s5Bm25GetData(..
206d0 20 20 63 6f 6e 73 74 20 46 74 73 35 45 78 74 65    const Fts5Exte
206e0 6e 73 69 6f 6e 41 70 69 20 2a 70 41 70 69 2c 20  nsionApi *pApi, 
206f0 0d 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20  ..  Fts5Context 
20700 2a 70 46 74 73 2c 0d 0a 20 20 46 74 73 35 42 6d  *pFts,..  Fts5Bm
20710 32 35 44 61 74 61 20 2a 2a 70 70 44 61 74 61 20  25Data **ppData 
20720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
20730 3a 20 62 6d 32 35 2d 64 61 74 61 20 6f 62 6a 65  : bm25-data obje
20740 63 74 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  ct for this quer
20750 79 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  y */..){..  int 
20760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20780 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20  eturn code */.. 
20790 20 46 74 73 35 42 6d 32 35 44 61 74 61 20 2a 70   Fts5Bm25Data *p
207a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
207b0 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72 65   /* Object to re
207c0 74 75 72 6e 20 2a 2f 0d 0a 0d 0a 20 20 70 20 3d  turn */....  p =
207d0 20 70 41 70 69 2d 3e 78 47 65 74 41 75 78 64 61   pApi->xGetAuxda
207e0 74 61 28 70 46 74 73 2c 20 30 29 3b 0d 0a 20 20  ta(pFts, 0);..  
207f0 69 66 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 20 20  if( p==0 ){..   
20800 20 69 6e 74 20 6e 50 68 72 61 73 65 3b 20 20 20   int nPhrase;   
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20820 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 68 72 61  * Number of phra
20830 73 65 73 20 69 6e 20 71 75 65 72 79 20 2a 2f 0d  ses in query */.
20840 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
20850 36 34 20 6e 52 6f 77 20 3d 20 30 3b 20 20 20 20  64 nRow = 0;    
20860 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20870 72 6f 77 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f  rows in table */
20880 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ..    sqlite3_in
20890 74 36 34 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20  t64 nToken = 0; 
208a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
208b0 20 74 6f 6b 65 6e 73 20 69 6e 20 74 61 62 6c 65   tokens in table
208c0 20 2a 2f 0d 0a 20 20 20 20 73 71 6c 69 74 65 33   */..    sqlite3
208d0 5f 69 6e 74 36 34 20 6e 42 79 74 65 3b 20 20 20  _int64 nByte;   
208e0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
208f0 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
20900 63 61 74 65 20 2a 2f 0d 0a 20 20 20 20 69 6e 74  cate */..    int
20910 20 69 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 41 6c   i;....    /* Al
20920 6c 6f 63 61 74 65 20 74 68 65 20 46 74 73 35 42  locate the Fts5B
20930 6d 32 35 44 61 74 61 20 6f 62 6a 65 63 74 20 2a  m25Data object *
20940 2f 0d 0a 20 20 20 20 6e 50 68 72 61 73 65 20 3d  /..    nPhrase =
20950 20 70 41 70 69 2d 3e 78 50 68 72 61 73 65 43 6f   pApi->xPhraseCo
20960 75 6e 74 28 70 46 74 73 29 3b 0d 0a 20 20 20 20  unt(pFts);..    
20970 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
20980 74 73 35 42 6d 32 35 44 61 74 61 29 20 2b 20 6e  ts5Bm25Data) + n
20990 50 68 72 61 73 65 2a 32 2a 73 69 7a 65 6f 66 28  Phrase*2*sizeof(
209a0 64 6f 75 62 6c 65 29 3b 0d 0a 20 20 20 20 70 20  double);..    p 
209b0 3d 20 28 46 74 73 35 42 6d 32 35 44 61 74 61 2a  = (Fts5Bm25Data*
209c0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36  )sqlite3_malloc6
209d0 34 28 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 69  4(nByte);..    i
209e0 66 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  f( p==0 ){..    
209f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
20a00 4d 45 4d 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b  MEM;..    }else{
20a10 0d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ..      memset(p
20a20 2c 20 30 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79  , 0, (size_t)nBy
20a30 74 65 29 3b 0d 0a 20 20 20 20 20 20 70 2d 3e 6e  te);..      p->n
20a40 50 68 72 61 73 65 20 3d 20 6e 50 68 72 61 73 65  Phrase = nPhrase
20a50 3b 0d 0a 20 20 20 20 20 20 70 2d 3e 61 49 44 46  ;..      p->aIDF
20a60 20 3d 20 28 64 6f 75 62 6c 65 2a 29 26 70 5b 31   = (double*)&p[1
20a70 5d 3b 0d 0a 20 20 20 20 20 20 70 2d 3e 61 46 72  ];..      p->aFr
20a80 65 71 20 3d 20 26 70 2d 3e 61 49 44 46 5b 6e 50  eq = &p->aIDF[nP
20a90 68 72 61 73 65 5d 3b 0d 0a 20 20 20 20 7d 0d 0a  hrase];..    }..
20aa0 0d 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61  ..    /* Calcula
20ab0 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 64  te the average d
20ac0 6f 63 75 6d 65 6e 74 20 6c 65 6e 67 74 68 20 66  ocument length f
20ad0 6f 72 20 74 68 69 73 20 46 54 53 35 20 74 61 62  or this FTS5 tab
20ae0 6c 65 20 2a 2f 0d 0a 20 20 20 20 69 66 28 20 72  le */..    if( r
20af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
20b00 63 20 3d 20 70 41 70 69 2d 3e 78 52 6f 77 43 6f  c = pApi->xRowCo
20b10 75 6e 74 28 70 46 74 73 2c 20 26 6e 52 6f 77 29  unt(pFts, &nRow)
20b20 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ;..    assert( r
20b30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
20b40 6e 52 6f 77 3e 30 20 29 3b 0d 0a 20 20 20 20 69  nRow>0 );..    i
20b50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20b60 20 29 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 43   ) rc = pApi->xC
20b70 6f 6c 75 6d 6e 54 6f 74 61 6c 53 69 7a 65 28 70  olumnTotalSize(p
20b80 46 74 73 2c 20 2d 31 2c 20 26 6e 54 6f 6b 65 6e  Fts, -1, &nToken
20b90 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
20ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 61  SQLITE_OK ) p->a
20bb0 76 67 64 6c 20 3d 20 28 64 6f 75 62 6c 65 29 6e  vgdl = (double)n
20bc0 54 6f 6b 65 6e 20 20 2f 20 28 64 6f 75 62 6c 65  Token  / (double
20bd0 29 6e 52 6f 77 3b 0d 0a 0d 0a 20 20 20 20 2f 2a  )nRow;....    /*
20be0 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 20 49 44   Calculate an ID
20bf0 46 20 66 6f 72 20 65 61 63 68 20 70 68 72 61 73  F for each phras
20c00 65 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 2a  e in the query *
20c10 2f 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  /..    for(i=0; 
20c20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20c30 20 69 3c 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29   i<nPhrase; i++)
20c40 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  {..      sqlite3
20c50 5f 69 6e 74 36 34 20 6e 48 69 74 20 3d 20 30 3b  _int64 nHit = 0;
20c60 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 41 70  ..      rc = pAp
20c70 69 2d 3e 78 51 75 65 72 79 50 68 72 61 73 65 28  i->xQueryPhrase(
20c80 70 46 74 73 2c 20 69 2c 20 28 76 6f 69 64 2a 29  pFts, i, (void*)
20c90 26 6e 48 69 74 2c 20 66 74 73 35 43 6f 75 6e 74  &nHit, fts5Count
20ca0 43 62 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20  Cb);..      if( 
20cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20cc0 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c  ..        /* Cal
20cd0 63 75 6c 61 74 65 20 74 68 65 20 49 44 46 20 28  culate the IDF (
20ce0 49 6e 76 65 72 73 65 20 44 6f 63 75 6d 65 6e 74  Inverse Document
20cf0 20 46 72 65 71 75 65 6e 63 79 29 20 66 6f 72 20   Frequency) for 
20d00 70 68 72 61 73 65 20 69 2e 0d 0a 20 20 20 20 20  phrase i...     
20d10 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f     ** This is do
20d20 6e 65 20 75 73 69 6e 67 20 74 68 65 20 73 74 61  ne using the sta
20d30 6e 64 61 72 64 20 42 4d 32 35 20 66 6f 72 6d 75  ndard BM25 formu
20d40 6c 61 20 61 73 20 66 6f 75 6e 64 20 6f 6e 20 77  la as found on w
20d50 69 6b 69 70 65 64 69 61 3a 0d 0a 20 20 20 20 20  ikipedia:..     
20d60 20 20 20 2a 2a 0d 0a 20 20 20 20 20 20 20 20 2a     **..        *
20d70 2a 20 20 20 49 44 46 20 3d 20 6c 6f 67 28 20 28  *   IDF = log( (
20d80 4e 20 2d 20 6e 48 69 74 20 2b 20 30 2e 35 29 20  N - nHit + 0.5) 
20d90 2f 20 28 6e 48 69 74 20 2b 20 30 2e 35 29 20 29  / (nHit + 0.5) )
20da0 0d 0a 20 20 20 20 20 20 20 20 2a 2a 0d 0a 20 20  ..        **..  
20db0 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 22        ** where "
20dc0 4e 22 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  N" is the total 
20dd0 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65  number of docume
20de0 6e 74 73 20 69 6e 20 74 68 65 20 73 65 74 20 61  nts in the set a
20df0 6e 64 20 6e 48 69 74 0d 0a 20 20 20 20 20 20 20  nd nHit..       
20e00 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65   ** is the numbe
20e10 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61  r that contain a
20e20 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73 74  t least one inst
20e30 61 6e 63 65 20 6f 66 20 74 68 65 20 70 68 72 61  ance of the phra
20e40 73 65 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  se..        ** u
20e50 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  nder considerati
20e60 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2a 0d  on...        **.
20e70 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
20e80 70 72 6f 62 6c 65 6d 20 77 69 74 68 20 74 68 69  problem with thi
20e90 73 20 69 73 20 74 68 61 74 20 69 66 20 28 4e 20  s is that if (N 
20ea0 3c 20 32 2a 6e 48 69 74 29 2c 20 74 68 65 20 49  < 2*nHit), the I
20eb0 44 46 20 69 73 20 0d 0a 20 20 20 20 20 20 20 20  DF is ..        
20ec0 2a 2a 20 6e 65 67 61 74 69 76 65 2e 20 57 68 69  ** negative. Whi
20ed0 63 68 20 69 73 20 75 6e 64 65 73 69 72 61 62 6c  ch is undesirabl
20ee0 65 2e 20 53 6f 20 74 68 65 20 6d 69 6d 69 6d 75  e. So the mimimu
20ef0 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 49 44 46 20  m allowable IDF 
20f00 69 73 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is..        ** (
20f10 31 65 2d 36 29 20 2d 20 72 6f 75 67 68 6c 79 20  1e-6) - roughly 
20f20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
20f30 72 6d 20 74 68 61 74 20 61 70 70 65 61 72 73 20  rm that appears 
20f40 69 6e 20 6a 75 73 74 20 6f 76 65 72 0d 0a 20 20  in just over..  
20f50 20 20 20 20 20 20 2a 2a 20 68 61 6c 66 20 6f 66        ** half of
20f60 20 73 65 74 20 6f 66 20 35 2c 30 30 30 2c 30 30   set of 5,000,00
20f70 30 20 64 6f 63 75 6d 65 6e 74 73 2e 20 20 2a 2f  0 documents.  */
20f80 0d 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  ..        double
20f90 20 69 64 66 20 3d 20 6c 6f 67 28 20 28 6e 52 6f   idf = log( (nRo
20fa0 77 20 2d 20 6e 48 69 74 20 2b 20 30 2e 35 29 20  w - nHit + 0.5) 
20fb0 2f 20 28 6e 48 69 74 20 2b 20 30 2e 35 29 20 29  / (nHit + 0.5) )
20fc0 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ;..        if( i
20fd0 64 66 3c 3d 30 2e 30 20 29 20 69 64 66 20 3d 20  df<=0.0 ) idf = 
20fe0 31 65 2d 36 3b 0d 0a 20 20 20 20 20 20 20 20 70  1e-6;..        p
20ff0 2d 3e 61 49 44 46 5b 69 5d 20 3d 20 69 64 66 3b  ->aIDF[i] = idf;
21000 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
21010 0d 0a 0d 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ....    if( rc!=
21020 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
21030 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21040 28 70 29 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b  (p);..    }else{
21050 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 41 70  ..      rc = pAp
21060 69 2d 3e 78 53 65 74 41 75 78 64 61 74 61 28 70  i->xSetAuxdata(p
21070 46 74 73 2c 20 70 2c 20 73 71 6c 69 74 65 33 5f  Fts, p, sqlite3_
21080 66 72 65 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20  free);..    }.. 
21090 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
210a0 45 5f 4f 4b 20 29 20 70 20 3d 20 30 3b 0d 0a 20  E_OK ) p = 0;.. 
210b0 20 7d 0d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20   }..  *ppData = 
210c0 70 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p;..  return rc;
210d0 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6d  ..}..../*..** Im
210e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
210f0 62 6d 32 35 28 29 20 66 75 6e 63 74 69 6f 6e 2e  bm25() function.
21100 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69  ..*/..static voi
21110 64 20 66 74 73 35 42 6d 32 35 46 75 6e 63 74 69  d fts5Bm25Functi
21120 6f 6e 28 0d 0a 20 20 63 6f 6e 73 74 20 46 74 73  on(..  const Fts
21130 35 45 78 74 65 6e 73 69 6f 6e 41 70 69 20 2a 70  5ExtensionApi *p
21140 41 70 69 2c 20 20 20 2f 2a 20 41 50 49 20 6f 66  Api,   /* API of
21150 66 65 72 65 64 20 62 79 20 63 75 72 72 65 6e 74  fered by current
21160 20 46 54 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0d   FTS version */.
21170 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a  .  Fts5Context *
21180 70 46 74 73 2c 20 20 20 20 20 20 20 20 20 20 20  pFts,           
21190 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
211a0 74 6f 20 70 61 73 73 20 74 6f 20 70 41 70 69 20  to pass to pApi 
211b0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0d 0a 20 20  functions */..  
211c0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
211d0 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
211e0 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 72  /* Context for r
211f0 65 74 75 72 6e 69 6e 67 20 72 65 73 75 6c 74 2f  eturning result/
21200 65 72 72 6f 72 20 2a 2f 0d 0a 20 20 69 6e 74 20  error */..  int 
21210 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nVal,           
21220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21230 75 6d 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20  umber of values 
21240 69 6e 20 61 70 56 61 6c 5b 5d 20 61 72 72 61 79  in apVal[] array
21250 20 2a 2f 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76   */..  sqlite3_v
21260 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
21270 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
21280 6f 66 20 74 72 61 69 6c 69 6e 67 20 61 72 67 75  of trailing argu
21290 6d 65 6e 74 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 20  ments */..){..  
212a0 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 6b 31 20  const double k1 
212b0 3d 20 31 2e 32 3b 20 20 20 20 20 20 20 20 20 20  = 1.2;          
212c0 2f 2a 20 43 6f 6e 73 74 61 6e 74 20 22 6b 31 22  /* Constant "k1"
212d0 20 66 72 6f 6d 20 42 4d 32 35 20 66 6f 72 6d 75   from BM25 formu
212e0 6c 61 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 64  la */..  const d
212f0 6f 75 62 6c 65 20 62 20 3d 20 30 2e 37 35 3b 20  ouble b = 0.75; 
21300 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73           /* Cons
21310 74 61 6e 74 20 22 62 22 20 66 72 6f 6d 20 42 4d  tant "b" from BM
21320 32 35 20 66 6f 72 6d 75 6c 61 20 2a 2f 0d 0a 20  25 formula */.. 
21330 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21340 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
21350 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a   /* Error code *
21360 2f 0d 0a 20 20 64 6f 75 62 6c 65 20 73 63 6f 72  /..  double scor
21370 65 20 3d 20 30 2e 30 3b 20 20 20 20 20 20 20 20  e = 0.0;        
21380 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63       /* SQL func
21390 74 69 6f 6e 20 72 65 74 75 72 6e 20 76 61 6c 75  tion return valu
213a0 65 20 2a 2f 0d 0a 20 20 46 74 73 35 42 6d 32 35  e */..  Fts5Bm25
213b0 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20  Data *pData;    
213c0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
213d0 73 20 61 6c 6c 6f 63 61 74 65 64 2f 63 61 6c 63  s allocated/calc
213e0 75 6c 61 74 65 64 20 6f 6e 63 65 20 6f 6e 6c 79  ulated once only
213f0 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 3b 20 20 20   */..  int i;   
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21410 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
21420 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0d 0a  or variable */..
21430 20 20 69 6e 74 20 6e 49 6e 73 74 20 3d 20 30 3b    int nInst = 0;
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21450 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
21460 6e 65 64 20 62 79 20 78 49 6e 73 74 43 6f 75 6e  ned by xInstCoun
21470 74 28 29 20 2a 2f 0d 0a 20 20 64 6f 75 62 6c 65  t() */..  double
21480 20 44 20 3d 20 30 2e 30 3b 20 20 20 20 20 20 20   D = 0.0;       
21490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
214a0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
214b0 65 6e 73 20 69 6e 20 72 6f 77 20 2a 2f 0d 0a 20  ens in row */.. 
214c0 20 64 6f 75 62 6c 65 20 2a 61 46 72 65 71 20 3d   double *aFreq =
214d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
214e0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 68 72   /* Array of phr
214f0 61 73 65 20 66 72 65 71 2e 20 66 6f 72 20 63 75  ase freq. for cu
21500 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0d 0a 0d 0a  rrent row */....
21510 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
21520 68 65 20 70 68 72 61 73 65 20 66 72 65 71 75 65  he phrase freque
21530 6e 63 79 20 28 73 79 6d 62 6f 6c 20 22 66 28 71  ncy (symbol "f(q
21540 69 2c 44 29 22 20 69 6e 20 74 68 65 20 64 6f 63  i,D)" in the doc
21550 75 6d 65 6e 74 61 74 69 6f 6e 29 0d 0a 20 20 2a  umentation)..  *
21560 2a 20 66 6f 72 20 65 61 63 68 20 70 68 72 61 73  * for each phras
21570 65 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 66  e in the query f
21580 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
21590 6f 77 2e 20 2a 2f 0d 0a 20 20 72 63 20 3d 20 66  ow. */..  rc = f
215a0 74 73 35 42 6d 32 35 47 65 74 44 61 74 61 28 70  ts5Bm25GetData(p
215b0 41 70 69 2c 20 70 46 74 73 2c 20 26 70 44 61 74  Api, pFts, &pDat
215c0 61 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  a);..  if( rc==S
215d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
215e0 20 61 46 72 65 71 20 3d 20 70 44 61 74 61 2d 3e   aFreq = pData->
215f0 61 46 72 65 71 3b 0d 0a 20 20 20 20 6d 65 6d 73  aFreq;..    mems
21600 65 74 28 61 46 72 65 71 2c 20 30 2c 20 73 69 7a  et(aFreq, 0, siz
21610 65 6f 66 28 64 6f 75 62 6c 65 29 20 2a 20 70 44  eof(double) * pD
21620 61 74 61 2d 3e 6e 50 68 72 61 73 65 29 3b 0d 0a  ata->nPhrase);..
21630 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78      rc = pApi->x
21640 49 6e 73 74 43 6f 75 6e 74 28 70 46 74 73 2c 20  InstCount(pFts, 
21650 26 6e 49 6e 73 74 29 3b 0d 0a 20 20 7d 0d 0a 20  &nInst);..  }.. 
21660 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
21670 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 49 6e  LITE_OK && i<nIn
21680 73 74 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69  st; i++){..    i
21690 6e 74 20 69 70 3b 20 69 6e 74 20 69 63 3b 20 69  nt ip; int ic; i
216a0 6e 74 20 69 6f 3b 0d 0a 20 20 20 20 72 63 20 3d  nt io;..    rc =
216b0 20 70 41 70 69 2d 3e 78 49 6e 73 74 28 70 46 74   pApi->xInst(pFt
216c0 73 2c 20 69 2c 20 26 69 70 2c 20 26 69 63 2c 20  s, i, &ip, &ic, 
216d0 26 69 6f 29 3b 0d 0a 20 20 20 20 69 66 28 20 72  &io);..    if( r
216e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
216f0 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 77 20  .      double w 
21700 3d 20 28 6e 56 61 6c 20 3e 20 69 63 29 20 3f 20  = (nVal > ic) ? 
21710 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
21720 75 62 6c 65 28 61 70 56 61 6c 5b 69 63 5d 29 20  uble(apVal[ic]) 
21730 3a 20 31 2e 30 3b 0d 0a 20 20 20 20 20 20 61 46  : 1.0;..      aF
21740 72 65 71 5b 69 70 5d 20 2b 3d 20 77 3b 0d 0a 20  req[ip] += w;.. 
21750 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f     }..  }....  /
21760 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
21770 20 74 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   total size of t
21780 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
21790 6e 20 74 6f 6b 65 6e 73 2e 20 2a 2f 0d 0a 20 20  n tokens. */..  
217a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
217b0 4b 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 54  K ){..    int nT
217c0 6f 6b 3b 0d 0a 20 20 20 20 72 63 20 3d 20 70 41  ok;..    rc = pA
217d0 70 69 2d 3e 78 43 6f 6c 75 6d 6e 53 69 7a 65 28  pi->xColumnSize(
217e0 70 46 74 73 2c 20 2d 31 2c 20 26 6e 54 6f 6b 29  pFts, -1, &nTok)
217f0 3b 0d 0a 20 20 20 20 44 20 3d 20 28 64 6f 75 62  ;..    D = (doub
21800 6c 65 29 6e 54 6f 6b 3b 0d 0a 20 20 7d 0d 0a 0d  le)nTok;..  }...
21810 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
21820 74 68 65 20 42 4d 32 35 20 73 63 6f 72 65 20 66  the BM25 score f
21830 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
21840 6f 77 2e 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d  ow. */..  for(i=
21850 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
21860 20 26 26 20 69 3c 70 44 61 74 61 2d 3e 6e 50 68   && i<pData->nPh
21870 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  rase; i++){..   
21880 20 73 63 6f 72 65 20 2b 3d 20 70 44 61 74 61 2d   score += pData-
21890 3e 61 49 44 46 5b 69 5d 20 2a 20 28 0d 0a 20 20  >aIDF[i] * (..  
218a0 20 20 20 20 28 20 61 46 72 65 71 5b 69 5d 20 2a      ( aFreq[i] *
218b0 20 28 6b 31 20 2b 20 31 2e 30 29 20 29 20 2f 20   (k1 + 1.0) ) / 
218c0 0d 0a 20 20 20 20 20 20 28 20 61 46 72 65 71 5b  ..      ( aFreq[
218d0 69 5d 20 2b 20 6b 31 20 2a 20 28 31 20 2d 20 62  i] + k1 * (1 - b
218e0 20 2b 20 62 20 2a 20 44 20 2f 20 70 44 61 74 61   + b * D / pData
218f0 2d 3e 61 76 67 64 6c 29 20 29 0d 0a 20 20 20 20  ->avgdl) )..    
21900 29 3b 0d 0a 20 20 7d 0d 0a 20 20 0d 0a 20 20 2f  );..  }..  ..  /
21910 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68 61  * If no error ha
21920 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 74 75  s occurred, retu
21930 72 6e 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  rn the calculate
21940 64 20 73 63 6f 72 65 2e 20 4f 74 68 65 72 77 69  d score. Otherwi
21950 73 65 2c 0d 0a 20 20 2a 2a 20 74 68 72 6f 77 20  se,..  ** throw 
21960 61 6e 20 53 51 4c 20 65 78 63 65 70 74 69 6f 6e  an SQL exception
21970 2e 20 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d  .  */..  if( rc=
21980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
21990 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
219a0 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 2d  t_double(pCtx, -
219b0 31 2e 30 20 2a 20 73 63 6f 72 65 29 3b 0d 0a 20  1.0 * score);.. 
219c0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 73 71 6c   }else{..    sql
219d0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
219e0 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29  r_code(pCtx, rc)
219f0 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61  ;..  }..}....sta
21a00 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
21a10 74 73 35 41 75 78 49 6e 69 74 28 66 74 73 35 5f  ts5AuxInit(fts5_
21a20 61 70 69 20 2a 70 41 70 69 29 7b 0d 0a 20 20 73  api *pApi){..  s
21a30 74 72 75 63 74 20 42 75 69 6c 74 69 6e 20 7b 0d  truct Builtin {.
21a40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
21a50 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20  *zFunc;         
21a60 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 6e     /* Function n
21a70 61 6d 65 20 28 6e 75 6c 2d 74 65 72 6d 69 6e 61  ame (nul-termina
21a80 74 65 64 29 20 2a 2f 0d 0a 20 20 20 20 76 6f 69  ted) */..    voi
21a90 64 20 2a 70 55 73 65 72 44 61 74 61 3b 20 20 20  d *pUserData;   
21aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
21ab0 65 72 2d 64 61 74 61 20 70 6f 69 6e 74 65 72 20  er-data pointer 
21ac0 2a 2f 0d 0a 20 20 20 20 66 74 73 35 5f 65 78 74  */..    fts5_ext
21ad0 65 6e 73 69 6f 6e 5f 66 75 6e 63 74 69 6f 6e 20  ension_function 
21ae0 78 46 75 6e 63 3b 2f 2a 20 43 61 6c 6c 62 61 63  xFunc;/* Callbac
21af0 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20  k function */.. 
21b00 20 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72     void (*xDestr
21b10 6f 79 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  oy)(void*);     
21b20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
21b30 75 6e 63 74 69 6f 6e 20 2a 2f 0d 0a 20 20 7d 20  unction */..  } 
21b40 61 42 75 69 6c 74 69 6e 20 5b 5d 20 3d 20 7b 0d  aBuiltin [] = {.
21b50 0a 20 20 20 20 7b 20 22 73 6e 69 70 70 65 74 22  .    { "snippet"
21b60 2c 20 20 20 30 2c 20 66 74 73 35 53 6e 69 70 70  ,   0, fts5Snipp
21b70 65 74 46 75 6e 63 74 69 6f 6e 2c 20 30 20 7d 2c  etFunction, 0 },
21b80 0d 0a 20 20 20 20 7b 20 22 68 69 67 68 6c 69 67  ..    { "highlig
21b90 68 74 22 2c 20 30 2c 20 66 74 73 35 48 69 67 68  ht", 0, fts5High
21ba0 6c 69 67 68 74 46 75 6e 63 74 69 6f 6e 2c 20 30  lightFunction, 0
21bb0 20 7d 2c 0d 0a 20 20 20 20 7b 20 22 62 6d 32 35   },..    { "bm25
21bc0 22 2c 20 20 20 20 20 20 30 2c 20 66 74 73 35 42  ",      0, fts5B
21bd0 6d 32 35 46 75 6e 63 74 69 6f 6e 2c 20 20 20 20  m25Function,    
21be0 30 20 7d 2c 0d 0a 20 20 7d 3b 0d 0a 20 20 69 6e  0 },..  };..  in
21bf0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21c10 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d   Return code */.
21c20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65     /* To iterate
21c50 20 74 68 72 6f 75 67 68 20 62 75 69 6c 74 69 6e   through builtin
21c60 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0d 0a 0d   functions */...
21c70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
21c80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 41  SQLITE_OK && i<A
21c90 72 72 61 79 53 69 7a 65 28 61 42 75 69 6c 74 69  rraySize(aBuilti
21ca0 6e 29 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 72  n); i++){..    r
21cb0 63 20 3d 20 70 41 70 69 2d 3e 78 43 72 65 61 74  c = pApi->xCreat
21cc0 65 46 75 6e 63 74 69 6f 6e 28 70 41 70 69 2c 0d  eFunction(pApi,.
21cd0 0a 20 20 20 20 20 20 20 20 61 42 75 69 6c 74 69  .        aBuilti
21ce0 6e 5b 69 5d 2e 7a 46 75 6e 63 2c 0d 0a 20 20 20  n[i].zFunc,..   
21cf0 20 20 20 20 20 61 42 75 69 6c 74 69 6e 5b 69 5d       aBuiltin[i]
21d00 2e 70 55 73 65 72 44 61 74 61 2c 0d 0a 20 20 20  .pUserData,..   
21d10 20 20 20 20 20 61 42 75 69 6c 74 69 6e 5b 69 5d       aBuiltin[i]
21d20 2e 78 46 75 6e 63 2c 0d 0a 20 20 20 20 20 20 20  .xFunc,..       
21d30 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 78 44 65   aBuiltin[i].xDe
21d40 73 74 72 6f 79 0d 0a 20 20 20 20 29 3b 0d 0a 20  stroy..    );.. 
21d50 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72   }....  return r
21d60 63 3b 0d 0a 7d 0d 0a 0d 0a 23 6c 69 6e 65 20 31  c;..}....#line 1
21d70 20 22 66 74 73 35 5f 62 75 66 66 65 72 2e 63 22   "fts5_buffer.c"
21d80 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 31 34 20 4d 61  ../*..** 2014 Ma
21d90 79 20 33 31 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65  y 31..**..** The
21da0 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
21db0 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
21dc0 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
21dd0 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0d 0a 2a    In place of..*
21de0 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
21df0 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
21e00 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  sing:..**..**   
21e10 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
21e20 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0d 0a   and not evil...
21e30 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  **    May you fi
21e40 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
21e50 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
21e60 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0d  forgive others..
21e70 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73  .**    May you s
21e80 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
21e90 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
21ea0 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0d 0a 2a  han you give...*
21eb0 2a 0d 0a 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 2a 2a 2a  ****************
21ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f00 2a 0d 0a 2a 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 20  *..*/......../* 
21f10 23 69 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e  #include "fts5In
21f20 74 2e 68 22 20 2a 2f 0d 0a 0d 0a 73 74 61 74 69  t.h" */....stati
21f30 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
21f40 35 42 75 66 66 65 72 53 69 7a 65 28 69 6e 74 20  5BufferSize(int 
21f50 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
21f60 20 2a 70 42 75 66 2c 20 75 33 32 20 6e 42 79 74   *pBuf, u32 nByt
21f70 65 29 7b 0d 0a 20 20 69 66 28 20 28 75 33 32 29  e){..  if( (u32)
21f80 70 42 75 66 2d 3e 6e 53 70 61 63 65 3c 6e 42 79  pBuf->nSpace<nBy
21f90 74 65 20 29 7b 0d 0a 20 20 20 20 75 36 34 20 6e  te ){..    u64 n
21fa0 4e 65 77 20 3d 20 70 42 75 66 2d 3e 6e 53 70 61  New = pBuf->nSpa
21fb0 63 65 20 3f 20 70 42 75 66 2d 3e 6e 53 70 61 63  ce ? pBuf->nSpac
21fc0 65 20 3a 20 36 34 3b 0d 0a 20 20 20 20 75 38 20  e : 64;..    u8 
21fd0 2a 70 4e 65 77 3b 0d 0a 20 20 20 20 77 68 69 6c  *pNew;..    whil
21fe0 65 28 20 6e 4e 65 77 3c 6e 42 79 74 65 20 29 7b  e( nNew<nByte ){
21ff0 0d 0a 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 6e  ..      nNew = n
22000 4e 65 77 20 2a 20 32 3b 0d 0a 20 20 20 20 7d 0d  New * 2;..    }.
22010 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
22020 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 42  te3_realloc64(pB
22030 75 66 2d 3e 70 2c 20 6e 4e 65 77 29 3b 0d 0a 20  uf->p, nNew);.. 
22040 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
22050 7b 0d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  {..      *pRc = 
22060 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20  SQLITE_NOMEM;.. 
22070 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a       return 1;..
22080 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
22090 20 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 3d    pBuf->nSpace =
220a0 20 28 69 6e 74 29 6e 4e 65 77 3b 0d 0a 20 20 20   (int)nNew;..   
220b0 20 20 20 70 42 75 66 2d 3e 70 20 3d 20 70 4e 65     pBuf->p = pNe
220c0 77 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  w;..    }..  }..
220d0 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a    return 0;..}..
220e0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 45 6e 63 6f 64  ..../*..** Encod
220f0 65 20 76 61 6c 75 65 20 69 56 61 6c 20 61 73 20  e value iVal as 
22100 61 6e 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74  an SQLite varint
22110 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74 20 74   and append it t
22120 6f 20 74 68 65 20 62 75 66 66 65 72 20 6f 62 6a  o the buffer obj
22130 65 63 74 0d 0a 2a 2a 20 70 42 75 66 2e 20 49 66  ect..** pBuf. If
22140 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
22150 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 65 72  curs, set the er
22160 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 2e 0d 0a  ror code in p...
22170 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
22180 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
22190 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 69 6e  rAppendVarint(in
221a0 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
221b0 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 56  er *pBuf, i64 iV
221c0 61 6c 29 7b 0d 0a 20 20 69 66 28 20 66 74 73 35  al){..  if( fts5
221d0 42 75 66 66 65 72 47 72 6f 77 28 70 52 63 2c 20  BufferGrow(pRc, 
221e0 70 42 75 66 2c 20 39 29 20 29 20 72 65 74 75 72  pBuf, 9) ) retur
221f0 6e 3b 0d 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d  n;..  pBuf->n +=
22200 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
22210 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
22220 42 75 66 2d 3e 6e 5d 2c 20 69 56 61 6c 29 3b 0d  Buf->n], iVal);.
22230 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69  .}....static voi
22240 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  d sqlite3Fts5Put
22250 33 32 28 75 38 20 2a 61 42 75 66 2c 20 69 6e 74  32(u8 *aBuf, int
22260 20 69 56 61 6c 29 7b 0d 0a 20 20 61 42 75 66 5b   iVal){..  aBuf[
22270 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 32 34 29 20  0] = (iVal>>24) 
22280 26 20 30 78 30 30 46 46 3b 0d 0a 20 20 61 42 75  & 0x00FF;..  aBu
22290 66 5b 31 5d 20 3d 20 28 69 56 61 6c 3e 3e 31 36  f[1] = (iVal>>16
222a0 29 20 26 20 30 78 30 30 46 46 3b 0d 0a 20 20 61  ) & 0x00FF;..  a
222b0 42 75 66 5b 32 5d 20 3d 20 28 69 56 61 6c 3e 3e  Buf[2] = (iVal>>
222c0 20 38 29 20 26 20 30 78 30 30 46 46 3b 0d 0a 20   8) & 0x00FF;.. 
222d0 20 61 42 75 66 5b 33 5d 20 3d 20 28 69 56 61 6c   aBuf[3] = (iVal
222e0 3e 3e 20 30 29 20 26 20 30 78 30 30 46 46 3b 0d  >> 0) & 0x00FF;.
222f0 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  .}....static int
22300 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 33   sqlite3Fts5Get3
22310 32 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66  2(const u8 *aBuf
22320 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e  ){..  return (in
22330 74 29 28 28 28 28 75 33 32 29 61 42 75 66 5b 30  t)((((u32)aBuf[0
22340 5d 29 3c 3c 32 34 29 20 2b 20 28 61 42 75 66 5b  ])<<24) + (aBuf[
22350 31 5d 3c 3c 31 36 29 20 2b 20 28 61 42 75 66 5b  1]<<16) + (aBuf[
22360 32 5d 3c 3c 38 29 20 2b 20 61 42 75 66 5b 33 5d  2]<<8) + aBuf[3]
22370 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  );..}..../*..** 
22380 41 70 70 65 6e 64 20 62 75 66 66 65 72 20 6e 44  Append buffer nD
22390 61 74 61 2f 70 44 61 74 61 20 74 6f 20 62 75 66  ata/pData to buf
223a0 66 65 72 20 70 42 75 66 2e 20 49 66 20 61 6e 20  fer pBuf. If an 
223b0 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
223c0 2c 20 73 65 74 20 0d 0a 2a 2a 20 74 68 65 20 65  , set ..** the e
223d0 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 2e 20  rror code in p. 
223e0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
223f0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
22400 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
22410 69 6f 6e 0d 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  ion..** is calle
22420 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
22430 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f  ...*/..static vo
22440 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  id sqlite3Fts5Bu
22450 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 0d  fferAppendBlob(.
22460 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0d 0a 20 20  .  int *pRc,..  
22470 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
22480 2c 20 0d 0a 20 20 75 33 32 20 6e 44 61 74 61 2c  , ..  u32 nData,
22490 20 0d 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70   ..  const u8 *p
224a0 44 61 74 61 0d 0a 29 7b 0d 0a 20 20 61 73 73 65  Data..){..  asse
224b0 72 74 5f 6e 63 28 20 2a 70 52 63 20 7c 7c 20 6e  rt_nc( *pRc || n
224c0 44 61 74 61 3e 3d 30 20 29 3b 0d 0a 20 20 69 66  Data>=0 );..  if
224d0 28 20 6e 44 61 74 61 20 29 7b 0d 0a 20 20 20 20  ( nData ){..    
224e0 69 66 28 20 66 74 73 35 42 75 66 66 65 72 47 72  if( fts5BufferGr
224f0 6f 77 28 70 52 63 2c 20 70 42 75 66 2c 20 6e 44  ow(pRc, pBuf, nD
22500 61 74 61 29 20 29 20 72 65 74 75 72 6e 3b 0d 0a  ata) ) return;..
22510 20 20 20 20 6d 65 6d 63 70 79 28 26 70 42 75 66      memcpy(&pBuf
22520 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 70 44  ->p[pBuf->n], pD
22530 61 74 61 2c 20 6e 44 61 74 61 29 3b 0d 0a 20 20  ata, nData);..  
22540 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 44 61    pBuf->n += nDa
22550 74 61 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f  ta;..  }..}..../
22560 2a 0d 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68 65  *..** Append the
22570 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
22580 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 74  string zStr to t
22590 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 20  he buffer pBuf. 
225a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a  This function..*
225b0 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  * ensures that t
225c0 68 65 20 62 79 74 65 20 66 6f 6c 6c 6f 77 69 6e  he byte followin
225d0 67 20 74 68 65 20 62 75 66 66 65 72 20 64 61 74  g the buffer dat
225e0 61 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 30  a is set to 0x00
225f0 2c 20 65 76 65 6e 20 0d 0a 2a 2a 20 74 68 6f 75  , even ..** thou
22600 67 68 20 74 68 69 73 20 62 79 74 65 20 69 73 20  gh this byte is 
22610 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 20  not included in 
22620 74 68 65 20 70 42 75 66 2d 3e 6e 20 63 6f 75 6e  the pBuf->n coun
22630 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  t...*/..static v
22640 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
22650 75 66 66 65 72 41 70 70 65 6e 64 53 74 72 69 6e  ufferAppendStrin
22660 67 28 0d 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0d  g(..  int *pRc,.
22670 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
22680 42 75 66 2c 20 0d 0a 20 20 63 6f 6e 73 74 20 63  Buf, ..  const c
22690 68 61 72 20 2a 7a 53 74 72 0d 0a 29 7b 0d 0a 20  har *zStr..){.. 
226a0 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 69 6e 74   int nStr = (int
226b0 29 73 74 72 6c 65 6e 28 7a 53 74 72 29 3b 0d 0a  )strlen(zStr);..
226c0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
226d0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52  ferAppendBlob(pR
226e0 63 2c 20 70 42 75 66 2c 20 6e 53 74 72 2b 31 2c  c, pBuf, nStr+1,
226f0 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 53 74 72   (const u8*)zStr
22700 29 3b 0d 0a 20 20 70 42 75 66 2d 3e 6e 2d 2d 3b  );..  pBuf->n--;
22710 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72  ..}..../*..** Ar
22720 67 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20 61  gument zFmt is a
22730 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20   printf() style 
22740 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 54  format string. T
22750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72  his function per
22760 66 6f 72 6d 73 0d 0a 2a 2a 20 74 68 65 20 70 72  forms..** the pr
22770 69 6e 74 66 28 29 20 73 74 79 6c 65 20 70 72 6f  intf() style pro
22780 63 65 73 73 69 6e 67 2c 20 74 68 65 6e 20 61 70  cessing, then ap
22790 70 65 6e 64 73 20 74 68 65 20 72 65 73 75 6c 74  pends the result
227a0 73 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  s to buffer pBuf
227b0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 4c 69 6b 65 20 73  ...**..** Like s
227c0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
227d0 41 70 70 65 6e 64 53 74 72 69 6e 67 28 29 2c 20  AppendString(), 
227e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e  this function en
227f0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 62  sures that the b
22800 79 74 65 20 0d 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  yte ..** followi
22810 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 64 61  ng the buffer da
22820 74 61 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  ta is set to 0x0
22830 30 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  0, even though t
22840 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74 0d  his byte is not.
22850 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20  .** included in 
22860 74 68 65 20 70 42 75 66 2d 3e 6e 20 63 6f 75 6e  the pBuf->n coun
22870 74 2e 0d 0a 2a 2f 20 0d 0a 73 74 61 74 69 63 20  t...*/ ..static 
22880 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
22890 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
228a0 74 66 28 0d 0a 20 20 69 6e 74 20 2a 70 52 63 2c  tf(..  int *pRc,
228b0 0d 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ..  Fts5Buffer *
228c0 70 42 75 66 2c 20 0d 0a 20 20 63 68 61 72 20 2a  pBuf, ..  char *
228d0 7a 46 6d 74 2c 20 2e 2e 2e 0d 0a 29 7b 0d 0a 20  zFmt, .....){.. 
228e0 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
228f0 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 63 68 61  E_OK ){..    cha
22900 72 20 2a 7a 54 6d 70 3b 0d 0a 20 20 20 20 76 61  r *zTmp;..    va
22910 5f 6c 69 73 74 20 61 70 3b 0d 0a 20 20 20 20 76  _list ap;..    v
22920 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74  a_start(ap, zFmt
22930 29 3b 0d 0a 20 20 20 20 7a 54 6d 70 20 3d 20 73  );..    zTmp = s
22940 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
22950 7a 46 6d 74 2c 20 61 70 29 3b 0d 0a 20 20 20 20  zFmt, ap);..    
22960 76 61 5f 65 6e 64 28 61 70 29 3b 0d 0a 0d 0a 20  va_end(ap);.... 
22970 20 20 20 69 66 28 20 7a 54 6d 70 3d 3d 30 20 29     if( zTmp==0 )
22980 7b 0d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  {..      *pRc = 
22990 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20  SQLITE_NOMEM;.. 
229a0 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
229b0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
229c0 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70  erAppendString(p
229d0 52 63 2c 20 70 42 75 66 2c 20 7a 54 6d 70 29 3b  Rc, pBuf, zTmp);
229e0 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
229f0 66 72 65 65 28 7a 54 6d 70 29 3b 0d 0a 20 20 20  free(zTmp);..   
22a00 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74   }..  }..}....st
22a10 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74  atic char *sqlit
22a20 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 69 6e  e3Fts5Mprintf(in
22a30 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68  t *pRc, const ch
22a40 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0d  ar *zFmt, ...){.
22a50 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
22a60 30 3b 0d 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  0;..  if( *pRc==
22a70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
22a80 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0d 0a 20    va_list ap;.. 
22a90 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
22aa0 7a 46 6d 74 29 3b 0d 0a 20 20 20 20 7a 52 65 74  zFmt);..    zRet
22ab0 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
22ac0 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0d 0a  ntf(zFmt, ap);..
22ad0 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0d      va_end(ap);.
22ae0 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
22af0 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 52 63 20   ){..      *pRc 
22b00 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20  = SQLITE_NOMEM; 
22b10 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20  ..    }..  }..  
22b20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0d 0a 7d 0d  return zRet;..}.
22b30 0a 20 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65  . ..../*..** Fre
22b40 65 20 61 6e 79 20 62 75 66 66 65 72 20 61 6c 6c  e any buffer all
22b50 6f 63 61 74 65 64 20 62 79 20 70 42 75 66 2e 20  ocated by pBuf. 
22b60 5a 65 72 6f 20 74 68 65 20 73 74 72 75 63 74 75  Zero the structu
22b70 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
22b80 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ing...*/..static
22b90 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
22ba0 35 42 75 66 66 65 72 46 72 65 65 28 46 74 73 35  5BufferFree(Fts5
22bb0 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0d 0a  Buffer *pBuf){..
22bc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22bd0 42 75 66 2d 3e 70 29 3b 0d 0a 20 20 6d 65 6d 73  Buf->p);..  mems
22be0 65 74 28 70 42 75 66 2c 20 30 2c 20 73 69 7a 65  et(pBuf, 0, size
22bf0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
22c00 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 5a 65  ..}..../*..** Ze
22c10 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ro the contents 
22c20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6f 62  of the buffer ob
22c30 6a 65 63 74 2e 20 42 75 74 20 64 6f 20 6e 6f 74  ject. But do not
22c40 20 66 72 65 65 20 74 68 65 20 61 73 73 6f 63 69   free the associ
22c50 61 74 65 64 20 0d 0a 2a 2a 20 6d 65 6d 6f 72 79  ated ..** memory
22c60 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 2a 2f   allocation...*/
22c70 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  ..static void sq
22c80 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
22c90 65 72 6f 28 46 74 73 35 42 75 66 66 65 72 20 2a  ero(Fts5Buffer *
22ca0 70 42 75 66 29 7b 0d 0a 20 20 70 42 75 66 2d 3e  pBuf){..  pBuf->
22cb0 6e 20 3d 20 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  n = 0;..}..../*.
22cc0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 66 66  .** Set the buff
22cd0 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 6e 44  er to contain nD
22ce0 61 74 61 2f 70 44 61 74 61 2e 20 49 66 20 61 6e  ata/pData. If an
22cf0 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
22d00 73 2c 20 6c 65 61 76 65 20 61 6e 0d 0a 2a 2a 20  s, leave an..** 
22d10 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
22d20 6e 20 70 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  n p. If an error
22d30 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
22d40 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
22d50 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 69 73 20  function..** is 
22d60 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
22d70 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  no-op...*/..stat
22d80 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
22d90 74 73 35 42 75 66 66 65 72 53 65 74 28 0d 0a 20  ts5BufferSet(.. 
22da0 20 69 6e 74 20 2a 70 52 63 2c 0d 0a 20 20 46 74   int *pRc,..  Ft
22db0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
22dc0 0d 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0d  ..  int nData, .
22dd0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
22de0 74 61 0d 0a 29 7b 0d 0a 20 20 70 42 75 66 2d 3e  ta..){..  pBuf->
22df0 6e 20 3d 20 30 3b 0d 0a 20 20 73 71 6c 69 74 65  n = 0;..  sqlite
22e00 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
22e10 64 42 6c 6f 62 28 70 52 63 2c 20 70 42 75 66 2c  dBlob(pRc, pBuf,
22e20 20 6e 44 61 74 61 2c 20 70 44 61 74 61 29 3b 0d   nData, pData);.
22e30 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  .}....static int
22e40 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
22e50 69 73 74 4e 65 78 74 36 34 28 0d 0a 20 20 63 6f  istNext64(..  co
22e60 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
22e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
22e80 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
22e90 6e 67 20 70 6f 73 6c 69 73 74 20 2a 2f 0d 0a 20  ng poslist */.. 
22ea0 20 69 6e 74 20 2a 70 69 2c 20 20 20 20 20 20 20   int *pi,       
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4f 66 66 73   /* IN/OUT: Offs
22ed0 65 74 20 77 69 74 68 69 6e 20 61 5b 5d 20 2a 2f  et within a[] */
22ee0 0d 0a 20 20 69 36 34 20 2a 70 69 4f 66 66 20 20  ..  i64 *piOff  
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f00 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
22f10 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 2a 2f  urrent offset */
22f20 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 69 20 3d 20  ..){..  int i = 
22f30 2a 70 69 3b 0d 0a 20 20 69 66 28 20 69 3e 3d 6e  *pi;..  if( i>=n
22f40 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 45 4f 46 20   ){..    /* EOF 
22f50 2a 2f 0d 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d  */..    *piOff =
22f60 20 2d 31 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e   -1;..    return
22f70 20 31 3b 20 20 0d 0a 20 20 7d 65 6c 73 65 7b 0d   1;  ..  }else{.
22f80 0a 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20  .    i64 iOff = 
22f90 2a 70 69 4f 66 66 3b 0d 0a 20 20 20 20 69 6e 74  *piOff;..    int
22fa0 20 69 56 61 6c 3b 0d 0a 20 20 20 20 66 74 73 35   iVal;..    fts5
22fb0 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
22fc0 61 2c 20 69 2c 20 69 56 61 6c 29 3b 0d 0a 20 20  a, i, iVal);..  
22fd0 20 20 69 66 28 20 69 56 61 6c 3c 3d 31 20 29 7b    if( iVal<=1 ){
22fe0 0d 0a 20 20 20 20 20 20 69 66 28 20 69 56 61 6c  ..      if( iVal
22ff0 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ==0 ){..        
23000 2a 70 69 20 3d 20 69 3b 0d 0a 20 20 20 20 20 20  *pi = i;..      
23010 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20    return 0;..   
23020 20 20 20 7d 0d 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
23030 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
23040 61 2c 20 69 2c 20 69 56 61 6c 29 3b 0d 0a 20 20  a, i, iVal);..  
23050 20 20 20 20 69 4f 66 66 20 3d 20 28 28 69 36 34      iOff = ((i64
23060 29 69 56 61 6c 29 20 3c 3c 20 33 32 3b 0d 0a 20  )iVal) << 32;.. 
23070 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
23080 56 61 72 69 6e 74 33 32 28 61 2c 20 69 2c 20 69  Varint32(a, i, i
23090 56 61 6c 29 3b 0d 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
230a0 20 69 56 61 6c 3c 32 20 29 7b 0d 0a 20 20 20 20   iVal<2 ){..    
230b0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
230c0 20 63 6f 72 72 75 70 74 20 72 65 63 6f 72 64 2e   corrupt record.
230d0 20 53 6f 20 73 74 6f 70 20 70 61 72 73 69 6e 67   So stop parsing
230e0 20 69 74 20 68 65 72 65 2e 20 2a 2f 0d 0a 20 20   it here. */..  
230f0 20 20 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 2d        *piOff = -
23100 31 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  1;..        retu
23110 72 6e 20 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn 1;..      }..
23120 20 20 20 20 7d 0d 0a 20 20 20 20 2a 70 69 4f 66      }..    *piOf
23130 66 20 3d 20 69 4f 66 66 20 2b 20 28 28 69 56 61  f = iOff + ((iVa
23140 6c 2d 32 29 20 26 20 30 78 37 46 46 46 46 46 46  l-2) & 0x7FFFFFF
23150 46 29 3b 0d 0a 20 20 20 20 2a 70 69 20 3d 20 69  F);..    *pi = i
23160 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ;..    return 0;
23170 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a  ..  }..}....../*
23180 0d 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  ..** Advance the
23190 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
231a0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
231b0 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  nly argument. Re
231c0 74 75 72 6e 20 74 72 75 65 0d 0a 2a 2a 20 69 66  turn true..** if
231d0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
231e0 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 66 61  aches EOF, or fa
231f0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a  lse otherwise...
23200 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
23210 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
23220 74 52 65 61 64 65 72 4e 65 78 74 28 46 74 73 35  tReaderNext(Fts5
23230 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 70  PoslistReader *p
23240 49 74 65 72 29 7b 0d 0a 20 20 69 66 28 20 73 71  Iter){..  if( sq
23250 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
23260 4e 65 78 74 36 34 28 70 49 74 65 72 2d 3e 61 2c  Next64(pIter->a,
23270 20 70 49 74 65 72 2d 3e 6e 2c 20 26 70 49 74 65   pIter->n, &pIte
23280 72 2d 3e 69 2c 20 26 70 49 74 65 72 2d 3e 69 50  r->i, &pIter->iP
23290 6f 73 29 20 29 7b 0d 0a 20 20 20 20 70 49 74 65  os) ){..    pIte
232a0 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20  r->bEof = 1;..  
232b0 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
232c0 72 2d 3e 62 45 6f 66 3b 0d 0a 7d 0d 0a 0d 0a 73  r->bEof;..}....s
232d0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
232e0 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
232f0 65 72 49 6e 69 74 28 0d 0a 20 20 63 6f 6e 73 74  erInit(..  const
23300 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20   u8 *a, int n,  
23310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
23320 73 6c 69 73 74 20 62 75 66 66 65 72 20 74 6f 20  slist buffer to 
23330 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
23340 2a 2f 0d 0a 20 20 46 74 73 35 50 6f 73 6c 69 73  */..  Fts5Poslis
23350 74 52 65 61 64 65 72 20 2a 70 49 74 65 72 20 20  tReader *pIter  
23360 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
23370 72 20 6f 62 6a 65 63 74 20 74 6f 20 69 6e 69 74  r object to init
23380 69 61 6c 69 7a 65 20 2a 2f 0d 0a 29 7b 0d 0a 20  ialize */..){.. 
23390 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
233a0 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
233b0 29 3b 0d 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d  );..  pIter->a =
233c0 20 61 3b 0d 0a 20 20 70 49 74 65 72 2d 3e 6e 20   a;..  pIter->n 
233d0 3d 20 6e 3b 0d 0a 20 20 73 71 6c 69 74 65 33 46  = n;..  sqlite3F
233e0 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
233f0 4e 65 78 74 28 70 49 74 65 72 29 3b 0d 0a 20 20  Next(pIter);..  
23400 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45  return pIter->bE
23410 6f 66 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  of;..}..../*..**
23420 20 41 70 70 65 6e 64 20 70 6f 73 69 74 69 6f 6e   Append position
23430 20 69 50 6f 73 20 74 6f 20 74 68 65 20 70 6f 73   iPos to the pos
23440 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 69 6e 67  ition list being
23450 20 61 63 63 75 6d 75 6c 61 74 65 64 20 69 6e 20   accumulated in 
23460 62 75 66 66 65 72 0d 0a 2a 2a 20 70 42 75 66 2c  buffer..** pBuf,
23470 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 61   which must be a
23480 6c 72 65 61 64 79 20 62 65 20 6c 61 72 67 65 20  lready be large 
23490 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
234a0 68 65 20 6e 65 77 20 64 61 74 61 2e 0d 0a 2a 2a  he new data...**
234b0 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f   The previous po
234c0 73 69 74 69 6f 6e 20 77 72 69 74 74 65 6e 20 74  sition written t
234d0 6f 20 74 68 69 73 20 6c 69 73 74 20 69 73 20 2a  o this list is *
234e0 70 69 50 72 65 76 2e 20 2a 70 69 50 72 65 76 20  piPrev. *piPrev 
234f0 69 73 20 73 65 74 0d 0a 2a 2a 20 74 6f 20 69 50  is set..** to iP
23500 6f 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  os before return
23510 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ing...*/..static
23520 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
23530 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
23540 6e 64 28 0d 0a 20 20 46 74 73 35 42 75 66 66 65  nd(..  Fts5Buffe
23550 72 20 2a 70 42 75 66 2c 20 0d 0a 20 20 69 36 34  r *pBuf, ..  i64
23560 20 2a 70 69 50 72 65 76 2c 20 0d 0a 20 20 69 36   *piPrev, ..  i6
23570 34 20 69 50 6f 73 0d 0a 29 7b 0d 0a 20 20 73 74  4 iPos..){..  st
23580 61 74 69 63 20 63 6f 6e 73 74 20 69 36 34 20 63  atic const i64 c
23590 6f 6c 6d 61 73 6b 20 3d 20 28 28 69 36 34 29 28  olmask = ((i64)(
235a0 30 78 37 46 46 46 46 46 46 46 29 29 20 3c 3c 20  0x7FFFFFFF)) << 
235b0 33 32 3b 0d 0a 20 20 69 66 28 20 28 69 50 6f 73  32;..  if( (iPos
235c0 20 26 20 63 6f 6c 6d 61 73 6b 29 20 21 3d 20 28   & colmask) != (
235d0 2a 70 69 50 72 65 76 20 26 20 63 6f 6c 6d 61 73  *piPrev & colmas
235e0 6b 29 20 29 7b 0d 0a 20 20 20 20 70 42 75 66 2d  k) ){..    pBuf-
235f0 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20  >p[pBuf->n++] = 
23600 31 3b 0d 0a 20 20 20 20 70 42 75 66 2d 3e 6e 20  1;..    pBuf->n 
23610 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
23620 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
23630 5b 70 42 75 66 2d 3e 6e 5d 2c 20 28 69 50 6f 73  [pBuf->n], (iPos
23640 3e 3e 33 32 29 29 3b 0d 0a 20 20 20 20 2a 70 69  >>32));..    *pi
23650 50 72 65 76 20 3d 20 28 69 50 6f 73 20 26 20 63  Prev = (iPos & c
23660 6f 6c 6d 61 73 6b 29 3b 0d 0a 20 20 7d 0d 0a 20  olmask);..  }.. 
23670 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
23680 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
23690 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
236a0 6e 5d 2c 20 28 69 50 6f 73 2d 2a 70 69 50 72 65  n], (iPos-*piPre
236b0 76 29 2b 32 29 3b 0d 0a 20 20 2a 70 69 50 72 65  v)+2);..  *piPre
236c0 76 20 3d 20 69 50 6f 73 3b 0d 0a 7d 0d 0a 0d 0a  v = iPos;..}....
236d0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
236e0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69  e3Fts5PoslistWri
236f0 74 65 72 41 70 70 65 6e 64 28 0d 0a 20 20 46 74  terAppend(..  Ft
23700 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
23710 0d 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57  ..  Fts5PoslistW
23720 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0d  riter *pWriter,.
23730 0a 20 20 69 36 34 20 69 50 6f 73 0d 0a 29 7b 0d  .  i64 iPos..){.
23740 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
23750 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20   /* Initialized 
23760 6f 6e 6c 79 20 74 6f 20 73 75 70 70 72 65 73 73  only to suppress
23770 20 65 72 72 6f 6e 65 6f 75 73 20 77 61 72 6e 69   erroneous warni
23780 6e 67 20 66 72 6f 6d 20 43 6c 61 6e 67 20 2a 2f  ng from Clang */
23790 0d 0a 20 20 69 66 28 20 66 74 73 35 42 75 66 66  ..  if( fts5Buff
237a0 65 72 47 72 6f 77 28 26 72 63 2c 20 70 42 75 66  erGrow(&rc, pBuf
237b0 2c 20 35 2b 35 2b 35 29 20 29 20 72 65 74 75 72  , 5+5+5) ) retur
237c0 6e 20 72 63 3b 0d 0a 20 20 73 71 6c 69 74 65 33  n rc;..  sqlite3
237d0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
237e0 70 70 65 6e 64 28 70 42 75 66 2c 20 26 70 57 72  ppend(pBuf, &pWr
237f0 69 74 65 72 2d 3e 69 50 72 65 76 2c 20 69 50 6f  iter->iPrev, iPo
23800 73 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53 51  s);..  return SQ
23810 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 73  LITE_OK;..}....s
23820 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69  tatic void *sqli
23830 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
23840 6f 28 69 6e 74 20 2a 70 52 63 2c 20 73 71 6c 69  o(int *pRc, sqli
23850 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
23860 7b 0d 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20  {..  void *pRet 
23870 3d 20 30 3b 0d 0a 20 20 69 66 28 20 2a 70 52 63  = 0;..  if( *pRc
23880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
23890 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
238a0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
238b0 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 52 65  e);..    if( pRe
238c0 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 69  t==0 ){..      i
238d0 66 28 20 6e 42 79 74 65 3e 30 20 29 20 2a 70 52  f( nByte>0 ) *pR
238e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
238f0 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20  ;..    }else{.. 
23900 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74       memset(pRet
23910 2c 20 30 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79  , 0, (size_t)nBy
23920 74 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  te);..    }..  }
23930 0d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
23940 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65  ..}..../*..** Re
23950 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69  turn a nul-termi
23960 6e 61 74 65 64 20 63 6f 70 79 20 6f 66 20 74 68  nated copy of th
23970 65 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74  e string indicat
23980 65 64 20 62 79 20 70 49 6e 2e 20 49 66 20 6e 49  ed by pIn. If nI
23990 6e 0d 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 6e 65 67  n..** is non-neg
239a0 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
239b0 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
239c0 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 62 79  the string in by
239d0 74 65 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0d  tes. Otherwise,.
239e0 0a 2a 2a 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  .** the length o
239f0 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  f the string is 
23a00 64 65 74 65 72 6d 69 6e 65 64 20 75 73 69 6e 67  determined using
23a10 20 73 74 72 6c 65 6e 28 29 2e 0d 0a 2a 2a 0d 0a   strlen()...**..
23a20 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
23a30 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
23a40 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
23a50 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65  ntually free the
23a60 20 72 65 74 75 72 6e 65 64 0d 0a 2a 2a 20 62 75   returned..** bu
23a70 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
23a80 65 33 5f 66 72 65 65 28 29 2e 20 49 66 20 61 6e  e3_free(). If an
23a90 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
23aa0 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
23ab0 6e 65 64 2e 20 0d 0a 2a 2f 0d 0a 73 74 61 74 69  ned. ..*/..stati
23ac0 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  c char *sqlite3F
23ad0 74 73 35 53 74 72 6e 64 75 70 28 69 6e 74 20 2a  ts5Strndup(int *
23ae0 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  pRc, const char 
23af0 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0d  *pIn, int nIn){.
23b00 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
23b10 30 3b 0d 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  0;..  if( *pRc==
23b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
23b30 20 20 69 66 28 20 6e 49 6e 3c 30 20 29 7b 0d 0a    if( nIn<0 ){..
23b40 20 20 20 20 20 20 6e 49 6e 20 3d 20 28 69 6e 74        nIn = (int
23b50 29 73 74 72 6c 65 6e 28 70 49 6e 29 3b 0d 0a 20  )strlen(pIn);.. 
23b60 20 20 20 7d 0d 0a 20 20 20 20 7a 52 65 74 20 3d     }..    zRet =
23b70 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
23b80 6d 61 6c 6c 6f 63 28 6e 49 6e 2b 31 29 3b 0d 0a  malloc(nIn+1);..
23b90 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0d      if( zRet ){.
23ba0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 52  .      memcpy(zR
23bb0 65 74 2c 20 70 49 6e 2c 20 6e 49 6e 29 3b 0d 0a  et, pIn, nIn);..
23bc0 20 20 20 20 20 20 7a 52 65 74 5b 6e 49 6e 5d 20        zRet[nIn] 
23bd0 3d 20 27 5c 30 27 3b 0d 0a 20 20 20 20 7d 65 6c  = '\0';..    }el
23be0 73 65 7b 0d 0a 20 20 20 20 20 20 2a 70 52 63 20  se{..      *pRc 
23bf0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d  = SQLITE_NOMEM;.
23c00 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72  .    }..  }..  r
23c10 65 74 75 72 6e 20 7a 52 65 74 3b 0d 0a 7d 0d 0a  eturn zRet;..}..
23c20 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65 74 75 72  ..../*..** Retur
23c30 6e 20 74 72 75 65 20 69 66 20 63 68 61 72 61 63  n true if charac
23c40 74 65 72 20 27 74 27 20 6d 61 79 20 62 65 20 70  ter 't' may be p
23c50 61 72 74 20 6f 66 20 61 6e 20 46 54 53 35 20 62  art of an FTS5 b
23c60 61 72 65 77 6f 72 64 2c 20 6f 72 20 66 61 6c 73  areword, or fals
23c70 65 0d 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  e..** otherwise.
23c80 20 43 68 61 72 61 63 74 65 72 73 20 74 68 61 74   Characters that
23c90 20 6d 61 79 20 62 65 20 70 61 72 74 20 6f 66 20   may be part of 
23ca0 62 61 72 65 77 6f 72 64 73 3a 0d 0a 2a 2a 0d 0a  barewords:..**..
23cb0 2a 2a 20 20 20 2a 20 41 6c 6c 20 6e 6f 6e 2d 41  **   * All non-A
23cc0 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73 2c  SCII characters,
23cd0 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20 35 32 20  ..**   * The 52 
23ce0 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
23cf0 63 61 73 65 20 41 53 43 49 49 20 63 68 61 72 61  case ASCII chara
23d00 63 74 65 72 73 2c 20 61 6e 64 0d 0a 2a 2a 20 20  cters, and..**  
23d10 20 2a 20 54 68 65 20 31 30 20 69 6e 74 65 67 65   * The 10 intege
23d20 72 20 41 53 43 49 49 20 63 68 61 72 61 63 74 65  r ASCII characte
23d30 72 73 2e 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20  rs...**   * The 
23d40 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61 72 61  underscore chara
23d50 63 74 65 72 20 22 5f 22 20 28 30 78 35 46 29 2e  cter "_" (0x5F).
23d60 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20 75 6e 69  ..**   * The uni
23d70 63 6f 64 65 20 22 73 75 62 73 69 74 75 74 65 22  code "subsitute"
23d80 20 63 68 61 72 61 63 74 65 72 20 28 30 78 31 41   character (0x1A
23d90 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69  )...*/..static i
23da0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 73  nt sqlite3Fts5Is
23db0 42 61 72 65 77 6f 72 64 28 63 68 61 72 20 74 29  Bareword(char t)
23dc0 7b 0d 0a 20 20 75 38 20 61 42 61 72 65 77 6f 72  {..  u8 aBarewor
23dd0 64 5b 31 32 38 5d 20 3d 20 7b 0d 0a 20 20 20 20  d[128] = {..    
23de0 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
23df0 2c 20 30 2c 20 30 2c 20 20 20 20 30 2c 20 30 2c  , 0, 0,    0, 0,
23e00 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
23e10 30 2c 20 20 20 2f 2a 20 30 78 30 30 20 2e 2e 20  0,   /* 0x00 .. 
23e20 30 78 30 46 20 2a 2f 0d 0a 20 20 20 20 30 2c 20  0x0F */..    0, 
23e30 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
23e40 2c 20 30 2c 20 20 20 20 30 2c 20 30 2c 20 31 2c  , 0,    0, 0, 1,
23e50 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
23e60 20 20 2f 2a 20 30 78 31 30 20 2e 2e 20 30 78 31    /* 0x10 .. 0x1
23e70 46 20 2a 2f 0d 0a 20 20 20 20 30 2c 20 30 2c 20  F */..    0, 0, 
23e80 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
23e90 2c 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ,    0, 0, 0, 0,
23ea0 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f   0, 0, 0, 0,   /
23eb0 2a 20 30 78 32 30 20 2e 2e 20 30 78 32 46 20 2a  * 0x20 .. 0x2F *
23ec0 2f 0d 0a 20 20 20 20 31 2c 20 31 2c 20 31 2c 20  /..    1, 1, 1, 
23ed0 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
23ee0 20 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c    1, 1, 0, 0, 0,
23ef0 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30   0, 0, 0,   /* 0
23f00 78 33 30 20 2e 2e 20 30 78 33 46 20 2a 2f 0d 0a  x30 .. 0x3F */..
23f10 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 31 2c 20      0, 1, 1, 1, 
23f20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 20 31  1, 1, 1, 1,    1
23f30 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
23f40 20 31 2c 20 31 2c 20 20 20 2f 2a 20 30 78 34 30   1, 1,   /* 0x40
23f50 20 2e 2e 20 30 78 34 46 20 2a 2f 0d 0a 20 20 20   .. 0x4F */..   
23f60 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
23f70 31 2c 20 31 2c 20 31 2c 20 20 20 20 31 2c 20 31  1, 1, 1,    1, 1
23f80 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 0, 0, 0, 0,
23f90 20 31 2c 20 20 20 2f 2a 20 30 78 35 30 20 2e 2e   1,   /* 0x50 ..
23fa0 20 30 78 35 46 20 2a 2f 0d 0a 20 20 20 20 30 2c   0x5F */..    0,
23fb0 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
23fc0 31 2c 20 31 2c 20 20 20 20 31 2c 20 31 2c 20 31  1, 1,    1, 1, 1
23fd0 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
23fe0 20 20 20 2f 2a 20 30 78 36 30 20 2e 2e 20 30 78     /* 0x60 .. 0x
23ff0 36 46 20 2a 2f 0d 0a 20 20 20 20 31 2c 20 31 2c  6F */..    1, 1,
24000 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
24010 31 2c 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 30  1,    1, 1, 1, 0
24020 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 20 20 20  , 0, 0, 0, 0    
24030 2f 2a 20 30 78 37 30 20 2e 2e 20 30 78 37 46 20  /* 0x70 .. 0x7F 
24040 2a 2f 0d 0a 20 20 7d 3b 0d 0a 0d 0a 20 20 72 65  */..  };....  re
24050 74 75 72 6e 20 28 74 20 26 20 30 78 38 30 29 20  turn (t & 0x80) 
24060 7c 7c 20 61 42 61 72 65 77 6f 72 64 5b 28 69 6e  || aBareword[(in
24070 74 29 74 5d 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a  t)t];..}....../*
24080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240c0 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2f 0d 0a 74 79  ********..*/..ty
240d0 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
240e0 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20 46 74  5TermsetEntry Ft
240f0 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 3b 0d  s5TermsetEntry;.
24100 0a 73 74 72 75 63 74 20 46 74 73 35 54 65 72 6d  .struct Fts5Term
24110 73 65 74 45 6e 74 72 79 20 7b 0d 0a 20 20 63 68  setEntry {..  ch
24120 61 72 20 2a 70 54 65 72 6d 3b 0d 0a 20 20 69 6e  ar *pTerm;..  in
24130 74 20 6e 54 65 72 6d 3b 0d 0a 20 20 69 6e 74 20  t nTerm;..  int 
24140 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
24150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24160 6e 64 65 78 20 28 6d 61 69 6e 20 6f 72 20 61 50  ndex (main or aP
24170 72 65 66 69 78 5b 5d 20 65 6e 74 72 79 29 20 2a  refix[] entry) *
24180 2f 0d 0a 20 20 46 74 73 35 54 65 72 6d 73 65 74  /..  Fts5Termset
24190 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b 0d 0a 7d  Entry *pNext;..}
241a0 3b 0d 0a 0d 0a 73 74 72 75 63 74 20 46 74 73 35  ;....struct Fts5
241b0 54 65 72 6d 73 65 74 20 7b 0d 0a 20 20 46 74 73  Termset {..  Fts
241c0 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20 2a 61  5TermsetEntry *a
241d0 70 48 61 73 68 5b 35 31 32 5d 3b 0d 0a 7d 3b 0d  pHash[512];..};.
241e0 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ...static int sq
241f0 6c 69 74 65 33 46 74 73 35 54 65 72 6d 73 65 74  lite3Fts5Termset
24200 4e 65 77 28 46 74 73 35 54 65 72 6d 73 65 74 20  New(Fts5Termset 
24210 2a 2a 70 70 29 7b 0d 0a 20 20 69 6e 74 20 72 63  **pp){..  int rc
24220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20   = SQLITE_OK;.. 
24230 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 46 74   *pp = sqlite3Ft
24240 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
24250 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 54 65 72  , sizeof(Fts5Ter
24260 6d 73 65 74 29 29 3b 0d 0a 20 20 72 65 74 75 72  mset));..  retur
24270 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74  n rc;..}....stat
24280 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
24290 73 35 54 65 72 6d 73 65 74 41 64 64 28 0d 0a 20  s5TermsetAdd(.. 
242a0 20 46 74 73 35 54 65 72 6d 73 65 74 20 2a 70 2c   Fts5Termset *p,
242b0 20 0d 0a 20 20 69 6e 74 20 69 49 64 78 2c 0d 0a   ..  int iIdx,..
242c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
242d0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
242e0 0d 0a 20 20 69 6e 74 20 2a 70 62 50 72 65 73 65  ..  int *pbPrese
242f0 6e 74 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63  nt..){..  int rc
24300 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20   = SQLITE_OK;.. 
24310 20 2a 70 62 50 72 65 73 65 6e 74 20 3d 20 30 3b   *pbPresent = 0;
24320 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 20  ..  if( p ){..  
24330 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 75 33    int i;..    u3
24340 32 20 68 61 73 68 20 3d 20 31 33 3b 0d 0a 20 20  2 hash = 13;..  
24350 20 20 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74    Fts5TermsetEnt
24360 72 79 20 2a 70 45 6e 74 72 79 3b 0d 0a 0d 0a 20  ry *pEntry;.... 
24370 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20     /* Calculate 
24380 61 20 68 61 73 68 20 76 61 6c 75 65 20 66 6f 72  a hash value for
24390 20 74 68 69 73 20 74 65 72 6d 2e 20 54 68 69 73   this term. This
243a0 20 69 73 20 74 68 65 20 73 61 6d 65 20 68 61 73   is the same has
243b0 68 20 63 68 65 63 6b 73 75 6d 0d 0a 20 20 20 20  h checksum..    
243c0 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 66  ** used by the f
243d0 74 73 35 5f 68 61 73 68 2e 63 20 6d 6f 64 75 6c  ts5_hash.c modul
243e0 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 69  e. This is not i
243f0 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 63 6f 72  mportant for cor
24400 72 65 63 74 0d 0a 20 20 20 20 2a 2a 20 6f 70 65  rect..    ** ope
24410 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  ration of the mo
24420 64 75 6c 65 2c 20 62 75 74 20 69 73 20 6e 65 63  dule, but is nec
24430 65 73 73 61 72 79 20 74 6f 20 65 6e 73 75 72 65  essary to ensure
24440 20 74 68 61 74 20 73 6f 6d 65 20 74 65 73 74 73   that some tests
24450 0d 0a 20 20 20 20 2a 2a 20 64 65 73 69 67 6e 65  ..    ** designe
24460 64 20 74 6f 20 70 72 6f 64 75 63 65 20 68 61 73  d to produce has
24470 68 20 74 61 62 6c 65 20 63 6f 6c 6c 69 73 69 6f  h table collisio
24480 6e 73 20 72 65 61 6c 6c 79 20 64 6f 20 77 6f 72  ns really do wor
24490 6b 2e 20 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28  k.  */..    for(
244a0 69 3d 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  i=nTerm-1; i>=0;
244b0 20 69 2d 2d 29 7b 0d 0a 20 20 20 20 20 20 68 61   i--){..      ha
244c0 73 68 20 3d 20 28 68 61 73 68 20 3c 3c 20 33 29  sh = (hash << 3)
244d0 20 5e 20 68 61 73 68 20 5e 20 70 54 65 72 6d 5b   ^ hash ^ pTerm[
244e0 69 5d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20  i];..    }..    
244f0 68 61 73 68 20 3d 20 28 68 61 73 68 20 3c 3c 20  hash = (hash << 
24500 33 29 20 5e 20 68 61 73 68 20 5e 20 69 49 64 78  3) ^ hash ^ iIdx
24510 3b 0d 0a 20 20 20 20 68 61 73 68 20 3d 20 68 61  ;..    hash = ha
24520 73 68 20 25 20 41 72 72 61 79 53 69 7a 65 28 70  sh % ArraySize(p
24530 2d 3e 61 70 48 61 73 68 29 3b 0d 0a 0d 0a 20 20  ->apHash);....  
24540 20 20 66 6f 72 28 70 45 6e 74 72 79 3d 70 2d 3e    for(pEntry=p->
24550 61 70 48 61 73 68 5b 68 61 73 68 5d 3b 20 70 45  apHash[hash]; pE
24560 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d 70 45 6e  ntry; pEntry=pEn
24570 74 72 79 2d 3e 70 4e 65 78 74 29 7b 0d 0a 20 20  try->pNext){..  
24580 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e      if( pEntry->
24590 69 49 64 78 3d 3d 69 49 64 78 20 0d 0a 20 20 20  iIdx==iIdx ..   
245a0 20 20 20 20 20 20 20 26 26 20 70 45 6e 74 72 79         && pEntry
245b0 2d 3e 6e 54 65 72 6d 3d 3d 6e 54 65 72 6d 20 0d  ->nTerm==nTerm .
245c0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65  .          && me
245d0 6d 63 6d 70 28 70 45 6e 74 72 79 2d 3e 70 54 65  mcmp(pEntry->pTe
245e0 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, pTerm, nTerm
245f0 29 3d 3d 30 20 0d 0a 20 20 20 20 20 20 29 7b 0d  )==0 ..      ){.
24600 0a 20 20 20 20 20 20 20 20 2a 70 62 50 72 65 73  .        *pbPres
24610 65 6e 74 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  ent = 1;..      
24620 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
24630 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
24640 69 66 28 20 70 45 6e 74 72 79 3d 3d 30 20 29 7b  if( pEntry==0 ){
24650 0d 0a 20 20 20 20 20 20 70 45 6e 74 72 79 20 3d  ..      pEntry =
24660 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c   sqlite3Fts5Mall
24670 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
24680 6f 66 28 46 74 73 35 54 65 72 6d 73 65 74 45 6e  of(Fts5TermsetEn
24690 74 72 79 29 20 2b 20 6e 54 65 72 6d 29 3b 0d 0a  try) + nTerm);..
246a0 20 20 20 20 20 20 69 66 28 20 70 45 6e 74 72 79        if( pEntry
246b0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 45 6e   ){..        pEn
246c0 74 72 79 2d 3e 70 54 65 72 6d 20 3d 20 28 63 68  try->pTerm = (ch
246d0 61 72 2a 29 26 70 45 6e 74 72 79 5b 31 5d 3b 0d  ar*)&pEntry[1];.
246e0 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 2d  .        pEntry-
246f0 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0d  >nTerm = nTerm;.
24700 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 2d  .        pEntry-
24710 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0d 0a 20  >iIdx = iIdx;.. 
24720 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 45         memcpy(pE
24730 6e 74 72 79 2d 3e 70 54 65 72 6d 2c 20 70 54 65  ntry->pTerm, pTe
24740 72 6d 2c 20 6e 54 65 72 6d 29 3b 0d 0a 20 20 20  rm, nTerm);..   
24750 20 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 4e 65       pEntry->pNe
24760 78 74 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b 68  xt = p->apHash[h
24770 61 73 68 5d 3b 0d 0a 20 20 20 20 20 20 20 20 70  ash];..        p
24780 2d 3e 61 70 48 61 73 68 5b 68 61 73 68 5d 20 3d  ->apHash[hash] =
24790 20 70 45 6e 74 72 79 3b 0d 0a 20 20 20 20 20 20   pEntry;..      
247a0 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  }..    }..  }...
247b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d  .  return rc;..}
247c0 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ....static void 
247d0 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d 73  sqlite3Fts5Terms
247e0 65 74 46 72 65 65 28 46 74 73 35 54 65 72 6d 73  etFree(Fts5Terms
247f0 65 74 20 2a 70 29 7b 0d 0a 20 20 69 66 28 20 70  et *p){..  if( p
24800 20 29 7b 0d 0a 20 20 20 20 75 33 32 20 69 3b 0d   ){..    u32 i;.
24810 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24820 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 70 48  ArraySize(p->apH
24830 61 73 68 29 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  ash); i++){..   
24840 20 20 20 46 74 73 35 54 65 72 6d 73 65 74 45 6e     Fts5TermsetEn
24850 74 72 79 20 2a 70 45 6e 74 72 79 20 3d 20 70 2d  try *pEntry = p-
24860 3e 61 70 48 61 73 68 5b 69 5d 3b 0d 0a 20 20 20  >apHash[i];..   
24870 20 20 20 77 68 69 6c 65 28 20 70 45 6e 74 72 79     while( pEntry
24880 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 46 74 73   ){..        Fts
24890 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20 2a 70  5TermsetEntry *p
248a0 44 65 6c 20 3d 20 70 45 6e 74 72 79 3b 0d 0a 20  Del = pEntry;.. 
248b0 20 20 20 20 20 20 20 70 45 6e 74 72 79 20 3d 20         pEntry = 
248c0 70 45 6e 74 72 79 2d 3e 70 4e 65 78 74 3b 0d 0a  pEntry->pNext;..
248d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
248e0 66 72 65 65 28 70 44 65 6c 29 3b 0d 0a 20 20 20  free(pDel);..   
248f0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20     }..    }..   
24900 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
24910 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 23 6c 69  ;..  }..}....#li
24920 6e 65 20 31 20 22 66 74 73 35 5f 63 6f 6e 66 69  ne 1 "fts5_confi
24930 67 2e 63 22 0d 0a 2f 2a 0d 0a 2a 2a 20 32 30 31  g.c"../*..** 201
24940 34 20 4a 75 6e 20 30 39 0d 0a 2a 2a 0d 0a 2a 2a  4 Jun 09..**..**
24950 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
24960 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
24970 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
24980 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
24990 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f  f..** a legal no
249a0 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
249b0 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a 0d 0a 2a  blessing:..**..*
249c0 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  *    May you do 
249d0 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
249e0 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  l...**    May yo
249f0 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65  u find forgivene
24a00 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20  ss for yourself 
24a10 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65  and forgive othe
24a20 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79  rs...**    May y
24a30 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c  ou share freely,
24a40 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f   never taking mo
24a50 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65  re than you give
24a60 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ...**..*********
24a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ab0 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68  *****..**..** Th
24ac0 69 73 20 69 73 20 61 6e 20 53 51 4c 69 74 65 20  is is an SQLite 
24ad0 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  module implement
24ae0 69 6e 67 20 66 75 6c 6c 2d 74 65 78 74 20 73 65  ing full-text se
24af0 61 72 63 68 2e 0d 0a 2a 2f 0d 0a 0d 0a 0d 0a 2f  arch...*/....../
24b00 2a 20 23 69 6e 63 6c 75 64 65 20 22 66 74 73 35  * #include "fts5
24b10 49 6e 74 2e 68 22 20 2a 2f 0d 0a 0d 0a 23 64 65  Int.h" */....#de
24b20 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c  fine FTS5_DEFAUL
24b30 54 5f 50 41 47 45 5f 53 49 5a 45 20 20 20 34 30  T_PAGE_SIZE   40
24b40 35 30 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35  50..#define FTS5
24b50 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 45 52  _DEFAULT_AUTOMER
24b60 47 45 20 20 20 20 20 20 34 0d 0a 23 64 65 66 69  GE      4..#defi
24b70 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f  ne FTS5_DEFAULT_
24b80 55 53 45 52 4d 45 52 47 45 20 20 20 20 20 20 34  USERMERGE      4
24b90 0d 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  ..#define FTS5_D
24ba0 45 46 41 55 4c 54 5f 43 52 49 53 49 53 4d 45 52  EFAULT_CRISISMER
24bb0 47 45 20 20 20 31 36 0d 0a 23 64 65 66 69 6e 65  GE   16..#define
24bc0 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 48 41   FTS5_DEFAULT_HA
24bd0 53 48 53 49 5a 45 20 20 20 20 28 31 30 32 34 2a  SHSIZE    (1024*
24be0 31 30 32 34 29 0d 0a 0d 0a 2f 2a 20 4d 61 78 69  1024)..../* Maxi
24bf0 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 70 61 67 65  mum allowed page
24c00 20 73 69 7a 65 20 2a 2f 0d 0a 23 64 65 66 69 6e   size */..#defin
24c10 65 20 46 54 53 35 5f 4d 41 58 5f 50 41 47 45 5f  e FTS5_MAX_PAGE_
24c20 53 49 5a 45 20 28 31 32 38 2a 31 30 32 34 29 0d  SIZE (128*1024).
24c30 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  ...static int ft
24c40 73 35 5f 69 73 77 68 69 74 65 73 70 61 63 65 28  s5_iswhitespace(
24c50 63 68 61 72 20 78 29 7b 0d 0a 20 20 72 65 74 75  char x){..  retu
24c60 72 6e 20 28 78 3d 3d 27 20 27 29 3b 0d 0a 7d 0d  rn (x==' ');..}.
24c70 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  ...static int ft
24c80 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65 28 63  s5_isopenquote(c
24c90 68 61 72 20 78 29 7b 0d 0a 20 20 72 65 74 75 72  har x){..  retur
24ca0 6e 20 28 78 3d 3d 27 22 27 20 7c 7c 20 78 3d 3d  n (x=='"' || x==
24cb0 27 5c 27 27 20 7c 7c 20 78 3d 3d 27 5b 27 20 7c  '\'' || x=='[' |
24cc0 7c 20 78 3d 3d 27 60 27 29 3b 0d 0a 7d 0d 0a 0d  | x=='`');..}...
24cd0 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ./*..** Argument
24ce0 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61   pIn points to a
24cf0 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20   character that 
24d00 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e 75 6c  is part of a nul
24d10 2d 74 65 72 6d 69 6e 61 74 65 64 20 0d 0a 2a 2a  -terminated ..**
24d20 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20   string. Return 
24d30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
24d40 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
24d50 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 49 6e 20   following *pIn 
24d60 69 6e 20 0d 0a 2a 2a 20 74 68 65 20 73 74 72 69  in ..** the stri
24d70 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ng that is not a
24d80 20 77 68 69 74 65 2d 73 70 61 63 65 20 63 68 61   white-space cha
24d90 72 61 63 74 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 61  racter...*/..sta
24da0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
24db0 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68  fts5ConfigSkipWh
24dc0 69 74 65 73 70 61 63 65 28 63 6f 6e 73 74 20 63  itespace(const c
24dd0 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20 63 6f  har *pIn){..  co
24de0 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 70 49  nst char *p = pI
24df0 6e 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a  n;..  if( p ){..
24e00 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 5f      while( fts5_
24e10 69 73 77 68 69 74 65 73 70 61 63 65 28 2a 70 29  iswhitespace(*p)
24e20 20 29 7b 20 70 2b 2b 3b 20 7d 0d 0a 20 20 7d 0d   ){ p++; }..  }.
24e30 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a 7d 0d  .  return p;..}.
24e40 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65  .../*..** Argume
24e50 6e 74 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f  nt pIn points to
24e60 20 61 20 63 68 61 72 61 63 74 65 72 20 74 68 61   a character tha
24e70 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e  t is part of a n
24e80 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0d 0a  ul-terminated ..
24e90 2a 2a 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72  ** string. Retur
24ea0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24eb0 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
24ec0 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 49  er following *pI
24ed0 6e 20 69 6e 20 0d 0a 2a 2a 20 74 68 65 20 73 74  n in ..** the st
24ee0 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74  ring that is not
24ef0 20 61 20 22 62 61 72 65 77 6f 72 64 22 20 63 68   a "bareword" ch
24f00 61 72 61 63 74 65 72 2e 0d 0a 2a 2f 0d 0a 73 74  aracter...*/..st
24f10 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
24f20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 42  *fts5ConfigSkipB
24f30 61 72 65 77 6f 72 64 28 63 6f 6e 73 74 20 63 68  areword(const ch
24f40 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20 63 6f 6e  ar *pIn){..  con
24f50 73 74 20 63 68 61 72 20 2a 70 20 3d 20 70 49 6e  st char *p = pIn
24f60 3b 0d 0a 20 20 77 68 69 6c 65 20 28 20 73 71 6c  ;..  while ( sql
24f70 69 74 65 33 46 74 73 35 49 73 42 61 72 65 77 6f  ite3Fts5IsBarewo
24f80 72 64 28 2a 70 29 20 29 20 70 2b 2b 3b 0d 0a 20  rd(*p) ) p++;.. 
24f90 20 69 66 28 20 70 3d 3d 70 49 6e 20 29 20 70 20   if( p==pIn ) p 
24fa0 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70  = 0;..  return p
24fb0 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69  ;..}....static i
24fc0 6e 74 20 66 74 73 35 5f 69 73 64 69 67 69 74 28  nt fts5_isdigit(
24fd0 63 68 61 72 20 61 29 7b 0d 0a 20 20 72 65 74 75  char a){..  retu
24fe0 72 6e 20 28 61 3e 3d 27 30 27 20 26 26 20 61 3c  rn (a>='0' && a<
24ff0 3d 27 39 27 29 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d  ='9');..}.......
25000 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
25010 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b  ar *fts5ConfigSk
25020 69 70 4c 69 74 65 72 61 6c 28 63 6f 6e 73 74 20  ipLiteral(const 
25030 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20 63  char *pIn){..  c
25040 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 70  onst char *p = p
25050 49 6e 3b 0d 0a 20 20 73 77 69 74 63 68 28 20 2a  In;..  switch( *
25060 70 20 29 7b 0d 0a 20 20 20 20 63 61 73 65 20 27  p ){..    case '
25070 6e 27 3a 20 63 61 73 65 20 27 4e 27 3a 0d 0a 20  n': case 'N':.. 
25080 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25090 5f 73 74 72 6e 69 63 6d 70 28 22 6e 75 6c 6c 22  _strnicmp("null"
250a0 2c 20 70 2c 20 34 29 3d 3d 30 20 29 7b 0d 0a 20  , p, 4)==0 ){.. 
250b0 20 20 20 20 20 20 20 70 20 3d 20 26 70 5b 34 5d         p = &p[4]
250c0 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d  ;..      }else{.
250d0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b 0d  .        p = 0;.
250e0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
250f0 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 63 61  break;....    ca
25100 73 65 20 27 78 27 3a 20 63 61 73 65 20 27 58 27  se 'x': case 'X'
25110 3a 0d 0a 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20  :..      p++;.. 
25120 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27 5c 27       if( *p=='\'
25130 27 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 2b  ' ){..        p+
25140 2b 3b 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c  +;..        whil
25150 65 28 20 28 2a 70 3e 3d 27 61 27 20 26 26 20 2a  e( (*p>='a' && *
25160 70 3c 3d 27 66 27 29 20 0d 0a 20 20 20 20 20 20  p<='f') ..      
25170 20 20 20 20 20 20 7c 7c 20 28 2a 70 3e 3d 27 41        || (*p>='A
25180 27 20 26 26 20 2a 70 3c 3d 27 46 27 29 20 0d 0a  ' && *p<='F') ..
25190 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
251a0 2a 70 3e 3d 27 30 27 20 26 26 20 2a 70 3c 3d 27  *p>='0' && *p<='
251b0 39 27 29 20 0d 0a 20 20 20 20 20 20 20 20 20 20  9') ..          
251c0 20 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20    ){..          
251d0 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  p++;..        }.
251e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d  .        if( *p=
251f0 3d 27 5c 27 27 20 26 26 20 30 3d 3d 28 28 70 2d  ='\'' && 0==((p-
25200 70 49 6e 29 25 32 29 20 29 7b 0d 0a 20 20 20 20  pIn)%2) ){..    
25210 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 20 20        p++;..    
25220 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
25230 20 20 20 20 20 20 70 20 3d 20 30 3b 0d 0a 20 20        p = 0;..  
25240 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
25250 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 70  else{..        p
25260 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a   = 0;..      }..
25270 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a        break;....
25280 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 0d 0a      case '\'':..
25290 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 20 20        p++;..    
252a0 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0d 0a 20    while( p ){.. 
252b0 20 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27         if( *p=='
252c0 5c 27 27 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  \'' ){..        
252d0 20 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20    p++;..        
252e0 20 20 69 66 28 20 2a 70 21 3d 27 5c 27 27 20 29    if( *p!='\'' )
252f0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20   break;..       
25300 20 7d 0d 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b   }..        p++;
25310 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ..        if( *p
25320 3d 3d 30 20 29 20 70 20 3d 20 30 3b 0d 0a 20 20  ==0 ) p = 0;..  
25330 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 62 72 65      }..      bre
25340 61 6b 3b 0d 0a 0d 0a 20 20 20 20 64 65 66 61 75  ak;....    defau
25350 6c 74 3a 0d 0a 20 20 20 20 20 20 2f 2a 20 6d 61  lt:..      /* ma
25360 79 62 65 20 61 20 6e 75 6d 62 65 72 20 2a 2f 0d  ybe a number */.
25370 0a 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27  .      if( *p=='
25380 2b 27 20 7c 7c 20 2a 70 3d 3d 27 2d 27 20 29 20  +' || *p=='-' ) 
25390 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 77 68 69 6c  p++;..      whil
253a0 65 28 20 66 74 73 35 5f 69 73 64 69 67 69 74 28  e( fts5_isdigit(
253b0 2a 70 29 20 29 20 70 2b 2b 3b 0d 0a 0d 0a 20 20  *p) ) p++;....  
253c0 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
253d0 6f 69 6e 74 2c 20 69 66 20 74 68 65 20 6c 69 74  oint, if the lit
253e0 65 72 61 6c 20 77 61 73 20 61 6e 20 69 6e 74 65  eral was an inte
253f0 67 65 72 2c 20 74 68 65 20 70 61 72 73 65 20 69  ger, the parse i
25400 73 20 0d 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e  s ..      ** fin
25410 69 73 68 65 64 2e 20 4f 72 2c 20 69 66 20 69 74  ished. Or, if it
25420 20 69 73 20 61 20 66 6c 6f 61 74 69 6e 67 20 70   is a floating p
25430 6f 69 6e 74 20 76 61 6c 75 65 2c 20 69 74 20 6d  oint value, it m
25440 61 79 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  ay continue..   
25450 20 20 20 2a 2a 20 77 69 74 68 20 65 69 74 68 65     ** with eithe
25460 72 20 61 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e  r a decimal poin
25470 74 20 6f 72 20 61 6e 20 27 45 27 20 63 68 61 72  t or an 'E' char
25480 61 63 74 65 72 2e 20 2a 2f 0d 0a 20 20 20 20 20  acter. */..     
25490 20 69 66 28 20 2a 70 3d 3d 27 2e 27 20 26 26 20   if( *p=='.' && 
254a0 66 74 73 35 5f 69 73 64 69 67 69 74 28 70 5b 31  fts5_isdigit(p[1
254b0 5d 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70  ]) ){..        p
254c0 20 2b 3d 20 32 3b 0d 0a 20 20 20 20 20 20 20 20   += 2;..        
254d0 77 68 69 6c 65 28 20 66 74 73 35 5f 69 73 64 69  while( fts5_isdi
254e0 67 69 74 28 2a 70 29 20 29 20 70 2b 2b 3b 0d 0a  git(*p) ) p++;..
254f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69        }..      i
25500 66 28 20 70 3d 3d 70 49 6e 20 29 20 70 20 3d 20  f( p==pIn ) p = 
25510 30 3b 0d 0a 0d 0a 20 20 20 20 20 20 62 72 65 61  0;....      brea
25520 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 74  k;..  }....  ret
25530 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  urn p;..}..../*.
25540 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 68  .** The first ch
25550 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 73  aracter of the s
25560 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
25570 20 62 79 20 61 72 67 75 6d 65 6e 74 20 7a 20 69   by argument z i
25580 73 20 67 75 61 72 61 6e 74 65 65 64 0d 0a 2a 2a  s guaranteed..**
25590 20 74 6f 20 62 65 20 61 6e 20 6f 70 65 6e 2d 71   to be an open-q
255a0 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 28  uote character (
255b0 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  see function fts
255c0 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65 28 29 29  5_isopenquote())
255d0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73 20 66  ...**..** This f
255e0 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
255f0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
25600 6f 6e 64 69 6e 67 20 63 6c 6f 73 65 2d 71 75 6f  onding close-quo
25610 74 65 20 63 68 61 72 61 63 74 65 72 20 77 69 74  te character wit
25620 68 69 6e 0d 0a 2a 2a 20 74 68 65 20 73 74 72 69  hin..** the stri
25630 6e 67 20 61 6e 64 2c 20 69 66 20 66 6f 75 6e 64  ng and, if found
25640 2c 20 64 65 71 75 6f 74 65 73 20 74 68 65 20 73  , dequotes the s
25650 74 72 69 6e 67 20 69 6e 20 70 6c 61 63 65 20 61  tring in place a
25660 6e 64 20 61 64 64 73 20 61 20 6e 65 77 0d 0a 2a  nd adds a new..*
25670 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
25680 20 62 79 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49   byte...**..** I
25690 66 20 74 68 65 20 63 6c 6f 73 65 2d 71 75 6f 74  f the close-quot
256a0 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  e is found, the 
256b0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
256c0 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
256d0 74 20 6f 66 0d 0a 2a 2a 20 74 68 65 20 63 68 61  t of..** the cha
256e0 72 61 63 74 65 72 20 69 6d 6d 65 64 69 61 74 65  racter immediate
256f0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  ly following it.
25700 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6c 6f 73   Or, if the clos
25710 65 2d 71 75 6f 74 65 20 69 73 20 6e 6f 74 20 0d  e-quote is not .
25720 0a 2a 2a 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73  .** found, -1 is
25730 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 2d 31   returned. If -1
25740 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
25750 65 20 62 75 66 66 65 72 20 69 73 20 6c 65 66 74  e buffer is left
25760 20 69 6e 20 61 6e 20 0d 0a 2a 2a 20 75 6e 64 65   in an ..** unde
25770 66 69 6e 65 64 20 73 74 61 74 65 2e 0d 0a 2a 2f  fined state...*/
25780 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
25790 35 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a  5Dequote(char *z
257a0 29 7b 0d 0a 20 20 63 68 61 72 20 71 3b 0d 0a 20  ){..  char q;.. 
257b0 20 69 6e 74 20 69 49 6e 20 3d 20 31 3b 0d 0a 20   int iIn = 1;.. 
257c0 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 0d 0a   int iOut = 0;..
257d0 20 20 71 20 3d 20 7a 5b 30 5d 3b 0d 0a 0d 0a 20    q = z[0];.... 
257e0 20 2f 2a 20 53 65 74 20 73 74 61 63 6b 20 76 61   /* Set stack va
257f0 72 69 61 62 6c 65 20 71 20 74 6f 20 74 68 65 20  riable q to the 
25800 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63 68 61 72  close-quote char
25810 61 63 74 65 72 20 2a 2f 0d 0a 20 20 61 73 73 65  acter */..  asse
25820 72 74 28 20 71 3d 3d 27 5b 27 20 7c 7c 20 71 3d  rt( q=='[' || q=
25830 3d 27 5c 27 27 20 7c 7c 20 71 3d 3d 27 22 27 20  ='\'' || q=='"' 
25840 7c 7c 20 71 3d 3d 27 60 27 20 29 3b 0d 0a 20 20  || q=='`' );..  
25850 69 66 28 20 71 3d 3d 27 5b 27 20 29 20 71 20 3d  if( q=='[' ) q =
25860 20 27 5d 27 3b 20 20 0d 0a 0d 0a 20 20 77 68 69   ']';  ....  whi
25870 6c 65 28 20 41 4c 57 41 59 53 28 7a 5b 69 49 6e  le( ALWAYS(z[iIn
25880 5d 29 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 7a  ]) ){..    if( z
25890 5b 69 49 6e 5d 3d 3d 71 20 29 7b 0d 0a 20 20 20  [iIn]==q ){..   
258a0 20 20 20 69 66 28 20 7a 5b 69 49 6e 2b 31 5d 21     if( z[iIn+1]!
258b0 3d 71 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f  =q ){..        /
258c0 2a 20 43 68 61 72 61 63 74 65 72 20 69 49 6e 20  * Character iIn 
258d0 77 61 73 20 74 68 65 20 63 6c 6f 73 65 20 71 75  was the close qu
258e0 6f 74 65 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 20  ote. */..       
258f0 20 69 49 6e 2b 2b 3b 0d 0a 20 20 20 20 20 20 20   iIn++;..       
25900 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d   break;..      }
25910 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 2f  else{..        /
25920 2a 20 43 68 61 72 61 63 74 65 72 20 69 49 6e 20  * Character iIn 
25930 61 6e 64 20 69 49 6e 2b 31 20 66 6f 72 6d 20 61  and iIn+1 form a
25940 6e 20 65 73 63 61 70 65 64 20 71 75 6f 74 65 20  n escaped quote 
25950 63 68 61 72 61 63 74 65 72 2e 20 53 6b 69 70 0d  character. Skip.
25960 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
25970 69 6e 70 75 74 20 63 75 72 73 6f 72 20 70 61 73  input cursor pas
25980 74 20 62 6f 74 68 20 61 6e 64 20 63 6f 70 79 20  t both and copy 
25990 61 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 20 63  a single quote c
259a0 68 61 72 61 63 74 65 72 20 0d 0a 20 20 20 20 20  haracter ..     
259b0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f 75 74     ** to the out
259c0 70 75 74 20 62 75 66 66 65 72 2e 20 2a 2f 0d 0a  put buffer. */..
259d0 20 20 20 20 20 20 20 20 69 49 6e 20 2b 3d 20 32          iIn += 2
259e0 3b 0d 0a 20 20 20 20 20 20 20 20 7a 5b 69 4f 75  ;..        z[iOu
259f0 74 2b 2b 5d 20 3d 20 71 3b 0d 0a 20 20 20 20 20  t++] = q;..     
25a00 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a   }..    }else{..
25a10 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20        z[iOut++] 
25a20 3d 20 7a 5b 69 49 6e 2b 2b 5d 3b 0d 0a 20 20 20  = z[iIn++];..   
25a30 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 7a 5b 69   }..  }....  z[i
25a40 4f 75 74 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20 20  Out] = '\0';..  
25a50 72 65 74 75 72 6e 20 69 49 6e 3b 0d 0a 7d 0d 0a  return iIn;..}..
25a60 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76 65 72 74  ../*..** Convert
25a70 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71 75   an SQL-style qu
25a80 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74 6f  oted string into
25a90 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67   a normal string
25aa0 20 62 79 20 72 65 6d 6f 76 69 6e 67 0d 0a 2a 2a   by removing..**
25ab0 20 74 68 65 20 71 75 6f 74 65 20 63 68 61 72 61   the quote chara
25ac0 63 74 65 72 73 2e 20 20 54 68 65 20 63 6f 6e 76  cters.  The conv
25ad0 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20 69  ersion is done i
25ae0 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20 74 68 65  n-place.  If the
25af0 0d 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73 20  ..** input does 
25b00 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
25b10 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
25b20 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
25b30 69 6e 65 0d 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  ine..** is a no-
25b40 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45 78 61 6d  op...**..** Exam
25b50 70 6c 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20  ples:..**..**   
25b60 20 20 22 61 62 63 22 20 20 20 62 65 63 6f 6d 65    "abc"   become
25b70 73 20 20 20 61 62 63 0d 0a 2a 2a 20 20 20 20 20  s   abc..**     
25b80 27 78 79 7a 27 20 20 20 62 65 63 6f 6d 65 73 20  'xyz'   becomes 
25b90 20 20 78 79 7a 0d 0a 2a 2a 20 20 20 20 20 5b 70    xyz..**     [p
25ba0 71 72 5d 20 20 20 62 65 63 6f 6d 65 73 20 20 20  qr]   becomes   
25bb0 70 71 72 0d 0a 2a 2a 20 20 20 20 20 60 6d 6e 6f  pqr..**     `mno
25bc0 60 20 20 20 62 65 63 6f 6d 65 73 20 20 20 6d 6e  `   becomes   mn
25bd0 6f 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f  o..*/..static vo
25be0 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 44 65  id sqlite3Fts5De
25bf0 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b 0d  quote(char *z){.
25c00 0a 20 20 63 68 61 72 20 71 75 6f 74 65 3b 20 20  .  char quote;  
25c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c20 20 20 20 2f 2a 20 51 75 6f 74 65 20 63 68 61 72     /* Quote char
25c30 61 63 74 65 72 20 28 69 66 20 61 6e 79 20 29 20  acter (if any ) 
25c40 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20  */....  assert( 
25c50 30 3d 3d 66 74 73 35 5f 69 73 77 68 69 74 65 73  0==fts5_iswhites
25c60 70 61 63 65 28 7a 5b 30 5d 29 20 29 3b 0d 0a 20  pace(z[0]) );.. 
25c70 20 71 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0d 0a   quote = z[0];..
25c80 20 20 69 66 28 20 71 75 6f 74 65 3d 3d 27 5b 27    if( quote=='['
25c90 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 5c 27 27 20   || quote=='\'' 
25ca0 7c 7c 20 71 75 6f 74 65 3d 3d 27 22 27 20 7c 7c  || quote=='"' ||
25cb0 20 71 75 6f 74 65 3d 3d 27 60 27 20 29 7b 0d 0a   quote=='`' ){..
25cc0 20 20 20 20 66 74 73 35 44 65 71 75 6f 74 65 28      fts5Dequote(
25cd0 7a 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d  z);..  }..}.....
25ce0 0a 73 74 72 75 63 74 20 46 74 73 35 45 6e 75 6d  .struct Fts5Enum
25cf0 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   {..  const char
25d00 20 2a 7a 4e 61 6d 65 3b 0d 0a 20 20 69 6e 74 20   *zName;..  int 
25d10 65 56 61 6c 3b 0d 0a 7d 3b 0d 0a 74 79 70 65 64  eVal;..};..typed
25d20 65 66 20 73 74 72 75 63 74 20 46 74 73 35 45 6e  ef struct Fts5En
25d30 75 6d 20 46 74 73 35 45 6e 75 6d 3b 0d 0a 0d 0a  um Fts5Enum;....
25d40 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43  static int fts5C
25d50 6f 6e 66 69 67 53 65 74 45 6e 75 6d 28 0d 0a 20  onfigSetEnum(.. 
25d60 20 63 6f 6e 73 74 20 46 74 73 35 45 6e 75 6d 20   const Fts5Enum 
25d70 2a 61 45 6e 75 6d 2c 20 0d 0a 20 20 63 6f 6e 73  *aEnum, ..  cons
25d80 74 20 63 68 61 72 20 2a 7a 45 6e 75 6d 2c 20 0d  t char *zEnum, .
25d90 0a 20 20 69 6e 74 20 2a 70 65 56 61 6c 0d 0a 29  .  int *peVal..)
25da0 7b 0d 0a 20 20 69 6e 74 20 6e 45 6e 75 6d 20 3d  {..  int nEnum =
25db0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 45 6e   (int)strlen(zEn
25dc0 75 6d 29 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a  um);..  int i;..
25dd0 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 2d 31 3b    int iVal = -1;
25de0 0d 0a 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61  ....  for(i=0; a
25df0 45 6e 75 6d 5b 69 5d 2e 7a 4e 61 6d 65 3b 20 69  Enum[i].zName; i
25e00 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28 20 73 71  ++){..    if( sq
25e10 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61  lite3_strnicmp(a
25e20 45 6e 75 6d 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  Enum[i].zName, z
25e30 45 6e 75 6d 2c 20 6e 45 6e 75 6d 29 3d 3d 30 20  Enum, nEnum)==0 
25e40 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 69 56  ){..      if( iV
25e50 61 6c 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 53  al>=0 ) return S
25e60 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20  QLITE_ERROR;..  
25e70 20 20 20 20 69 56 61 6c 20 3d 20 61 45 6e 75 6d      iVal = aEnum
25e80 5b 69 5d 2e 65 56 61 6c 3b 0d 0a 20 20 20 20 7d  [i].eVal;..    }
25e90 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 65 56 61  ..  }....  *peVa
25ea0 6c 20 3d 20 69 56 61 6c 3b 0d 0a 20 20 72 65 74  l = iVal;..  ret
25eb0 75 72 6e 20 69 56 61 6c 3c 30 20 3f 20 53 51 4c  urn iVal<0 ? SQL
25ec0 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49  ITE_ERROR : SQLI
25ed0 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  TE_OK;..}..../*.
25ee0 0a 2a 2a 20 50 61 72 73 65 20 61 20 22 73 70 65  .** Parse a "spe
25ef0 63 69 61 6c 22 20 43 52 45 41 54 45 20 56 49 52  cial" CREATE VIR
25f00 54 55 41 4c 20 54 41 42 4c 45 20 64 69 72 65 63  TUAL TABLE direc
25f10 74 69 76 65 20 61 6e 64 20 75 70 64 61 74 65 0d  tive and update.
25f20 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  .** configuratio
25f30 6e 20 6f 62 6a 65 63 74 20 70 43 6f 6e 66 69 67  n object pConfig
25f40 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
25f50 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75 63 63  ..**..** If succ
25f60 65 73 73 66 75 6c 2c 20 6f 62 6a 65 63 74 20 70  essful, object p
25f70 43 6f 6e 66 69 67 20 69 73 20 75 70 64 61 74 65  Config is update
25f80 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
25f90 72 65 74 75 72 6e 65 64 2e 20 49 66 0d 0a 2a 2a  returned. If..**
25fa0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
25fb0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
25fc0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
25fd0 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
25fe0 6d 65 73 73 61 67 65 0d 0a 2a 2a 20 6d 61 79 20  message..** may 
25ff0 62 65 20 6c 65 66 74 20 69 6e 20 2a 70 7a 45 72  be left in *pzEr
26000 72 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  r. It is the res
26010 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
26020 68 65 20 63 61 6c 6c 65 72 20 74 6f 0d 0a 2a 2a  he caller to..**
26030 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
26040 20 61 6e 79 20 73 75 63 68 20 65 72 72 6f 72 20   any such error 
26050 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
26060 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0d 0a 2a  lite3_free()...*
26070 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
26080 73 35 43 6f 6e 66 69 67 50 61 72 73 65 53 70 65  s5ConfigParseSpe
26090 63 69 61 6c 28 0d 0a 20 20 46 74 73 35 47 6c 6f  cial(..  Fts5Glo
260a0 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 0d 0a 20  bal *pGlobal,.. 
260b0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
260c0 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20  nfig,           
260d0 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
260e0 6e 20 6f 62 6a 65 63 74 20 74 6f 20 75 70 64 61  n object to upda
260f0 74 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63  te */..  const c
26100 68 61 72 20 2a 7a 43 6d 64 2c 20 20 20 20 20 20  har *zCmd,      
26110 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 65 63           /* Spec
26120 69 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70  ial command to p
26130 61 72 73 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74  arse */..  const
26140 20 63 68 61 72 20 2a 7a 41 72 67 2c 20 20 20 20   char *zArg,    
26150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
26160 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65 20  gument to parse 
26170 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  */..  char **pzE
26180 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
26190 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
261a0 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0d 0a  ror message */..
261b0 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ){..  int rc = S
261c0 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 6e 74  QLITE_OK;..  int
261d0 20 6e 43 6d 64 20 3d 20 28 69 6e 74 29 73 74 72   nCmd = (int)str
261e0 6c 65 6e 28 7a 43 6d 64 29 3b 0d 0a 20 20 69 66  len(zCmd);..  if
261f0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
26200 6d 70 28 22 70 72 65 66 69 78 22 2c 20 7a 43 6d  mp("prefix", zCm
26210 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b 0d 0a  d, nCmd)==0 ){..
26220 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42      const int nB
26230 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 69 6e 74  yte = sizeof(int
26240 29 20 2a 20 46 54 53 35 5f 4d 41 58 5f 50 52 45  ) * FTS5_MAX_PRE
26250 46 49 58 5f 49 4e 44 45 58 45 53 3b 0d 0a 20 20  FIX_INDEXES;..  
26260 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b    const char *p;
26270 0d 0a 20 20 20 20 69 6e 74 20 62 46 69 72 73 74  ..    int bFirst
26280 20 3d 20 31 3b 0d 0a 20 20 20 20 69 66 28 20 70   = 1;..    if( p
26290 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 3d  Config->aPrefix=
262a0 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 70 43 6f  =0 ){..      pCo
262b0 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 20 3d 20  nfig->aPrefix = 
262c0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
262d0 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65  cZero(&rc, nByte
262e0 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
262f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20   ) return rc;.. 
26300 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 20 3d 20     }....    p = 
26310 7a 41 72 67 3b 0d 0a 20 20 20 20 77 68 69 6c 65  zArg;..    while
26320 28 20 31 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e  ( 1 ){..      in
26330 74 20 6e 50 72 65 20 3d 20 30 3b 0d 0a 0d 0a 20  t nPre = 0;.... 
26340 20 20 20 20 20 77 68 69 6c 65 28 20 70 5b 30 5d       while( p[0]
26350 3d 3d 27 20 27 20 29 20 70 2b 2b 3b 0d 0a 20 20  ==' ' ) p++;..  
26360 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d      if( bFirst==
26370 30 20 26 26 20 70 5b 30 5d 3d 3d 27 2c 27 20 29  0 && p[0]==',' )
26380 7b 0d 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b 0d  {..        p++;.
26390 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
263a0 70 5b 30 5d 3d 3d 27 20 27 20 29 20 70 2b 2b 3b  p[0]==' ' ) p++;
263b0 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ..      }else if
263c0 28 20 70 5b 30 5d 3d 3d 27 5c 30 27 20 29 7b 0d  ( p[0]=='\0' ){.
263d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
263e0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
263f0 69 66 28 20 70 5b 30 5d 3c 27 30 27 20 7c 7c 20  if( p[0]<'0' || 
26400 70 5b 30 5d 3e 27 39 27 20 29 7b 0d 0a 20 20 20  p[0]>'9' ){..   
26410 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
26420 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d  lite3_mprintf("m
26430 61 6c 66 6f 72 6d 65 64 20 70 72 65 66 69 78 3d  alformed prefix=
26440 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 22 29 3b  ... directive");
26450 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ..        rc = S
26460 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20  QLITE_ERROR;..  
26470 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
26480 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
26490 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  f( pConfig->nPre
264a0 66 69 78 3d 3d 46 54 53 35 5f 4d 41 58 5f 50 52  fix==FTS5_MAX_PR
264b0 45 46 49 58 5f 49 4e 44 45 58 45 53 20 29 7b 0d  EFIX_INDEXES ){.
264c0 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20  .        *pzErr 
264d0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
264e0 66 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f(..            
264f0 22 74 6f 6f 20 6d 61 6e 79 20 70 72 65 66 69 78  "too many prefix
26500 20 69 6e 64 65 78 65 73 20 28 6d 61 78 20 25 64   indexes (max %d
26510 29 22 2c 20 46 54 53 35 5f 4d 41 58 5f 50 52 45  )", FTS5_MAX_PRE
26520 46 49 58 5f 49 4e 44 45 58 45 53 0d 0a 20 20 20  FIX_INDEXES..   
26530 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20 20 20       );..       
26540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26550 4f 52 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65  OR;..        bre
26560 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ak;..      }....
26570 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 5b 30        while( p[0
26580 5d 3e 3d 27 30 27 20 26 26 20 70 5b 30 5d 3c 3d  ]>='0' && p[0]<=
26590 27 39 27 20 26 26 20 6e 50 72 65 3c 31 30 30 30  '9' && nPre<1000
265a0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 6e 50 72   ){..        nPr
265b0 65 20 3d 20 6e 50 72 65 2a 31 30 20 2b 20 28 70  e = nPre*10 + (p
265c0 5b 30 5d 20 2d 20 27 30 27 29 3b 0d 0a 20 20 20  [0] - '0');..   
265d0 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 20 20 20       p++;..     
265e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 28 20   }....      if( 
265f0 6e 50 72 65 3c 3d 30 20 7c 7c 20 6e 50 72 65 3e  nPre<=0 || nPre>
26600 3d 31 30 30 30 20 29 7b 0d 0a 20 20 20 20 20 20  =1000 ){..      
26610 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
26620 65 33 5f 6d 70 72 69 6e 74 66 28 22 70 72 65 66  e3_mprintf("pref
26630 69 78 20 6c 65 6e 67 74 68 20 6f 75 74 20 6f 66  ix length out of
26640 20 72 61 6e 67 65 20 28 6d 61 78 20 39 39 39 29   range (max 999)
26650 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20  ");..        rc 
26660 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d  = SQLITE_ERROR;.
26670 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
26680 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
26690 20 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66    pConfig->aPref
266a0 69 78 5b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  ix[pConfig->nPre
266b0 66 69 78 5d 20 3d 20 6e 50 72 65 3b 0d 0a 20 20  fix] = nPre;..  
266c0 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72      pConfig->nPr
266d0 65 66 69 78 2b 2b 3b 0d 0a 20 20 20 20 20 20 62  efix++;..      b
266e0 46 69 72 73 74 20 3d 20 30 3b 0d 0a 20 20 20 20  First = 0;..    
266f0 7d 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
26700 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3c  Config->nPrefix<
26710 3d 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49 58  =FTS5_MAX_PREFIX
26720 5f 49 4e 44 45 58 45 53 20 29 3b 0d 0a 20 20 20  _INDEXES );..   
26730 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d   return rc;..  }
26740 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ....  if( sqlite
26750 33 5f 73 74 72 6e 69 63 6d 70 28 22 74 6f 6b 65  3_strnicmp("toke
26760 6e 69 7a 65 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d  nize", zCmd, nCm
26770 64 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 63 6f  d)==0 ){..    co
26780 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20 28 63  nst char *p = (c
26790 6f 6e 73 74 20 63 68 61 72 2a 29 7a 41 72 67 3b  onst char*)zArg;
267a0 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ..    sqlite3_in
267b0 74 36 34 20 6e 41 72 67 20 3d 20 73 74 72 6c 65  t64 nArg = strle
267c0 6e 28 7a 41 72 67 29 20 2b 20 31 3b 0d 0a 20 20  n(zArg) + 1;..  
267d0 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 20 3d    char **azArg =
267e0 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c   sqlite3Fts5Mall
267f0 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
26800 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 41 72 67  of(char*) * nArg
26810 29 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a 70 44  );..    char *pD
26820 65 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  el = sqlite3Fts5
26830 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
26840 6e 41 72 67 20 2a 20 32 29 3b 0d 0a 20 20 20 20  nArg * 2);..    
26850 63 68 61 72 20 2a 70 53 70 61 63 65 20 3d 20 70  char *pSpace = p
26860 44 65 6c 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20  Del;....    if( 
26870 61 7a 41 72 67 20 26 26 20 70 53 70 61 63 65 20  azArg && pSpace 
26880 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 43  ){..      if( pC
26890 6f 6e 66 69 67 2d 3e 70 54 6f 6b 20 29 7b 0d 0a  onfig->pTok ){..
268a0 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d          *pzErr =
268b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
268c0 28 22 6d 75 6c 74 69 70 6c 65 20 74 6f 6b 65 6e  ("multiple token
268d0 69 7a 65 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76  ize=... directiv
268e0 65 73 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 72  es");..        r
268f0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
26900 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d  ;..      }else{.
26910 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e 41 72  .        for(nAr
26920 67 3d 30 3b 20 70 20 26 26 20 2a 70 3b 20 6e 41  g=0; p && *p; nA
26930 72 67 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20  rg++){..        
26940 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 32    const char *p2
26950 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69   = fts5ConfigSki
26960 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b 0d  pWhitespace(p);.
26970 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a  .          if( *
26980 70 32 3d 3d 27 5c 27 27 20 29 7b 0d 0a 20 20 20  p2=='\'' ){..   
26990 20 20 20 20 20 20 20 20 20 70 20 3d 20 66 74 73           p = fts
269a0 35 43 6f 6e 66 69 67 53 6b 69 70 4c 69 74 65 72  5ConfigSkipLiter
269b0 61 6c 28 70 32 29 3b 0d 0a 20 20 20 20 20 20 20  al(p2);..       
269c0 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
269d0 20 20 20 20 20 20 20 70 20 3d 20 66 74 73 35 43         p = fts5C
269e0 6f 6e 66 69 67 53 6b 69 70 42 61 72 65 77 6f 72  onfigSkipBarewor
269f0 64 28 70 32 29 3b 0d 0a 20 20 20 20 20 20 20 20  d(p2);..        
26a00 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
26a10 66 28 20 70 20 29 7b 0d 0a 20 20 20 20 20 20 20  f( p ){..       
26a20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53 70 61       memcpy(pSpa
26a30 63 65 2c 20 70 32 2c 20 70 2d 70 32 29 3b 0d 0a  ce, p2, p-p2);..
26a40 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
26a50 67 5b 6e 41 72 67 5d 20 3d 20 70 53 70 61 63 65  g[nArg] = pSpace
26a60 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ;..            s
26a70 71 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f 74  qlite3Fts5Dequot
26a80 65 28 70 53 70 61 63 65 29 3b 0d 0a 20 20 20 20  e(pSpace);..    
26a90 20 20 20 20 20 20 20 20 70 53 70 61 63 65 20 2b          pSpace +
26aa0 3d 20 28 70 20 2d 20 70 32 29 20 2b 20 31 3b 0d  = (p - p2) + 1;.
26ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 20 3d  .            p =
26ac0 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57   fts5ConfigSkipW
26ad0 68 69 74 65 73 70 61 63 65 28 70 29 3b 0d 0a 20  hitespace(p);.. 
26ae0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
26af0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69      }..        i
26b00 66 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  f( p==0 ){..    
26b10 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73        *pzErr = s
26b20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
26b30 70 61 72 73 65 20 65 72 72 6f 72 20 69 6e 20 74  parse error in t
26b40 6f 6b 65 6e 69 7a 65 20 64 69 72 65 63 74 69 76  okenize directiv
26b50 65 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  e");..          
26b60 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26b70 52 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  R;..        }els
26b80 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63  e{..          rc
26b90 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
26ba0 74 54 6f 6b 65 6e 69 7a 65 72 28 70 47 6c 6f 62  tTokenizer(pGlob
26bb0 61 6c 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 20  al, ..          
26bc0 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
26bd0 2a 29 61 7a 41 72 67 2c 20 28 69 6e 74 29 6e 41  *)azArg, (int)nA
26be0 72 67 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 70 54  rg, &pConfig->pT
26bf0 6f 6b 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 70 54  ok, &pConfig->pT
26c00 6f 6b 41 70 69 2c 0d 0a 20 20 20 20 20 20 20 20  okApi,..        
26c10 20 20 20 20 20 20 70 7a 45 72 72 0d 0a 20 20 20        pzErr..   
26c20 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20 20         );..     
26c30 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
26c40 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 71 6c 69     }....    sqli
26c50 74 65 33 5f 66 72 65 65 28 61 7a 41 72 67 29 3b  te3_free(azArg);
26c60 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
26c70 65 65 28 70 44 65 6c 29 3b 0d 0a 20 20 20 20 72  ee(pDel);..    r
26c80 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a  eturn rc;..  }..
26c90 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
26ca0 73 74 72 6e 69 63 6d 70 28 22 63 6f 6e 74 65 6e  strnicmp("conten
26cb0 74 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d  t", zCmd, nCmd)=
26cc0 3d 30 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 70  =0 ){..    if( p
26cd0 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74  Config->eContent
26ce0 21 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e  !=FTS5_CONTENT_N
26cf0 4f 52 4d 41 4c 20 29 7b 0d 0a 20 20 20 20 20 20  ORMAL ){..      
26d00 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
26d10 5f 6d 70 72 69 6e 74 66 28 22 6d 75 6c 74 69 70  _mprintf("multip
26d20 6c 65 20 63 6f 6e 74 65 6e 74 3d 2e 2e 2e 20 64  le content=... d
26d30 69 72 65 63 74 69 76 65 73 22 29 3b 0d 0a 20 20  irectives");..  
26d40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26d50 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 65 6c 73  ERROR;..    }els
26d60 65 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 7a 41  e{..      if( zA
26d70 72 67 5b 30 5d 20 29 7b 0d 0a 20 20 20 20 20 20  rg[0] ){..      
26d80 20 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74    pConfig->eCont
26d90 65 6e 74 20 3d 20 46 54 53 35 5f 43 4f 4e 54 45  ent = FTS5_CONTE
26da0 4e 54 5f 45 58 54 45 52 4e 41 4c 3b 0d 0a 20 20  NT_EXTERNAL;..  
26db0 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
26dc0 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
26dd0 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63  3Fts5Mprintf(&rc
26de0 2c 20 22 25 51 2e 25 51 22 2c 20 70 43 6f 6e 66  , "%Q.%Q", pConf
26df0 69 67 2d 3e 7a 44 62 2c 7a 41 72 67 29 3b 0d 0a  ig->zDb,zArg);..
26e00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20        }else{..  
26e10 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 65        pConfig->e
26e20 43 6f 6e 74 65 6e 74 20 3d 20 46 54 53 35 5f 43  Content = FTS5_C
26e30 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 3b 0d 0a 20 20  ONTENT_NONE;..  
26e40 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
26e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20    return rc;..  
26e60 7d 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c 69 74  }....  if( sqlit
26e70 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 63 6f 6e  e3_strnicmp("con
26e80 74 65 6e 74 5f 72 6f 77 69 64 22 2c 20 7a 43 6d  tent_rowid", zCm
26e90 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b 0d 0a  d, nCmd)==0 ){..
26ea0 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
26eb0 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 20 29  >zContentRowid )
26ec0 7b 0d 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20  {..      *pzErr 
26ed0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
26ee0 66 28 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 74  f("multiple cont
26ef0 65 6e 74 5f 72 6f 77 69 64 3d 2e 2e 2e 20 64 69  ent_rowid=... di
26f00 72 65 63 74 69 76 65 73 22 29 3b 0d 0a 20 20 20  rectives");..   
26f10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26f20 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 65 6c 73 65  RROR;..    }else
26f30 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  {..      pConfig
26f40 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 20  ->zContentRowid 
26f50 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 72  = sqlite3Fts5Str
26f60 6e 64 75 70 28 26 72 63 2c 20 7a 41 72 67 2c 20  ndup(&rc, zArg, 
26f70 2d 31 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  -1);..    }..   
26f80 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d   return rc;..  }
26f90 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ....  if( sqlite
26fa0 33 5f 73 74 72 6e 69 63 6d 70 28 22 63 6f 6c 75  3_strnicmp("colu
26fb0 6d 6e 73 69 7a 65 22 2c 20 7a 43 6d 64 2c 20 6e  mnsize", zCmd, n
26fc0 43 6d 64 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  Cmd)==0 ){..    
26fd0 69 66 28 20 28 7a 41 72 67 5b 30 5d 21 3d 27 30  if( (zArg[0]!='0
26fe0 27 20 26 26 20 7a 41 72 67 5b 30 5d 21 3d 27 31  ' && zArg[0]!='1
26ff0 27 29 20 7c 7c 20 7a 41 72 67 5b 31 5d 21 3d 27  ') || zArg[1]!='
27000 5c 30 27 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70  \0' ){..      *p
27010 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
27020 70 72 69 6e 74 66 28 22 6d 61 6c 66 6f 72 6d 65  printf("malforme
27030 64 20 63 6f 6c 75 6d 6e 73 69 7a 65 3d 2e 2e 2e  d columnsize=...
27040 20 64 69 72 65 63 74 69 76 65 22 29 3b 0d 0a 20   directive");.. 
27050 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27060 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 65 6c  _ERROR;..    }el
27070 73 65 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66  se{..      pConf
27080 69 67 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20  ig->bColumnsize 
27090 3d 20 28 7a 41 72 67 5b 30 5d 3d 3d 27 31 27 29  = (zArg[0]=='1')
270a0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65  ;..    }..    re
270b0 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 0d  turn rc;..  }...
270c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
270d0 74 72 6e 69 63 6d 70 28 22 64 65 74 61 69 6c 22  trnicmp("detail"
270e0 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30  , zCmd, nCmd)==0
270f0 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 20 46   ){..    const F
27100 74 73 35 45 6e 75 6d 20 61 44 65 74 61 69 6c 5b  ts5Enum aDetail[
27110 5d 20 3d 20 7b 0d 0a 20 20 20 20 20 20 7b 20 22  ] = {..      { "
27120 6e 6f 6e 65 22 2c 20 46 54 53 35 5f 44 45 54 41  none", FTS5_DETA
27130 49 4c 5f 4e 4f 4e 45 20 7d 2c 0d 0a 20 20 20 20  IL_NONE },..    
27140 20 20 7b 20 22 66 75 6c 6c 22 2c 20 46 54 53 35    { "full", FTS5
27150 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 7d 2c 0d  _DETAIL_FULL },.
27160 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e  .      { "column
27170 73 22 2c 20 46 54 53 35 5f 44 45 54 41 49 4c 5f  s", FTS5_DETAIL_
27180 43 4f 4c 55 4d 4e 53 20 7d 2c 0d 0a 20 20 20 20  COLUMNS },..    
27190 20 20 7b 20 30 2c 20 30 20 7d 0d 0a 20 20 20 20    { 0, 0 }..    
271a0 7d 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 28 72  };....    if( (r
271b0 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 65  c = fts5ConfigSe
271c0 74 45 6e 75 6d 28 61 44 65 74 61 69 6c 2c 20 7a  tEnum(aDetail, z
271d0 41 72 67 2c 20 26 70 43 6f 6e 66 69 67 2d 3e 65  Arg, &pConfig->e
271e0 44 65 74 61 69 6c 29 29 20 29 7b 0d 0a 20 20 20  Detail)) ){..   
271f0 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
27200 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c  te3_mprintf("mal
27210 66 6f 72 6d 65 64 20 64 65 74 61 69 6c 3d 2e 2e  formed detail=..
27220 2e 20 64 69 72 65 63 74 69 76 65 22 29 3b 0d 0a  . directive");..
27230 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72      }..    retur
27240 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  n rc;..  }....  
27250 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
27260 5f 6d 70 72 69 6e 74 66 28 22 75 6e 72 65 63 6f  _mprintf("unreco
27270 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 5c  gnized option: \
27280 22 25 2e 2a 73 5c 22 22 2c 20 6e 43 6d 64 2c 20  "%.*s\"", nCmd, 
27290 7a 43 6d 64 29 3b 0d 0a 20 20 72 65 74 75 72 6e  zCmd);..  return
272a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a   SQLITE_ERROR;..
272b0 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 6f  }..../*..** Allo
272c0 63 61 74 65 20 61 6e 20 69 6e 73 74 61 6e 63 65  cate an instance
272d0 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
272e0 74 6f 6b 65 6e 69 7a 65 72 20 28 22 73 69 6d 70  tokenizer ("simp
272f0 6c 65 22 29 20 61 74 20 0d 0a 2a 2a 20 46 74 73  le") at ..** Fts
27300 35 43 6f 6e 66 69 67 2e 70 54 6f 6b 65 6e 69 7a  5Config.pTokeniz
27310 65 72 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  er. Return SQLIT
27320 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
27330 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
27340 20 65 72 72 6f 72 0d 0a 2a 2a 20 63 6f 64 65 20   error..** code 
27350 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
27360 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  rs...*/..static 
27370 69 6e 74 20 66 74 73 35 43 6f 6e 66 69 67 44 65  int fts5ConfigDe
27380 66 61 75 6c 74 54 6f 6b 65 6e 69 7a 65 72 28 46  faultTokenizer(F
27390 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62  ts5Global *pGlob
273a0 61 6c 2c 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  al, Fts5Config *
273b0 70 43 6f 6e 66 69 67 29 7b 0d 0a 20 20 61 73 73  pConfig){..  ass
273c0 65 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e 70 54  ert( pConfig->pT
273d0 6f 6b 3d 3d 30 20 26 26 20 70 43 6f 6e 66 69 67  ok==0 && pConfig
273e0 2d 3e 70 54 6f 6b 41 70 69 3d 3d 30 20 29 3b 0d  ->pTokApi==0 );.
273f0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
27400 33 46 74 73 35 47 65 74 54 6f 6b 65 6e 69 7a 65  3Fts5GetTokenize
27410 72 28 0d 0a 20 20 20 20 20 20 70 47 6c 6f 62 61  r(..      pGloba
27420 6c 2c 20 30 2c 20 30 2c 20 26 70 43 6f 6e 66 69  l, 0, 0, &pConfi
27430 67 2d 3e 70 54 6f 6b 2c 20 26 70 43 6f 6e 66 69  g->pTok, &pConfi
27440 67 2d 3e 70 54 6f 6b 41 70 69 2c 20 30 0d 0a 20  g->pTokApi, 0.. 
27450 20 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a   );..}..../*..**
27460 20 47 6f 62 62 6c 65 20 75 70 20 74 68 65 20 66   Gobble up the f
27470 69 72 73 74 20 62 61 72 65 77 6f 72 64 20 6f 72  irst bareword or
27480 20 71 75 6f 74 65 64 20 77 6f 72 64 20 66 72 6f   quoted word fro
27490 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
274a0 65 72 20 7a 49 6e 2e 0d 0a 2a 2a 20 52 65 74 75  er zIn...** Retu
274b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
274c0 74 68 65 20 63 68 61 72 61 63 74 65 72 20 69 6d  the character im
274d0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
274e0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 69 6e 0d  ing the last in.
274f0 0a 2a 2a 20 74 68 65 20 67 6f 62 62 6c 65 64 20  .** the gobbled 
27500 77 6f 72 64 20 69 66 20 73 75 63 63 65 73 73 66  word if successf
27510 75 6c 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f  ul, or a NULL po
27520 69 6e 74 65 72 20 6f 74 68 65 72 77 69 73 65 20  inter otherwise 
27530 28 66 61 69 6c 65 64 0d 0a 2a 2a 20 74 6f 20 66  (failed..** to f
27540 69 6e 64 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20  ind close-quote 
27550 63 68 61 72 61 63 74 65 72 29 2e 0d 0a 2a 2a 0d  character)...**.
27560 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
27570 6e 69 6e 67 2c 20 73 65 74 20 70 7a 4f 75 74 20  ning, set pzOut 
27580 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e 65  to point to a ne
27590 77 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  w buffer contain
275a0 69 6e 67 20 61 0d 0a 2a 2a 20 6e 75 6c 2d 74 65  ing a..** nul-te
275b0 72 6d 69 6e 61 74 65 64 2c 20 64 65 71 75 6f 74  rminated, dequot
275c0 65 64 20 63 6f 70 79 20 6f 66 20 74 68 65 20 67  ed copy of the g
275d0 6f 62 62 6c 65 64 20 77 6f 72 64 2e 20 49 66 20  obbled word. If 
275e0 74 68 65 20 77 6f 72 64 20 77 61 73 0d 0a 2a 2a  the word was..**
275f0 20 71 75 6f 74 65 64 2c 20 2a 70 62 51 75 6f 74   quoted, *pbQuot
27600 65 64 20 69 73 20 61 6c 73 6f 20 73 65 74 20 74  ed is also set t
27610 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75 72  o 1 before retur
27620 6e 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66  ning...**..** If
27630 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20 74   *pRc is other t
27640 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  han SQLITE_OK wh
27650 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27660 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
27670 73 0d 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 20 28 4e  s..** a no-op (N
27680 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 29  ULL is returned)
27690 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
276a0 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77 69  an OOM occurs wi
276b0 74 68 69 6e 20 74 68 69 73 0d 0a 2a 2a 20 66 75  thin this..** fu
276c0 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73 20  nction, *pRc is 
276d0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
276e0 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
276f0 6e 69 6e 67 2e 20 2a 70 52 63 20 69 73 20 2a 6e  ning. *pRc is *n
27700 6f 74 2a 0d 0a 2a 2a 20 73 65 74 20 69 66 20 61  ot*..** set if a
27710 20 70 61 72 73 65 20 65 72 72 6f 72 20 28 66 61   parse error (fa
27720 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 63 6c 6f  iled to find clo
27730 73 65 20 71 75 6f 74 65 29 20 6f 63 63 75 72 73  se quote) occurs
27740 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 63 6f  ...*/..static co
27750 6e 73 74 20 63 68 61 72 20 2a 66 74 73 35 43 6f  nst char *fts5Co
27760 6e 66 69 67 47 6f 62 62 6c 65 57 6f 72 64 28 0d  nfigGobbleWord(.
27770 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
27780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27790 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72     /* IN/OUT: Er
277a0 72 6f 72 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 63  ror code */..  c
277b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
277d0 2a 20 42 75 66 66 65 72 20 74 6f 20 67 6f 62 62  * Buffer to gobb
277e0 6c 65 20 73 74 72 69 6e 67 2f 62 61 72 65 77 6f  le string/barewo
277f0 72 64 20 66 72 6f 6d 20 2a 2f 0d 0a 20 20 63 68  rd from */..  ch
27800 61 72 20 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20  ar **pzOut,     
27810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27820 20 4f 55 54 3a 20 6d 61 6c 6c 6f 63 27 64 20 62   OUT: malloc'd b
27830 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
27840 20 73 74 72 2f 62 77 20 2a 2f 0d 0a 20 20 69 6e   str/bw */..  in
27850 74 20 2a 70 62 51 75 6f 74 65 64 20 20 20 20 20  t *pbQuoted     
27860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27870 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74 72 75   OUT: Set to tru
27880 65 20 69 66 20 64 65 71 75 6f 74 69 6e 67 20 72  e if dequoting r
27890 65 71 75 69 72 65 64 20 2a 2f 0d 0a 29 7b 0d 0a  equired */..){..
278a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
278b0 65 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20 73 71 6c  et = 0;....  sql
278c0 69 74 65 33 5f 69 6e 74 36 34 20 6e 49 6e 20 3d  ite3_int64 nIn =
278d0 20 73 74 72 6c 65 6e 28 7a 49 6e 29 3b 0d 0a 20   strlen(zIn);.. 
278e0 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
278f0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
27900 49 6e 2b 31 29 3b 0d 0a 0d 0a 20 20 61 73 73 65  In+1);....  asse
27910 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  rt( *pRc==SQLITE
27920 5f 4f 4b 20 29 3b 0d 0a 20 20 2a 70 62 51 75 6f  _OK );..  *pbQuo
27930 74 65 64 20 3d 20 30 3b 0d 0a 20 20 2a 70 7a 4f  ted = 0;..  *pzO
27940 75 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20 69 66 28  ut = 0;....  if(
27950 20 7a 4f 75 74 3d 3d 30 20 29 7b 0d 0a 20 20 20   zOut==0 ){..   
27960 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
27970 4f 4d 45 4d 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d  OMEM;..  }else{.
27980 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74  .    memcpy(zOut
27990 2c 20 7a 49 6e 2c 20 28 73 69 7a 65 5f 74 29 28  , zIn, (size_t)(
279a0 6e 49 6e 2b 31 29 29 3b 0d 0a 20 20 20 20 69 66  nIn+1));..    if
279b0 28 20 66 74 73 35 5f 69 73 6f 70 65 6e 71 75 6f  ( fts5_isopenquo
279c0 74 65 28 7a 4f 75 74 5b 30 5d 29 20 29 7b 0d 0a  te(zOut[0]) ){..
279d0 20 20 20 20 20 20 69 6e 74 20 69 69 20 3d 20 66        int ii = f
279e0 74 73 35 44 65 71 75 6f 74 65 28 7a 4f 75 74 29  ts5Dequote(zOut)
279f0 3b 0d 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20  ;..      zRet = 
27a00 26 7a 49 6e 5b 69 69 5d 3b 0d 0a 20 20 20 20 20  &zIn[ii];..     
27a10 20 2a 70 62 51 75 6f 74 65 64 20 3d 20 31 3b 0d   *pbQuoted = 1;.
27a20 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  .    }else{..   
27a30 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 43 6f     zRet = fts5Co
27a40 6e 66 69 67 53 6b 69 70 42 61 72 65 77 6f 72 64  nfigSkipBareword
27a50 28 7a 49 6e 29 3b 0d 0a 20 20 20 20 20 20 69 66  (zIn);..      if
27a60 28 20 7a 52 65 74 20 29 7b 0d 0a 20 20 20 20 20  ( zRet ){..     
27a70 20 20 20 7a 4f 75 74 5b 7a 52 65 74 2d 7a 49 6e     zOut[zRet-zIn
27a80 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20 20 20 20 20  ] = '\0';..     
27a90 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a   }..    }..  }..
27aa0 0d 0a 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20  ..  if( zRet==0 
27ab0 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){..    sqlite3_
27ac0 66 72 65 65 28 7a 4f 75 74 29 3b 0d 0a 20 20 7d  free(zOut);..  }
27ad0 65 6c 73 65 7b 0d 0a 20 20 20 20 2a 70 7a 4f 75  else{..    *pzOu
27ae0 74 20 3d 20 7a 4f 75 74 3b 0d 0a 20 20 7d 0d 0a  t = zOut;..  }..
27af0 0d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
27b00 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e  ..}....static in
27b10 74 20 66 74 73 35 43 6f 6e 66 69 67 50 61 72 73  t fts5ConfigPars
27b20 65 43 6f 6c 75 6d 6e 28 0d 0a 20 20 46 74 73 35  eColumn(..  Fts5
27b30 43 6f 6e 66 69 67 20 2a 70 2c 20 0d 0a 20 20 63  Config *p, ..  c
27b40 68 61 72 20 2a 7a 43 6f 6c 2c 20 0d 0a 20 20 63  har *zCol, ..  c
27b50 68 61 72 20 2a 7a 41 72 67 2c 20 0d 0a 20 20 63  har *zArg, ..  c
27b60 68 61 72 20 2a 2a 70 7a 45 72 72 0d 0a 29 7b 0d  har **pzErr..){.
27b70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27b80 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28 20 30 3d  TE_OK;..  if( 0=
27b90 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
27ba0 28 7a 43 6f 6c 2c 20 46 54 53 35 5f 52 41 4e 4b  (zCol, FTS5_RANK
27bb0 5f 4e 41 4d 45 29 20 0d 0a 20 20 20 7c 7c 20 30  _NAME) ..   || 0
27bc0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
27bd0 70 28 7a 43 6f 6c 2c 20 46 54 53 35 5f 52 4f 57  p(zCol, FTS5_ROW
27be0 49 44 5f 4e 41 4d 45 29 20 0d 0a 20 20 29 7b 0d  ID_NAME) ..  ){.
27bf0 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71  .    *pzErr = sq
27c00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72  lite3_mprintf("r
27c10 65 73 65 72 76 65 64 20 66 74 73 35 20 63 6f 6c  eserved fts5 col
27c20 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
27c30 43 6f 6c 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20  Col);..    rc = 
27c40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20  SQLITE_ERROR;.. 
27c50 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 72 67 20   }else if( zArg 
27c60 29 7b 0d 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  ){..    if( 0==s
27c70 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
27c80 41 72 67 2c 20 22 75 6e 69 6e 64 65 78 65 64 22  Arg, "unindexed"
27c90 29 20 29 7b 0d 0a 20 20 20 20 20 20 70 2d 3e 61  ) ){..      p->a
27ca0 62 55 6e 69 6e 64 65 78 65 64 5b 70 2d 3e 6e 43  bUnindexed[p->nC
27cb0 6f 6c 5d 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65  ol] = 1;..    }e
27cc0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 2a 70 7a 45  lse{..      *pzE
27cd0 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
27ce0 69 6e 74 66 28 22 75 6e 72 65 63 6f 67 6e 69 7a  intf("unrecogniz
27cf0 65 64 20 63 6f 6c 75 6d 6e 20 6f 70 74 69 6f 6e  ed column option
27d00 3a 20 25 73 22 2c 20 7a 41 72 67 29 3b 0d 0a 20  : %s", zArg);.. 
27d10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27d20 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a  _ERROR;..    }..
27d30 20 20 7d 0d 0a 0d 0a 20 20 70 2d 3e 61 7a 43 6f    }....  p->azCo
27d40 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 20 3d 20 7a  l[p->nCol++] = z
27d50 43 6f 6c 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72  Col;..  return r
27d60 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  c;..}..../*..** 
27d70 50 6f 70 75 6c 61 74 65 20 74 68 65 20 46 74 73  Populate the Fts
27d80 35 43 6f 6e 66 69 67 2e 7a 43 6f 6e 74 65 6e 74  5Config.zContent
27d90 45 78 70 72 6c 69 73 74 20 73 74 72 69 6e 67 2e  Exprlist string.
27da0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
27db0 20 66 74 73 35 43 6f 6e 66 69 67 4d 61 6b 65 45   fts5ConfigMakeE
27dc0 78 70 72 6c 69 73 74 28 46 74 73 35 43 6f 6e 66  xprlist(Fts5Conf
27dd0 69 67 20 2a 70 29 7b 0d 0a 20 20 69 6e 74 20 69  ig *p){..  int i
27de0 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ;..  int rc = SQ
27df0 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 46 74 73 35  LITE_OK;..  Fts5
27e00 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c  Buffer buf = {0,
27e10 20 30 2c 20 30 7d 3b 0d 0a 0d 0a 20 20 73 71 6c   0, 0};....  sql
27e20 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
27e30 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20  pendPrintf(&rc, 
27e40 26 62 75 66 2c 20 22 54 2e 25 51 22 2c 20 70 2d  &buf, "T.%Q", p-
27e50 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 29 3b  >zContentRowid);
27e60 0d 0a 20 20 69 66 28 20 70 2d 3e 65 43 6f 6e 74  ..  if( p->eCont
27e70 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45 4e  ent!=FTS5_CONTEN
27e80 54 5f 4e 4f 4e 45 20 29 7b 0d 0a 20 20 20 20 66  T_NONE ){..    f
27e90 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
27ea0 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  l; i++){..      
27eb0 69 66 28 20 70 2d 3e 65 43 6f 6e 74 65 6e 74 3d  if( p->eContent=
27ec0 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 45 58  =FTS5_CONTENT_EX
27ed0 54 45 52 4e 41 4c 20 29 7b 0d 0a 20 20 20 20 20  TERNAL ){..     
27ee0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
27ef0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
27f00 28 26 72 63 2c 20 26 62 75 66 2c 20 22 2c 20 54  (&rc, &buf, ", T
27f10 2e 25 51 22 2c 20 70 2d 3e 61 7a 43 6f 6c 5b 69  .%Q", p->azCol[i
27f20 5d 29 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]);..      }else
27f30 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {..        sqlit
27f40 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
27f50 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 62  ndPrintf(&rc, &b
27f60 75 66 2c 20 22 2c 20 54 2e 63 25 64 22 2c 20 69  uf, ", T.c%d", i
27f70 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
27f80 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 61 73 73   }..  }....  ass
27f90 65 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74  ert( p->zContent
27fa0 45 78 70 72 6c 69 73 74 3d 3d 30 20 29 3b 0d 0a  Exprlist==0 );..
27fb0 20 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 45 78 70    p->zContentExp
27fc0 72 6c 69 73 74 20 3d 20 28 63 68 61 72 2a 29 62  rlist = (char*)b
27fd0 75 66 2e 70 3b 0d 0a 20 20 72 65 74 75 72 6e 20  uf.p;..  return 
27fe0 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  rc;..}..../*..**
27ff0 20 41 72 67 75 6d 65 6e 74 73 20 6e 41 72 67 2f   Arguments nArg/
28000 61 7a 41 72 67 20 63 6f 6e 74 61 69 6e 20 74 68  azArg contain th
28010 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e  e string argumen
28020 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
28030 20 78 43 72 65 61 74 65 0d 0a 2a 2a 20 6f 72 20   xCreate..** or 
28040 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 20  xConnect method 
28050 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
28060 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
28070 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
28080 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 61 6e  ..** allocate an
28090 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 46 74 73   instance of Fts
280a0 35 43 6f 6e 66 69 67 20 63 6f 6e 74 61 69 6e 69  5Config containi
280b0 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
280c0 66 20 70 61 72 73 69 6e 67 0d 0a 2a 2a 20 74 68  f parsing..** th
280d0 6f 73 65 20 61 72 67 75 6d 65 6e 74 73 2e 0d 0a  ose arguments...
280e0 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  **..** If succes
280f0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
28100 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
28110 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *ppOut is set to
28120 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0d 0a 2a   point to the..*
28130 2a 20 6e 65 77 20 46 74 73 35 43 6f 6e 66 69 67  * new Fts5Config
28140 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
28150 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
28160 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
28170 65 20 69 73 20 0d 0a 2a 2a 20 72 65 74 75 72 6e  e is ..** return
28180 65 64 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65  ed, *ppOut is se
28190 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e  t to NULL and an
281a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
281b0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 0d 0a 2a  ay be left in..*
281c0 2a 20 2a 70 7a 45 72 72 2e 20 49 74 20 69 73 20  * *pzErr. It is 
281d0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
281e0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
281f0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
28200 72 65 65 20 61 6e 79 20 0d 0a 2a 2a 20 73 75 63  ree any ..** suc
28210 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  h error message 
28220 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
28230 65 65 28 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  ee()...*/..stati
28240 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
28250 35 43 6f 6e 66 69 67 50 61 72 73 65 28 0d 0a 20  5ConfigParse(.. 
28260 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c   Fts5Global *pGl
28270 6f 62 61 6c 2c 0d 0a 20 20 73 71 6c 69 74 65 33  obal,..  sqlite3
28280 20 2a 64 62 2c 0d 0a 20 20 69 6e 74 20 6e 41 72   *db,..  int nAr
28290 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
282a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
282b0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
282c0 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
282d0 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
282e0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
282f0 66 20 6e 41 72 67 20 43 52 45 41 54 45 20 56 49  f nArg CREATE VI
28300 52 54 55 41 4c 20 54 41 42 4c 45 20 61 72 67 73  RTUAL TABLE args
28310 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69   */..  Fts5Confi
28320 67 20 2a 2a 70 70 4f 75 74 2c 20 20 20 20 20 20  g **ppOut,      
28330 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
28340 65 73 75 6c 74 73 20 6f 66 20 70 61 72 73 65 20  esults of parse 
28350 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  */..  char **pzE
28360 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
28370 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
28380 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0d 0a  ror message */..
28390 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ){..  int rc = S
283a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
283b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
283c0 63 6f 64 65 20 2a 2f 0d 0a 20 20 46 74 73 35 43  code */..  Fts5C
283d0 6f 6e 66 69 67 20 2a 70 52 65 74 3b 20 20 20 20  onfig *pRet;    
283e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
283f0 77 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75  w object to retu
28400 72 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20 69 3b 0d  rn */..  int i;.
28410 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
28420 20 6e 42 79 74 65 3b 0d 0a 0d 0a 20 20 2a 70 70   nByte;....  *pp
28430 4f 75 74 20 3d 20 70 52 65 74 20 3d 20 28 46 74  Out = pRet = (Ft
28440 73 35 43 6f 6e 66 69 67 2a 29 73 71 6c 69 74 65  s5Config*)sqlite
28450 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
28460 46 74 73 35 43 6f 6e 66 69 67 29 29 3b 0d 0a 20  Fts5Config));.. 
28470 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 20 72   if( pRet==0 ) r
28480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28490 45 4d 3b 0d 0a 20 20 6d 65 6d 73 65 74 28 70 52  EM;..  memset(pR
284a0 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  et, 0, sizeof(Ft
284b0 73 35 43 6f 6e 66 69 67 29 29 3b 0d 0a 20 20 70  s5Config));..  p
284c0 52 65 74 2d 3e 64 62 20 3d 20 64 62 3b 0d 0a 20  Ret->db = db;.. 
284d0 20 70 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d   pRet->iCookie =
284e0 20 2d 31 3b 0d 0a 0d 0a 20 20 6e 42 79 74 65 20   -1;....  nByte 
284f0 3d 20 6e 41 72 67 20 2a 20 28 73 69 7a 65 6f 66  = nArg * (sizeof
28500 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66  (char*) + sizeof
28510 28 75 38 29 29 3b 0d 0a 20 20 70 52 65 74 2d 3e  (u8));..  pRet->
28520 61 7a 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29  azCol = (char**)
28530 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
28540 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65  cZero(&rc, nByte
28550 29 3b 0d 0a 20 20 70 52 65 74 2d 3e 61 62 55 6e  );..  pRet->abUn
28560 69 6e 64 65 78 65 64 20 3d 20 28 75 38 2a 29 26  indexed = (u8*)&
28570 70 52 65 74 2d 3e 61 7a 43 6f 6c 5b 6e 41 72 67  pRet->azCol[nArg
28580 5d 3b 0d 0a 20 20 70 52 65 74 2d 3e 7a 44 62 20  ];..  pRet->zDb 
28590 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 72  = sqlite3Fts5Str
285a0 6e 64 75 70 28 26 72 63 2c 20 61 7a 41 72 67 5b  ndup(&rc, azArg[
285b0 31 5d 2c 20 2d 31 29 3b 0d 0a 20 20 70 52 65 74  1], -1);..  pRet
285c0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
285d0 33 46 74 73 35 53 74 72 6e 64 75 70 28 26 72 63  3Fts5Strndup(&rc
285e0 2c 20 61 7a 41 72 67 5b 32 5d 2c 20 2d 31 29 3b  , azArg[2], -1);
285f0 0d 0a 20 20 70 52 65 74 2d 3e 62 43 6f 6c 75 6d  ..  pRet->bColum
28600 6e 73 69 7a 65 20 3d 20 31 3b 0d 0a 20 20 70 52  nsize = 1;..  pR
28610 65 74 2d 3e 65 44 65 74 61 69 6c 20 3d 20 46 54  et->eDetail = FT
28620 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 3b 0d  S5_DETAIL_FULL;.
28630 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
28640 45 42 55 47 0d 0a 20 20 70 52 65 74 2d 3e 62 50  EBUG..  pRet->bP
28650 72 65 66 69 78 49 6e 64 65 78 20 3d 20 31 3b 0d  refixIndex = 1;.
28660 0a 23 65 6e 64 69 66 0d 0a 20 20 69 66 28 20 72  .#endif..  if( r
28670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
28680 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
28690 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c 20 46 54 53  pRet->zName, FTS
286a0 35 5f 52 41 4e 4b 5f 4e 41 4d 45 29 3d 3d 30 20  5_RANK_NAME)==0 
286b0 29 7b 0d 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d  ){..    *pzErr =
286c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
286d0 28 22 72 65 73 65 72 76 65 64 20 66 74 73 35 20  ("reserved fts5 
286e0 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c  table name: %s",
286f0 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 29 3b 0d 0a   pRet->zName);..
28700 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28710 45 52 52 4f 52 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20  ERROR;..  }.... 
28720 20 66 6f 72 28 69 3d 33 3b 20 72 63 3d 3d 53 51   for(i=3; rc==SQ
28730 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72  LITE_OK && i<nAr
28740 67 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 63 6f  g; i++){..    co
28750 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 20  nst char *zOrig 
28760 3d 20 61 7a 41 72 67 5b 69 5d 3b 0d 0a 20 20 20  = azArg[i];..   
28770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0d   const char *z;.
28780 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 6e 65 20  .    char *zOne 
28790 3d 20 30 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a  = 0;..    char *
287a0 7a 54 77 6f 20 3d 20 30 3b 0d 0a 20 20 20 20 69  zTwo = 0;..    i
287b0 6e 74 20 62 4f 70 74 69 6f 6e 20 3d 20 30 3b 0d  nt bOption = 0;.
287c0 0a 20 20 20 20 69 6e 74 20 62 4d 75 73 74 42 65  .    int bMustBe
287d0 43 6f 6c 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20  Col = 0;....    
287e0 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 47 6f  z = fts5ConfigGo
287f0 62 62 6c 65 57 6f 72 64 28 26 72 63 2c 20 7a 4f  bbleWord(&rc, zO
28800 72 69 67 2c 20 26 7a 4f 6e 65 2c 20 26 62 4d 75  rig, &zOne, &bMu
28810 73 74 42 65 43 6f 6c 29 3b 0d 0a 20 20 20 20 7a  stBeCol);..    z
28820 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69   = fts5ConfigSki
28830 70 57 68 69 74 65 73 70 61 63 65 28 7a 29 3b 0d  pWhitespace(z);.
28840 0a 20 20 20 20 69 66 28 20 7a 20 26 26 20 2a 7a  .    if( z && *z
28850 3d 3d 27 3d 27 20 29 7b 0d 0a 20 20 20 20 20 20  =='=' ){..      
28860 62 4f 70 74 69 6f 6e 20 3d 20 31 3b 0d 0a 20 20  bOption = 1;..  
28870 20 20 20 20 7a 2b 2b 3b 0d 0a 20 20 20 20 20 20      z++;..      
28880 69 66 28 20 62 4d 75 73 74 42 65 43 6f 6c 20 29  if( bMustBeCol )
28890 20 7a 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a   z = 0;..    }..
288a0 20 20 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66      z = fts5Conf
288b0 69 67 53 6b 69 70 57 68 69 74 65 73 70 61 63 65  igSkipWhitespace
288c0 28 7a 29 3b 0d 0a 20 20 20 20 69 66 28 20 7a 20  (z);..    if( z 
288d0 26 26 20 7a 5b 30 5d 20 29 7b 0d 0a 20 20 20 20  && z[0] ){..    
288e0 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0d 0a 20    int bDummy;.. 
288f0 20 20 20 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e       z = fts5Con
28900 66 69 67 47 6f 62 62 6c 65 57 6f 72 64 28 26 72  figGobbleWord(&r
28910 63 2c 20 7a 2c 20 26 7a 54 77 6f 2c 20 26 62 44  c, z, &zTwo, &bD
28920 75 6d 6d 79 29 3b 0d 0a 20 20 20 20 20 20 69 66  ummy);..      if
28930 28 20 7a 20 26 26 20 7a 5b 30 5d 20 29 20 7a 20  ( z && z[0] ) z 
28940 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  = 0;..    }.... 
28950 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28960 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 69  E_OK ){..      i
28970 66 28 20 7a 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  f( z==0 ){..    
28980 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
28990 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 70 61  ite3_mprintf("pa
289a0 72 73 65 20 65 72 72 6f 72 20 69 6e 20 5c 22 25  rse error in \"%
289b0 73 5c 22 22 2c 20 7a 4f 72 69 67 29 3b 0d 0a 20  s\"", zOrig);.. 
289c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
289d0 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20  TE_ERROR;..     
289e0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20   }else{..       
289f0 20 69 66 28 20 62 4f 70 74 69 6f 6e 20 29 7b 0d   if( bOption ){.
28a00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28a10 66 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 53  fts5ConfigParseS
28a20 70 65 63 69 61 6c 28 70 47 6c 6f 62 61 6c 2c 20  pecial(pGlobal, 
28a30 70 52 65 74 2c 20 7a 4f 6e 65 2c 20 7a 54 77 6f  pRet, zOne, zTwo
28a40 3f 7a 54 77 6f 3a 22 22 2c 20 70 7a 45 72 72 29  ?zTwo:"", pzErr)
28a50 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ;..        }else
28a60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  {..          rc 
28a70 3d 20 66 74 73 35 43 6f 6e 66 69 67 50 61 72 73  = fts5ConfigPars
28a80 65 43 6f 6c 75 6d 6e 28 70 52 65 74 2c 20 7a 4f  eColumn(pRet, zO
28a90 6e 65 2c 20 7a 54 77 6f 2c 20 70 7a 45 72 72 29  ne, zTwo, pzErr)
28aa0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6e  ;..          zOn
28ab0 65 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20  e = 0;..        
28ac0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
28ad0 7d 0d 0a 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  }....    sqlite3
28ae0 5f 66 72 65 65 28 7a 4f 6e 65 29 3b 0d 0a 20 20  _free(zOne);..  
28af0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28b00 54 77 6f 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  Two);..  }....  
28b10 2f 2a 20 49 66 20 61 20 74 6f 6b 65 6e 69 7a 65  /* If a tokenize
28b20 72 3d 20 6f 70 74 69 6f 6e 20 77 61 73 20 73 75  r= option was su
28b30 63 63 65 73 73 66 75 6c 6c 79 20 70 61 72 73 65  ccessfully parse
28b40 64 2c 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  d, the tokenizer
28b50 20 68 61 73 0d 0a 20 20 2a 2a 20 61 6c 72 65 61   has..  ** alrea
28b60 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
28b70 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6c  d. Otherwise, al
28b80 6c 6f 63 61 74 65 20 61 6e 20 69 6e 73 74 61 6e  locate an instan
28b90 63 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  ce of the defaul
28ba0 74 0d 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65  t..  ** tokenize
28bb0 72 20 28 75 6e 69 63 6f 64 65 36 31 29 20 6e 6f  r (unicode61) no
28bc0 77 2e 20 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63  w.  */..  if( rc
28bd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
28be0 52 65 74 2d 3e 70 54 6f 6b 3d 3d 30 20 29 7b 0d  Ret->pTok==0 ){.
28bf0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 43 6f  .    rc = fts5Co
28c00 6e 66 69 67 44 65 66 61 75 6c 74 54 6f 6b 65 6e  nfigDefaultToken
28c10 69 7a 65 72 28 70 47 6c 6f 62 61 6c 2c 20 70 52  izer(pGlobal, pR
28c20 65 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f  et);..  }....  /
28c30 2a 20 49 66 20 6e 6f 20 7a 43 6f 6e 74 65 6e 74  * If no zContent
28c40 20 6f 70 74 69 6f 6e 20 77 61 73 20 73 70 65 63   option was spec
28c50 69 66 69 65 64 2c 20 66 69 6c 6c 20 69 6e 20 74  ified, fill in t
28c60 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
28c70 73 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d  s. */..  if( rc=
28c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52  =SQLITE_OK && pR
28c90 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 3d 3d 30 20  et->zContent==0 
28ca0 29 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ){..    const ch
28cb0 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0d 0a  ar *zTail = 0;..
28cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74      assert( pRet
28cd0 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35  ->eContent==FTS5
28ce0 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20  _CONTENT_NORMAL 
28cf0 0d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 52  ..         || pR
28d00 65 74 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54  et->eContent==FT
28d10 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20  S5_CONTENT_NONE 
28d20 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 20 20 69 66  ..    );..    if
28d30 28 20 70 52 65 74 2d 3e 65 43 6f 6e 74 65 6e 74  ( pRet->eContent
28d40 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e  ==FTS5_CONTENT_N
28d50 4f 52 4d 41 4c 20 29 7b 0d 0a 20 20 20 20 20 20  ORMAL ){..      
28d60 7a 54 61 69 6c 20 3d 20 22 63 6f 6e 74 65 6e 74  zTail = "content
28d70 22 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ";..    }else if
28d80 28 20 70 52 65 74 2d 3e 62 43 6f 6c 75 6d 6e 73  ( pRet->bColumns
28d90 69 7a 65 20 29 7b 0d 0a 20 20 20 20 20 20 7a 54  ize ){..      zT
28da0 61 69 6c 20 3d 20 22 64 6f 63 73 69 7a 65 22 3b  ail = "docsize";
28db0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69  ..    }....    i
28dc0 66 28 20 7a 54 61 69 6c 20 29 7b 0d 0a 20 20 20  f( zTail ){..   
28dd0 20 20 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e     pRet->zConten
28de0 74 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  t = sqlite3Fts5M
28df0 70 72 69 6e 74 66 28 0d 0a 20 20 20 20 20 20 20  printf(..       
28e00 20 20 20 26 72 63 2c 20 22 25 51 2e 27 25 71 5f     &rc, "%Q.'%q_
28e10 25 73 27 22 2c 20 70 52 65 74 2d 3e 7a 44 62 2c  %s'", pRet->zDb,
28e20 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 54   pRet->zName, zT
28e30 61 69 6c 0d 0a 20 20 20 20 20 20 29 3b 0d 0a 20  ail..      );.. 
28e40 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69     }..  }....  i
28e50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28e60 20 26 26 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65   && pRet->zConte
28e70 6e 74 52 6f 77 69 64 3d 3d 30 20 29 7b 0d 0a 20  ntRowid==0 ){.. 
28e80 20 20 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e     pRet->zConten
28e90 74 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  tRowid = sqlite3
28ea0 46 74 73 35 53 74 72 6e 64 75 70 28 26 72 63 2c  Fts5Strndup(&rc,
28eb0 20 22 72 6f 77 69 64 22 2c 20 2d 31 29 3b 0d 0a   "rowid", -1);..
28ec0 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 46 6f 72 6d    }....  /* Form
28ed0 75 6c 61 74 65 20 74 68 65 20 7a 43 6f 6e 74 65  ulate the zConte
28ee0 6e 74 45 78 70 72 6c 69 73 74 20 74 65 78 74 20  ntExprlist text 
28ef0 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  */..  if( rc==SQ
28f00 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20  LITE_OK ){..    
28f10 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 4d  rc = fts5ConfigM
28f20 61 6b 65 45 78 70 72 6c 69 73 74 28 70 52 65 74  akeExprlist(pRet
28f30 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28  );..  }....  if(
28f40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28f50 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  {..    sqlite3Ft
28f60 73 35 43 6f 6e 66 69 67 46 72 65 65 28 70 52 65  s5ConfigFree(pRe
28f70 74 29 3b 0d 0a 20 20 20 20 2a 70 70 4f 75 74 20  t);..    *ppOut 
28f80 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74  = 0;..  }..  ret
28f90 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  urn rc;..}..../*
28fa0 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f  ..** Free the co
28fb0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
28fc0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
28fd0 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d   only argument..
28fe0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
28ff0 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
29000 69 67 46 72 65 65 28 46 74 73 35 43 6f 6e 66 69  igFree(Fts5Confi
29010 67 20 2a 70 43 6f 6e 66 69 67 29 7b 0d 0a 20 20  g *pConfig){..  
29020 69 66 28 20 70 43 6f 6e 66 69 67 20 29 7b 0d 0a  if( pConfig ){..
29030 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20      int i;..    
29040 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f  if( pConfig->pTo
29050 6b 20 29 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6e  k ){..      pCon
29060 66 69 67 2d 3e 70 54 6f 6b 41 70 69 2d 3e 78 44  fig->pTokApi->xD
29070 65 6c 65 74 65 28 70 43 6f 6e 66 69 67 2d 3e 70  elete(pConfig->p
29080 54 6f 6b 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  Tok);..    }..  
29090 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
290a0 43 6f 6e 66 69 67 2d 3e 7a 44 62 29 3b 0d 0a 20  Config->zDb);.. 
290b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
290c0 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b  pConfig->zName);
290d0 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
290e0 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20  <pConfig->nCol; 
290f0 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c  i++){..      sql
29100 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
29110 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 3b 0d 0a 20  g->azCol[i]);.. 
29120 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
29130 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e  3_free(pConfig->
29140 61 7a 43 6f 6c 29 3b 0d 0a 20 20 20 20 73 71 6c  azCol);..    sql
29150 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
29160 67 2d 3e 61 50 72 65 66 69 78 29 3b 0d 0a 20 20  g->aPrefix);..  
29170 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
29180 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 29 3b 0d  Config->zRank);.
29190 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
291a0 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b  e(pConfig->zRank
291b0 41 72 67 73 29 3b 0d 0a 20 20 20 20 73 71 6c 69  Args);..    sqli
291c0 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67  te3_free(pConfig
291d0 2d 3e 7a 43 6f 6e 74 65 6e 74 29 3b 0d 0a 20 20  ->zContent);..  
291e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
291f0 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74  Config->zContent
29200 52 6f 77 69 64 29 3b 0d 0a 20 20 20 20 73 71 6c  Rowid);..    sql
29210 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
29220 67 2d 3e 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c  g->zContentExprl
29230 69 73 74 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74  ist);..    sqlit
29240 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 29  e3_free(pConfig)
29250 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  ;..  }..}..../*.
29260 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
29270 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20  _declare_vtab() 
29280 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
29290 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 6f 6e  tents of the con
292a0 66 69 67 75 72 61 74 69 6f 6e 0d 0a 2a 2a 20 6f  figuration..** o
292b0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
292c0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
292d0 74 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  t. Return SQLITE
292e0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
292f0 6c 2c 20 6f 72 0d 0a 2a 2a 20 61 6e 20 53 51 4c  l, or..** an SQL
29300 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
29310 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
29320 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69  s...*/..static i
29330 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f  nt sqlite3Fts5Co
29340 6e 66 69 67 44 65 63 6c 61 72 65 56 74 61 62 28  nfigDeclareVtab(
29350 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
29360 66 69 67 29 7b 0d 0a 20 20 69 6e 74 20 69 3b 0d  fig){..  int i;.
29370 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29380 54 45 5f 4f 4b 3b 0d 0a 20 20 63 68 61 72 20 2a  TE_OK;..  char *
29390 7a 53 71 6c 3b 0d 0a 0d 0a 20 20 7a 53 71 6c 20  zSql;....  zSql 
293a0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72  = sqlite3Fts5Mpr
293b0 69 6e 74 66 28 26 72 63 2c 20 22 43 52 45 41 54  intf(&rc, "CREAT
293c0 45 20 54 41 42 4c 45 20 78 28 22 29 3b 0d 0a 20  E TABLE x(");.. 
293d0 20 66 6f 72 28 69 3d 30 3b 20 7a 53 71 6c 20 26   for(i=0; zSql &
293e0 26 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  & i<pConfig->nCo
293f0 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 63 6f  l; i++){..    co
29400 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
29410 20 28 69 3d 3d 30 3f 22 22 3a 22 2c 20 22 29 3b   (i==0?"":", ");
29420 0d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ..    zSql = sql
29430 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28  ite3Fts5Mprintf(
29440 26 72 63 2c 20 22 25 7a 25 73 25 51 22 2c 20 7a  &rc, "%z%s%Q", z
29450 53 71 6c 2c 20 7a 53 65 70 2c 20 70 43 6f 6e 66  Sql, zSep, pConf
29460 69 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 3b 0d 0a  ig->azCol[i]);..
29470 20 20 7d 0d 0a 20 20 7a 53 71 6c 20 3d 20 73 71    }..  zSql = sq
29480 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66  lite3Fts5Mprintf
29490 28 26 72 63 2c 20 22 25 7a 2c 20 25 51 20 48 49  (&rc, "%z, %Q HI
294a0 44 44 45 4e 2c 20 25 73 20 48 49 44 44 45 4e 29  DDEN, %s HIDDEN)
294b0 22 2c 20 0d 0a 20 20 20 20 20 20 7a 53 71 6c 2c  ", ..      zSql,
294c0 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c   pConfig->zName,
294d0 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45 0d   FTS5_RANK_NAME.
294e0 0a 20 20 29 3b 0d 0a 0d 0a 20 20 61 73 73 65 72  .  );....  asser
294f0 74 28 20 7a 53 71 6c 20 7c 7c 20 72 63 3d 3d 53  t( zSql || rc==S
29500 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0d 0a  QLITE_NOMEM );..
29510 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0d 0a 20    if( zSql ){.. 
29520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
29530 64 65 63 6c 61 72 65 5f 76 74 61 62 28 70 43 6f  declare_vtab(pCo
29540 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 29 3b  nfig->db, zSql);
29550 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
29560 65 65 28 7a 53 71 6c 29 3b 0d 0a 20 20 7d 0d 0a  ee(zSql);..  }..
29570 20 20 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    ..  return rc;
29580 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 6f  ..}..../*..** To
29590 6b 65 6e 69 7a 65 20 74 68 65 20 74 65 78 74 20  kenize the text 
295a0 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
295b0 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
295c0 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 2a 2a 0d 0a  arguments...**..
295d0 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** The callback 
295e0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
295f0 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69  for each token i
29600 6e 20 74 68 65 20 69 6e 70 75 74 20 74 65 78 74  n the input text
29610 2e 20 54 68 65 0d 0a 2a 2a 20 61 72 67 75 6d 65  . The..** argume
29620 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 69 74  nts passed to it
29630 20 61 72 65 2c 20 69 6e 20 6f 72 64 65 72 3a 0d   are, in order:.
29640 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 76 6f 69 64  .**..**     void
29650 20 2a 70 43 74 78 20 20 20 20 20 20 20 20 20 20   *pCtx          
29660 2f 2f 20 43 6f 70 79 20 6f 66 20 34 74 68 20 61  // Copy of 4th a
29670 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
29680 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 29  e3Fts5Tokenize()
29690 0d 0a 2a 2a 20 20 20 20 20 63 6f 6e 73 74 20 63  ..**     const c
296a0 68 61 72 20 2a 70 54 6f 6b 65 6e 20 20 2f 2f 20  har *pToken  // 
296b0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
296c0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b  r containing tok
296d0 65 6e 0d 0a 2a 2a 20 20 20 20 20 69 6e 74 20 6e  en..**     int n
296e0 54 6f 6b 65 6e 20 20 20 20 20 20 20 20 20 20 2f  Token          /
296f0 2f 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65 6e 20  / Size of token 
29700 69 6e 20 62 79 74 65 73 0d 0a 2a 2a 20 20 20 20  in bytes..**    
29710 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
29720 20 20 20 20 20 2f 2f 20 42 79 74 65 20 6f 66 66       // Byte off
29730 73 65 74 20 6f 66 20 73 74 61 72 74 20 6f 66 20  set of start of 
29740 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 69 6e 70  token within inp
29750 75 74 20 74 65 78 74 0d 0a 2a 2a 20 20 20 20 20  ut text..**     
29760 69 6e 74 20 69 45 6e 64 20 20 20 20 20 20 20 20  int iEnd        
29770 20 20 20 20 2f 2f 20 42 79 74 65 20 6f 66 66 73      // Byte offs
29780 65 74 20 6f 66 20 65 6e 64 20 6f 66 20 74 6f 6b  et of end of tok
29790 65 6e 20 77 69 74 68 69 6e 20 69 6e 70 75 74 20  en within input 
297a0 74 65 78 74 0d 0a 2a 2a 20 20 20 20 20 69 6e 74  text..**     int
297b0 20 69 50 6f 73 20 20 20 20 20 20 20 20 20 20 20   iPos           
297c0 20 2f 2f 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20   // Position of 
297d0 74 6f 6b 65 6e 20 69 6e 20 69 6e 70 75 74 20 28  token in input (
297e0 66 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 30  first token is 0
297f0 29 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65  )..**..** If the
29800 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
29810 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  s a non-zero val
29820 75 65 20 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74  ue the tokenizat
29830 69 6f 6e 20 69 73 20 61 62 61 6e 64 6f 6e 65 64  ion is abandoned
29840 0d 0a 2a 2a 20 61 6e 64 20 6e 6f 20 66 75 72 74  ..** and no furt
29850 68 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 61 72  her callbacks ar
29860 65 20 69 73 73 75 65 64 2e 20 0d 0a 2a 2a 0d 0a  e issued. ..**..
29870 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29880 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
29890 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
298a0 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
298b0 72 6f 72 20 63 6f 64 65 0d 0a 2a 2a 20 69 66 20  ror code..** if 
298c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
298d0 20 49 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a 61   If the tokeniza
298e0 74 69 6f 6e 20 77 61 73 20 61 62 61 6e 64 6f 6e  tion was abandon
298f0 65 64 20 65 61 72 6c 79 20 62 65 63 61 75 73 65  ed early because
29900 0d 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 62 61 63  ..** the callbac
29910 6b 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  k returned SQLIT
29920 45 5f 44 4f 4e 45 2c 20 74 68 69 73 20 69 73 20  E_DONE, this is 
29930 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  not an error and
29940 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0d 0a   this function..
29950 2a 2a 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 73  ** still returns
29960 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20   SQLITE_OK. Or, 
29970 69 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74  if the tokenizat
29980 69 6f 6e 20 77 61 73 20 61 62 61 6e 64 6f 6e 65  ion was abandone
29990 64 20 65 61 72 6c 79 0d 0a 2a 2a 20 62 65 63 61  d early..** beca
299a0 75 73 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  use the callback
299b0 20 72 65 74 75 72 6e 65 64 20 61 6e 6f 74 68 65   returned anothe
299c0 72 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  r non-zero value
299d0 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 0d  , it is assumed.
299e0 0a 2a 2a 20 74 6f 20 62 65 20 61 6e 20 53 51 4c  .** to be an SQL
299f0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ite error code a
29a00 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  nd returned to t
29a10 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 2a 2f 0d 0a  he caller...*/..
29a20 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
29a30 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 0d  e3Fts5Tokenize(.
29a40 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
29a50 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20  Config,         
29a60 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69     /* FTS5 Confi
29a70 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20  guration object 
29a80 2a 2f 0d 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  */..  int flags,
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 54 4f        /* FTS5_TO
29ab0 4b 45 4e 49 5a 45 5f 2a 20 66 6c 61 67 73 20 2a  KENIZE_* flags *
29ac0 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
29ad0 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78  *pText, int nTex
29ae0 74 2c 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20  t,   /* Text to 
29af0 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0d 0a 20 20 76  tokenize */..  v
29b00 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b20 2a 20 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64  * Context passed
29b30 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20 2a 2f 0d   to xToken() */.
29b40 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29  .  int (*xToken)
29b50 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e  (void*, int, con
29b60 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69  st char*, int, i
29b70 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f 2a 20 43  nt, int)    /* C
29b80 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 29 7b 0d 0a  allback */..){..
29b90 20 20 69 66 28 20 70 54 65 78 74 3d 3d 30 20 29    if( pText==0 )
29ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29bb0 4b 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f  K;..  return pCo
29bc0 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69 2d 3e 78  nfig->pTokApi->x
29bd0 54 6f 6b 65 6e 69 7a 65 28 0d 0a 20 20 20 20 20  Tokenize(..     
29be0 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 2c 20   pConfig->pTok, 
29bf0 70 43 74 78 2c 20 66 6c 61 67 73 2c 20 70 54 65  pCtx, flags, pTe
29c00 78 74 2c 20 6e 54 65 78 74 2c 20 78 54 6f 6b 65  xt, nText, xToke
29c10 6e 0d 0a 20 20 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  n..  );..}..../*
29c20 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49  ..** Argument pI
29c30 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  n points to the 
29c40 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
29c50 69 6e 20 77 68 61 74 20 69 73 20 65 78 70 65 63  in what is expec
29c60 74 65 64 20 74 6f 20 62 65 0d 0a 2a 2a 20 61 20  ted to be..** a 
29c70 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20  comma-separated 
29c80 6c 69 73 74 20 6f 66 20 53 51 4c 20 6c 69 74 65  list of SQL lite
29c90 72 61 6c 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rals followed by
29ca0 20 61 20 27 29 27 20 63 68 61 72 61 63 74 65 72   a ')' character
29cb0 2e 0d 0a 2a 2a 20 49 66 20 69 74 20 61 63 74 75  ...** If it actu
29cc0 61 6c 6c 79 20 69 73 20 74 68 69 73 2c 20 72 65  ally is this, re
29cd0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
29ce0 6f 20 74 68 65 20 27 29 27 2e 20 4f 74 68 65 72  o the ')'. Other
29cf0 77 69 73 65 2c 20 72 65 74 75 72 6e 0d 0a 2a 2a  wise, return..**
29d00 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
29d10 65 20 61 20 70 61 72 73 65 20 65 72 72 6f 72 2e  e a parse error.
29d20 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 63 6f 6e  ..*/..static con
29d30 73 74 20 63 68 61 72 20 2a 66 74 73 35 43 6f 6e  st char *fts5Con
29d40 66 69 67 53 6b 69 70 41 72 67 73 28 63 6f 6e 73  figSkipArgs(cons
29d50 74 20 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20  t char *pIn){.. 
29d60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d   const char *p =
29d70 20 70 49 6e 3b 0d 0a 20 20 0d 0a 20 20 77 68 69   pIn;..  ..  whi
29d80 6c 65 28 20 31 20 29 7b 0d 0a 20 20 20 20 70 20  le( 1 ){..    p 
29d90 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70  = fts5ConfigSkip
29da0 57 68 69 74 65 73 70 61 63 65 28 70 29 3b 0d 0a  Whitespace(p);..
29db0 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66      p = fts5Conf
29dc0 69 67 53 6b 69 70 4c 69 74 65 72 61 6c 28 70 29  igSkipLiteral(p)
29dd0 3b 0d 0a 20 20 20 20 70 20 3d 20 66 74 73 35 43  ;..    p = fts5C
29de0 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73 70  onfigSkipWhitesp
29df0 61 63 65 28 70 29 3b 0d 0a 20 20 20 20 69 66 28  ace(p);..    if(
29e00 20 70 3d 3d 30 20 7c 7c 20 2a 70 3d 3d 27 29 27   p==0 || *p==')'
29e10 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 69   ) break;..    i
29e20 66 28 20 2a 70 21 3d 27 2c 27 20 29 7b 0d 0a 20  f( *p!=',' ){.. 
29e30 20 20 20 20 20 70 20 3d 20 30 3b 0d 0a 20 20 20       p = 0;..   
29e40 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d     break;..    }
29e50 0d 0a 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 7d 0d  ..    p++;..  }.
29e60 0a 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d 0a  ...  return p;..
29e70 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 61 72 61  }..../*..** Para
29e80 6d 65 74 65 72 20 7a 49 6e 20 63 6f 6e 74 61 69  meter zIn contai
29e90 6e 73 20 61 20 72 61 6e 6b 28 29 20 66 75 6e 63  ns a rank() func
29ea0 74 69 6f 6e 20 73 70 65 63 69 66 69 63 61 74 69  tion specificati
29eb0 6f 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 6f  on. The format o
29ec0 66 20 0d 0a 2a 2a 20 74 68 69 73 20 69 73 3a 0d  f ..** this is:.
29ed0 0a 2a 2a 0d 0a 2a 2a 20 20 20 2b 20 42 61 72 65  .**..**   + Bare
29ee0 77 6f 72 64 20 28 66 75 6e 63 74 69 6f 6e 20 6e  word (function n
29ef0 61 6d 65 29 0d 0a 2a 2a 20 20 20 2b 20 4f 70 65  ame)..**   + Ope
29f00 6e 20 70 61 72 65 6e 74 68 65 73 69 73 20 2d 20  n parenthesis - 
29f10 22 28 22 0d 0a 2a 2a 20 20 20 2b 20 5a 65 72 6f  "("..**   + Zero
29f20 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20 6c 69 74   or more SQL lit
29f30 65 72 61 6c 73 20 69 6e 20 61 20 63 6f 6d 6d 61  erals in a comma
29f40 20 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 0d   separated list.
29f50 0a 2a 2a 20 20 20 2b 20 43 6c 6f 73 65 20 70 61  .**   + Close pa
29f60 72 65 6e 74 68 65 73 69 73 20 2d 20 22 29 22 0d  renthesis - ")".
29f70 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
29f80 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
29f90 67 50 61 72 73 65 52 61 6e 6b 28 0d 0a 20 20 63  gParseRank(..  c
29fa0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29fc0 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20 2a  * Input string *
29fd0 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a 52 61  /..  char **pzRa
29fe0 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nk,             
29ff0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 61 6e       /* OUT: Ran
2a000 6b 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  k function name 
2a010 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a 52  */..  char **pzR
2a020 61 6e 6b 41 72 67 73 20 20 20 20 20 20 20 20 20  ankArgs         
2a030 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 61        /* OUT: Ra
2a040 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  nk function argu
2a050 6d 65 6e 74 73 20 2a 2f 0d 0a 29 7b 0d 0a 20 20  ments */..){..  
2a060 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
2a070 7a 49 6e 3b 0d 0a 20 20 63 6f 6e 73 74 20 63 68  zIn;..  const ch
2a080 61 72 20 2a 70 52 61 6e 6b 3b 0d 0a 20 20 63 68  ar *pRank;..  ch
2a090 61 72 20 2a 7a 52 61 6e 6b 20 3d 20 30 3b 0d 0a  ar *zRank = 0;..
2a0a0 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67    char *zRankArg
2a0b0 73 20 3d 20 30 3b 0d 0a 20 20 69 6e 74 20 72 63  s = 0;..  int rc
2a0c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d   = SQLITE_OK;...
2a0d0 0a 20 20 2a 70 7a 52 61 6e 6b 20 3d 20 30 3b 0d  .  *pzRank = 0;.
2a0e0 0a 20 20 2a 70 7a 52 61 6e 6b 41 72 67 73 20 3d  .  *pzRankArgs =
2a0f0 20 30 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 3d 3d   0;....  if( p==
2a100 30 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53  0 ){..    rc = S
2a110 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20  QLITE_ERROR;..  
2a120 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 20 3d 20  }else{..    p = 
2a130 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68  fts5ConfigSkipWh
2a140 69 74 65 73 70 61 63 65 28 70 29 3b 0d 0a 20 20  itespace(p);..  
2a150 20 20 70 52 61 6e 6b 20 3d 20 70 3b 0d 0a 20 20    pRank = p;..  
2a160 20 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67    p = fts5Config
2a170 53 6b 69 70 42 61 72 65 77 6f 72 64 28 70 29 3b  SkipBareword(p);
2a180 0d 0a 0d 0a 20 20 20 20 69 66 28 20 70 20 29 7b  ....    if( p ){
2a190 0d 0a 20 20 20 20 20 20 7a 52 61 6e 6b 20 3d 20  ..      zRank = 
2a1a0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
2a1b0 63 5a 65 72 6f 28 26 72 63 2c 20 31 20 2b 20 70  cZero(&rc, 1 + p
2a1c0 20 2d 20 70 52 61 6e 6b 29 3b 0d 0a 20 20 20 20   - pRank);..    
2a1d0 20 20 69 66 28 20 7a 52 61 6e 6b 20 29 20 6d 65    if( zRank ) me
2a1e0 6d 63 70 79 28 7a 52 61 6e 6b 2c 20 70 52 61 6e  mcpy(zRank, pRan
2a1f0 6b 2c 20 70 2d 70 52 61 6e 6b 29 3b 0d 0a 20 20  k, p-pRank);..  
2a200 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
2a210 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2a220 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  R;..    }....   
2a230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a240 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 70 20 3d  OK ){..      p =
2a250 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 57   fts5ConfigSkipW
2a260 68 69 74 65 73 70 61 63 65 28 70 29 3b 0d 0a 20  hitespace(p);.. 
2a270 20 20 20 20 20 69 66 28 20 2a 70 21 3d 27 28 27       if( *p!='('
2a280 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
2a290 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 70 2b 2b  RROR;..      p++
2a2a0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66  ;..    }..    if
2a2b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a2c0 29 7b 0d 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ){..      const 
2a2d0 63 68 61 72 20 2a 70 41 72 67 73 3b 20 0d 0a 20  char *pArgs; .. 
2a2e0 20 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e       p = fts5Con
2a2f0 66 69 67 53 6b 69 70 57 68 69 74 65 73 70 61 63  figSkipWhitespac
2a300 65 28 70 29 3b 0d 0a 20 20 20 20 20 20 70 41 72  e(p);..      pAr
2a310 67 73 20 3d 20 70 3b 0d 0a 20 20 20 20 20 20 69  gs = p;..      i
2a320 66 28 20 2a 70 21 3d 27 29 27 20 29 7b 0d 0a 20  f( *p!=')' ){.. 
2a330 20 20 20 20 20 20 20 70 20 3d 20 66 74 73 35 43         p = fts5C
2a340 6f 6e 66 69 67 53 6b 69 70 41 72 67 73 28 70 29  onfigSkipArgs(p)
2a350 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
2a360 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  ==0 ){..        
2a370 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2a380 52 4f 52 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65  ROR;..        }e
2a390 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse{..          
2a3a0 7a 52 61 6e 6b 41 72 67 73 20 3d 20 73 71 6c 69  zRankArgs = sqli
2a3b0 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
2a3c0 6f 28 26 72 63 2c 20 31 20 2b 20 70 20 2d 20 70  o(&rc, 1 + p - p
2a3d0 41 72 67 73 29 3b 0d 0a 20 20 20 20 20 20 20 20  Args);..        
2a3e0 20 20 69 66 28 20 7a 52 61 6e 6b 41 72 67 73 20    if( zRankArgs 
2a3f0 29 20 6d 65 6d 63 70 79 28 7a 52 61 6e 6b 41 72  ) memcpy(zRankAr
2a400 67 73 2c 20 70 41 72 67 73 2c 20 70 2d 70 41 72  gs, pArgs, p-pAr
2a410 67 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  gs);..        }.
2a420 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
2a430 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63  .  }....  if( rc
2a440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  !=SQLITE_OK ){..
2a450 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a460 28 7a 52 61 6e 6b 29 3b 0d 0a 20 20 20 20 61 73  (zRank);..    as
2a470 73 65 72 74 28 20 7a 52 61 6e 6b 41 72 67 73 3d  sert( zRankArgs=
2a480 3d 30 20 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d  =0 );..  }else{.
2a490 0a 20 20 20 20 2a 70 7a 52 61 6e 6b 20 3d 20 7a  .    *pzRank = z
2a4a0 52 61 6e 6b 3b 0d 0a 20 20 20 20 2a 70 7a 52 61  Rank;..    *pzRa
2a4b0 6e 6b 41 72 67 73 20 3d 20 7a 52 61 6e 6b 41 72  nkArgs = zRankAr
2a4c0 67 73 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75  gs;..  }..  retu
2a4d0 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61  rn rc;..}....sta
2a4e0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46  tic int sqlite3F
2a4f0 74 73 35 43 6f 6e 66 69 67 53 65 74 56 61 6c 75  ts5ConfigSetValu
2a500 65 28 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  e(..  Fts5Config
2a510 20 2a 70 43 6f 6e 66 69 67 2c 20 0d 0a 20 20 63   *pConfig, ..  c
2a520 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 2c  onst char *zKey,
2a530 20 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c   ..  sqlite3_val
2a540 75 65 20 2a 70 56 61 6c 2c 0d 0a 20 20 69 6e 74  ue *pVal,..  int
2a550 20 2a 70 62 42 61 64 6b 65 79 0d 0a 29 7b 0d 0a   *pbBadkey..){..
2a560 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a570 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 69 66 28 20 30  E_OK;....  if( 0
2a580 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
2a590 70 28 7a 4b 65 79 2c 20 22 70 67 73 7a 22 29 20  p(zKey, "pgsz") 
2a5a0 29 7b 0d 0a 20 20 20 20 69 6e 74 20 70 67 73 7a  ){..    int pgsz
2a5b0 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28 20 53   = 0;..    if( S
2a5c0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3d 3d 73  QLITE_INTEGER==s
2a5d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
2a5e0 65 72 69 63 5f 74 79 70 65 28 70 56 61 6c 29 20  eric_type(pVal) 
2a5f0 29 7b 0d 0a 20 20 20 20 20 20 70 67 73 7a 20 3d  ){..      pgsz =
2a600 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2a610 6e 74 28 70 56 61 6c 29 3b 0d 0a 20 20 20 20 7d  nt(pVal);..    }
2a620 0d 0a 20 20 20 20 69 66 28 20 70 67 73 7a 3c 3d  ..    if( pgsz<=
2a630 30 20 7c 7c 20 70 67 73 7a 3e 46 54 53 35 5f 4d  0 || pgsz>FTS5_M
2a640 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0d  AX_PAGE_SIZE ){.
2a650 0a 20 20 20 20 20 20 2a 70 62 42 61 64 6b 65 79  .      *pbBadkey
2a660 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65   = 1;..    }else
2a670 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  {..      pConfig
2a680 2d 3e 70 67 73 7a 20 3d 20 70 67 73 7a 3b 0d 0a  ->pgsz = pgsz;..
2a690 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
2a6a0 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69  else if( 0==sqli
2a6b0 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79  te3_stricmp(zKey
2a6c0 2c 20 22 68 61 73 68 73 69 7a 65 22 29 20 29 7b  , "hashsize") ){
2a6d0 0d 0a 20 20 20 20 69 6e 74 20 6e 48 61 73 68 53  ..    int nHashS
2a6e0 69 7a 65 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 69  ize = -1;..    i
2a6f0 66 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  f( SQLITE_INTEGE
2a700 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  R==sqlite3_value
2a710 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56  _numeric_type(pV
2a720 61 6c 29 20 29 7b 0d 0a 20 20 20 20 20 20 6e 48  al) ){..      nH
2a730 61 73 68 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ashSize = sqlite
2a740 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
2a750 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69  );..    }..    i
2a760 66 28 20 6e 48 61 73 68 53 69 7a 65 3c 3d 30 20  f( nHashSize<=0 
2a770 29 7b 0d 0a 20 20 20 20 20 20 2a 70 62 42 61 64  ){..      *pbBad
2a780 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65  key = 1;..    }e
2a790 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6e  lse{..      pCon
2a7a0 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 20 3d  fig->nHashSize =
2a7b0 20 6e 48 61 73 68 53 69 7a 65 3b 0d 0a 20 20 20   nHashSize;..   
2a7c0 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 65 6c 73   }..  }....  els
2a7d0 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
2a7e0 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22  _stricmp(zKey, "
2a7f0 61 75 74 6f 6d 65 72 67 65 22 29 20 29 7b 0d 0a  automerge") ){..
2a800 20 20 20 20 69 6e 74 20 6e 41 75 74 6f 6d 65 72      int nAutomer
2a810 67 65 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 69 66  ge = -1;..    if
2a820 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ( SQLITE_INTEGER
2a830 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
2a840 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56 61  numeric_type(pVa
2a850 6c 29 20 29 7b 0d 0a 20 20 20 20 20 20 6e 41 75  l) ){..      nAu
2a860 74 6f 6d 65 72 67 65 20 3d 20 73 71 6c 69 74 65  tomerge = sqlite
2a870 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
2a880 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69  );..    }..    i
2a890 66 28 20 6e 41 75 74 6f 6d 65 72 67 65 3c 30 20  f( nAutomerge<0 
2a8a0 7c 7c 20 6e 41 75 74 6f 6d 65 72 67 65 3e 36 34  || nAutomerge>64
2a8b0 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 62 42 61   ){..      *pbBa
2a8c0 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d  dkey = 1;..    }
2a8d0 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 69 66 28  else{..      if(
2a8e0 20 6e 41 75 74 6f 6d 65 72 67 65 3d 3d 31 20 29   nAutomerge==1 )
2a8f0 20 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 46 54   nAutomerge = FT
2a900 53 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  S5_DEFAULT_AUTOM
2a910 45 52 47 45 3b 0d 0a 20 20 20 20 20 20 70 43 6f  ERGE;..      pCo
2a920 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
2a930 20 3d 20 6e 41 75 74 6f 6d 65 72 67 65 3b 0d 0a   = nAutomerge;..
2a940 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
2a950 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69  else if( 0==sqli
2a960 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79  te3_stricmp(zKey
2a970 2c 20 22 75 73 65 72 6d 65 72 67 65 22 29 20 29  , "usermerge") )
2a980 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 55 73 65 72  {..    int nUser
2a990 6d 65 72 67 65 20 3d 20 2d 31 3b 0d 0a 20 20 20  merge = -1;..   
2a9a0 20 69 66 28 20 53 51 4c 49 54 45 5f 49 4e 54 45   if( SQLITE_INTE
2a9b0 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  GER==sqlite3_val
2a9c0 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
2a9d0 70 56 61 6c 29 20 29 7b 0d 0a 20 20 20 20 20 20  pVal) ){..      
2a9e0 6e 55 73 65 72 6d 65 72 67 65 20 3d 20 73 71 6c  nUsermerge = sql
2a9f0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
2aa00 56 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  Val);..    }..  
2aa10 20 20 69 66 28 20 6e 55 73 65 72 6d 65 72 67 65    if( nUsermerge
2aa20 3c 32 20 7c 7c 20 6e 55 73 65 72 6d 65 72 67 65  <2 || nUsermerge
2aa30 3e 31 36 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70  >16 ){..      *p
2aa40 62 42 61 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20  bBadkey = 1;..  
2aa50 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
2aa60 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65 72 6d 65  pConfig->nUserme
2aa70 72 67 65 20 3d 20 6e 55 73 65 72 6d 65 72 67 65  rge = nUsermerge
2aa80 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
2aa90 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
2aaa0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2aab0 4b 65 79 2c 20 22 63 72 69 73 69 73 6d 65 72 67  Key, "crisismerg
2aac0 65 22 29 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20  e") ){..    int 
2aad0 6e 43 72 69 73 69 73 4d 65 72 67 65 20 3d 20 2d  nCrisisMerge = -
2aae0 31 3b 0d 0a 20 20 20 20 69 66 28 20 53 51 4c 49  1;..    if( SQLI
2aaf0 54 45 5f 49 4e 54 45 47 45 52 3d 3d 73 71 6c 69  TE_INTEGER==sqli
2ab00 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69  te3_value_numeri
2ab10 63 5f 74 79 70 65 28 70 56 61 6c 29 20 29 7b 0d  c_type(pVal) ){.
2ab20 0a 20 20 20 20 20 20 6e 43 72 69 73 69 73 4d 65  .      nCrisisMe
2ab30 72 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  rge = sqlite3_va
2ab40 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0d 0a  lue_int(pVal);..
2ab50 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 6e      }..    if( n
2ab60 43 72 69 73 69 73 4d 65 72 67 65 3c 30 20 29 7b  CrisisMerge<0 ){
2ab70 0d 0a 20 20 20 20 20 20 2a 70 62 42 61 64 6b 65  ..      *pbBadke
2ab80 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65 6c 73  y = 1;..    }els
2ab90 65 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 43  e{..      if( nC
2aba0 72 69 73 69 73 4d 65 72 67 65 3c 3d 31 20 29 20  risisMerge<=1 ) 
2abb0 6e 43 72 69 73 69 73 4d 65 72 67 65 20 3d 20 46  nCrisisMerge = F
2abc0 54 53 35 5f 44 45 46 41 55 4c 54 5f 43 52 49 53  TS5_DEFAULT_CRIS
2abd0 49 53 4d 45 52 47 45 3b 0d 0a 20 20 20 20 20 20  ISMERGE;..      
2abe0 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73  pConfig->nCrisis
2abf0 4d 65 72 67 65 20 3d 20 6e 43 72 69 73 69 73 4d  Merge = nCrisisM
2ac00 65 72 67 65 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  erge;..    }..  
2ac10 7d 0d 0a 0d 0a 20 20 65 6c 73 65 20 69 66 28 20  }....  else if( 
2ac20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
2ac30 6d 70 28 7a 4b 65 79 2c 20 22 72 61 6e 6b 22 29  mp(zKey, "rank")
2ac40 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 20 63   ){..    const c
2ac50 68 61 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73  har *zIn = (cons
2ac60 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2ac70 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
2ac80 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 61  ;..    char *zRa
2ac90 6e 6b 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a  nk;..    char *z
2aca0 52 61 6e 6b 41 72 67 73 3b 0d 0a 20 20 20 20 72  RankArgs;..    r
2acb0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43  c = sqlite3Fts5C
2acc0 6f 6e 66 69 67 50 61 72 73 65 52 61 6e 6b 28 7a  onfigParseRank(z
2acd0 49 6e 2c 20 26 7a 52 61 6e 6b 2c 20 26 7a 52 61  In, &zRank, &zRa
2ace0 6e 6b 41 72 67 73 29 3b 0d 0a 20 20 20 20 69 66  nkArgs);..    if
2acf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ad00 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ){..      sqlite
2ad10 33 5f 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e  3_free(pConfig->
2ad20 7a 52 61 6e 6b 29 3b 0d 0a 20 20 20 20 20 20 73  zRank);..      s
2ad30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e  qlite3_free(pCon
2ad40 66 69 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 29 3b  fig->zRankArgs);
2ad50 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ..      pConfig-
2ad60 3e 7a 52 61 6e 6b 20 3d 20 7a 52 61 6e 6b 3b 0d  >zRank = zRank;.
2ad70 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e  .      pConfig->
2ad80 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a 52 61 6e  zRankArgs = zRan
2ad90 6b 41 72 67 73 3b 0d 0a 20 20 20 20 7d 65 6c 73  kArgs;..    }els
2ada0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2adb0 5f 45 52 52 4f 52 20 29 7b 0d 0a 20 20 20 20 20  _ERROR ){..     
2adc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2add0 0d 0a 20 20 20 20 20 20 2a 70 62 42 61 64 6b 65  ..      *pbBadke
2ade0 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20  y = 1;..    }.. 
2adf0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2a 70 62   }else{..    *pb
2ae00 42 61 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 7d  Badkey = 1;..  }
2ae10 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
2ae20 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c 6f 61 64  }..../*..** Load
2ae30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2ae40 20 74 68 65 20 25 5f 63 6f 6e 66 69 67 20 74 61   the %_config ta
2ae50 62 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ble into memory.
2ae60 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
2ae70 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
2ae80 69 67 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66 69  igLoad(Fts5Confi
2ae90 67 20 2a 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20  g *pConfig, int 
2aea0 69 43 6f 6f 6b 69 65 29 7b 0d 0a 20 20 63 6f 6e  iCookie){..  con
2aeb0 73 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74  st char *zSelect
2aec0 20 3d 20 22 53 45 4c 45 43 54 20 6b 2c 20 76 20   = "SELECT k, v 
2aed0 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 66  FROM %Q.'%q_conf
2aee0 69 67 27 22 3b 0d 0a 20 20 63 68 61 72 20 2a 7a  ig'";..  char *z
2aef0 53 71 6c 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f  Sql;..  sqlite3_
2af00 73 74 6d 74 20 2a 70 20 3d 20 30 3b 0d 0a 20 20  stmt *p = 0;..  
2af10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2af20 4f 4b 3b 0d 0a 20 20 69 6e 74 20 69 56 65 72 73  OK;..  int iVers
2af30 69 6f 6e 20 3d 20 30 3b 0d 0a 0d 0a 20 20 2f 2a  ion = 0;....  /*
2af40 20 53 65 74 20 64 65 66 61 75 6c 74 20 76 61 6c   Set default val
2af50 75 65 73 20 2a 2f 0d 0a 20 20 70 43 6f 6e 66 69  ues */..  pConfi
2af60 67 2d 3e 70 67 73 7a 20 3d 20 46 54 53 35 5f 44  g->pgsz = FTS5_D
2af70 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2af80 3b 0d 0a 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 41  ;..  pConfig->nA
2af90 75 74 6f 6d 65 72 67 65 20 3d 20 46 54 53 35 5f  utomerge = FTS5_
2afa0 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 45 52 47  DEFAULT_AUTOMERG
2afb0 45 3b 0d 0a 20 20 70 43 6f 6e 66 69 67 2d 3e 6e  E;..  pConfig->n
2afc0 55 73 65 72 6d 65 72 67 65 20 3d 20 46 54 53 35  Usermerge = FTS5
2afd0 5f 44 45 46 41 55 4c 54 5f 55 53 45 52 4d 45 52  _DEFAULT_USERMER
2afe0 47 45 3b 0d 0a 20 20 70 43 6f 6e 66 69 67 2d 3e  GE;..  pConfig->
2aff0 6e 43 72 69 73 69 73 4d 65 72 67 65 20 3d 20 46  nCrisisMerge = F
2b000 54 53 35 5f 44 45 46 41 55 4c 54 5f 43 52 49 53  TS5_DEFAULT_CRIS
2b010 49 53 4d 45 52 47 45 3b 0d 0a 20 20 70 43 6f 6e  ISMERGE;..  pCon
2b020 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 20 3d  fig->nHashSize =
2b030 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 48 41   FTS5_DEFAULT_HA
2b040 53 48 53 49 5a 45 3b 0d 0a 0d 0a 20 20 7a 53 71  SHSIZE;....  zSq
2b050 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  l = sqlite3Fts5M
2b060 70 72 69 6e 74 66 28 26 72 63 2c 20 7a 53 65 6c  printf(&rc, zSel
2b070 65 63 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  ect, pConfig->zD
2b080 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
2b090 65 29 3b 0d 0a 20 20 69 66 28 20 7a 53 71 6c 20  e);..  if( zSql 
2b0a0 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ){..    rc = sql
2b0b0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2b0c0 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
2b0d0 6c 2c 20 2d 31 2c 20 26 70 2c 20 30 29 3b 0d 0a  l, -1, &p, 0);..
2b0e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b0f0 28 7a 53 71 6c 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a  (zSql);..  }....
2b100 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2b110 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 3d 3d 30 20  LITE_OK || p==0 
2b120 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
2b130 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20  LITE_OK ){..    
2b140 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
2b150 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
2b160 70 29 20 29 7b 0d 0a 20 20 20 20 20 20 63 6f 6e  p) ){..      con
2b170 73 74 20 63 68 61 72 20 2a 7a 4b 20 3d 20 28 63  st char *zK = (c
2b180 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
2b190 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2b1a0 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c  , 0);..      sql
2b1b0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
2b1c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2b1d0 6e 5f 76 61 6c 75 65 28 70 2c 20 31 29 3b 0d 0a  n_value(p, 1);..
2b1e0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
2b1f0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 2c  ite3_stricmp(zK,
2b200 20 22 76 65 72 73 69 6f 6e 22 29 20 29 7b 0d 0a   "version") ){..
2b210 20 20 20 20 20 20 20 20 69 56 65 72 73 69 6f 6e          iVersion
2b220 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2b230 5f 69 6e 74 28 70 56 61 6c 29 3b 0d 0a 20 20 20  _int(pVal);..   
2b240 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
2b250 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 20 3d 20     int bDummy = 
2b260 30 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0;..        sqli
2b270 74 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74  te3Fts5ConfigSet
2b280 56 61 6c 75 65 28 70 43 6f 6e 66 69 67 2c 20 7a  Value(pConfig, z
2b290 4b 2c 20 70 56 61 6c 2c 20 26 62 44 75 6d 6d 79  K, pVal, &bDummy
2b2a0 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
2b2b0 20 7d 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   }..    rc = sql
2b2c0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 29  ite3_finalize(p)
2b2d0 3b 0d 0a 20 20 7d 0d 0a 20 20 0d 0a 20 20 69 66  ;..  }..  ..  if
2b2e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b2f0 26 26 20 69 56 65 72 73 69 6f 6e 21 3d 46 54 53  && iVersion!=FTS
2b300 35 5f 43 55 52 52 45 4e 54 5f 56 45 52 53 49 4f  5_CURRENT_VERSIO
2b310 4e 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 53  N ){..    rc = S
2b320 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20  QLITE_ERROR;..  
2b330 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 70    if( pConfig->p
2b340 7a 45 72 72 6d 73 67 20 29 7b 0d 0a 20 20 20 20  zErrmsg ){..    
2b350 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 43    assert( 0==*pC
2b360 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20  onfig->pzErrmsg 
2b370 29 3b 0d 0a 20 20 20 20 20 20 2a 70 43 6f 6e 66  );..      *pConf
2b380 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20 3d 20 73  ig->pzErrmsg = s
2b390 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0d  qlite3_mprintf(.
2b3a0 0a 20 20 20 20 20 20 20 20 20 20 22 69 6e 76 61  .          "inva
2b3b0 6c 69 64 20 66 74 73 35 20 66 69 6c 65 20 66 6f  lid fts5 file fo
2b3c0 72 6d 61 74 20 28 66 6f 75 6e 64 20 25 64 2c 20  rmat (found %d, 
2b3d0 65 78 70 65 63 74 65 64 20 25 64 29 20 2d 20 72  expected %d) - r
2b3e0 75 6e 20 27 72 65 62 75 69 6c 64 27 22 2c 0d 0a  un 'rebuild'",..
2b3f0 20 20 20 20 20 20 20 20 20 20 69 56 65 72 73 69            iVersi
2b400 6f 6e 2c 20 46 54 53 35 5f 43 55 52 52 45 4e 54  on, FTS5_CURRENT
2b410 5f 56 45 52 53 49 4f 4e 0d 0a 20 20 20 20 20 20  _VERSION..      
2b420 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  );..    }..  }..
2b430 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2b440 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 43  TE_OK ){..    pC
2b450 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 20 3d  onfig->iCookie =
2b460 20 69 43 6f 6f 6b 69 65 3b 0d 0a 20 20 7d 0d 0a   iCookie;..  }..
2b470 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
2b480 0a 0d 0a 23 6c 69 6e 65 20 31 20 22 66 74 73 35  ...#line 1 "fts5
2b490 5f 65 78 70 72 2e 63 22 0d 0a 2f 2a 0d 0a 2a 2a  _expr.c"../*..**
2b4a0 20 32 30 31 34 20 4d 61 79 20 33 31 0d 0a 2a 2a   2014 May 31..**
2b4b0 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20  ..** The author 
2b4c0 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
2b4d0 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
2b4e0 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
2b4f0 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61  ce of..** a lega
2b500 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
2b510 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a  s a blessing:..*
2b520 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  *..**    May you
2b530 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
2b540 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61   evil...**    Ma
2b550 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
2b560 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
2b570 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
2b580 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d  others...**    M
2b590 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
2b5a0 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
2b5b0 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
2b5c0 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a  give...**..*****
2b5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b610 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a  *********..**..*
2b620 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 20 23 69 6e 63  /......../* #inc
2b630 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68 22  lude "fts5Int.h"
2b640 20 2a 2f 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65   */../* #include
2b650 20 22 66 74 73 35 70 61 72 73 65 2e 68 22 20 2a   "fts5parse.h" *
2b660 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 20  /..../*..** All 
2b670 74 6f 6b 65 6e 20 74 79 70 65 73 20 69 6e 20 74  token types in t
2b680 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 74 73  he generated fts
2b690 35 70 61 72 73 65 2e 68 20 66 69 6c 65 20 61 72  5parse.h file ar
2b6a0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  e greater than 0
2b6b0 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 46  ...*/..#define F
2b6c0 54 53 35 5f 45 4f 46 20 30 0d 0a 0d 0a 23 64 65  TS5_EOF 0....#de
2b6d0 66 69 6e 65 20 46 54 53 35 5f 4c 41 52 47 45 53  fine FTS5_LARGES
2b6e0 54 5f 49 4e 54 36 34 20 20 28 30 78 66 66 66 66  T_INT64  (0xffff
2b6f0 66 66 66 66 7c 28 28 28 69 36 34 29 30 78 37 66  ffff|(((i64)0x7f
2b700 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0d 0a 0d  ffffff)<<32))...
2b710 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2b720 46 74 73 35 45 78 70 72 54 65 72 6d 20 46 74 73  Fts5ExprTerm Fts
2b730 35 45 78 70 72 54 65 72 6d 3b 0d 0a 0d 0a 2f 2a  5ExprTerm;..../*
2b740 0d 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 67  ..** Functions g
2b750 65 6e 65 72 61 74 65 64 20 62 79 20 6c 65 6d 6f  enerated by lemo
2b760 6e 20 66 72 6f 6d 20 66 74 73 35 70 61 72 73 65  n from fts5parse
2b770 2e 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  .y...*/..static 
2b780 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 46 74 73  void *sqlite3Fts
2b790 35 50 61 72 73 65 72 41 6c 6c 6f 63 28 76 6f 69  5ParserAlloc(voi
2b7a0 64 20 2a 28 2a 6d 61 6c 6c 6f 63 50 72 6f 63 29  d *(*mallocProc)
2b7b0 28 75 36 34 29 29 3b 0d 0a 73 74 61 74 69 63 20  (u64));..static 
2b7c0 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
2b7d0 50 61 72 73 65 72 46 72 65 65 28 76 6f 69 64 2a  ParserFree(void*
2b7e0 2c 20 76 6f 69 64 20 28 2a 66 72 65 65 50 72 6f  , void (*freePro
2b7f0 63 29 28 76 6f 69 64 2a 29 29 3b 0d 0a 73 74 61  c)(void*));..sta
2b800 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
2b810 46 74 73 35 50 61 72 73 65 72 28 76 6f 69 64 2a  Fts5Parser(void*
2b820 2c 20 69 6e 74 2c 20 46 74 73 35 54 6f 6b 65 6e  , int, Fts5Token
2b830 2c 20 46 74 73 35 50 61 72 73 65 2a 29 3b 0d 0a  , Fts5Parse*);..
2b840 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0d 0a  #ifndef NDEBUG..
2b850 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
2b860 68 3e 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  h>..static void 
2b870 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
2b880 72 54 72 61 63 65 28 46 49 4c 45 2a 2c 20 63 68  rTrace(FILE*, ch
2b890 61 72 2a 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 73  ar*);..#endif..s
2b8a0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
2b8b0 33 46 74 73 35 50 61 72 73 65 72 46 61 6c 6c 62  3Fts5ParserFallb
2b8c0 61 63 6b 28 69 6e 74 29 3b 0d 0a 0d 0a 0d 0a 73  ack(int);......s
2b8d0 74 72 75 63 74 20 46 74 73 35 45 78 70 72 20 7b  truct Fts5Expr {
2b8e0 0d 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  ..  Fts5Index *p
2b8f0 49 6e 64 65 78 3b 0d 0a 20 20 46 74 73 35 43 6f  Index;..  Fts5Co
2b900 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b 0d 0a  nfig *pConfig;..
2b910 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
2b920 70 52 6f 6f 74 3b 0d 0a 20 20 69 6e 74 20 62 44  pRoot;..  int bD
2b930 65 73 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  esc;            
2b940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2b950 72 61 74 65 20 69 6e 20 64 65 73 63 65 6e 64 69  rate in descendi
2b960 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20 2a  ng rowid order *
2b970 2f 0d 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65  /..  int nPhrase
2b980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b990 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b9a0 66 20 70 68 72 61 73 65 73 20 69 6e 20 65 78 70  f phrases in exp
2b9b0 72 65 73 73 69 6f 6e 20 2a 2f 0d 0a 20 20 46 74  ression */..  Ft
2b9c0 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 2a 61  s5ExprPhrase **a
2b9d0 70 45 78 70 72 50 68 72 61 73 65 3b 20 20 2f 2a  pExprPhrase;  /*
2b9e0 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 70 68 72   Pointers to phr
2b9f0 61 73 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0d 0a  ase objects */..
2ba00 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 65 54 79  };..../*..** eTy
2ba10 70 65 3a 0d 0a 2a 2a 20 20 20 45 78 70 72 65 73  pe:..**   Expres
2ba20 73 69 6f 6e 20 6e 6f 64 65 20 74 79 70 65 2e 20  sion node type. 
2ba30 41 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0d 0a  Always one of:..
2ba40 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20 46 54 53  **..**       FTS
2ba50 35 5f 41 4e 44 20 20 20 20 20 20 20 20 20 20 20  5_AND           
2ba60 20 20 20 20 20 20 28 6e 43 68 69 6c 64 2c 20 61        (nChild, a
2ba70 70 43 68 69 6c 64 20 76 61 6c 69 64 29 0d 0a 2a  pChild valid)..*
2ba80 2a 20 20 20 20 20 20 20 46 54 53 35 5f 4f 52 20  *       FTS5_OR 
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baa0 20 28 6e 43 68 69 6c 64 2c 20 61 70 43 68 69 6c   (nChild, apChil
2bab0 64 20 76 61 6c 69 64 29 0d 0a 2a 2a 20 20 20 20  d valid)..**    
2bac0 20 20 20 46 54 53 35 5f 4e 4f 54 20 20 20 20 20     FTS5_NOT     
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 43 68              (nCh
2bae0 69 6c 64 2c 20 61 70 43 68 69 6c 64 20 76 61 6c  ild, apChild val
2baf0 69 64 29 0d 0a 2a 2a 20 20 20 20 20 20 20 46 54  id)..**       FT
2bb00 53 35 5f 53 54 52 49 4e 47 20 20 20 20 20 20 20  S5_STRING       
2bb10 20 20 20 20 20 20 20 28 70 4e 65 61 72 20 76 61         (pNear va
2bb20 6c 69 64 29 0d 0a 2a 2a 20 20 20 20 20 20 20 46  lid)..**       F
2bb30 54 53 35 5f 54 45 52 4d 20 20 20 20 20 20 20 20  TS5_TERM        
2bb40 20 20 20 20 20 20 20 20 28 70 4e 65 61 72 20 76          (pNear v
2bb50 61 6c 69 64 29 0d 0a 2a 2f 0d 0a 73 74 72 75 63  alid)..*/..struc
2bb60 74 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 7b  t Fts5ExprNode {
2bb70 0d 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  ..  int eType;  
2bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb90 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74 79 70 65      /* Node type
2bba0 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 45 6f 66 3b   */..  int bEof;
2bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbc0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61         /* True a
2bbd0 74 20 45 4f 46 20 2a 2f 0d 0a 20 20 69 6e 74 20  t EOF */..  int 
2bbe0 62 4e 6f 6d 61 74 63 68 3b 20 20 20 20 20 20 20  bNomatch;       
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2bc00 72 75 65 20 69 66 20 65 6e 74 72 79 20 69 73 20  rue if entry is 
2bc10 6e 6f 74 20 61 20 6d 61 74 63 68 20 2a 2f 0d 0a  not a match */..
2bc20 0d 0a 20 20 2f 2a 20 4e 65 78 74 20 6d 65 74 68  ..  /* Next meth
2bc30 6f 64 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  od for this node
2bc40 2e 20 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 4e  . */..  int (*xN
2bc50 65 78 74 29 28 46 74 73 35 45 78 70 72 2a 2c 20  ext)(Fts5Expr*, 
2bc60 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 2c 20 69  Fts5ExprNode*, i
2bc70 6e 74 2c 20 69 36 34 29 3b 0d 0a 0d 0a 20 20 69  nt, i64);....  i
2bc80 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
2bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bca0 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20  * Current rowid 
2bcb0 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 65  */..  Fts5ExprNe
2bcc0 61 72 73 65 74 20 2a 70 4e 65 61 72 3b 20 20 20  arset *pNear;   
2bcd0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 46 54 53        /* For FTS
2bce0 35 5f 53 54 52 49 4e 47 20 2d 20 63 6c 75 73 74  5_STRING - clust
2bcf0 65 72 20 6f 66 20 70 68 72 61 73 65 73 20 2a 2f  er of phrases */
2bd00 0d 0a 0d 0a 20 20 2f 2a 20 43 68 69 6c 64 20 6e  ....  /* Child n
2bd10 6f 64 65 73 2e 20 46 6f 72 20 61 20 4e 4f 54 20  odes. For a NOT 
2bd20 6e 6f 64 65 2c 20 74 68 69 73 20 61 72 72 61 79  node, this array
2bd30 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 73   always contains
2bd40 20 32 20 65 6e 74 72 69 65 73 2e 20 46 6f 72 20   2 entries. For 
2bd50 0d 0a 20 20 2a 2a 20 41 4e 44 20 6f 72 20 4f 52  ..  ** AND or OR
2bd60 20 6e 6f 64 65 73 2c 20 69 74 20 63 6f 6e 74 61   nodes, it conta
2bd70 69 6e 73 20 32 20 6f 72 20 6d 6f 72 65 20 65 6e  ins 2 or more en
2bd80 74 72 69 65 73 2e 20 20 2a 2f 0d 0a 20 20 69 6e  tries.  */..  in
2bd90 74 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20  t nChild;       
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bdb0 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64   Number of child
2bdc0 20 6e 6f 64 65 73 20 2a 2f 0d 0a 20 20 46 74 73   nodes */..  Fts
2bdd0 35 45 78 70 72 4e 6f 64 65 20 2a 61 70 43 68 69  5ExprNode *apChi
2bde0 6c 64 5b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20  ld[1];       /* 
2bdf0 41 72 72 61 79 20 6f 66 20 63 68 69 6c 64 20 6e  Array of child n
2be00 6f 64 65 73 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 23  odes */..};....#
2be10 64 65 66 69 6e 65 20 46 74 73 35 4e 6f 64 65 49  define Fts5NodeI
2be20 73 53 74 72 69 6e 67 28 70 29 20 28 28 70 29 2d  sString(p) ((p)-
2be30 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
2be40 4d 20 7c 7c 20 28 70 29 2d 3e 65 54 79 70 65 3d  M || (p)->eType=
2be50 3d 46 54 53 35 5f 53 54 52 49 4e 47 29 0d 0a 0d  =FTS5_STRING)...
2be60 0a 2f 2a 0d 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ./*..** Invoke t
2be70 68 65 20 78 4e 65 78 74 20 6d 65 74 68 6f 64 20  he xNext method 
2be80 6f 66 20 61 6e 20 46 74 73 35 45 78 70 72 4e 6f  of an Fts5ExprNo
2be90 64 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  de object. This 
2bea0 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 0d  macro should be.
2beb0 0a 2a 2a 20 75 73 65 64 20 61 73 20 69 66 20 69  .** used as if i
2bec0 74 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  t has the same s
2bed0 69 67 6e 61 74 75 72 65 20 61 73 20 74 68 65 20  ignature as the 
2bee0 78 4e 65 78 74 28 29 20 6d 65 74 68 6f 64 73 20  xNext() methods 
2bef0 74 68 65 6d 73 65 6c 76 65 73 2e 0d 0a 2a 2f 0d  themselves...*/.
2bf00 0a 23 64 65 66 69 6e 65 20 66 74 73 35 45 78 70  .#define fts5Exp
2bf10 72 4e 6f 64 65 4e 65 78 74 28 61 2c 62 2c 63 2c  rNodeNext(a,b,c,
2bf20 64 29 20 28 62 29 2d 3e 78 4e 65 78 74 28 28 61  d) (b)->xNext((a
2bf30 29 2c 20 28 62 29 2c 20 28 63 29 2c 20 28 64 29  ), (b), (c), (d)
2bf40 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6e 20 69  )..../*..** An i
2bf50 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2bf60 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2bf70 72 65 20 72 65 70 72 65 73 65 6e 74 73 20 61 20  re represents a 
2bf80 73 69 6e 67 6c 65 20 73 65 61 72 63 68 20 74 65  single search te
2bf90 72 6d 0d 0a 2a 2a 20 6f 72 20 74 65 72 6d 20 70  rm..** or term p
2bfa0 72 65 66 69 78 2e 0d 0a 2a 2f 0d 0a 73 74 72 75  refix...*/..stru
2bfb0 63 74 20 46 74 73 35 45 78 70 72 54 65 72 6d 20  ct Fts5ExprTerm 
2bfc0 7b 0d 0a 20 20 75 38 20 62 50 72 65 66 69 78 3b  {..  u8 bPrefix;
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfe0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2bff0 20 61 20 70 72 65 66 69 78 20 74 65 72 6d 20 2a   a prefix term *
2c000 2f 0d 0a 20 20 75 38 20 62 46 69 72 73 74 3b 20  /..  u8 bFirst; 
2c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c020 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2c030 74 6f 6b 65 6e 20 6d 75 73 74 20 62 65 20 66 69  token must be fi
2c040 72 73 74 20 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f  rst in column */
2c050 0d 0a 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b  ..  char *zTerm;
2c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c070 20 20 20 20 2f 2a 20 6e 75 6c 2d 74 65 72 6d 69      /* nul-termi
2c080 6e 61 74 65 64 20 74 65 72 6d 20 2a 2f 0d 0a 20  nated term */.. 
2c090 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
2c0a0 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
2c0b0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
2c0c0 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0d 0a 20   this term */.. 
2c0d0 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
2c0e0 53 79 6e 6f 6e 79 6d 3b 20 20 20 20 20 20 20 20  Synonym;        
2c0f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66   /* Pointer to f
2c100 69 72 73 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  irst in list of 
2c110 73 79 6e 6f 6e 79 6d 73 20 2a 2f 0d 0a 7d 3b 0d  synonyms */..};.
2c120 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 70 68 72 61  .../*..** A phra
2c130 73 65 2e 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20  se. One or more 
2c140 74 65 72 6d 73 20 74 68 61 74 20 6d 75 73 74 20  terms that must 
2c150 61 70 70 65 61 72 20 69 6e 20 61 20 63 6f 6e 74  appear in a cont
2c160 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63 65 0d  iguous sequence.
2c170 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20 64 6f 63  .** within a doc
2c180 75 6d 65 6e 74 20 66 6f 72 20 69 74 20 74 6f 20  ument for it to 
2c190 6d 61 74 63 68 2e 0d 0a 2a 2f 0d 0a 73 74 72 75  match...*/..stru
2c1a0 63 74 20 46 74 73 35 45 78 70 72 50 68 72 61 73  ct Fts5ExprPhras
2c1b0 65 20 7b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e  e {..  Fts5ExprN
2c1c0 6f 64 65 20 2a 70 4e 6f 64 65 3b 20 20 20 20 20  ode *pNode;     
2c1d0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 53         /* FTS5_S
2c1e0 54 52 49 4e 47 20 6e 6f 64 65 20 74 68 69 73 20  TRING node this 
2c1f0 70 68 72 61 73 65 20 69 73 20 70 61 72 74 20 6f  phrase is part o
2c200 66 20 2a 2f 0d 0a 20 20 46 74 73 35 42 75 66 66  f */..  Fts5Buff
2c210 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20  er poslist;     
2c220 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2c230 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
2c240 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54 65 72 6d   */..  int nTerm
2c250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c260 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c270 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2c280 54 65 72 6d 5b 5d 20 2a 2f 0d 0a 20 20 46 74 73  Term[] */..  Fts
2c290 35 45 78 70 72 54 65 72 6d 20 61 54 65 72 6d 5b  5ExprTerm aTerm[
2c2a0 31 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1];          /* 
2c2b0 54 65 72 6d 73 20 74 68 61 74 20 6d 61 6b 65 20  Terms that make 
2c2c0 75 70 20 74 68 69 73 20 70 68 72 61 73 65 20 2a  up this phrase *
2c2d0 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  /..};..../*..** 
2c2e0 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 68 72 61  One or more phra
2c2f0 73 65 73 20 74 68 61 74 20 6d 75 73 74 20 61 70  ses that must ap
2c300 70 65 61 72 20 77 69 74 68 69 6e 20 61 20 63 65  pear within a ce
2c310 72 74 61 69 6e 20 74 6f 6b 65 6e 20 64 69 73 74  rtain token dist
2c320 61 6e 63 65 20 6f 66 0d 0a 2a 2a 20 65 61 63 68  ance of..** each
2c330 20 6f 74 68 65 72 20 77 69 74 68 69 6e 20 65 61   other within ea
2c340 63 68 20 6d 61 74 63 68 69 6e 67 20 64 6f 63 75  ch matching docu
2c350 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 72 75 63  ment...*/..struc
2c360 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  t Fts5ExprNearse
2c370 74 20 7b 0d 0a 20 20 69 6e 74 20 6e 4e 65 61 72  t {..  int nNear
2c380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c390 20 20 20 20 20 20 20 2f 2a 20 4e 45 41 52 20 70         /* NEAR p
2c3a0 61 72 61 6d 65 74 65 72 20 2a 2f 0d 0a 20 20 46  arameter */..  F
2c3b0 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
2c3c0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
2c3d0 2a 20 43 6f 6c 75 6d 6e 73 20 74 6f 20 73 65 61  * Columns to sea
2c3e0 72 63 68 20 28 4e 55 4c 4c 20 2d 3e 20 61 6c 6c  rch (NULL -> all
2c3f0 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0d 0a 20 20   columns) */..  
2c400 69 6e 74 20 6e 50 68 72 61 73 65 3b 20 20 20 20  int nPhrase;    
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c420 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
2c430 72 69 65 73 20 69 6e 20 61 50 68 72 61 73 65 5b  ries in aPhrase[
2c440 5d 20 61 72 72 61 79 20 2a 2f 0d 0a 20 20 46 74  ] array */..  Ft
2c450 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 61 70  s5ExprPhrase *ap
2c460 50 68 72 61 73 65 5b 31 5d 3b 20 20 20 20 2f 2a  Phrase[1];    /*
2c470 20 41 72 72 61 79 20 6f 66 20 70 68 72 61 73 65   Array of phrase
2c480 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0d 0a 7d 3b   pointers */..};
2c490 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 61 72  ....../*..** Par
2c4a0 73 65 20 63 6f 6e 74 65 78 74 2e 0d 0a 2a 2f 0d  se context...*/.
2c4b0 0a 73 74 72 75 63 74 20 46 74 73 35 50 61 72 73  .struct Fts5Pars
2c4c0 65 20 7b 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69  e {..  Fts5Confi
2c4d0 67 20 2a 70 43 6f 6e 66 69 67 3b 0d 0a 20 20 63  g *pConfig;..  c
2c4e0 68 61 72 20 2a 7a 45 72 72 3b 0d 0a 20 20 69 6e  har *zErr;..  in
2c4f0 74 20 72 63 3b 0d 0a 20 20 69 6e 74 20 6e 50 68  t rc;..  int nPh
2c500 72 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  rase;           
2c510 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2c520 20 6f 66 20 61 70 50 68 72 61 73 65 20 61 72 72   of apPhrase arr
2c530 61 79 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70  ay */..  Fts5Exp
2c540 72 50 68 72 61 73 65 20 2a 2a 61 70 50 68 72 61  rPhrase **apPhra
2c550 73 65 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61  se;      /* Arra
2c560 79 20 6f 66 20 61 6c 6c 20 70 68 72 61 73 65 73  y of all phrases
2c570 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e   */..  Fts5ExprN
2c580 6f 64 65 20 2a 70 45 78 70 72 3b 20 20 20 20 20  ode *pExpr;     
2c590 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2c5a0 20 6f 66 20 61 20 73 75 63 63 65 73 73 66 75 6c   of a successful
2c5b0 20 70 61 72 73 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d   parse */..};...
2c5c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2c5d0 69 74 65 33 46 74 73 35 50 61 72 73 65 45 72 72  ite3Fts5ParseErr
2c5e0 6f 72 28 46 74 73 35 50 61 72 73 65 20 2a 70 50  or(Fts5Parse *pP
2c5f0 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2c600 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0d 0a 20   *zFmt, ...){.. 
2c610 20 76 61 5f 6c 69 73 74 20 61 70 3b 0d 0a 20 20   va_list ap;..  
2c620 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
2c630 74 29 3b 0d 0a 20 20 69 66 28 20 70 50 61 72 73  t);..  if( pPars
2c640 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
2c650 20 29 7b 0d 0a 20 20 20 20 70 50 61 72 73 65 2d   ){..    pParse-
2c660 3e 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  >zErr = sqlite3_
2c670 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
2c680 70 29 3b 0d 0a 20 20 20 20 70 50 61 72 73 65 2d  p);..    pParse-
2c690 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
2c6a0 4f 52 3b 0d 0a 20 20 7d 0d 0a 20 20 76 61 5f 65  OR;..  }..  va_e
2c6b0 6e 64 28 61 70 29 3b 0d 0a 7d 0d 0a 0d 0a 73 74  nd(ap);..}....st
2c6c0 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
2c6d0 72 49 73 73 70 61 63 65 28 63 68 61 72 20 74 29  rIsspace(char t)
2c6e0 7b 0d 0a 20 20 72 65 74 75 72 6e 20 74 3d 3d 27  {..  return t=='
2c6f0 20 27 20 7c 7c 20 74 3d 3d 27 5c 74 27 20 7c 7c   ' || t=='\t' ||
2c700 20 74 3d 3d 27 5c 6e 27 20 7c 7c 20 74 3d 3d 27   t=='\n' || t=='
2c710 5c 72 27 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a  \r';..}..../*..*
2c720 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
2c730 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20   token from the 
2c740 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
2c750 74 72 69 6e 67 20 61 74 20 2a 70 7a 2e 0d 0a 2a  tring at *pz...*
2c760 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
2c770 73 35 45 78 70 72 47 65 74 54 6f 6b 65 6e 28 0d  s5ExprGetToken(.
2c780 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
2c790 61 72 73 65 2c 20 0d 0a 20 20 63 6f 6e 73 74 20  arse, ..  const 
2c7a0 63 68 61 72 20 2a 2a 70 7a 2c 20 20 20 20 20 20  char **pz,      
2c7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2c7c0 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 69 6e 74  OUT: Pointer int
2c7d0 6f 20 62 75 66 66 65 72 20 2a 2f 0d 0a 20 20 46  o buffer */..  F
2c7e0 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  ts5Token *pToken
2c7f0 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68  ..){..  const ch
2c800 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b 0d 0a 20 20  ar *z = *pz;..  
2c810 69 6e 74 20 74 6f 6b 3b 0d 0a 0d 0a 20 20 2f 2a  int tok;....  /*
2c820 20 53 6b 69 70 20 70 61 73 74 20 61 6e 79 20 77   Skip past any w
2c830 68 69 74 65 73 70 61 63 65 20 2a 2f 0d 0a 20 20  hitespace */..  
2c840 77 68 69 6c 65 28 20 66 74 73 35 45 78 70 72 49  while( fts5ExprI
2c850 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b  sspace(*z) ) z++
2c860 3b 0d 0a 0d 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70  ;....  pToken->p
2c870 20 3d 20 7a 3b 0d 0a 20 20 70 54 6f 6b 65 6e 2d   = z;..  pToken-
2c880 3e 6e 20 3d 20 31 3b 0d 0a 20 20 73 77 69 74 63  >n = 1;..  switc
2c890 68 28 20 2a 7a 20 29 7b 0d 0a 20 20 20 20 63 61  h( *z ){..    ca
2c8a0 73 65 20 27 28 27 3a 20 20 74 6f 6b 20 3d 20 46  se '(':  tok = F
2c8b0 54 53 35 5f 4c 50 3b 20 20 20 20 62 72 65 61 6b  TS5_LP;    break
2c8c0 3b 0d 0a 20 20 20 20 63 61 73 65 20 27 29 27 3a  ;..    case ')':
2c8d0 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 52 50 3b    tok = FTS5_RP;
2c8e0 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
2c8f0 63 61 73 65 20 27 7b 27 3a 20 20 74 6f 6b 20 3d  case '{':  tok =
2c900 20 46 54 53 35 5f 4c 43 50 3b 20 20 20 62 72 65   FTS5_LCP;   bre
2c910 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 27 7d  ak;..    case '}
2c920 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 52  ':  tok = FTS5_R
2c930 43 50 3b 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20  CP;   break;..  
2c940 20 20 63 61 73 65 20 27 3a 27 3a 20 20 74 6f 6b    case ':':  tok
2c950 20 3d 20 46 54 53 35 5f 43 4f 4c 4f 4e 3b 20 62   = FTS5_COLON; b
2c960 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
2c970 27 2c 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  ',':  tok = FTS5
2c980 5f 43 4f 4d 4d 41 3b 20 62 72 65 61 6b 3b 0d 0a  _COMMA; break;..
2c990 20 20 20 20 63 61 73 65 20 27 2b 27 3a 20 20 74      case '+':  t
2c9a0 6f 6b 20 3d 20 46 54 53 35 5f 50 4c 55 53 3b 20  ok = FTS5_PLUS; 
2c9b0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73   break;..    cas
2c9c0 65 20 27 2a 27 3a 20 20 74 6f 6b 20 3d 20 46 54  e '*':  tok = FT
2c9d0 53 35 5f 53 54 41 52 3b 20 20 62 72 65 61 6b 3b  S5_STAR;  break;
2c9e0 0d 0a 20 20 20 20 63 61 73 65 20 27 2d 27 3a 20  ..    case '-': 
2c9f0 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4d 49 4e 55   tok = FTS5_MINU
2ca00 53 3b 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63  S; break;..    c
2ca10 61 73 65 20 27 5e 27 3a 20 20 74 6f 6b 20 3d 20  ase '^':  tok = 
2ca20 46 54 53 35 5f 43 41 52 45 54 3b 20 62 72 65 61  FTS5_CARET; brea
2ca30 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 27 5c 30  k;..    case '\0
2ca40 27 3a 20 74 6f 6b 20 3d 20 46 54 53 35 5f 45 4f  ': tok = FTS5_EO
2ca50 46 3b 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20  F;   break;.... 
2ca60 20 20 20 63 61 73 65 20 27 22 27 3a 20 7b 0d 0a     case '"': {..
2ca70 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2ca80 20 2a 7a 32 3b 0d 0a 20 20 20 20 20 20 74 6f 6b   *z2;..      tok
2ca90 20 3d 20 46 54 53 35 5f 53 54 52 49 4e 47 3b 0d   = FTS5_STRING;.
2caa0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 28 7a 32 3d  ...      for(z2=
2cab0 26 7a 5b 31 5d 3b 20 31 3b 20 7a 32 2b 2b 29 7b  &z[1]; 1; z2++){
2cac0 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 32  ..        if( z2
2cad0 5b 30 5d 3d 3d 27 22 27 20 29 7b 0d 0a 20 20 20  [0]=='"' ){..   
2cae0 20 20 20 20 20 20 20 7a 32 2b 2b 3b 0d 0a 20 20         z2++;..  
2caf0 20 20 20 20 20 20 20 20 69 66 28 20 7a 32 5b 30          if( z2[0
2cb00 5d 21 3d 27 22 27 20 29 20 62 72 65 61 6b 3b 0d  ]!='"' ) break;.
2cb10 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2cb20 20 20 20 20 69 66 28 20 7a 32 5b 30 5d 3d 3d 27      if( z2[0]=='
2cb30 5c 30 27 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  \0' ){..        
2cb40 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
2cb50 73 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  seError(pParse, 
2cb60 22 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74  "unterminated st
2cb70 72 69 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20 20  ring");..       
2cb80 20 20 20 72 65 74 75 72 6e 20 46 54 53 35 5f 45     return FTS5_E
2cb90 4f 46 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  OF;..        }..
2cba0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 70        }..      p
2cbb0 54 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a 32 20 2d  Token->n = (z2 -
2cbc0 20 7a 29 3b 0d 0a 20 20 20 20 20 20 62 72 65 61   z);..      brea
2cbd0 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  k;..    }....   
2cbe0 20 64 65 66 61 75 6c 74 3a 20 7b 0d 0a 20 20 20   default: {..   
2cbf0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2cc00 32 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 73 71  2;..      if( sq
2cc10 6c 69 74 65 33 46 74 73 35 49 73 42 61 72 65 77  lite3Fts5IsBarew
2cc20 6f 72 64 28 7a 5b 30 5d 29 3d 3d 30 20 29 7b 0d  ord(z[0])==0 ){.
2cc30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cc40 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 70  Fts5ParseError(p
2cc50 50 61 72 73 65 2c 20 22 66 74 73 35 3a 20 73 79  Parse, "fts5: sy
2cc60 6e 74 61 78 20 65 72 72 6f 72 20 6e 65 61 72 20  ntax error near 
2cc70 5c 22 25 2e 31 73 5c 22 22 2c 20 7a 29 3b 0d 0a  \"%.1s\"", z);..
2cc80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 46          return F
2cc90 54 53 35 5f 45 4f 46 3b 0d 0a 20 20 20 20 20 20  TS5_EOF;..      
2cca0 7d 0d 0a 20 20 20 20 20 20 74 6f 6b 20 3d 20 46  }..      tok = F
2ccb0 54 53 35 5f 53 54 52 49 4e 47 3b 0d 0a 20 20 20  TS5_STRING;..   
2ccc0 20 20 20 66 6f 72 28 7a 32 3d 26 7a 5b 31 5d 3b     for(z2=&z[1];
2ccd0 20 73 71 6c 69 74 65 33 46 74 73 35 49 73 42 61   sqlite3Fts5IsBa
2cce0 72 65 77 6f 72 64 28 2a 7a 32 29 3b 20 7a 32 2b  reword(*z2); z2+
2ccf0 2b 29 3b 0d 0a 20 20 20 20 20 20 70 54 6f 6b 65  +);..      pToke
2cd00 6e 2d 3e 6e 20 3d 20 28 7a 32 20 2d 20 7a 29 3b  n->n = (z2 - z);
2cd10 0d 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b  ..      if( pTok
2cd20 65 6e 2d 3e 6e 3d 3d 32 20 26 26 20 6d 65 6d 63  en->n==2 && memc
2cd30 6d 70 28 70 54 6f 6b 65 6e 2d 3e 70 2c 20 22 4f  mp(pToken->p, "O
2cd40 52 22 2c 20 32 29 3d 3d 30 20 29 20 20 74 6f 6b  R", 2)==0 )  tok
2cd50 20 3d 20 46 54 53 35 5f 4f 52 3b 0d 0a 20 20 20   = FTS5_OR;..   
2cd60 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e     if( pToken->n
2cd70 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 70 54  ==3 && memcmp(pT
2cd80 6f 6b 65 6e 2d 3e 70 2c 20 22 4e 4f 54 22 2c 20  oken->p, "NOT", 
2cd90 33 29 3d 3d 30 20 29 20 74 6f 6b 20 3d 20 46 54  3)==0 ) tok = FT
2cda0 53 35 5f 4e 4f 54 3b 0d 0a 20 20 20 20 20 20 69  S5_NOT;..      i
2cdb0 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 33 20  f( pToken->n==3 
2cdc0 26 26 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e  && memcmp(pToken
2cdd0 2d 3e 70 2c 20 22 41 4e 44 22 2c 20 33 29 3d 3d  ->p, "AND", 3)==
2cde0 30 20 29 20 74 6f 6b 20 3d 20 46 54 53 35 5f 41  0 ) tok = FTS5_A
2cdf0 4e 44 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b  ND;..      break
2ce00 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
2ce10 0a 20 20 2a 70 7a 20 3d 20 26 70 54 6f 6b 65 6e  .  *pz = &pToken
2ce20 2d 3e 70 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 3b 0d  ->p[pToken->n];.
2ce30 0a 20 20 72 65 74 75 72 6e 20 74 6f 6b 3b 0d 0a  .  return tok;..
2ce40 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  }....static void
2ce50 20 2a 66 74 73 35 50 61 72 73 65 41 6c 6c 6f 63   *fts5ParseAlloc
2ce60 28 75 36 34 20 74 29 7b 20 72 65 74 75 72 6e 20  (u64 t){ return 
2ce70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
2ce80 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
2ce90 74 29 3b 7d 0d 0a 73 74 61 74 69 63 20 76 6f 69  t);}..static voi
2cea0 64 20 66 74 73 35 50 61 72 73 65 46 72 65 65 28  d fts5ParseFree(
2ceb0 76 6f 69 64 20 2a 70 29 7b 20 73 71 6c 69 74 65  void *p){ sqlite
2cec0 33 5f 66 72 65 65 28 70 29 3b 20 7d 0d 0a 0d 0a  3_free(p); }....
2ced0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
2cee0 65 33 46 74 73 35 45 78 70 72 4e 65 77 28 0d 0a  e3Fts5ExprNew(..
2cef0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
2cf00 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20  onfig,          
2cf10 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69 67    /* FTS5 Config
2cf20 75 72 61 74 69 6f 6e 20 2a 2f 0d 0a 20 20 69 6e  uration */..  in
2cf30 74 20 69 43 6f 6c 2c 0d 0a 20 20 63 6f 6e 73 74  t iCol,..  const
2cf40 20 63 68 61 72 20 2a 7a 45 78 70 72 2c 20 20 20   char *zExpr,   
2cf50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2cf60 70 72 65 73 73 69 6f 6e 20 74 65 78 74 20 2a 2f  pression text */
2cf70 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a 2a 70  ..  Fts5Expr **p
2cf80 70 4e 65 77 2c 20 0d 0a 20 20 63 68 61 72 20 2a  pNew, ..  char *
2cf90 2a 70 7a 45 72 72 0d 0a 29 7b 0d 0a 20 20 46 74  *pzErr..){..  Ft
2cfa0 73 35 50 61 72 73 65 20 73 50 61 72 73 65 3b 0d  s5Parse sParse;.
2cfb0 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 74 6f 6b  .  Fts5Token tok
2cfc0 65 6e 3b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61  en;..  const cha
2cfd0 72 20 2a 7a 20 3d 20 7a 45 78 70 72 3b 0d 0a 20  r *z = zExpr;.. 
2cfe0 20 69 6e 74 20 74 3b 20 20 20 20 20 20 20 20 20   int t;         
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d000 20 2f 2a 20 4e 65 78 74 20 74 6f 6b 65 6e 20 74   /* Next token t
2d010 79 70 65 20 2a 2f 0d 0a 20 20 76 6f 69 64 20 2a  ype */..  void *
2d020 70 45 6e 67 69 6e 65 3b 0d 0a 20 20 46 74 73 35  pEngine;..  Fts5
2d030 45 78 70 72 20 2a 70 4e 65 77 3b 0d 0a 0d 0a 20  Expr *pNew;.... 
2d040 20 2a 70 70 4e 65 77 20 3d 20 30 3b 0d 0a 20 20   *ppNew = 0;..  
2d050 2a 70 7a 45 72 72 20 3d 20 30 3b 0d 0a 20 20 6d  *pzErr = 0;..  m
2d060 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20 30  emset(&sParse, 0
2d070 2c 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65 29  , sizeof(sParse)
2d080 29 3b 0d 0a 20 20 70 45 6e 67 69 6e 65 20 3d 20  );..  pEngine = 
2d090 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
2d0a0 72 41 6c 6c 6f 63 28 66 74 73 35 50 61 72 73 65  rAlloc(fts5Parse
2d0b0 41 6c 6c 6f 63 29 3b 0d 0a 20 20 69 66 28 20 70  Alloc);..  if( p
2d0c0 45 6e 67 69 6e 65 3d 3d 30 20 29 7b 20 72 65 74  Engine==0 ){ ret
2d0d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d0e0 3b 20 7d 0d 0a 20 20 73 50 61 72 73 65 2e 70 43  ; }..  sParse.pC
2d0f0 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b  onfig = pConfig;
2d100 0d 0a 0d 0a 20 20 64 6f 20 7b 0d 0a 20 20 20 20  ....  do {..    
2d110 74 20 3d 20 66 74 73 35 45 78 70 72 47 65 74 54  t = fts5ExprGetT
2d120 6f 6b 65 6e 28 26 73 50 61 72 73 65 2c 20 26 7a  oken(&sParse, &z
2d130 2c 20 26 74 6f 6b 65 6e 29 3b 0d 0a 20 20 20 20  , &token);..    
2d140 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
2d150 72 28 70 45 6e 67 69 6e 65 2c 20 74 2c 20 74 6f  r(pEngine, t, to
2d160 6b 65 6e 2c 20 26 73 50 61 72 73 65 29 3b 0d 0a  ken, &sParse);..
2d170 20 20 7d 77 68 69 6c 65 28 20 73 50 61 72 73 65    }while( sParse
2d180 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  .rc==SQLITE_OK &
2d190 26 20 74 21 3d 46 54 53 35 5f 45 4f 46 20 29 3b  & t!=FTS5_EOF );
2d1a0 0d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ..  sqlite3Fts5P
2d1b0 61 72 73 65 72 46 72 65 65 28 70 45 6e 67 69 6e  arserFree(pEngin
2d1c0 65 2c 20 66 74 73 35 50 61 72 73 65 46 72 65 65  e, fts5ParseFree
2d1d0 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68  );....  /* If th
2d1e0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 4d 41 54  e LHS of the MAT
2d1f0 43 48 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  CH expression wa
2d200 73 20 61 20 75 73 65 72 20 63 6f 6c 75 6d 6e 2c  s a user column,
2d210 20 61 70 70 6c 79 20 74 68 65 0d 0a 20 20 2a 2a   apply the..  **
2d220 20 69 6d 70 6c 69 63 69 74 20 63 6f 6c 75 6d 6e   implicit column
2d230 2d 66 69 6c 74 65 72 2e 20 20 2a 2f 0d 0a 20 20  -filter.  */..  
2d240 69 66 28 20 69 43 6f 6c 3c 70 43 6f 6e 66 69 67  if( iCol<pConfig
2d250 2d 3e 6e 43 6f 6c 20 26 26 20 73 50 61 72 73 65  ->nCol && sParse
2d260 2e 70 45 78 70 72 20 26 26 20 73 50 61 72 73 65  .pExpr && sParse
2d270 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  .rc==SQLITE_OK )
2d280 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  {..    int n = s
2d290 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74  izeof(Fts5Colset
2d2a0 29 3b 0d 0a 20 20 20 20 46 74 73 35 43 6f 6c 73  );..    Fts5Cols
2d2b0 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20 28 46  et *pColset = (F
2d2c0 74 73 35 43 6f 6c 73 65 74 2a 29 73 71 6c 69 74  ts5Colset*)sqlit
2d2d0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
2d2e0 28 26 73 50 61 72 73 65 2e 72 63 2c 20 6e 29 3b  (&sParse.rc, n);
2d2f0 0d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  ..    if( pColse
2d300 74 20 29 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6c  t ){..      pCol
2d310 73 65 74 2d 3e 6e 43 6f 6c 20 3d 20 31 3b 0d 0a  set->nCol = 1;..
2d320 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2d 3e 61        pColset->a
2d330 69 43 6f 6c 5b 30 5d 20 3d 20 69 43 6f 6c 3b 0d  iCol[0] = iCol;.
2d340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2d350 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74  s5ParseSetColset
2d360 28 26 73 50 61 72 73 65 2c 20 73 50 61 72 73 65  (&sParse, sParse
2d370 2e 70 45 78 70 72 2c 20 70 43 6f 6c 73 65 74 29  .pExpr, pColset)
2d380 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
2d390 0a 20 20 61 73 73 65 72 74 28 20 73 50 61 72 73  .  assert( sPars
2d3a0 65 2e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  e.rc!=SQLITE_OK 
2d3b0 7c 7c 20 73 50 61 72 73 65 2e 7a 45 72 72 3d 3d  || sParse.zErr==
2d3c0 30 20 29 3b 0d 0a 20 20 69 66 28 20 73 50 61 72  0 );..  if( sPar
2d3d0 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  se.rc==SQLITE_OK
2d3e0 20 29 7b 0d 0a 20 20 20 20 2a 70 70 4e 65 77 20   ){..    *ppNew 
2d3f0 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  = pNew = sqlite3
2d400 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46  _malloc(sizeof(F
2d410 74 73 35 45 78 70 72 29 29 3b 0d 0a 20 20 20 20  ts5Expr));..    
2d420 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0d 0a  if( pNew==0 ){..
2d430 20 20 20 20 20 20 73 50 61 72 73 65 2e 72 63 20        sParse.rc 
2d440 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d  = SQLITE_NOMEM;.
2d450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2d460 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
2d470 73 50 61 72 73 65 2e 70 45 78 70 72 29 3b 0d 0a  sParse.pExpr);..
2d480 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
2d490 20 20 69 66 28 20 21 73 50 61 72 73 65 2e 70 45    if( !sParse.pE
2d4a0 78 70 72 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  xpr ){..        
2d4b0 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79 74 65 20  const int nByte 
2d4c0 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  = sizeof(Fts5Exp
2d4d0 72 4e 6f 64 65 29 3b 0d 0a 20 20 20 20 20 20 20  rNode);..       
2d4e0 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20 3d 20 28   pNew->pRoot = (
2d4f0 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 73 71  Fts5ExprNode*)sq
2d500 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
2d510 65 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c 20  ero(&sParse.rc, 
2d520 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 20 20 20  nByte);..       
2d530 20 69 66 28 20 70 4e 65 77 2d 3e 70 52 6f 6f 74   if( pNew->pRoot
2d540 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70   ){..          p
2d550 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 62 45 6f 66  New->pRoot->bEof
2d560 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 7d   = 1;..        }
2d570 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a  ..      }else{..
2d580 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52          pNew->pR
2d590 6f 6f 74 20 3d 20 73 50 61 72 73 65 2e 70 45 78  oot = sParse.pEx
2d5a0 70 72 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  pr;..      }..  
2d5b0 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78      pNew->pIndex
2d5c0 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 70 4e 65   = 0;..      pNe
2d5d0 77 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f  w->pConfig = pCo
2d5e0 6e 66 69 67 3b 0d 0a 20 20 20 20 20 20 70 4e 65  nfig;..      pNe
2d5f0 77 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 20  w->apExprPhrase 
2d600 3d 20 73 50 61 72 73 65 2e 61 70 50 68 72 61 73  = sParse.apPhras
2d610 65 3b 0d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  e;..      pNew->
2d620 6e 50 68 72 61 73 65 20 3d 20 73 50 61 72 73 65  nPhrase = sParse
2d630 2e 6e 50 68 72 61 73 65 3b 0d 0a 20 20 20 20 20  .nPhrase;..     
2d640 20 73 50 61 72 73 65 2e 61 70 50 68 72 61 73 65   sParse.apPhrase
2d650 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20   = 0;..    }..  
2d660 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 73 71 6c 69  }else{..    sqli
2d670 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
2d680 46 72 65 65 28 73 50 61 72 73 65 2e 70 45 78 70  Free(sParse.pExp
2d690 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 73 71  r);..  }....  sq
2d6a0 6c 69 74 65 33 5f 66 72 65 65 28 73 50 61 72 73  lite3_free(sPars
2d6b0 65 2e 61 70 50 68 72 61 73 65 29 3b 0d 0a 20 20  e.apPhrase);..  
2d6c0 2a 70 7a 45 72 72 20 3d 20 73 50 61 72 73 65 2e  *pzErr = sParse.
2d6d0 7a 45 72 72 3b 0d 0a 20 20 72 65 74 75 72 6e 20  zErr;..  return 
2d6e0 73 50 61 72 73 65 2e 72 63 3b 0d 0a 7d 0d 0a 0d  sParse.rc;..}...
2d6f0 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65  ./*..** Free the
2d700 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2d710 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
2d720 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
2d730 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ent...*/..static
2d740 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
2d750 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28 46  5ParseNodeFree(F
2d760 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 29 7b  ts5ExprNode *p){
2d770 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 20  ..  if( p ){..  
2d780 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 66 6f    int i;..    fo
2d790 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69  r(i=0; i<p->nChi
2d7a0 6c 64 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20  ld; i++){..     
2d7b0 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
2d7c0 65 4e 6f 64 65 46 72 65 65 28 70 2d 3e 61 70 43  eNodeFree(p->apC
2d7d0 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20 20 20 20 7d  hild[i]);..    }
2d7e0 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
2d7f0 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72 65  5ParseNearsetFre
2d800 65 28 70 2d 3e 70 4e 65 61 72 29 3b 0d 0a 20 20  e(p->pNear);..  
2d810 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2d820 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a  );..  }..}..../*
2d830 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 65 78  ..** Free the ex
2d840 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20  pression object 
2d850 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
2d860 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f  ly argument...*/
2d870 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  ..static void sq
2d880 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 72 65  lite3Fts5ExprFre
2d890 65 28 46 74 73 35 45 78 70 72 20 2a 70 29 7b 0d  e(Fts5Expr *p){.
2d8a0 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 20 20  .  if( p ){..   
2d8b0 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
2d8c0 65 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70 52 6f  eNodeFree(p->pRo
2d8d0 6f 74 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65  ot);..    sqlite
2d8e0 33 5f 66 72 65 65 28 70 2d 3e 61 70 45 78 70 72  3_free(p->apExpr
2d8f0 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20 73 71  Phrase);..    sq
2d900 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a  lite3_free(p);..
2d910 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a    }..}..../*..**
2d920 20 41 72 67 75 6d 65 6e 74 20 70 54 65 72 6d 20   Argument pTerm 
2d930 6d 75 73 74 20 62 65 20 61 20 73 79 6e 6f 6e 79  must be a synony
2d940 6d 20 69 74 65 72 61 74 6f 72 2e 20 52 65 74 75  m iterator. Retu
2d950 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
2d960 6f 77 69 64 0d 0a 2a 2a 20 74 68 61 74 20 69 74  owid..** that it
2d970 20 70 6f 69 6e 74 73 20 74 6f 2e 0d 0a 2a 2f 0d   points to...*/.
2d980 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
2d990 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64  ExprSynonymRowid
2d9a0 28 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70  (Fts5ExprTerm *p
2d9b0 54 65 72 6d 2c 20 69 6e 74 20 62 44 65 73 63 2c  Term, int bDesc,
2d9c0 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0d 0a 20   int *pbEof){.. 
2d9d0 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0d 0a   i64 iRet = 0;..
2d9e0 20 20 69 6e 74 20 62 52 65 74 56 61 6c 69 64 20    int bRetValid 
2d9f0 3d 20 30 3b 0d 0a 20 20 46 74 73 35 45 78 70 72  = 0;..  Fts5Expr
2da00 54 65 72 6d 20 2a 70 3b 0d 0a 0d 0a 20 20 61 73  Term *p;....  as
2da10 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 53 79  sert( pTerm->pSy
2da20 6e 6f 6e 79 6d 20 29 3b 0d 0a 20 20 61 73 73 65  nonym );..  asse
2da30 72 74 28 20 62 44 65 73 63 3d 3d 30 20 7c 7c 20  rt( bDesc==0 || 
2da40 62 44 65 73 63 3d 3d 31 20 29 3b 0d 0a 20 20 66  bDesc==1 );..  f
2da50 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20 70  or(p=pTerm; p; p
2da60 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0d 0a  =p->pSynonym){..
2da70 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
2da80 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 2d  e3Fts5IterEof(p-
2da90 3e 70 49 74 65 72 29 20 29 7b 0d 0a 20 20 20 20  >pIter) ){..    
2daa0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70    i64 iRowid = p
2dab0 2d 3e 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b  ->pIter->iRowid;
2dac0 0d 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 74  ..      if( bRet
2dad0 56 61 6c 69 64 3d 3d 30 20 7c 7c 20 28 62 44 65  Valid==0 || (bDe
2dae0 73 63 21 3d 28 69 52 6f 77 69 64 3c 69 52 65 74  sc!=(iRowid<iRet
2daf0 29 29 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69  )) ){..        i
2db00 52 65 74 20 3d 20 69 52 6f 77 69 64 3b 0d 0a 20  Ret = iRowid;.. 
2db10 20 20 20 20 20 20 20 62 52 65 74 56 61 6c 69 64         bRetValid
2db20 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a   = 1;..      }..
2db30 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
2db40 69 66 28 20 70 62 45 6f 66 20 26 26 20 62 52 65  if( pbEof && bRe
2db50 74 56 61 6c 69 64 3d 3d 30 20 29 20 2a 70 62 45  tValid==0 ) *pbE
2db60 6f 66 20 3d 20 31 3b 0d 0a 20 20 72 65 74 75 72  of = 1;..  retur
2db70 6e 20 69 52 65 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  n iRet;..}..../*
2db80 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 54  ..** Argument pT
2db90 65 72 6d 20 6d 75 73 74 20 62 65 20 61 20 73 79  erm must be a sy
2dba0 6e 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e 0d  nonym iterator..
2dbb0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
2dbc0 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 4c  fts5ExprSynonymL
2dbd0 69 73 74 28 0d 0a 20 20 46 74 73 35 45 78 70 72  ist(..  Fts5Expr
2dbe0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 0d 0a 20  Term *pTerm, .. 
2dbf0 20 69 36 34 20 69 52 6f 77 69 64 2c 0d 0a 20 20   i64 iRowid,..  
2dc00 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2dc10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2dc20 2f 2a 20 55 73 65 20 74 68 69 73 20 62 75 66 66  /* Use this buff
2dc30 65 72 20 66 6f 72 20 73 70 61 63 65 20 69 66 20  er for space if 
2dc40 72 65 71 75 69 72 65 64 20 2a 2f 0d 0a 20 20 75  required */..  u
2dc50 38 20 2a 2a 70 61 2c 20 69 6e 74 20 2a 70 6e 0d  8 **pa, int *pn.
2dc60 0a 29 7b 0d 0a 20 20 46 74 73 35 50 6f 73 6c 69  .){..  Fts5Posli
2dc70 73 74 52 65 61 64 65 72 20 61 53 74 61 74 69 63  stReader aStatic
2dc80 5b 34 5d 3b 0d 0a 20 20 46 74 73 35 50 6f 73 6c  [4];..  Fts5Posl
2dc90 69 73 74 52 65 61 64 65 72 20 2a 61 49 74 65 72  istReader *aIter
2dca0 20 3d 20 61 53 74 61 74 69 63 3b 0d 0a 20 20 69   = aStatic;..  i
2dcb0 6e 74 20 6e 49 74 65 72 20 3d 20 30 3b 0d 0a 20  nt nIter = 0;.. 
2dcc0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 34 3b   int nAlloc = 4;
2dcd0 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
2dce0 49 54 45 5f 4f 4b 3b 0d 0a 20 20 46 74 73 35 45  ITE_OK;..  Fts5E
2dcf0 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a 0d 0a 20  xprTerm *p;.... 
2dd00 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
2dd10 70 53 79 6e 6f 6e 79 6d 20 29 3b 0d 0a 20 20 66  pSynonym );..  f
2dd20 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20 70  or(p=pTerm; p; p
2dd30 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0d 0a  =p->pSynonym){..
2dd40 20 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65      Fts5IndexIte
2dd50 72 20 2a 70 49 74 65 72 20 3d 20 70 2d 3e 70 49  r *pIter = p->pI
2dd60 74 65 72 3b 0d 0a 20 20 20 20 69 66 28 20 73 71  ter;..    if( sq
2dd70 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
2dd80 28 70 49 74 65 72 29 3d 3d 30 20 26 26 20 70 49  (pIter)==0 && pI
2dd90 74 65 72 2d 3e 69 52 6f 77 69 64 3d 3d 69 52 6f  ter->iRowid==iRo
2dda0 77 69 64 20 29 7b 0d 0a 20 20 20 20 20 20 69 66  wid ){..      if
2ddb0 28 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 3d 3d  ( pIter->nData==
2ddc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20  0 ) continue;.. 
2ddd0 20 20 20 20 20 69 66 28 20 6e 49 74 65 72 3d 3d       if( nIter==
2dde0 6e 41 6c 6c 6f 63 20 29 7b 0d 0a 20 20 20 20 20  nAlloc ){..     
2ddf0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2de00 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
2de10 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2de20 72 29 20 2a 20 6e 41 6c 6c 6f 63 20 2a 20 32 3b  r) * nAlloc * 2;
2de30 0d 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  ..        Fts5Po
2de40 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 4e 65  slistReader *aNe
2de50 77 20 3d 20 28 46 74 73 35 50 6f 73 6c 69 73 74  w = (Fts5Poslist
2de60 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33 5f  Reader*)sqlite3_
2de70 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
2de80 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ..        if( aN
2de90 65 77 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  ew==0 ){..      
2dea0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2deb0 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 20 20  NOMEM;..        
2dec0 20 20 67 6f 74 6f 20 73 79 6e 6f 6e 79 6d 5f 70    goto synonym_p
2ded0 6f 73 6c 69 73 74 5f 6f 75 74 3b 0d 0a 20 20 20  oslist_out;..   
2dee0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2def0 6d 65 6d 63 70 79 28 61 4e 65 77 2c 20 61 49 74  memcpy(aNew, aIt
2df00 65 72 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50  er, sizeof(Fts5P
2df10 6f 73 6c 69 73 74 52 65 61 64 65 72 29 20 2a 20  oslistReader) * 
2df20 6e 49 74 65 72 29 3b 0d 0a 20 20 20 20 20 20 20  nIter);..       
2df30 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63   nAlloc = nAlloc
2df40 2a 32 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  *2;..        if(
2df50 20 61 49 74 65 72 21 3d 61 53 74 61 74 69 63 20   aIter!=aStatic 
2df60 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61  ) sqlite3_free(a
2df70 49 74 65 72 29 3b 0d 0a 20 20 20 20 20 20 20 20  Iter);..        
2df80 61 49 74 65 72 20 3d 20 61 4e 65 77 3b 0d 0a 20  aIter = aNew;.. 
2df90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 71       }..      sq
2dfa0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
2dfb0 52 65 61 64 65 72 49 6e 69 74 28 70 49 74 65 72  ReaderInit(pIter
2dfc0 2d 3e 70 44 61 74 61 2c 20 70 49 74 65 72 2d 3e  ->pData, pIter->
2dfd0 6e 44 61 74 61 2c 20 26 61 49 74 65 72 5b 6e 49  nData, &aIter[nI
2dfe0 74 65 72 5d 29 3b 0d 0a 20 20 20 20 20 20 61 73  ter]);..      as
2dff0 73 65 72 74 28 20 61 49 74 65 72 5b 6e 49 74 65  sert( aIter[nIte
2e000 72 5d 2e 62 45 6f 66 3d 3d 30 20 29 3b 0d 0a 20  r].bEof==0 );.. 
2e010 20 20 20 20 20 6e 49 74 65 72 2b 2b 3b 0d 0a 20       nIter++;.. 
2e020 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69     }..  }....  i
2e030 66 28 20 6e 49 74 65 72 3d 3d 31 20 29 7b 0d 0a  f( nIter==1 ){..
2e040 20 20 20 20 2a 70 61 20 3d 20 28 75 38 2a 29 61      *pa = (u8*)a
2e050 49 74 65 72 5b 30 5d 2e 61 3b 0d 0a 20 20 20 20  Iter[0].a;..    
2e060 2a 70 6e 20 3d 20 61 49 74 65 72 5b 30 5d 2e 6e  *pn = aIter[0].n
2e070 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  ;..  }else{..   
2e080 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
2e090 65 72 20 77 72 69 74 65 72 20 3d 20 7b 30 7d 3b  er writer = {0};
2e0a0 0d 0a 20 20 20 20 69 36 34 20 69 50 72 65 76 20  ..    i64 iPrev 
2e0b0 3d 20 2d 31 3b 0d 0a 20 20 20 20 66 74 73 35 42  = -1;..    fts5B
2e0c0 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b  ufferZero(pBuf);
2e0d0 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  ..    while( 1 )
2e0e0 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0d  {..      int i;.
2e0f0 0a 20 20 20 20 20 20 69 36 34 20 69 4d 69 6e 20  .      i64 iMin 
2e100 3d 20 46 54 53 35 5f 4c 41 52 47 45 53 54 5f 49  = FTS5_LARGEST_I
2e110 4e 54 36 34 3b 0d 0a 20 20 20 20 20 20 66 6f 72  NT64;..      for
2e120 28 69 3d 30 3b 20 69 3c 6e 49 74 65 72 3b 20 69  (i=0; i<nIter; i
2e130 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  ++){..        if
2e140 28 20 61 49 74 65 72 5b 69 5d 2e 62 45 6f 66 3d  ( aIter[i].bEof=
2e150 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20  =0 ){..         
2e160 20 69 66 28 20 61 49 74 65 72 5b 69 5d 2e 69 50   if( aIter[i].iP
2e170 6f 73 3d 3d 69 50 72 65 76 20 29 7b 0d 0a 20 20  os==iPrev ){..  
2e180 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2e190 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
2e1a0 52 65 61 64 65 72 4e 65 78 74 28 26 61 49 74 65  ReaderNext(&aIte
2e1b0 72 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  r[i]) ) continue
2e1c0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
2e1d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 49            if( aI
2e1e0 74 65 72 5b 69 5d 2e 69 50 6f 73 3c 69 4d 69 6e  ter[i].iPos<iMin
2e1f0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ){..           
2e200 20 69 4d 69 6e 20 3d 20 61 49 74 65 72 5b 69 5d   iMin = aIter[i]
2e210 2e 69 50 6f 73 3b 0d 0a 20 20 20 20 20 20 20 20  .iPos;..        
2e220 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
2e230 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69        }..      i
2e240 66 28 20 69 4d 69 6e 3d 3d 46 54 53 35 5f 4c 41  f( iMin==FTS5_LA
2e250 52 47 45 53 54 5f 49 4e 54 36 34 20 7c 7c 20 72  RGEST_INT64 || r
2e260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
2e270 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 72 63 20  reak;..      rc 
2e280 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  = sqlite3Fts5Pos
2e290 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
2e2a0 28 70 42 75 66 2c 20 26 77 72 69 74 65 72 2c 20  (pBuf, &writer, 
2e2b0 69 4d 69 6e 29 3b 0d 0a 20 20 20 20 20 20 69 50  iMin);..      iP
2e2c0 72 65 76 20 3d 20 69 4d 69 6e 3b 0d 0a 20 20 20  rev = iMin;..   
2e2d0 20 7d 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
2e2e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
2e2f0 20 20 20 20 2a 70 61 20 3d 20 70 42 75 66 2d 3e      *pa = pBuf->
2e300 70 3b 0d 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20  p;..      *pn = 
2e310 70 42 75 66 2d 3e 6e 3b 0d 0a 20 20 20 20 7d 0d  pBuf->n;..    }.
2e320 0a 20 20 7d 0d 0a 0d 0a 20 73 79 6e 6f 6e 79 6d  .  }.... synonym
2e330 5f 70 6f 73 6c 69 73 74 5f 6f 75 74 3a 0d 0a 20  _poslist_out:.. 
2e340 20 69 66 28 20 61 49 74 65 72 21 3d 61 53 74 61   if( aIter!=aSta
2e350 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72  tic ) sqlite3_fr
2e360 65 65 28 61 49 74 65 72 29 3b 0d 0a 20 20 72 65  ee(aIter);..  re
2e370 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d  turn rc;..}.....
2e380 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 20 69 6e 64 69  ./*..** All indi
2e390 76 69 64 75 61 6c 20 74 65 72 6d 20 69 74 65 72  vidual term iter
2e3a0 61 74 6f 72 73 20 69 6e 20 70 50 68 72 61 73 65  ators in pPhrase
2e3b0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
2e3c0 74 6f 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0d  to be valid and.
2e3d0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
2e3e0 74 68 65 20 73 61 6d 65 20 72 6f 77 69 64 20 77  the same rowid w
2e3f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2e400 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69  n is called. Thi
2e410 73 20 66 75 6e 63 74 69 6f 6e 20 0d 0a 2a 2a 20  s function ..** 
2e420 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 63 75  checks if the cu
2e430 72 72 65 6e 74 20 72 6f 77 69 64 20 72 65 61 6c  rrent rowid real
2e440 6c 79 20 69 73 20 61 20 6d 61 74 63 68 2c 20 61  ly is a match, a
2e450 6e 64 20 69 66 20 73 6f 20 70 6f 70 75 6c 61 74  nd if so populat
2e460 65 73 0d 0a 2a 2a 20 74 68 65 20 70 50 68 72 61  es..** the pPhra
2e470 73 65 2d 3e 70 6f 73 6c 69 73 74 20 62 75 66 66  se->poslist buff
2e480 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  er accordingly. 
2e490 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  Output parameter
2e4a0 20 2a 70 62 4d 61 74 63 68 0d 0a 2a 2a 20 69 73   *pbMatch..** is
2e4b0 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
2e4c0 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  this is really a
2e4d0 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65   match, or false
2e4e0 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a 2a 2a 0d   otherwise...**.
2e4f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2e500 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 20   returned if an 
2e510 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72  error occurs, or
2e520 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2e530 20 63 6f 64 65 20 0d 0a 2a 2a 20 6f 74 68 65 72   code ..** other
2e540 77 69 73 65 2e 20 49 74 20 69 73 20 6e 6f 74 20  wise. It is not 
2e550 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
2e560 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
2e570 63 75 72 72 65 6e 74 20 72 6f 77 69 64 20 69 73  current rowid is
2e580 20 0d 0a 2a 2a 20 6e 6f 74 20 61 20 6d 61 74 63   ..** not a matc
2e590 68 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69  h...*/..static i
2e5a0 6e 74 20 66 74 73 35 45 78 70 72 50 68 72 61 73  nt fts5ExprPhras
2e5b0 65 49 73 4d 61 74 63 68 28 0d 0a 20 20 46 74 73  eIsMatch(..  Fts
2e5c0 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
2e5d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2e5e0 4e 6f 64 65 20 70 50 68 72 61 73 65 20 62 65 6c  Node pPhrase bel
2e5f0 6f 6e 67 73 20 74 6f 20 2a 2f 0d 0a 20 20 46 74  ongs to */..  Ft
2e600 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
2e610 68 72 61 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  hrase,        /*
2e620 20 50 68 72 61 73 65 20 6f 62 6a 65 63 74 20 74   Phrase object t
2e630 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0d  o initialize */.
2e640 0a 20 20 69 6e 74 20 2a 70 62 4d 61 74 63 68 20  .  int *pbMatch 
2e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e660 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
2e670 6f 20 74 72 75 65 20 69 66 20 72 65 61 6c 6c 79  o true if really
2e680 20 61 20 6d 61 74 63 68 20 2a 2f 0d 0a 29 7b 0d   a match */..){.
2e690 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72  .  Fts5PoslistWr
2e6a0 69 74 65 72 20 77 72 69 74 65 72 20 3d 20 7b 30  iter writer = {0
2e6b0 7d 3b 0d 0a 20 20 46 74 73 35 50 6f 73 6c 69 73  };..  Fts5Poslis
2e6c0 74 52 65 61 64 65 72 20 61 53 74 61 74 69 63 5b  tReader aStatic[
2e6d0 34 5d 3b 0d 0a 20 20 46 74 73 35 50 6f 73 6c 69  4];..  Fts5Posli
2e6e0 73 74 52 65 61 64 65 72 20 2a 61 49 74 65 72 20  stReader *aIter 
2e6f0 3d 20 61 53 74 61 74 69 63 3b 0d 0a 20 20 69 6e  = aStatic;..  in
2e700 74 20 69 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d  t i;..  int rc =
2e710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69   SQLITE_OK;..  i
2e720 6e 74 20 62 46 69 72 73 74 20 3d 20 70 50 68 72  nt bFirst = pPhr
2e730 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46  ase->aTerm[0].bF
2e740 69 72 73 74 3b 0d 0a 20 20 0d 0a 20 20 66 74 73  irst;..  ..  fts
2e750 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 68  5BufferZero(&pPh
2e760 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 29 3b 0d  rase->poslist);.
2e770 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  ...  /* If the a
2e780 53 74 61 74 69 63 5b 5d 20 61 72 72 61 79 20 69  Static[] array i
2e790 73 20 6e 6f 74 20 6c 61 72 67 65 20 65 6e 6f 75  s not large enou
2e7a0 67 68 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6c  gh, allocate a l
2e7b0 61 72 67 65 20 61 72 72 61 79 0d 0a 20 20 2a 2a  arge array..  **
2e7c0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d   using sqlite3_m
2e7d0 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73 20 61 70  alloc(). This ap
2e7e0 70 72 6f 61 63 68 20 63 6f 75 6c 64 20 62 65 20  proach could be 
2e7f0 69 6d 70 72 6f 76 65 64 20 75 70 6f 6e 2e 20 2a  improved upon. *
2e800 2f 0d 0a 20 20 69 66 28 20 70 50 68 72 61 73 65  /..  if( pPhrase
2e810 2d 3e 6e 54 65 72 6d 3e 41 72 72 61 79 53 69 7a  ->nTerm>ArraySiz
2e820 65 28 61 53 74 61 74 69 63 29 20 29 7b 0d 0a 20  e(aStatic) ){.. 
2e830 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2e840 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
2e850 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2e860 72 29 20 2a 20 70 50 68 72 61 73 65 2d 3e 6e 54  r) * pPhrase->nT
2e870 65 72 6d 3b 0d 0a 20 20 20 20 61 49 74 65 72 20  erm;..    aIter 
2e880 3d 20 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  = (Fts5PoslistRe
2e890 61 64 65 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ader*)sqlite3_ma
2e8a0 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0d 0a  lloc64(nByte);..
2e8b0 20 20 20 20 69 66 28 20 21 61 49 74 65 72 20 29      if( !aIter )
2e8c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e8d0 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 20 20 6d 65  OMEM;..  }..  me
2e8e0 6d 73 65 74 28 61 49 74 65 72 2c 20 30 2c 20 73  mset(aIter, 0, s
2e8f0 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73  izeof(Fts5Poslis
2e900 74 52 65 61 64 65 72 29 20 2a 20 70 50 68 72 61  tReader) * pPhra
2e910 73 65 2d 3e 6e 54 65 72 6d 29 3b 0d 0a 0d 0a 20  se->nTerm);.... 
2e920 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61   /* Initialize a
2e930 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72 20 66   term iterator f
2e940 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20  or each term in 
2e950 74 68 65 20 70 68 72 61 73 65 20 2a 2f 0d 0a 20  the phrase */.. 
2e960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72   for(i=0; i<pPhr
2e970 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  ase->nTerm; i++)
2e980 7b 0d 0a 20 20 20 20 46 74 73 35 45 78 70 72 54  {..    Fts5ExprT
2e990 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 50  erm *pTerm = &pP
2e9a0 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 5d 3b  hrase->aTerm[i];
2e9b0 0d 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b  ..    int n = 0;
2e9c0 0d 0a 20 20 20 20 69 6e 74 20 62 46 6c 61 67 20  ..    int bFlag 
2e9d0 3d 20 30 3b 0d 0a 20 20 20 20 75 38 20 2a 61 20  = 0;..    u8 *a 
2e9e0 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28 20 70 54  = 0;..    if( pT
2e9f0 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 7b  erm->pSynonym ){
2ea00 0d 0a 20 20 20 20 20 20 46 74 73 35 42 75 66 66  ..      Fts5Buff
2ea10 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20  er buf = {0, 0, 
2ea20 30 7d 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20  0};..      rc = 
2ea30 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 4c  fts5ExprSynonymL
2ea40 69 73 74 28 70 54 65 72 6d 2c 20 70 4e 6f 64 65  ist(pTerm, pNode
2ea50 2d 3e 69 52 6f 77 69 64 2c 20 26 62 75 66 2c 20  ->iRowid, &buf, 
2ea60 26 61 2c 20 26 6e 29 3b 0d 0a 20 20 20 20 20 20  &a, &n);..      
2ea70 69 66 28 20 72 63 20 29 7b 0d 0a 20 20 20 20 20  if( rc ){..     
2ea80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ea90 61 29 3b 0d 0a 20 20 20 20 20 20 20 20 67 6f 74  a);..        got
2eaa0 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0d 0a  o ismatch_out;..
2eab0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 69        }..      i
2eac0 66 28 20 61 3d 3d 62 75 66 2e 70 20 29 20 62 46  f( a==buf.p ) bF
2ead0 6c 61 67 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65  lag = 1;..    }e
2eae0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61 20 3d 20  lse{..      a = 
2eaf0 28 75 38 2a 29 70 54 65 72 6d 2d 3e 70 49 74 65  (u8*)pTerm->pIte
2eb00 72 2d 3e 70 44 61 74 61 3b 0d 0a 20 20 20 20 20  r->pData;..     
2eb10 20 6e 20 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65   n = pTerm->pIte
2eb20 72 2d 3e 6e 44 61 74 61 3b 0d 0a 20 20 20 20 7d  r->nData;..    }
2eb30 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
2eb40 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
2eb50 69 74 28 61 2c 20 6e 2c 20 26 61 49 74 65 72 5b  it(a, n, &aIter[
2eb60 69 5d 29 3b 0d 0a 20 20 20 20 61 49 74 65 72 5b  i]);..    aIter[
2eb70 69 5d 2e 62 46 6c 61 67 20 3d 20 28 75 38 29 62  i].bFlag = (u8)b
2eb80 46 6c 61 67 3b 0d 0a 20 20 20 20 69 66 28 20 61  Flag;..    if( a
2eb90 49 74 65 72 5b 69 5d 2e 62 45 6f 66 20 29 20 67  Iter[i].bEof ) g
2eba0 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b  oto ismatch_out;
2ebb0 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 77 68 69 6c 65  ..  }....  while
2ebc0 28 20 31 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20  ( 1 ){..    int 
2ebd0 62 4d 61 74 63 68 3b 0d 0a 20 20 20 20 69 36 34  bMatch;..    i64
2ebe0 20 69 50 6f 73 20 3d 20 61 49 74 65 72 5b 30 5d   iPos = aIter[0]
2ebf0 2e 69 50 6f 73 3b 0d 0a 20 20 20 20 64 6f 20 7b  .iPos;..    do {
2ec00 0d 0a 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d  ..      bMatch =
2ec10 20 31 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 69   1;..      for(i
2ec20 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e  =0; i<pPhrase->n
2ec30 54 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  Term; i++){..   
2ec40 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
2ec50 52 65 61 64 65 72 20 2a 70 50 6f 73 20 3d 20 26  Reader *pPos = &
2ec60 61 49 74 65 72 5b 69 5d 3b 0d 0a 20 20 20 20 20  aIter[i];..     
2ec70 20 20 20 69 36 34 20 69 41 64 6a 20 3d 20 69 50     i64 iAdj = iP
2ec80 6f 73 20 2b 20 69 3b 0d 0a 20 20 20 20 20 20 20  os + i;..       
2ec90 20 69 66 28 20 70 50 6f 73 2d 3e 69 50 6f 73 21   if( pPos->iPos!
2eca0 3d 69 41 64 6a 20 29 7b 0d 0a 20 20 20 20 20 20  =iAdj ){..      
2ecb0 20 20 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0d      bMatch = 0;.
2ecc0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2ecd0 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3c 69 41 64  ( pPos->iPos<iAd
2ece0 6a 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  j ){..          
2ecf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73    if( sqlite3Fts
2ed00 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
2ed10 78 74 28 70 50 6f 73 29 20 29 20 67 6f 74 6f 20  xt(pPos) ) goto 
2ed20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0d 0a 20 20  ismatch_out;..  
2ed30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2ed40 20 20 20 20 20 69 66 28 20 70 50 6f 73 2d 3e 69       if( pPos->i
2ed50 50 6f 73 3e 69 41 64 6a 20 29 20 69 50 6f 73 20  Pos>iAdj ) iPos 
2ed60 3d 20 70 50 6f 73 2d 3e 69 50 6f 73 2d 69 3b 0d  = pPos->iPos-i;.
2ed70 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2ed80 20 20 7d 0d 0a 20 20 20 20 7d 77 68 69 6c 65 28    }..    }while(
2ed90 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d   bMatch==0 );...
2eda0 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 70  .    /* Append p
2edb0 6f 73 69 74 69 6f 6e 20 69 50 6f 73 20 74 6f 20  osition iPos to 
2edc0 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0d 0a 20  the output */.. 
2edd0 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30     if( bFirst==0
2ede0 20 7c 7c 20 46 54 53 35 5f 50 4f 53 32 4f 46 46   || FTS5_POS2OFF
2edf0 53 45 54 28 69 50 6f 73 29 3d 3d 30 20 29 7b 0d  SET(iPos)==0 ){.
2ee00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2ee10 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72  te3Fts5PoslistWr
2ee20 69 74 65 72 41 70 70 65 6e 64 28 26 70 50 68 72  iterAppend(&pPhr
2ee30 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2c 20 26 77  ase->poslist, &w
2ee40 72 69 74 65 72 2c 20 69 50 6f 73 29 3b 0d 0a 20  riter, iPos);.. 
2ee50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ee60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 69 73  ITE_OK ) goto is
2ee70 6d 61 74 63 68 5f 6f 75 74 3b 0d 0a 20 20 20 20  match_out;..    
2ee80 7d 0d 0a 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30  }....    for(i=0
2ee90 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65  ; i<pPhrase->nTe
2eea0 72 6d 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20  rm; i++){..     
2eeb0 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
2eec0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
2eed0 74 28 26 61 49 74 65 72 5b 69 5d 29 20 29 20 67  t(&aIter[i]) ) g
2eee0 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b  oto ismatch_out;
2eef0 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
2ef00 20 69 73 6d 61 74 63 68 5f 6f 75 74 3a 0d 0a 20   ismatch_out:.. 
2ef10 20 2a 70 62 4d 61 74 63 68 20 3d 20 28 70 50 68   *pbMatch = (pPh
2ef20 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3e  rase->poslist.n>
2ef30 30 29 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0);..  for(i=0; 
2ef40 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  i<pPhrase->nTerm
2ef50 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28  ; i++){..    if(
2ef60 20 61 49 74 65 72 5b 69 5d 2e 62 46 6c 61 67 20   aIter[i].bFlag 
2ef70 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28  ) sqlite3_free((
2ef80 75 38 2a 29 61 49 74 65 72 5b 69 5d 2e 61 29 3b  u8*)aIter[i].a);
2ef90 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 61 49 74  ..  }..  if( aIt
2efa0 65 72 21 3d 61 53 74 61 74 69 63 20 29 20 73 71  er!=aStatic ) sq
2efb0 6c 69 74 65 33 5f 66 72 65 65 28 61 49 74 65 72  lite3_free(aIter
2efc0 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
2efd0 0d 0a 7d 0d 0a 0d 0a 74 79 70 65 64 65 66 20 73  ..}....typedef s
2efe0 74 72 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61 68  truct Fts5Lookah
2eff0 65 61 64 52 65 61 64 65 72 20 46 74 73 35 4c 6f  eadReader Fts5Lo
2f000 6f 6b 61 68 65 61 64 52 65 61 64 65 72 3b 0d 0a  okaheadReader;..
2f010 73 74 72 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61  struct Fts5Looka
2f020 68 65 61 64 52 65 61 64 65 72 20 7b 0d 0a 20 20  headReader {..  
2f030 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20 20 20  const u8 *a;    
2f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f050 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
2f060 6e 69 6e 67 20 70 6f 73 69 74 69 6f 6e 20 6c 69  ning position li
2f070 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 3b 20  st */..  int n; 
2f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f090 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2f0a0 20 6f 66 20 62 75 66 66 65 72 20 61 5b 5d 20 69   of buffer a[] i
2f0b0 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20 69 6e  n bytes */..  in
2f0c0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f0e0 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   Current offset 
2f0f0 69 6e 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  in position list
2f100 20 2a 2f 0d 0a 20 20 69 36 34 20 69 50 6f 73 3b   */..  i64 iPos;
2f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f120 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2f130 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0d 0a 20  t position */.. 
2f140 20 69 36 34 20 69 4c 6f 6f 6b 61 68 65 61 64 3b   i64 iLookahead;
2f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f160 20 2f 2a 20 4e 65 78 74 20 70 6f 73 69 74 69 6f   /* Next positio
2f170 6e 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 23 64 65 66  n */..};....#def
2f180 69 6e 65 20 46 54 53 35 5f 4c 4f 4f 4b 41 48 45  ine FTS5_LOOKAHE
2f190 41 44 5f 45 4f 46 20 28 28 28 69 36 34 29 31 29  AD_EOF (((i64)1)
2f1a0 20 3c 3c 20 36 32 29 0d 0a 0d 0a 73 74 61 74 69   << 62)....stati
2f1b0 63 20 69 6e 74 20 66 74 73 35 4c 6f 6f 6b 61 68  c int fts5Lookah
2f1c0 65 61 64 52 65 61 64 65 72 4e 65 78 74 28 46 74  eadReaderNext(Ft
2f1d0 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65  s5LookaheadReade
2f1e0 72 20 2a 70 29 7b 0d 0a 20 20 70 2d 3e 69 50 6f  r *p){..  p->iPo
2f1f0 73 20 3d 20 70 2d 3e 69 4c 6f 6f 6b 61 68 65 61  s = p->iLookahea
2f200 64 3b 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65  d;..  if( sqlite
2f210 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
2f220 36 34 28 70 2d 3e 61 2c 20 70 2d 3e 6e 2c 20 26  64(p->a, p->n, &
2f230 70 2d 3e 69 2c 20 26 70 2d 3e 69 4c 6f 6f 6b 61  p->i, &p->iLooka
2f240 68 65 61 64 29 20 29 7b 0d 0a 20 20 20 20 70 2d  head) ){..    p-
2f250 3e 69 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 46 54  >iLookahead = FT
2f260 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46  S5_LOOKAHEAD_EOF
2f270 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e  ;..  }..  return
2f280 20 28 70 2d 3e 69 50 6f 73 3d 3d 46 54 53 35 5f   (p->iPos==FTS5_
2f290 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46 29 3b 0d  LOOKAHEAD_EOF);.
2f2a0 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  .}....static int
2f2b0 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
2f2c0 61 64 65 72 49 6e 69 74 28 0d 0a 20 20 63 6f 6e  aderInit(..  con
2f2d0 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c  st u8 *a, int n,
2f2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f2f0 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 70  Buffer to read p
2f300 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 72 6f  osition list fro
2f310 6d 20 2a 2f 0d 0a 20 20 46 74 73 35 4c 6f 6f 6b  m */..  Fts5Look
2f320 61 68 65 61 64 52 65 61 64 65 72 20 2a 70 20 20  aheadReader *p  
2f330 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2f340 74 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 69 6e  tor object to in
2f350 69 74 69 61 6c 69 7a 65 20 2a 2f 0d 0a 29 7b 0d  itialize */..){.
2f360 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
2f370 73 69 7a 65 6f 66 28 46 74 73 35 4c 6f 6f 6b 61  sizeof(Fts5Looka
2f380 68 65 61 64 52 65 61 64 65 72 29 29 3b 0d 0a 20  headReader));.. 
2f390 20 70 2d 3e 61 20 3d 20 61 3b 0d 0a 20 20 70 2d   p->a = a;..  p-
2f3a0 3e 6e 20 3d 20 6e 3b 0d 0a 20 20 66 74 73 35 4c  >n = n;..  fts5L
2f3b0 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65  ookaheadReaderNe
2f3c0 78 74 28 70 29 3b 0d 0a 20 20 72 65 74 75 72 6e  xt(p);..  return
2f3d0 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
2f3e0 61 64 65 72 4e 65 78 74 28 70 29 3b 0d 0a 7d 0d  aderNext(p);..}.
2f3f0 0a 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ...typedef struc
2f400 74 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65  t Fts5NearTrimme
2f410 72 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65  r Fts5NearTrimme
2f420 72 3b 0d 0a 73 74 72 75 63 74 20 46 74 73 35 4e  r;..struct Fts5N
2f430 65 61 72 54 72 69 6d 6d 65 72 20 7b 0d 0a 20 20  earTrimmer {..  
2f440 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61  Fts5LookaheadRea
2f450 64 65 72 20 72 65 61 64 65 72 3b 20 20 20 20 20  der reader;     
2f460 2f 2a 20 49 6e 70 75 74 20 69 74 65 72 61 74 6f  /* Input iterato
2f470 72 20 2a 2f 0d 0a 20 20 46 74 73 35 50 6f 73 6c  r */..  Fts5Posl
2f480 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
2f490 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ;       /* Write
2f4a0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0d 0a 20 20  r context */..  
2f4b0 46 74 73 35 42 75 66 66 65 72 20 2a 70 4f 75 74  Fts5Buffer *pOut
2f4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f4d0 2f 2a 20 4f 75 74 70 75 74 20 70 6f 73 6c 69 73  /* Output poslis
2f4e0 74 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a  t */..};..../*..
2f4f0 2a 2a 20 54 68 65 20 6e 65 61 72 2d 73 65 74 20  ** The near-set 
2f500 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2f510 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
2f520 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ent contains mor
2f530 65 20 74 68 61 6e 0d 0a 2a 2a 20 6f 6e 65 20 70  e than..** one p
2f540 68 72 61 73 65 2e 20 41 6c 6c 20 70 68 72 61 73  hrase. All phras
2f550 65 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  es currently poi
2f560 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72  nt to the same r
2f570 6f 77 2e 20 54 68 65 0d 0a 2a 2a 20 46 74 73 35  ow. The..** Fts5
2f580 45 78 70 72 50 68 72 61 73 65 2e 70 6f 73 6c 69  ExprPhrase.posli
2f590 73 74 20 62 75 66 66 65 72 73 20 61 72 65 20 70  st buffers are p
2f5a0 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
2f5b0 6e 67 6c 79 2e 20 54 68 69 73 20 66 75 6e 63 74  ngly. This funct
2f5c0 69 6f 6e 0d 0a 2a 2a 20 74 65 73 74 73 20 69 66  ion..** tests if
2f5d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
2f5e0 20 63 6f 6e 74 61 69 6e 73 20 69 6e 73 74 61 6e   contains instan
2f5f0 63 65 73 20 6f 66 20 65 61 63 68 20 70 68 72 61  ces of each phra
2f600 73 65 20 73 75 66 66 69 63 69 65 6e 74 6c 79 0d  se sufficiently.
2f610 0a 2a 2a 20 63 6c 6f 73 65 20 74 6f 67 65 74 68  .** close togeth
2f620 65 72 20 74 6f 20 6d 65 65 74 20 74 68 65 20 4e  er to meet the N
2f630 45 41 52 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  EAR constraint. 
2f640 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  Non-zero is retu
2f650 72 6e 65 64 20 69 66 20 69 74 0d 0a 2a 2a 20 64  rned if it..** d
2f660 6f 65 73 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68  oes, or zero oth
2f670 65 72 77 69 73 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  erwise...**..** 
2f680 49 66 20 69 6e 2f 6f 75 74 20 70 61 72 61 6d 65  If in/out parame
2f690 74 65 72 20 28 2a 70 52 63 29 20 69 73 20 73 65  ter (*pRc) is se
2f6a0 74 20 74 6f 20 6f 74 68 65 72 20 74 68 61 6e 20  t to other than 
2f6b0 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
2f6c0 68 69 73 0d 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his..** function
2f6d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
2f6e0 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 72 2c 20 69  s a no-op. Or, i
2f6f0 66 20 61 6e 20 65 72 72 6f 72 20 28 65 2e 67 2e  f an error (e.g.
2f700 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 0d 0a   SQLITE_NOMEM)..
2f710 2a 2a 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ** occurs within
2f720 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 28   this function (
2f730 2a 70 52 63 29 20 69 73 20 73 65 74 20 61 63 63  *pRc) is set acc
2f740 6f 72 64 69 6e 67 6c 79 20 62 65 66 6f 72 65 20  ordingly before 
2f750 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2a 20 54  returning...** T
2f760 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2f770 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
2f780 62 6f 74 68 20 74 68 65 73 65 20 63 61 73 65 73  both these cases
2f790 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 49 66 20 6e 6f  ...** ..** If no
2f7a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
2f7b0 64 20 6e 6f 6e 2d 7a 65 72 6f 20 28 61 20 6d 61  d non-zero (a ma
2f7c0 74 63 68 29 20 69 73 20 72 65 74 75 72 6e 65 64  tch) is returned
2f7d0 2c 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  , the position-l
2f7e0 69 73 74 0d 0a 2a 2a 20 6f 66 20 65 61 63 68 20  ist..** of each 
2f7f0 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 69 73  phrase object is
2f800 20 65 64 69 74 65 64 20 74 6f 20 63 6f 6e 74 61   edited to conta
2f810 69 6e 20 6f 6e 6c 79 20 74 68 6f 73 65 20 65 6e  in only those en
2f820 74 72 69 65 73 20 74 68 61 74 0d 0a 2a 2a 20 6d  tries that..** m
2f830 65 65 74 20 74 68 65 20 63 6f 6e 73 74 72 61 69  eet the constrai
2f840 6e 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  nt before return
2f850 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ing...*/..static
2f860 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 65 61   int fts5ExprNea
2f870 72 49 73 4d 61 74 63 68 28 69 6e 74 20 2a 70 52  rIsMatch(int *pR
2f880 63 2c 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  c, Fts5ExprNears
2f890 65 74 20 2a 70 4e 65 61 72 29 7b 0d 0a 20 20 46  et *pNear){..  F
2f8a0 74 73 35 4e 65 61 72 54 72 69 6d 6d 65 72 20 61  ts5NearTrimmer a
2f8b0 53 74 61 74 69 63 5b 34 5d 3b 0d 0a 20 20 46 74  Static[4];..  Ft
2f8c0 73 35 4e 65 61 72 54 72 69 6d 6d 65 72 20 2a 61  s5NearTrimmer *a
2f8d0 20 3d 20 61 53 74 61 74 69 63 3b 0d 0a 20 20 46   = aStatic;..  F
2f8e0 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 2a  ts5ExprPhrase **
2f8f0 61 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72  apPhrase = pNear
2f900 2d 3e 61 70 50 68 72 61 73 65 3b 0d 0a 0d 0a 20  ->apPhrase;.... 
2f910 20 69 6e 74 20 69 3b 0d 0a 20 20 69 6e 74 20 72   int i;..  int r
2f920 63 20 3d 20 2a 70 52 63 3b 0d 0a 20 20 69 6e 74  c = *pRc;..  int
2f930 20 62 4d 61 74 63 68 3b 0d 0a 0d 0a 20 20 61 73   bMatch;....  as
2f940 73 65 72 74 28 20 70 4e 65 61 72 2d 3e 6e 50 68  sert( pNear->nPh
2f950 72 61 73 65 3e 31 20 29 3b 0d 0a 0d 0a 20 20 2f  rase>1 );....  /
2f960 2a 20 49 66 20 74 68 65 20 61 53 74 61 74 69 63  * If the aStatic
2f970 5b 5d 20 61 72 72 61 79 20 69 73 20 6e 6f 74 20  [] array is not 
2f980 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20 61 6c  large enough, al
2f990 6c 6f 63 61 74 65 20 61 20 6c 61 72 67 65 20 61  locate a large a
2f9a0 72 72 61 79 0d 0a 20 20 2a 2a 20 75 73 69 6e 67  rray..  ** using
2f9b0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2f9c0 29 2e 20 54 68 69 73 20 61 70 70 72 6f 61 63 68  ). This approach
2f9d0 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
2f9e0 65 64 20 75 70 6f 6e 2e 20 2a 2f 0d 0a 20 20 69  ed upon. */..  i
2f9f0 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73  f( pNear->nPhras
2fa00 65 3e 41 72 72 61 79 53 69 7a 65 28 61 53 74 61  e>ArraySize(aSta
2fa10 74 69 63 29 20 29 7b 0d 0a 20 20 20 20 73 71 6c  tic) ){..    sql
2fa20 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
2fa30 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 4e 65   = sizeof(Fts5Ne
2fa40 61 72 54 72 69 6d 6d 65 72 29 20 2a 20 70 4e 65  arTrimmer) * pNe
2fa50 61 72 2d 3e 6e 50 68 72 61 73 65 3b 0d 0a 20 20  ar->nPhrase;..  
2fa60 20 20 61 20 3d 20 28 46 74 73 35 4e 65 61 72 54    a = (Fts5NearT
2fa70 72 69 6d 6d 65 72 2a 29 73 71 6c 69 74 65 33 46  rimmer*)sqlite3F
2fa80 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
2fa90 63 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 7d 65  c, nByte);..  }e
2faa0 6c 73 65 7b 0d 0a 20 20 20 20 6d 65 6d 73 65 74  lse{..    memset
2fab0 28 61 53 74 61 74 69 63 2c 20 30 2c 20 73 69 7a  (aStatic, 0, siz
2fac0 65 6f 66 28 61 53 74 61 74 69 63 29 29 3b 0d 0a  eof(aStatic));..
2fad0 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
2fae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
2faf0 20 2a 70 52 63 20 3d 20 72 63 3b 0d 0a 20 20 20   *pRc = rc;..   
2fb00 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 7d 0d   return 0;..  }.
2fb10 0a 0d 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ...  /* Initiali
2fb20 7a 65 20 61 20 6c 6f 6f 6b 61 68 65 61 64 20 69  ze a lookahead i
2fb30 74 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  terator for each
2fb40 20 70 68 72 61 73 65 2e 20 41 66 74 65 72 20 70   phrase. After p
2fb50 61 73 73 69 6e 67 20 74 68 65 0d 0a 20 20 2a 2a  assing the..  **
2fb60 20 62 75 66 66 65 72 20 61 6e 64 20 62 75 66 66   buffer and buff
2fb70 65 72 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6c  er size to the l
2fb80 6f 6f 6b 61 73 69 64 65 2d 72 65 61 64 65 72 20  ookaside-reader 
2fb90 69 6e 69 74 20 66 75 6e 63 74 69 6f 6e 2c 20 7a  init function, z
2fba0 65 72 6f 0d 0a 20 20 2a 2a 20 74 68 65 20 70 68  ero..  ** the ph
2fbb0 72 61 73 65 20 70 6f 73 6c 69 73 74 20 62 75 66  rase poslist buf
2fbc0 66 65 72 2e 20 54 68 65 20 6e 65 77 20 70 6f 73  fer. The new pos
2fbd0 6c 69 73 74 20 66 6f 72 20 74 68 65 20 70 68 72  list for the phr
2fbe0 61 73 65 20 28 63 6f 6e 74 61 69 6e 69 6e 67 0d  ase (containing.
2fbf0 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 65  .  ** the same e
2fc00 6e 74 72 69 65 73 20 61 73 20 74 68 65 20 6f 72  ntries as the or
2fc10 69 67 69 6e 61 6c 20 77 69 74 68 20 73 6f 6d 65  iginal with some
2fc20 20 65 6e 74 72 69 65 73 20 72 65 6d 6f 76 65 64   entries removed
2fc30 20 6f 6e 20 61 63 63 6f 75 6e 74 20 0d 0a 20 20   on account ..  
2fc40 2a 2a 20 6f 66 20 74 68 65 20 4e 45 41 52 20 63  ** of the NEAR c
2fc50 6f 6e 73 74 72 61 69 6e 74 29 20 69 73 20 77 72  onstraint) is wr
2fc60 69 74 74 65 6e 20 6f 76 65 72 20 74 68 65 20 6f  itten over the o
2fc70 72 69 67 69 6e 61 6c 20 65 76 65 6e 20 61 73 20  riginal even as 
2fc80 69 74 20 69 73 0d 0a 20 20 2a 2a 20 62 65 69 6e  it is..  ** bein
2fc90 67 20 72 65 61 64 2e 20 54 68 69 73 20 69 73 20  g read. This is 
2fca0 73 61 66 65 20 61 73 20 74 68 65 20 65 6e 74 72  safe as the entr
2fcb0 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
2fcc0 70 6f 73 6c 69 73 74 20 61 72 65 20 61 0d 0a 20  poslist are a.. 
2fcd0 20 2a 2a 20 73 75 62 73 65 74 20 6f 66 20 74 68   ** subset of th
2fce0 65 20 6f 6c 64 2c 20 73 6f 20 69 74 20 69 73 20  e old, so it is 
2fcf0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
2fd00 20 64 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   data yet to be 
2fd10 72 65 61 64 20 74 6f 0d 0a 20 20 2a 2a 20 62 65  read to..  ** be
2fd20 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
2fd30 2f 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  /..  for(i=0; i<
2fd40 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20  pNear->nPhrase; 
2fd50 69 2b 2b 29 7b 0d 0a 20 20 20 20 46 74 73 35 42  i++){..    Fts5B
2fd60 75 66 66 65 72 20 2a 70 50 6f 73 6c 69 73 74 20  uffer *pPoslist 
2fd70 3d 20 26 61 70 50 68 72 61 73 65 5b 69 5d 2d 3e  = &apPhrase[i]->
2fd80 70 6f 73 6c 69 73 74 3b 0d 0a 20 20 20 20 66 74  poslist;..    ft
2fd90 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65  s5LookaheadReade
2fda0 72 49 6e 69 74 28 70 50 6f 73 6c 69 73 74 2d 3e  rInit(pPoslist->
2fdb0 70 2c 20 70 50 6f 73 6c 69 73 74 2d 3e 6e 2c 20  p, pPoslist->n, 
2fdc0 26 61 5b 69 5d 2e 72 65 61 64 65 72 29 3b 0d 0a  &a[i].reader);..
2fdd0 20 20 20 20 70 50 6f 73 6c 69 73 74 2d 3e 6e 20      pPoslist->n 
2fde0 3d 20 30 3b 0d 0a 20 20 20 20 61 5b 69 5d 2e 70  = 0;..    a[i].p
2fdf0 4f 75 74 20 3d 20 70 50 6f 73 6c 69 73 74 3b 0d  Out = pPoslist;.
2fe00 0a 20 20 7d 0d 0a 0d 0a 20 20 77 68 69 6c 65 28  .  }....  while(
2fe10 20 31 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 69   1 ){..    int i
2fe20 41 64 76 3b 0d 0a 20 20 20 20 69 36 34 20 69 4d  Adv;..    i64 iM
2fe30 69 6e 3b 0d 0a 20 20 20 20 69 36 34 20 69 4d 61  in;..    i64 iMa
2fe40 78 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 54 68 69  x;....    /* Thi
2fe50 73 20 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73  s block advances
2fe60 20 74 68 65 20 70 68 72 61 73 65 20 69 74 65 72   the phrase iter
2fe70 61 74 6f 72 73 20 75 6e 74 69 6c 20 74 68 65 79  ators until they
2fe80 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 65 74 20   point to a set 
2fe90 6f 66 0d 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69  of..    ** entri
2fea0 65 73 20 74 68 61 74 20 74 6f 67 65 74 68 65 72  es that together
2feb0 20 63 6f 6d 70 72 69 73 65 20 61 20 6d 61 74 63   comprise a matc
2fec0 68 2e 20 20 2a 2f 0d 0a 20 20 20 20 69 4d 61 78  h.  */..    iMax
2fed0 20 3d 20 61 5b 30 5d 2e 72 65 61 64 65 72 2e 69   = a[0].reader.i
2fee0 50 6f 73 3b 0d 0a 20 20 20 20 64 6f 20 7b 0d 0a  Pos;..    do {..
2fef0 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31        bMatch = 1
2ff00 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ;..      for(i=0
2ff10 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61  ; i<pNear->nPhra
2ff20 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20  se; i++){..     
2ff30 20 20 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64     Fts5Lookahead
2ff40 52 65 61 64 65 72 20 2a 70 50 6f 73 20 3d 20 26  Reader *pPos = &
2ff50 61 5b 69 5d 2e 72 65 61 64 65 72 3b 0d 0a 20 20  a[i].reader;..  
2ff60 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 4d 61        iMin = iMa
2ff70 78 20 2d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72  x - pNear->apPhr
2ff80 61 73 65 5b 69 5d 2d 3e 6e 54 65 72 6d 20 2d 20  ase[i]->nTerm - 
2ff90 70 4e 65 61 72 2d 3e 6e 4e 65 61 72 3b 0d 0a 20  pNear->nNear;.. 
2ffa0 20 20 20 20 20 20 20 69 66 28 20 70 50 6f 73 2d         if( pPos-
2ffb0 3e 69 50 6f 73 3c 69 4d 69 6e 20 7c 7c 20 70 50  >iPos<iMin || pP
2ffc0 6f 73 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29 7b  os->iPos>iMax ){
2ffd0 0d 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74  ..          bMat
2ffe0 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20  ch = 0;..       
2fff0 20 20 20 77 68 69 6c 65 28 20 70 50 6f 73 2d 3e     while( pPos->
30000 69 50 6f 73 3c 69 4d 69 6e 20 29 7b 0d 0a 20 20  iPos<iMin ){..  
30010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74            if( ft
30020 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65  s5LookaheadReade
30030 72 4e 65 78 74 28 70 50 6f 73 29 20 29 20 67 6f  rNext(pPos) ) go
30040 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0d  to ismatch_out;.
30050 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
30060 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6f 73          if( pPos
30070 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29 20 69 4d  ->iPos>iMax ) iM
30080 61 78 20 3d 20 70 50 6f 73 2d 3e 69 50 6f 73 3b  ax = pPos->iPos;
30090 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
300a0 20 20 20 7d 0d 0a 20 20 20 20 7d 77 68 69 6c 65     }..    }while
300b0 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a  ( bMatch==0 );..
300c0 0d 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
300d0 65 6e 74 72 79 20 74 6f 20 65 61 63 68 20 6f 75  entry to each ou
300e0 74 70 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  tput position li
300f0 73 74 20 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 69  st */..    for(i
30100 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68  =0; i<pNear->nPh
30110 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  rase; i++){..   
30120 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20 61 5b     i64 iPos = a[
30130 69 5d 2e 72 65 61 64 65 72 2e 69 50 6f 73 3b 0d  i].reader.iPos;.
30140 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69  .      Fts5Posli
30150 73 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  stWriter *pWrite
30160 72 20 3d 20 26 61 5b 69 5d 2e 77 72 69 74 65 72  r = &a[i].writer
30170 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69  ;..      if( a[i
30180 5d 2e 70 4f 75 74 2d 3e 6e 3d 3d 30 20 7c 7c 20  ].pOut->n==0 || 
30190 69 50 6f 73 21 3d 70 57 72 69 74 65 72 2d 3e 69  iPos!=pWriter->i
301a0 50 72 65 76 20 29 7b 0d 0a 20 20 20 20 20 20 20  Prev ){..       
301b0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
301c0 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28  istWriterAppend(
301d0 61 5b 69 5d 2e 70 4f 75 74 2c 20 70 57 72 69 74  a[i].pOut, pWrit
301e0 65 72 2c 20 69 50 6f 73 29 3b 0d 0a 20 20 20 20  er, iPos);..    
301f0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
30200 20 20 69 41 64 76 20 3d 20 30 3b 0d 0a 20 20 20    iAdv = 0;..   
30210 20 69 4d 69 6e 20 3d 20 61 5b 30 5d 2e 72 65 61   iMin = a[0].rea
30220 64 65 72 2e 69 4c 6f 6f 6b 61 68 65 61 64 3b 0d  der.iLookahead;.
30230 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
30240 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20  pNear->nPhrase; 
30250 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 69 66 28  i++){..      if(
30260 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c 6f   a[i].reader.iLo
30270 6f 6b 61 68 65 61 64 20 3c 20 69 4d 69 6e 20 29  okahead < iMin )
30280 7b 0d 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20  {..        iMin 
30290 3d 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c  = a[i].reader.iL
302a0 6f 6f 6b 61 68 65 61 64 3b 0d 0a 20 20 20 20 20  ookahead;..     
302b0 20 20 20 69 41 64 76 20 3d 20 69 3b 0d 0a 20 20     iAdv = i;..  
302c0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
302d0 20 20 69 66 28 20 66 74 73 35 4c 6f 6f 6b 61 68    if( fts5Lookah
302e0 65 61 64 52 65 61 64 65 72 4e 65 78 74 28 26 61  eadReaderNext(&a
302f0 5b 69 41 64 76 5d 2e 72 65 61 64 65 72 29 20 29  [iAdv].reader) )
30300 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75   goto ismatch_ou
30310 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 73 6d  t;..  }....  ism
30320 61 74 63 68 5f 6f 75 74 3a 20 7b 0d 0a 20 20 20  atch_out: {..   
30330 20 69 6e 74 20 62 52 65 74 20 3d 20 61 5b 30 5d   int bRet = a[0]
30340 2e 70 4f 75 74 2d 3e 6e 3e 30 3b 0d 0a 20 20 20  .pOut->n>0;..   
30350 20 2a 70 52 63 20 3d 20 72 63 3b 0d 0a 20 20 20   *pRc = rc;..   
30360 20 69 66 28 20 61 21 3d 61 53 74 61 74 69 63 20   if( a!=aStatic 
30370 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61  ) sqlite3_free(a
30380 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 62  );..    return b
30390 52 65 74 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a  Ret;..  }..}....
303a0 2f 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69  /*..** Advance i
303b0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 75 6e  terator pIter un
303c0 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
303d0 20 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74   a value equal t
303e0 6f 20 6f 72 20 6c 61 73 74 65 72 0d 0a 2a 2a 20  o or laster..** 
303f0 74 68 61 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  than the initial
30400 20 76 61 6c 75 65 20 6f 66 20 2a 70 69 4c 61 73   value of *piLas
30410 74 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73  t. If this means
30420 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
30430 69 6e 74 73 0d 0a 2a 2a 20 74 6f 20 61 20 76 61  ints..** to a va
30440 6c 75 65 20 6c 61 73 74 65 72 20 74 68 61 6e 20  lue laster than 
30450 2a 70 69 4c 61 73 74 2c 20 75 70 64 61 74 65 20  *piLast, update 
30460 2a 70 69 4c 61 73 74 20 74 6f 20 74 68 65 20 6e  *piLast to the n
30470 65 77 20 6c 61 73 74 65 73 74 20 76 61 6c 75 65  ew lastest value
30480 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 74 68 65  ...**..** If the
30490 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65   iterator reache
304a0 73 20 45 4f 46 2c 20 73 65 74 20 2a 70 62 45 6f  s EOF, set *pbEo
304b0 66 20 74 6f 20 74 72 75 65 20 62 65 66 6f 72 65  f to true before
304c0 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 66 0d 0a   returning. If..
304d0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
304e0 72 73 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20  rs, set *pRc to 
304f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  an error code. I
30500 66 20 65 69 74 68 65 72 20 2a 70 62 45 6f 66 20  f either *pbEof 
30510 6f 72 20 2a 70 52 63 0d 0a 2a 2a 20 61 72 65 20  or *pRc..** are 
30520 73 65 74 2c 20 72 65 74 75 72 6e 20 61 20 6e 6f  set, return a no
30530 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 20 4f 74  n-zero value. Ot
30540 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
30550 7a 65 72 6f 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  zero...*/..stati
30560 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 41 64  c int fts5ExprAd
30570 76 61 6e 63 65 74 6f 28 0d 0a 20 20 46 74 73 35  vanceto(..  Fts5
30580 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
30590 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
305a0 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
305b0 63 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 44 65  ce */..  int bDe
305c0 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
305d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
305e0 20 69 66 20 69 74 65 72 61 74 6f 72 20 69 73 20   if iterator is 
305f0 22 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0d  "rowid DESC" */.
30600 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 2c 20  .  i64 *piLast, 
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30620 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 61     /* IN/OUT: La
30630 73 74 65 73 74 20 72 6f 77 69 64 20 73 65 65 6e  stest rowid seen
30640 20 73 6f 20 66 61 72 20 2a 2f 0d 0a 20 20 69 6e   so far */..  in
30650 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
30660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30670 20 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65   OUT: Error code
30680 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 62 45 6f   */..  int *pbEo
30690 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
306a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
306b0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 45 4f  et to true if EO
306c0 46 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 36 34 20  F */..){..  i64 
306d0 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74 3b  iLast = *piLast;
306e0 0d 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0d  ..  i64 iRowid;.
306f0 0a 0d 0a 20 20 69 52 6f 77 69 64 20 3d 20 70 49  ...  iRowid = pI
30700 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20  ter->iRowid;..  
30710 69 66 28 20 28 62 44 65 73 63 3d 3d 30 20 26 26  if( (bDesc==0 &&
30720 20 69 4c 61 73 74 3e 69 52 6f 77 69 64 29 20 7c   iLast>iRowid) |
30730 7c 20 28 62 44 65 73 63 20 26 26 20 69 4c 61 73  | (bDesc && iLas
30740 74 3c 69 52 6f 77 69 64 29 20 29 7b 0d 0a 20 20  t<iRowid) ){..  
30750 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
30760 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
30770 6f 6d 28 70 49 74 65 72 2c 20 69 4c 61 73 74 29  om(pIter, iLast)
30780 3b 0d 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  ;..    if( rc ||
30790 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
307a0 45 6f 66 28 70 49 74 65 72 29 20 29 7b 0d 0a 20  Eof(pIter) ){.. 
307b0 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0d       *pRc = rc;.
307c0 0a 20 20 20 20 20 20 2a 70 62 45 6f 66 20 3d 20  .      *pbEof = 
307d0 31 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1;..      return
307e0 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20   1;..    }..    
307f0 69 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e  iRowid = pIter->
30800 69 52 6f 77 69 64 3b 0d 0a 20 20 20 20 61 73 73  iRowid;..    ass
30810 65 72 74 28 20 28 62 44 65 73 63 3d 3d 30 20 26  ert( (bDesc==0 &
30820 26 20 69 52 6f 77 69 64 3e 3d 69 4c 61 73 74 29  & iRowid>=iLast)
30830 20 7c 7c 20 28 62 44 65 73 63 3d 3d 31 20 26 26   || (bDesc==1 &&
30840 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 29 20   iRowid<=iLast) 
30850 29 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70 69 4c 61  );..  }..  *piLa
30860 73 74 20 3d 20 69 52 6f 77 69 64 3b 0d 0a 0d 0a  st = iRowid;....
30870 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a    return 0;..}..
30880 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
30890 35 45 78 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61  5ExprSynonymAdva
308a0 6e 63 65 74 6f 28 0d 0a 20 20 46 74 73 35 45 78  nceto(..  Fts5Ex
308b0 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  prTerm *pTerm,  
308c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
308d0 6d 20 69 74 65 72 61 74 6f 72 20 74 6f 20 61 64  m iterator to ad
308e0 76 61 6e 63 65 20 2a 2f 0d 0a 20 20 69 6e 74 20  vance */..  int 
308f0 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
30900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30910 72 75 65 20 69 66 20 69 74 65 72 61 74 6f 72 20  rue if iterator 
30920 69 73 20 22 72 6f 77 69 64 20 44 45 53 43 22 20  is "rowid DESC" 
30930 2a 2f 0d 0a 20 20 69 36 34 20 2a 70 69 4c 61 73  */..  i64 *piLas
30940 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
30950 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
30960 20 4c 61 73 74 65 73 74 20 72 6f 77 69 64 20 73   Lastest rowid s
30970 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0d 0a 20  een so far */.. 
30980 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20   int *pRc       
30990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309a0 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 63   /* OUT: Error c
309b0 6f 64 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e  ode */..){..  in
309c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
309d0 3b 0d 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d  ;..  i64 iLast =
309e0 20 2a 70 69 4c 61 73 74 3b 0d 0a 20 20 46 74 73   *piLast;..  Fts
309f0 35 45 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a 20  5ExprTerm *p;.. 
30a00 20 69 6e 74 20 62 45 6f 66 20 3d 20 30 3b 0d 0a   int bEof = 0;..
30a10 0d 0a 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b  ..  for(p=pTerm;
30a20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
30a30 26 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e  & p; p=p->pSynon
30a40 79 6d 29 7b 0d 0a 20 20 20 20 69 66 28 20 73 71  ym){..    if( sq
30a50 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
30a60 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20 29 7b  (p->pIter)==0 ){
30a70 0d 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  ..      i64 iRow
30a80 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69  id = p->pIter->i
30a90 52 6f 77 69 64 3b 0d 0a 20 20 20 20 20 20 69 66  Rowid;..      if
30aa0 28 20 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69  ( (bDesc==0 && i
30ab0 4c 61 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20  Last>iRowid) || 
30ac0 28 62 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c  (bDesc && iLast<
30ad0 69 52 6f 77 69 64 29 20 29 7b 0d 0a 20 20 20 20  iRowid) ){..    
30ae0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30af0 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d  Fts5IterNextFrom
30b00 28 70 2d 3e 70 49 74 65 72 2c 20 69 4c 61 73 74  (p->pIter, iLast
30b10 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
30b20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28   }..  }....  if(
30b30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30b40 7b 0d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  {..    *pRc = rc
30b50 3b 0d 0a 20 20 20 20 62 45 6f 66 20 3d 20 31 3b  ;..    bEof = 1;
30b60 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20  ..  }else{..    
30b70 2a 70 69 4c 61 73 74 20 3d 20 66 74 73 35 45 78  *piLast = fts5Ex
30b80 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70  prSynonymRowid(p
30b90 54 65 72 6d 2c 20 62 44 65 73 63 2c 20 26 62 45  Term, bDesc, &bE
30ba0 6f 66 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74  of);..  }..  ret
30bb0 75 72 6e 20 62 45 6f 66 3b 0d 0a 7d 0d 0a 0d 0a  urn bEof;..}....
30bc0 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
30bd0 35 45 78 70 72 4e 65 61 72 54 65 73 74 28 0d 0a  5ExprNearTest(..
30be0 20 20 69 6e 74 20 2a 70 52 63 2c 0d 0a 20 20 46    int *pRc,..  F
30bf0 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ts5Expr *pExpr, 
30c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30c10 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 68 61  * Expression tha
30c20 74 20 70 4e 65 61 72 20 69 73 20 61 20 70 61 72  t pNear is a par
30c30 74 20 6f 66 20 2a 2f 0d 0a 20 20 46 74 73 35 45  t of */..  Fts5E
30c40 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20  xprNode *pNode  
30c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
30c60 65 20 22 4e 45 41 52 22 20 6e 6f 64 65 20 28 46  e "NEAR" node (F
30c70 54 53 35 5f 53 54 52 49 4e 47 29 20 2a 2f 0d 0a  TS5_STRING) */..
30c80 29 7b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 65  ){..  Fts5ExprNe
30c90 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70  arset *pNear = p
30ca0 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d 0a 20 20  Node->pNear;..  
30cb0 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0d 0a  int rc = *pRc;..
30cc0 0d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ..  if( pExpr->p
30cd0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
30ce0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c  =FTS5_DETAIL_FUL
30cf0 4c 20 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78  L ){..    Fts5Ex
30d00 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0d 0a  prTerm *pTerm;..
30d10 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
30d20 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e  se *pPhrase = pN
30d30 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
30d40 3b 0d 0a 20 20 20 20 70 50 68 72 61 73 65 2d 3e  ;..    pPhrase->
30d50 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0d 0a  poslist.n = 0;..
30d60 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 26 70      for(pTerm=&p
30d70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d  Phrase->aTerm[0]
30d80 3b 20 70 54 65 72 6d 3b 20 70 54 65 72 6d 3d 70  ; pTerm; pTerm=p
30d90 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b  Term->pSynonym){
30da0 0d 0a 20 20 20 20 20 20 46 74 73 35 49 6e 64 65  ..      Fts5Inde
30db0 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 70  xIter *pIter = p
30dc0 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0d 0a 20 20  Term->pIter;..  
30dd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
30de0 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65 72  ts5IterEof(pIter
30df0 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20  )==0 ){..       
30e00 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77   if( pIter->iRow
30e10 69 64 3d 3d 70 4e 6f 64 65 2d 3e 69 52 6f 77 69  id==pNode->iRowi
30e20 64 20 26 26 20 70 49 74 65 72 2d 3e 6e 44 61 74  d && pIter->nDat
30e30 61 3e 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  a>0 ){..        
30e40 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69    pPhrase->posli
30e50 73 74 2e 6e 20 3d 20 31 3b 0d 0a 20 20 20 20 20  st.n = 1;..     
30e60 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
30e70 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
30e80 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73   pPhrase->poslis
30e90 74 2e 6e 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a  t.n;..  }else{..
30ea0 20 20 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20      int i;....  
30eb0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
30ec0 65 61 63 68 20 70 68 72 61 73 65 20 69 6e 20 74  each phrase in t
30ed0 68 65 20 6e 65 61 72 73 65 74 20 6d 61 74 63 68  he nearset match
30ee0 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  es the current r
30ef0 6f 77 2e 0d 0a 20 20 20 20 2a 2a 20 50 6f 70 75  ow...    ** Popu
30f00 6c 61 74 65 20 74 68 65 20 70 50 68 72 61 73 65  late the pPhrase
30f10 2d 3e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72  ->poslist buffer
30f20 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  s at the same ti
30f30 6d 65 2e 20 49 66 20 61 6e 79 0d 0a 20 20 20 20  me. If any..    
30f40 2a 2a 20 70 68 72 61 73 65 20 69 73 20 6e 6f 74  ** phrase is not
30f50 20 61 20 6d 61 74 63 68 2c 20 62 72 65 61 6b 20   a match, break 
30f60 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
30f70 65 61 72 6c 79 2e 20 20 2a 2f 0d 0a 20 20 20 20  early.  */..    
30f80 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
30f90 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4e 65 61  ITE_OK && i<pNea
30fa0 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29  r->nPhrase; i++)
30fb0 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  {..      Fts5Exp
30fc0 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
30fd0 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
30fe0 73 65 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 69 66  se[i];..      if
30ff0 28 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  ( pPhrase->nTerm
31000 3e 31 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 61  >1 || pPhrase->a
31010 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d  Term[0].pSynonym
31020 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65   ..       || pNe
31030 61 72 2d 3e 70 43 6f 6c 73 65 74 20 7c 7c 20 70  ar->pColset || p
31040 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d  Phrase->aTerm[0]
31050 2e 62 46 69 72 73 74 0d 0a 20 20 20 20 20 20 29  .bFirst..      )
31060 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  {..        int b
31070 4d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20  Match = 0;..    
31080 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
31090 72 50 68 72 61 73 65 49 73 4d 61 74 63 68 28 70  rPhraseIsMatch(p
310a0 4e 6f 64 65 2c 20 70 50 68 72 61 73 65 2c 20 26  Node, pPhrase, &
310b0 62 4d 61 74 63 68 29 3b 0d 0a 20 20 20 20 20 20  bMatch);..      
310c0 20 20 69 66 28 20 62 4d 61 74 63 68 3d 3d 30 20    if( bMatch==0 
310d0 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20  ) break;..      
310e0 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20  }else{..        
310f0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
31100 49 74 65 72 20 3d 20 70 50 68 72 61 73 65 2d 3e  Iter = pPhrase->
31110 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 3b 0d  aTerm[0].pIter;.
31120 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
31130 66 65 72 53 65 74 28 26 72 63 2c 20 26 70 50 68  ferSet(&rc, &pPh
31140 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2c 20 70  rase->poslist, p
31150 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 70 49 74  Iter->nData, pIt
31160 65 72 2d 3e 70 44 61 74 61 29 3b 0d 0a 20 20 20  er->pData);..   
31170 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
31180 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0d 0a 20     *pRc = rc;.. 
31190 20 20 20 69 66 28 20 69 3d 3d 70 4e 65 61 72 2d     if( i==pNear-
311a0 3e 6e 50 68 72 61 73 65 20 26 26 20 28 69 3d 3d  >nPhrase && (i==
311b0 31 20 7c 7c 20 66 74 73 35 45 78 70 72 4e 65 61  1 || fts5ExprNea
311c0 72 49 73 4d 61 74 63 68 28 70 52 63 2c 20 70 4e  rIsMatch(pRc, pN
311d0 65 61 72 29 29 20 29 7b 0d 0a 20 20 20 20 20 20  ear)) ){..      
311e0 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20 7d  return 1;..    }
311f0 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d  ..    return 0;.
31200 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d  .  }..}....../*.
31210 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
31220 6c 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72  ll term iterator
31230 73 20 69 6e 20 74 68 65 20 70 4e 65 61 72 20 6f  s in the pNear o
31240 62 6a 65 63 74 2e 20 49 66 20 61 6e 79 20 74 65  bject. If any te
31250 72 6d 20 69 73 20 66 6f 75 6e 64 0d 0a 2a 2a 20  rm is found..** 
31260 74 6f 20 6d 61 74 63 68 20 6e 6f 20 64 6f 63 75  to match no docu
31270 6d 65 6e 74 73 20 61 74 20 61 6c 6c 2c 20 72 65  ments at all, re
31280 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
31290 20 77 69 74 68 6f 75 74 20 69 6e 69 74 69 61 6c   without initial
312a0 69 7a 69 6e 67 20 61 6e 79 0d 0a 2a 2a 20 66 75  izing any..** fu
312b0 72 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e  rther iterators.
312c0 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e 20 65  ..**..** If an e
312d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
312e0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
312f0 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
31300 69 73 65 2c 20 72 65 74 75 72 6e 0d 0a 2a 2a 20  ise, return..** 
31310 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 69 73  SQLITE_OK. It is
31320 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
31330 61 6e 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65  an error if some
31340 20 74 65 72 6d 20 6d 61 74 63 68 65 73 20 7a 65   term matches ze
31350 72 6f 0d 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 73  ro..** documents
31360 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
31370 74 20 66 74 73 35 45 78 70 72 4e 65 61 72 49 6e  t fts5ExprNearIn
31380 69 74 41 6c 6c 28 0d 0a 20 20 46 74 73 35 45 78  itAll(..  Fts5Ex
31390 70 72 20 2a 70 45 78 70 72 2c 0d 0a 20 20 46 74  pr *pExpr,..  Ft
313a0 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
313b0 65 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 45 78 70  e..){..  Fts5Exp
313c0 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
313d0 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d  = pNode->pNear;.
313e0 0a 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20 20 61  .  int i;....  a
313f0 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 4e  ssert( pNode->bN
31400 6f 6d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 20 20  omatch==0 );..  
31410 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72  for(i=0; i<pNear
31420 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b  ->nPhrase; i++){
31430 0d 0a 20 20 20 20 46 74 73 35 45 78 70 72 50 68  ..    Fts5ExprPh
31440 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20  rase *pPhrase = 
31450 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b  pNear->apPhrase[
31460 69 5d 3b 0d 0a 20 20 20 20 69 66 28 20 70 50 68  i];..    if( pPh
31470 72 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29  rase->nTerm==0 )
31480 7b 0d 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  {..      pNode->
31490 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 20 20 20  bEof = 1;..     
314a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
314b0 4b 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a  K;..    }else{..
314c0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0d 0a 20 20        int j;..  
314d0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
314e0 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 6a  Phrase->nTerm; j
314f0 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 46 74  ++){..        Ft
31500 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72  s5ExprTerm *pTer
31510 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54  m = &pPhrase->aT
31520 65 72 6d 5b 6a 5d 3b 0d 0a 20 20 20 20 20 20 20  erm[j];..       
31530 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
31540 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ;..        int b
31550 48 69 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20  Hit = 0;....    
31560 20 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b      for(p=pTerm;
31570 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79   p; p=p->pSynony
31580 6d 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  m){..          i
31590 6e 74 20 72 63 3b 0d 0a 20 20 20 20 20 20 20 20  nt rc;..        
315a0 20 20 69 66 28 20 70 2d 3e 70 49 74 65 72 20 29    if( p->pIter )
315b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
315c0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
315d0 6f 73 65 28 70 2d 3e 70 49 74 65 72 29 3b 0d 0a  ose(p->pIter);..
315e0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
315f0 49 74 65 72 20 3d 20 30 3b 0d 0a 20 20 20 20 20  Iter = 0;..     
31600 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
31610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
31620 73 35 49 6e 64 65 78 51 75 65 72 79 28 0d 0a 20  s5IndexQuery(.. 
31630 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
31640 70 72 2d 3e 70 49 6e 64 65 78 2c 20 70 2d 3e 7a  pr->pIndex, p->z
31650 54 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65  Term, (int)strle
31660 6e 28 70 2d 3e 7a 54 65 72 6d 29 2c 0d 0a 20 20  n(p->zTerm),..  
31670 20 20 20 20 20 20 20 20 20 20 20 20 28 70 54 65              (pTe
31680 72 6d 2d 3e 62 50 72 65 66 69 78 20 3f 20 46 54  rm->bPrefix ? FT
31690 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
316a0 45 46 49 58 20 3a 20 30 29 20 7c 0d 0a 20 20 20  EFIX : 0) |..   
316b0 20 20 20 20 20 20 20 20 20 20 20 28 70 45 78 70             (pExp
316c0 72 2d 3e 62 44 65 73 63 20 3f 20 46 54 53 35 49  r->bDesc ? FTS5I
316d0 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
316e0 3a 20 30 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  : 0),..         
316f0 20 20 20 20 20 70 4e 65 61 72 2d 3e 70 43 6f 6c       pNear->pCol
31700 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  set,..          
31710 20 20 20 20 26 70 2d 3e 70 49 74 65 72 0d 0a 20      &p->pIter.. 
31720 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 20           );..   
31730 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
31740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3d 3d  rc==SQLITE_OK)==
31750 28 70 2d 3e 70 49 74 65 72 21 3d 30 29 20 29 3b  (p->pIter!=0) );
31760 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
31770 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
31780 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20  return rc;..    
31790 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
317a0 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
317b0 70 2d 3e 70 49 74 65 72 29 20 29 7b 0d 0a 20 20  p->pIter) ){..  
317c0 20 20 20 20 20 20 20 20 20 20 62 48 69 74 20 3d            bHit =
317d0 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d   1;..          }
317e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
317f0 20 20 20 20 20 20 20 69 66 28 20 62 48 69 74 3d         if( bHit=
31800 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20  =0 ){..         
31810 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31   pNode->bEof = 1
31820 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ;..          ret
31830 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  urn SQLITE_OK;..
31840 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
31850 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a   }..    }..  }..
31860 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20  ..  pNode->bEof 
31870 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 53  = 0;..  return S
31880 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a  QLITE_OK;..}....
31890 2f 2a 0d 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  /*..** If pExpr 
318a0 69 73 20 61 6e 20 41 53 43 20 69 74 65 72 61 74  is an ASC iterat
318b0 6f 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  or, this functio
318c0 6e 20 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75  n returns a valu
318d0 65 20 77 69 74 68 20 74 68 65 0d 0a 2a 2a 20 73  e with the..** s
318e0 61 6d 65 20 73 69 67 6e 20 61 73 3a 0d 0a 2a 2a  ame sign as:..**
318f0 0d 0a 2a 2a 20 20 20 28 69 4c 68 73 20 2d 20 69  ..**   (iLhs - i
31900 52 68 73 29 0d 0a 2a 2a 0d 0a 2a 2a 20 4f 74 68  Rhs)..**..** Oth
31910 65 72 77 69 73 65 2c 20 69 66 20 74 68 69 73 20  erwise, if this 
31920 69 73 20 61 20 44 45 53 43 20 69 74 65 72 61 74  is a DESC iterat
31930 6f 72 2c 20 74 68 65 20 6f 70 70 6f 73 69 74 65  or, the opposite
31940 20 69 73 20 72 65 74 75 72 6e 65 64 3a 0d 0a 2a   is returned:..*
31950 2a 0d 0a 2a 2a 20 20 20 28 69 52 68 73 20 2d 20  *..**   (iRhs - 
31960 69 4c 68 73 29 0d 0a 2a 2f 0d 0a 73 74 61 74 69  iLhs)..*/..stati
31970 63 20 69 6e 74 20 66 74 73 35 52 6f 77 69 64 43  c int fts5RowidC
31980 6d 70 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20  mp(..  Fts5Expr 
31990 2a 70 45 78 70 72 2c 0d 0a 20 20 69 36 34 20 69  *pExpr,..  i64 i
319a0 4c 68 73 2c 0d 0a 20 20 69 36 34 20 69 52 68 73  Lhs,..  i64 iRhs
319b0 0d 0a 29 7b 0d 0a 20 20 61 73 73 65 72 74 28 20  ..){..  assert( 
319c0 70 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d 30 20  pExpr->bDesc==0 
319d0 7c 7c 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d  || pExpr->bDesc=
319e0 3d 31 20 29 3b 0d 0a 20 20 69 66 28 20 70 45 78  =1 );..  if( pEx
319f0 70 72 2d 3e 62 44 65 73 63 3d 3d 30 20 29 7b 0d  pr->bDesc==0 ){.
31a00 0a 20 20 20 20 69 66 28 20 69 4c 68 73 3c 69 52  .    if( iLhs<iR
31a10 68 73 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0d  hs ) return -1;.
31a20 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 4c 68  .    return (iLh
31a30 73 20 3e 20 69 52 68 73 29 3b 0d 0a 20 20 7d 65  s > iRhs);..  }e
31a40 6c 73 65 7b 0d 0a 20 20 20 20 69 66 28 20 69 4c  lse{..    if( iL
31a50 68 73 3e 69 52 68 73 20 29 20 72 65 74 75 72 6e  hs>iRhs ) return
31a60 20 2d 31 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e   -1;..    return
31a70 20 28 69 4c 68 73 20 3c 20 69 52 68 73 29 3b 0d   (iLhs < iRhs);.
31a80 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69  .  }..}....stati
31a90 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 53  c void fts5ExprS
31aa0 65 74 45 6f 66 28 46 74 73 35 45 78 70 72 4e 6f  etEof(Fts5ExprNo
31ab0 64 65 20 2a 70 4e 6f 64 65 29 7b 0d 0a 20 20 69  de *pNode){..  i
31ac0 6e 74 20 69 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e  nt i;..  pNode->
31ad0 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 70 4e 6f  bEof = 1;..  pNo
31ae0 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30  de->bNomatch = 0
31af0 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
31b00 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69  pNode->nChild; i
31b10 2b 2b 29 7b 0d 0a 20 20 20 20 66 74 73 35 45 78  ++){..    fts5Ex
31b20 70 72 53 65 74 45 6f 66 28 70 4e 6f 64 65 2d 3e  prSetEof(pNode->
31b30 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20 20  apChild[i]);..  
31b40 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76  }..}....static v
31b50 6f 69 64 20 66 74 73 35 45 78 70 72 4e 6f 64 65  oid fts5ExprNode
31b60 5a 65 72 6f 50 6f 73 6c 69 73 74 28 46 74 73 35  ZeroPoslist(Fts5
31b70 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29  ExprNode *pNode)
31b80 7b 0d 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  {..  if( pNode->
31b90 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49  eType==FTS5_STRI
31ba0 4e 47 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79  NG || pNode->eTy
31bb0 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29 7b  pe==FTS5_TERM ){
31bc0 0d 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e 65  ..    Fts5ExprNe
31bd0 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70  arset *pNear = p
31be0 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d 0a 20 20  Node->pNear;..  
31bf0 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 66 6f    int i;..    fo
31c00 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e  r(i=0; i<pNear->
31c10 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a  nPhrase; i++){..
31c20 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68        Fts5ExprPh
31c30 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20  rase *pPhrase = 
31c40 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b  pNear->apPhrase[
31c50 69 5d 3b 0d 0a 20 20 20 20 20 20 70 50 68 72 61  i];..      pPhra
31c60 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20  se->poslist.n = 
31c70 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c  0;..    }..  }el
31c80 73 65 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d  se{..    int i;.
31c90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
31ca0 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69  pNode->nChild; i
31cb0 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 66 74 73 35  ++){..      fts5
31cc0 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50 6f 73 6c  ExprNodeZeroPosl
31cd0 69 73 74 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69  ist(pNode->apChi
31ce0 6c 64 5b 69 5d 29 3b 0d 0a 20 20 20 20 7d 0d 0a  ld[i]);..    }..
31cf0 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a    }..}......../*
31d00 0d 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  ..** Compare the
31d10 20 76 61 6c 75 65 73 20 63 75 72 72 65 6e 74 6c   values currentl
31d20 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  y indicated by t
31d30 68 65 20 74 77 6f 20 6e 6f 64 65 73 20 61 73 20  he two nodes as 
31d40 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d 0a 2a 2a  follows:..**..**
31d50 20 20 20 20 72 65 73 20 3d 20 28 2a 70 31 29 20      res = (*p1) 
31d60 2d 20 28 2a 70 32 29 0d 0a 2a 2a 0d 0a 2a 2a 20  - (*p2)..**..** 
31d70 4e 6f 64 65 73 20 74 68 61 74 20 70 6f 69 6e 74  Nodes that point
31d80 20 74 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20   to values that 
31d90 63 6f 6d 65 20 6c 61 74 65 72 20 69 6e 20 74 68  come later in th
31da0 65 20 69 74 65 72 61 74 69 6f 6e 20 6f 72 64 65  e iteration orde
31db0 72 20 61 72 65 0d 0a 2a 2a 20 63 6f 6e 73 69 64  r are..** consid
31dc0 65 72 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  ered to be large
31dd0 72 2e 20 4e 6f 64 65 73 20 61 74 20 45 4f 46 20  r. Nodes at EOF 
31de0 61 72 65 20 74 68 65 20 6c 61 72 67 65 73 74 20  are the largest 
31df0 6f 66 20 61 6c 6c 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  of all...**..** 
31e00 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
31e10 69 66 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  if the iteration
31e20 20 6f 72 64 65 72 20 69 73 20 41 53 43 2c 20 74   order is ASC, t
31e30 68 65 6e 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  hen numerically 
31e40 6c 61 72 67 65 72 0d 0a 2a 2a 20 72 6f 77 69 64  larger..** rowid
31e50 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
31e60 20 6c 61 72 67 65 72 2e 20 4f 72 20 69 66 20 69   larger. Or if i
31e70 74 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  t is the default
31e80 20 44 45 53 43 2c 20 6e 75 6d 65 72 69 63 61 6c   DESC, numerical
31e90 6c 79 0d 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 72  ly..** smaller r
31ea0 6f 77 69 64 73 20 61 72 65 20 6c 61 72 67 65 72  owids are larger
31eb0 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
31ec0 74 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72  t fts5NodeCompar
31ed0 65 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a  e(..  Fts5Expr *
31ee0 70 45 78 70 72 2c 0d 0a 20 20 46 74 73 35 45 78  pExpr,..  Fts5Ex
31ef0 70 72 4e 6f 64 65 20 2a 70 31 2c 20 0d 0a 20 20  prNode *p1, ..  
31f00 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 32  Fts5ExprNode *p2
31f10 0d 0a 29 7b 0d 0a 20 20 69 66 28 20 70 32 2d 3e  ..){..  if( p2->
31f20 62 45 6f 66 20 29 20 72 65 74 75 72 6e 20 2d 31  bEof ) return -1
31f30 3b 0d 0a 20 20 69 66 28 20 70 31 2d 3e 62 45 6f  ;..  if( p1->bEo
31f40 66 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0d 0a  f ) return +1;..
31f50 20 20 72 65 74 75 72 6e 20 66 74 73 35 52 6f 77    return fts5Row
31f60 69 64 43 6d 70 28 70 45 78 70 72 2c 20 70 31 2d  idCmp(pExpr, p1-
31f70 3e 69 52 6f 77 69 64 2c 20 70 32 2d 3e 69 52 6f  >iRowid, p2->iRo
31f80 77 69 64 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a  wid);..}..../*..
31f90 2a 2a 20 41 6c 6c 20 69 6e 64 69 76 69 64 75 61  ** All individua
31fa0 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72 73  l term iterators
31fb0 20 69 6e 20 70 4e 65 61 72 20 61 72 65 20 67 75   in pNear are gu
31fc0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 76  aranteed to be v
31fd0 61 6c 69 64 20 77 68 65 6e 0d 0a 2a 2a 20 74 68  alid when..** th
31fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
31ff0 61 6c 6c 65 64 2e 20 54 68 69 73 20 66 75 6e 63  alled. This func
32000 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61  tion checks if a
32010 6c 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72  ll term iterator
32020 73 0d 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  s..** point to t
32030 68 65 20 73 61 6d 65 20 72 6f 77 69 64 2c 20 61  he same rowid, a
32040 6e 64 20 69 66 20 6e 6f 74 2c 20 61 64 76 61 6e  nd if not, advan
32050 63 65 73 20 74 68 65 6d 20 75 6e 74 69 6c 20 74  ces them until t
32060 68 65 79 20 64 6f 2e 0d 0a 2a 2a 20 49 66 20 61  hey do...** If a
32070 6e 20 45 4f 46 20 69 73 20 72 65 61 63 68 65 64  n EOF is reached
32080 20 62 65 66 6f 72 65 20 74 68 69 73 20 68 61 70   before this hap
32090 70 65 6e 73 2c 20 2a 70 62 45 6f 66 20 69 73 20  pens, *pbEof is 
320a0 73 65 74 20 74 6f 20 74 72 75 65 20 62 65 66 6f  set to true befo
320b0 72 65 0d 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  re..** returning
320c0 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c 49 54 45  ...**..** SQLITE
320d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
320e0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
320f0 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  rs, or an SQLite
32100 20 65 72 72 6f 72 20 63 6f 64 65 20 0d 0a 2a 2a   error code ..**
32110 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 20 69   otherwise. It i
32120 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
32130 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
32140 66 20 61 6e 20 69 74 65 72 61 74 6f 72 20 72 65  f an iterator re
32150 61 63 68 65 73 0d 0a 2a 2a 20 45 4f 46 2e 0d 0a  aches..** EOF...
32160 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */..static int f
32170 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f  ts5ExprNodeTest_
32180 53 54 52 49 4e 47 28 0d 0a 20 20 46 74 73 35 45  STRING(..  Fts5E
32190 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
321a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
321b0 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65  pression pPhrase
321c0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d 0a   belongs to */..
321d0 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
321e0 70 4e 6f 64 65 0d 0a 29 7b 0d 0a 20 20 46 74 73  pNode..){..  Fts
321f0 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e  5ExprNearset *pN
32200 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65  ear = pNode->pNe
32210 61 72 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 50  ar;..  Fts5ExprP
32220 68 72 61 73 65 20 2a 70 4c 65 66 74 20 3d 20 70  hrase *pLeft = p
32230 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
32240 5d 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ];..  int rc = S
32250 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 36 34  QLITE_OK;..  i64
32260 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
32270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32280 4c 61 73 74 65 73 74 20 72 6f 77 69 64 20 61 6e  Lastest rowid an
32290 79 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  y iterator point
322a0 73 20 74 6f 20 2a 2f 0d 0a 20 20 69 6e 74 20 69  s to */..  int i
322b0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
322c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68             /* Ph
322d0 72 61 73 65 20 61 6e 64 20 74 6f 6b 65 6e 20 69  rase and token i
322e0 6e 64 65 78 2c 20 72 65 73 70 65 63 74 69 76 65  ndex, respective
322f0 6c 79 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 4d 61  ly */..  int bMa
32300 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
32310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
32320 20 69 66 20 61 6c 6c 20 74 65 72 6d 73 20 61 72   if all terms ar
32330 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 72 6f  e at the same ro
32340 77 69 64 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20  wid */..  const 
32350 69 6e 74 20 62 44 65 73 63 20 3d 20 70 45 78 70  int bDesc = pExp
32360 72 2d 3e 62 44 65 73 63 3b 0d 0a 0d 0a 20 20 2f  r->bDesc;....  /
32370 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
32380 73 20 6e 6f 64 65 20 73 68 6f 75 6c 64 20 6e 6f  s node should no
32390 74 20 62 65 20 46 54 53 35 5f 54 45 52 4d 20 2a  t be FTS5_TERM *
323a0 2f 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  /..  assert( pNe
323b0 61 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20 0d 0a  ar->nPhrase>1 ..
323c0 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 61 72 2d         || pNear-
323d0 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54  >apPhrase[0]->nT
323e0 65 72 6d 3e 31 20 0d 0a 20 20 20 20 20 20 20 7c  erm>1 ..       |
323f0 7c 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  | pNear->apPhras
32400 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70  e[0]->aTerm[0].p
32410 53 79 6e 6f 6e 79 6d 0d 0a 20 20 20 20 20 20 20  Synonym..       
32420 7c 7c 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61  || pNear->apPhra
32430 73 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e  se[0]->aTerm[0].
32440 62 46 69 72 73 74 0d 0a 20 20 29 3b 0d 0a 0d 0a  bFirst..  );....
32450 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
32460 69 4c 61 73 74 2c 20 74 68 65 20 22 6c 61 73 74  iLast, the "last
32470 65 73 74 22 20 72 6f 77 69 64 20 61 6e 79 20 69  est" rowid any i
32480 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
32490 6f 2e 20 49 66 20 74 68 65 0d 0a 20 20 2a 2a 20  o. If the..  ** 
324a0 69 74 65 72 61 74 6f 72 20 73 6b 69 70 73 20 74  iterator skips t
324b0 68 72 6f 75 67 68 20 72 6f 77 69 64 73 20 69 6e  hrough rowids in
324c0 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 73 63   the default asc
324d0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c 20 74 68  ending order, th
324e0 69 73 20 6d 65 61 6e 73 0d 0a 20 20 2a 2a 20 74  is means..  ** t
324f0 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  he maximum rowid
32500 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 69 74 65  . Or, if the ite
32510 72 61 74 6f 72 20 69 73 20 22 4f 52 44 45 52 20  rator is "ORDER 
32520 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
32530 74 68 65 6e 20 69 74 0d 0a 20 20 2a 2a 20 6d 65  then it..  ** me
32540 61 6e 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ans the minimum 
32550 72 6f 77 69 64 2e 20 20 2a 2f 0d 0a 20 20 69 66  rowid.  */..  if
32560 28 20 70 4c 65 66 74 2d 3e 61 54 65 72 6d 5b 30  ( pLeft->aTerm[0
32570 5d 2e 70 53 79 6e 6f 6e 79 6d 20 29 7b 0d 0a 20  ].pSynonym ){.. 
32580 20 20 20 69 4c 61 73 74 20 3d 20 66 74 73 35 45     iLast = fts5E
32590 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28  xprSynonymRowid(
325a0 26 70 4c 65 66 74 2d 3e 61 54 65 72 6d 5b 30 5d  &pLeft->aTerm[0]
325b0 2c 20 62 44 65 73 63 2c 20 30 29 3b 0d 0a 20 20  , bDesc, 0);..  
325c0 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69 4c 61 73  }else{..    iLas
325d0 74 20 3d 20 70 4c 65 66 74 2d 3e 61 54 65 72 6d  t = pLeft->aTerm
325e0 5b 30 5d 2e 70 49 74 65 72 2d 3e 69 52 6f 77 69  [0].pIter->iRowi
325f0 64 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 64 6f 20  d;..  }....  do 
32600 7b 0d 0a 20 20 20 20 62 4d 61 74 63 68 20 3d 20  {..    bMatch = 
32610 31 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  1;..    for(i=0;
32620 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
32630 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  e; i++){..      
32640 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
32650 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d  pPhrase = pNear-
32660 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b 0d 0a 20  >apPhrase[i];.. 
32670 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
32680 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20  pPhrase->nTerm; 
32690 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 46  j++){..        F
326a0 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
326b0 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61  rm = &pPhrase->a
326c0 54 65 72 6d 5b 6a 5d 3b 0d 0a 20 20 20 20 20 20  Term[j];..      
326d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79    if( pTerm->pSy
326e0 6e 6f 6e 79 6d 20 29 7b 0d 0a 20 20 20 20 20 20  nonym ){..      
326f0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
32700 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d   fts5ExprSynonym
32710 52 6f 77 69 64 28 70 54 65 72 6d 2c 20 62 44 65  Rowid(pTerm, bDe
32720 73 63 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 20  sc, 0);..       
32730 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 69     if( iRowid==i
32740 4c 61 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Last ) continue;
32750 0d 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74  ..          bMat
32760 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20  ch = 0;..       
32770 20 20 20 69 66 28 20 66 74 73 35 45 78 70 72 53     if( fts5ExprS
32780 79 6e 6f 6e 79 6d 41 64 76 61 6e 63 65 74 6f 28  ynonymAdvanceto(
32790 70 54 65 72 6d 2c 20 62 44 65 73 63 2c 20 26 69  pTerm, bDesc, &i
327a0 4c 61 73 74 2c 20 26 72 63 29 20 29 7b 0d 0a 20  Last, &rc) ){.. 
327b0 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65             pNode
327c0 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d  ->bNomatch = 0;.
327d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f  .            pNo
327e0 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d 0a 20  de->bEof = 1;.. 
327f0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
32800 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 20  n rc;..         
32810 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   }..        }els
32820 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 46 74  e{..          Ft
32830 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
32840 65 72 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54  er = pPhrase->aT
32850 65 72 6d 5b 6a 5d 2e 70 49 74 65 72 3b 0d 0a 20  erm[j].pIter;.. 
32860 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
32870 65 72 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73  er->iRowid==iLas
32880 74 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66  t || pIter->bEof
32890 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20   ) continue;..  
328a0 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d          bMatch =
328b0 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69   0;..          i
328c0 66 28 20 66 74 73 35 45 78 70 72 41 64 76 61 6e  f( fts5ExprAdvan
328d0 63 65 74 6f 28 70 49 74 65 72 2c 20 62 44 65 73  ceto(pIter, bDes
328e0 63 2c 20 26 69 4c 61 73 74 2c 20 26 72 63 2c 20  c, &iLast, &rc, 
328f0 26 70 4e 6f 64 65 2d 3e 62 45 6f 66 29 20 29 7b  &pNode->bEof) ){
32900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
32910 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20  turn rc;..      
32920 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
32930 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
32940 0d 0a 20 20 7d 77 68 69 6c 65 28 20 62 4d 61 74  ..  }while( bMat
32950 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 70 4e  ch==0 );....  pN
32960 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 69 4c  ode->iRowid = iL
32970 61 73 74 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62  ast;..  pNode->b
32980 4e 6f 6d 61 74 63 68 20 3d 20 28 28 30 3d 3d 66  Nomatch = ((0==f
32990 74 73 35 45 78 70 72 4e 65 61 72 54 65 73 74 28  ts5ExprNearTest(
329a0 26 72 63 2c 20 70 45 78 70 72 2c 20 70 4e 6f 64  &rc, pExpr, pNod
329b0 65 29 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  e)) && rc==SQLIT
329c0 45 5f 4f 4b 29 3b 0d 0a 20 20 61 73 73 65 72 74  E_OK);..  assert
329d0 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30  ( pNode->bEof==0
329e0 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61   || pNode->bNoma
329f0 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 72  tch==0 );....  r
32a00 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
32a10 2f 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  /*..** Advance t
32a20 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 74  he first term it
32a30 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 66 69  erator in the fi
32a40 72 73 74 20 70 68 72 61 73 65 20 6f 66 20 70 4e  rst phrase of pN
32a50 65 61 72 2e 20 53 65 74 20 6f 75 74 70 75 74 0d  ear. Set output.
32a60 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 2a 70 62  .** variable *pb
32a70 45 6f 66 20 74 6f 20 74 72 75 65 20 69 66 20 69  Eof to true if i
32a80 74 20 72 65 61 63 68 65 73 20 45 4f 46 20 6f 72  t reaches EOF or
32a90 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
32aa0 75 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74  urs...**..** Ret
32ab0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
32ac0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
32ad0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
32ae0 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
32af0 0d 0a 2a 2a 20 6f 63 63 75 72 73 2e 0d 0a 2a 2f  ..** occurs...*/
32b00 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
32b10 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 53 54  5ExprNodeNext_ST
32b20 52 49 4e 47 28 0d 0a 20 20 46 74 73 35 45 78 70  RING(..  Fts5Exp
32b30 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
32b40 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
32b50 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65 20 62  ession pPhrase b
32b60 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d 0a 20 20  elongs to */..  
32b70 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
32b80 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
32b90 2f 2a 20 46 54 53 35 5f 53 54 52 49 4e 47 20 6f  /* FTS5_STRING o
32ba0 72 20 46 54 53 35 5f 54 45 52 4d 20 6e 6f 64 65  r FTS5_TERM node
32bb0 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 46 72 6f 6d   */..  int bFrom
32bc0 56 61 6c 69 64 2c 0d 0a 20 20 69 36 34 20 69 46  Valid,..  i64 iF
32bd0 72 6f 6d 20 0d 0a 29 7b 0d 0a 20 20 46 74 73 35  rom ..){..  Fts5
32be0 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20  ExprTerm *pTerm 
32bf0 3d 20 26 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d  = &pNode->pNear-
32c00 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 61 54  >apPhrase[0]->aT
32c10 65 72 6d 5b 30 5d 3b 0d 0a 20 20 69 6e 74 20 72  erm[0];..  int r
32c20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  c = SQLITE_OK;..
32c30 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61  ..  pNode->bNoma
32c40 74 63 68 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20  tch = 0;..  if( 
32c50 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20  pTerm->pSynonym 
32c60 29 7b 0d 0a 20 20 20 20 69 6e 74 20 62 45 6f 66  ){..    int bEof
32c70 20 3d 20 31 3b 0d 0a 20 20 20 20 46 74 73 35 45   = 1;..    Fts5E
32c80 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a 0d 0a 20  xprTerm *p;.... 
32c90 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 66     /* Find the f
32ca0 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 61 6e  irstest rowid an
32cb0 79 20 73 79 6e 6f 6e 79 6d 20 70 6f 69 6e 74 73  y synonym points
32cc0 20 74 6f 2e 20 2a 2f 0d 0a 20 20 20 20 69 36 34   to. */..    i64
32cd0 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 45 78   iRowid = fts5Ex
32ce0 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70  prSynonymRowid(p
32cf0 54 65 72 6d 2c 20 70 45 78 70 72 2d 3e 62 44 65  Term, pExpr->bDe
32d00 73 63 2c 20 30 29 3b 0d 0a 0d 0a 20 20 20 20 2f  sc, 0);....    /
32d10 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 69  * Advance each i
32d20 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75 72  terator that cur
32d30 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
32d40 20 69 52 6f 77 69 64 2e 20 4f 72 2c 20 69 66 20   iRowid. Or, if 
32d50 69 46 72 6f 6d 0d 0a 20 20 20 20 2a 2a 20 69 73  iFrom..    ** is
32d60 20 76 61 6c 69 64 20 2d 20 65 61 63 68 20 69 74   valid - each it
32d70 65 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  erator that poin
32d80 74 73 20 74 6f 20 61 20 72 6f 77 69 64 20 62 65  ts to a rowid be
32d90 66 6f 72 65 20 69 46 72 6f 6d 2e 20 20 2a 2f 0d  fore iFrom.  */.
32da0 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d  .    for(p=pTerm
32db0 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e  ; p; p=p->pSynon
32dc0 79 6d 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20  ym){..      if( 
32dd0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
32de0 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20  of(p->pIter)==0 
32df0 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 36 34 20  ){..        i64 
32e00 69 69 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69  ii = p->pIter->i
32e10 52 6f 77 69 64 3b 0d 0a 20 20 20 20 20 20 20 20  Rowid;..        
32e20 69 66 28 20 69 69 3d 3d 69 52 6f 77 69 64 20 0d  if( ii==iRowid .
32e30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 62 46  .         || (bF
32e40 72 6f 6d 56 61 6c 69 64 20 26 26 20 69 69 21 3d  romValid && ii!=
32e50 69 46 72 6f 6d 20 26 26 20 28 69 69 3e 69 46 72  iFrom && (ii>iFr
32e60 6f 6d 29 3d 3d 70 45 78 70 72 2d 3e 62 44 65 73  om)==pExpr->bDes
32e70 63 29 20 0d 0a 20 20 20 20 20 20 20 20 29 7b 0d  c) ..        ){.
32e80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
32e90 46 72 6f 6d 56 61 6c 69 64 20 29 7b 0d 0a 20 20  FromValid ){..  
32ea0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32eb0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
32ec0 78 74 46 72 6f 6d 28 70 2d 3e 70 49 74 65 72 2c  xtFrom(p->pIter,
32ed0 20 69 46 72 6f 6d 29 3b 0d 0a 20 20 20 20 20 20   iFrom);..      
32ee0 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
32ef0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32f00 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
32f10 28 70 2d 3e 70 49 74 65 72 29 3b 0d 0a 20 20 20  (p->pIter);..   
32f20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
32f30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32f40 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0d 0a  TE_OK ) break;..
32f50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
32f60 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
32f70 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20 29 7b  (p->pIter)==0 ){
32f80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 45  ..            bE
32f90 6f 66 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20  of = 0;..       
32fa0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 65     }..        }e
32fb0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse{..          
32fc0 62 45 6f 66 20 3d 20 30 3b 0d 0a 20 20 20 20 20  bEof = 0;..     
32fd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
32fe0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2a 20 53     }....    /* S
32ff0 65 74 20 74 68 65 20 45 4f 46 20 66 6c 61 67 20  et the EOF flag 
33000 69 66 20 65 69 74 68 65 72 20 61 6c 6c 20 73 79  if either all sy
33010 6e 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 73 20  nonym iterators 
33020 61 72 65 20 61 74 20 45 4f 46 20 6f 72 20 61 6e  are at EOF or an
33030 0d 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 68  ..    ** error h
33040 61 73 20 6f 63 63 75 72 72 65 64 2e 20 20 2a 2f  as occurred.  */
33050 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f  ..    pNode->bEo
33060 66 20 3d 20 28 72 63 20 7c 7c 20 62 45 6f 66 29  f = (rc || bEof)
33070 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  ;..  }else{..   
33080 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
33090 70 49 74 65 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pIter = pTerm->p
330a0 49 74 65 72 3b 0d 0a 0d 0a 20 20 20 20 61 73 73  Iter;....    ass
330b0 65 72 74 28 20 46 74 73 35 4e 6f 64 65 49 73 53  ert( Fts5NodeIsS
330c0 74 72 69 6e 67 28 70 4e 6f 64 65 29 20 29 3b 0d  tring(pNode) );.
330d0 0a 20 20 20 20 69 66 28 20 62 46 72 6f 6d 56 61  .    if( bFromVa
330e0 6c 69 64 20 29 7b 0d 0a 20 20 20 20 20 20 72 63  lid ){..      rc
330f0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74   = sqlite3Fts5It
33100 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72  erNextFrom(pIter
33110 2c 20 69 46 72 6f 6d 29 3b 0d 0a 20 20 20 20 7d  , iFrom);..    }
33120 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 72 63 20  else{..      rc 
33130 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
33140 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0d 0a 20  rNext(pIter);.. 
33150 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 4e 6f 64     }....    pNod
33160 65 2d 3e 62 45 6f 66 20 3d 20 28 72 63 20 7c 7c  e->bEof = (rc ||
33170 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
33180 45 6f 66 28 70 49 74 65 72 29 29 3b 0d 0a 20 20  Eof(pIter));..  
33190 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 4e 6f 64 65  }....  if( pNode
331a0 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0d 0a 20 20  ->bEof==0 ){..  
331b0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
331c0 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20  LITE_OK );..    
331d0 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
331e0 65 54 65 73 74 5f 53 54 52 49 4e 47 28 70 45 78  eTest_STRING(pEx
331f0 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 7d  pr, pNode);..  }
33200 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ....  return rc;
33210 0d 0a 7d 0d 0a 0d 0a 0d 0a 73 74 61 74 69 63 20  ..}......static 
33220 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65  int fts5ExprNode
33230 54 65 73 74 5f 54 45 52 4d 28 0d 0a 20 20 46 74  Test_TERM(..  Ft
33240 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s5Expr *pExpr,  
33250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33260 20 45 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   Expression that
33270 20 70 4e 65 61 72 20 69 73 20 61 20 70 61 72 74   pNear is a part
33280 20 6f 66 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78   of */..  Fts5Ex
33290 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20  prNode *pNode   
332a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
332b0 20 22 4e 45 41 52 22 20 6e 6f 64 65 20 28 46 54   "NEAR" node (FT
332c0 53 35 5f 54 45 52 4d 29 20 2a 2f 0d 0a 29 7b 0d  S5_TERM) */..){.
332d0 0a 20 20 2f 2a 20 41 73 20 74 68 69 73 20 22 4e  .  /* As this "N
332e0 45 41 52 22 20 6f 62 6a 65 63 74 20 69 73 20 61  EAR" object is a
332f0 63 74 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  ctually a single
33300 20 70 68 72 61 73 65 20 74 68 61 74 20 63 6f 6e   phrase that con
33310 73 69 73 74 73 20 0d 0a 20 20 2a 2a 20 6f 66 20  sists ..  ** of 
33320 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 6e  a single term on
33330 6c 79 2c 20 67 72 61 62 20 70 6f 69 6e 74 65 72  ly, grab pointer
33340 73 20 69 6e 74 6f 20 74 68 65 20 70 6f 73 6c 69  s into the posli
33350 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
33360 65 0d 0a 20 20 2a 2a 20 66 74 73 35 5f 69 6e 64  e..  ** fts5_ind
33370 65 78 2e 63 20 69 74 65 72 61 74 6f 72 20 6f 62  ex.c iterator ob
33380 6a 65 63 74 2e 20 54 68 69 73 20 69 73 20 6d 75  ject. This is mu
33390 63 68 20 66 61 73 74 65 72 20 74 68 61 6e 20 73  ch faster than s
333a0 79 6e 74 68 65 73 69 7a 69 6e 67 20 0d 0a 20 20  ynthesizing ..  
333b0 2a 2a 20 61 20 6e 65 77 20 70 6f 73 6c 69 73 74  ** a new poslist
333c0 20 74 68 65 20 77 61 79 20 77 65 20 68 61 76 65   the way we have
333d0 20 74 6f 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6d   to for more com
333e0 70 6c 69 63 61 74 65 64 20 70 68 72 61 73 65 20  plicated phrase 
333f0 6f 72 20 4e 45 41 52 0d 0a 20 20 2a 2a 20 65 78  or NEAR..  ** ex
33400 70 72 65 73 73 69 6f 6e 73 2e 20 20 2a 2f 0d 0a  pressions.  */..
33410 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
33420 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 6f 64   *pPhrase = pNod
33430 65 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61  e->pNear->apPhra
33440 73 65 5b 30 5d 3b 0d 0a 20 20 46 74 73 35 49 6e  se[0];..  Fts5In
33450 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  dexIter *pIter =
33460 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b   pPhrase->aTerm[
33470 30 5d 2e 70 49 74 65 72 3b 0d 0a 0d 0a 20 20 61  0].pIter;....  a
33480 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54  ssert( pNode->eT
33490 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29  ype==FTS5_TERM )
334a0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f  ;..  assert( pNo
334b0 64 65 2d 3e 70 4e 65 61 72 2d 3e 6e 50 68 72 61  de->pNear->nPhra
334c0 73 65 3d 3d 31 20 26 26 20 70 50 68 72 61 73 65  se==1 && pPhrase
334d0 2d 3e 6e 54 65 72 6d 3d 3d 31 20 29 3b 0d 0a 20  ->nTerm==1 );.. 
334e0 20 61 73 73 65 72 74 28 20 70 50 68 72 61 73 65   assert( pPhrase
334f0 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f  ->aTerm[0].pSyno
33500 6e 79 6d 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 70  nym==0 );....  p
33510 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
33520 6e 20 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74 61  n = pIter->nData
33530 3b 0d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ;..  if( pExpr->
33540 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
33550 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55  ==FTS5_DETAIL_FU
33560 4c 4c 20 29 7b 0d 0a 20 20 20 20 70 50 68 72 61  LL ){..    pPhra
33570 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 70 20 3d 20  se->poslist.p = 
33580 28 75 38 2a 29 70 49 74 65 72 2d 3e 70 44 61 74  (u8*)pIter->pDat
33590 61 3b 0d 0a 20 20 7d 0d 0a 20 20 70 4e 6f 64 65  a;..  }..  pNode
335a0 2d 3e 69 52 6f 77 69 64 20 3d 20 70 49 74 65 72  ->iRowid = pIter
335b0 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 70 4e 6f  ->iRowid;..  pNo
335c0 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28  de->bNomatch = (
335d0 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
335e0 2e 6e 3d 3d 30 29 3b 0d 0a 20 20 72 65 74 75 72  .n==0);..  retur
335f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d  n SQLITE_OK;..}.
33600 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 78 4e 65 78 74 28  .../*..** xNext(
33610 29 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 20 6e  ) method for a n
33620 6f 64 65 20 6f 66 20 74 79 70 65 20 46 54 53 35  ode of type FTS5
33630 5f 54 45 52 4d 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  _TERM...*/..stat
33640 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e  ic int fts5ExprN
33650 6f 64 65 4e 65 78 74 5f 54 45 52 4d 28 0d 0a 20  odeNext_TERM(.. 
33660 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
33670 2c 20 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  , ..  Fts5ExprNo
33680 64 65 20 2a 70 4e 6f 64 65 2c 0d 0a 20 20 69 6e  de *pNode,..  in
33690 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0d 0a 20  t bFromValid,.. 
336a0 20 69 36 34 20 69 46 72 6f 6d 0d 0a 29 7b 0d 0a   i64 iFrom..){..
336b0 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 46 74 73    int rc;..  Fts
336c0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
336d0 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72  r = pNode->pNear
336e0 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 61  ->apPhrase[0]->a
336f0 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 3b 0d 0a  Term[0].pIter;..
33700 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64  ..  assert( pNod
33710 65 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0d 0a 20  e->bEof==0 );.. 
33720 20 69 66 28 20 62 46 72 6f 6d 56 61 6c 69 64 20   if( bFromValid 
33730 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ){..    rc = sql
33740 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
33750 46 72 6f 6d 28 70 49 74 65 72 2c 20 69 46 72 6f  From(pIter, iFro
33760 6d 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20  m);..  }else{.. 
33770 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
33780 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 74 65  ts5IterNext(pIte
33790 72 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20  r);..  }..  if( 
337a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
337b0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
337c0 45 6f 66 28 70 49 74 65 72 29 3d 3d 30 20 29 7b  Eof(pIter)==0 ){
337d0 0d 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45  ..    rc = fts5E
337e0 78 70 72 4e 6f 64 65 54 65 73 74 5f 54 45 52 4d  xprNodeTest_TERM
337f0 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d  (pExpr, pNode);.
33800 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70  .  }else{..    p
33810 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d  Node->bEof = 1;.
33820 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  .    pNode->bNom
33830 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a  atch = 0;..  }..
33840 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
33850 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  ...static void f
33860 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f  ts5ExprNodeTest_
33870 4f 52 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20  OR(..  Fts5Expr 
33880 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
33890 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
338a0 73 69 6f 6e 20 6f 66 20 77 68 69 63 68 20 70 4e  sion of which pN
338b0 6f 64 65 20 69 73 20 61 20 70 61 72 74 20 2a 2f  ode is a part */
338c0 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ..  Fts5ExprNode
338d0 20 2a 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20   *pNode         
338e0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
338f0 6e 20 6e 6f 64 65 20 74 6f 20 74 65 73 74 20 2a  n node to test *
33900 2f 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 45 78 70  /..){..  Fts5Exp
33910 72 4e 6f 64 65 20 2a 70 4e 65 78 74 20 3d 20 70  rNode *pNext = p
33920 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d  Node->apChild[0]
33930 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a 20  ;..  int i;.... 
33940 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 4e 6f 64   for(i=1; i<pNod
33950 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b  e->nChild; i++){
33960 0d 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f  ..    Fts5ExprNo
33970 64 65 20 2a 70 43 68 69 6c 64 20 3d 20 70 4e 6f  de *pChild = pNo
33980 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 3b 0d  de->apChild[i];.
33990 0a 20 20 20 20 69 6e 74 20 63 6d 70 20 3d 20 66  .    int cmp = f
339a0 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70  ts5NodeCompare(p
339b0 45 78 70 72 2c 20 70 4e 65 78 74 2c 20 70 43 68  Expr, pNext, pCh
339c0 69 6c 64 29 3b 0d 0a 20 20 20 20 69 66 28 20 63  ild);..    if( c
339d0 6d 70 3e 30 20 7c 7c 20 28 63 6d 70 3d 3d 30 20  mp>0 || (cmp==0 
339e0 26 26 20 70 43 68 69 6c 64 2d 3e 62 4e 6f 6d 61  && pChild->bNoma
339f0 74 63 68 3d 3d 30 29 20 29 7b 0d 0a 20 20 20 20  tch==0) ){..    
33a00 20 20 70 4e 65 78 74 20 3d 20 70 43 68 69 6c 64    pNext = pChild
33a10 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20  ;..    }..  }.. 
33a20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d   pNode->iRowid =
33a30 20 70 4e 65 78 74 2d 3e 69 52 6f 77 69 64 3b 0d   pNext->iRowid;.
33a40 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d  .  pNode->bEof =
33a50 20 70 4e 65 78 74 2d 3e 62 45 6f 66 3b 0d 0a 20   pNext->bEof;.. 
33a60 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68   pNode->bNomatch
33a70 20 3d 20 70 4e 65 78 74 2d 3e 62 4e 6f 6d 61 74   = pNext->bNomat
33a80 63 68 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63  ch;..}....static
33a90 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64   int fts5ExprNod
33aa0 65 4e 65 78 74 5f 4f 52 28 0d 0a 20 20 46 74 73  eNext_OR(..  Fts
33ab0 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0d 0a  5Expr *pExpr, ..
33ac0 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
33ad0 70 4e 6f 64 65 2c 0d 0a 20 20 69 6e 74 20 62 46  pNode,..  int bF
33ae0 72 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20 69 36 34  romValid,..  i64
33af0 20 69 46 72 6f 6d 0d 0a 29 7b 0d 0a 20 20 69 6e   iFrom..){..  in
33b00 74 20 69 3b 0d 0a 20 20 69 36 34 20 69 4c 61 73  t i;..  i64 iLas
33b10 74 20 3d 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69  t = pNode->iRowi
33b20 64 3b 0d 0a 0d 0a 20 20 66 6f 72 28 69 3d 30 3b  d;....  for(i=0;
33b30 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
33b40 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 46 74 73  ; i++){..    Fts
33b50 35 45 78 70 72 4e 6f 64 65 20 2a 70 31 20 3d 20  5ExprNode *p1 = 
33b60 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69  pNode->apChild[i
33b70 5d 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ];..    assert( 
33b80 70 31 2d 3e 62 45 6f 66 20 7c 7c 20 66 74 73 35  p1->bEof || fts5
33b90 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20  RowidCmp(pExpr, 
33ba0 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69 4c 61 73  p1->iRowid, iLas
33bb0 74 29 3e 3d 30 20 29 3b 0d 0a 20 20 20 20 69 66  t)>=0 );..    if
33bc0 28 20 70 31 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b  ( p1->bEof==0 ){
33bd0 0d 0a 20 20 20 20 20 20 69 66 28 20 28 70 31 2d  ..      if( (p1-
33be0 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 29 20  >iRowid==iLast) 
33bf0 0d 0a 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72  ..       || (bFr
33c00 6f 6d 56 61 6c 69 64 20 26 26 20 66 74 73 35 52  omValid && fts5R
33c10 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 70  owidCmp(pExpr, p
33c20 31 2d 3e 69 52 6f 77 69 64 2c 20 69 46 72 6f 6d  1->iRowid, iFrom
33c30 29 3c 30 29 0d 0a 20 20 20 20 20 20 29 7b 0d 0a  )<0)..      ){..
33c40 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
33c50 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78   fts5ExprNodeNex
33c60 74 28 70 45 78 70 72 2c 20 70 31 2c 20 62 46 72  t(pExpr, p1, bFr
33c70 6f 6d 56 61 6c 69 64 2c 20 69 46 72 6f 6d 29 3b  omValid, iFrom);
33c80 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ..        if( rc
33c90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  !=SQLITE_OK ){..
33ca0 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d            pNode-
33cb0 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a  >bNomatch = 0;..
33cc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
33cd0 20 72 63 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d   rc;..        }.
33ce0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
33cf0 0a 20 20 7d 0d 0a 0d 0a 20 20 66 74 73 35 45 78  .  }....  fts5Ex
33d00 70 72 4e 6f 64 65 54 65 73 74 5f 4f 52 28 70 45  prNodeTest_OR(pE
33d10 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20  xpr, pNode);..  
33d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33d30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41  ;..}..../*..** A
33d40 72 67 75 6d 65 6e 74 20 70 4e 6f 64 65 20 69 73  rgument pNode is
33d50 20 61 6e 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64   an FTS5_AND nod
33d60 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69  e...*/..static i
33d70 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54  nt fts5ExprNodeT
33d80 65 73 74 5f 41 4e 44 28 0d 0a 20 20 46 74 73 35  est_AND(..  Fts5
33d90 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
33da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
33db0 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73  xpression pPhras
33dc0 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d  e belongs to */.
33dd0 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
33de0 2a 70 41 6e 64 20 20 20 20 20 20 20 20 20 20 20  *pAnd           
33df0 20 20 20 2f 2a 20 46 54 53 35 5f 41 4e 44 20 6e     /* FTS5_AND n
33e00 6f 64 65 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  ode to advance *
33e10 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 69 43 68  /..){..  int iCh
33e20 69 6c 64 3b 0d 0a 20 20 69 36 34 20 69 4c 61 73  ild;..  i64 iLas
33e30 74 20 3d 20 70 41 6e 64 2d 3e 69 52 6f 77 69 64  t = pAnd->iRowid
33e40 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ;..  int rc = SQ
33e50 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 6e 74 20  LITE_OK;..  int 
33e60 62 4d 61 74 63 68 3b 0d 0a 0d 0a 20 20 61 73 73  bMatch;....  ass
33e70 65 72 74 28 20 70 41 6e 64 2d 3e 62 45 6f 66 3d  ert( pAnd->bEof=
33e80 3d 30 20 29 3b 0d 0a 20 20 64 6f 20 7b 0d 0a 20  =0 );..  do {.. 
33e90 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63     pAnd->bNomatc
33ea0 68 20 3d 20 30 3b 0d 0a 20 20 20 20 62 4d 61 74  h = 0;..    bMat
33eb0 63 68 20 3d 20 31 3b 0d 0a 20 20 20 20 66 6f 72  ch = 1;..    for
33ec0 28 69 43 68 69 6c 64 3d 30 3b 20 69 43 68 69 6c  (iChild=0; iChil
33ed0 64 3c 70 41 6e 64 2d 3e 6e 43 68 69 6c 64 3b 20  d<pAnd->nChild; 
33ee0 69 43 68 69 6c 64 2b 2b 29 7b 0d 0a 20 20 20 20  iChild++){..    
33ef0 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
33f00 70 43 68 69 6c 64 20 3d 20 70 41 6e 64 2d 3e 61  pChild = pAnd->a
33f10 70 43 68 69 6c 64 5b 69 43 68 69 6c 64 5d 3b 0d  pChild[iChild];.
33f20 0a 20 20 20 20 20 20 69 6e 74 20 63 6d 70 20 3d  .      int cmp =
33f30 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45   fts5RowidCmp(pE
33f40 78 70 72 2c 20 69 4c 61 73 74 2c 20 70 43 68 69  xpr, iLast, pChi
33f50 6c 64 2d 3e 69 52 6f 77 69 64 29 3b 0d 0a 20 20  ld->iRowid);..  
33f60 20 20 20 20 69 66 28 20 63 6d 70 3e 30 20 29 7b      if( cmp>0 ){
33f70 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76  ..        /* Adv
33f80 61 6e 63 65 20 70 43 68 69 6c 64 20 75 6e 74 69  ance pChild unti
33f90 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  l it points to i
33fa0 4c 61 73 74 20 6f 72 20 6c 61 73 74 65 72 20 2a  Last or laster *
33fb0 2f 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  /..        rc = 
33fc0 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
33fd0 28 70 45 78 70 72 2c 20 70 43 68 69 6c 64 2c 20  (pExpr, pChild, 
33fe0 31 2c 20 69 4c 61 73 74 29 3b 0d 0a 20 20 20 20  1, iLast);..    
33ff0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34000 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
34010 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74      pAnd->bNomat
34020 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20  ch = 0;..       
34030 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20     return rc;.. 
34040 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
34050 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20 49 66  }....      /* If
34060 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65 20   the child node 
34070 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2c 20 73  is now at EOF, s
34080 6f 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  o is the parent 
34090 41 4e 44 20 6e 6f 64 65 2e 20 4f 74 68 65 72 77  AND node. Otherw
340a0 69 73 65 2c 0d 0a 20 20 20 20 20 20 2a 2a 20 74  ise,..      ** t
340b0 68 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 69 73  he child node is
340c0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
340d0 61 76 65 20 61 64 76 61 6e 63 65 64 20 61 74 20  ave advanced at 
340e0 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73 0d  least as far as.
340f0 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  .      ** rowid 
34100 69 4c 61 73 74 2e 20 53 6f 20 69 66 20 69 74 20  iLast. So if it 
34110 69 73 20 6e 6f 74 20 61 74 20 65 78 61 63 74 6c  is not at exactl
34120 79 20 69 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d  y iLast, pChild-
34130 3e 69 52 6f 77 69 64 20 69 73 20 74 68 65 0d 0a  >iRowid is the..
34140 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 6c 61 73        ** new las
34150 74 65 73 74 20 72 6f 77 69 64 20 73 65 65 6e 20  test rowid seen 
34160 73 6f 20 66 61 72 2e 20 20 2a 2f 0d 0a 20 20 20  so far.  */..   
34170 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
34180 64 2d 3e 62 45 6f 66 20 7c 7c 20 66 74 73 35 52  d->bEof || fts5R
34190 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 69  owidCmp(pExpr, i
341a0 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d 3e 69 52  Last, pChild->iR
341b0 6f 77 69 64 29 3c 3d 30 20 29 3b 0d 0a 20 20 20  owid)<=0 );..   
341c0 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 62     if( pChild->b
341d0 45 6f 66 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  Eof ){..        
341e0 66 74 73 35 45 78 70 72 53 65 74 45 6f 66 28 70  fts5ExprSetEof(p
341f0 41 6e 64 29 3b 0d 0a 20 20 20 20 20 20 20 20 62  And);..        b
34200 4d 61 74 63 68 20 3d 20 31 3b 0d 0a 20 20 20 20  Match = 1;..    
34210 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
34220 20 20 7d 65 6c 73 65 20 69 66 28 20 69 4c 61 73    }else if( iLas
34230 74 21 3d 70 43 68 69 6c 64 2d 3e 69 52 6f 77 69  t!=pChild->iRowi
34240 64 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 62 4d  d ){..        bM
34250 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20  atch = 0;..     
34260 20 20 20 69 4c 61 73 74 20 3d 20 70 43 68 69 6c     iLast = pChil
34270 64 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 20 20  d->iRowid;..    
34280 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 28    }....      if(
34290 20 70 43 68 69 6c 64 2d 3e 62 4e 6f 6d 61 74 63   pChild->bNomatc
342a0 68 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 41  h ){..        pA
342b0 6e 64 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 31  nd->bNomatch = 1
342c0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
342d0 7d 0d 0a 20 20 7d 77 68 69 6c 65 28 20 62 4d 61  }..  }while( bMa
342e0 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a 20 20 69  tch==0 );....  i
342f0 66 28 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63  f( pAnd->bNomatc
34300 68 20 26 26 20 70 41 6e 64 21 3d 70 45 78 70 72  h && pAnd!=pExpr
34310 2d 3e 70 52 6f 6f 74 20 29 7b 0d 0a 20 20 20 20  ->pRoot ){..    
34320 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f  fts5ExprNodeZero
34330 50 6f 73 6c 69 73 74 28 70 41 6e 64 29 3b 0d 0a  Poslist(pAnd);..
34340 20 20 7d 0d 0a 20 20 70 41 6e 64 2d 3e 69 52 6f    }..  pAnd->iRo
34350 77 69 64 20 3d 20 69 4c 61 73 74 3b 0d 0a 20 20  wid = iLast;..  
34360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34370 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69  ;..}....static i
34380 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e  nt fts5ExprNodeN
34390 65 78 74 5f 41 4e 44 28 0d 0a 20 20 46 74 73 35  ext_AND(..  Fts5
343a0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0d 0a 20  Expr *pExpr, .. 
343b0 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
343c0 4e 6f 64 65 2c 0d 0a 20 20 69 6e 74 20 62 46 72  Node,..  int bFr
343d0 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20 69 36 34 20  omValid,..  i64 
343e0 69 46 72 6f 6d 0d 0a 29 7b 0d 0a 20 20 69 6e 74  iFrom..){..  int
343f0 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
34400 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70 4e  deNext(pExpr, pN
34410 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2c  ode->apChild[0],
34420 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20 69 46 72   bFromValid, iFr
34430 6f 6d 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d  om);..  if( rc==
34440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
34450 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
34460 6f 64 65 54 65 73 74 5f 41 4e 44 28 70 45 78 70  odeTest_AND(pExp
34470 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 7d 65  r, pNode);..  }e
34480 6c 73 65 7b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d  lse{..    pNode-
34490 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a  >bNomatch = 0;..
344a0 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
344b0 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69  ;..}....static i
344c0 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54  nt fts5ExprNodeT
344d0 65 73 74 5f 4e 4f 54 28 0d 0a 20 20 46 74 73 35  est_NOT(..  Fts5
344e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
344f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34500 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73  xpression pPhras
34510 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d  e belongs to */.
34520 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
34530 2a 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20  *pNode          
34540 20 20 20 2f 2a 20 46 54 53 35 5f 4e 4f 54 20 6e     /* FTS5_NOT n
34550 6f 64 65 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  ode to advance *
34560 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20  /..){..  int rc 
34570 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  = SQLITE_OK;..  
34580 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 31  Fts5ExprNode *p1
34590 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c   = pNode->apChil
345a0 64 5b 30 5d 3b 0d 0a 20 20 46 74 73 35 45 78 70  d[0];..  Fts5Exp
345b0 72 4e 6f 64 65 20 2a 70 32 20 3d 20 70 4e 6f 64  rNode *p2 = pNod
345c0 65 2d 3e 61 70 43 68 69 6c 64 5b 31 5d 3b 0d 0a  e->apChild[1];..
345d0 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
345e0 3e 6e 43 68 69 6c 64 3d 3d 32 20 29 3b 0d 0a 0d  >nChild==2 );...
345f0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
34600 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 2d 3e 62  LITE_OK && p1->b
34610 45 6f 66 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69  Eof==0 ){..    i
34620 6e 74 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f 64  nt cmp = fts5Nod
34630 65 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 20  eCompare(pExpr, 
34640 70 31 2c 20 70 32 29 3b 0d 0a 20 20 20 20 69 66  p1, p2);..    if
34650 28 20 63 6d 70 3e 30 20 29 7b 0d 0a 20 20 20 20  ( cmp>0 ){..    
34660 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
34670 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70  odeNext(pExpr, p
34680 32 2c 20 31 2c 20 70 31 2d 3e 69 52 6f 77 69 64  2, 1, p1->iRowid
34690 29 3b 0d 0a 20 20 20 20 20 20 63 6d 70 20 3d 20  );..      cmp = 
346a0 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28  fts5NodeCompare(
346b0 70 45 78 70 72 2c 20 70 31 2c 20 70 32 29 3b 0d  pExpr, p1, p2);.
346c0 0a 20 20 20 20 7d 0d 0a 20 20 20 20 61 73 73 65  .    }..    asse
346d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
346e0 4b 20 7c 7c 20 63 6d 70 3c 3d 30 20 29 3b 0d 0a  K || cmp<=0 );..
346f0 20 20 20 20 69 66 28 20 63 6d 70 20 7c 7c 20 70      if( cmp || p
34700 32 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 20 62 72  2->bNomatch ) br
34710 65 61 6b 3b 0d 0a 20 20 20 20 72 63 20 3d 20 66  eak;..    rc = f
34720 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28  ts5ExprNodeNext(
34730 70 45 78 70 72 2c 20 70 31 2c 20 30 2c 20 30 29  pExpr, p1, 0, 0)
34740 3b 0d 0a 20 20 7d 0d 0a 20 20 70 4e 6f 64 65 2d  ;..  }..  pNode-
34750 3e 62 45 6f 66 20 3d 20 70 31 2d 3e 62 45 6f 66  >bEof = p1->bEof
34760 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  ;..  pNode->bNom
34770 61 74 63 68 20 3d 20 70 31 2d 3e 62 4e 6f 6d 61  atch = p1->bNoma
34780 74 63 68 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 69  tch;..  pNode->i
34790 52 6f 77 69 64 20 3d 20 70 31 2d 3e 69 52 6f 77  Rowid = p1->iRow
347a0 69 64 3b 0d 0a 20 20 69 66 28 20 70 31 2d 3e 62  id;..  if( p1->b
347b0 45 6f 66 20 29 7b 0d 0a 20 20 20 20 66 74 73 35  Eof ){..    fts5
347c0 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50 6f 73 6c  ExprNodeZeroPosl
347d0 69 73 74 28 70 32 29 3b 0d 0a 20 20 7d 0d 0a 20  ist(p2);..  }.. 
347e0 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a   return rc;..}..
347f0 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
34800 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f  5ExprNodeNext_NO
34810 54 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a  T(..  Fts5Expr *
34820 70 45 78 70 72 2c 20 0d 0a 20 20 46 74 73 35 45  pExpr, ..  Fts5E
34830 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0d  xprNode *pNode,.
34840 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69  .  int bFromVali
34850 64 2c 0d 0a 20 20 69 36 34 20 69 46 72 6f 6d 0d  d,..  i64 iFrom.
34860 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20  .){..  int rc = 
34870 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
34880 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 2d 3e 61  (pExpr, pNode->a
34890 70 43 68 69 6c 64 5b 30 5d 2c 20 62 46 72 6f 6d  pChild[0], bFrom
348a0 56 61 6c 69 64 2c 20 69 46 72 6f 6d 29 3b 0d 0a  Valid, iFrom);..
348b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
348c0 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d  _OK ){..    rc =
348d0 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73   fts5ExprNodeTes
348e0 74 5f 4e 4f 54 28 70 45 78 70 72 2c 20 70 4e 6f  t_NOT(pExpr, pNo
348f0 64 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28  de);..  }..  if(
34900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34910 7b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 4e  {..    pNode->bN
34920 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 7d  omatch = 0;..  }
34930 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
34940 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 70  }..../*..** If p
34950 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 70  Node currently p
34960 6f 69 6e 74 73 20 74 6f 20 61 20 6d 61 74 63 68  oints to a match
34970 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
34980 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
34990 4b 0d 0a 2a 2a 20 77 69 74 68 6f 75 74 20 6d 6f  K..** without mo
349a0 64 69 66 79 69 6e 67 20 69 74 2e 20 4f 74 68 65  difying it. Othe
349b0 72 77 69 73 65 2c 20 70 4e 6f 64 65 20 69 73 20  rwise, pNode is 
349c0 61 64 76 61 6e 63 65 64 20 75 6e 74 69 6c 20 69  advanced until i
349d0 74 20 64 6f 65 73 20 70 6f 69 6e 74 0d 0a 2a 2a  t does point..**
349e0 20 74 6f 20 61 20 6d 61 74 63 68 20 6f 72 20 45   to a match or E
349f0 4f 46 20 69 73 20 72 65 61 63 68 65 64 2e 0d 0a  OF is reached...
34a00 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */..static int f
34a10 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 28  ts5ExprNodeTest(
34a20 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  ..  Fts5Expr *pE
34a30 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
34a40 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
34a50 6e 20 6f 66 20 77 68 69 63 68 20 70 4e 6f 64 65  n of which pNode
34a60 20 69 73 20 61 20 70 61 72 74 20 2a 2f 0d 0a 20   is a part */.. 
34a70 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
34a80 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Node            
34a90 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6e   /* Expression n
34aa0 6f 64 65 20 74 6f 20 74 65 73 74 20 2a 2f 0d 0a  ode to test */..
34ab0 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ){..  int rc = S
34ac0 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28  QLITE_OK;..  if(
34ad0 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20   pNode->bEof==0 
34ae0 29 7b 0d 0a 20 20 20 20 73 77 69 74 63 68 28 20  ){..    switch( 
34af0 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0d  pNode->eType ){.
34b00 0a 0d 0a 20 20 20 20 20 20 63 61 73 65 20 46 54  ...      case FT
34b10 53 35 5f 53 54 52 49 4e 47 3a 20 7b 0d 0a 20 20  S5_STRING: {..  
34b20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45        rc = fts5E
34b30 78 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52 49  xprNodeTest_STRI
34b40 4e 47 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29  NG(pExpr, pNode)
34b50 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;..        break
34b60 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
34b70 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 54 45      case FTS5_TE
34b80 52 4d 3a 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  RM: {..        r
34b90 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
34ba0 54 65 73 74 5f 54 45 52 4d 28 70 45 78 70 72 2c  Test_TERM(pExpr,
34bb0 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 20 20 20 20   pNode);..      
34bc0 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
34bd0 7d 0d 0a 0d 0a 20 20 20 20 20 20 63 61 73 65 20  }....      case 
34be0 46 54 53 35 5f 41 4e 44 3a 20 7b 0d 0a 20 20 20  FTS5_AND: {..   
34bf0 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78       rc = fts5Ex
34c00 70 72 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28 70  prNodeTest_AND(p
34c10 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20  Expr, pNode);.. 
34c20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
34c30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
34c40 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20 7b 0d  case FTS5_OR: {.
34c50 0a 20 20 20 20 20 20 20 20 66 74 73 35 45 78 70  .        fts5Exp
34c60 72 4e 6f 64 65 54 65 73 74 5f 4f 52 28 70 45 78  rNodeTest_OR(pEx
34c70 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 20  pr, pNode);..   
34c80 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
34c90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 64 65     }....      de
34ca0 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
34cb0 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Node->eType==FTS
34cc0 35 5f 4e 4f 54 20 29 3b 20 7b 0d 0a 20 20 20 20  5_NOT ); {..    
34cd0 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
34ce0 72 4e 6f 64 65 54 65 73 74 5f 4e 4f 54 28 70 45  rNodeTest_NOT(pE
34cf0 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20  xpr, pNode);..  
34d00 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
34d10 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
34d20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  }..  return rc;.
34d30 0a 7d 0d 0a 0d 0a 20 0d 0a 2f 2a 0d 0a 2a 2a 20  .}.... ../*..** 
34d40 53 65 74 20 6e 6f 64 65 20 70 4e 6f 64 65 2c 20  Set node pNode, 
34d50 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66  which is part of
34d60 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
34d70 72 2c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  r, to point to t
34d80 68 65 20 66 69 72 73 74 0d 0a 2a 2a 20 6d 61 74  he first..** mat
34d90 63 68 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ch. If there are
34da0 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 73 65 74   no matches, set
34db0 20 74 68 65 20 4e 6f 64 65 2e 62 45 6f 66 20 66   the Node.bEof f
34dc0 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20  lag to indicate 
34dd0 45 4f 46 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74  EOF...**..** Ret
34de0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
34df0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
34e00 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20  rror occurs, or 
34e10 53 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77  SQLITE_OK otherw
34e20 69 73 65 2e 0d 0a 2a 2a 20 49 74 20 69 73 20 6e  ise...** It is n
34e30 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ot an error if t
34e40 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
34e50 68 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  hes...*/..static
34e60 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64   int fts5ExprNod
34e70 65 46 69 72 73 74 28 46 74 73 35 45 78 70 72 20  eFirst(Fts5Expr 
34e80 2a 70 45 78 70 72 2c 20 46 74 73 35 45 78 70 72  *pExpr, Fts5Expr
34e90 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0d 0a 20  Node *pNode){.. 
34ea0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34eb0 5f 4f 4b 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62  _OK;..  pNode->b
34ec0 45 6f 66 20 3d 20 30 3b 0d 0a 20 20 70 4e 6f 64  Eof = 0;..  pNod
34ed0 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b  e->bNomatch = 0;
34ee0 0d 0a 0d 0a 20 20 69 66 28 20 46 74 73 35 4e 6f  ....  if( Fts5No
34ef0 64 65 49 73 53 74 72 69 6e 67 28 70 4e 6f 64 65  deIsString(pNode
34f00 29 20 29 7b 0d 0a 20 20 20 20 2f 2a 20 49 6e 69  ) ){..    /* Ini
34f10 74 69 61 6c 69 7a 65 20 61 6c 6c 20 74 65 72 6d  tialize all term
34f20 20 69 74 65 72 61 74 6f 72 73 20 69 6e 20 74 68   iterators in th
34f30 65 20 4e 45 41 52 20 6f 62 6a 65 63 74 2e 20 2a  e NEAR object. *
34f40 2f 0d 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  /..    rc = fts5
34f50 45 78 70 72 4e 65 61 72 49 6e 69 74 41 6c 6c 28  ExprNearInitAll(
34f60 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a  pExpr, pNode);..
34f70 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 6f 64    }else if( pNod
34f80 65 2d 3e 78 4e 65 78 74 3d 3d 30 20 29 7b 0d 0a  e->xNext==0 ){..
34f90 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20      pNode->bEof 
34fa0 3d 20 31 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a  = 1;..  }else{..
34fb0 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20      int i;..    
34fc0 69 6e 74 20 6e 45 6f 66 20 3d 20 30 3b 0d 0a 20  int nEof = 0;.. 
34fd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
34fe0 6f 64 65 2d 3e 6e 43 68 69 6c 64 20 26 26 20 72  ode->nChild && r
34ff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
35000 2b 29 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 45  +){..      Fts5E
35010 78 70 72 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20  xprNode *pChild 
35020 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  = pNode->apChild
35030 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 72 63 20 3d  [i];..      rc =
35040 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72   fts5ExprNodeFir
35050 73 74 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 2d  st(pExpr, pNode-
35060 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20  >apChild[i]);.. 
35070 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68       assert( pCh
35080 69 6c 64 2d 3e 62 45 6f 66 3d 3d 30 20 7c 7c 20  ild->bEof==0 || 
35090 70 43 68 69 6c 64 2d 3e 62 45 6f 66 3d 3d 31 20  pChild->bEof==1 
350a0 29 3b 0d 0a 20 20 20 20 20 20 6e 45 6f 66 20 2b  );..      nEof +
350b0 3d 20 70 43 68 69 6c 64 2d 3e 62 45 6f 66 3b 0d  = pChild->bEof;.
350c0 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 4e 6f 64  .    }..    pNod
350d0 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 4e 6f 64  e->iRowid = pNod
350e0 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2d 3e 69  e->apChild[0]->i
350f0 52 6f 77 69 64 3b 0d 0a 0d 0a 20 20 20 20 73 77  Rowid;....    sw
35100 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79  itch( pNode->eTy
35110 70 65 20 29 7b 0d 0a 20 20 20 20 20 20 63 61 73  pe ){..      cas
35120 65 20 46 54 53 35 5f 41 4e 44 3a 0d 0a 20 20 20  e FTS5_AND:..   
35130 20 20 20 20 20 69 66 28 20 6e 45 6f 66 3e 30 20       if( nEof>0 
35140 29 20 66 74 73 35 45 78 70 72 53 65 74 45 6f 66  ) fts5ExprSetEof
35150 28 70 4e 6f 64 65 29 3b 0d 0a 20 20 20 20 20 20  (pNode);..      
35160 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20    break;....    
35170 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 0d    case FTS5_OR:.
35180 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f  .        if( pNo
35190 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 6e 45 6f 66  de->nChild==nEof
351a0 20 29 20 66 74 73 35 45 78 70 72 53 65 74 45 6f   ) fts5ExprSetEo
351b0 66 28 70 4e 6f 64 65 29 3b 0d 0a 20 20 20 20 20  f(pNode);..     
351c0 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20     break;....   
351d0 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 20     default:..   
351e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f       assert( pNo
351f0 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  de->eType==FTS5_
35200 4e 4f 54 20 29 3b 0d 0a 20 20 20 20 20 20 20 20  NOT );..        
35210 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 70 4e  pNode->bEof = pN
35220 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2d  ode->apChild[0]-
35230 3e 62 45 6f 66 3b 0d 0a 20 20 20 20 20 20 20 20  >bEof;..        
35240 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20  break;..    }.. 
35250 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d   }....  if( rc==
35260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20  SQLITE_OK ){..  
35270 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
35280 6f 64 65 54 65 73 74 28 70 45 78 70 72 2c 20 70  odeTest(pExpr, p
35290 4e 6f 64 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72  Node);..  }..  r
352a0 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
352b0 0d 0a 2f 2a 0d 0a 2a 2a 20 42 65 67 69 6e 20 69  ../*..** Begin i
352c0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
352d0 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
352e0 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 70  ments in index p
352f0 49 64 78 20 6d 61 74 63 68 65 64 20 62 79 0d 0a  Idx matched by..
35300 2a 2a 20 74 68 65 20 4d 41 54 43 48 20 65 78 70  ** the MATCH exp
35310 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
35320 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
35330 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 22 62 44  ment. If the "bD
35340 65 73 63 22 20 0d 0a 2a 2a 20 70 61 72 61 6d 65  esc" ..** parame
35350 74 65 72 20 69 73 20 70 61 73 73 65 64 20 61 20  ter is passed a 
35360 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
35370 69 74 65 72 61 74 69 6f 6e 20 69 73 20 69 6e 20  iteration is in 
35380 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64  descending rowid
35390 20 0d 0a 2a 2a 20 6f 72 64 65 72 2e 20 4f 72 2c   ..** order. Or,
353a0 20 69 66 20 69 74 20 69 73 20 7a 65 72 6f 2c 20   if it is zero, 
353b0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
353c0 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 69  er...**..** If i
353d0 74 65 72 61 74 69 6e 67 20 69 6e 20 61 73 63 65  terating in asce
353e0 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
353f0 72 20 28 62 44 65 73 63 3d 3d 30 29 2c 20 74 68  r (bDesc==0), th
35400 65 20 66 69 72 73 74 20 64 6f 63 75 6d 65 6e 74  e first document
35410 0d 0a 2a 2a 20 76 69 73 69 74 65 64 20 69 73 20  ..** visited is 
35420 74 68 61 74 20 77 69 74 68 20 74 68 65 20 73 6d  that with the sm
35430 61 6c 6c 65 73 74 20 72 6f 77 69 64 20 74 68 61  allest rowid tha
35440 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
35450 20 6f 72 20 65 71 75 61 6c 0d 0a 2a 2a 20 74 6f   or equal..** to
35460 20 70 61 72 61 6d 65 74 65 72 20 69 46 69 72 73   parameter iFirs
35470 74 2e 20 4f 72 2c 20 69 66 20 69 74 65 72 61 74  t. Or, if iterat
35480 69 6e 67 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ing in ascending
35490 20 6f 72 64 65 72 20 28 62 44 65 73 63 3d 3d 31   order (bDesc==1
354a0 29 2c 0d 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ),..** then the 
354b0 66 69 72 73 74 20 64 6f 63 75 6d 65 6e 74 20 76  first document v
354c0 69 73 69 74 65 64 20 6d 75 73 74 20 68 61 76 65  isited must have
354d0 20 61 20 72 6f 77 69 64 20 73 6d 61 6c 6c 65 72   a rowid smaller
354e0 20 74 68 61 6e 20 6f 72 0d 0a 2a 2a 20 65 71 75   than or..** equ
354f0 61 6c 20 74 6f 20 69 46 69 72 73 74 2e 0d 0a 2a  al to iFirst...*
35500 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  *..** Return SQL
35510 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
35520 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
35530 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
35540 68 65 72 77 69 73 65 2e 20 49 74 0d 0a 2a 2a 20  herwise. It..** 
35550 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
35560 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
35570 65 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  e query does not
35580 20 6d 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d   match any docum
35590 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  ents...*/..stati
355a0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
355b0 35 45 78 70 72 46 69 72 73 74 28 46 74 73 35 45  5ExprFirst(Fts5E
355c0 78 70 72 20 2a 70 2c 20 46 74 73 35 49 6e 64 65  xpr *p, Fts5Inde
355d0 78 20 2a 70 49 64 78 2c 20 69 36 34 20 69 46 69  x *pIdx, i64 iFi
355e0 72 73 74 2c 20 69 6e 74 20 62 44 65 73 63 29 7b  rst, int bDesc){
355f0 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ..  Fts5ExprNode
35600 20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52 6f   *pRoot = p->pRo
35610 6f 74 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 20 20  ot;..  int rc;  
35620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35630 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
35640 20 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20 20 70 2d   code */....  p-
35650 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0d  >pIndex = pIdx;.
35660 0a 20 20 70 2d 3e 62 44 65 73 63 20 3d 20 62 44  .  p->bDesc = bD
35670 65 73 63 3b 0d 0a 20 20 72 63 20 3d 20 66 74 73  esc;..  rc = fts
35680 35 45 78 70 72 4e 6f 64 65 46 69 72 73 74 28 70  5ExprNodeFirst(p
35690 2c 20 70 52 6f 6f 74 29 3b 0d 0a 0d 0a 20 20 2f  , pRoot);....  /
356a0 2a 20 49 66 20 6e 6f 74 20 61 74 20 45 4f 46 20  * If not at EOF 
356b0 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  but the current 
356c0 72 6f 77 69 64 20 6f 63 63 75 72 73 20 65 61 72  rowid occurs ear
356d0 6c 69 65 72 20 74 68 61 6e 20 69 46 69 72 73 74  lier than iFirst
356e0 20 69 6e 0d 0a 20 20 2a 2a 20 74 68 65 20 69 74   in..  ** the it
356f0 65 72 61 74 69 6f 6e 20 6f 72 64 65 72 2c 20 6d  eration order, m
35700 6f 76 65 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20  ove to document 
35710 69 46 69 72 73 74 20 6f 72 20 6c 61 74 65 72 2e  iFirst or later.
35720 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53   */..  if( rc==S
35730 51 4c 49 54 45 5f 4f 4b 20 0d 0a 20 20 20 26 26  QLITE_OK ..   &&
35740 20 30 3d 3d 70 52 6f 6f 74 2d 3e 62 45 6f 66 20   0==pRoot->bEof 
35750 0d 0a 20 20 20 26 26 20 66 74 73 35 52 6f 77 69  ..   && fts5Rowi
35760 64 43 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69  dCmp(p, pRoot->i
35770 52 6f 77 69 64 2c 20 69 46 69 72 73 74 29 3c 30  Rowid, iFirst)<0
35780 20 0d 0a 20 20 29 7b 0d 0a 20 20 20 20 72 63 20   ..  ){..    rc 
35790 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  = fts5ExprNodeNe
357a0 78 74 28 70 2c 20 70 52 6f 6f 74 2c 20 31 2c 20  xt(p, pRoot, 1, 
357b0 69 46 69 72 73 74 29 3b 0d 0a 20 20 7d 0d 0a 0d  iFirst);..  }...
357c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 74 65  .  /* If the ite
357d0 72 61 74 6f 72 20 69 73 20 6e 6f 74 20 61 74 20  rator is not at 
357e0 61 20 72 65 61 6c 20 6d 61 74 63 68 2c 20 73 6b  a real match, sk
357f0 69 70 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c  ip forward until
35800 20 69 74 20 69 73 2e 20 2a 2f 0d 0a 20 20 77 68   it is. */..  wh
35810 69 6c 65 28 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d  ile( pRoot->bNom
35820 61 74 63 68 20 29 7b 0d 0a 20 20 20 20 61 73 73  atch ){..    ass
35830 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62 45 6f 66  ert( pRoot->bEof
35840 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
35850 45 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20 72 63 20  E_OK );..    rc 
35860 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  = fts5ExprNodeNe
35870 78 74 28 70 2c 20 70 52 6f 6f 74 2c 20 30 2c 20  xt(p, pRoot, 0, 
35880 30 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75  0);..  }..  retu
35890 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  rn rc;..}..../*.
358a0 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
358b0 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 0d 0a  next document ..
358c0 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  **..** Return SQ
358d0 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
358e0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
358f0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
35900 74 68 65 72 77 69 73 65 2e 20 49 74 0d 0a 2a 2a  therwise. It..**
35910 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
35920 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
35930 68 65 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  he query does no
35940 74 20 6d 61 74 63 68 20 61 6e 79 20 64 6f 63 75  t match any docu
35950 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  ments...*/..stat
35960 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
35970 73 35 45 78 70 72 4e 65 78 74 28 46 74 73 35 45  s5ExprNext(Fts5E
35980 78 70 72 20 2a 70 2c 20 69 36 34 20 69 4c 61 73  xpr *p, i64 iLas
35990 74 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a  t){..  int rc;..
359a0 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
359b0 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52 6f 6f 74  pRoot = p->pRoot
359c0 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ;..  assert( pRo
359d0 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70  ot->bEof==0 && p
359e0 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 3d 3d  Root->bNomatch==
359f0 30 20 29 3b 0d 0a 20 20 64 6f 20 7b 0d 0a 20 20  0 );..  do {..  
35a00 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
35a10 6f 64 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74  odeNext(p, pRoot
35a20 2c 20 30 2c 20 30 29 3b 0d 0a 20 20 20 20 61 73  , 0, 0);..    as
35a30 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62 4e 6f  sert( pRoot->bNo
35a40 6d 61 74 63 68 3d 3d 30 20 7c 7c 20 28 72 63 3d  match==0 || (rc=
35a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52  =SQLITE_OK && pR
35a60 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 29 20 29 3b  oot->bEof==0) );
35a70 0d 0a 20 20 7d 77 68 69 6c 65 28 20 70 52 6f 6f  ..  }while( pRoo
35a80 74 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 3b 0d 0a  t->bNomatch );..
35a90 20 20 69 66 28 20 66 74 73 35 52 6f 77 69 64 43    if( fts5RowidC
35aa0 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69 52 6f  mp(p, pRoot->iRo
35ab0 77 69 64 2c 20 69 4c 61 73 74 29 3e 30 20 29 7b  wid, iLast)>0 ){
35ac0 0d 0a 20 20 20 20 70 52 6f 6f 74 2d 3e 62 45 6f  ..    pRoot->bEo
35ad0 66 20 3d 20 31 3b 0d 0a 20 20 7d 0d 0a 20 20 72  f = 1;..  }..  r
35ae0 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
35af0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
35b00 65 33 46 74 73 35 45 78 70 72 45 6f 66 28 46 74  e3Fts5ExprEof(Ft
35b10 73 35 45 78 70 72 20 2a 70 29 7b 0d 0a 20 20 72  s5Expr *p){..  r
35b20 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e  eturn p->pRoot->
35b30 62 45 6f 66 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74  bEof;..}....stat
35b40 69 63 20 69 36 34 20 73 71 6c 69 74 65 33 46 74  ic i64 sqlite3Ft
35b50 73 35 45 78 70 72 52 6f 77 69 64 28 46 74 73 35  s5ExprRowid(Fts5
35b60 45 78 70 72 20 2a 70 29 7b 0d 0a 20 20 72 65 74  Expr *p){..  ret
35b70 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e 69 52  urn p->pRoot->iR
35b80 6f 77 69 64 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74  owid;..}....stat
35b90 69 63 20 69 6e 74 20 66 74 73 35 50 61 72 73 65  ic int fts5Parse
35ba0 53 74 72 69 6e 67 46 72 6f 6d 54 6f 6b 65 6e 28  StringFromToken(
35bb0 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  Fts5Token *pToke
35bc0 6e 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0d 0a  n, char **pz){..
35bd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35be0 45 5f 4f 4b 3b 0d 0a 20 20 2a 70 7a 20 3d 20 73  E_OK;..  *pz = s
35bf0 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75  qlite3Fts5Strndu
35c00 70 28 26 72 63 2c 20 70 54 6f 6b 65 6e 2d 3e 70  p(&rc, pToken->p
35c10 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0d 0a 20  , pToken->n);.. 
35c20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a   return rc;..}..
35c30 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68  ../*..** Free th
35c40 65 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20  e phrase object 
35c50 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
35c60 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f  ly argument...*/
35c70 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
35c80 73 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65  s5ExprPhraseFree
35c90 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20  (Fts5ExprPhrase 
35ca0 2a 70 50 68 72 61 73 65 29 7b 0d 0a 20 20 69 66  *pPhrase){..  if
35cb0 28 20 70 50 68 72 61 73 65 20 29 7b 0d 0a 20 20  ( pPhrase ){..  
35cc0 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 66 6f    int i;..    fo
35cd0 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65  r(i=0; i<pPhrase
35ce0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a  ->nTerm; i++){..
35cf0 20 20 20 20 20 20 46 74 73 35 45 78 70 72 54 65        Fts5ExprTe
35d00 72 6d 20 2a 70 53 79 6e 3b 0d 0a 20 20 20 20 20  rm *pSyn;..     
35d10 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
35d20 4e 65 78 74 3b 0d 0a 20 20 20 20 20 20 46 74 73  Next;..      Fts
35d30 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
35d40 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54 65   = &pPhrase->aTe
35d50 72 6d 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 73 71  rm[i];..      sq
35d60 6c 69 74 65 33 5f 66 72 65 65 28 70 54 65 72 6d  lite3_free(pTerm
35d70 2d 3e 7a 54 65 72 6d 29 3b 0d 0a 20 20 20 20 20  ->zTerm);..     
35d80 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
35d90 43 6c 6f 73 65 28 70 54 65 72 6d 2d 3e 70 49 74  Close(pTerm->pIt
35da0 65 72 29 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28  er);..      for(
35db0 70 53 79 6e 3d 70 54 65 72 6d 2d 3e 70 53 79 6e  pSyn=pTerm->pSyn
35dc0 6f 6e 79 6d 3b 20 70 53 79 6e 3b 20 70 53 79 6e  onym; pSyn; pSyn
35dd0 3d 70 4e 65 78 74 29 7b 0d 0a 20 20 20 20 20 20  =pNext){..      
35de0 20 20 70 4e 65 78 74 20 3d 20 70 53 79 6e 2d 3e    pNext = pSyn->
35df0 70 53 79 6e 6f 6e 79 6d 3b 0d 0a 20 20 20 20 20  pSynonym;..     
35e00 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74     sqlite3Fts5It
35e10 65 72 43 6c 6f 73 65 28 70 53 79 6e 2d 3e 70 49  erClose(pSyn->pI
35e20 74 65 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 66  ter);..        f
35e30 74 73 35 42 75 66 66 65 72 46 72 65 65 28 28 46  ts5BufferFree((F
35e40 74 73 35 42 75 66 66 65 72 2a 29 26 70 53 79 6e  ts5Buffer*)&pSyn
35e50 5b 31 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 73  [1]);..        s
35e60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 79 6e  qlite3_free(pSyn
35e70 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
35e80 20 7d 0d 0a 20 20 20 20 69 66 28 20 70 50 68 72   }..    if( pPhr
35e90 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 53 70  ase->poslist.nSp
35ea0 61 63 65 3e 30 20 29 20 66 74 73 35 42 75 66 66  ace>0 ) fts5Buff
35eb0 65 72 46 72 65 65 28 26 70 50 68 72 61 73 65 2d  erFree(&pPhrase-
35ec0 3e 70 6f 73 6c 69 73 74 29 3b 0d 0a 20 20 20 20  >poslist);..    
35ed0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 68  sqlite3_free(pPh
35ee0 72 61 73 65 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a  rase);..  }..}..
35ef0 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20 74 68 65  ../*..** Set the
35f00 20 22 62 46 69 72 73 74 22 20 66 6c 61 67 20 6f   "bFirst" flag o
35f10 6e 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b 65  n the first toke
35f20 6e 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20  n of the phrase 
35f30 70 61 73 73 65 64 20 61 73 20 74 68 65 0d 0a 2a  passed as the..*
35f40 2a 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  * only argument.
35f50 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69  ..*/..static voi
35f60 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
35f70 73 65 53 65 74 43 61 72 65 74 28 46 74 73 35 45  seSetCaret(Fts5E
35f80 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61  xprPhrase *pPhra
35f90 73 65 29 7b 0d 0a 20 20 69 66 28 20 70 50 68 72  se){..  if( pPhr
35fa0 61 73 65 20 26 26 20 70 50 68 72 61 73 65 2d 3e  ase && pPhrase->
35fb0 6e 54 65 72 6d 20 29 7b 0d 0a 20 20 20 20 70 50  nTerm ){..    pP
35fc0 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e  hrase->aTerm[0].
35fd0 62 46 69 72 73 74 20 3d 20 31 3b 0d 0a 20 20 7d  bFirst = 1;..  }
35fe0 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66  ..}..../*..** If
35ff0 20 61 72 67 75 6d 65 6e 74 20 70 4e 65 61 72 20   argument pNear 
36000 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20  is NULL, then a 
36010 6e 65 77 20 46 74 73 35 45 78 70 72 4e 65 61 72  new Fts5ExprNear
36020 73 65 74 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  set object is al
36030 6c 6f 63 61 74 65 64 0d 0a 2a 2a 20 61 6e 64 20  located..** and 
36040 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 70  populated with p
36050 50 68 72 61 73 65 2e 20 4f 72 2c 20 69 66 20 70  Phrase. Or, if p
36060 4e 65 61 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Near is not NULL
36070 2c 20 70 68 72 61 73 65 20 70 50 68 72 61 73 65  , phrase pPhrase
36080 20 69 73 0d 0a 2a 2a 20 61 70 70 65 6e 64 65 64   is..** appended
36090 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20 72   to it and the r
360a0 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 2e  esults returned.
360b0 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61 6e 20 4f  ..**..** If an O
360c0 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
360d0 20 62 6f 74 68 20 74 68 65 20 70 4e 65 61 72 20   both the pNear 
360e0 61 6e 64 20 70 50 68 72 61 73 65 20 6f 62 6a 65  and pPhrase obje
360f0 63 74 73 20 61 72 65 20 66 72 65 65 64 20 61 6e  cts are freed an
36100 64 0d 0a 2a 2a 20 4e 55 4c 4c 20 72 65 74 75 72  d..** NULL retur
36110 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ned...*/..static
36120 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
36130 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72   *sqlite3Fts5Par
36140 73 65 4e 65 61 72 73 65 74 28 0d 0a 20 20 46 74  seNearset(..  Ft
36150 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s5Parse *pParse,
36160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36170 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
36180 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61  /..  Fts5ExprNea
36190 72 73 65 74 20 2a 70 4e 65 61 72 2c 20 20 20 20  rset *pNear,    
361a0 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
361b0 20 6e 65 61 72 73 65 74 2c 20 6f 72 20 4e 55 4c   nearset, or NUL
361c0 4c 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72  L */..  Fts5Expr
361d0 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
361e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 65 6e          /* Recen
361f0 74 6c 79 20 70 61 72 73 65 64 20 70 68 72 61 73  tly parsed phras
36200 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73  e */..){..  cons
36210 74 20 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20  t int SZALLOC = 
36220 38 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 65  8;..  Fts5ExprNe
36230 61 72 73 65 74 20 2a 70 52 65 74 20 3d 20 30 3b  arset *pRet = 0;
36240 0d 0a 0d 0a 20 20 69 66 28 20 70 50 61 72 73 65  ....  if( pParse
36250 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
36260 29 7b 0d 0a 20 20 20 20 69 66 28 20 70 50 68 72  ){..    if( pPhr
36270 61 73 65 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20  ase==0 ){..     
36280 20 72 65 74 75 72 6e 20 70 4e 65 61 72 3b 0d 0a   return pNear;..
36290 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 70      }..    if( p
362a0 4e 65 61 72 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  Near==0 ){..    
362b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
362c0 6e 42 79 74 65 3b 0d 0a 20 20 20 20 20 20 6e 42  nByte;..      nB
362d0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
362e0 35 45 78 70 72 4e 65 61 72 73 65 74 29 20 2b 20  5ExprNearset) + 
362f0 53 5a 41 4c 4c 4f 43 20 2a 20 73 69 7a 65 6f 66  SZALLOC * sizeof
36300 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a  (Fts5ExprPhrase*
36310 29 3b 0d 0a 20 20 20 20 20 20 70 52 65 74 20 3d  );..      pRet =
36320 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
36330 34 28 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 20  4(nByte);..     
36340 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0d   if( pRet==0 ){.
36350 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
36360 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
36370 45 4d 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65  EM;..      }else
36380 7b 0d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  {..        memse
36390 74 28 70 52 65 74 2c 20 30 2c 20 28 73 69 7a 65  t(pRet, 0, (size
363a0 5f 74 29 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20  _t)nByte);..    
363b0 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65 20 69    }..    }else i
363c0 66 28 20 28 70 4e 65 61 72 2d 3e 6e 50 68 72 61  f( (pNear->nPhra
363d0 73 65 20 25 20 53 5a 41 4c 4c 4f 43 29 3d 3d 30  se % SZALLOC)==0
363e0 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e   ){..      int n
363f0 4e 65 77 20 3d 20 70 4e 65 61 72 2d 3e 6e 50 68  New = pNear->nPh
36400 72 61 73 65 20 2b 20 53 5a 41 4c 4c 4f 43 3b 0d  rase + SZALLOC;.
36410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
36420 6e 74 36 34 20 6e 42 79 74 65 3b 0d 0a 0d 0a 20  nt64 nByte;.... 
36430 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a       nByte = siz
36440 65 6f 66 28 46 74 73 35 45 78 70 72 4e 65 61 72  eof(Fts5ExprNear
36450 73 65 74 29 20 2b 20 6e 4e 65 77 20 2a 20 73 69  set) + nNew * si
36460 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72  zeof(Fts5ExprPhr
36470 61 73 65 2a 29 3b 0d 0a 20 20 20 20 20 20 70 52  ase*);..      pR
36480 65 74 20 3d 20 28 46 74 73 35 45 78 70 72 4e 65  et = (Fts5ExprNe
36490 61 72 73 65 74 2a 29 73 71 6c 69 74 65 33 5f 72  arset*)sqlite3_r
364a0 65 61 6c 6c 6f 63 36 34 28 70 4e 65 61 72 2c 20  ealloc64(pNear, 
364b0 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 20 20 69  nByte);..      i
364c0 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0d 0a 20  f( pRet==0 ){.. 
364d0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
364e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
364f0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
36500 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 52  }else{..      pR
36510 65 74 20 3d 20 70 4e 65 61 72 3b 0d 0a 20 20 20  et = pNear;..   
36520 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28   }..  }....  if(
36530 20 70 52 65 74 3d 3d 30 20 29 7b 0d 0a 20 20 20   pRet==0 ){..   
36540 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
36550 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
36560 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ;..    sqlite3Ft
36570 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72  s5ParseNearsetFr
36580 65 65 28 70 4e 65 61 72 29 3b 0d 0a 20 20 20 20  ee(pNear);..    
36590 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
365a0 50 68 72 61 73 65 46 72 65 65 28 70 50 68 72 61  PhraseFree(pPhra
365b0 73 65 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a  se);..  }else{..
365c0 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 6e 50      if( pRet->nP
365d0 68 72 61 73 65 3e 30 20 29 7b 0d 0a 20 20 20 20  hrase>0 ){..    
365e0 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
365f0 20 2a 70 4c 61 73 74 20 3d 20 70 52 65 74 2d 3e   *pLast = pRet->
36600 61 70 50 68 72 61 73 65 5b 70 52 65 74 2d 3e 6e  apPhrase[pRet->n
36610 50 68 72 61 73 65 2d 31 5d 3b 0d 0a 20 20 20 20  Phrase-1];..    
36620 20 20 61 73 73 65 72 74 28 20 70 4c 61 73 74 3d    assert( pLast=
36630 3d 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73  =pParse->apPhras
36640 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73  e[pParse->nPhras
36650 65 2d 32 5d 20 29 3b 0d 0a 20 20 20 20 20 20 69  e-2] );..      i
36660 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72  f( pPhrase->nTer
36670 6d 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20  m==0 ){..       
36680 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65 46   fts5ExprPhraseF
36690 72 65 65 28 70 50 68 72 61 73 65 29 3b 0d 0a 20  ree(pPhrase);.. 
366a0 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68         pRet->nPh
366b0 72 61 73 65 2d 2d 3b 0d 0a 20 20 20 20 20 20 20  rase--;..       
366c0 20 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65   pParse->nPhrase
366d0 2d 2d 3b 0d 0a 20 20 20 20 20 20 20 20 70 50 68  --;..        pPh
366e0 72 61 73 65 20 3d 20 70 4c 61 73 74 3b 0d 0a 20  rase = pLast;.. 
366f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
36700 4c 61 73 74 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29  Last->nTerm==0 )
36710 7b 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35 45  {..        fts5E
36720 78 70 72 50 68 72 61 73 65 46 72 65 65 28 70 4c  xprPhraseFree(pL
36730 61 73 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 70  ast);..        p
36740 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65 5b  Parse->apPhrase[
36750 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d  pParse->nPhrase-
36760 32 5d 20 3d 20 70 50 68 72 61 73 65 3b 0d 0a 20  2] = pPhrase;.. 
36770 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
36780 50 68 72 61 73 65 2d 2d 3b 0d 0a 20 20 20 20 20  Phrase--;..     
36790 20 20 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65     pRet->nPhrase
367a0 2d 2d 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  --;..      }..  
367b0 20 20 7d 0d 0a 20 20 20 20 70 52 65 74 2d 3e 61    }..    pRet->a
367c0 70 50 68 72 61 73 65 5b 70 52 65 74 2d 3e 6e 50  pPhrase[pRet->nP
367d0 68 72 61 73 65 2b 2b 5d 20 3d 20 70 50 68 72 61  hrase++] = pPhra
367e0 73 65 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75  se;..  }..  retu
367f0 72 6e 20 70 52 65 74 3b 0d 0a 7d 0d 0a 0d 0a 74  rn pRet;..}....t
36800 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 6f  ypedef struct To
36810 6b 65 6e 43 74 78 20 54 6f 6b 65 6e 43 74 78 3b  kenCtx TokenCtx;
36820 0d 0a 73 74 72 75 63 74 20 54 6f 6b 65 6e 43 74  ..struct TokenCt
36830 78 20 7b 0d 0a 20 20 46 74 73 35 45 78 70 72 50  x {..  Fts5ExprP
36840 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 3b 0d  hrase *pPhrase;.
36850 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 7d 3b 0d 0a  .  int rc;..};..
36860 0d 0a 2f 2a 0d 0a 2a 2a 20 43 61 6c 6c 62 61 63  ../*..** Callbac
36870 6b 20 66 6f 72 20 74 6f 6b 65 6e 69 7a 69 6e 67  k for tokenizing
36880 20 74 65 72 6d 73 20 75 73 65 64 20 62 79 20 50   terms used by P
36890 61 72 73 65 54 65 72 6d 28 29 2e 0d 0a 2a 2f 0d  arseTerm()...*/.
368a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
368b0 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65 28 0d 0a  ParseTokenize(..
368c0 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
368d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
368e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
368f0 46 74 73 35 49 6e 73 65 72 74 43 74 78 20 6f 62  Fts5InsertCtx ob
36900 6a 65 63 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 74  ject */..  int t
36910 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
36920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
36930 73 6b 20 6f 66 20 46 54 53 35 5f 54 4f 4b 45 4e  sk of FTS5_TOKEN
36940 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a 20 20 63  _* flags */..  c
36950 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
36960 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
36970 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
36980 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20  ing token */..  
36990 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
369a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369b0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65 6e  /* Size of token
369c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20 20   in bytes */..  
369d0 69 6e 74 20 69 55 6e 75 73 65 64 31 2c 20 20 20  int iUnused1,   
369e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369f0 2f 2a 20 53 74 61 72 74 20 6f 66 66 73 65 74 20  /* Start offset 
36a00 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 20 20 69  of token */..  i
36a10 6e 74 20 69 55 6e 75 73 65 64 32 20 20 20 20 20  nt iUnused2     
36a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36a30 2a 20 45 6e 64 20 6f 66 66 73 65 74 20 6f 66 20  * End offset of 
36a40 74 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b 0d 0a 20 20  token */..){..  
36a50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36a60 4f 4b 3b 0d 0a 20 20 63 6f 6e 73 74 20 69 6e 74  OK;..  const int
36a70 20 53 5a 41 4c 4c 4f 43 20 3d 20 38 3b 0d 0a 20   SZALLOC = 8;.. 
36a80 20 54 6f 6b 65 6e 43 74 78 20 2a 70 43 74 78 20   TokenCtx *pCtx 
36a90 3d 20 28 54 6f 6b 65 6e 43 74 78 2a 29 70 43 6f  = (TokenCtx*)pCo
36aa0 6e 74 65 78 74 3b 0d 0a 20 20 46 74 73 35 45 78  ntext;..  Fts5Ex
36ab0 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
36ac0 65 20 3d 20 70 43 74 78 2d 3e 70 50 68 72 61 73  e = pCtx->pPhras
36ad0 65 3b 0d 0a 0d 0a 20 20 55 4e 55 53 45 44 5f 50  e;....  UNUSED_P
36ae0 41 52 41 4d 32 28 69 55 6e 75 73 65 64 31 2c 20  ARAM2(iUnused1, 
36af0 69 55 6e 75 73 65 64 32 29 3b 0d 0a 0d 0a 20 20  iUnused2);....  
36b00 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  /* If an error h
36b10 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
36b20 72 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  red, this is a n
36b30 6f 2d 6f 70 20 2a 2f 0d 0a 20 20 69 66 28 20 70  o-op */..  if( p
36b40 43 74 78 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  Ctx->rc!=SQLITE_
36b50 4f 4b 20 29 20 72 65 74 75 72 6e 20 70 43 74 78  OK ) return pCtx
36b60 2d 3e 72 63 3b 0d 0a 20 20 69 66 28 20 6e 54 6f  ->rc;..  if( nTo
36b70 6b 65 6e 3e 46 54 53 35 5f 4d 41 58 5f 54 4f 4b  ken>FTS5_MAX_TOK
36b80 45 4e 5f 53 49 5a 45 20 29 20 6e 54 6f 6b 65 6e  EN_SIZE ) nToken
36b90 20 3d 20 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45   = FTS5_MAX_TOKE
36ba0 4e 5f 53 49 5a 45 3b 0d 0a 0d 0a 20 20 69 66 28  N_SIZE;....  if(
36bb0 20 70 50 68 72 61 73 65 20 26 26 20 70 50 68 72   pPhrase && pPhr
36bc0 61 73 65 2d 3e 6e 54 65 72 6d 3e 30 20 26 26 20  ase->nTerm>0 && 
36bd0 28 74 66 6c 61 67 73 20 26 20 46 54 53 35 5f 54  (tflags & FTS5_T
36be0 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 29 20  OKEN_COLOCATED) 
36bf0 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78 70 72  ){..    Fts5Expr
36c00 54 65 72 6d 20 2a 70 53 79 6e 3b 0d 0a 20 20 20  Term *pSyn;..   
36c10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
36c20 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
36c30 73 35 45 78 70 72 54 65 72 6d 29 20 2b 20 73 69  s5ExprTerm) + si
36c40 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
36c50 20 2b 20 6e 54 6f 6b 65 6e 2b 31 3b 0d 0a 20 20   + nToken+1;..  
36c60 20 20 70 53 79 6e 20 3d 20 28 46 74 73 35 45 78    pSyn = (Fts5Ex
36c70 70 72 54 65 72 6d 2a 29 73 71 6c 69 74 65 33 5f  prTerm*)sqlite3_
36c80 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
36c90 0d 0a 20 20 20 20 69 66 28 20 70 53 79 6e 3d 3d  ..    if( pSyn==
36ca0 30 20 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d  0 ){..      rc =
36cb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a   SQLITE_NOMEM;..
36cc0 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
36cd0 20 20 6d 65 6d 73 65 74 28 70 53 79 6e 2c 20 30    memset(pSyn, 0
36ce0 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79 74 65 29  , (size_t)nByte)
36cf0 3b 0d 0a 20 20 20 20 20 20 70 53 79 6e 2d 3e 7a  ;..      pSyn->z
36d00 54 65 72 6d 20 3d 20 28 28 63 68 61 72 2a 29 70  Term = ((char*)p
36d10 53 79 6e 29 20 2b 20 73 69 7a 65 6f 66 28 46 74  Syn) + sizeof(Ft
36d20 73 35 45 78 70 72 54 65 72 6d 29 20 2b 20 73 69  s5ExprTerm) + si
36d30 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
36d40 3b 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ;..      memcpy(
36d50 70 53 79 6e 2d 3e 7a 54 65 72 6d 2c 20 70 54 6f  pSyn->zTerm, pTo
36d60 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0d 0a 20  ken, nToken);.. 
36d70 20 20 20 20 20 70 53 79 6e 2d 3e 70 53 79 6e 6f       pSyn->pSyno
36d80 6e 79 6d 20 3d 20 70 50 68 72 61 73 65 2d 3e 61  nym = pPhrase->a
36d90 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e 54  Term[pPhrase->nT
36da0 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79 6d 3b  erm-1].pSynonym;
36db0 0d 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d  ..      pPhrase-
36dc0 3e 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e  >aTerm[pPhrase->
36dd0 6e 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79  nTerm-1].pSynony
36de0 6d 20 3d 20 70 53 79 6e 3b 0d 0a 20 20 20 20 7d  m = pSyn;..    }
36df0 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20  ..  }else{..    
36e00 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
36e10 65 72 6d 3b 0d 0a 20 20 20 20 69 66 28 20 70 50  erm;..    if( pP
36e20 68 72 61 73 65 3d 3d 30 20 7c 7c 20 28 70 50 68  hrase==0 || (pPh
36e30 72 61 73 65 2d 3e 6e 54 65 72 6d 20 25 20 53 5a  rase->nTerm % SZ
36e40 41 4c 4c 4f 43 29 3d 3d 30 20 29 7b 0d 0a 20 20  ALLOC)==0 ){..  
36e50 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
36e60 73 65 20 2a 70 4e 65 77 3b 0d 0a 20 20 20 20 20  se *pNew;..     
36e70 20 69 6e 74 20 6e 4e 65 77 20 3d 20 53 5a 41 4c   int nNew = SZAL
36e80 4c 4f 43 20 2b 20 28 70 50 68 72 61 73 65 20 3f  LOC + (pPhrase ?
36e90 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20   pPhrase->nTerm 
36ea0 3a 20 30 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 70  : 0);....      p
36eb0 4e 65 77 20 3d 20 28 46 74 73 35 45 78 70 72 50  New = (Fts5ExprP
36ec0 68 72 61 73 65 2a 29 73 71 6c 69 74 65 33 5f 72  hrase*)sqlite3_r
36ed0 65 61 6c 6c 6f 63 36 34 28 70 50 68 72 61 73 65  ealloc64(pPhrase
36ee0 2c 20 0d 0a 20 20 20 20 20 20 20 20 20 20 73 69  , ..          si
36ef0 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72  zeof(Fts5ExprPhr
36f00 61 73 65 29 20 2b 20 73 69 7a 65 6f 66 28 46 74  ase) + sizeof(Ft
36f10 73 35 45 78 70 72 54 65 72 6d 29 20 2a 20 6e 4e  s5ExprTerm) * nN
36f20 65 77 0d 0a 20 20 20 20 20 20 29 3b 0d 0a 20 20  ew..      );..  
36f30 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
36f40 29 7b 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ){..        rc =
36f50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a   SQLITE_NOMEM;..
36f60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20        }else{..  
36f70 20 20 20 20 20 20 69 66 28 20 70 50 68 72 61 73        if( pPhras
36f80 65 3d 3d 30 20 29 20 6d 65 6d 73 65 74 28 70 4e  e==0 ) memset(pN
36f90 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  ew, 0, sizeof(Ft
36fa0 73 35 45 78 70 72 50 68 72 61 73 65 29 29 3b 0d  s5ExprPhrase));.
36fb0 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 70  .        pCtx->p
36fc0 50 68 72 61 73 65 20 3d 20 70 50 68 72 61 73 65  Phrase = pPhrase
36fd0 20 3d 20 70 4e 65 77 3b 0d 0a 20 20 20 20 20 20   = pNew;..      
36fe0 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20    pNew->nTerm = 
36ff0 6e 4e 65 77 20 2d 20 53 5a 41 4c 4c 4f 43 3b 0d  nNew - SZALLOC;.
37000 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
37010 0a 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ...    if( rc==S
37020 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
37030 20 20 20 70 54 65 72 6d 20 3d 20 26 70 50 68 72     pTerm = &pPhr
37040 61 73 65 2d 3e 61 54 65 72 6d 5b 70 50 68 72 61  ase->aTerm[pPhra
37050 73 65 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0d 0a 20  se->nTerm++];.. 
37060 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 65 72       memset(pTer
37070 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
37080 35 45 78 70 72 54 65 72 6d 29 29 3b 0d 0a 20 20  5ExprTerm));..  
37090 20 20 20 20 70 54 65 72 6d 2d 3e 7a 54 65 72 6d      pTerm->zTerm
370a0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
370b0 72 6e 64 75 70 28 26 72 63 2c 20 70 54 6f 6b 65  rndup(&rc, pToke
370c0 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0d 0a 20 20 20  n, nToken);..   
370d0 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 70 43 74   }..  }....  pCt
370e0 78 2d 3e 72 63 20 3d 20 72 63 3b 0d 0a 20 20 72  x->rc = rc;..  r
370f0 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
37100 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68  ../*..** Free th
37110 65 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20  e phrase object 
37120 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
37130 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f  ly argument...*/
37140 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  ..static void sq
37150 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 50 68  lite3Fts5ParsePh
37160 72 61 73 65 46 72 65 65 28 46 74 73 35 45 78 70  raseFree(Fts5Exp
37170 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
37180 29 7b 0d 0a 20 20 66 74 73 35 45 78 70 72 50 68  ){..  fts5ExprPh
37190 72 61 73 65 46 72 65 65 28 70 50 68 72 61 73 65  raseFree(pPhrase
371a0 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  );..}..../*..** 
371b0 46 72 65 65 20 74 68 65 20 70 68 72 61 73 65 20  Free the phrase 
371c0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
371d0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
371e0 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  ment...*/..stati
371f0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  c void sqlite3Ft
37200 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72  s5ParseNearsetFr
37210 65 65 28 46 74 73 35 45 78 70 72 4e 65 61 72 73  ee(Fts5ExprNears
37220 65 74 20 2a 70 4e 65 61 72 29 7b 0d 0a 20 20 69  et *pNear){..  i
37230 66 28 20 70 4e 65 61 72 20 29 7b 0d 0a 20 20 20  f( pNear ){..   
37240 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20 66 6f 72   int i;..    for
37250 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e  (i=0; i<pNear->n
37260 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20  Phrase; i++){.. 
37270 20 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72       fts5ExprPhr
37280 61 73 65 46 72 65 65 28 70 4e 65 61 72 2d 3e 61  aseFree(pNear->a
37290 70 50 68 72 61 73 65 5b 69 5d 29 3b 0d 0a 20 20  pPhrase[i]);..  
372a0 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
372b0 5f 66 72 65 65 28 70 4e 65 61 72 2d 3e 70 43 6f  _free(pNear->pCo
372c0 6c 73 65 74 29 3b 0d 0a 20 20 20 20 73 71 6c 69  lset);..    sqli
372d0 74 65 33 5f 66 72 65 65 28 70 4e 65 61 72 29 3b  te3_free(pNear);
372e0 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61 74  ..  }..}....stat
372f0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
37300 74 73 35 50 61 72 73 65 46 69 6e 69 73 68 65 64  ts5ParseFinished
37310 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72  (Fts5Parse *pPar
37320 73 65 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65  se, Fts5ExprNode
37330 20 2a 70 29 7b 0d 0a 20 20 61 73 73 65 72 74 28   *p){..  assert(
37340 20 70 50 61 72 73 65 2d 3e 70 45 78 70 72 3d 3d   pParse->pExpr==
37350 30 20 29 3b 0d 0a 20 20 70 50 61 72 73 65 2d 3e  0 );..  pParse->
37360 70 45 78 70 72 20 3d 20 70 3b 0d 0a 7d 0d 0a 0d  pExpr = p;..}...
37370 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./*..** This fun
37380 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
37390 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
373a0 20 70 72 6f 63 65 73 73 20 61 20 73 74 72 69 6e   process a strin
373b0 67 20 74 6f 6b 65 6e 2e 20 54 68 65 0d 0a 2a 2a  g token. The..**
373c0 20 73 74 72 69 6e 67 20 6d 61 79 20 6f 72 20 6d   string may or m
373d0 61 79 20 6e 6f 74 20 62 65 20 71 75 6f 74 65 64  ay not be quoted
373e0 2e 20 49 6e 20 61 6e 79 20 63 61 73 65 20 69 74  . In any case it
373f0 20 69 73 20 74 6f 6b 65 6e 69 7a 65 64 20 61 6e   is tokenized an
37400 64 20 61 0d 0a 2a 2a 20 70 68 72 61 73 65 20 6f  d a..** phrase o
37410 62 6a 65 63 74 20 63 6f 6e 73 69 73 74 69 6e 67  bject consisting
37420 20 6f 66 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 72   of all tokens r
37430 65 74 75 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74  eturned...*/..st
37440 61 74 69 63 20 46 74 73 35 45 78 70 72 50 68 72  atic Fts5ExprPhr
37450 61 73 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35  ase *sqlite3Fts5
37460 50 61 72 73 65 54 65 72 6d 28 0d 0a 20 20 46 74  ParseTerm(..  Ft
37470 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s5Parse *pParse,
37480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37490 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
374a0 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68 72  /..  Fts5ExprPhr
374b0 61 73 65 20 2a 70 41 70 70 65 6e 64 2c 20 20 20  ase *pAppend,   
374c0 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20 74       /* Phrase t
374d0 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0d 0a  o append to */..
374e0 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f    Fts5Token *pTo
374f0 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
37500 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 74    /* String to t
37510 6f 6b 65 6e 69 7a 65 20 2a 2f 0d 0a 20 20 69 6e  okenize */..  in
37520 74 20 62 50 72 65 66 69 78 20 20 20 20 20 20 20  t bPrefix       
37530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37540 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69   True if there i
37550 73 20 61 20 74 72 61 69 6c 69 6e 67 20 22 2a 22  s a trailing "*"
37560 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 43   */..){..  Fts5C
37570 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
37580 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67   pParse->pConfig
37590 3b 0d 0a 20 20 54 6f 6b 65 6e 43 74 78 20 73 43  ;..  TokenCtx sC
375a0 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tx;             
375b0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
375c0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 74 6f  object passed to
375d0 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 20 20   callback */..  
375e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
375f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37600 2f 2a 20 54 6f 6b 65 6e 69 7a 65 20 72 65 74 75  /* Tokenize retu
37610 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 63 68  rn code */..  ch
37620 61 72 20 2a 7a 20 3d 20 30 3b 0d 0a 0d 0a 20 20  ar *z = 0;....  
37630 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c  memset(&sCtx, 0,
37640 20 73 69 7a 65 6f 66 28 54 6f 6b 65 6e 43 74 78   sizeof(TokenCtx
37650 29 29 3b 0d 0a 20 20 73 43 74 78 2e 70 50 68 72  ));..  sCtx.pPhr
37660 61 73 65 20 3d 20 70 41 70 70 65 6e 64 3b 0d 0a  ase = pAppend;..
37670 0d 0a 20 20 72 63 20 3d 20 66 74 73 35 50 61 72  ..  rc = fts5Par
37680 73 65 53 74 72 69 6e 67 46 72 6f 6d 54 6f 6b 65  seStringFromToke
37690 6e 28 70 54 6f 6b 65 6e 2c 20 26 7a 29 3b 0d 0a  n(pToken, &z);..
376a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
376b0 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20  _OK ){..    int 
376c0 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 54 4f 4b  flags = FTS5_TOK
376d0 45 4e 49 5a 45 5f 51 55 45 52 59 20 7c 20 28 62  ENIZE_QUERY | (b
376e0 50 72 65 66 69 78 20 3f 20 46 54 53 35 5f 54 4f  Prefix ? FTS5_TO
376f0 4b 45 4e 49 5a 45 5f 50 52 45 46 49 58 20 3a 20  KENIZE_PREFIX : 
37700 30 29 3b 0d 0a 20 20 20 20 69 6e 74 20 6e 3b 0d  0);..    int n;.
37710 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
37720 44 65 71 75 6f 74 65 28 7a 29 3b 0d 0a 20 20 20  Dequote(z);..   
37730 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
37740 28 7a 29 3b 0d 0a 20 20 20 20 72 63 20 3d 20 73  (z);..    rc = s
37750 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69  qlite3Fts5Tokeni
37760 7a 65 28 70 43 6f 6e 66 69 67 2c 20 66 6c 61 67  ze(pConfig, flag
37770 73 2c 20 7a 2c 20 6e 2c 20 26 73 43 74 78 2c 20  s, z, n, &sCtx, 
37780 66 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a  fts5ParseTokeniz
37790 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c 69  e);..  }..  sqli
377a0 74 65 33 5f 66 72 65 65 28 7a 29 3b 0d 0a 20 20  te3_free(z);..  
377b0 69 66 28 20 72 63 20 7c 7c 20 28 72 63 20 3d 20  if( rc || (rc = 
377c0 73 43 74 78 2e 72 63 29 20 29 7b 0d 0a 20 20 20  sCtx.rc) ){..   
377d0 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
377e0 3b 0d 0a 20 20 20 20 66 74 73 35 45 78 70 72 50  ;..    fts5ExprP
377f0 68 72 61 73 65 46 72 65 65 28 73 43 74 78 2e 70  hraseFree(sCtx.p
37800 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20 73 43  Phrase);..    sC
37810 74 78 2e 70 50 68 72 61 73 65 20 3d 20 30 3b 0d  tx.pPhrase = 0;.
37820 0a 20 20 7d 65 6c 73 65 7b 0d 0a 0d 0a 20 20 20  .  }else{....   
37830 20 69 66 28 20 70 41 70 70 65 6e 64 3d 3d 30 20   if( pAppend==0 
37840 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 28 70  ){..      if( (p
37850 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 20 25  Parse->nPhrase %
37860 20 38 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20   8)==0 ){..     
37870 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
37880 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
37890 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29  Fts5ExprPhrase*)
378a0 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e 50 68 72   * (pParse->nPhr
378b0 61 73 65 20 2b 20 38 29 3b 0d 0a 20 20 20 20 20  ase + 8);..     
378c0 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
378d0 65 20 2a 2a 61 70 4e 65 77 3b 0d 0a 20 20 20 20  e **apNew;..    
378e0 20 20 20 20 61 70 4e 65 77 20 3d 20 28 46 74 73      apNew = (Fts
378f0 35 45 78 70 72 50 68 72 61 73 65 2a 2a 29 73 71  5ExprPhrase**)sq
37900 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
37910 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65  pParse->apPhrase
37920 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 20  , nByte);..     
37930 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20     if( apNew==0 
37940 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 50  ){..          pP
37950 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
37960 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20  E_NOMEM;..      
37970 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72 61      fts5ExprPhra
37980 73 65 46 72 65 65 28 73 43 74 78 2e 70 50 68 72  seFree(sCtx.pPhr
37990 61 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ase);..         
379a0 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20   return 0;..    
379b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 70      }..        p
379c0 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65 20  Parse->apPhrase 
379d0 3d 20 61 70 4e 65 77 3b 0d 0a 20 20 20 20 20 20  = apNew;..      
379e0 7d 0d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  }..      pParse-
379f0 3e 6e 50 68 72 61 73 65 2b 2b 3b 0d 0a 20 20 20  >nPhrase++;..   
37a00 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20 73 43   }....    if( sC
37a10 74 78 2e 70 50 68 72 61 73 65 3d 3d 30 20 29 7b  tx.pPhrase==0 ){
37a20 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
37a30 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 61 72  happens when par
37a40 73 69 6e 67 20 61 20 74 6f 6b 65 6e 20 6f 72 20  sing a token or 
37a50 71 75 6f 74 65 64 20 70 68 72 61 73 65 20 74 68  quoted phrase th
37a60 61 74 20 63 6f 6e 74 61 69 6e 73 0d 0a 20 20 20  at contains..   
37a70 20 20 20 2a 2a 20 6e 6f 20 74 6f 6b 65 6e 20 63     ** no token c
37a80 68 61 72 61 63 74 65 72 73 20 61 74 20 61 6c 6c  haracters at all
37a90 2e 20 28 65 2e 67 20 2e 2e 2e 20 4d 41 54 43 48  . (e.g ... MATCH
37aa0 20 27 22 22 27 29 2e 20 2a 2f 0d 0a 20 20 20 20   '""'). */..    
37ab0 20 20 73 43 74 78 2e 70 50 68 72 61 73 65 20 3d    sCtx.pPhrase =
37ac0 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c   sqlite3Fts5Mall
37ad0 6f 63 5a 65 72 6f 28 26 70 50 61 72 73 65 2d 3e  ocZero(&pParse->
37ae0 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45  rc, sizeof(Fts5E
37af0 78 70 72 50 68 72 61 73 65 29 29 3b 0d 0a 20 20  xprPhrase));..  
37b00 20 20 7d 65 6c 73 65 20 69 66 28 20 73 43 74 78    }else if( sCtx
37b10 2e 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20  .pPhrase->nTerm 
37b20 29 7b 0d 0a 20 20 20 20 20 20 73 43 74 78 2e 70  ){..      sCtx.p
37b30 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 73 43  Phrase->aTerm[sC
37b40 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e 54 65 72  tx.pPhrase->nTer
37b50 6d 2d 31 5d 2e 62 50 72 65 66 69 78 20 3d 20 28  m-1].bPrefix = (
37b60 75 38 29 62 50 72 65 66 69 78 3b 0d 0a 20 20 20  u8)bPrefix;..   
37b70 20 7d 0d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   }..    pParse->
37b80 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65 2d  apPhrase[pParse-
37b90 3e 6e 50 68 72 61 73 65 2d 31 5d 20 3d 20 73 43  >nPhrase-1] = sC
37ba0 74 78 2e 70 50 68 72 61 73 65 3b 0d 0a 20 20 7d  tx.pPhrase;..  }
37bb0 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 73 43 74  ....  return sCt
37bc0 78 2e 70 50 68 72 61 73 65 3b 0d 0a 7d 0d 0a 0d  x.pPhrase;..}...
37bd0 0a 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74 65 20 61  ./*..** Create a
37be0 20 6e 65 77 20 46 54 53 35 20 65 78 70 72 65 73   new FTS5 expres
37bf0 73 69 6f 6e 20 62 79 20 63 6c 6f 6e 69 6e 67 20  sion by cloning 
37c00 70 68 72 61 73 65 20 69 50 68 72 61 73 65 20 6f  phrase iPhrase o
37c10 66 20 74 68 65 0d 0a 2a 2a 20 65 78 70 72 65 73  f the..** expres
37c20 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
37c30 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
37c40 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  nt...*/..static 
37c50 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
37c60 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65 28 0d  xprClonePhrase(.
37c70 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78  .  Fts5Expr *pEx
37c80 70 72 2c 20 0d 0a 20 20 69 6e 74 20 69 50 68 72  pr, ..  int iPhr
37c90 61 73 65 2c 20 0d 0a 20 20 46 74 73 35 45 78 70  ase, ..  Fts5Exp
37ca0 72 20 2a 2a 70 70 4e 65 77 0d 0a 29 7b 0d 0a 20  r **ppNew..){.. 
37cb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37cc0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
37cd0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
37ce0 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68  */..  Fts5ExprPh
37cf0 72 61 73 65 20 2a 70 4f 72 69 67 3b 20 20 20 20  rase *pOrig;    
37d00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 68 72        /* The phr
37d10 61 73 65 20 65 78 74 72 61 63 74 65 64 20 66 72  ase extracted fr
37d20 6f 6d 20 70 45 78 70 72 20 2a 2f 0d 0a 20 20 46  om pExpr */..  F
37d30 74 73 35 45 78 70 72 20 2a 70 4e 65 77 20 3d 20  ts5Expr *pNew = 
37d40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
37d50 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
37d60 72 65 74 75 72 6e 20 76 69 61 20 2a 70 70 4e 65  return via *ppNe
37d70 77 20 2a 2f 0d 0a 20 20 54 6f 6b 65 6e 43 74 78  w */..  TokenCtx
37d80 20 73 43 74 78 20 3d 20 7b 30 2c 30 7d 3b 20 20   sCtx = {0,0};  
37d90 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
37da0 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 66 74  xt object for ft
37db0 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65 20  s5ParseTokenize 
37dc0 2a 2f 0d 0a 0d 0a 20 20 70 4f 72 69 67 20 3d 20  */....  pOrig = 
37dd0 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72  pExpr->apExprPhr
37de0 61 73 65 5b 69 50 68 72 61 73 65 5d 3b 0d 0a 20  ase[iPhrase];.. 
37df0 20 70 4e 65 77 20 3d 20 28 46 74 73 35 45 78 70   pNew = (Fts5Exp
37e00 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  r*)sqlite3Fts5Ma
37e10 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69  llocZero(&rc, si
37e20 7a 65 6f 66 28 46 74 73 35 45 78 70 72 29 29 3b  zeof(Fts5Expr));
37e30 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
37e40 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 4e  TE_OK ){..    pN
37e50 65 77 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  ew->apExprPhrase
37e60 20 3d 20 28 46 74 73 35 45 78 70 72 50 68 72 61   = (Fts5ExprPhra
37e70 73 65 2a 2a 29 73 71 6c 69 74 65 33 46 74 73 35  se**)sqlite3Fts5
37e80 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
37e90 0d 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  ..        sizeof
37ea0 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a  (Fts5ExprPhrase*
37eb0 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20  ));..  }..  if( 
37ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37ed0 0d 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f  ..    pNew->pRoo
37ee0 74 20 3d 20 28 46 74 73 35 45 78 70 72 4e 6f 64  t = (Fts5ExprNod
37ef0 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
37f00 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0d 0a  llocZero(&rc, ..
37f10 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46          sizeof(F
37f20 74 73 35 45 78 70 72 4e 6f 64 65 29 29 3b 0d 0a  ts5ExprNode));..
37f30 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
37f40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
37f50 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e   pNew->pRoot->pN
37f60 65 61 72 20 3d 20 28 46 74 73 35 45 78 70 72 4e  ear = (Fts5ExprN
37f70 65 61 72 73 65 74 2a 29 73 71 6c 69 74 65 33 46  earset*)sqlite3F
37f80 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
37f90 63 2c 20 0d 0a 20 20 20 20 20 20 20 20 73 69 7a  c, ..        siz
37fa0 65 6f 66 28 46 74 73 35 45 78 70 72 4e 65 61 72  eof(Fts5ExprNear
37fb0 73 65 74 29 20 2b 20 73 69 7a 65 6f 66 28 46 74  set) + sizeof(Ft
37fc0 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 29 3b  s5ExprPhrase*));
37fd0 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63 3d  ..  }..  if( rc=
37fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
37ff0 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70     Fts5Colset *p
38000 43 6f 6c 73 65 74 4f 72 69 67 20 3d 20 70 4f 72  ColsetOrig = pOr
38010 69 67 2d 3e 70 4e 6f 64 65 2d 3e 70 4e 65 61 72  ig->pNode->pNear
38020 2d 3e 70 43 6f 6c 73 65 74 3b 0d 0a 20 20 20 20  ->pColset;..    
38030 69 66 28 20 70 43 6f 6c 73 65 74 4f 72 69 67 20  if( pColsetOrig 
38040 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ){..      sqlite
38050 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 3b 0d 0a  3_int64 nByte;..
38060 20 20 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74        Fts5Colset
38070 20 2a 70 43 6f 6c 73 65 74 3b 0d 0a 20 20 20 20   *pColset;..    
38080 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
38090 28 46 74 73 35 43 6f 6c 73 65 74 29 20 2b 20 28  (Fts5Colset) + (
380a0 70 43 6f 6c 73 65 74 4f 72 69 67 2d 3e 6e 43 6f  pColsetOrig->nCo
380b0 6c 2d 31 29 20 2a 20 73 69 7a 65 6f 66 28 69 6e  l-1) * sizeof(in
380c0 74 29 3b 0d 0a 20 20 20 20 20 20 70 43 6f 6c 73  t);..      pCols
380d0 65 74 20 3d 20 28 46 74 73 35 43 6f 6c 73 65 74  et = (Fts5Colset
380e0 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
380f0 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79  locZero(&rc, nBy
38100 74 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20  te);..      if( 
38110 70 43 6f 6c 73 65 74 20 29 7b 20 0d 0a 20 20 20  pColset ){ ..   
38120 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c       memcpy(pCol
38130 73 65 74 2c 20 70 43 6f 6c 73 65 74 4f 72 69 67  set, pColsetOrig
38140 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79 74 65 29  , (size_t)nByte)
38150 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
38160 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70    pNew->pRoot->p
38170 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 3d 20  Near->pColset = 
38180 70 43 6f 6c 73 65 74 3b 0d 0a 20 20 20 20 7d 0d  pColset;..    }.
38190 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 4f  .  }....  if( pO
381a0 72 69 67 2d 3e 6e 54 65 72 6d 20 29 7b 0d 0a 20  rig->nTerm ){.. 
381b0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
381c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381d0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
381e0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 68  erate through ph
381f0 72 61 73 65 20 74 65 72 6d 73 20 2a 2f 0d 0a 20  rase terms */.. 
38200 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
38210 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
38220 4f 72 69 67 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  Orig->nTerm; i++
38230 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 74 66  ){..      int tf
38240 6c 61 67 73 20 3d 20 30 3b 0d 0a 20 20 20 20 20  lags = 0;..     
38250 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
38260 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26  ;..      for(p=&
38270 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 69 5d 3b  pOrig->aTerm[i];
38280 20 70 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45   p && rc==SQLITE
38290 5f 4f 4b 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e  _OK; p=p->pSynon
382a0 79 6d 29 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  ym){..        co
382b0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
382c0 3d 20 70 2d 3e 7a 54 65 72 6d 3b 0d 0a 20 20 20  = p->zTerm;..   
382d0 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 50 61       rc = fts5Pa
382e0 72 73 65 54 6f 6b 65 6e 69 7a 65 28 28 76 6f 69  rseTokenize((voi
382f0 64 2a 29 26 73 43 74 78 2c 20 74 66 6c 61 67 73  d*)&sCtx, tflags
38300 2c 20 7a 54 65 72 6d 2c 20 28 69 6e 74 29 73 74  , zTerm, (int)st
38310 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0d 0a 20 20  rlen(zTerm),..  
38320 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b            0, 0);
38330 0d 0a 20 20 20 20 20 20 20 20 74 66 6c 61 67 73  ..        tflags
38340 20 3d 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f   = FTS5_TOKEN_CO
38350 4c 4f 43 41