System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact f9315f0a54759db019a607051109dad4536efd81:


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 3d 3d 31 20 29 7b    if( iVal==1 ){
22fe0 0d 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74  ..      fts5Fast
22ff0 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
23000 2c 20 69 56 61 6c 29 3b 0d 0a 20 20 20 20 20 20  , iVal);..      
23010 69 4f 66 66 20 3d 20 28 28 69 36 34 29 69 56 61  iOff = ((i64)iVa
23020 6c 29 20 3c 3c 20 33 32 3b 0d 0a 20 20 20 20 20  l) << 32;..     
23030 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
23040 6e 74 33 32 28 61 2c 20 69 2c 20 69 56 61 6c 29  nt32(a, i, iVal)
23050 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 2a 70  ;..    }..    *p
23060 69 4f 66 66 20 3d 20 69 4f 66 66 20 2b 20 28 28  iOff = iOff + ((
23070 69 56 61 6c 2d 32 29 20 26 20 30 78 37 46 46 46  iVal-2) & 0x7FFF
23080 46 46 46 46 29 3b 0d 0a 20 20 20 20 2a 70 69 20  FFFF);..    *pi 
23090 3d 20 69 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e  = i;..    return
230a0 20 30 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d   0;..  }..}.....
230b0 0a 2f 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ./*..** Advance 
230c0 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
230d0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
230e0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
230f0 20 52 65 74 75 72 6e 20 74 72 75 65 0d 0a 2a 2a   Return true..**
23100 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
23110 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72   reaches EOF, or
23120 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
23130 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
23140 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  t sqlite3Fts5Pos
23150 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 46  listReaderNext(F
23160 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
23170 20 2a 70 49 74 65 72 29 7b 0d 0a 20 20 69 66 28   *pIter){..  if(
23180 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
23190 69 73 74 4e 65 78 74 36 34 28 70 49 74 65 72 2d  istNext64(pIter-
231a0 3e 61 2c 20 70 49 74 65 72 2d 3e 6e 2c 20 26 70  >a, pIter->n, &p
231b0 49 74 65 72 2d 3e 69 2c 20 26 70 49 74 65 72 2d  Iter->i, &pIter-
231c0 3e 69 50 6f 73 29 20 29 7b 0d 0a 20 20 20 20 70  >iPos) ){..    p
231d0 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d  Iter->bEof = 1;.
231e0 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
231f0 49 74 65 72 2d 3e 62 45 6f 66 3b 0d 0a 7d 0d 0a  Iter->bEof;..}..
23200 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
23210 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
23220 65 61 64 65 72 49 6e 69 74 28 0d 0a 20 20 63 6f  eaderInit(..  co
23230 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
23240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
23250 20 50 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20   Poslist buffer 
23260 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
23270 67 68 20 2a 2f 0d 0a 20 20 46 74 73 35 50 6f 73  gh */..  Fts5Pos
23280 6c 69 73 74 52 65 61 64 65 72 20 2a 70 49 74 65  listReader *pIte
23290 72 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72  r        /* Iter
232a0 61 74 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 69  ator object to i
232b0 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0d 0a 29 7b  nitialize */..){
232c0 0d 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ..  memset(pIter
232d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
232e0 65 72 29 29 3b 0d 0a 20 20 70 49 74 65 72 2d 3e  er));..  pIter->
232f0 61 20 3d 20 61 3b 0d 0a 20 20 70 49 74 65 72 2d  a = a;..  pIter-
23300 3e 6e 20 3d 20 6e 3b 0d 0a 20 20 73 71 6c 69 74  >n = n;..  sqlit
23310 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
23320 64 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0d  derNext(pIter);.
23330 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
23340 3e 62 45 6f 66 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  >bEof;..}..../*.
23350 0a 2a 2a 20 41 70 70 65 6e 64 20 70 6f 73 69 74  .** Append posit
23360 69 6f 6e 20 69 50 6f 73 20 74 6f 20 74 68 65 20  ion iPos to the 
23370 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65  position list be
23380 69 6e 67 20 61 63 63 75 6d 75 6c 61 74 65 64 20  ing accumulated 
23390 69 6e 20 62 75 66 66 65 72 0d 0a 2a 2a 20 70 42  in buffer..** pB
233a0 75 66 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  uf, which must b
233b0 65 20 61 6c 72 65 61 64 79 20 62 65 20 6c 61 72  e already be lar
233c0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
233d0 64 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 0d  d the new data..
233e0 0a 2a 2a 20 54 68 65 20 70 72 65 76 69 6f 75 73  .** The previous
233f0 20 70 6f 73 69 74 69 6f 6e 20 77 72 69 74 74 65   position writte
23400 6e 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20 69  n to this list i
23410 73 20 2a 70 69 50 72 65 76 2e 20 2a 70 69 50 72  s *piPrev. *piPr
23420 65 76 20 69 73 20 73 65 74 0d 0a 2a 2a 20 74 6f  ev is set..** to
23430 20 69 50 6f 73 20 62 65 66 6f 72 65 20 72 65 74   iPos before ret
23440 75 72 6e 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61  urning...*/..sta
23450 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
23460 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
23470 70 70 65 6e 64 28 0d 0a 20 20 46 74 73 35 42 75  ppend(..  Fts5Bu
23480 66 66 65 72 20 2a 70 42 75 66 2c 20 0d 0a 20 20  ffer *pBuf, ..  
23490 69 36 34 20 2a 70 69 50 72 65 76 2c 20 0d 0a 20  i64 *piPrev, .. 
234a0 20 69 36 34 20 69 50 6f 73 0d 0a 29 7b 0d 0a 20   i64 iPos..){.. 
234b0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 36   static const i6
234c0 34 20 63 6f 6c 6d 61 73 6b 20 3d 20 28 28 69 36  4 colmask = ((i6
234d0 34 29 28 30 78 37 46 46 46 46 46 46 46 29 29 20  4)(0x7FFFFFFF)) 
234e0 3c 3c 20 33 32 3b 0d 0a 20 20 69 66 28 20 28 69  << 32;..  if( (i
234f0 50 6f 73 20 26 20 63 6f 6c 6d 61 73 6b 29 20 21  Pos & colmask) !
23500 3d 20 28 2a 70 69 50 72 65 76 20 26 20 63 6f 6c  = (*piPrev & col
23510 6d 61 73 6b 29 20 29 7b 0d 0a 20 20 20 20 70 42  mask) ){..    pB
23520 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d  uf->p[pBuf->n++]
23530 20 3d 20 31 3b 0d 0a 20 20 20 20 70 42 75 66 2d   = 1;..    pBuf-
23540 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
23550 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66  5PutVarint(&pBuf
23560 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 28 69  ->p[pBuf->n], (i
23570 50 6f 73 3e 3e 33 32 29 29 3b 0d 0a 20 20 20 20  Pos>>32));..    
23580 2a 70 69 50 72 65 76 20 3d 20 28 69 50 6f 73 20  *piPrev = (iPos 
23590 26 20 63 6f 6c 6d 61 73 6b 29 3b 0d 0a 20 20 7d  & colmask);..  }
235a0 0d 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73  ..  pBuf->n += s
235b0 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
235c0 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75  int(&pBuf->p[pBu
235d0 66 2d 3e 6e 5d 2c 20 28 69 50 6f 73 2d 2a 70 69  f->n], (iPos-*pi
235e0 50 72 65 76 29 2b 32 29 3b 0d 0a 20 20 2a 70 69  Prev)+2);..  *pi
235f0 50 72 65 76 20 3d 20 69 50 6f 73 3b 0d 0a 7d 0d  Prev = iPos;..}.
23600 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ...static int sq
23610 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
23620 57 72 69 74 65 72 41 70 70 65 6e 64 28 0d 0a 20  WriterAppend(.. 
23630 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
23640 66 2c 20 0d 0a 20 20 46 74 73 35 50 6f 73 6c 69  f, ..  Fts5Posli
23650 73 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  stWriter *pWrite
23660 72 2c 0d 0a 20 20 69 36 34 20 69 50 6f 73 0d 0a  r,..  i64 iPos..
23670 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ){..  int rc = 0
23680 3b 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ;   /* Initializ
23690 65 64 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70 72  ed only to suppr
236a0 65 73 73 20 65 72 72 6f 6e 65 6f 75 73 20 77 61  ess erroneous wa
236b0 72 6e 69 6e 67 20 66 72 6f 6d 20 43 6c 61 6e 67  rning from Clang
236c0 20 2a 2f 0d 0a 20 20 69 66 28 20 66 74 73 35 42   */..  if( fts5B
236d0 75 66 66 65 72 47 72 6f 77 28 26 72 63 2c 20 70  ufferGrow(&rc, p
236e0 42 75 66 2c 20 35 2b 35 2b 35 29 20 29 20 72 65  Buf, 5+5+5) ) re
236f0 74 75 72 6e 20 72 63 3b 0d 0a 20 20 73 71 6c 69  turn rc;..  sqli
23700 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61  te3Fts5PoslistSa
23710 66 65 41 70 70 65 6e 64 28 70 42 75 66 2c 20 26  feAppend(pBuf, &
23720 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 2c 20  pWriter->iPrev, 
23730 69 50 6f 73 29 3b 0d 0a 20 20 72 65 74 75 72 6e  iPos);..  return
23740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a   SQLITE_OK;..}..
23750 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73  ..static void *s
23760 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
23770 5a 65 72 6f 28 69 6e 74 20 2a 70 52 63 2c 20 73  Zero(int *pRc, s
23780 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
23790 74 65 29 7b 0d 0a 20 20 76 6f 69 64 20 2a 70 52  te){..  void *pR
237a0 65 74 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 2a  et = 0;..  if( *
237b0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
237c0 7b 0d 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  {..    pRet = sq
237d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
237e0 42 79 74 65 29 3b 0d 0a 20 20 20 20 69 66 28 20  Byte);..    if( 
237f0 70 52 65 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  pRet==0 ){..    
23800 20 20 69 66 28 20 6e 42 79 74 65 3e 30 20 29 20    if( nByte>0 ) 
23810 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
23820 4d 45 4d 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b  MEM;..    }else{
23830 0d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ..      memset(p
23840 52 65 74 2c 20 30 2c 20 28 73 69 7a 65 5f 74 29  Ret, 0, (size_t)
23850 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a  nByte);..    }..
23860 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
23870 65 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  et;..}..../*..**
23880 20 52 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65   Return a nul-te
23890 72 6d 69 6e 61 74 65 64 20 63 6f 70 79 20 6f 66  rminated copy of
238a0 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 64 69   the string indi
238b0 63 61 74 65 64 20 62 79 20 70 49 6e 2e 20 49 66  cated by pIn. If
238c0 20 6e 49 6e 0d 0a 2a 2a 20 69 73 20 6e 6f 6e 2d   nIn..** is non-
238d0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
238e0 74 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20  t is the length 
238f0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e  of the string in
23900 20 62 79 74 65 73 2e 20 4f 74 68 65 72 77 69 73   bytes. Otherwis
23910 65 2c 0d 0a 2a 2a 20 74 68 65 20 6c 65 6e 67 74  e,..** the lengt
23920 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  h of the string 
23930 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 75 73  is determined us
23940 69 6e 67 20 73 74 72 6c 65 6e 28 29 2e 0d 0a 2a  ing strlen()...*
23950 2a 0d 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  *..** It is the 
23960 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
23970 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
23980 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
23990 74 68 65 20 72 65 74 75 72 6e 65 64 0d 0a 2a 2a  the returned..**
239a0 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71   buffer using sq
239b0 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 49 66  lite3_free(). If
239c0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
239d0 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
239e0 74 75 72 6e 65 64 2e 20 0d 0a 2a 2f 0d 0a 73 74  turned. ..*/..st
239f0 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74  atic char *sqlit
23a00 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 69 6e  e3Fts5Strndup(in
23a10 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68  t *pRc, const ch
23a20 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *pIn, int nIn
23a30 29 7b 0d 0a 20 20 63 68 61 72 20 2a 7a 52 65 74  ){..  char *zRet
23a40 20 3d 20 30 3b 0d 0a 20 20 69 66 28 20 2a 70 52   = 0;..  if( *pR
23a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
23a60 0a 20 20 20 20 69 66 28 20 6e 49 6e 3c 30 20 29  .    if( nIn<0 )
23a70 7b 0d 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 28  {..      nIn = (
23a80 69 6e 74 29 73 74 72 6c 65 6e 28 70 49 6e 29 3b  int)strlen(pIn);
23a90 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 7a 52 65  ..    }..    zRe
23aa0 74 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  t = (char*)sqlit
23ab0 65 33 5f 6d 61 6c 6c 6f 63 28 6e 49 6e 2b 31 29  e3_malloc(nIn+1)
23ac0 3b 0d 0a 20 20 20 20 69 66 28 20 7a 52 65 74 20  ;..    if( zRet 
23ad0 29 7b 0d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ){..      memcpy
23ae0 28 7a 52 65 74 2c 20 70 49 6e 2c 20 6e 49 6e 29  (zRet, pIn, nIn)
23af0 3b 0d 0a 20 20 20 20 20 20 7a 52 65 74 5b 6e 49  ;..      zRet[nI
23b00 6e 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20 20 20 20  n] = '\0';..    
23b10 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 2a 70  }else{..      *p
23b20 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
23b30 4d 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  M;..    }..  }..
23b40 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0d 0a    return zRet;..
23b50 7d 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 52 65  }....../*..** Re
23b60 74 75 72 6e 20 74 72 75 65 20 69 66 20 63 68 61  turn true if cha
23b70 72 61 63 74 65 72 20 27 74 27 20 6d 61 79 20 62  racter 't' may b
23b80 65 20 70 61 72 74 20 6f 66 20 61 6e 20 46 54 53  e part of an FTS
23b90 35 20 62 61 72 65 77 6f 72 64 2c 20 6f 72 20 66  5 bareword, or f
23ba0 61 6c 73 65 0d 0a 2a 2a 20 6f 74 68 65 72 77 69  alse..** otherwi
23bb0 73 65 2e 20 43 68 61 72 61 63 74 65 72 73 20 74  se. Characters t
23bc0 68 61 74 20 6d 61 79 20 62 65 20 70 61 72 74 20  hat may be part 
23bd0 6f 66 20 62 61 72 65 77 6f 72 64 73 3a 0d 0a 2a  of barewords:..*
23be0 2a 0d 0a 2a 2a 20 20 20 2a 20 41 6c 6c 20 6e 6f  *..**   * All no
23bf0 6e 2d 41 53 43 49 49 20 63 68 61 72 61 63 74 65  n-ASCII characte
23c00 72 73 2c 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20  rs,..**   * The 
23c10 35 32 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  52 upper and low
23c20 65 72 20 63 61 73 65 20 41 53 43 49 49 20 63 68  er case ASCII ch
23c30 61 72 61 63 74 65 72 73 2c 20 61 6e 64 0d 0a 2a  aracters, and..*
23c40 2a 20 20 20 2a 20 54 68 65 20 31 30 20 69 6e 74  *   * The 10 int
23c50 65 67 65 72 20 41 53 43 49 49 20 63 68 61 72 61  eger ASCII chara
23c60 63 74 65 72 73 2e 0d 0a 2a 2a 20 20 20 2a 20 54  cters...**   * T
23c70 68 65 20 75 6e 64 65 72 73 63 6f 72 65 20 63 68  he underscore ch
23c80 61 72 61 63 74 65 72 20 22 5f 22 20 28 30 78 35  aracter "_" (0x5
23c90 46 29 2e 0d 0a 2a 2a 20 20 20 2a 20 54 68 65 20  F)...**   * The 
23ca0 75 6e 69 63 6f 64 65 20 22 73 75 62 73 69 74 75  unicode "subsitu
23cb0 74 65 22 20 63 68 61 72 61 63 74 65 72 20 28 30  te" character (0
23cc0 78 31 41 29 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  x1A)...*/..stati
23cd0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
23ce0 35 49 73 42 61 72 65 77 6f 72 64 28 63 68 61 72  5IsBareword(char
23cf0 20 74 29 7b 0d 0a 20 20 75 38 20 61 42 61 72 65   t){..  u8 aBare
23d00 77 6f 72 64 5b 31 32 38 5d 20 3d 20 7b 0d 0a 20  word[128] = {.. 
23d10 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
23d20 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 30 2c  , 0, 0, 0,    0,
23d30 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
23d40 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78 30 30 20  0, 0,   /* 0x00 
23d50 2e 2e 20 30 78 30 46 20 2a 2f 0d 0a 20 20 20 20  .. 0x0F */..    
23d60 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
23d70 2c 20 30 2c 20 30 2c 20 20 20 20 30 2c 20 30 2c  , 0, 0,    0, 0,
23d80 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   1, 0, 0, 0, 0, 
23d90 30 2c 20 20 20 2f 2a 20 30 78 31 30 20 2e 2e 20  0,   /* 0x10 .. 
23da0 30 78 31 46 20 2a 2f 0d 0a 20 20 20 20 30 2c 20  0x1F */..    0, 
23db0 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
23dc0 2c 20 30 2c 20 20 20 20 30 2c 20 30 2c 20 30 2c  , 0,    0, 0, 0,
23dd0 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
23de0 20 20 2f 2a 20 30 78 32 30 20 2e 2e 20 30 78 32    /* 0x20 .. 0x2
23df0 46 20 2a 2f 0d 0a 20 20 20 20 31 2c 20 31 2c 20  F */..    1, 1, 
23e00 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
23e10 2c 20 20 20 20 31 2c 20 31 2c 20 30 2c 20 30 2c  ,    1, 1, 0, 0,
23e20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f   0, 0, 0, 0,   /
23e30 2a 20 30 78 33 30 20 2e 2e 20 30 78 33 46 20 2a  * 0x30 .. 0x3F *
23e40 2f 0d 0a 20 20 20 20 30 2c 20 31 2c 20 31 2c 20  /..    0, 1, 1, 
23e50 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
23e60 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
23e70 20 31 2c 20 31 2c 20 31 2c 20 20 20 2f 2a 20 30   1, 1, 1,   /* 0
23e80 78 34 30 20 2e 2e 20 30 78 34 46 20 2a 2f 0d 0a  x40 .. 0x4F */..
23e90 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20      1, 1, 1, 1, 
23ea0 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 20 31  1, 1, 1, 1,    1
23eb0 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 1, 0, 0, 0,
23ec0 20 30 2c 20 31 2c 20 20 20 2f 2a 20 30 78 35 30   0, 1,   /* 0x50
23ed0 20 2e 2e 20 30 78 35 46 20 2a 2f 0d 0a 20 20 20   .. 0x5F */..   
23ee0 20 30 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   0, 1, 1, 1, 1, 
23ef0 31 2c 20 31 2c 20 31 2c 20 20 20 20 31 2c 20 31  1, 1, 1,    1, 1
23f00 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
23f10 20 31 2c 20 20 20 2f 2a 20 30 78 36 30 20 2e 2e   1,   /* 0x60 ..
23f20 20 30 78 36 46 20 2a 2f 0d 0a 20 20 20 20 31 2c   0x6F */..    1,
23f30 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
23f40 31 2c 20 31 2c 20 20 20 20 31 2c 20 31 2c 20 31  1, 1,    1, 1, 1
23f50 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
23f60 20 20 20 2f 2a 20 30 78 37 30 20 2e 2e 20 30 78     /* 0x70 .. 0x
23f70 37 46 20 2a 2f 0d 0a 20 20 7d 3b 0d 0a 0d 0a 20  7F */..  };.... 
23f80 20 72 65 74 75 72 6e 20 28 74 20 26 20 30 78 38   return (t & 0x8
23f90 30 29 20 7c 7c 20 61 42 61 72 65 77 6f 72 64 5b  0) || aBareword[
23fa0 28 69 6e 74 29 74 5d 3b 0d 0a 7d 0d 0a 0d 0a 0d  (int)t];..}.....
23fb0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
23fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2f 0d  ***********..*/.
24000 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
24010 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79  Fts5TermsetEntry
24020 20 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72   Fts5TermsetEntr
24030 79 3b 0d 0a 73 74 72 75 63 74 20 46 74 73 35 54  y;..struct Fts5T
24040 65 72 6d 73 65 74 45 6e 74 72 79 20 7b 0d 0a 20  ermsetEntry {.. 
24050 20 63 68 61 72 20 2a 70 54 65 72 6d 3b 0d 0a 20   char *pTerm;.. 
24060 20 69 6e 74 20 6e 54 65 72 6d 3b 0d 0a 20 20 69   int nTerm;..  i
24070 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20  nt iIdx;        
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24090 2a 20 49 6e 64 65 78 20 28 6d 61 69 6e 20 6f 72  * Index (main or
240a0 20 61 50 72 65 66 69 78 5b 5d 20 65 6e 74 72 79   aPrefix[] entry
240b0 29 20 2a 2f 0d 0a 20 20 46 74 73 35 54 65 72 6d  ) */..  Fts5Term
240c0 73 65 74 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b  setEntry *pNext;
240d0 0d 0a 7d 3b 0d 0a 0d 0a 73 74 72 75 63 74 20 46  ..};....struct F
240e0 74 73 35 54 65 72 6d 73 65 74 20 7b 0d 0a 20 20  ts5Termset {..  
240f0 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79  Fts5TermsetEntry
24100 20 2a 61 70 48 61 73 68 5b 35 31 32 5d 3b 0d 0a   *apHash[512];..
24110 7d 3b 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  };....static int
24120 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d   sqlite3Fts5Term
24130 73 65 74 4e 65 77 28 46 74 73 35 54 65 72 6d 73  setNew(Fts5Terms
24140 65 74 20 2a 2a 70 70 29 7b 0d 0a 20 20 69 6e 74  et **pp){..  int
24150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24160 0d 0a 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65  ..  *pp = sqlite
24170 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
24180 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  &rc, sizeof(Fts5
24190 54 65 72 6d 73 65 74 29 29 3b 0d 0a 20 20 72 65  Termset));..  re
241a0 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73  turn rc;..}....s
241b0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
241c0 33 46 74 73 35 54 65 72 6d 73 65 74 41 64 64 28  3Fts5TermsetAdd(
241d0 0d 0a 20 20 46 74 73 35 54 65 72 6d 73 65 74 20  ..  Fts5Termset 
241e0 2a 70 2c 20 0d 0a 20 20 69 6e 74 20 69 49 64 78  *p, ..  int iIdx
241f0 2c 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ,..  const char 
24200 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
24210 6d 2c 20 0d 0a 20 20 69 6e 74 20 2a 70 62 50 72  m, ..  int *pbPr
24220 65 73 65 6e 74 0d 0a 29 7b 0d 0a 20 20 69 6e 74  esent..){..  int
24230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24240 0d 0a 20 20 2a 70 62 50 72 65 73 65 6e 74 20 3d  ..  *pbPresent =
24250 20 30 3b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d   0;..  if( p ){.
24260 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20  .    int i;..   
24270 20 75 33 32 20 68 61 73 68 20 3d 20 31 33 3b 0d   u32 hash = 13;.
24280 0a 20 20 20 20 46 74 73 35 54 65 72 6d 73 65 74  .    Fts5Termset
24290 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b 0d 0a  Entry *pEntry;..
242a0 0d 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61  ..    /* Calcula
242b0 74 65 20 61 20 68 61 73 68 20 76 61 6c 75 65 20  te a hash value 
242c0 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2e 20 54  for this term. T
242d0 68 69 73 20 69 73 20 74 68 65 20 73 61 6d 65 20  his is the same 
242e0 68 61 73 68 20 63 68 65 63 6b 73 75 6d 0d 0a 20  hash checksum.. 
242f0 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68     ** used by th
24300 65 20 66 74 73 35 5f 68 61 73 68 2e 63 20 6d 6f  e fts5_hash.c mo
24310 64 75 6c 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  dule. This is no
24320 74 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20  t important for 
24330 63 6f 72 72 65 63 74 0d 0a 20 20 20 20 2a 2a 20  correct..    ** 
24340 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
24350 20 6d 6f 64 75 6c 65 2c 20 62 75 74 20 69 73 20   module, but is 
24360 6e 65 63 65 73 73 61 72 79 20 74 6f 20 65 6e 73  necessary to ens
24370 75 72 65 20 74 68 61 74 20 73 6f 6d 65 20 74 65  ure that some te
24380 73 74 73 0d 0a 20 20 20 20 2a 2a 20 64 65 73 69  sts..    ** desi
24390 67 6e 65 64 20 74 6f 20 70 72 6f 64 75 63 65 20  gned to produce 
243a0 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6c 6c 69  hash table colli
243b0 73 69 6f 6e 73 20 72 65 61 6c 6c 79 20 64 6f 20  sions really do 
243c0 77 6f 72 6b 2e 20 20 2a 2f 0d 0a 20 20 20 20 66  work.  */..    f
243d0 6f 72 28 69 3d 6e 54 65 72 6d 2d 31 3b 20 69 3e  or(i=nTerm-1; i>
243e0 3d 30 3b 20 69 2d 2d 29 7b 0d 0a 20 20 20 20 20  =0; i--){..     
243f0 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 3c 3c   hash = (hash <<
24400 20 33 29 20 5e 20 68 61 73 68 20 5e 20 70 54 65   3) ^ hash ^ pTe
24410 72 6d 5b 69 5d 3b 0d 0a 20 20 20 20 7d 0d 0a 20  rm[i];..    }.. 
24420 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 20     hash = (hash 
24430 3c 3c 20 33 29 20 5e 20 68 61 73 68 20 5e 20 69  << 3) ^ hash ^ i
24440 49 64 78 3b 0d 0a 20 20 20 20 68 61 73 68 20 3d  Idx;..    hash =
24450 20 68 61 73 68 20 25 20 41 72 72 61 79 53 69 7a   hash % ArraySiz
24460 65 28 70 2d 3e 61 70 48 61 73 68 29 3b 0d 0a 0d  e(p->apHash);...
24470 0a 20 20 20 20 66 6f 72 28 70 45 6e 74 72 79 3d  .    for(pEntry=
24480 70 2d 3e 61 70 48 61 73 68 5b 68 61 73 68 5d 3b  p->apHash[hash];
24490 20 70 45 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d   pEntry; pEntry=
244a0 70 45 6e 74 72 79 2d 3e 70 4e 65 78 74 29 7b 0d  pEntry->pNext){.
244b0 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 74 72  .      if( pEntr
244c0 79 2d 3e 69 49 64 78 3d 3d 69 49 64 78 20 0d 0a  y->iIdx==iIdx ..
244d0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 45 6e            && pEn
244e0 74 72 79 2d 3e 6e 54 65 72 6d 3d 3d 6e 54 65 72  try->nTerm==nTer
244f0 6d 20 0d 0a 20 20 20 20 20 20 20 20 20 20 26 26  m ..          &&
24500 20 6d 65 6d 63 6d 70 28 70 45 6e 74 72 79 2d 3e   memcmp(pEntry->
24510 70 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54  pTerm, pTerm, nT
24520 65 72 6d 29 3d 3d 30 20 0d 0a 20 20 20 20 20 20  erm)==0 ..      
24530 29 7b 0d 0a 20 20 20 20 20 20 20 20 2a 70 62 50  ){..        *pbP
24540 72 65 73 65 6e 74 20 3d 20 31 3b 0d 0a 20 20 20  resent = 1;..   
24550 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
24560 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
24570 20 20 20 69 66 28 20 70 45 6e 74 72 79 3d 3d 30     if( pEntry==0
24580 20 29 7b 0d 0a 20 20 20 20 20 20 70 45 6e 74 72   ){..      pEntr
24590 79 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  y = sqlite3Fts5M
245a0 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
245b0 69 7a 65 6f 66 28 46 74 73 35 54 65 72 6d 73 65  izeof(Fts5Termse
245c0 74 45 6e 74 72 79 29 20 2b 20 6e 54 65 72 6d 29  tEntry) + nTerm)
245d0 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e  ;..      if( pEn
245e0 74 72 79 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  try ){..        
245f0 70 45 6e 74 72 79 2d 3e 70 54 65 72 6d 20 3d 20  pEntry->pTerm = 
24600 28 63 68 61 72 2a 29 26 70 45 6e 74 72 79 5b 31  (char*)&pEntry[1
24610 5d 3b 0d 0a 20 20 20 20 20 20 20 20 70 45 6e 74  ];..        pEnt
24620 72 79 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72  ry->nTerm = nTer
24630 6d 3b 0d 0a 20 20 20 20 20 20 20 20 70 45 6e 74  m;..        pEnt
24640 72 79 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b  ry->iIdx = iIdx;
24650 0d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
24660 28 70 45 6e 74 72 79 2d 3e 70 54 65 72 6d 2c 20  (pEntry->pTerm, 
24670 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0d 0a  pTerm, nTerm);..
24680 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 2d 3e          pEntry->
24690 70 4e 65 78 74 20 3d 20 70 2d 3e 61 70 48 61 73  pNext = p->apHas
246a0 68 5b 68 61 73 68 5d 3b 0d 0a 20 20 20 20 20 20  h[hash];..      
246b0 20 20 70 2d 3e 61 70 48 61 73 68 5b 68 61 73 68    p->apHash[hash
246c0 5d 20 3d 20 70 45 6e 74 72 79 3b 0d 0a 20 20 20  ] = pEntry;..   
246d0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d     }..    }..  }
246e0 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ....  return rc;
246f0 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f  ..}....static vo
24700 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 54 65  id sqlite3Fts5Te
24710 72 6d 73 65 74 46 72 65 65 28 46 74 73 35 54 65  rmsetFree(Fts5Te
24720 72 6d 73 65 74 20 2a 70 29 7b 0d 0a 20 20 69 66  rmset *p){..  if
24730 28 20 70 20 29 7b 0d 0a 20 20 20 20 75 33 32 20  ( p ){..    u32 
24740 69 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  i;..    for(i=0;
24750 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
24760 61 70 48 61 73 68 29 3b 20 69 2b 2b 29 7b 0d 0a  apHash); i++){..
24770 20 20 20 20 20 20 46 74 73 35 54 65 72 6d 73 65        Fts5Termse
24780 74 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 20 3d  tEntry *pEntry =
24790 20 70 2d 3e 61 70 48 61 73 68 5b 69 5d 3b 0d 0a   p->apHash[i];..
247a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 45 6e        while( pEn
247b0 74 72 79 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  try ){..        
247c0 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79  Fts5TermsetEntry
247d0 20 2a 70 44 65 6c 20 3d 20 70 45 6e 74 72 79 3b   *pDel = pEntry;
247e0 0d 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72 79  ..        pEntry
247f0 20 3d 20 70 45 6e 74 72 79 2d 3e 70 4e 65 78 74   = pEntry->pNext
24800 3b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
24810 65 33 5f 66 72 65 65 28 70 44 65 6c 29 3b 0d 0a  e3_free(pDel);..
24820 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
24830 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24840 28 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a  (p);..  }..}....
24850 23 6c 69 6e 65 20 31 20 22 66 74 73 35 5f 63 6f  #line 1 "fts5_co
24860 6e 66 69 67 2e 63 22 0d 0a 2f 2a 0d 0a 2a 2a 20  nfig.c"../*..** 
24870 32 30 31 34 20 4a 75 6e 20 30 39 0d 0a 2a 2a 0d  2014 Jun 09..**.
24880 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64  .** The author d
24890 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
248a0 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
248b0 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
248c0 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c 65 67 61 6c  e of..** a legal
248d0 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
248e0 20 61 20 62 6c 65 73 73 69 6e 67 3a 0d 0a 2a 2a   a blessing:..**
248f0 0d 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  ..**    May you 
24900 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
24910 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20 20 4d 61 79  evil...**    May
24920 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
24930 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
24940 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
24950 74 68 65 72 73 2e 0d 0a 2a 2a 20 20 20 20 4d 61  thers...**    Ma
24960 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
24970 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
24980 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
24990 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 2a 2a 2a 2a  ive...**..******
249a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249e0 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 0d 0a 2a 2a  ********..**..**
249f0 20 54 68 69 73 20 69 73 20 61 6e 20 53 51 4c 69   This is an SQLi
24a00 74 65 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d  te module implem
24a10 65 6e 74 69 6e 67 20 66 75 6c 6c 2d 74 65 78 74  enting full-text
24a20 20 73 65 61 72 63 68 2e 0d 0a 2a 2f 0d 0a 0d 0a   search...*/....
24a30 0d 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 22 66  ../* #include "f
24a40 74 73 35 49 6e 74 2e 68 22 20 2a 2f 0d 0a 0d 0a  ts5Int.h" */....
24a50 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46  #define FTS5_DEF
24a60 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 20  AULT_PAGE_SIZE  
24a70 20 34 30 35 30 0d 0a 23 64 65 66 69 6e 65 20 46   4050..#define F
24a80 54 53 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  TS5_DEFAULT_AUTO
24a90 4d 45 52 47 45 20 20 20 20 20 20 34 0d 0a 23 64  MERGE      4..#d
24aa0 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55  efine FTS5_DEFAU
24ab0 4c 54 5f 55 53 45 52 4d 45 52 47 45 20 20 20 20  LT_USERMERGE    
24ac0 20 20 34 0d 0a 23 64 65 66 69 6e 65 20 46 54 53    4..#define FTS
24ad0 35 5f 44 45 46 41 55 4c 54 5f 43 52 49 53 49 53  5_DEFAULT_CRISIS
24ae0 4d 45 52 47 45 20 20 20 31 36 0d 0a 23 64 65 66  MERGE   16..#def
24af0 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54  ine FTS5_DEFAULT
24b00 5f 48 41 53 48 53 49 5a 45 20 20 20 20 28 31 30  _HASHSIZE    (10
24b10 32 34 2a 31 30 32 34 29 0d 0a 0d 0a 2f 2a 20 4d  24*1024)..../* M
24b20 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 70  aximum allowed p
24b30 61 67 65 20 73 69 7a 65 20 2a 2f 0d 0a 23 64 65  age size */..#de
24b40 66 69 6e 65 20 46 54 53 35 5f 4d 41 58 5f 50 41  fine FTS5_MAX_PA
24b50 47 45 5f 53 49 5a 45 20 28 31 32 38 2a 31 30 32  GE_SIZE (128*102
24b60 34 29 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  4)....static int
24b70 20 66 74 73 35 5f 69 73 77 68 69 74 65 73 70 61   fts5_iswhitespa
24b80 63 65 28 63 68 61 72 20 78 29 7b 0d 0a 20 20 72  ce(char x){..  r
24b90 65 74 75 72 6e 20 28 78 3d 3d 27 20 27 29 3b 0d  eturn (x==' ');.
24ba0 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74  .}....static int
24bb0 20 66 74 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74   fts5_isopenquot
24bc0 65 28 63 68 61 72 20 78 29 7b 0d 0a 20 20 72 65  e(char x){..  re
24bd0 74 75 72 6e 20 28 78 3d 3d 27 22 27 20 7c 7c 20  turn (x=='"' || 
24be0 78 3d 3d 27 5c 27 27 20 7c 7c 20 78 3d 3d 27 5b  x=='\'' || x=='[
24bf0 27 20 7c 7c 20 78 3d 3d 27 60 27 29 3b 0d 0a 7d  ' || x=='`');..}
24c00 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d  ..../*..** Argum
24c10 65 6e 74 20 70 49 6e 20 70 6f 69 6e 74 73 20 74  ent pIn points t
24c20 6f 20 61 20 63 68 61 72 61 63 74 65 72 20 74 68  o a character th
24c30 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  at is part of a 
24c40 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0d  nul-terminated .
24c50 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 52 65 74 75  .** string. Retu
24c60 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
24c70 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
24c80 74 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70  ter following *p
24c90 49 6e 20 69 6e 20 0d 0a 2a 2a 20 74 68 65 20 73  In in ..** the s
24ca0 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
24cb0 74 20 61 20 77 68 69 74 65 2d 73 70 61 63 65 20  t a white-space 
24cc0 63 68 61 72 61 63 74 65 72 2e 0d 0a 2a 2f 0d 0a  character...*/..
24cd0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
24ce0 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b 69  r *fts5ConfigSki
24cf0 70 57 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73  pWhitespace(cons
24d00 74 20 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20  t char *pIn){.. 
24d10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d   const char *p =
24d20 20 70 49 6e 3b 0d 0a 20 20 69 66 28 20 70 20 29   pIn;..  if( p )
24d30 7b 0d 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74  {..    while( ft
24d40 73 35 5f 69 73 77 68 69 74 65 73 70 61 63 65 28  s5_iswhitespace(
24d50 2a 70 29 20 29 7b 20 70 2b 2b 3b 20 7d 0d 0a 20  *p) ){ p++; }.. 
24d60 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d   }..  return p;.
24d70 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 72 67  .}..../*..** Arg
24d80 75 6d 65 6e 74 20 70 49 6e 20 70 6f 69 6e 74 73  ument pIn points
24d90 20 74 6f 20 61 20 63 68 61 72 61 63 74 65 72 20   to a character 
24da0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
24db0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
24dc0 20 0d 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 52 65   ..** string. Re
24dd0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
24de0 6f 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  o the first char
24df0 61 63 74 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  acter following 
24e00 2a 70 49 6e 20 69 6e 20 0d 0a 2a 2a 20 74 68 65  *pIn in ..** the
24e10 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
24e20 6e 6f 74 20 61 20 22 62 61 72 65 77 6f 72 64 22  not a "bareword"
24e30 20 63 68 61 72 61 63 74 65 72 2e 0d 0a 2a 2f 0d   character...*/.
24e40 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
24e50 61 72 20 2a 66 74 73 35 43 6f 6e 66 69 67 53 6b  ar *fts5ConfigSk
24e60 69 70 42 61 72 65 77 6f 72 64 28 63 6f 6e 73 74  ipBareword(const
24e70 20 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a 20 20   char *pIn){..  
24e80 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
24e90 70 49 6e 3b 0d 0a 20 20 77 68 69 6c 65 20 28 20  pIn;..  while ( 
24ea0 73 71 6c 69 74 65 33 46 74 73 35 49 73 42 61 72  sqlite3Fts5IsBar
24eb0 65 77 6f 72 64 28 2a 70 29 20 29 20 70 2b 2b 3b  eword(*p) ) p++;
24ec0 0d 0a 20 20 69 66 28 20 70 3d 3d 70 49 6e 20 29  ..  if( p==pIn )
24ed0 20 70 20 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72   p = 0;..  retur
24ee0 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69  n p;..}....stati
24ef0 63 20 69 6e 74 20 66 74 73 35 5f 69 73 64 69 67  c int fts5_isdig
24f00 69 74 28 63 68 61 72 20 61 29 7b 0d 0a 20 20 72  it(char a){..  r
24f10 65 74 75 72 6e 20 28 61 3e 3d 27 30 27 20 26 26  eturn (a>='0' &&
24f20 20 61 3c 3d 27 39 27 29 3b 0d 0a 7d 0d 0a 0d 0a   a<='9');..}....
24f30 0d 0a 0d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ....static const
24f40 20 63 68 61 72 20 2a 66 74 73 35 43 6f 6e 66 69   char *fts5Confi
24f50 67 53 6b 69 70 4c 69 74 65 72 61 6c 28 63 6f 6e  gSkipLiteral(con
24f60 73 74 20 63 68 61 72 20 2a 70 49 6e 29 7b 0d 0a  st char *pIn){..
24f70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20    const char *p 
24f80 3d 20 70 49 6e 3b 0d 0a 20 20 73 77 69 74 63 68  = pIn;..  switch
24f90 28 20 2a 70 20 29 7b 0d 0a 20 20 20 20 63 61 73  ( *p ){..    cas
24fa0 65 20 27 6e 27 3a 20 63 61 73 65 20 27 4e 27 3a  e 'n': case 'N':
24fb0 0d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
24fc0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 6e 75  te3_strnicmp("nu
24fd0 6c 6c 22 2c 20 70 2c 20 34 29 3d 3d 30 20 29 7b  ll", p, 4)==0 ){
24fe0 0d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 26 70  ..        p = &p
24ff0 5b 34 5d 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73  [4];..      }els
25000 65 7b 0d 0a 20 20 20 20 20 20 20 20 70 20 3d 20  e{..        p = 
25010 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  0;..      }..   
25020 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20     break;....   
25030 20 63 61 73 65 20 27 78 27 3a 20 63 61 73 65 20   case 'x': case 
25040 27 58 27 3a 0d 0a 20 20 20 20 20 20 70 2b 2b 3b  'X':..      p++;
25050 0d 0a 20 20 20 20 20 20 69 66 28 20 2a 70 3d 3d  ..      if( *p==
25060 27 5c 27 27 20 29 7b 0d 0a 20 20 20 20 20 20 20  '\'' ){..       
25070 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 77   p++;..        w
25080 68 69 6c 65 28 20 28 2a 70 3e 3d 27 61 27 20 26  hile( (*p>='a' &
25090 26 20 2a 70 3c 3d 27 66 27 29 20 0d 0a 20 20 20  & *p<='f') ..   
250a0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 2a 70 3e           || (*p>
250b0 3d 27 41 27 20 26 26 20 2a 70 3c 3d 27 46 27 29  ='A' && *p<='F')
250c0 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c   ..            |
250d0 7c 20 28 2a 70 3e 3d 27 30 27 20 26 26 20 2a 70  | (*p>='0' && *p
250e0 3c 3d 27 39 27 29 20 0d 0a 20 20 20 20 20 20 20  <='9') ..       
250f0 20 20 20 20 20 29 7b 0d 0a 20 20 20 20 20 20 20       ){..       
25100 20 20 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 20     p++;..       
25110 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
25120 2a 70 3d 3d 27 5c 27 27 20 26 26 20 30 3d 3d 28  *p=='\'' && 0==(
25130 28 70 2d 70 49 6e 29 25 32 29 20 29 7b 0d 0a 20  (p-pIn)%2) ){.. 
25140 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20           p++;.. 
25150 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20         }else{.. 
25160 20 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b 0d           p = 0;.
25170 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
25180 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
25190 20 20 70 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20    p = 0;..      
251a0 7d 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  }..      break;.
251b0 0a 0d 0a 20 20 20 20 63 61 73 65 20 27 5c 27 27  ...    case '\''
251c0 3a 0d 0a 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20  :..      p++;.. 
251d0 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b       while( p ){
251e0 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ..        if( *p
251f0 3d 3d 27 5c 27 27 20 29 7b 0d 0a 20 20 20 20 20  =='\'' ){..     
25200 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20 20 20 20       p++;..     
25210 20 20 20 20 20 69 66 28 20 2a 70 21 3d 27 5c 27       if( *p!='\'
25220 27 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20  ' ) break;..    
25230 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 70      }..        p
25240 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  ++;..        if(
25250 20 2a 70 3d 3d 30 20 29 20 70 20 3d 20 30 3b 0d   *p==0 ) p = 0;.
25260 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
25270 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 64 65  break;....    de
25280 66 61 75 6c 74 3a 0d 0a 20 20 20 20 20 20 2f 2a  fault:..      /*
25290 20 6d 61 79 62 65 20 61 20 6e 75 6d 62 65 72 20   maybe a number 
252a0 2a 2f 0d 0a 20 20 20 20 20 20 69 66 28 20 2a 70  */..      if( *p
252b0 3d 3d 27 2b 27 20 7c 7c 20 2a 70 3d 3d 27 2d 27  =='+' || *p=='-'
252c0 20 29 20 70 2b 2b 3b 0d 0a 20 20 20 20 20 20 77   ) p++;..      w
252d0 68 69 6c 65 28 20 66 74 73 35 5f 69 73 64 69 67  hile( fts5_isdig
252e0 69 74 28 2a 70 29 20 29 20 70 2b 2b 3b 0d 0a 0d  it(*p) ) p++;...
252f0 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69  .      /* At thi
25300 73 20 70 6f 69 6e 74 2c 20 69 66 20 74 68 65 20  s point, if the 
25310 6c 69 74 65 72 61 6c 20 77 61 73 20 61 6e 20 69  literal was an i
25320 6e 74 65 67 65 72 2c 20 74 68 65 20 70 61 72 73  nteger, the pars
25330 65 20 69 73 20 0d 0a 20 20 20 20 20 20 2a 2a 20  e is ..      ** 
25340 66 69 6e 69 73 68 65 64 2e 20 4f 72 2c 20 69 66  finished. Or, if
25350 20 69 74 20 69 73 20 61 20 66 6c 6f 61 74 69 6e   it is a floatin
25360 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2c 20 69  g point value, i
25370 74 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 0d 0a  t may continue..
25380 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 65 69        ** with ei
25390 74 68 65 72 20 61 20 64 65 63 69 6d 61 6c 20 70  ther a decimal p
253a0 6f 69 6e 74 20 6f 72 20 61 6e 20 27 45 27 20 63  oint or an 'E' c
253b0 68 61 72 61 63 74 65 72 2e 20 2a 2f 0d 0a 20 20  haracter. */..  
253c0 20 20 20 20 69 66 28 20 2a 70 3d 3d 27 2e 27 20      if( *p=='.' 
253d0 26 26 20 66 74 73 35 5f 69 73 64 69 67 69 74 28  && fts5_isdigit(
253e0 70 5b 31 5d 29 20 29 7b 0d 0a 20 20 20 20 20 20  p[1]) ){..      
253f0 20 20 70 20 2b 3d 20 32 3b 0d 0a 20 20 20 20 20    p += 2;..     
25400 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 5f 69     while( fts5_i
25410 73 64 69 67 69 74 28 2a 70 29 20 29 20 70 2b 2b  sdigit(*p) ) p++
25420 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
25430 20 20 69 66 28 20 70 3d 3d 70 49 6e 20 29 20 70    if( p==pIn ) p
25440 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 20 20 62   = 0;....      b
25450 72 65 61 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  reak;..  }....  
25460 72 65 74 75 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a  return p;..}....
25470 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  /*..** The first
25480 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
25490 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  e string pointed
254a0 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20   to by argument 
254b0 7a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0d  z is guaranteed.
254c0 0a 2a 2a 20 74 6f 20 62 65 20 61 6e 20 6f 70 65  .** to be an ope
254d0 6e 2d 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  n-quote characte
254e0 72 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20  r (see function 
254f0 66 74 73 35 5f 69 73 6f 70 65 6e 71 75 6f 74 65  fts5_isopenquote
25500 28 29 29 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69  ())...**..** Thi
25510 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
25520 68 65 73 20 66 6f 72 20 74 68 65 20 63 6f 72 72  hes for the corr
25530 65 73 70 6f 6e 64 69 6e 67 20 63 6c 6f 73 65 2d  esponding close-
25540 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
25550 77 69 74 68 69 6e 0d 0a 2a 2a 20 74 68 65 20 73  within..** the s
25560 74 72 69 6e 67 20 61 6e 64 2c 20 69 66 20 66 6f  tring and, if fo
25570 75 6e 64 2c 20 64 65 71 75 6f 74 65 73 20 74 68  und, dequotes th
25580 65 20 73 74 72 69 6e 67 20 69 6e 20 70 6c 61 63  e string in plac
25590 65 20 61 6e 64 20 61 64 64 73 20 61 20 6e 65 77  e and adds a new
255a0 0d 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ..** nul-termina
255b0 74 6f 72 20 62 79 74 65 2e 0d 0a 2a 2a 0d 0a 2a  tor byte...**..*
255c0 2a 20 49 66 20 74 68 65 20 63 6c 6f 73 65 2d 71  * If the close-q
255d0 75 6f 74 65 20 69 73 20 66 6f 75 6e 64 2c 20 74  uote is found, t
255e0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
255f0 64 20 69 73 20 74 68 65 20 62 79 74 65 20 6f 66  d is the byte of
25600 66 73 65 74 20 6f 66 0d 0a 2a 2a 20 74 68 65 20  fset of..** the 
25610 63 68 61 72 61 63 74 65 72 20 69 6d 6d 65 64 69  character immedi
25620 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
25630 69 74 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 63  it. Or, if the c
25640 6c 6f 73 65 2d 71 75 6f 74 65 20 69 73 20 6e 6f  lose-quote is no
25650 74 20 0d 0a 2a 2a 20 66 6f 75 6e 64 2c 20 2d 31  t ..** found, -1
25660 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
25670 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2c   -1 is returned,
25680 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6c   the buffer is l
25690 65 66 74 20 69 6e 20 61 6e 20 0d 0a 2a 2a 20 75  eft in an ..** u
256a0 6e 64 65 66 69 6e 65 64 20 73 74 61 74 65 2e 0d  ndefined state..
256b0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
256c0 66 74 73 35 44 65 71 75 6f 74 65 28 63 68 61 72  fts5Dequote(char
256d0 20 2a 7a 29 7b 0d 0a 20 20 63 68 61 72 20 71 3b   *z){..  char q;
256e0 0d 0a 20 20 69 6e 74 20 69 49 6e 20 3d 20 31 3b  ..  int iIn = 1;
256f0 0d 0a 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30  ..  int iOut = 0
25700 3b 0d 0a 20 20 71 20 3d 20 7a 5b 30 5d 3b 0d 0a  ;..  q = z[0];..
25710 0d 0a 20 20 2f 2a 20 53 65 74 20 73 74 61 63 6b  ..  /* Set stack
25720 20 76 61 72 69 61 62 6c 65 20 71 20 74 6f 20 74   variable q to t
25730 68 65 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63  he close-quote c
25740 68 61 72 61 63 74 65 72 20 2a 2f 0d 0a 20 20 61  haracter */..  a
25750 73 73 65 72 74 28 20 71 3d 3d 27 5b 27 20 7c 7c  ssert( q=='[' ||
25760 20 71 3d 3d 27 5c 27 27 20 7c 7c 20 71 3d 3d 27   q=='\'' || q=='
25770 22 27 20 7c 7c 20 71 3d 3d 27 60 27 20 29 3b 0d  "' || q=='`' );.
25780 0a 20 20 69 66 28 20 71 3d 3d 27 5b 27 20 29 20  .  if( q=='[' ) 
25790 71 20 3d 20 27 5d 27 3b 20 20 0d 0a 0d 0a 20 20  q = ']';  ....  
257a0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 7a 5b  while( ALWAYS(z[
257b0 69 49 6e 5d 29 20 29 7b 0d 0a 20 20 20 20 69 66  iIn]) ){..    if
257c0 28 20 7a 5b 69 49 6e 5d 3d 3d 71 20 29 7b 0d 0a  ( z[iIn]==q ){..
257d0 20 20 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 2b        if( z[iIn+
257e0 31 5d 21 3d 71 20 29 7b 0d 0a 20 20 20 20 20 20  1]!=q ){..      
257f0 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20 69    /* Character i
25800 49 6e 20 77 61 73 20 74 68 65 20 63 6c 6f 73 65  In was the close
25810 20 71 75 6f 74 65 2e 20 2a 2f 0d 0a 20 20 20 20   quote. */..    
25820 20 20 20 20 69 49 6e 2b 2b 3b 0d 0a 20 20 20 20      iIn++;..    
25830 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
25840 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
25850 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20 69    /* Character i
25860 49 6e 20 61 6e 64 20 69 49 6e 2b 31 20 66 6f 72  In and iIn+1 for
25870 6d 20 61 6e 20 65 73 63 61 70 65 64 20 71 75 6f  m an escaped quo
25880 74 65 20 63 68 61 72 61 63 74 65 72 2e 20 53 6b  te character. Sk
25890 69 70 0d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ip..        ** t
258a0 68 65 20 69 6e 70 75 74 20 63 75 72 73 6f 72 20  he input cursor 
258b0 70 61 73 74 20 62 6f 74 68 20 61 6e 64 20 63 6f  past both and co
258c0 70 79 20 61 20 73 69 6e 67 6c 65 20 71 75 6f 74  py a single quot
258d0 65 20 63 68 61 72 61 63 74 65 72 20 0d 0a 20 20  e character ..  
258e0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
258f0 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a  output buffer. *
25900 2f 0d 0a 20 20 20 20 20 20 20 20 69 49 6e 20 2b  /..        iIn +
25910 3d 20 32 3b 0d 0a 20 20 20 20 20 20 20 20 7a 5b  = 2;..        z[
25920 69 4f 75 74 2b 2b 5d 20 3d 20 71 3b 0d 0a 20 20  iOut++] = q;..  
25930 20 20 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73 65      }..    }else
25940 7b 0d 0a 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b  {..      z[iOut+
25950 2b 5d 20 3d 20 7a 5b 69 49 6e 2b 2b 5d 3b 0d 0a  +] = z[iIn++];..
25960 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
25970 7a 5b 69 4f 75 74 5d 20 3d 20 27 5c 30 27 3b 0d  z[iOut] = '\0';.
25980 0a 20 20 72 65 74 75 72 6e 20 69 49 6e 3b 0d 0a  .  return iIn;..
25990 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6e 76  }..../*..** Conv
259a0 65 72 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65  ert an SQL-style
259b0 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 69   quoted string i
259c0 6e 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72  nto a normal str
259d0 69 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e 67 0d  ing by removing.
259e0 0a 2a 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68  .** the quote ch
259f0 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 63  aracters.  The c
25a00 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e  onversion is don
25a10 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20  e in-place.  If 
25a20 74 68 65 0d 0a 2a 2a 20 69 6e 70 75 74 20 64 6f  the..** input do
25a30 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
25a40 68 20 61 20 71 75 6f 74 65 20 63 68 61 72 61 63  h a quote charac
25a50 74 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ter, then this r
25a60 6f 75 74 69 6e 65 0d 0a 2a 2a 20 69 73 20 61 20  outine..** is a 
25a70 6e 6f 2d 6f 70 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 45  no-op...**..** E
25a80 78 61 6d 70 6c 65 73 3a 0d 0a 2a 2a 0d 0a 2a 2a  xamples:..**..**
25a90 20 20 20 20 20 22 61 62 63 22 20 20 20 62 65 63       "abc"   bec
25aa0 6f 6d 65 73 20 20 20 61 62 63 0d 0a 2a 2a 20 20  omes   abc..**  
25ab0 20 20 20 27 78 79 7a 27 20 20 20 62 65 63 6f 6d     'xyz'   becom
25ac0 65 73 20 20 20 78 79 7a 0d 0a 2a 2a 20 20 20 20  es   xyz..**    
25ad0 20 5b 70 71 72 5d 20 20 20 62 65 63 6f 6d 65 73   [pqr]   becomes
25ae0 20 20 20 70 71 72 0d 0a 2a 2a 20 20 20 20 20 60     pqr..**     `
25af0 6d 6e 6f 60 20 20 20 62 65 63 6f 6d 65 73 20 20  mno`   becomes  
25b00 20 6d 6e 6f 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63   mno..*/..static
25b10 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73   void sqlite3Fts
25b20 35 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a  5Dequote(char *z
25b30 29 7b 0d 0a 20 20 63 68 61 72 20 71 75 6f 74 65  ){..  char quote
25b40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25b50 20 20 20 20 20 20 2f 2a 20 51 75 6f 74 65 20 63        /* Quote c
25b60 68 61 72 61 63 74 65 72 20 28 69 66 20 61 6e 79  haracter (if any
25b70 20 29 20 2a 2f 0d 0a 0d 0a 20 20 61 73 73 65 72   ) */....  asser
25b80 74 28 20 30 3d 3d 66 74 73 35 5f 69 73 77 68 69  t( 0==fts5_iswhi
25b90 74 65 73 70 61 63 65 28 7a 5b 30 5d 29 20 29 3b  tespace(z[0]) );
25ba0 0d 0a 20 20 71 75 6f 74 65 20 3d 20 7a 5b 30 5d  ..  quote = z[0]
25bb0 3b 0d 0a 20 20 69 66 28 20 71 75 6f 74 65 3d 3d  ;..  if( quote==
25bc0 27 5b 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 5c  '[' || quote=='\
25bd0 27 27 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 22 27  '' || quote=='"'
25be0 20 7c 7c 20 71 75 6f 74 65 3d 3d 27 60 27 20 29   || quote=='`' )
25bf0 7b 0d 0a 20 20 20 20 66 74 73 35 44 65 71 75 6f  {..    fts5Dequo
25c00 74 65 28 7a 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a  te(z);..  }..}..
25c10 0d 0a 0d 0a 73 74 72 75 63 74 20 46 74 73 35 45  ....struct Fts5E
25c20 6e 75 6d 20 7b 0d 0a 20 20 63 6f 6e 73 74 20 63  num {..  const c
25c30 68 61 72 20 2a 7a 4e 61 6d 65 3b 0d 0a 20 20 69  har *zName;..  i
25c40 6e 74 20 65 56 61 6c 3b 0d 0a 7d 3b 0d 0a 74 79  nt eVal;..};..ty
25c50 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
25c60 35 45 6e 75 6d 20 46 74 73 35 45 6e 75 6d 3b 0d  5Enum Fts5Enum;.
25c70 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  ...static int ft
25c80 73 35 43 6f 6e 66 69 67 53 65 74 45 6e 75 6d 28  s5ConfigSetEnum(
25c90 0d 0a 20 20 63 6f 6e 73 74 20 46 74 73 35 45 6e  ..  const Fts5En
25ca0 75 6d 20 2a 61 45 6e 75 6d 2c 20 0d 0a 20 20 63  um *aEnum, ..  c
25cb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 75 6d  onst char *zEnum
25cc0 2c 20 0d 0a 20 20 69 6e 74 20 2a 70 65 56 61 6c  , ..  int *peVal
25cd0 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 6e 45 6e 75  ..){..  int nEnu
25ce0 6d 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  m = (int)strlen(
25cf0 7a 45 6e 75 6d 29 3b 0d 0a 20 20 69 6e 74 20 69  zEnum);..  int i
25d00 3b 0d 0a 20 20 69 6e 74 20 69 56 61 6c 20 3d 20  ;..  int iVal = 
25d10 2d 31 3b 0d 0a 0d 0a 20 20 66 6f 72 28 69 3d 30  -1;....  for(i=0
25d20 3b 20 61 45 6e 75 6d 5b 69 5d 2e 7a 4e 61 6d 65  ; aEnum[i].zName
25d30 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69 66 28  ; i++){..    if(
25d40 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
25d50 70 28 61 45 6e 75 6d 5b 69 5d 2e 7a 4e 61 6d 65  p(aEnum[i].zName
25d60 2c 20 7a 45 6e 75 6d 2c 20 6e 45 6e 75 6d 29 3d  , zEnum, nEnum)=
25d70 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28  =0 ){..      if(
25d80 20 69 56 61 6c 3e 3d 30 20 29 20 72 65 74 75 72   iVal>=0 ) retur
25d90 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d  n SQLITE_ERROR;.
25da0 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 61 45  .      iVal = aE
25db0 6e 75 6d 5b 69 5d 2e 65 56 61 6c 3b 0d 0a 20 20  num[i].eVal;..  
25dc0 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70    }..  }....  *p
25dd0 65 56 61 6c 20 3d 20 69 56 61 6c 3b 0d 0a 20 20  eVal = iVal;..  
25de0 72 65 74 75 72 6e 20 69 56 61 6c 3c 30 20 3f 20  return iVal<0 ? 
25df0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53  SQLITE_ERROR : S
25e00 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a  QLITE_OK;..}....
25e10 2f 2a 0d 0a 2a 2a 20 50 61 72 73 65 20 61 20 22  /*..** Parse a "
25e20 73 70 65 63 69 61 6c 22 20 43 52 45 41 54 45 20  special" CREATE 
25e30 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 69  VIRTUAL TABLE di
25e40 72 65 63 74 69 76 65 20 61 6e 64 20 75 70 64 61  rective and upda
25e50 74 65 0d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61  te..** configura
25e60 74 69 6f 6e 20 6f 62 6a 65 63 74 20 70 43 6f 6e  tion object pCon
25e70 66 69 67 20 61 73 20 61 70 70 72 6f 70 72 69 61  fig as appropria
25e80 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73  te...**..** If s
25e90 75 63 63 65 73 73 66 75 6c 2c 20 6f 62 6a 65 63  uccessful, objec
25ea0 74 20 70 43 6f 6e 66 69 67 20 69 73 20 75 70 64  t pConfig is upd
25eb0 61 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  ated and SQLITE_
25ec0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0d  OK returned. If.
25ed0 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  .** an error occ
25ee0 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
25ef0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
25f00 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
25f10 6f 72 20 6d 65 73 73 61 67 65 0d 0a 2a 2a 20 6d  or message..** m
25f20 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 2a 70  ay be left in *p
25f30 7a 45 72 72 2e 20 49 74 20 69 73 20 74 68 65 20  zErr. It is the 
25f40 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
25f50 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 0d  f the caller to.
25f60 0a 2a 2a 20 65 76 65 6e 74 75 61 6c 6c 79 20 66  .** eventually f
25f70 72 65 65 20 61 6e 79 20 73 75 63 68 20 65 72 72  ree any such err
25f80 6f 72 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67  or message using
25f90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
25fa0 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
25fb0 20 66 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65   fts5ConfigParse
25fc0 53 70 65 63 69 61 6c 28 0d 0a 20 20 46 74 73 35  Special(..  Fts5
25fd0 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c  Global *pGlobal,
25fe0 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  ..  Fts5Config *
25ff0 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20  pConfig,        
26000 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61      /* Configura
26010 74 69 6f 6e 20 6f 62 6a 65 63 74 20 74 6f 20 75  tion object to u
26020 70 64 61 74 65 20 2a 2f 0d 0a 20 20 63 6f 6e 73  pdate */..  cons
26030 74 20 63 68 61 72 20 2a 7a 43 6d 64 2c 20 20 20  t char *zCmd,   
26040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26050 70 65 63 69 61 6c 20 63 6f 6d 6d 61 6e 64 20 74  pecial command t
26060 6f 20 70 61 72 73 65 20 2a 2f 0d 0a 20 20 63 6f  o parse */..  co
26070 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26090 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72   Argument to par
260a0 73 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a  se */..  char **
260b0 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20  pzErr           
260c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
260d0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   Error message *
260e0 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20  /..){..  int rc 
260f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  = SQLITE_OK;..  
26100 69 6e 74 20 6e 43 6d 64 20 3d 20 28 69 6e 74 29  int nCmd = (int)
26110 73 74 72 6c 65 6e 28 7a 43 6d 64 29 3b 0d 0a 20  strlen(zCmd);.. 
26120 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
26130 6e 69 63 6d 70 28 22 70 72 65 66 69 78 22 2c 20  nicmp("prefix", 
26140 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29  zCmd, nCmd)==0 )
26150 7b 0d 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  {..    const int
26160 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
26170 69 6e 74 29 20 2a 20 46 54 53 35 5f 4d 41 58 5f  int) * FTS5_MAX_
26180 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 3b 0d  PREFIX_INDEXES;.
26190 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
261a0 2a 70 3b 0d 0a 20 20 20 20 69 6e 74 20 62 46 69  *p;..    int bFi
261b0 72 73 74 20 3d 20 31 3b 0d 0a 20 20 20 20 69 66  rst = 1;..    if
261c0 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  ( pConfig->aPref
261d0 69 78 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  ix==0 ){..      
261e0 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
261f0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61   = sqlite3Fts5Ma
26200 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
26210 79 74 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 28  yte);..      if(
26220 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
26230 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70  ..    }....    p
26240 20 3d 20 7a 41 72 67 3b 0d 0a 20 20 20 20 77 68   = zArg;..    wh
26250 69 6c 65 28 20 31 20 29 7b 0d 0a 20 20 20 20 20  ile( 1 ){..     
26260 20 69 6e 74 20 6e 50 72 65 20 3d 20 30 3b 0d 0a   int nPre = 0;..
26270 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ..      while( p
26280 5b 30 5d 3d 3d 27 20 27 20 29 20 70 2b 2b 3b 0d  [0]==' ' ) p++;.
26290 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 72 73  .      if( bFirs
262a0 74 3d 3d 30 20 26 26 20 70 5b 30 5d 3d 3d 27 2c  t==0 && p[0]==',
262b0 27 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 2b  ' ){..        p+
262c0 2b 3b 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c  +;..        whil
262d0 65 28 20 70 5b 30 5d 3d 3d 27 20 27 20 29 20 70  e( p[0]==' ' ) p
262e0 2b 2b 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ++;..      }else
262f0 20 69 66 28 20 70 5b 30 5d 3d 3d 27 5c 30 27 20   if( p[0]=='\0' 
26300 29 7b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  ){..        brea
26310 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  k;..      }..   
26320 20 20 20 69 66 28 20 70 5b 30 5d 3c 27 30 27 20     if( p[0]<'0' 
26330 7c 7c 20 70 5b 30 5d 3e 27 39 27 20 29 7b 0d 0a  || p[0]>'9' ){..
26340 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d          *pzErr =
26350 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26360 28 22 6d 61 6c 66 6f 72 6d 65 64 20 70 72 65 66  ("malformed pref
26370 69 78 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65  ix=... directive
26380 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 63 20  ");..        rc 
26390 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d  = SQLITE_ERROR;.
263a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
263b0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
263c0 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e    if( pConfig->n
263d0 50 72 65 66 69 78 3d 3d 46 54 53 35 5f 4d 41 58  Prefix==FTS5_MAX
263e0 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20  _PREFIX_INDEXES 
263f0 29 7b 0d 0a 20 20 20 20 20 20 20 20 2a 70 7a 45  ){..        *pzE
26400 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
26410 69 6e 74 66 28 0d 0a 20 20 20 20 20 20 20 20 20  intf(..         
26420 20 20 20 22 74 6f 6f 20 6d 61 6e 79 20 70 72 65     "too many pre
26430 66 69 78 20 69 6e 64 65 78 65 73 20 28 6d 61 78  fix indexes (max
26440 20 25 64 29 22 2c 20 46 54 53 35 5f 4d 41 58 5f   %d)", FTS5_MAX_
26450 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 0d 0a  PREFIX_INDEXES..
26460 20 20 20 20 20 20 20 20 29 3b 0d 0a 20 20 20 20          );..    
26470 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26480 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 20 20  ERROR;..        
26490 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d  break;..      }.
264a0 0a 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ...      while( 
264b0 70 5b 30 5d 3e 3d 27 30 27 20 26 26 20 70 5b 30  p[0]>='0' && p[0
264c0 5d 3c 3d 27 39 27 20 26 26 20 6e 50 72 65 3c 31  ]<='9' && nPre<1
264d0 30 30 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  000 ){..        
264e0 6e 50 72 65 20 3d 20 6e 50 72 65 2a 31 30 20 2b  nPre = nPre*10 +
264f0 20 28 70 5b 30 5d 20 2d 20 27 30 27 29 3b 0d 0a   (p[0] - '0');..
26500 20 20 20 20 20 20 20 20 70 2b 2b 3b 0d 0a 20 20          p++;..  
26510 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
26520 66 28 20 6e 50 72 65 3c 3d 30 20 7c 7c 20 6e 50  f( nPre<=0 || nP
26530 72 65 3e 3d 31 30 30 30 20 29 7b 0d 0a 20 20 20  re>=1000 ){..   
26540 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
26550 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 70  lite3_mprintf("p
26560 72 65 66 69 78 20 6c 65 6e 67 74 68 20 6f 75 74  refix length out
26570 20 6f 66 20 72 61 6e 67 65 20 28 6d 61 78 20 39   of range (max 9
26580 39 39 29 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  99)");..        
26590 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
265a0 52 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61  R;..        brea
265b0 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  k;..      }.... 
265c0 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 61 50       pConfig->aP
265d0 72 65 66 69 78 5b 70 43 6f 6e 66 69 67 2d 3e 6e  refix[pConfig->n
265e0 50 72 65 66 69 78 5d 20 3d 20 6e 50 72 65 3b 0d  Prefix] = nPre;.
265f0 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e  .      pConfig->
26600 6e 50 72 65 66 69 78 2b 2b 3b 0d 0a 20 20 20 20  nPrefix++;..    
26610 20 20 62 46 69 72 73 74 20 3d 20 30 3b 0d 0a 20    bFirst = 0;.. 
26620 20 20 20 7d 0d 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
26630 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  ( pConfig->nPref
26640 69 78 3c 3d 46 54 53 35 5f 4d 41 58 5f 50 52 45  ix<=FTS5_MAX_PRE
26650 46 49 58 5f 49 4e 44 45 58 45 53 20 29 3b 0d 0a  FIX_INDEXES );..
26660 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a      return rc;..
26670 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c    }....  if( sql
26680 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 74  ite3_strnicmp("t
26690 6f 6b 65 6e 69 7a 65 22 2c 20 7a 43 6d 64 2c 20  okenize", zCmd, 
266a0 6e 43 6d 64 29 3d 3d 30 20 29 7b 0d 0a 20 20 20  nCmd)==0 ){..   
266b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d   const char *p =
266c0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 41   (const char*)zA
266d0 72 67 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  rg;..    sqlite3
266e0 5f 69 6e 74 36 34 20 6e 41 72 67 20 3d 20 73 74  _int64 nArg = st
266f0 72 6c 65 6e 28 7a 41 72 67 29 20 2b 20 31 3b 0d  rlen(zArg) + 1;.
26700 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  .    char **azAr
26710 67 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  g = sqlite3Fts5M
26720 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
26730 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e  izeof(char*) * n
26740 41 72 67 29 3b 0d 0a 20 20 20 20 63 68 61 72 20  Arg);..    char 
26750 2a 70 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 46  *pDel = sqlite3F
26760 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
26770 63 2c 20 6e 41 72 67 20 2a 20 32 29 3b 0d 0a 20  c, nArg * 2);.. 
26780 20 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 20     char *pSpace 
26790 3d 20 70 44 65 6c 3b 0d 0a 0d 0a 20 20 20 20 69  = pDel;....    i
267a0 66 28 20 61 7a 41 72 67 20 26 26 20 70 53 70 61  f( azArg && pSpa
267b0 63 65 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28  ce ){..      if(
267c0 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 20 29   pConfig->pTok )
267d0 7b 0d 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  {..        *pzEr
267e0 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
267f0 6e 74 66 28 22 6d 75 6c 74 69 70 6c 65 20 74 6f  ntf("multiple to
26800 6b 65 6e 69 7a 65 3d 2e 2e 2e 20 64 69 72 65 63  kenize=... direc
26810 74 69 76 65 73 22 29 3b 0d 0a 20 20 20 20 20 20  tives");..      
26820 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26830 52 4f 52 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73  ROR;..      }els
26840 65 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 28  e{..        for(
26850 6e 41 72 67 3d 30 3b 20 70 20 26 26 20 2a 70 3b  nArg=0; p && *p;
26860 20 6e 41 72 67 2b 2b 29 7b 0d 0a 20 20 20 20 20   nArg++){..     
26870 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
26880 2a 70 32 20 3d 20 66 74 73 35 43 6f 6e 66 69 67  *p2 = fts5Config
26890 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70  SkipWhitespace(p
268a0 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
268b0 28 20 2a 70 32 3d 3d 27 5c 27 27 20 29 7b 0d 0a  ( *p2=='\'' ){..
268c0 20 20 20 20 20 20 20 20 20 20 20 20 70 20 3d 20              p = 
268d0 66 74 73 35 43 6f 6e 66 69 67 53 6b 69 70 4c 69  fts5ConfigSkipLi
268e0 74 65 72 61 6c 28 70 32 29 3b 0d 0a 20 20 20 20  teral(p2);..    
268f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20        }else{..  
26900 20 20 20 20 20 20 20 20 20 20 70 20 3d 20 66 74            p = ft
26910 73 35 43 6f 6e 66 69 67 53 6b 69 70 42 61 72 65  s5ConfigSkipBare
26920 77 6f 72 64 28 70 32 29 3b 0d 0a 20 20 20 20 20  word(p2);..     
26930 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
26940 20 20 69 66 28 20 70 20 29 7b 0d 0a 20 20 20 20    if( p ){..    
26950 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
26960 53 70 61 63 65 2c 20 70 32 2c 20 70 2d 70 32 29  Space, p2, p-p2)
26970 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ;..            a
26980 7a 41 72 67 5b 6e 41 72 67 5d 20 3d 20 70 53 70  zArg[nArg] = pSp
26990 61 63 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ace;..          
269a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71    sqlite3Fts5Deq
269b0 75 6f 74 65 28 70 53 70 61 63 65 29 3b 0d 0a 20  uote(pSpace);.. 
269c0 20 20 20 20 20 20 20 20 20 20 20 70 53 70 61 63             pSpac
269d0 65 20 2b 3d 20 28 70 20 2d 20 70 32 29 20 2b 20  e += (p - p2) + 
269e0 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
269f0 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  p = fts5ConfigSk
26a00 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b  ipWhitespace(p);
26a10 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
26a20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
26a30 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0d 0a 20    if( p==0 ){.. 
26a40 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20           *pzErr 
26a50 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
26a60 66 28 22 70 61 72 73 65 20 65 72 72 6f 72 20 69  f("parse error i
26a70 6e 20 74 6f 6b 65 6e 69 7a 65 20 64 69 72 65 63  n tokenize direc
26a80 74 69 76 65 22 29 3b 0d 0a 20 20 20 20 20 20 20  tive");..       
26a90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26aa0 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 20 20 7d  RROR;..        }
26ab0 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20  else{..         
26ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
26ad0 35 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 70 47  5GetTokenizer(pG
26ae0 6c 6f 62 61 6c 2c 20 0d 0a 20 20 20 20 20 20 20  lobal, ..       
26af0 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
26b00 61 72 2a 2a 29 61 7a 41 72 67 2c 20 28 69 6e 74  ar**)azArg, (int
26b10 29 6e 41 72 67 2c 20 26 70 43 6f 6e 66 69 67 2d  )nArg, &pConfig-
26b20 3e 70 54 6f 6b 2c 20 26 70 43 6f 6e 66 69 67 2d  >pTok, &pConfig-
26b30 3e 70 54 6f 6b 41 70 69 2c 0d 0a 20 20 20 20 20  >pTokApi,..     
26b40 20 20 20 20 20 20 20 20 20 70 7a 45 72 72 0d 0a           pzErr..
26b50 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a 20 20            );..  
26b60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
26b70 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73  ..    }....    s
26b80 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 41 72  qlite3_free(azAr
26b90 67 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  g);..    sqlite3
26ba0 5f 66 72 65 65 28 70 44 65 6c 29 3b 0d 0a 20 20  _free(pDel);..  
26bb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20    return rc;..  
26bc0 7d 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c 69 74  }....  if( sqlit
26bd0 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 63 6f 6e  e3_strnicmp("con
26be0 74 65 6e 74 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d  tent", zCmd, nCm
26bf0 64 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 69 66  d)==0 ){..    if
26c00 28 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74  ( pConfig->eCont
26c10 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45 4e  ent!=FTS5_CONTEN
26c20 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0d 0a 20 20 20  T_NORMAL ){..   
26c30 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
26c40 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 75 6c  te3_mprintf("mul
26c50 74 69 70 6c 65 20 63 6f 6e 74 65 6e 74 3d 2e 2e  tiple content=..
26c60 2e 20 64 69 72 65 63 74 69 76 65 73 22 29 3b 0d  . directives");.
26c70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26c80 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d  TE_ERROR;..    }
26c90 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 69 66 28  else{..      if(
26ca0 20 7a 41 72 67 5b 30 5d 20 29 7b 0d 0a 20 20 20   zArg[0] ){..   
26cb0 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 65 43       pConfig->eC
26cc0 6f 6e 74 65 6e 74 20 3d 20 46 54 53 35 5f 43 4f  ontent = FTS5_CO
26cd0 4e 54 45 4e 54 5f 45 58 54 45 52 4e 41 4c 3b 0d  NTENT_EXTERNAL;.
26ce0 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67  .        pConfig
26cf0 2d 3e 7a 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  ->zContent = sql
26d00 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28  ite3Fts5Mprintf(
26d10 26 72 63 2c 20 22 25 51 2e 25 51 22 2c 20 70 43  &rc, "%Q.%Q", pC
26d20 6f 6e 66 69 67 2d 3e 7a 44 62 2c 7a 41 72 67 29  onfig->zDb,zArg)
26d30 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d  ;..      }else{.
26d40 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67  .        pConfig
26d50 2d 3e 65 43 6f 6e 74 65 6e 74 20 3d 20 46 54 53  ->eContent = FTS
26d60 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 3b 0d  5_CONTENT_NONE;.
26d70 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
26d80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  .    return rc;.
26d90 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 73 71  .  }....  if( sq
26da0 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
26db0 63 6f 6e 74 65 6e 74 5f 72 6f 77 69 64 22 2c 20  content_rowid", 
26dc0 7a 43 6d 64 2c 20 6e 43 6d 64 29 3d 3d 30 20 29  zCmd, nCmd)==0 )
26dd0 7b 0d 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66  {..    if( pConf
26de0 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69  ig->zContentRowi
26df0 64 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 7a 45  d ){..      *pzE
26e00 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
26e10 69 6e 74 66 28 22 6d 75 6c 74 69 70 6c 65 20 63  intf("multiple c
26e20 6f 6e 74 65 6e 74 5f 72 6f 77 69 64 3d 2e 2e 2e  ontent_rowid=...
26e30 20 64 69 72 65 63 74 69 76 65 73 22 29 3b 0d 0a   directives");..
26e40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26e50 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 65  E_ERROR;..    }e
26e60 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6e  lse{..      pCon
26e70 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77  fig->zContentRow
26e80 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  id = sqlite3Fts5
26e90 53 74 72 6e 64 75 70 28 26 72 63 2c 20 7a 41 72  Strndup(&rc, zAr
26ea0 67 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 7d 0d 0a  g, -1);..    }..
26eb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a      return rc;..
26ec0 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c    }....  if( sql
26ed0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 63  ite3_strnicmp("c
26ee0 6f 6c 75 6d 6e 73 69 7a 65 22 2c 20 7a 43 6d 64  olumnsize", zCmd
26ef0 2c 20 6e 43 6d 64 29 3d 3d 30 20 29 7b 0d 0a 20  , nCmd)==0 ){.. 
26f00 20 20 20 69 66 28 20 28 7a 41 72 67 5b 30 5d 21     if( (zArg[0]!
26f10 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 30 5d 21  ='0' && zArg[0]!
26f20 3d 27 31 27 29 20 7c 7c 20 7a 41 72 67 5b 31 5d  ='1') || zArg[1]
26f30 21 3d 27 5c 30 27 20 29 7b 0d 0a 20 20 20 20 20  !='\0' ){..     
26f40 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
26f50 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c 66 6f  3_mprintf("malfo
26f60 72 6d 65 64 20 63 6f 6c 75 6d 6e 73 69 7a 65 3d  rmed columnsize=
26f70 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 22 29 3b  ... directive");
26f80 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ..      rc = SQL
26f90 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20  ITE_ERROR;..    
26fa0 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 43  }else{..      pC
26fb0 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75 6d 6e 73 69  onfig->bColumnsi
26fc0 7a 65 20 3d 20 28 7a 41 72 67 5b 30 5d 3d 3d 27  ze = (zArg[0]=='
26fd0 31 27 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  1');..    }..   
26fe0 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d   return rc;..  }
26ff0 0d 0a 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ....  if( sqlite
27000 33 5f 73 74 72 6e 69 63 6d 70 28 22 64 65 74 61  3_strnicmp("deta
27010 69 6c 22 2c 20 7a 43 6d 64 2c 20 6e 43 6d 64 29  il", zCmd, nCmd)
27020 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73  ==0 ){..    cons
27030 74 20 46 74 73 35 45 6e 75 6d 20 61 44 65 74 61  t Fts5Enum aDeta
27040 69 6c 5b 5d 20 3d 20 7b 0d 0a 20 20 20 20 20 20  il[] = {..      
27050 7b 20 22 6e 6f 6e 65 22 2c 20 46 54 53 35 5f 44  { "none", FTS5_D
27060 45 54 41 49 4c 5f 4e 4f 4e 45 20 7d 2c 0d 0a 20  ETAIL_NONE },.. 
27070 20 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 46       { "full", F
27080 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20  TS5_DETAIL_FULL 
27090 7d 2c 0d 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c  },..      { "col
270a0 75 6d 6e 73 22 2c 20 46 54 53 35 5f 44 45 54 41  umns", FTS5_DETA
270b0 49 4c 5f 43 4f 4c 55 4d 4e 53 20 7d 2c 0d 0a 20  IL_COLUMNS },.. 
270c0 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0d 0a 20       { 0, 0 }.. 
270d0 20 20 20 7d 3b 0d 0a 0d 0a 20 20 20 20 69 66 28     };....    if(
270e0 20 28 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69   (rc = fts5Confi
270f0 67 53 65 74 45 6e 75 6d 28 61 44 65 74 61 69 6c  gSetEnum(aDetail
27100 2c 20 7a 41 72 67 2c 20 26 70 43 6f 6e 66 69 67  , zArg, &pConfig
27110 2d 3e 65 44 65 74 61 69 6c 29 29 20 29 7b 0d 0a  ->eDetail)) ){..
27120 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73        *pzErr = s
27130 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
27140 6d 61 6c 66 6f 72 6d 65 64 20 64 65 74 61 69 6c  malformed detail
27150 3d 2e 2e 2e 20 64 69 72 65 63 74 69 76 65 22 29  =... directive")
27160 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65  ;..    }..    re
27170 74 75 72 6e 20 72 63 3b 0d 0a 20 20 7d 0d 0a 0d  turn rc;..  }...
27180 0a 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69  .  *pzErr = sqli
27190 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 72  te3_mprintf("unr
271a0 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e  ecognized option
271b0 3a 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 6e 43 6d  : \"%.*s\"", nCm
271c0 64 2c 20 7a 43 6d 64 29 3b 0d 0a 20 20 72 65 74  d, zCmd);..  ret
271d0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
271e0 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41  ;..}..../*..** A
271f0 6c 6c 6f 63 61 74 65 20 61 6e 20 69 6e 73 74 61  llocate an insta
27200 6e 63 65 20 6f 66 20 74 68 65 20 64 65 66 61 75  nce of the defau
27210 6c 74 20 74 6f 6b 65 6e 69 7a 65 72 20 28 22 73  lt tokenizer ("s
27220 69 6d 70 6c 65 22 29 20 61 74 20 0d 0a 2a 2a 20  imple") at ..** 
27230 46 74 73 35 43 6f 6e 66 69 67 2e 70 54 6f 6b 65  Fts5Config.pToke
27240 6e 69 7a 65 72 2e 20 52 65 74 75 72 6e 20 53 51  nizer. Return SQ
27250 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
27260 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
27270 69 74 65 20 65 72 72 6f 72 0d 0a 2a 2a 20 63 6f  ite error..** co
27280 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  de if an error o
27290 63 63 75 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  ccurs...*/..stat
272a0 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e 66 69  ic int fts5Confi
272b0 67 44 65 66 61 75 6c 74 54 6f 6b 65 6e 69 7a 65  gDefaultTokenize
272c0 72 28 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47  r(Fts5Global *pG
272d0 6c 6f 62 61 6c 2c 20 46 74 73 35 43 6f 6e 66 69  lobal, Fts5Confi
272e0 67 20 2a 70 43 6f 6e 66 69 67 29 7b 0d 0a 20 20  g *pConfig){..  
272f0 61 73 73 65 72 74 28 20 70 43 6f 6e 66 69 67 2d  assert( pConfig-
27300 3e 70 54 6f 6b 3d 3d 30 20 26 26 20 70 43 6f 6e  >pTok==0 && pCon
27310 66 69 67 2d 3e 70 54 6f 6b 41 70 69 3d 3d 30 20  fig->pTokApi==0 
27320 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  );..  return sql
27330 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b 65 6e  ite3Fts5GetToken
27340 69 7a 65 72 28 0d 0a 20 20 20 20 20 20 70 47 6c  izer(..      pGl
27350 6f 62 61 6c 2c 20 30 2c 20 30 2c 20 26 70 43 6f  obal, 0, 0, &pCo
27360 6e 66 69 67 2d 3e 70 54 6f 6b 2c 20 26 70 43 6f  nfig->pTok, &pCo
27370 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69 2c 20 30  nfig->pTokApi, 0
27380 0d 0a 20 20 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  ..  );..}..../*.
27390 0a 2a 2a 20 47 6f 62 62 6c 65 20 75 70 20 74 68  .** Gobble up th
273a0 65 20 66 69 72 73 74 20 62 61 72 65 77 6f 72 64  e first bareword
273b0 20 6f 72 20 71 75 6f 74 65 64 20 77 6f 72 64 20   or quoted word 
273c0 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
273d0 75 66 66 65 72 20 7a 49 6e 2e 0d 0a 2a 2a 20 52  uffer zIn...** R
273e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
273f0 74 6f 20 74 68 65 20 63 68 61 72 61 63 74 65 72  to the character
27400 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
27410 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
27420 69 6e 0d 0a 2a 2a 20 74 68 65 20 67 6f 62 62 6c  in..** the gobbl
27430 65 64 20 77 6f 72 64 20 69 66 20 73 75 63 63 65  ed word if succe
27440 73 73 66 75 6c 2c 20 6f 72 20 61 20 4e 55 4c 4c  ssful, or a NULL
27450 20 70 6f 69 6e 74 65 72 20 6f 74 68 65 72 77 69   pointer otherwi
27460 73 65 20 28 66 61 69 6c 65 64 0d 0a 2a 2a 20 74  se (failed..** t
27470 6f 20 66 69 6e 64 20 63 6c 6f 73 65 2d 71 75 6f  o find close-quo
27480 74 65 20 63 68 61 72 61 63 74 65 72 29 2e 0d 0a  te character)...
27490 2a 2a 0d 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  **..** Before re
274a0 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 70 7a 4f  turning, set pzO
274b0 75 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ut to point to a
274c0 20 6e 65 77 20 62 75 66 66 65 72 20 63 6f 6e 74   new buffer cont
274d0 61 69 6e 69 6e 67 20 61 0d 0a 2a 2a 20 6e 75 6c  aining a..** nul
274e0 2d 74 65 72 6d 69 6e 61 74 65 64 2c 20 64 65 71  -terminated, deq
274f0 75 6f 74 65 64 20 63 6f 70 79 20 6f 66 20 74 68  uoted copy of th
27500 65 20 67 6f 62 62 6c 65 64 20 77 6f 72 64 2e 20  e gobbled word. 
27510 49 66 20 74 68 65 20 77 6f 72 64 20 77 61 73 0d  If the word was.
27520 0a 2a 2a 20 71 75 6f 74 65 64 2c 20 2a 70 62 51  .** quoted, *pbQ
27530 75 6f 74 65 64 20 69 73 20 61 6c 73 6f 20 73 65  uoted is also se
27540 74 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65  t to 1 before re
27550 74 75 72 6e 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a  turning...**..**
27560 20 49 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65   If *pRc is othe
27570 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
27580 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
27590 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
275a0 74 20 69 73 0d 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  t is..** a no-op
275b0 20 28 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e   (NULL is return
275c0 65 64 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ed). Otherwise, 
275d0 69 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  if an OOM occurs
275e0 20 77 69 74 68 69 6e 20 74 68 69 73 0d 0a 2a 2a   within this..**
275f0 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20   function, *pRc 
27600 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
27610 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65 20 72 65  _NOMEM before re
27620 74 75 72 6e 69 6e 67 2e 20 2a 70 52 63 20 69 73  turning. *pRc is
27630 20 2a 6e 6f 74 2a 0d 0a 2a 2a 20 73 65 74 20 69   *not*..** set i
27640 66 20 61 20 70 61 72 73 65 20 65 72 72 6f 72 20  f a parse error 
27650 28 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20  (failed to find 
27660 63 6c 6f 73 65 20 71 75 6f 74 65 29 20 6f 63 63  close quote) occ
27670 75 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  urs...*/..static
27680 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 74 73   const char *fts
27690 35 43 6f 6e 66 69 67 47 6f 62 62 6c 65 57 6f 72  5ConfigGobbleWor
276a0 64 28 0d 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  d(..  int *pRc, 
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
276d0 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0d 0a   Error code */..
276e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
276f0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
27700 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 67    /* Buffer to g
27710 6f 62 62 6c 65 20 73 74 72 69 6e 67 2f 62 61 72  obble string/bar
27720 65 77 6f 72 64 20 66 72 6f 6d 20 2a 2f 0d 0a 20  eword from */.. 
27730 20 63 68 61 72 20 2a 2a 70 7a 4f 75 74 2c 20 20   char **pzOut,  
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 2f 2a 20 4f 55 54 3a 20 6d 61 6c 6c 6f 63 27   /* OUT: malloc'
27760 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  d buffer contain
27770 69 6e 67 20 73 74 72 2f 62 77 20 2a 2f 0d 0a 20  ing str/bw */.. 
27780 20 69 6e 74 20 2a 70 62 51 75 6f 74 65 64 20 20   int *pbQuoted  
27790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277a0 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
277b0 74 72 75 65 20 69 66 20 64 65 71 75 6f 74 69 6e  true if dequotin
277c0 67 20 72 65 71 75 69 72 65 64 20 2a 2f 0d 0a 29  g required */..)
277d0 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  {..  const char 
277e0 2a 7a 52 65 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20  *zRet = 0;....  
277f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 49  sqlite3_int64 nI
27800 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49 6e 29 3b  n = strlen(zIn);
27810 0d 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ..  char *zOut =
27820 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
27830 34 28 6e 49 6e 2b 31 29 3b 0d 0a 0d 0a 20 20 61  4(nIn+1);....  a
27840 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c  ssert( *pRc==SQL
27850 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 2a 70 62  ITE_OK );..  *pb
27860 51 75 6f 74 65 64 20 3d 20 30 3b 0d 0a 20 20 2a  Quoted = 0;..  *
27870 70 7a 4f 75 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20  pzOut = 0;....  
27880 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0d 0a  if( zOut==0 ){..
27890 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
278a0 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 65 6c 73  E_NOMEM;..  }els
278b0 65 7b 0d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  e{..    memcpy(z
278c0 4f 75 74 2c 20 7a 49 6e 2c 20 28 73 69 7a 65 5f  Out, zIn, (size_
278d0 74 29 28 6e 49 6e 2b 31 29 29 3b 0d 0a 20 20 20  t)(nIn+1));..   
278e0 20 69 66 28 20 66 74 73 35 5f 69 73 6f 70 65 6e   if( fts5_isopen
278f0 71 75 6f 74 65 28 7a 4f 75 74 5b 30 5d 29 20 29  quote(zOut[0]) )
27900 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 69 69 20  {..      int ii 
27910 3d 20 66 74 73 35 44 65 71 75 6f 74 65 28 7a 4f  = fts5Dequote(zO
27920 75 74 29 3b 0d 0a 20 20 20 20 20 20 7a 52 65 74  ut);..      zRet
27930 20 3d 20 26 7a 49 6e 5b 69 69 5d 3b 0d 0a 20 20   = &zIn[ii];..  
27940 20 20 20 20 2a 70 62 51 75 6f 74 65 64 20 3d 20      *pbQuoted = 
27950 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a  1;..    }else{..
27960 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
27970 35 43 6f 6e 66 69 67 53 6b 69 70 42 61 72 65 77  5ConfigSkipBarew
27980 6f 72 64 28 7a 49 6e 29 3b 0d 0a 20 20 20 20 20  ord(zIn);..     
27990 20 69 66 28 20 7a 52 65 74 20 29 7b 0d 0a 20 20   if( zRet ){..  
279a0 20 20 20 20 20 20 7a 4f 75 74 5b 7a 52 65 74 2d        zOut[zRet-
279b0 7a 49 6e 5d 20 3d 20 27 5c 30 27 3b 0d 0a 20 20  zIn] = '\0';..  
279c0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
279d0 7d 0d 0a 0d 0a 20 20 69 66 28 20 7a 52 65 74 3d  }....  if( zRet=
279e0 3d 30 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74  =0 ){..    sqlit
279f0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0d 0a  e3_free(zOut);..
27a00 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 2a 70    }else{..    *p
27a10 7a 4f 75 74 20 3d 20 7a 4f 75 74 3b 0d 0a 20 20  zOut = zOut;..  
27a20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 7a 52  }....  return zR
27a30 65 74 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63  et;..}....static
27a40 20 69 6e 74 20 66 74 73 35 43 6f 6e 66 69 67 50   int fts5ConfigP
27a50 61 72 73 65 43 6f 6c 75 6d 6e 28 0d 0a 20 20 46  arseColumn(..  F
27a60 74 73 35 43 6f 6e 66 69 67 20 2a 70 2c 20 0d 0a  ts5Config *p, ..
27a70 20 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 0d 0a    char *zCol, ..
27a80 20 20 63 68 61 72 20 2a 7a 41 72 67 2c 20 0d 0a    char *zArg, ..
27a90 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0d 0a    char **pzErr..
27aa0 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ){..  int rc = S
27ab0 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69 66 28  QLITE_OK;..  if(
27ac0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
27ad0 63 6d 70 28 7a 43 6f 6c 2c 20 46 54 53 35 5f 52  cmp(zCol, FTS5_R
27ae0 41 4e 4b 5f 4e 41 4d 45 29 20 0d 0a 20 20 20 7c  ANK_NAME) ..   |
27af0 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  | 0==sqlite3_str
27b00 69 63 6d 70 28 7a 43 6f 6c 2c 20 46 54 53 35 5f  icmp(zCol, FTS5_
27b10 52 4f 57 49 44 5f 4e 41 4d 45 29 20 0d 0a 20 20  ROWID_NAME) ..  
27b20 29 7b 0d 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d  ){..    *pzErr =
27b30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
27b40 28 22 72 65 73 65 72 76 65 64 20 66 74 73 35 20  ("reserved fts5 
27b50 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
27b60 2c 20 7a 43 6f 6c 29 3b 0d 0a 20 20 20 20 72 63  , zCol);..    rc
27b70 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
27b80 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ..  }else if( zA
27b90 72 67 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 30  rg ){..    if( 0
27ba0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
27bb0 70 28 7a 41 72 67 2c 20 22 75 6e 69 6e 64 65 78  p(zArg, "unindex
27bc0 65 64 22 29 20 29 7b 0d 0a 20 20 20 20 20 20 70  ed") ){..      p
27bd0 2d 3e 61 62 55 6e 69 6e 64 65 78 65 64 5b 70 2d  ->abUnindexed[p-
27be0 3e 6e 43 6f 6c 5d 20 3d 20 31 3b 0d 0a 20 20 20  >nCol] = 1;..   
27bf0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 2a   }else{..      *
27c00 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
27c10 6d 70 72 69 6e 74 66 28 22 75 6e 72 65 63 6f 67  mprintf("unrecog
27c20 6e 69 7a 65 64 20 63 6f 6c 75 6d 6e 20 6f 70 74  nized column opt
27c30 69 6f 6e 3a 20 25 73 22 2c 20 7a 41 72 67 29 3b  ion: %s", zArg);
27c40 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ..      rc = SQL
27c50 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20  ITE_ERROR;..    
27c60 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 70 2d 3e 61  }..  }....  p->a
27c70 7a 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 20  zCol[p->nCol++] 
27c80 3d 20 7a 43 6f 6c 3b 0d 0a 20 20 72 65 74 75 72  = zCol;..  retur
27c90 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a  n rc;..}..../*..
27ca0 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
27cb0 46 74 73 35 43 6f 6e 66 69 67 2e 7a 43 6f 6e 74  Fts5Config.zCont
27cc0 65 6e 74 45 78 70 72 6c 69 73 74 20 73 74 72 69  entExprlist stri
27cd0 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ng...*/..static 
27ce0 69 6e 74 20 66 74 73 35 43 6f 6e 66 69 67 4d 61  int fts5ConfigMa
27cf0 6b 65 45 78 70 72 6c 69 73 74 28 46 74 73 35 43  keExprlist(Fts5C
27d00 6f 6e 66 69 67 20 2a 70 29 7b 0d 0a 20 20 69 6e  onfig *p){..  in
27d10 74 20 69 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d  t i;..  int rc =
27d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 46   SQLITE_OK;..  F
27d30 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
27d40 7b 30 2c 20 30 2c 20 30 7d 3b 0d 0a 0d 0a 20 20  {0, 0, 0};....  
27d50 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
27d60 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
27d70 63 2c 20 26 62 75 66 2c 20 22 54 2e 25 51 22 2c  c, &buf, "T.%Q",
27d80 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 52 6f 77 69   p->zContentRowi
27d90 64 29 3b 0d 0a 20 20 69 66 28 20 70 2d 3e 65 43  d);..  if( p->eC
27da0 6f 6e 74 65 6e 74 21 3d 46 54 53 35 5f 43 4f 4e  ontent!=FTS5_CON
27db0 54 45 4e 54 5f 4e 4f 4e 45 20 29 7b 0d 0a 20 20  TENT_NONE ){..  
27dc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
27dd0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  nCol; i++){..   
27de0 20 20 20 69 66 28 20 70 2d 3e 65 43 6f 6e 74 65     if( p->eConte
27df0 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54  nt==FTS5_CONTENT
27e00 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0d 0a 20 20  _EXTERNAL ){..  
27e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
27e20 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
27e30 6e 74 66 28 26 72 63 2c 20 26 62 75 66 2c 20 22  ntf(&rc, &buf, "
27e40 2c 20 54 2e 25 51 22 2c 20 70 2d 3e 61 7a 43 6f  , T.%Q", p->azCo
27e50 6c 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 20 7d 65  l[i]);..      }e
27e60 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 73 71  lse{..        sq
27e70 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
27e80 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
27e90 20 26 62 75 66 2c 20 22 2c 20 54 2e 63 25 64 22   &buf, ", T.c%d"
27ea0 2c 20 69 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  , i);..      }..
27eb0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
27ec0 61 73 73 65 72 74 28 20 70 2d 3e 7a 43 6f 6e 74  assert( p->zCont
27ed0 65 6e 74 45 78 70 72 6c 69 73 74 3d 3d 30 20 29  entExprlist==0 )
27ee0 3b 0d 0a 20 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74  ;..  p->zContent
27ef0 45 78 70 72 6c 69 73 74 20 3d 20 28 63 68 61 72  Exprlist = (char
27f00 2a 29 62 75 66 2e 70 3b 0d 0a 20 20 72 65 74 75  *)buf.p;..  retu
27f10 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  rn rc;..}..../*.
27f20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 6e 41  .** Arguments nA
27f30 72 67 2f 61 7a 41 72 67 20 63 6f 6e 74 61 69 6e  rg/azArg contain
27f40 20 74 68 65 20 73 74 72 69 6e 67 20 61 72 67 75   the string argu
27f50 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
27f60 74 68 65 20 78 43 72 65 61 74 65 0d 0a 2a 2a 20  the xCreate..** 
27f70 6f 72 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68  or xConnect meth
27f80 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
27f90 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
27fa0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
27fb0 74 6f 20 0d 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  to ..** allocate
27fc0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
27fd0 46 74 73 35 43 6f 6e 66 69 67 20 63 6f 6e 74 61  Fts5Config conta
27fe0 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
27ff0 73 20 6f 66 20 70 61 72 73 69 6e 67 0d 0a 2a 2a  s of parsing..**
28000 20 74 68 6f 73 65 20 61 72 67 75 6d 65 6e 74 73   those arguments
28010 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 73 75 63  ...**..** If suc
28020 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
28030 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
28040 6e 64 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  nd *ppOut is set
28050 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
28060 0d 0a 2a 2a 20 6e 65 77 20 46 74 73 35 43 6f 6e  ..** new Fts5Con
28070 66 69 67 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  fig object. If a
28080 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
28090 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
280a0 63 6f 64 65 20 69 73 20 0d 0a 2a 2a 20 72 65 74  code is ..** ret
280b0 75 72 6e 65 64 2c 20 2a 70 70 4f 75 74 20 69 73  urned, *ppOut is
280c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
280d0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
280e0 65 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  e may be left in
280f0 0d 0a 2a 2a 20 2a 70 7a 45 72 72 2e 20 49 74 20  ..** *pzErr. It 
28100 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
28110 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
28120 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
28130 79 20 66 72 65 65 20 61 6e 79 20 0d 0a 2a 2a 20  y free any ..** 
28140 73 75 63 68 20 65 72 72 6f 72 20 6d 65 73 73 61  such error messa
28150 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
28160 5f 66 72 65 65 28 29 2e 0d 0a 2a 2f 0d 0a 73 74  _free()...*/..st
28170 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
28180 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28  Fts5ConfigParse(
28190 0d 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a  ..  Fts5Global *
281a0 70 47 6c 6f 62 61 6c 2c 0d 0a 20 20 73 71 6c 69  pGlobal,..  sqli
281b0 74 65 33 20 2a 64 62 2c 0d 0a 20 20 69 6e 74 20  te3 *db,..  int 
281c0 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
281d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
281e0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
281f0 74 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63  ts */..  const c
28200 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
28210 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
28220 79 20 6f 66 20 6e 41 72 67 20 43 52 45 41 54 45  y of nArg CREATE
28230 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 61   VIRTUAL TABLE a
28240 72 67 73 20 2a 2f 0d 0a 20 20 46 74 73 35 43 6f  rgs */..  Fts5Co
28250 6e 66 69 67 20 2a 2a 70 70 4f 75 74 2c 20 20 20  nfig **ppOut,   
28260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
28270 3a 20 52 65 73 75 6c 74 73 20 6f 66 20 70 61 72  : Results of par
28280 73 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a  se */..  char **
28290 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20  pzErr           
282a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
282b0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   Error message *
282c0 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20  /..){..  int rc 
282d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
282e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
282f0 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 46 74  rn code */..  Ft
28300 73 35 43 6f 6e 66 69 67 20 2a 70 52 65 74 3b 20  s5Config *pRet; 
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28320 20 4e 65 77 20 6f 62 6a 65 63 74 20 74 6f 20 72   New object to r
28330 65 74 75 72 6e 20 2a 2f 0d 0a 20 20 69 6e 74 20  eturn */..  int 
28340 69 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  i;..  sqlite3_in
28350 74 36 34 20 6e 42 79 74 65 3b 0d 0a 0d 0a 20 20  t64 nByte;....  
28360 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 20 3d 20  *ppOut = pRet = 
28370 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 73 71 6c  (Fts5Config*)sql
28380 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
28390 6f 66 28 46 74 73 35 43 6f 6e 66 69 67 29 29 3b  of(Fts5Config));
283a0 0d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ..  if( pRet==0 
283b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
283c0 4e 4f 4d 45 4d 3b 0d 0a 20 20 6d 65 6d 73 65 74  NOMEM;..  memset
283d0 28 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (pRet, 0, sizeof
283e0 28 46 74 73 35 43 6f 6e 66 69 67 29 29 3b 0d 0a  (Fts5Config));..
283f0 20 20 70 52 65 74 2d 3e 64 62 20 3d 20 64 62 3b    pRet->db = db;
28400 0d 0a 20 20 70 52 65 74 2d 3e 69 43 6f 6f 6b 69  ..  pRet->iCooki
28410 65 20 3d 20 2d 31 3b 0d 0a 0d 0a 20 20 6e 42 79  e = -1;....  nBy
28420 74 65 20 3d 20 6e 41 72 67 20 2a 20 28 73 69 7a  te = nArg * (siz
28430 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a  eof(char*) + siz
28440 65 6f 66 28 75 38 29 29 3b 0d 0a 20 20 70 52 65  eof(u8));..  pRe
28450 74 2d 3e 61 7a 43 6f 6c 20 3d 20 28 63 68 61 72  t->azCol = (char
28460 2a 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  **)sqlite3Fts5Ma
28470 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
28480 79 74 65 29 3b 0d 0a 20 20 70 52 65 74 2d 3e 61  yte);..  pRet->a
28490 62 55 6e 69 6e 64 65 78 65 64 20 3d 20 28 75 38  bUnindexed = (u8
284a0 2a 29 26 70 52 65 74 2d 3e 61 7a 43 6f 6c 5b 6e  *)&pRet->azCol[n
284b0 41 72 67 5d 3b 0d 0a 20 20 70 52 65 74 2d 3e 7a  Arg];..  pRet->z
284c0 44 62 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  Db = sqlite3Fts5
284d0 53 74 72 6e 64 75 70 28 26 72 63 2c 20 61 7a 41  Strndup(&rc, azA
284e0 72 67 5b 31 5d 2c 20 2d 31 29 3b 0d 0a 20 20 70  rg[1], -1);..  p
284f0 52 65 74 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Ret->zName = sql
28500 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28  ite3Fts5Strndup(
28510 26 72 63 2c 20 61 7a 41 72 67 5b 32 5d 2c 20 2d  &rc, azArg[2], -
28520 31 29 3b 0d 0a 20 20 70 52 65 74 2d 3e 62 43 6f  1);..  pRet->bCo
28530 6c 75 6d 6e 73 69 7a 65 20 3d 20 31 3b 0d 0a 20  lumnsize = 1;.. 
28540 20 70 52 65 74 2d 3e 65 44 65 74 61 69 6c 20 3d   pRet->eDetail =
28550 20 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c   FTS5_DETAIL_FUL
28560 4c 3b 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  L;..#ifdef SQLIT
28570 45 5f 44 45 42 55 47 0d 0a 20 20 70 52 65 74 2d  E_DEBUG..  pRet-
28580 3e 62 50 72 65 66 69 78 49 6e 64 65 78 20 3d 20  >bPrefixIndex = 
28590 31 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 66  1;..#endif..  if
285a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
285b0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
285c0 6d 70 28 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c 20  mp(pRet->zName, 
285d0 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45 29 3d  FTS5_RANK_NAME)=
285e0 3d 30 20 29 7b 0d 0a 20 20 20 20 2a 70 7a 45 72  =0 ){..    *pzEr
285f0 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
28600 6e 74 66 28 22 72 65 73 65 72 76 65 64 20 66 74  ntf("reserved ft
28610 73 35 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25  s5 table name: %
28620 73 22 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 29  s", pRet->zName)
28630 3b 0d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ;..    rc = SQLI
28640 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 7d 0d 0a  TE_ERROR;..  }..
28650 0d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 72 63 3d  ..  for(i=3; rc=
28660 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
28670 6e 41 72 67 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  nArg; i++){..   
28680 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
28690 69 67 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0d 0a  ig = azArg[i];..
286a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
286b0 7a 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f  z;..    char *zO
286c0 6e 65 20 3d 20 30 3b 0d 0a 20 20 20 20 63 68 61  ne = 0;..    cha
286d0 72 20 2a 7a 54 77 6f 20 3d 20 30 3b 0d 0a 20 20  r *zTwo = 0;..  
286e0 20 20 69 6e 74 20 62 4f 70 74 69 6f 6e 20 3d 20    int bOption = 
286f0 30 3b 0d 0a 20 20 20 20 69 6e 74 20 62 4d 75 73  0;..    int bMus
28700 74 42 65 43 6f 6c 20 3d 20 30 3b 0d 0a 0d 0a 20  tBeCol = 0;.... 
28710 20 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69     z = fts5Confi
28720 67 47 6f 62 62 6c 65 57 6f 72 64 28 26 72 63 2c  gGobbleWord(&rc,
28730 20 7a 4f 72 69 67 2c 20 26 7a 4f 6e 65 2c 20 26   zOrig, &zOne, &
28740 62 4d 75 73 74 42 65 43 6f 6c 29 3b 0d 0a 20 20  bMustBeCol);..  
28750 20 20 7a 20 3d 20 66 74 73 35 43 6f 6e 66 69 67    z = fts5Config
28760 53 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 7a  SkipWhitespace(z
28770 29 3b 0d 0a 20 20 20 20 69 66 28 20 7a 20 26 26  );..    if( z &&
28780 20 2a 7a 3d 3d 27 3d 27 20 29 7b 0d 0a 20 20 20   *z=='=' ){..   
28790 20 20 20 62 4f 70 74 69 6f 6e 20 3d 20 31 3b 0d     bOption = 1;.
287a0 0a 20 20 20 20 20 20 7a 2b 2b 3b 0d 0a 20 20 20  .      z++;..   
287b0 20 20 20 69 66 28 20 62 4d 75 73 74 42 65 43 6f     if( bMustBeCo
287c0 6c 20 29 20 7a 20 3d 20 30 3b 0d 0a 20 20 20 20  l ) z = 0;..    
287d0 7d 0d 0a 20 20 20 20 7a 20 3d 20 66 74 73 35 43  }..    z = fts5C
287e0 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73 70  onfigSkipWhitesp
287f0 61 63 65 28 7a 29 3b 0d 0a 20 20 20 20 69 66 28  ace(z);..    if(
28800 20 7a 20 26 26 20 7a 5b 30 5d 20 29 7b 0d 0a 20   z && z[0] ){.. 
28810 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
28820 0d 0a 20 20 20 20 20 20 7a 20 3d 20 66 74 73 35  ..      z = fts5
28830 43 6f 6e 66 69 67 47 6f 62 62 6c 65 57 6f 72 64  ConfigGobbleWord
28840 28 26 72 63 2c 20 7a 2c 20 26 7a 54 77 6f 2c 20  (&rc, z, &zTwo, 
28850 26 62 44 75 6d 6d 79 29 3b 0d 0a 20 20 20 20 20  &bDummy);..     
28860 20 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d 20 29   if( z && z[0] )
28870 20 7a 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a   z = 0;..    }..
28880 0d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
28890 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20  LITE_OK ){..    
288a0 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0d 0a 20    if( z==0 ){.. 
288b0 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
288c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
288d0 22 70 61 72 73 65 20 65 72 72 6f 72 20 69 6e 20  "parse error in 
288e0 5c 22 25 73 5c 22 22 2c 20 7a 4f 72 69 67 29 3b  \"%s\"", zOrig);
288f0 0d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ..        rc = S
28900 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20  QLITE_ERROR;..  
28910 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20      }else{..    
28920 20 20 20 20 69 66 28 20 62 4f 70 74 69 6f 6e 20      if( bOption 
28930 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 63  ){..          rc
28940 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 50 61 72   = fts5ConfigPar
28950 73 65 53 70 65 63 69 61 6c 28 70 47 6c 6f 62 61  seSpecial(pGloba
28960 6c 2c 20 70 52 65 74 2c 20 7a 4f 6e 65 2c 20 7a  l, pRet, zOne, z
28970 54 77 6f 3f 7a 54 77 6f 3a 22 22 2c 20 70 7a 45  Two?zTwo:"", pzE
28980 72 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 65  rr);..        }e
28990 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse{..          
289a0 72 63 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 50  rc = fts5ConfigP
289b0 61 72 73 65 43 6f 6c 75 6d 6e 28 70 52 65 74 2c  arseColumn(pRet,
289c0 20 7a 4f 6e 65 2c 20 7a 54 77 6f 2c 20 70 7a 45   zOne, zTwo, pzE
289d0 72 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rr);..          
289e0 7a 4f 6e 65 20 3d 20 30 3b 0d 0a 20 20 20 20 20  zOne = 0;..     
289f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
28a00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 71 6c 69     }....    sqli
28a10 74 65 33 5f 66 72 65 65 28 7a 4f 6e 65 29 3b 0d  te3_free(zOne);.
28a20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28a30 65 28 7a 54 77 6f 29 3b 0d 0a 20 20 7d 0d 0a 0d  e(zTwo);..  }...
28a40 0a 20 20 2f 2a 20 49 66 20 61 20 74 6f 6b 65 6e  .  /* If a token
28a50 69 7a 65 72 3d 20 6f 70 74 69 6f 6e 20 77 61 73  izer= option was
28a60 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 70 61   successfully pa
28a70 72 73 65 64 2c 20 74 68 65 20 74 6f 6b 65 6e 69  rsed, the tokeni
28a80 7a 65 72 20 68 61 73 0d 0a 20 20 2a 2a 20 61 6c  zer has..  ** al
28a90 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
28aa0 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
28ab0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 69 6e 73   allocate an ins
28ac0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 64 65 66  tance of the def
28ad0 61 75 6c 74 0d 0a 20 20 2a 2a 20 74 6f 6b 65 6e  ault..  ** token
28ae0 69 7a 65 72 20 28 75 6e 69 63 6f 64 65 36 31 29  izer (unicode61)
28af0 20 6e 6f 77 2e 20 20 2a 2f 0d 0a 20 20 69 66 28   now.  */..  if(
28b00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28b10 26 20 70 52 65 74 2d 3e 70 54 6f 6b 3d 3d 30 20  & pRet->pTok==0 
28b20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 66 74 73  ){..    rc = fts
28b30 35 43 6f 6e 66 69 67 44 65 66 61 75 6c 74 54 6f  5ConfigDefaultTo
28b40 6b 65 6e 69 7a 65 72 28 70 47 6c 6f 62 61 6c 2c  kenizer(pGlobal,
28b50 20 70 52 65 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a   pRet);..  }....
28b60 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 43 6f 6e 74    /* If no zCont
28b70 65 6e 74 20 6f 70 74 69 6f 6e 20 77 61 73 20 73  ent option was s
28b80 70 65 63 69 66 69 65 64 2c 20 66 69 6c 6c 20 69  pecified, fill i
28b90 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  n the default va
28ba0 6c 75 65 73 2e 20 2a 2f 0d 0a 20 20 69 66 28 20  lues. */..  if( 
28bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28bc0 20 70 52 65 74 2d 3e 7a 43 6f 6e 74 65 6e 74 3d   pRet->zContent=
28bd0 3d 30 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73 74  =0 ){..    const
28be0 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
28bf0 3b 0d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
28c00 52 65 74 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46  Ret->eContent==F
28c10 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d  TS5_CONTENT_NORM
28c20 41 4c 20 0d 0a 20 20 20 20 20 20 20 20 20 7c 7c  AL ..         ||
28c30 20 70 52 65 74 2d 3e 65 43 6f 6e 74 65 6e 74 3d   pRet->eContent=
28c40 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f  =FTS5_CONTENT_NO
28c50 4e 45 20 0d 0a 20 20 20 20 29 3b 0d 0a 20 20 20  NE ..    );..   
28c60 20 69 66 28 20 70 52 65 74 2d 3e 65 43 6f 6e 74   if( pRet->eCont
28c70 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e  ent==FTS5_CONTEN
28c80 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0d 0a 20 20 20  T_NORMAL ){..   
28c90 20 20 20 7a 54 61 69 6c 20 3d 20 22 63 6f 6e 74     zTail = "cont
28ca0 65 6e 74 22 3b 0d 0a 20 20 20 20 7d 65 6c 73 65  ent";..    }else
28cb0 20 69 66 28 20 70 52 65 74 2d 3e 62 43 6f 6c 75   if( pRet->bColu
28cc0 6d 6e 73 69 7a 65 20 29 7b 0d 0a 20 20 20 20 20  mnsize ){..     
28cd0 20 7a 54 61 69 6c 20 3d 20 22 64 6f 63 73 69 7a   zTail = "docsiz
28ce0 65 22 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  e";..    }....  
28cf0 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0d 0a    if( zTail ){..
28d00 20 20 20 20 20 20 70 52 65 74 2d 3e 7a 43 6f 6e        pRet->zCon
28d10 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 74  tent = sqlite3Ft
28d20 73 35 4d 70 72 69 6e 74 66 28 0d 0a 20 20 20 20  s5Mprintf(..    
28d30 20 20 20 20 20 20 26 72 63 2c 20 22 25 51 2e 27        &rc, "%Q.'
28d40 25 71 5f 25 73 27 22 2c 20 70 52 65 74 2d 3e 7a  %q_%s'", pRet->z
28d50 44 62 2c 20 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c  Db, pRet->zName,
28d60 20 7a 54 61 69 6c 0d 0a 20 20 20 20 20 20 29 3b   zTail..      );
28d70 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
28d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28d90 5f 4f 4b 20 26 26 20 70 52 65 74 2d 3e 7a 43 6f  _OK && pRet->zCo
28da0 6e 74 65 6e 74 52 6f 77 69 64 3d 3d 30 20 29 7b  ntentRowid==0 ){
28db0 0d 0a 20 20 20 20 70 52 65 74 2d 3e 7a 43 6f 6e  ..    pRet->zCon
28dc0 74 65 6e 74 52 6f 77 69 64 20 3d 20 73 71 6c 69  tentRowid = sqli
28dd0 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26  te3Fts5Strndup(&
28de0 72 63 2c 20 22 72 6f 77 69 64 22 2c 20 2d 31 29  rc, "rowid", -1)
28df0 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 46  ;..  }....  /* F
28e00 6f 72 6d 75 6c 61 74 65 20 74 68 65 20 7a 43 6f  ormulate the zCo
28e10 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 20 74 65  ntentExprlist te
28e20 78 74 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63 3d  xt */..  if( rc=
28e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
28e40 20 20 20 72 63 20 3d 20 66 74 73 35 43 6f 6e 66     rc = fts5Conf
28e50 69 67 4d 61 6b 65 45 78 70 72 6c 69 73 74 28 70  igMakeExprlist(p
28e60 52 65 74 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  Ret);..  }....  
28e70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28e80 4b 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65  K ){..    sqlite
28e90 33 46 74 73 35 43 6f 6e 66 69 67 46 72 65 65 28  3Fts5ConfigFree(
28ea0 70 52 65 74 29 3b 0d 0a 20 20 20 20 2a 70 70 4f  pRet);..    *ppO
28eb0 75 74 20 3d 20 30 3b 0d 0a 20 20 7d 0d 0a 20 20  ut = 0;..  }..  
28ec0 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d  return rc;..}...
28ed0 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65  ./*..** Free the
28ee0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
28ef0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
28f00 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
28f10 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76  t...*/..static v
28f20 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 43  oid sqlite3Fts5C
28f30 6f 6e 66 69 67 46 72 65 65 28 46 74 73 35 43 6f  onfigFree(Fts5Co
28f40 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 29 7b 0d  nfig *pConfig){.
28f50 0a 20 20 69 66 28 20 70 43 6f 6e 66 69 67 20 29  .  if( pConfig )
28f60 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20  {..    int i;.. 
28f70 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
28f80 70 54 6f 6b 20 29 7b 0d 0a 20 20 20 20 20 20 70  pTok ){..      p
28f90 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69 2d  Config->pTokApi-
28fa0 3e 78 44 65 6c 65 74 65 28 70 43 6f 6e 66 69 67  >xDelete(pConfig
28fb0 2d 3e 70 54 6f 6b 29 3b 0d 0a 20 20 20 20 7d 0d  ->pTok);..    }.
28fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28fd0 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 29 3b  e(pConfig->zDb);
28fe0 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
28ff0 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  ee(pConfig->zNam
29000 65 29 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30  e);..    for(i=0
29010 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  ; i<pConfig->nCo
29020 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  l; i++){..      
29030 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
29040 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 3b  nfig->azCol[i]);
29050 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c  ..    }..    sql
29060 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
29070 67 2d 3e 61 7a 43 6f 6c 29 3b 0d 0a 20 20 20 20  g->azCol);..    
29080 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
29090 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 29 3b 0d  nfig->aPrefix);.
290a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
290b0 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b  e(pConfig->zRank
290c0 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  );..    sqlite3_
290d0 66 72 65 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 52  free(pConfig->zR
290e0 61 6e 6b 41 72 67 73 29 3b 0d 0a 20 20 20 20 73  ankArgs);..    s
290f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e  qlite3_free(pCon
29100 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 29 3b 0d  fig->zContent);.
29110 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29120 65 28 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74  e(pConfig->zCont
29130 65 6e 74 52 6f 77 69 64 29 3b 0d 0a 20 20 20 20  entRowid);..    
29140 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
29150 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 45 78  nfig->zContentEx
29160 70 72 6c 69 73 74 29 3b 0d 0a 20 20 20 20 73 71  prlist);..    sq
29170 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66  lite3_free(pConf
29180 69 67 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a  ig);..  }..}....
29190 2f 2a 0d 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  /*..** Call sqli
291a0 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
291b0 28 29 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  () based on the 
291c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
291d0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 2a  configuration..*
291e0 2a 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  * object passed 
291f0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
29200 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 53 51 4c  ment. Return SQL
29210 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
29220 73 66 75 6c 2c 20 6f 72 0d 0a 2a 2a 20 61 6e 20  sful, or..** an 
29230 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
29240 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
29250 63 75 72 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  curs...*/..stati
29260 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  c int sqlite3Fts
29270 35 43 6f 6e 66 69 67 44 65 63 6c 61 72 65 56 74  5ConfigDeclareVt
29280 61 62 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  ab(Fts5Config *p
29290 43 6f 6e 66 69 67 29 7b 0d 0a 20 20 69 6e 74 20  Config){..  int 
292a0 69 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  i;..  int rc = S
292b0 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 63 68 61  QLITE_OK;..  cha
292c0 72 20 2a 7a 53 71 6c 3b 0d 0a 0d 0a 20 20 7a 53  r *zSql;....  zS
292d0 71 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  ql = sqlite3Fts5
292e0 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 43 52  Mprintf(&rc, "CR
292f0 45 41 54 45 20 54 41 42 4c 45 20 78 28 22 29 3b  EATE TABLE x(");
29300 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 53 71  ..  for(i=0; zSq
29310 6c 20 26 26 20 69 3c 70 43 6f 6e 66 69 67 2d 3e  l && i<pConfig->
29320 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  nCol; i++){..   
29330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
29340 70 20 3d 20 28 69 3d 3d 30 3f 22 22 3a 22 2c 20  p = (i==0?"":", 
29350 22 29 3b 0d 0a 20 20 20 20 7a 53 71 6c 20 3d 20  ");..    zSql = 
29360 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e  sqlite3Fts5Mprin
29370 74 66 28 26 72 63 2c 20 22 25 7a 25 73 25 51 22  tf(&rc, "%z%s%Q"
29380 2c 20 7a 53 71 6c 2c 20 7a 53 65 70 2c 20 70 43  , zSql, zSep, pC
29390 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 5d 29  onfig->azCol[i])
293a0 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 53 71 6c 20 3d  ;..  }..  zSql =
293b0 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69   sqlite3Fts5Mpri
293c0 6e 74 66 28 26 72 63 2c 20 22 25 7a 2c 20 25 51  ntf(&rc, "%z, %Q
293d0 20 48 49 44 44 45 4e 2c 20 25 73 20 48 49 44 44   HIDDEN, %s HIDD
293e0 45 4e 29 22 2c 20 0d 0a 20 20 20 20 20 20 7a 53  EN)", ..      zS
293f0 71 6c 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  ql, pConfig->zNa
29400 6d 65 2c 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41  me, FTS5_RANK_NA
29410 4d 45 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20 61 73  ME..  );....  as
29420 73 65 72 74 28 20 7a 53 71 6c 20 7c 7c 20 72 63  sert( zSql || rc
29430 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
29440 3b 0d 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  ;..  if( zSql ){
29450 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
29460 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
29470 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
29480 6c 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  l);..    sqlite3
29490 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0d 0a 20 20  _free(zSql);..  
294a0 7d 0d 0a 20 20 0d 0a 20 20 72 65 74 75 72 6e 20  }..  ..  return 
294b0 72 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  rc;..}..../*..**
294c0 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 74 65   Tokenize the te
294d0 78 74 20 70 61 73 73 65 64 20 76 69 61 20 74 68  xt passed via th
294e0 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
294f0 72 64 20 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 2a  rd arguments...*
29500 2a 0d 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  *..** The callba
29510 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  ck is invoked on
29520 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65  ce for each toke
29530 6e 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74  n in the input t
29540 65 78 74 2e 20 54 68 65 0d 0a 2a 2a 20 61 72 67  ext. The..** arg
29550 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
29560 20 69 74 20 61 72 65 2c 20 69 6e 20 6f 72 64 65   it are, in orde
29570 72 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 76  r:..**..**     v
29580 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20 20 20  oid *pCtx       
29590 20 20 20 2f 2f 20 43 6f 70 79 20 6f 66 20 34 74     // Copy of 4t
295a0 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  h argument to sq
295b0 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a  lite3Fts5Tokeniz
295c0 65 28 29 0d 0a 2a 2a 20 20 20 20 20 63 6f 6e 73  e()..**     cons
295d0 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 20 20  t char *pToken  
295e0 2f 2f 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  // Pointer to bu
295f0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
29600 74 6f 6b 65 6e 0d 0a 2a 2a 20 20 20 20 20 69 6e  token..**     in
29610 74 20 6e 54 6f 6b 65 6e 20 20 20 20 20 20 20 20  t nToken        
29620 20 20 2f 2f 20 53 69 7a 65 20 6f 66 20 74 6f 6b    // Size of tok
29630 65 6e 20 69 6e 20 62 79 74 65 73 0d 0a 2a 2a 20  en in bytes..** 
29640 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 20      int iStart  
29650 20 20 20 20 20 20 20 20 2f 2f 20 42 79 74 65 20          // Byte 
29660 6f 66 66 73 65 74 20 6f 66 20 73 74 61 72 74 20  offset of start 
29670 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
29680 69 6e 70 75 74 20 74 65 78 74 0d 0a 2a 2a 20 20  input text..**  
29690 20 20 20 69 6e 74 20 69 45 6e 64 20 20 20 20 20     int iEnd     
296a0 20 20 20 20 20 20 20 2f 2f 20 42 79 74 65 20 6f         // Byte o
296b0 66 66 73 65 74 20 6f 66 20 65 6e 64 20 6f 66 20  ffset of end of 
296c0 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 69 6e 70  token within inp
296d0 75 74 20 74 65 78 74 0d 0a 2a 2a 20 20 20 20 20  ut text..**     
296e0 69 6e 74 20 69 50 6f 73 20 20 20 20 20 20 20 20  int iPos        
296f0 20 20 20 20 2f 2f 20 50 6f 73 69 74 69 6f 6e 20      // Position 
29700 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 69 6e 70 75  of token in inpu
29710 74 20 28 66 69 72 73 74 20 74 6f 6b 65 6e 20 69  t (first token i
29720 73 20 30 29 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20  s 0)..**..** If 
29730 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  the callback ret
29740 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  urns a non-zero 
29750 76 61 6c 75 65 20 74 68 65 20 74 6f 6b 65 6e 69  value the tokeni
29760 7a 61 74 69 6f 6e 20 69 73 20 61 62 61 6e 64 6f  zation is abando
29770 6e 65 64 0d 0a 2a 2a 20 61 6e 64 20 6e 6f 20 66  ned..** and no f
29780 75 72 74 68 65 72 20 63 61 6c 6c 62 61 63 6b 73  urther callbacks
29790 20 61 72 65 20 69 73 73 75 65 64 2e 20 0d 0a 2a   are issued. ..*
297a0 2a 0d 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  *..** This funct
297b0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
297c0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
297d0 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
297e0 20 65 72 72 6f 72 20 63 6f 64 65 0d 0a 2a 2a 20   error code..** 
297f0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
29800 72 73 2e 20 49 66 20 74 68 65 20 74 6f 6b 65 6e  rs. If the token
29810 69 7a 61 74 69 6f 6e 20 77 61 73 20 61 62 61 6e  ization was aban
29820 64 6f 6e 65 64 20 65 61 72 6c 79 20 62 65 63 61  doned early beca
29830 75 73 65 0d 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  use..** the call
29840 62 61 63 6b 20 72 65 74 75 72 6e 65 64 20 53 51  back returned SQ
29850 4c 49 54 45 5f 44 4f 4e 45 2c 20 74 68 69 73 20  LITE_DONE, this 
29860 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  is not an error 
29870 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
29880 6e 0d 0a 2a 2a 20 73 74 69 6c 6c 20 72 65 74 75  n..** still retu
29890 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  rns SQLITE_OK. O
298a0 72 2c 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 69  r, if the tokeni
298b0 7a 61 74 69 6f 6e 20 77 61 73 20 61 62 61 6e 64  zation was aband
298c0 6f 6e 65 64 20 65 61 72 6c 79 0d 0a 2a 2a 20 62  oned early..** b
298d0 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 62  ecause the callb
298e0 61 63 6b 20 72 65 74 75 72 6e 65 64 20 61 6e 6f  ack returned ano
298f0 74 68 65 72 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ther non-zero va
29900 6c 75 65 2c 20 69 74 20 69 73 20 61 73 73 75 6d  lue, it is assum
29910 65 64 0d 0a 2a 2a 20 74 6f 20 62 65 20 61 6e 20  ed..** to be an 
29920 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
29930 65 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74  e and returned t
29940 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 2a  o the caller...*
29950 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  /..static int sq
29960 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a  lite3Fts5Tokeniz
29970 65 28 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  e(..  Fts5Config
29980 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20   *pConfig,      
29990 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43 6f        /* FTS5 Co
299a0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
299b0 63 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 66 6c 61  ct */..  int fla
299c0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
299d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
299e0 5f 54 4f 4b 45 4e 49 5a 45 5f 2a 20 66 6c 61 67  _TOKENIZE_* flag
299f0 73 20 2a 2f 0d 0a 20 20 63 6f 6e 73 74 20 63 68  s */..  const ch
29a00 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e  ar *pText, int n
29a10 54 65 78 74 2c 20 20 20 2f 2a 20 54 65 78 74 20  Text,   /* Text 
29a20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0d 0a  to tokenize */..
29a30 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a50 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61 73    /* Context pas
29a60 73 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20  sed to xToken() 
29a70 2a 2f 0d 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b  */..  int (*xTok
29a80 65 6e 29 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20  en)(void*, int, 
29a90 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
29aa0 2c 20 69 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f  , int, int)    /
29ab0 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0d 0a 29  * Callback */..)
29ac0 7b 0d 0a 20 20 69 66 28 20 70 54 65 78 74 3d 3d  {..  if( pText==
29ad0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
29ae0 45 5f 4f 4b 3b 0d 0a 20 20 72 65 74 75 72 6e 20  E_OK;..  return 
29af0 70 43 6f 6e 66 69 67 2d 3e 70 54 6f 6b 41 70 69  pConfig->pTokApi
29b00 2d 3e 78 54 6f 6b 65 6e 69 7a 65 28 0d 0a 20 20  ->xTokenize(..  
29b10 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70 54 6f      pConfig->pTo
29b20 6b 2c 20 70 43 74 78 2c 20 66 6c 61 67 73 2c 20  k, pCtx, flags, 
29b30 70 54 65 78 74 2c 20 6e 54 65 78 74 2c 20 78 54  pText, nText, xT
29b40 6f 6b 65 6e 0d 0a 20 20 29 3b 0d 0a 7d 0d 0a 0d  oken..  );..}...
29b50 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ./*..** Argument
29b60 20 70 49 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74   pIn points to t
29b70 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
29b80 65 72 20 69 6e 20 77 68 61 74 20 69 73 20 65 78  er in what is ex
29b90 70 65 63 74 65 64 20 74 6f 20 62 65 0d 0a 2a 2a  pected to be..**
29ba0 20 61 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74   a comma-separat
29bb0 65 64 20 6c 69 73 74 20 6f 66 20 53 51 4c 20 6c  ed list of SQL l
29bc0 69 74 65 72 61 6c 73 20 66 6f 6c 6c 6f 77 65 64  iterals followed
29bd0 20 62 79 20 61 20 27 29 27 20 63 68 61 72 61 63   by a ')' charac
29be0 74 65 72 2e 0d 0a 2a 2a 20 49 66 20 69 74 20 61  ter...** If it a
29bf0 63 74 75 61 6c 6c 79 20 69 73 20 74 68 69 73 2c  ctually is this,
29c00 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
29c10 72 20 74 6f 20 74 68 65 20 27 29 27 2e 20 4f 74  r to the ')'. Ot
29c20 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0d  herwise, return.
29c30 0a 2a 2a 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69  .** NULL to indi
29c40 63 61 74 65 20 61 20 70 61 72 73 65 20 65 72 72  cate a parse err
29c50 6f 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  or...*/..static 
29c60 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 74 73 35  const char *fts5
29c70 43 6f 6e 66 69 67 53 6b 69 70 41 72 67 73 28 63  ConfigSkipArgs(c
29c80 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 29 7b  onst char *pIn){
29c90 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
29ca0 70 20 3d 20 70 49 6e 3b 0d 0a 20 20 0d 0a 20 20  p = pIn;..  ..  
29cb0 77 68 69 6c 65 28 20 31 20 29 7b 0d 0a 20 20 20  while( 1 ){..   
29cc0 20 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53   p = fts5ConfigS
29cd0 6b 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29  kipWhitespace(p)
29ce0 3b 0d 0a 20 20 20 20 70 20 3d 20 66 74 73 35 43  ;..    p = fts5C
29cf0 6f 6e 66 69 67 53 6b 69 70 4c 69 74 65 72 61 6c  onfigSkipLiteral
29d00 28 70 29 3b 0d 0a 20 20 20 20 70 20 3d 20 66 74  (p);..    p = ft
29d10 73 35 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74  s5ConfigSkipWhit
29d20 65 73 70 61 63 65 28 70 29 3b 0d 0a 20 20 20 20  espace(p);..    
29d30 69 66 28 20 70 3d 3d 30 20 7c 7c 20 2a 70 3d 3d  if( p==0 || *p==
29d40 27 29 27 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20  ')' ) break;..  
29d50 20 20 69 66 28 20 2a 70 21 3d 27 2c 27 20 29 7b    if( *p!=',' ){
29d60 0d 0a 20 20 20 20 20 20 70 20 3d 20 30 3b 0d 0a  ..      p = 0;..
29d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
29d80 20 20 7d 0d 0a 20 20 20 20 70 2b 2b 3b 0d 0a 20    }..    p++;.. 
29d90 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 70   }....  return p
29da0 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50  ;..}..../*..** P
29db0 61 72 61 6d 65 74 65 72 20 7a 49 6e 20 63 6f 6e  arameter zIn con
29dc0 74 61 69 6e 73 20 61 20 72 61 6e 6b 28 29 20 66  tains a rank() f
29dd0 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 63  unction specific
29de0 61 74 69 6f 6e 2e 20 54 68 65 20 66 6f 72 6d 61  ation. The forma
29df0 74 20 6f 66 20 0d 0a 2a 2a 20 74 68 69 73 20 69  t of ..** this i
29e00 73 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 2b 20 42  s:..**..**   + B
29e10 61 72 65 77 6f 72 64 20 28 66 75 6e 63 74 69 6f  areword (functio
29e20 6e 20 6e 61 6d 65 29 0d 0a 2a 2a 20 20 20 2b 20  n name)..**   + 
29e30 4f 70 65 6e 20 70 61 72 65 6e 74 68 65 73 69 73  Open parenthesis
29e40 20 2d 20 22 28 22 0d 0a 2a 2a 20 20 20 2b 20 5a   - "("..**   + Z
29e50 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20  ero or more SQL 
29e60 6c 69 74 65 72 61 6c 73 20 69 6e 20 61 20 63 6f  literals in a co
29e70 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c 69  mma separated li
29e80 73 74 0d 0a 2a 2a 20 20 20 2b 20 43 6c 6f 73 65  st..**   + Close
29e90 20 70 61 72 65 6e 74 68 65 73 69 73 20 2d 20 22   parenthesis - "
29ea0 29 22 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69  )"..*/..static i
29eb0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f  nt sqlite3Fts5Co
29ec0 6e 66 69 67 50 61 72 73 65 52 61 6e 6b 28 0d 0a  nfigParseRank(..
29ed0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
29ee0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
29ef0 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e    /* Input strin
29f00 67 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a 70  g */..  char **p
29f10 7a 52 61 6e 6b 2c 20 20 20 20 20 20 20 20 20 20  zRank,          
29f20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
29f30 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 6e 61  Rank function na
29f40 6d 65 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 2a  me */..  char **
29f50 70 7a 52 61 6e 6b 41 72 67 73 20 20 20 20 20 20  pzRankArgs      
29f60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
29f70 20 52 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 61   Rank function a
29f80 72 67 75 6d 65 6e 74 73 20 2a 2f 0d 0a 29 7b 0d  rguments */..){.
29f90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
29fa0 20 3d 20 7a 49 6e 3b 0d 0a 20 20 63 6f 6e 73 74   = zIn;..  const
29fb0 20 63 68 61 72 20 2a 70 52 61 6e 6b 3b 0d 0a 20   char *pRank;.. 
29fc0 20 63 68 61 72 20 2a 7a 52 61 6e 6b 20 3d 20 30   char *zRank = 0
29fd0 3b 0d 0a 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b  ;..  char *zRank
29fe0 41 72 67 73 20 3d 20 30 3b 0d 0a 20 20 69 6e 74  Args = 0;..  int
29ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a000 0d 0a 0d 0a 20 20 2a 70 7a 52 61 6e 6b 20 3d 20  ....  *pzRank = 
2a010 30 3b 0d 0a 20 20 2a 70 7a 52 61 6e 6b 41 72 67  0;..  *pzRankArg
2a020 73 20 3d 20 30 3b 0d 0a 0d 0a 20 20 69 66 28 20  s = 0;....  if( 
2a030 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 72 63 20  p==0 ){..    rc 
2a040 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d  = SQLITE_ERROR;.
2a050 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70  .  }else{..    p
2a060 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b 69   = fts5ConfigSki
2a070 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b 0d  pWhitespace(p);.
2a080 0a 20 20 20 20 70 52 61 6e 6b 20 3d 20 70 3b 0d  .    pRank = p;.
2a090 0a 20 20 20 20 70 20 3d 20 66 74 73 35 43 6f 6e  .    p = fts5Con
2a0a0 66 69 67 53 6b 69 70 42 61 72 65 77 6f 72 64 28  figSkipBareword(
2a0b0 70 29 3b 0d 0a 0d 0a 20 20 20 20 69 66 28 20 70  p);....    if( p
2a0c0 20 29 7b 0d 0a 20 20 20 20 20 20 7a 52 61 6e 6b   ){..      zRank
2a0d0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61   = sqlite3Fts5Ma
2a0e0 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 31 20  llocZero(&rc, 1 
2a0f0 2b 20 70 20 2d 20 70 52 61 6e 6b 29 3b 0d 0a 20  + p - pRank);.. 
2a100 20 20 20 20 20 69 66 28 20 7a 52 61 6e 6b 20 29       if( zRank )
2a110 20 6d 65 6d 63 70 79 28 7a 52 61 6e 6b 2c 20 70   memcpy(zRank, p
2a120 52 61 6e 6b 2c 20 70 2d 70 52 61 6e 6b 29 3b 0d  Rank, p-pRank);.
2a130 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  .    }else{..   
2a140 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2a150 52 52 4f 52 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  RROR;..    }....
2a160 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a170 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
2a180 70 20 3d 20 66 74 73 35 43 6f 6e 66 69 67 53 6b  p = fts5ConfigSk
2a190 69 70 57 68 69 74 65 73 70 61 63 65 28 70 29 3b  ipWhitespace(p);
2a1a0 0d 0a 20 20 20 20 20 20 69 66 28 20 2a 70 21 3d  ..      if( *p!=
2a1b0 27 28 27 20 29 20 72 63 20 3d 20 53 51 4c 49 54  '(' ) rc = SQLIT
2a1c0 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20  E_ERROR;..      
2a1d0 70 2b 2b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  p++;..    }..   
2a1e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a1f0 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 63 6f 6e  OK ){..      con
2a200 73 74 20 63 68 61 72 20 2a 70 41 72 67 73 3b 20  st char *pArgs; 
2a210 0d 0a 20 20 20 20 20 20 70 20 3d 20 66 74 73 35  ..      p = fts5
2a220 43 6f 6e 66 69 67 53 6b 69 70 57 68 69 74 65 73  ConfigSkipWhites
2a230 70 61 63 65 28 70 29 3b 0d 0a 20 20 20 20 20 20  pace(p);..      
2a240 70 41 72 67 73 20 3d 20 70 3b 0d 0a 20 20 20 20  pArgs = p;..    
2a250 20 20 69 66 28 20 2a 70 21 3d 27 29 27 20 29 7b    if( *p!=')' ){
2a260 0d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66 74  ..        p = ft
2a270 73 35 43 6f 6e 66 69 67 53 6b 69 70 41 72 67 73  s5ConfigSkipArgs
2a280 28 70 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66  (p);..        if
2a290 28 20 70 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20  ( p==0 ){..     
2a2a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a2b0 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 20  _ERROR;..       
2a2c0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20   }else{..       
2a2d0 20 20 20 7a 52 61 6e 6b 41 72 67 73 20 3d 20 73     zRankArgs = s
2a2e0 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
2a2f0 5a 65 72 6f 28 26 72 63 2c 20 31 20 2b 20 70 20  Zero(&rc, 1 + p 
2a300 2d 20 70 41 72 67 73 29 3b 0d 0a 20 20 20 20 20  - pArgs);..     
2a310 20 20 20 20 20 69 66 28 20 7a 52 61 6e 6b 41 72       if( zRankAr
2a320 67 73 20 29 20 6d 65 6d 63 70 79 28 7a 52 61 6e  gs ) memcpy(zRan
2a330 6b 41 72 67 73 2c 20 70 41 72 67 73 2c 20 70 2d  kArgs, pArgs, p-
2a340 70 41 72 67 73 29 3b 0d 0a 20 20 20 20 20 20 20  pArgs);..       
2a350 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
2a360 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28   }..  }....  if(
2a370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a380 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  {..    sqlite3_f
2a390 72 65 65 28 7a 52 61 6e 6b 29 3b 0d 0a 20 20 20  ree(zRank);..   
2a3a0 20 61 73 73 65 72 74 28 20 7a 52 61 6e 6b 41 72   assert( zRankAr
2a3b0 67 73 3d 3d 30 20 29 3b 0d 0a 20 20 7d 65 6c 73  gs==0 );..  }els
2a3c0 65 7b 0d 0a 20 20 20 20 2a 70 7a 52 61 6e 6b 20  e{..    *pzRank 
2a3d0 3d 20 7a 52 61 6e 6b 3b 0d 0a 20 20 20 20 2a 70  = zRank;..    *p
2a3e0 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a 52 61 6e  zRankArgs = zRan
2a3f0 6b 41 72 67 73 3b 0d 0a 20 20 7d 0d 0a 20 20 72  kArgs;..  }..  r
2a400 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
2a410 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
2a420 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74 56  e3Fts5ConfigSetV
2a430 61 6c 75 65 28 0d 0a 20 20 46 74 73 35 43 6f 6e  alue(..  Fts5Con
2a440 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0d 0a  fig *pConfig, ..
2a450 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
2a460 65 79 2c 20 0d 0a 20 20 73 71 6c 69 74 65 33 5f  ey, ..  sqlite3_
2a470 76 61 6c 75 65 20 2a 70 56 61 6c 2c 0d 0a 20 20  value *pVal,..  
2a480 69 6e 74 20 2a 70 62 42 61 64 6b 65 79 0d 0a 29  int *pbBadkey..)
2a490 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  {..  int rc = SQ
2a4a0 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d 0a 20 20 69 66  LITE_OK;....  if
2a4b0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
2a4c0 69 63 6d 70 28 7a 4b 65 79 2c 20 22 70 67 73 7a  icmp(zKey, "pgsz
2a4d0 22 29 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 70  ") ){..    int p
2a4e0 67 73 7a 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66  gsz = 0;..    if
2a4f0 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ( SQLITE_INTEGER
2a500 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
2a510 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 70 56 61  numeric_type(pVa
2a520 6c 29 20 29 7b 0d 0a 20 20 20 20 20 20 70 67 73  l) ){..      pgs
2a530 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
2a540 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0d 0a 20 20  e_int(pVal);..  
2a550 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 70 67 73    }..    if( pgs
2a560 7a 3c 3d 30 20 7c 7c 20 70 67 73 7a 3e 46 54 53  z<=0 || pgsz>FTS
2a570 35 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  5_MAX_PAGE_SIZE 
2a580 29 7b 0d 0a 20 20 20 20 20 20 2a 70 62 42 61 64  ){..      *pbBad
2a590 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d 65  key = 1;..    }e
2a5a0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70 43 6f 6e  lse{..      pCon
2a5b0 66 69 67 2d 3e 70 67 73 7a 20 3d 20 70 67 73 7a  fig->pgsz = pgsz
2a5c0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
2a5d0 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
2a5e0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2a5f0 4b 65 79 2c 20 22 68 61 73 68 73 69 7a 65 22 29  Key, "hashsize")
2a600 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 48 61   ){..    int nHa
2a610 73 68 53 69 7a 65 20 3d 20 2d 31 3b 0d 0a 20 20  shSize = -1;..  
2a620 20 20 69 66 28 20 53 51 4c 49 54 45 5f 49 4e 54    if( SQLITE_INT
2a630 45 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61  EGER==sqlite3_va
2a640 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65  lue_numeric_type
2a650 28 70 56 61 6c 29 20 29 7b 0d 0a 20 20 20 20 20  (pVal) ){..     
2a660 20 6e 48 61 73 68 53 69 7a 65 20 3d 20 73 71 6c   nHashSize = sql
2a670 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
2a680 56 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  Val);..    }..  
2a690 20 20 69 66 28 20 6e 48 61 73 68 53 69 7a 65 3c    if( nHashSize<
2a6a0 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 62  =0 ){..      *pb
2a6b0 42 61 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20  Badkey = 1;..   
2a6c0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 70   }else{..      p
2a6d0 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a  Config->nHashSiz
2a6e0 65 20 3d 20 6e 48 61 73 68 53 69 7a 65 3b 0d 0a  e = nHashSize;..
2a6f0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
2a700 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69  else if( 0==sqli
2a710 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4b 65 79  te3_stricmp(zKey
2a720 2c 20 22 61 75 74 6f 6d 65 72 67 65 22 29 20 29  , "automerge") )
2a730 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 41 75 74 6f  {..    int nAuto
2a740 6d 65 72 67 65 20 3d 20 2d 31 3b 0d 0a 20 20 20  merge = -1;..   
2a750 20 69 66 28 20 53 51 4c 49 54 45 5f 49 4e 54 45   if( SQLITE_INTE
2a760 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  GER==sqlite3_val
2a770 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
2a780 70 56 61 6c 29 20 29 7b 0d 0a 20 20 20 20 20 20  pVal) ){..      
2a790 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 73 71 6c  nAutomerge = sql
2a7a0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
2a7b0 56 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  Val);..    }..  
2a7c0 20 20 69 66 28 20 6e 41 75 74 6f 6d 65 72 67 65    if( nAutomerge
2a7d0 3c 30 20 7c 7c 20 6e 41 75 74 6f 6d 65 72 67 65  <0 || nAutomerge
2a7e0 3e 36 34 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70  >64 ){..      *p
2a7f0 62 42 61 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20  bBadkey = 1;..  
2a800 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
2a810 69 66 28 20 6e 41 75 74 6f 6d 65 72 67 65 3d 3d  if( nAutomerge==
2a820 31 20 29 20 6e 41 75 74 6f 6d 65 72 67 65 20 3d  1 ) nAutomerge =
2a830 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 41 55   FTS5_DEFAULT_AU
2a840 54 4f 4d 45 52 47 45 3b 0d 0a 20 20 20 20 20 20  TOMERGE;..      
2a850 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65  pConfig->nAutome
2a860 72 67 65 20 3d 20 6e 41 75 74 6f 6d 65 72 67 65  rge = nAutomerge
2a870 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
2a880 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d 73  .  else if( 0==s
2a890 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2a8a0 4b 65 79 2c 20 22 75 73 65 72 6d 65 72 67 65 22  Key, "usermerge"
2a8b0 29 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 55  ) ){..    int nU
2a8c0 73 65 72 6d 65 72 67 65 20 3d 20 2d 31 3b 0d 0a  sermerge = -1;..
2a8d0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 49      if( SQLITE_I
2a8e0 4e 54 45 47 45 52 3d 3d 73 71 6c 69 74 65 33 5f  NTEGER==sqlite3_
2a8f0 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79  value_numeric_ty
2a900 70 65 28 70 56 61 6c 29 20 29 7b 0d 0a 20 20 20  pe(pVal) ){..   
2a910 20 20 20 6e 55 73 65 72 6d 65 72 67 65 20 3d 20     nUsermerge = 
2a920 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2a930 74 28 70 56 61 6c 29 3b 0d 0a 20 20 20 20 7d 0d  t(pVal);..    }.
2a940 0a 20 20 20 20 69 66 28 20 6e 55 73 65 72 6d 65  .    if( nUserme
2a950 72 67 65 3c 32 20 7c 7c 20 6e 55 73 65 72 6d 65  rge<2 || nUserme
2a960 72 67 65 3e 31 36 20 29 7b 0d 0a 20 20 20 20 20  rge>16 ){..     
2a970 20 2a 70 62 42 61 64 6b 65 79 20 3d 20 31 3b 0d   *pbBadkey = 1;.
2a980 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20  .    }else{..   
2a990 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65     pConfig->nUse
2a9a0 72 6d 65 72 67 65 20 3d 20 6e 55 73 65 72 6d 65  rmerge = nUserme
2a9b0 72 67 65 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  rge;..    }..  }
2a9c0 0d 0a 0d 0a 20 20 65 6c 73 65 20 69 66 28 20 30  ....  else if( 0
2a9d0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
2a9e0 70 28 7a 4b 65 79 2c 20 22 63 72 69 73 69 73 6d  p(zKey, "crisism
2a9f0 65 72 67 65 22 29 20 29 7b 0d 0a 20 20 20 20 69  erge") ){..    i
2aa00 6e 74 20 6e 43 72 69 73 69 73 4d 65 72 67 65 20  nt nCrisisMerge 
2aa10 3d 20 2d 31 3b 0d 0a 20 20 20 20 69 66 28 20 53  = -1;..    if( S
2aa20 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3d 3d 73  QLITE_INTEGER==s
2aa30 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
2aa40 65 72 69 63 5f 74 79 70 65 28 70 56 61 6c 29 20  eric_type(pVal) 
2aa50 29 7b 0d 0a 20 20 20 20 20 20 6e 43 72 69 73 69  ){..      nCrisi
2aa60 73 4d 65 72 67 65 20 3d 20 73 71 6c 69 74 65 33  sMerge = sqlite3
2aa70 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29  _value_int(pVal)
2aa80 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66  ;..    }..    if
2aa90 28 20 6e 43 72 69 73 69 73 4d 65 72 67 65 3c 30  ( nCrisisMerge<0
2aaa0 20 29 7b 0d 0a 20 20 20 20 20 20 2a 70 62 42 61   ){..      *pbBa
2aab0 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d  dkey = 1;..    }
2aac0 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 69 66 28  else{..      if(
2aad0 20 6e 43 72 69 73 69 73 4d 65 72 67 65 3c 3d 31   nCrisisMerge<=1
2aae0 20 29 20 6e 43 72 69 73 69 73 4d 65 72 67 65 20   ) nCrisisMerge 
2aaf0 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 43  = FTS5_DEFAULT_C
2ab00 52 49 53 49 53 4d 45 52 47 45 3b 0d 0a 20 20 20  RISISMERGE;..   
2ab10 20 20 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69     pConfig->nCri
2ab20 73 69 73 4d 65 72 67 65 20 3d 20 6e 43 72 69 73  sisMerge = nCris
2ab30 69 73 4d 65 72 67 65 3b 0d 0a 20 20 20 20 7d 0d  isMerge;..    }.
2ab40 0a 20 20 7d 0d 0a 0d 0a 20 20 65 6c 73 65 20 69  .  }....  else i
2ab50 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
2ab60 72 69 63 6d 70 28 7a 4b 65 79 2c 20 22 72 61 6e  ricmp(zKey, "ran
2ab70 6b 22 29 20 29 7b 0d 0a 20 20 20 20 63 6f 6e 73  k") ){..    cons
2ab80 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 28 63  t char *zIn = (c
2ab90 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
2aba0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
2abb0 61 6c 29 3b 0d 0a 20 20 20 20 63 68 61 72 20 2a  al);..    char *
2abc0 7a 52 61 6e 6b 3b 0d 0a 20 20 20 20 63 68 61 72  zRank;..    char
2abd0 20 2a 7a 52 61 6e 6b 41 72 67 73 3b 0d 0a 20 20   *zRankArgs;..  
2abe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
2abf0 73 35 43 6f 6e 66 69 67 50 61 72 73 65 52 61 6e  s5ConfigParseRan
2ac00 6b 28 7a 49 6e 2c 20 26 7a 52 61 6e 6b 2c 20 26  k(zIn, &zRank, &
2ac10 7a 52 61 6e 6b 41 72 67 73 29 3b 0d 0a 20 20 20  zRankArgs);..   
2ac20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ac30 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c  OK ){..      sql
2ac40 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6e 66 69  ite3_free(pConfi
2ac50 67 2d 3e 7a 52 61 6e 6b 29 3b 0d 0a 20 20 20 20  g->zRank);..    
2ac60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2ac70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41 72 67  Config->zRankArg
2ac80 73 29 3b 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66  s);..      pConf
2ac90 69 67 2d 3e 7a 52 61 6e 6b 20 3d 20 7a 52 61 6e  ig->zRank = zRan
2aca0 6b 3b 0d 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  k;..      pConfi
2acb0 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 20 3d 20 7a  g->zRankArgs = z
2acc0 52 61 6e 6b 41 72 67 73 3b 0d 0a 20 20 20 20 7d  RankArgs;..    }
2acd0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2ace0 49 54 45 5f 45 52 52 4f 52 20 29 7b 0d 0a 20 20  ITE_ERROR ){..  
2acf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ad00 4f 4b 3b 0d 0a 20 20 20 20 20 20 2a 70 62 42 61  OK;..      *pbBa
2ad10 64 6b 65 79 20 3d 20 31 3b 0d 0a 20 20 20 20 7d  dkey = 1;..    }
2ad20 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20  ..  }else{..    
2ad30 2a 70 62 42 61 64 6b 65 79 20 3d 20 31 3b 0d 0a  *pbBadkey = 1;..
2ad40 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2ad50 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 4c  ;..}..../*..** L
2ad60 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  oad the contents
2ad70 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 66 69 67   of the %_config
2ad80 20 74 61 62 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f   table into memo
2ad90 72 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  ry...*/..static 
2ada0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
2adb0 6f 6e 66 69 67 4c 6f 61 64 28 46 74 73 35 43 6f  onfigLoad(Fts5Co
2adc0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 69  nfig *pConfig, i
2add0 6e 74 20 69 43 6f 6f 6b 69 65 29 7b 0d 0a 20 20  nt iCookie){..  
2ade0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c  const char *zSel
2adf0 65 63 74 20 3d 20 22 53 45 4c 45 43 54 20 6b 2c  ect = "SELECT k,
2ae00 20 76 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63   v FROM %Q.'%q_c
2ae10 6f 6e 66 69 67 27 22 3b 0d 0a 20 20 63 68 61 72  onfig'";..  char
2ae20 20 2a 7a 53 71 6c 3b 0d 0a 20 20 73 71 6c 69 74   *zSql;..  sqlit
2ae30 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 30 3b 0d  e3_stmt *p = 0;.
2ae40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ae50 54 45 5f 4f 4b 3b 0d 0a 20 20 69 6e 74 20 69 56  TE_OK;..  int iV
2ae60 65 72 73 69 6f 6e 20 3d 20 30 3b 0d 0a 0d 0a 20  ersion = 0;.... 
2ae70 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 20   /* Set default 
2ae80 76 61 6c 75 65 73 20 2a 2f 0d 0a 20 20 70 43 6f  values */..  pCo
2ae90 6e 66 69 67 2d 3e 70 67 73 7a 20 3d 20 46 54 53  nfig->pgsz = FTS
2aea0 35 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  5_DEFAULT_PAGE_S
2aeb0 49 5a 45 3b 0d 0a 20 20 70 43 6f 6e 66 69 67 2d  IZE;..  pConfig-
2aec0 3e 6e 41 75 74 6f 6d 65 72 67 65 20 3d 20 46 54  >nAutomerge = FT
2aed0 53 35 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  S5_DEFAULT_AUTOM
2aee0 45 52 47 45 3b 0d 0a 20 20 70 43 6f 6e 66 69 67  ERGE;..  pConfig
2aef0 2d 3e 6e 55 73 65 72 6d 65 72 67 65 20 3d 20 46  ->nUsermerge = F
2af00 54 53 35 5f 44 45 46 41 55 4c 54 5f 55 53 45 52  TS5_DEFAULT_USER
2af10 4d 45 52 47 45 3b 0d 0a 20 20 70 43 6f 6e 66 69  MERGE;..  pConfi
2af20 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 20  g->nCrisisMerge 
2af30 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 43  = FTS5_DEFAULT_C
2af40 52 49 53 49 53 4d 45 52 47 45 3b 0d 0a 20 20 70  RISISMERGE;..  p
2af50 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a  Config->nHashSiz
2af60 65 20 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54  e = FTS5_DEFAULT
2af70 5f 48 41 53 48 53 49 5a 45 3b 0d 0a 0d 0a 20 20  _HASHSIZE;....  
2af80 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 46 74  zSql = sqlite3Ft
2af90 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 7a  s5Mprintf(&rc, z
2afa0 53 65 6c 65 63 74 2c 20 70 43 6f 6e 66 69 67 2d  Select, pConfig-
2afb0 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
2afc0 4e 61 6d 65 29 3b 0d 0a 20 20 69 66 28 20 7a 53  Name);..  if( zS
2afd0 71 6c 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20  ql ){..    rc = 
2afe0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2aff0 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  v2(pConfig->db, 
2b000 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2c 20 30 29  zSql, -1, &p, 0)
2b010 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ;..    sqlite3_f
2b020 72 65 65 28 7a 53 71 6c 29 3b 0d 0a 20 20 7d 0d  ree(zSql);..  }.
2b030 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  ...  assert( rc=
2b040 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 3d  =SQLITE_OK || p=
2b050 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d  =0 );..  if( rc=
2b060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20  =SQLITE_OK ){.. 
2b070 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
2b080 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2b090 65 70 28 70 29 20 29 7b 0d 0a 20 20 20 20 20 20  ep(p) ){..      
2b0a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 20 3d  const char *zK =
2b0b0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2b0c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2b0d0 74 28 70 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20  t(p, 0);..      
2b0e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
2b0f0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
2b100 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 2c 20 31 29  lumn_value(p, 1)
2b110 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
2b120 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2b130 7a 4b 2c 20 22 76 65 72 73 69 6f 6e 22 29 20 29  zK, "version") )
2b140 7b 0d 0a 20 20 20 20 20 20 20 20 69 56 65 72 73  {..        iVers
2b150 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ion = sqlite3_va
2b160 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b 0d 0a  lue_int(pVal);..
2b170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20        }else{..  
2b180 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
2b190 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 73   = 0;..        s
2b1a0 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
2b1b0 53 65 74 56 61 6c 75 65 28 70 43 6f 6e 66 69 67  SetValue(pConfig
2b1c0 2c 20 7a 4b 2c 20 70 56 61 6c 2c 20 26 62 44 75  , zK, pVal, &bDu
2b1d0 6d 6d 79 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  mmy);..      }..
2b1e0 20 20 20 20 7d 0d 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
2b1f0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2b200 28 70 29 3b 0d 0a 20 20 7d 0d 0a 20 20 0d 0a 20  (p);..  }..  .. 
2b210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b220 4f 4b 20 26 26 20 69 56 65 72 73 69 6f 6e 21 3d  OK && iVersion!=
2b230 46 54 53 35 5f 43 55 52 52 45 4e 54 5f 56 45 52  FTS5_CURRENT_VER
2b240 53 49 4f 4e 20 29 7b 0d 0a 20 20 20 20 72 63 20  SION ){..    rc 
2b250 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d  = SQLITE_ERROR;.
2b260 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
2b270 2d 3e 70 7a 45 72 72 6d 73 67 20 29 7b 0d 0a 20  ->pzErrmsg ){.. 
2b280 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
2b290 2a 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d  *pConfig->pzErrm
2b2a0 73 67 20 29 3b 0d 0a 20 20 20 20 20 20 2a 70 43  sg );..      *pC
2b2b0 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20  onfig->pzErrmsg 
2b2c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2b2d0 66 28 0d 0a 20 20 20 20 20 20 20 20 20 20 22 69  f(..          "i
2b2e0 6e 76 61 6c 69 64 20 66 74 73 35 20 66 69 6c 65  nvalid fts5 file
2b2f0 20 66 6f 72 6d 61 74 20 28 66 6f 75 6e 64 20 25   format (found %
2b300 64 2c 20 65 78 70 65 63 74 65 64 20 25 64 29 20  d, expected %d) 
2b310 2d 20 72 75 6e 20 27 72 65 62 75 69 6c 64 27 22  - run 'rebuild'"
2b320 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 69 56 65  ,..          iVe
2b330 72 73 69 6f 6e 2c 20 46 54 53 35 5f 43 55 52 52  rsion, FTS5_CURR
2b340 45 4e 54 5f 56 45 52 53 49 4f 4e 0d 0a 20 20 20  ENT_VERSION..   
2b350 20 20 20 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20     );..    }..  
2b360 7d 0d 0a 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  }....  if( rc==S
2b370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
2b380 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69   pConfig->iCooki
2b390 65 20 3d 20 69 43 6f 6f 6b 69 65 3b 0d 0a 20 20  e = iCookie;..  
2b3a0 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  }..  return rc;.
2b3b0 0a 7d 0d 0a 0d 0a 23 6c 69 6e 65 20 31 20 22 66  .}....#line 1 "f
2b3c0 74 73 35 5f 65 78 70 72 2e 63 22 0d 0a 2f 2a 0d  ts5_expr.c"../*.
2b3d0 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33 31 0d  .** 2014 May 31.
2b3e0 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 61 75 74 68  .**..** The auth
2b3f0 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
2b400 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
2b410 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
2b420 70 6c 61 63 65 20 6f 66 0d 0a 2a 2a 20 61 20 6c  place of..** a l
2b430 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
2b440 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
2b450 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 4d 61 79 20  ..**..**    May 
2b460 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
2b470 6e 6f 74 20 65 76 69 6c 2e 0d 0a 2a 2a 20 20 20  not evil...**   
2b480 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
2b490 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
2b4a0 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
2b4b0 76 65 20 6f 74 68 65 72 73 2e 0d 0a 2a 2a 20 20  ve others...**  
2b4c0 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
2b4d0 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
2b4e0 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
2b4f0 6f 75 20 67 69 76 65 2e 0d 0a 2a 2a 0d 0a 2a 2a  ou give...**..**
2b500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a  ************..**
2b550 0d 0a 2a 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 20 23  ..*/......../* #
2b560 69 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74  include "fts5Int
2b570 2e 68 22 20 2a 2f 0d 0a 2f 2a 20 23 69 6e 63 6c  .h" */../* #incl
2b580 75 64 65 20 22 66 74 73 35 70 61 72 73 65 2e 68  ude "fts5parse.h
2b590 22 20 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41  " */..../*..** A
2b5a0 6c 6c 20 74 6f 6b 65 6e 20 74 79 70 65 73 20 69  ll token types i
2b5b0 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  n the generated 
2b5c0 66 74 73 35 70 61 72 73 65 2e 68 20 66 69 6c 65  fts5parse.h file
2b5d0 20 61 72 65 20 67 72 65 61 74 65 72 20 74 68 61   are greater tha
2b5e0 6e 20 30 2e 0d 0a 2a 2f 0d 0a 23 64 65 66 69 6e  n 0...*/..#defin
2b5f0 65 20 46 54 53 35 5f 45 4f 46 20 30 0d 0a 0d 0a  e FTS5_EOF 0....
2b600 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4c 41 52  #define FTS5_LAR
2b610 47 45 53 54 5f 49 4e 54 36 34 20 20 28 30 78 66  GEST_INT64  (0xf
2b620 66 66 66 66 66 66 66 7c 28 28 28 69 36 34 29 30  fffffff|(((i64)0
2b630 78 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29  x7fffffff)<<32))
2b640 0d 0a 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75  ....typedef stru
2b650 63 74 20 46 74 73 35 45 78 70 72 54 65 72 6d 20  ct Fts5ExprTerm 
2b660 46 74 73 35 45 78 70 72 54 65 72 6d 3b 0d 0a 0d  Fts5ExprTerm;...
2b670 0a 2f 2a 0d 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ./*..** Function
2b680 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6c  s generated by l
2b690 65 6d 6f 6e 20 66 72 6f 6d 20 66 74 73 35 70 61  emon from fts5pa
2b6a0 72 73 65 2e 79 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  rse.y...*/..stat
2b6b0 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  ic void *sqlite3
2b6c0 46 74 73 35 50 61 72 73 65 72 41 6c 6c 6f 63 28  Fts5ParserAlloc(
2b6d0 76 6f 69 64 20 2a 28 2a 6d 61 6c 6c 6f 63 50 72  void *(*mallocPr
2b6e0 6f 63 29 28 75 36 34 29 29 3b 0d 0a 73 74 61 74  oc)(u64));..stat
2b6f0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ic void sqlite3F
2b700 74 73 35 50 61 72 73 65 72 46 72 65 65 28 76 6f  ts5ParserFree(vo
2b710 69 64 2a 2c 20 76 6f 69 64 20 28 2a 66 72 65 65  id*, void (*free
2b720 50 72 6f 63 29 28 76 6f 69 64 2a 29 29 3b 0d 0a  Proc)(void*));..
2b730 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2b740 74 65 33 46 74 73 35 50 61 72 73 65 72 28 76 6f  te3Fts5Parser(vo
2b750 69 64 2a 2c 20 69 6e 74 2c 20 46 74 73 35 54 6f  id*, int, Fts5To
2b760 6b 65 6e 2c 20 46 74 73 35 50 61 72 73 65 2a 29  ken, Fts5Parse*)
2b770 3b 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
2b780 47 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  G..#include <std
2b790 69 6f 2e 68 3e 0d 0a 73 74 61 74 69 63 20 76 6f  io.h>..static vo
2b7a0 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
2b7b0 72 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c  rserTrace(FILE*,
2b7c0 20 63 68 61 72 2a 29 3b 0d 0a 23 65 6e 64 69 66   char*);..#endif
2b7d0 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ..static int sql
2b7e0 69 74 65 33 46 74 73 35 50 61 72 73 65 72 46 61  ite3Fts5ParserFa
2b7f0 6c 6c 62 61 63 6b 28 69 6e 74 29 3b 0d 0a 0d 0a  llback(int);....
2b800 0d 0a 73 74 72 75 63 74 20 46 74 73 35 45 78 70  ..struct Fts5Exp
2b810 72 20 7b 0d 0a 20 20 46 74 73 35 49 6e 64 65 78  r {..  Fts5Index
2b820 20 2a 70 49 6e 64 65 78 3b 0d 0a 20 20 46 74 73   *pIndex;..  Fts
2b830 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
2b840 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  ;..  Fts5ExprNod
2b850 65 20 2a 70 52 6f 6f 74 3b 0d 0a 20 20 69 6e 74  e *pRoot;..  int
2b860 20 62 44 65 73 63 3b 20 20 20 20 20 20 20 20 20   bDesc;         
2b870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b880 49 74 65 72 61 74 65 20 69 6e 20 64 65 73 63 65  Iterate in desce
2b890 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
2b8a0 72 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 50 68 72  r */..  int nPhr
2b8b0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
2b8c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b8d0 72 20 6f 66 20 70 68 72 61 73 65 73 20 69 6e 20  r of phrases in 
2b8e0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0d 0a 20  expression */.. 
2b8f0 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
2b900 2a 2a 61 70 45 78 70 72 50 68 72 61 73 65 3b 20  **apExprPhrase; 
2b910 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
2b920 70 68 72 61 73 65 20 6f 62 6a 65 63 74 73 20 2a  phrase objects *
2b930 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  /..};..../*..** 
2b940 65 54 79 70 65 3a 0d 0a 2a 2a 20 20 20 45 78 70  eType:..**   Exp
2b950 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 79 70  ression node typ
2b960 65 2e 20 41 6c 77 61 79 73 20 6f 6e 65 20 6f 66  e. Always one of
2b970 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 20 20 20 20  :..**..**       
2b980 46 54 53 35 5f 41 4e 44 20 20 20 20 20 20 20 20  FTS5_AND        
2b990 20 20 20 20 20 20 20 20 20 28 6e 43 68 69 6c 64           (nChild
2b9a0 2c 20 61 70 43 68 69 6c 64 20 76 61 6c 69 64 29  , apChild valid)
2b9b0 0d 0a 2a 2a 20 20 20 20 20 20 20 46 54 53 35 5f  ..**       FTS5_
2b9c0 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
2b9d0 20 20 20 20 28 6e 43 68 69 6c 64 2c 20 61 70 43      (nChild, apC
2b9e0 68 69 6c 64 20 76 61 6c 69 64 29 0d 0a 2a 2a 20  hild valid)..** 
2b9f0 20 20 20 20 20 20 46 54 53 35 5f 4e 4f 54 20 20        FTS5_NOT  
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2ba10 6e 43 68 69 6c 64 2c 20 61 70 43 68 69 6c 64 20  nChild, apChild 
2ba20 76 61 6c 69 64 29 0d 0a 2a 2a 20 20 20 20 20 20  valid)..**      
2ba30 20 46 54 53 35 5f 53 54 52 49 4e 47 20 20 20 20   FTS5_STRING    
2ba40 20 20 20 20 20 20 20 20 20 20 28 70 4e 65 61 72            (pNear
2ba50 20 76 61 6c 69 64 29 0d 0a 2a 2a 20 20 20 20 20   valid)..**     
2ba60 20 20 46 54 53 35 5f 54 45 52 4d 20 20 20 20 20    FTS5_TERM     
2ba70 20 20 20 20 20 20 20 20 20 20 20 28 70 4e 65 61             (pNea
2ba80 72 20 76 61 6c 69 64 29 0d 0a 2a 2f 0d 0a 73 74  r valid)..*/..st
2ba90 72 75 63 74 20 46 74 73 35 45 78 70 72 4e 6f 64  ruct Fts5ExprNod
2baa0 65 20 7b 0d 0a 20 20 69 6e 74 20 65 54 79 70 65  e {..  int eType
2bab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bac0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74         /* Node t
2bad0 79 70 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 45  ype */..  int bE
2bae0 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
2baf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2bb00 65 20 61 74 20 45 4f 46 20 2a 2f 0d 0a 20 20 69  e at EOF */..  i
2bb10 6e 74 20 62 4e 6f 6d 61 74 63 68 3b 20 20 20 20  nt bNomatch;    
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bb30 2a 20 54 72 75 65 20 69 66 20 65 6e 74 72 79 20  * True if entry 
2bb40 69 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 2a  is not a match *
2bb50 2f 0d 0a 0d 0a 20 20 2f 2a 20 4e 65 78 74 20 6d  /....  /* Next m
2bb60 65 74 68 6f 64 20 66 6f 72 20 74 68 69 73 20 6e  ethod for this n
2bb70 6f 64 65 2e 20 2a 2f 0d 0a 20 20 69 6e 74 20 28  ode. */..  int (
2bb80 2a 78 4e 65 78 74 29 28 46 74 73 35 45 78 70 72  *xNext)(Fts5Expr
2bb90 2a 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65 2a  *, Fts5ExprNode*
2bba0 2c 20 69 6e 74 2c 20 69 36 34 29 3b 0d 0a 0d 0a  , int, i64);....
2bbb0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
2bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbd0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
2bbe0 69 64 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70  id */..  Fts5Exp
2bbf0 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 3b  rNearset *pNear;
2bc00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
2bc10 46 54 53 35 5f 53 54 52 49 4e 47 20 2d 20 63 6c  FTS5_STRING - cl
2bc20 75 73 74 65 72 20 6f 66 20 70 68 72 61 73 65 73  uster of phrases
2bc30 20 2a 2f 0d 0a 0d 0a 20 20 2f 2a 20 43 68 69 6c   */....  /* Chil
2bc40 64 20 6e 6f 64 65 73 2e 20 46 6f 72 20 61 20 4e  d nodes. For a N
2bc50 4f 54 20 6e 6f 64 65 2c 20 74 68 69 73 20 61 72  OT node, this ar
2bc60 72 61 79 20 61 6c 77 61 79 73 20 63 6f 6e 74 61  ray always conta
2bc70 69 6e 73 20 32 20 65 6e 74 72 69 65 73 2e 20 46  ins 2 entries. F
2bc80 6f 72 20 0d 0a 20 20 2a 2a 20 41 4e 44 20 6f 72  or ..  ** AND or
2bc90 20 4f 52 20 6e 6f 64 65 73 2c 20 69 74 20 63 6f   OR nodes, it co
2bca0 6e 74 61 69 6e 73 20 32 20 6f 72 20 6d 6f 72 65  ntains 2 or more
2bcb0 20 65 6e 74 72 69 65 73 2e 20 20 2a 2f 0d 0a 20   entries.  */.. 
2bcc0 20 69 6e 74 20 6e 43 68 69 6c 64 3b 20 20 20 20   int nChild;    
2bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bce0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
2bcf0 69 6c 64 20 6e 6f 64 65 73 20 2a 2f 0d 0a 20 20  ild nodes */..  
2bd00 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 61 70  Fts5ExprNode *ap
2bd10 43 68 69 6c 64 5b 31 5d 3b 20 20 20 20 20 20 20  Child[1];       
2bd20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 68 69 6c  /* Array of chil
2bd30 64 20 6e 6f 64 65 73 20 2a 2f 0d 0a 7d 3b 0d 0a  d nodes */..};..
2bd40 0d 0a 23 64 65 66 69 6e 65 20 46 74 73 35 4e 6f  ..#define Fts5No
2bd50 64 65 49 73 53 74 72 69 6e 67 28 70 29 20 28 28  deIsString(p) ((
2bd60 70 29 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  p)->eType==FTS5_
2bd70 54 45 52 4d 20 7c 7c 20 28 70 29 2d 3e 65 54 79  TERM || (p)->eTy
2bd80 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 29  pe==FTS5_STRING)
2bd90 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 6e 76 6f 6b  ..../*..** Invok
2bda0 65 20 74 68 65 20 78 4e 65 78 74 20 6d 65 74 68  e the xNext meth
2bdb0 6f 64 20 6f 66 20 61 6e 20 46 74 73 35 45 78 70  od of an Fts5Exp
2bdc0 72 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 54 68  rNode object. Th
2bdd0 69 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  is macro should 
2bde0 62 65 0d 0a 2a 2a 20 75 73 65 64 20 61 73 20 69  be..** used as i
2bdf0 66 20 69 74 20 68 61 73 20 74 68 65 20 73 61 6d  f it has the sam
2be00 65 20 73 69 67 6e 61 74 75 72 65 20 61 73 20 74  e signature as t
2be10 68 65 20 78 4e 65 78 74 28 29 20 6d 65 74 68 6f  he xNext() metho
2be20 64 73 20 74 68 65 6d 73 65 6c 76 65 73 2e 0d 0a  ds themselves...
2be30 2a 2f 0d 0a 23 64 65 66 69 6e 65 20 66 74 73 35  */..#define fts5
2be40 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 61 2c 62  ExprNodeNext(a,b
2be50 2c 63 2c 64 29 20 28 62 29 2d 3e 78 4e 65 78 74  ,c,d) (b)->xNext
2be60 28 28 61 29 2c 20 28 62 29 2c 20 28 63 29 2c 20  ((a), (b), (c), 
2be70 28 64 29 29 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41  (d))..../*..** A
2be80 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2be90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2bea0 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 73  cture represents
2beb0 20 61 20 73 69 6e 67 6c 65 20 73 65 61 72 63 68   a single search
2bec0 20 74 65 72 6d 0d 0a 2a 2a 20 6f 72 20 74 65 72   term..** or ter
2bed0 6d 20 70 72 65 66 69 78 2e 0d 0a 2a 2f 0d 0a 73  m prefix...*/..s
2bee0 74 72 75 63 74 20 46 74 73 35 45 78 70 72 54 65  truct Fts5ExprTe
2bef0 72 6d 20 7b 0d 0a 20 20 75 38 20 62 50 72 65 66  rm {..  u8 bPref
2bf00 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
2bf10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bf20 66 6f 72 20 61 20 70 72 65 66 69 78 20 74 65 72  for a prefix ter
2bf30 6d 20 2a 2f 0d 0a 20 20 75 38 20 62 46 69 72 73  m */..  u8 bFirs
2bf40 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2bf50 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bf60 69 66 20 74 6f 6b 65 6e 20 6d 75 73 74 20 62 65  if token must be
2bf70 20 66 69 72 73 74 20 69 6e 20 63 6f 6c 75 6d 6e   first in column
2bf80 20 2a 2f 0d 0a 20 20 63 68 61 72 20 2a 7a 54 65   */..  char *zTe
2bf90 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2bfa0 20 20 20 20 20 20 20 2f 2a 20 6e 75 6c 2d 74 65         /* nul-te
2bfb0 72 6d 69 6e 61 74 65 64 20 74 65 72 6d 20 2a 2f  rminated term */
2bfc0 0d 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ..  Fts5IndexIte
2bfd0 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  r *pIter;       
2bfe0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2bff0 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f  for this term */
2c000 0d 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d  ..  Fts5ExprTerm
2c010 20 2a 70 53 79 6e 6f 6e 79 6d 3b 20 20 20 20 20   *pSynonym;     
2c020 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c030 6f 20 66 69 72 73 74 20 69 6e 20 6c 69 73 74 20  o first in list 
2c040 6f 66 20 73 79 6e 6f 6e 79 6d 73 20 2a 2f 0d 0a  of synonyms */..
2c050 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 20 70  };..../*..** A p
2c060 68 72 61 73 65 2e 20 4f 6e 65 20 6f 72 20 6d 6f  hrase. One or mo
2c070 72 65 20 74 65 72 6d 73 20 74 68 61 74 20 6d 75  re terms that mu
2c080 73 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 63  st appear in a c
2c090 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e  ontiguous sequen
2c0a0 63 65 0d 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20  ce..** within a 
2c0b0 64 6f 63 75 6d 65 6e 74 20 66 6f 72 20 69 74 20  document for it 
2c0c0 74 6f 20 6d 61 74 63 68 2e 0d 0a 2a 2f 0d 0a 73  to match...*/..s
2c0d0 74 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68  truct Fts5ExprPh
2c0e0 72 61 73 65 20 7b 0d 0a 20 20 46 74 73 35 45 78  rase {..  Fts5Ex
2c0f0 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 20 20  prNode *pNode;  
2c100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
2c110 35 5f 53 54 52 49 4e 47 20 6e 6f 64 65 20 74 68  5_STRING node th
2c120 69 73 20 70 68 72 61 73 65 20 69 73 20 70 61 72  is phrase is par
2c130 74 20 6f 66 20 2a 2f 0d 0a 20 20 46 74 73 35 42  t of */..  Fts5B
2c140 75 66 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20  uffer poslist;  
2c150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2c160 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  rrent position l
2c170 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20 6e 54  ist */..  int nT
2c180 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2c190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c1a0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2c1b0 6e 20 61 54 65 72 6d 5b 5d 20 2a 2f 0d 0a 20 20  n aTerm[] */..  
2c1c0 46 74 73 35 45 78 70 72 54 65 72 6d 20 61 54 65  Fts5ExprTerm aTe
2c1d0 72 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  rm[1];          
2c1e0 2f 2a 20 54 65 72 6d 73 20 74 68 61 74 20 6d 61  /* Terms that ma
2c1f0 6b 65 20 75 70 20 74 68 69 73 20 70 68 72 61 73  ke up this phras
2c200 65 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f 2a 0d 0a  e */..};..../*..
2c210 2a 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 70  ** One or more p
2c220 68 72 61 73 65 73 20 74 68 61 74 20 6d 75 73 74  hrases that must
2c230 20 61 70 70 65 61 72 20 77 69 74 68 69 6e 20 61   appear within a
2c240 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 64   certain token d
2c250 69 73 74 61 6e 63 65 20 6f 66 0d 0a 2a 2a 20 65  istance of..** e
2c260 61 63 68 20 6f 74 68 65 72 20 77 69 74 68 69 6e  ach other within
2c270 20 65 61 63 68 20 6d 61 74 63 68 69 6e 67 20 64   each matching d
2c280 6f 63 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74  ocument...*/..st
2c290 72 75 63 74 20 46 74 73 35 45 78 70 72 4e 65 61  ruct Fts5ExprNea
2c2a0 72 73 65 74 20 7b 0d 0a 20 20 69 6e 74 20 6e 4e  rset {..  int nN
2c2b0 65 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ear;            
2c2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 45 41            /* NEA
2c2d0 52 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0d 0a  R parameter */..
2c2e0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
2c2f0 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
2c300 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 6f 20    /* Columns to 
2c310 73 65 61 72 63 68 20 28 4e 55 4c 4c 20 2d 3e 20  search (NULL -> 
2c320 61 6c 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0d  all columns) */.
2c330 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65 3b 20  .  int nPhrase; 
2c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c350 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c360 65 6e 74 72 69 65 73 20 69 6e 20 61 50 68 72 61  entries in aPhra
2c370 73 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0d 0a 20  se[] array */.. 
2c380 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
2c390 2a 61 70 50 68 72 61 73 65 5b 31 5d 3b 20 20 20  *apPhrase[1];   
2c3a0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 68 72   /* Array of phr
2c3b0 61 73 65 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0d  ase pointers */.
2c3c0 0a 7d 3b 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  .};....../*..** 
2c3d0 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 0d 0a  Parse context...
2c3e0 2a 2f 0d 0a 73 74 72 75 63 74 20 46 74 73 35 50  */..struct Fts5P
2c3f0 61 72 73 65 20 7b 0d 0a 20 20 46 74 73 35 43 6f  arse {..  Fts5Co
2c400 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b 0d 0a  nfig *pConfig;..
2c410 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0d 0a 20    char *zErr;.. 
2c420 20 69 6e 74 20 72 63 3b 0d 0a 20 20 69 6e 74 20   int rc;..  int 
2c430 6e 50 68 72 61 73 65 3b 20 20 20 20 20 20 20 20  nPhrase;        
2c440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c450 69 7a 65 20 6f 66 20 61 70 50 68 72 61 73 65 20  ize of apPhrase 
2c460 61 72 72 61 79 20 2a 2f 0d 0a 20 20 46 74 73 35  array */..  Fts5
2c470 45 78 70 72 50 68 72 61 73 65 20 2a 2a 61 70 50  ExprPhrase **apP
2c480 68 72 61 73 65 3b 20 20 20 20 20 20 2f 2a 20 41  hrase;      /* A
2c490 72 72 61 79 20 6f 66 20 61 6c 6c 20 70 68 72 61  rray of all phra
2c4a0 73 65 73 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78  ses */..  Fts5Ex
2c4b0 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 3b 20 20  prNode *pExpr;  
2c4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2c4d0 75 6c 74 20 6f 66 20 61 20 73 75 63 63 65 73 73  ult of a success
2c4e0 66 75 6c 20 70 61 72 73 65 20 2a 2f 0d 0a 7d 3b  ful parse */..};
2c4f0 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ....static void 
2c500 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
2c510 45 72 72 6f 72 28 46 74 73 35 50 61 72 73 65 20  Error(Fts5Parse 
2c520 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
2c530 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b  har *zFmt, ...){
2c540 0d 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0d  ..  va_list ap;.
2c550 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2c560 7a 46 6d 74 29 3b 0d 0a 20 20 69 66 28 20 70 50  zFmt);..  if( pP
2c570 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
2c580 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 70 50 61 72  _OK ){..    pPar
2c590 73 65 2d 3e 7a 45 72 72 20 3d 20 73 71 6c 69 74  se->zErr = sqlit
2c5a0 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
2c5b0 2c 20 61 70 29 3b 0d 0a 20 20 20 20 70 50 61 72  , ap);..    pPar
2c5c0 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
2c5d0 45 52 52 4f 52 3b 0d 0a 20 20 7d 0d 0a 20 20 76  ERROR;..  }..  v
2c5e0 61 5f 65 6e 64 28 61 70 29 3b 0d 0a 7d 0d 0a 0d  a_end(ap);..}...
2c5f0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2c600 45 78 70 72 49 73 73 70 61 63 65 28 63 68 61 72  ExprIsspace(char
2c610 20 74 29 7b 0d 0a 20 20 72 65 74 75 72 6e 20 74   t){..  return t
2c620 3d 3d 27 20 27 20 7c 7c 20 74 3d 3d 27 5c 74 27  ==' ' || t=='\t'
2c630 20 7c 7c 20 74 3d 3d 27 5c 6e 27 20 7c 7c 20 74   || t=='\n' || t
2c640 3d 3d 27 5c 72 27 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a  =='\r';..}..../*
2c650 0d 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  ..** Read the fi
2c660 72 73 74 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 74  rst token from t
2c670 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  he nul-terminate
2c680 64 20 73 74 72 69 6e 67 20 61 74 20 2a 70 7a 2e  d string at *pz.
2c690 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
2c6a0 20 66 74 73 35 45 78 70 72 47 65 74 54 6f 6b 65   fts5ExprGetToke
2c6b0 6e 28 0d 0a 20 20 46 74 73 35 50 61 72 73 65 20  n(..  Fts5Parse 
2c6c0 2a 70 50 61 72 73 65 2c 20 0d 0a 20 20 63 6f 6e  *pParse, ..  con
2c6d0 73 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20 20 20  st char **pz,   
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6f0 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  IN/OUT: Pointer 
2c700 69 6e 74 6f 20 62 75 66 66 65 72 20 2a 2f 0d 0a  into buffer */..
2c710 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f    Fts5Token *pTo
2c720 6b 65 6e 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73 74  ken..){..  const
2c730 20 63 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b 0d   char *z = *pz;.
2c740 0a 20 20 69 6e 74 20 74 6f 6b 3b 0d 0a 0d 0a 20  .  int tok;.... 
2c750 20 2f 2a 20 53 6b 69 70 20 70 61 73 74 20 61 6e   /* Skip past an
2c760 79 20 77 68 69 74 65 73 70 61 63 65 20 2a 2f 0d  y whitespace */.
2c770 0a 20 20 77 68 69 6c 65 28 20 66 74 73 35 45 78  .  while( fts5Ex
2c780 70 72 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  prIsspace(*z) ) 
2c790 7a 2b 2b 3b 0d 0a 0d 0a 20 20 70 54 6f 6b 65 6e  z++;....  pToken
2c7a0 2d 3e 70 20 3d 20 7a 3b 0d 0a 20 20 70 54 6f 6b  ->p = z;..  pTok
2c7b0 65 6e 2d 3e 6e 20 3d 20 31 3b 0d 0a 20 20 73 77  en->n = 1;..  sw
2c7c0 69 74 63 68 28 20 2a 7a 20 29 7b 0d 0a 20 20 20  itch( *z ){..   
2c7d0 20 63 61 73 65 20 27 28 27 3a 20 20 74 6f 6b 20   case '(':  tok 
2c7e0 3d 20 46 54 53 35 5f 4c 50 3b 20 20 20 20 62 72  = FTS5_LP;    br
2c7f0 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 27  eak;..    case '
2c800 29 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f  )':  tok = FTS5_
2c810 52 50 3b 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20  RP;    break;.. 
2c820 20 20 20 63 61 73 65 20 27 7b 27 3a 20 20 74 6f     case '{':  to
2c830 6b 20 3d 20 46 54 53 35 5f 4c 43 50 3b 20 20 20  k = FTS5_LCP;   
2c840 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65  break;..    case
2c850 20 27 7d 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53   '}':  tok = FTS
2c860 35 5f 52 43 50 3b 20 20 20 62 72 65 61 6b 3b 0d  5_RCP;   break;.
2c870 0a 20 20 20 20 63 61 73 65 20 27 3a 27 3a 20 20  .    case ':':  
2c880 74 6f 6b 20 3d 20 46 54 53 35 5f 43 4f 4c 4f 4e  tok = FTS5_COLON
2c890 3b 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61  ; break;..    ca
2c8a0 73 65 20 27 2c 27 3a 20 20 74 6f 6b 20 3d 20 46  se ',':  tok = F
2c8b0 54 53 35 5f 43 4f 4d 4d 41 3b 20 62 72 65 61 6b  TS5_COMMA; break
2c8c0 3b 0d 0a 20 20 20 20 63 61 73 65 20 27 2b 27 3a  ;..    case '+':
2c8d0 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 50 4c 55    tok = FTS5_PLU
2c8e0 53 3b 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20  S;  break;..    
2c8f0 63 61 73 65 20 27 2a 27 3a 20 20 74 6f 6b 20 3d  case '*':  tok =
2c900 20 46 54 53 35 5f 53 54 41 52 3b 20 20 62 72 65   FTS5_STAR;  bre
2c910 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20 27 2d  ak;..    case '-
2c920 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4d  ':  tok = FTS5_M
2c930 49 4e 55 53 3b 20 62 72 65 61 6b 3b 0d 0a 20 20  INUS; break;..  
2c940 20 20 63 61 73 65 20 27 5e 27 3a 20 20 74 6f 6b    case '^':  tok
2c950 20 3d 20 46 54 53 35 5f 43 41 52 45 54 3b 20 62   = FTS5_CARET; b
2c960 72 65 61 6b 3b 0d 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
2c970 27 5c 30 27 3a 20 74 6f 6b 20 3d 20 46 54 53 35  '\0': tok = FTS5
2c980 5f 45 4f 46 3b 20 20 20 62 72 65 61 6b 3b 0d 0a  _EOF;   break;..
2c990 0d 0a 20 20 20 20 63 61 73 65 20 27 22 27 3a 20  ..    case '"': 
2c9a0 7b 0d 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  {..      const c
2c9b0 68 61 72 20 2a 7a 32 3b 0d 0a 20 20 20 20 20 20  har *z2;..      
2c9c0 74 6f 6b 20 3d 20 46 54 53 35 5f 53 54 52 49 4e  tok = FTS5_STRIN
2c9d0 47 3b 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 28  G;....      for(
2c9e0 7a 32 3d 26 7a 5b 31 5d 3b 20 31 3b 20 7a 32 2b  z2=&z[1]; 1; z2+
2c9f0 2b 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  +){..        if(
2ca00 20 7a 32 5b 30 5d 3d 3d 27 22 27 20 29 7b 0d 0a   z2[0]=='"' ){..
2ca10 20 20 20 20 20 20 20 20 20 20 7a 32 2b 2b 3b 0d            z2++;.
2ca20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
2ca30 32 5b 30 5d 21 3d 27 22 27 20 29 20 62 72 65 61  2[0]!='"' ) brea
2ca40 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  k;..        }.. 
2ca50 20 20 20 20 20 20 20 69 66 28 20 7a 32 5b 30 5d         if( z2[0]
2ca60 3d 3d 27 5c 30 27 20 29 7b 0d 0a 20 20 20 20 20  =='\0' ){..     
2ca70 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2ca80 50 61 72 73 65 45 72 72 6f 72 28 70 50 61 72 73  ParseError(pPars
2ca90 65 2c 20 22 75 6e 74 65 72 6d 69 6e 61 74 65 64  e, "unterminated
2caa0 20 73 74 72 69 6e 67 22 29 3b 0d 0a 20 20 20 20   string");..    
2cab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 54 53        return FTS
2cac0 35 5f 45 4f 46 3b 0d 0a 20 20 20 20 20 20 20 20  5_EOF;..        
2cad0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2cae0 20 20 70 54 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a    pToken->n = (z
2caf0 32 20 2d 20 7a 29 3b 0d 0a 20 20 20 20 20 20 62  2 - z);..      b
2cb00 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  reak;..    }....
2cb10 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0d 0a      default: {..
2cb20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2cb30 20 2a 7a 32 3b 0d 0a 20 20 20 20 20 20 69 66 28   *z2;..      if(
2cb40 20 73 71 6c 69 74 65 33 46 74 73 35 49 73 42 61   sqlite3Fts5IsBa
2cb50 72 65 77 6f 72 64 28 7a 5b 30 5d 29 3d 3d 30 20  reword(z[0])==0 
2cb60 29 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){..        sqli
2cb70 74 65 33 46 74 73 35 50 61 72 73 65 45 72 72 6f  te3Fts5ParseErro
2cb80 72 28 70 50 61 72 73 65 2c 20 22 66 74 73 35 3a  r(pParse, "fts5:
2cb90 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6e 65   syntax error ne
2cba0 61 72 20 5c 22 25 2e 31 73 5c 22 22 2c 20 7a 29  ar \"%.1s\"", z)
2cbb0 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ;..        retur
2cbc0 6e 20 46 54 53 35 5f 45 4f 46 3b 0d 0a 20 20 20  n FTS5_EOF;..   
2cbd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 74 6f 6b 20     }..      tok 
2cbe0 3d 20 46 54 53 35 5f 53 54 52 49 4e 47 3b 0d 0a  = FTS5_STRING;..
2cbf0 20 20 20 20 20 20 66 6f 72 28 7a 32 3d 26 7a 5b        for(z2=&z[
2cc00 31 5d 3b 20 73 71 6c 69 74 65 33 46 74 73 35 49  1]; sqlite3Fts5I
2cc10 73 42 61 72 65 77 6f 72 64 28 2a 7a 32 29 3b 20  sBareword(*z2); 
2cc20 7a 32 2b 2b 29 3b 0d 0a 20 20 20 20 20 20 70 54  z2++);..      pT
2cc30 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a 32 20 2d 20  oken->n = (z2 - 
2cc40 7a 29 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 70  z);..      if( p
2cc50 54 6f 6b 65 6e 2d 3e 6e 3d 3d 32 20 26 26 20 6d  Token->n==2 && m
2cc60 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2d 3e 70 2c  emcmp(pToken->p,
2cc70 20 22 4f 52 22 2c 20 32 29 3d 3d 30 20 29 20 20   "OR", 2)==0 )  
2cc80 74 6f 6b 20 3d 20 46 54 53 35 5f 4f 52 3b 0d 0a  tok = FTS5_OR;..
2cc90 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e        if( pToken
2cca0 2d 3e 6e 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  ->n==3 && memcmp
2ccb0 28 70 54 6f 6b 65 6e 2d 3e 70 2c 20 22 4e 4f 54  (pToken->p, "NOT
2ccc0 22 2c 20 33 29 3d 3d 30 20 29 20 74 6f 6b 20 3d  ", 3)==0 ) tok =
2ccd0 20 46 54 53 35 5f 4e 4f 54 3b 0d 0a 20 20 20 20   FTS5_NOT;..    
2cce0 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d    if( pToken->n=
2ccf0 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 6f  =3 && memcmp(pTo
2cd00 6b 65 6e 2d 3e 70 2c 20 22 41 4e 44 22 2c 20 33  ken->p, "AND", 3
2cd10 29 3d 3d 30 20 29 20 74 6f 6b 20 3d 20 46 54 53  )==0 ) tok = FTS
2cd20 35 5f 41 4e 44 3b 0d 0a 20 20 20 20 20 20 62 72  5_AND;..      br
2cd30 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  eak;..    }..  }
2cd40 0d 0a 0d 0a 20 20 2a 70 7a 20 3d 20 26 70 54 6f  ....  *pz = &pTo
2cd50 6b 65 6e 2d 3e 70 5b 70 54 6f 6b 65 6e 2d 3e 6e  ken->p[pToken->n
2cd60 5d 3b 0d 0a 20 20 72 65 74 75 72 6e 20 74 6f 6b  ];..  return tok
2cd70 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76  ;..}....static v
2cd80 6f 69 64 20 2a 66 74 73 35 50 61 72 73 65 41 6c  oid *fts5ParseAl
2cd90 6c 6f 63 28 75 36 34 20 74 29 7b 20 72 65 74 75  loc(u64 t){ retu
2cda0 72 6e 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  rn sqlite3_mallo
2cdb0 63 36 34 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  c64((sqlite3_int
2cdc0 36 34 29 74 29 3b 7d 0d 0a 73 74 61 74 69 63 20  64)t);}..static 
2cdd0 76 6f 69 64 20 66 74 73 35 50 61 72 73 65 46 72  void fts5ParseFr
2cde0 65 65 28 76 6f 69 64 20 2a 70 29 7b 20 73 71 6c  ee(void *p){ sql
2cdf0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 20 7d 0d  ite3_free(p); }.
2ce00 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ...static int sq
2ce10 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e 65 77  lite3Fts5ExprNew
2ce20 28 0d 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  (..  Fts5Config 
2ce30 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20  *pConfig,       
2ce40 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e       /* FTS5 Con
2ce50 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0d 0a 20  figuration */.. 
2ce60 20 69 6e 74 20 69 43 6f 6c 2c 0d 0a 20 20 63 6f   int iCol,..  co
2ce70 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c  nst char *zExpr,
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ce90 20 45 78 70 72 65 73 73 69 6f 6e 20 74 65 78 74   Expression text
2cea0 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 20   */..  Fts5Expr 
2ceb0 2a 2a 70 70 4e 65 77 2c 20 0d 0a 20 20 63 68 61  **ppNew, ..  cha
2cec0 72 20 2a 2a 70 7a 45 72 72 0d 0a 29 7b 0d 0a 20  r **pzErr..){.. 
2ced0 20 46 74 73 35 50 61 72 73 65 20 73 50 61 72 73   Fts5Parse sPars
2cee0 65 3b 0d 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20  e;..  Fts5Token 
2cef0 74 6f 6b 65 6e 3b 0d 0a 20 20 63 6f 6e 73 74 20  token;..  const 
2cf00 63 68 61 72 20 2a 7a 20 3d 20 7a 45 78 70 72 3b  char *z = zExpr;
2cf10 0d 0a 20 20 69 6e 74 20 74 3b 20 20 20 20 20 20  ..  int t;      
2cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf30 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 6f 6b 65      /* Next toke
2cf40 6e 20 74 79 70 65 20 2a 2f 0d 0a 20 20 76 6f 69  n type */..  voi
2cf50 64 20 2a 70 45 6e 67 69 6e 65 3b 0d 0a 20 20 46  d *pEngine;..  F
2cf60 74 73 35 45 78 70 72 20 2a 70 4e 65 77 3b 0d 0a  ts5Expr *pNew;..
2cf70 0d 0a 20 20 2a 70 70 4e 65 77 20 3d 20 30 3b 0d  ..  *ppNew = 0;.
2cf80 0a 20 20 2a 70 7a 45 72 72 20 3d 20 30 3b 0d 0a  .  *pzErr = 0;..
2cf90 20 20 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65    memset(&sParse
2cfa0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 50 61 72  , 0, sizeof(sPar
2cfb0 73 65 29 29 3b 0d 0a 20 20 70 45 6e 67 69 6e 65  se));..  pEngine
2cfc0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61   = sqlite3Fts5Pa
2cfd0 72 73 65 72 41 6c 6c 6f 63 28 66 74 73 35 50 61  rserAlloc(fts5Pa
2cfe0 72 73 65 41 6c 6c 6f 63 29 3b 0d 0a 20 20 69 66  rseAlloc);..  if
2cff0 28 20 70 45 6e 67 69 6e 65 3d 3d 30 20 29 7b 20  ( pEngine==0 ){ 
2d000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d010 4d 45 4d 3b 20 7d 0d 0a 20 20 73 50 61 72 73 65  MEM; }..  sParse
2d020 2e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  .pConfig = pConf
2d030 69 67 3b 0d 0a 0d 0a 20 20 64 6f 20 7b 0d 0a 20  ig;....  do {.. 
2d040 20 20 20 74 20 3d 20 66 74 73 35 45 78 70 72 47     t = fts5ExprG
2d050 65 74 54 6f 6b 65 6e 28 26 73 50 61 72 73 65 2c  etToken(&sParse,
2d060 20 26 7a 2c 20 26 74 6f 6b 65 6e 29 3b 0d 0a 20   &z, &token);.. 
2d070 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
2d080 72 73 65 72 28 70 45 6e 67 69 6e 65 2c 20 74 2c  rser(pEngine, t,
2d090 20 74 6f 6b 65 6e 2c 20 26 73 50 61 72 73 65 29   token, &sParse)
2d0a0 3b 0d 0a 20 20 7d 77 68 69 6c 65 28 20 73 50 61  ;..  }while( sPa
2d0b0 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rse.rc==SQLITE_O
2d0c0 4b 20 26 26 20 74 21 3d 46 54 53 35 5f 45 4f 46  K && t!=FTS5_EOF
2d0d0 20 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 46 74   );..  sqlite3Ft
2d0e0 73 35 50 61 72 73 65 72 46 72 65 65 28 70 45 6e  s5ParserFree(pEn
2d0f0 67 69 6e 65 2c 20 66 74 73 35 50 61 72 73 65 46  gine, fts5ParseF
2d100 72 65 65 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66  ree);....  /* If
2d110 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
2d120 4d 41 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e  MATCH expression
2d130 20 77 61 73 20 61 20 75 73 65 72 20 63 6f 6c 75   was a user colu
2d140 6d 6e 2c 20 61 70 70 6c 79 20 74 68 65 0d 0a 20  mn, apply the.. 
2d150 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 63 6f 6c   ** implicit col
2d160 75 6d 6e 2d 66 69 6c 74 65 72 2e 20 20 2a 2f 0d  umn-filter.  */.
2d170 0a 20 20 69 66 28 20 69 43 6f 6c 3c 70 43 6f 6e  .  if( iCol<pCon
2d180 66 69 67 2d 3e 6e 43 6f 6c 20 26 26 20 73 50 61  fig->nCol && sPa
2d190 72 73 65 2e 70 45 78 70 72 20 26 26 20 73 50 61  rse.pExpr && sPa
2d1a0 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rse.rc==SQLITE_O
2d1b0 4b 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 6e 20  K ){..    int n 
2d1c0 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c  = sizeof(Fts5Col
2d1d0 73 65 74 29 3b 0d 0a 20 20 20 20 46 74 73 35 43  set);..    Fts5C
2d1e0 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d  olset *pColset =
2d1f0 20 28 46 74 73 35 43 6f 6c 73 65 74 2a 29 73 71   (Fts5Colset*)sq
2d200 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
2d210 65 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c 20  ero(&sParse.rc, 
2d220 6e 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 43 6f  n);..    if( pCo
2d230 6c 73 65 74 20 29 7b 0d 0a 20 20 20 20 20 20 70  lset ){..      p
2d240 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 20 3d 20 31  Colset->nCol = 1
2d250 3b 0d 0a 20 20 20 20 20 20 70 43 6f 6c 73 65 74  ;..      pColset
2d260 2d 3e 61 69 43 6f 6c 5b 30 5d 20 3d 20 69 43 6f  ->aiCol[0] = iCo
2d270 6c 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l;..      sqlite
2d280 33 46 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c  3Fts5ParseSetCol
2d290 73 65 74 28 26 73 50 61 72 73 65 2c 20 73 50 61  set(&sParse, sPa
2d2a0 72 73 65 2e 70 45 78 70 72 2c 20 70 43 6f 6c 73  rse.pExpr, pCols
2d2b0 65 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  et);..    }..  }
2d2c0 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 73 50  ....  assert( sP
2d2d0 61 72 73 65 2e 72 63 21 3d 53 51 4c 49 54 45 5f  arse.rc!=SQLITE_
2d2e0 4f 4b 20 7c 7c 20 73 50 61 72 73 65 2e 7a 45 72  OK || sParse.zEr
2d2f0 72 3d 3d 30 20 29 3b 0d 0a 20 20 69 66 28 20 73  r==0 );..  if( s
2d300 50 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45  Parse.rc==SQLITE
2d310 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 2a 70 70 4e  _OK ){..    *ppN
2d320 65 77 20 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69  ew = pNew = sqli
2d330 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2d340 66 28 46 74 73 35 45 78 70 72 29 29 3b 0d 0a 20  f(Fts5Expr));.. 
2d350 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
2d360 7b 0d 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e  {..      sParse.
2d370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2d380 4d 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  M;..      sqlite
2d390 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72  3Fts5ParseNodeFr
2d3a0 65 65 28 73 50 61 72 73 65 2e 70 45 78 70 72 29  ee(sParse.pExpr)
2d3b0 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20  ;..    }else{.. 
2d3c0 20 20 20 20 20 69 66 28 20 21 73 50 61 72 73 65       if( !sParse
2d3d0 2e 70 45 78 70 72 20 29 7b 0d 0a 20 20 20 20 20  .pExpr ){..     
2d3e0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79     const int nBy
2d3f0 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
2d400 45 78 70 72 4e 6f 64 65 29 3b 0d 0a 20 20 20 20  ExprNode);..    
2d410 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20      pNew->pRoot 
2d420 3d 20 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a  = (Fts5ExprNode*
2d430 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
2d440 6f 63 5a 65 72 6f 28 26 73 50 61 72 73 65 2e 72  ocZero(&sParse.r
2d450 63 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20  c, nByte);..    
2d460 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 52      if( pNew->pR
2d470 6f 6f 74 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  oot ){..        
2d480 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 62    pNew->pRoot->b
2d490 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  Eof = 1;..      
2d4a0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65    }..      }else
2d4b0 7b 0d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  {..        pNew-
2d4c0 3e 70 52 6f 6f 74 20 3d 20 73 50 61 72 73 65 2e  >pRoot = sParse.
2d4d0 70 45 78 70 72 3b 0d 0a 20 20 20 20 20 20 7d 0d  pExpr;..      }.
2d4e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
2d4f0 64 65 78 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20  dex = 0;..      
2d500 70 4e 65 77 2d 3e 70 43 6f 6e 66 69 67 20 3d 20  pNew->pConfig = 
2d510 70 43 6f 6e 66 69 67 3b 0d 0a 20 20 20 20 20 20  pConfig;..      
2d520 70 4e 65 77 2d 3e 61 70 45 78 70 72 50 68 72 61  pNew->apExprPhra
2d530 73 65 20 3d 20 73 50 61 72 73 65 2e 61 70 50 68  se = sParse.apPh
2d540 72 61 73 65 3b 0d 0a 20 20 20 20 20 20 70 4e 65  rase;..      pNe
2d550 77 2d 3e 6e 50 68 72 61 73 65 20 3d 20 73 50 61  w->nPhrase = sPa
2d560 72 73 65 2e 6e 50 68 72 61 73 65 3b 0d 0a 20 20  rse.nPhrase;..  
2d570 20 20 20 20 73 50 61 72 73 65 2e 61 70 50 68 72      sParse.apPhr
2d580 61 73 65 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d  ase = 0;..    }.
2d590 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 73  .  }else{..    s
2d5a0 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
2d5b0 6f 64 65 46 72 65 65 28 73 50 61 72 73 65 2e 70  odeFree(sParse.p
2d5c0 45 78 70 72 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20  Expr);..  }.... 
2d5d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 50   sqlite3_free(sP
2d5e0 61 72 73 65 2e 61 70 50 68 72 61 73 65 29 3b 0d  arse.apPhrase);.
2d5f0 0a 20 20 2a 70 7a 45 72 72 20 3d 20 73 50 61 72  .  *pzErr = sPar
2d600 73 65 2e 7a 45 72 72 3b 0d 0a 20 20 72 65 74 75  se.zErr;..  retu
2d610 72 6e 20 73 50 61 72 73 65 2e 72 63 3b 0d 0a 7d  rn sParse.rc;..}
2d620 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20  ..../*..** Free 
2d630 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2d640 6f 64 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ode object passe
2d650 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2d660 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61  gument...*/..sta
2d670 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
2d680 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65  Fts5ParseNodeFre
2d690 65 28 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  e(Fts5ExprNode *
2d6a0 70 29 7b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d  p){..  if( p ){.
2d6b0 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20  .    int i;..   
2d6c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2d6d0 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0d 0a 20 20  Child; i++){..  
2d6e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
2d6f0 61 72 73 65 4e 6f 64 65 46 72 65 65 28 70 2d 3e  arseNodeFree(p->
2d700 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20 20  apChild[i]);..  
2d710 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
2d720 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74  Fts5ParseNearset
2d730 46 72 65 65 28 70 2d 3e 70 4e 65 61 72 29 3b 0d  Free(p->pNear);.
2d740 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2d750 65 28 70 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d  e(p);..  }..}...
2d760 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65 20 74 68 65  ./*..** Free the
2d770 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65   expression obje
2d780 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2d790 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d   only argument..
2d7a0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
2d7b0 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
2d7c0 46 72 65 65 28 46 74 73 35 45 78 70 72 20 2a 70  Free(Fts5Expr *p
2d7d0 29 7b 0d 0a 20 20 69 66 28 20 70 20 29 7b 0d 0a  ){..  if( p ){..
2d7e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
2d7f0 61 72 73 65 4e 6f 64 65 46 72 65 65 28 70 2d 3e  arseNodeFree(p->
2d800 70 52 6f 6f 74 29 3b 0d 0a 20 20 20 20 73 71 6c  pRoot);..    sql
2d810 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 45  ite3_free(p->apE
2d820 78 70 72 50 68 72 61 73 65 29 3b 0d 0a 20 20 20  xprPhrase);..   
2d830 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
2d840 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d  ;..  }..}..../*.
2d850 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 54 65  .** Argument pTe
2d860 72 6d 20 6d 75 73 74 20 62 65 20 61 20 73 79 6e  rm must be a syn
2d870 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e 20 52  onym iterator. R
2d880 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
2d890 74 20 72 6f 77 69 64 0d 0a 2a 2a 20 74 68 61 74  t rowid..** that
2d8a0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 2e 0d 0a   it points to...
2d8b0 2a 2f 0d 0a 73 74 61 74 69 63 20 69 36 34 20 66  */..static i64 f
2d8c0 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f  ts5ExprSynonymRo
2d8d0 77 69 64 28 46 74 73 35 45 78 70 72 54 65 72 6d  wid(Fts5ExprTerm
2d8e0 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 62 44 65   *pTerm, int bDe
2d8f0 73 63 2c 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b  sc, int *pbEof){
2d900 0d 0a 20 20 69 36 34 20 69 52 65 74 20 3d 20 30  ..  i64 iRet = 0
2d910 3b 0d 0a 20 20 69 6e 74 20 62 52 65 74 56 61 6c  ;..  int bRetVal
2d920 69 64 20 3d 20 30 3b 0d 0a 20 20 46 74 73 35 45  id = 0;..  Fts5E
2d930 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a 0d 0a 20  xprTerm *p;.... 
2d940 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
2d950 70 53 79 6e 6f 6e 79 6d 20 29 3b 0d 0a 20 20 61  pSynonym );..  a
2d960 73 73 65 72 74 28 20 62 44 65 73 63 3d 3d 30 20  ssert( bDesc==0 
2d970 7c 7c 20 62 44 65 73 63 3d 3d 31 20 29 3b 0d 0a  || bDesc==1 );..
2d980 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70    for(p=pTerm; p
2d990 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29  ; p=p->pSynonym)
2d9a0 7b 0d 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  {..    if( 0==sq
2d9b0 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
2d9c0 28 70 2d 3e 70 49 74 65 72 29 20 29 7b 0d 0a 20  (p->pIter) ){.. 
2d9d0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
2d9e0 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69 52 6f 77  = p->pIter->iRow
2d9f0 69 64 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 62  id;..      if( b
2da00 52 65 74 56 61 6c 69 64 3d 3d 30 20 7c 7c 20 28  RetValid==0 || (
2da10 62 44 65 73 63 21 3d 28 69 52 6f 77 69 64 3c 69  bDesc!=(iRowid<i
2da20 52 65 74 29 29 20 29 7b 0d 0a 20 20 20 20 20 20  Ret)) ){..      
2da30 20 20 69 52 65 74 20 3d 20 69 52 6f 77 69 64 3b    iRet = iRowid;
2da40 0d 0a 20 20 20 20 20 20 20 20 62 52 65 74 56 61  ..        bRetVa
2da50 6c 69 64 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  lid = 1;..      
2da60 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  }..    }..  }...
2da70 0a 20 20 69 66 28 20 70 62 45 6f 66 20 26 26 20  .  if( pbEof && 
2da80 62 52 65 74 56 61 6c 69 64 3d 3d 30 20 29 20 2a  bRetValid==0 ) *
2da90 70 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 72 65  pbEof = 1;..  re
2daa0 74 75 72 6e 20 69 52 65 74 3b 0d 0a 7d 0d 0a 0d  turn iRet;..}...
2dab0 0a 2f 2a 0d 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ./*..** Argument
2dac0 20 70 54 65 72 6d 20 6d 75 73 74 20 62 65 20 61   pTerm must be a
2dad0 20 73 79 6e 6f 6e 79 6d 20 69 74 65 72 61 74 6f   synonym iterato
2dae0 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69  r...*/..static i
2daf0 6e 74 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e  nt fts5ExprSynon
2db00 79 6d 4c 69 73 74 28 0d 0a 20 20 46 74 73 35 45  ymList(..  Fts5E
2db10 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  xprTerm *pTerm, 
2db20 0d 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0d  ..  i64 iRowid,.
2db30 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2db40 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
2db50 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 62     /* Use this b
2db60 75 66 66 65 72 20 66 6f 72 20 73 70 61 63 65 20  uffer for space 
2db70 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0d 0a  if required */..
2db80 20 20 75 38 20 2a 2a 70 61 2c 20 69 6e 74 20 2a    u8 **pa, int *
2db90 70 6e 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 50 6f  pn..){..  Fts5Po
2dba0 73 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61  slistReader aSta
2dbb0 74 69 63 5b 34 5d 3b 0d 0a 20 20 46 74 73 35 50  tic[4];..  Fts5P
2dbc0 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49  oslistReader *aI
2dbd0 74 65 72 20 3d 20 61 53 74 61 74 69 63 3b 0d 0a  ter = aStatic;..
2dbe0 20 20 69 6e 74 20 6e 49 74 65 72 20 3d 20 30 3b    int nIter = 0;
2dbf0 0d 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  ..  int nAlloc =
2dc00 20 34 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20   4;..  int rc = 
2dc10 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 46 74  SQLITE_OK;..  Ft
2dc20 73 35 45 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a  s5ExprTerm *p;..
2dc30 0d 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72  ..  assert( pTer
2dc40 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 3b 0d 0a  m->pSynonym );..
2dc50 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70    for(p=pTerm; p
2dc60 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29  ; p=p->pSynonym)
2dc70 7b 0d 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78  {..    Fts5Index
2dc80 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 70 2d  Iter *pIter = p-
2dc90 3e 70 49 74 65 72 3b 0d 0a 20 20 20 20 69 66 28  >pIter;..    if(
2dca0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2dcb0 45 6f 66 28 70 49 74 65 72 29 3d 3d 30 20 26 26  Eof(pIter)==0 &&
2dcc0 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3d 3d   pIter->iRowid==
2dcd0 69 52 6f 77 69 64 20 29 7b 0d 0a 20 20 20 20 20  iRowid ){..     
2dce0 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 44 61 74   if( pIter->nDat
2dcf0 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  a==0 ) continue;
2dd00 0d 0a 20 20 20 20 20 20 69 66 28 20 6e 49 74 65  ..      if( nIte
2dd10 72 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0d 0a 20 20  r==nAlloc ){..  
2dd20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
2dd30 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
2dd40 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  of(Fts5PoslistRe
2dd50 61 64 65 72 29 20 2a 20 6e 41 6c 6c 6f 63 20 2a  ader) * nAlloc *
2dd60 20 32 3b 0d 0a 20 20 20 20 20 20 20 20 46 74 73   2;..        Fts
2dd70 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a  5PoslistReader *
2dd80 61 4e 65 77 20 3d 20 28 46 74 73 35 50 6f 73 6c  aNew = (Fts5Posl
2dd90 69 73 74 52 65 61 64 65 72 2a 29 73 71 6c 69 74  istReader*)sqlit
2dda0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
2ddb0 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  e);..        if(
2ddc0 20 61 4e 65 77 3d 3d 30 20 29 7b 0d 0a 20 20 20   aNew==0 ){..   
2ddd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2dde0 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20  TE_NOMEM;..     
2ddf0 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 6f 6e 79       goto synony
2de00 6d 5f 70 6f 73 6c 69 73 74 5f 6f 75 74 3b 0d 0a  m_poslist_out;..
2de10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2de20 20 20 20 6d 65 6d 63 70 79 28 61 4e 65 77 2c 20     memcpy(aNew, 
2de30 61 49 74 65 72 2c 20 73 69 7a 65 6f 66 28 46 74  aIter, sizeof(Ft
2de40 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 29  s5PoslistReader)
2de50 20 2a 20 6e 49 74 65 72 29 3b 0d 0a 20 20 20 20   * nIter);..    
2de60 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c      nAlloc = nAl
2de70 6c 6f 63 2a 32 3b 0d 0a 20 20 20 20 20 20 20 20  loc*2;..        
2de80 69 66 28 20 61 49 74 65 72 21 3d 61 53 74 61 74  if( aIter!=aStat
2de90 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  ic ) sqlite3_fre
2dea0 65 28 61 49 74 65 72 29 3b 0d 0a 20 20 20 20 20  e(aIter);..     
2deb0 20 20 20 61 49 74 65 72 20 3d 20 61 4e 65 77 3b     aIter = aNew;
2dec0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
2ded0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2dee0 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 70 49  istReaderInit(pI
2def0 74 65 72 2d 3e 70 44 61 74 61 2c 20 70 49 74 65  ter->pData, pIte
2df00 72 2d 3e 6e 44 61 74 61 2c 20 26 61 49 74 65 72  r->nData, &aIter
2df10 5b 6e 49 74 65 72 5d 29 3b 0d 0a 20 20 20 20 20  [nIter]);..     
2df20 20 61 73 73 65 72 74 28 20 61 49 74 65 72 5b 6e   assert( aIter[n
2df30 49 74 65 72 5d 2e 62 45 6f 66 3d 3d 30 20 29 3b  Iter].bEof==0 );
2df40 0d 0a 20 20 20 20 20 20 6e 49 74 65 72 2b 2b 3b  ..      nIter++;
2df50 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
2df60 20 20 69 66 28 20 6e 49 74 65 72 3d 3d 31 20 29    if( nIter==1 )
2df70 7b 0d 0a 20 20 20 20 2a 70 61 20 3d 20 28 75 38  {..    *pa = (u8
2df80 2a 29 61 49 74 65 72 5b 30 5d 2e 61 3b 0d 0a 20  *)aIter[0].a;.. 
2df90 20 20 20 2a 70 6e 20 3d 20 61 49 74 65 72 5b 30     *pn = aIter[0
2dfa0 5d 2e 6e 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a  ].n;..  }else{..
2dfb0 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57      Fts5PoslistW
2dfc0 72 69 74 65 72 20 77 72 69 74 65 72 20 3d 20 7b  riter writer = {
2dfd0 30 7d 3b 0d 0a 20 20 20 20 69 36 34 20 69 50 72  0};..    i64 iPr
2dfe0 65 76 20 3d 20 2d 31 3b 0d 0a 20 20 20 20 66 74  ev = -1;..    ft
2dff0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75  s5BufferZero(pBu
2e000 66 29 3b 0d 0a 20 20 20 20 77 68 69 6c 65 28 20  f);..    while( 
2e010 31 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20  1 ){..      int 
2e020 69 3b 0d 0a 20 20 20 20 20 20 69 36 34 20 69 4d  i;..      i64 iM
2e030 69 6e 20 3d 20 46 54 53 35 5f 4c 41 52 47 45 53  in = FTS5_LARGES
2e040 54 5f 49 4e 54 36 34 3b 0d 0a 20 20 20 20 20 20  T_INT64;..      
2e050 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 74 65 72  for(i=0; i<nIter
2e060 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20  ; i++){..       
2e070 20 69 66 28 20 61 49 74 65 72 5b 69 5d 2e 62 45   if( aIter[i].bE
2e080 6f 66 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  of==0 ){..      
2e090 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d      if( aIter[i]
2e0a0 2e 69 50 6f 73 3d 3d 69 50 72 65 76 20 29 7b 0d  .iPos==iPrev ){.
2e0b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e0c0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2e0d0 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 61  istReaderNext(&a
2e0e0 49 74 65 72 5b 69 5d 29 20 29 20 63 6f 6e 74 69  Iter[i]) ) conti
2e0f0 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
2e100 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  }..          if(
2e110 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73 3c 69   aIter[i].iPos<i
2e120 4d 69 6e 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  Min ){..        
2e130 20 20 20 20 69 4d 69 6e 20 3d 20 61 49 74 65 72      iMin = aIter
2e140 5b 69 5d 2e 69 50 6f 73 3b 0d 0a 20 20 20 20 20  [i].iPos;..     
2e150 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2e160 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2e170 20 20 69 66 28 20 69 4d 69 6e 3d 3d 46 54 53 35    if( iMin==FTS5
2e180 5f 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 7c  _LARGEST_INT64 |
2e190 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
2e1a0 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20  ) break;..      
2e1b0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
2e1c0 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
2e1d0 65 6e 64 28 70 42 75 66 2c 20 26 77 72 69 74 65  end(pBuf, &write
2e1e0 72 2c 20 69 4d 69 6e 29 3b 0d 0a 20 20 20 20 20  r, iMin);..     
2e1f0 20 69 50 72 65 76 20 3d 20 69 4d 69 6e 3b 0d 0a   iPrev = iMin;..
2e200 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 72      }..    if( r
2e210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
2e220 0a 20 20 20 20 20 20 2a 70 61 20 3d 20 70 42 75  .      *pa = pBu
2e230 66 2d 3e 70 3b 0d 0a 20 20 20 20 20 20 2a 70 6e  f->p;..      *pn
2e240 20 3d 20 70 42 75 66 2d 3e 6e 3b 0d 0a 20 20 20   = pBuf->n;..   
2e250 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 73 79 6e 6f   }..  }.... syno
2e260 6e 79 6d 5f 70 6f 73 6c 69 73 74 5f 6f 75 74 3a  nym_poslist_out:
2e270 0d 0a 20 20 69 66 28 20 61 49 74 65 72 21 3d 61  ..  if( aIter!=a
2e280 53 74 61 74 69 63 20 29 20 73 71 6c 69 74 65 33  Static ) sqlite3
2e290 5f 66 72 65 65 28 61 49 74 65 72 29 3b 0d 0a 20  _free(aIter);.. 
2e2a0 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a   return rc;..}..
2e2b0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 6c 6c 20 69  ..../*..** All i
2e2c0 6e 64 69 76 69 64 75 61 6c 20 74 65 72 6d 20 69  ndividual term i
2e2d0 74 65 72 61 74 6f 72 73 20 69 6e 20 70 50 68 72  terators in pPhr
2e2e0 61 73 65 20 61 72 65 20 67 75 61 72 61 6e 74 65  ase are guarante
2e2f0 65 64 20 74 6f 20 62 65 20 76 61 6c 69 64 20 61  ed to be valid a
2e300 6e 64 0d 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  nd..** pointing 
2e310 74 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69  to the same rowi
2e320 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2e330 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20  tion is called. 
2e340 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0d 0a  This function ..
2e350 2a 2a 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ** checks if the
2e360 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 20 72   current rowid r
2e370 65 61 6c 6c 79 20 69 73 20 61 20 6d 61 74 63 68  eally is a match
2e380 2c 20 61 6e 64 20 69 66 20 73 6f 20 70 6f 70 75  , and if so popu
2e390 6c 61 74 65 73 0d 0a 2a 2a 20 74 68 65 20 70 50  lates..** the pP
2e3a0 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 20 62  hrase->poslist b
2e3b0 75 66 66 65 72 20 61 63 63 6f 72 64 69 6e 67 6c  uffer accordingl
2e3c0 79 2e 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65  y. Output parame
2e3d0 74 65 72 20 2a 70 62 4d 61 74 63 68 0d 0a 2a 2a  ter *pbMatch..**
2e3e0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
2e3f0 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c  if this is reall
2e400 79 20 61 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  y a match, or fa
2e410 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a  lse otherwise...
2e420 2a 2a 0d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  **..** SQLITE_OK
2e430 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2e440 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2e450 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
2e460 72 6f 72 20 63 6f 64 65 20 0d 0a 2a 2a 20 6f 74  ror code ..** ot
2e470 68 65 72 77 69 73 65 2e 20 49 74 20 69 73 20 6e  herwise. It is n
2e480 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
2e490 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2e4a0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64  he current rowid
2e4b0 20 69 73 20 0d 0a 2a 2a 20 6e 6f 74 20 61 20 6d   is ..** not a m
2e4c0 61 74 63 68 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  atch...*/..stati
2e4d0 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 50 68  c int fts5ExprPh
2e4e0 72 61 73 65 49 73 4d 61 74 63 68 28 0d 0a 20 20  raseIsMatch(..  
2e4f0 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
2e500 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
2e510 2f 2a 20 4e 6f 64 65 20 70 50 68 72 61 73 65 20  /* Node pPhrase 
2e520 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d 0a 20  belongs to */.. 
2e530 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
2e540 2a 70 50 68 72 61 73 65 2c 20 20 20 20 20 20 20  *pPhrase,       
2e550 20 2f 2a 20 50 68 72 61 73 65 20 6f 62 6a 65 63   /* Phrase objec
2e560 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  t to initialize 
2e570 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70 62 4d 61 74  */..  int *pbMat
2e580 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
2e590 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
2e5a0 74 20 74 6f 20 74 72 75 65 20 69 66 20 72 65 61  t to true if rea
2e5b0 6c 6c 79 20 61 20 6d 61 74 63 68 20 2a 2f 0d 0a  lly a match */..
2e5c0 29 7b 0d 0a 20 20 46 74 73 35 50 6f 73 6c 69 73  ){..  Fts5Poslis
2e5d0 74 57 72 69 74 65 72 20 77 72 69 74 65 72 20 3d  tWriter writer =
2e5e0 20 7b 30 7d 3b 0d 0a 20 20 46 74 73 35 50 6f 73   {0};..  Fts5Pos
2e5f0 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61 74  listReader aStat
2e600 69 63 5b 34 5d 3b 0d 0a 20 20 46 74 73 35 50 6f  ic[4];..  Fts5Po
2e610 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49 74  slistReader *aIt
2e620 65 72 20 3d 20 61 53 74 61 74 69 63 3b 0d 0a 20  er = aStatic;.. 
2e630 20 69 6e 74 20 69 3b 0d 0a 20 20 69 6e 74 20 72   int i;..  int r
2e640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  c = SQLITE_OK;..
2e650 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d 20 70    int bFirst = p
2e660 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d  Phrase->aTerm[0]
2e670 2e 62 46 69 72 73 74 3b 0d 0a 20 20 0d 0a 20 20  .bFirst;..  ..  
2e680 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
2e690 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
2e6a0 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68  );....  /* If th
2e6b0 65 20 61 53 74 61 74 69 63 5b 5d 20 61 72 72 61  e aStatic[] arra
2e6c0 79 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65  y is not large e
2e6d0 6e 6f 75 67 68 2c 20 61 6c 6c 6f 63 61 74 65 20  nough, allocate 
2e6e0 61 20 6c 61 72 67 65 20 61 72 72 61 79 0d 0a 20  a large array.. 
2e6f0 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65   ** using sqlite
2e700 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73  3_malloc(). This
2e710 20 61 70 70 72 6f 61 63 68 20 63 6f 75 6c 64 20   approach could 
2e720 62 65 20 69 6d 70 72 6f 76 65 64 20 75 70 6f 6e  be improved upon
2e730 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 70 50 68 72  . */..  if( pPhr
2e740 61 73 65 2d 3e 6e 54 65 72 6d 3e 41 72 72 61 79  ase->nTerm>Array
2e750 53 69 7a 65 28 61 53 74 61 74 69 63 29 20 29 7b  Size(aStatic) ){
2e760 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ..    sqlite3_in
2e770 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
2e780 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  of(Fts5PoslistRe
2e790 61 64 65 72 29 20 2a 20 70 50 68 72 61 73 65 2d  ader) * pPhrase-
2e7a0 3e 6e 54 65 72 6d 3b 0d 0a 20 20 20 20 61 49 74  >nTerm;..    aIt
2e7b0 65 72 20 3d 20 28 46 74 73 35 50 6f 73 6c 69 73  er = (Fts5Poslis
2e7c0 74 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33  tReader*)sqlite3
2e7d0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
2e7e0 3b 0d 0a 20 20 20 20 69 66 28 20 21 61 49 74 65  ;..    if( !aIte
2e7f0 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
2e800 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 7d 0d 0a 20  E_NOMEM;..  }.. 
2e810 20 6d 65 6d 73 65 74 28 61 49 74 65 72 2c 20 30   memset(aIter, 0
2e820 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73  , sizeof(Fts5Pos
2e830 6c 69 73 74 52 65 61 64 65 72 29 20 2a 20 70 50  listReader) * pP
2e840 68 72 61 73 65 2d 3e 6e 54 65 72 6d 29 3b 0d 0a  hrase->nTerm);..
2e850 0d 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2e860 65 20 61 20 74 65 72 6d 20 69 74 65 72 61 74 6f  e a term iterato
2e870 72 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  r for each term 
2e880 69 6e 20 74 68 65 20 70 68 72 61 73 65 20 2a 2f  in the phrase */
2e890 0d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
2e8a0 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69  Phrase->nTerm; i
2e8b0 2b 2b 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78  ++){..    Fts5Ex
2e8c0 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  prTerm *pTerm = 
2e8d0 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b  &pPhrase->aTerm[
2e8e0 69 5d 3b 0d 0a 20 20 20 20 69 6e 74 20 6e 20 3d  i];..    int n =
2e8f0 20 30 3b 0d 0a 20 20 20 20 69 6e 74 20 62 46 6c   0;..    int bFl
2e900 61 67 20 3d 20 30 3b 0d 0a 20 20 20 20 75 38 20  ag = 0;..    u8 
2e910 2a 61 20 3d 20 30 3b 0d 0a 20 20 20 20 69 66 28  *a = 0;..    if(
2e920 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d   pTerm->pSynonym
2e930 20 29 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 42   ){..      Fts5B
2e940 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20  uffer buf = {0, 
2e950 30 2c 20 30 7d 3b 0d 0a 20 20 20 20 20 20 72 63  0, 0};..      rc
2e960 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e   = fts5ExprSynon
2e970 79 6d 4c 69 73 74 28 70 54 65 72 6d 2c 20 70 4e  ymList(pTerm, pN
2e980 6f 64 65 2d 3e 69 52 6f 77 69 64 2c 20 26 62 75  ode->iRowid, &bu
2e990 66 2c 20 26 61 2c 20 26 6e 29 3b 0d 0a 20 20 20  f, &a, &n);..   
2e9a0 20 20 20 69 66 28 20 72 63 20 29 7b 0d 0a 20 20     if( rc ){..  
2e9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2e9c0 65 65 28 61 29 3b 0d 0a 20 20 20 20 20 20 20 20  ee(a);..        
2e9d0 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74  goto ismatch_out
2e9e0 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
2e9f0 20 20 69 66 28 20 61 3d 3d 62 75 66 2e 70 20 29    if( a==buf.p )
2ea00 20 62 46 6c 61 67 20 3d 20 31 3b 0d 0a 20 20 20   bFlag = 1;..   
2ea10 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 61   }else{..      a
2ea20 20 3d 20 28 75 38 2a 29 70 54 65 72 6d 2d 3e 70   = (u8*)pTerm->p
2ea30 49 74 65 72 2d 3e 70 44 61 74 61 3b 0d 0a 20 20  Iter->pData;..  
2ea40 20 20 20 20 6e 20 3d 20 70 54 65 72 6d 2d 3e 70      n = pTerm->p
2ea50 49 74 65 72 2d 3e 6e 44 61 74 61 3b 0d 0a 20 20  Iter->nData;..  
2ea60 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
2ea70 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2ea80 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 61 49 74  rInit(a, n, &aIt
2ea90 65 72 5b 69 5d 29 3b 0d 0a 20 20 20 20 61 49 74  er[i]);..    aIt
2eaa0 65 72 5b 69 5d 2e 62 46 6c 61 67 20 3d 20 28 75  er[i].bFlag = (u
2eab0 38 29 62 46 6c 61 67 3b 0d 0a 20 20 20 20 69 66  8)bFlag;..    if
2eac0 28 20 61 49 74 65 72 5b 69 5d 2e 62 45 6f 66 20  ( aIter[i].bEof 
2ead0 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f  ) goto ismatch_o
2eae0 75 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 77 68  ut;..  }....  wh
2eaf0 69 6c 65 28 20 31 20 29 7b 0d 0a 20 20 20 20 69  ile( 1 ){..    i
2eb00 6e 74 20 62 4d 61 74 63 68 3b 0d 0a 20 20 20 20  nt bMatch;..    
2eb10 69 36 34 20 69 50 6f 73 20 3d 20 61 49 74 65 72  i64 iPos = aIter
2eb20 5b 30 5d 2e 69 50 6f 73 3b 0d 0a 20 20 20 20 64  [0].iPos;..    d
2eb30 6f 20 7b 0d 0a 20 20 20 20 20 20 62 4d 61 74 63  o {..      bMatc
2eb40 68 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 66 6f  h = 1;..      fo
2eb50 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65  r(i=0; i<pPhrase
2eb60 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a  ->nTerm; i++){..
2eb70 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
2eb80 69 73 74 52 65 61 64 65 72 20 2a 70 50 6f 73 20  istReader *pPos 
2eb90 3d 20 26 61 49 74 65 72 5b 69 5d 3b 0d 0a 20 20  = &aIter[i];..  
2eba0 20 20 20 20 20 20 69 36 34 20 69 41 64 6a 20 3d        i64 iAdj =
2ebb0 20 69 50 6f 73 20 2b 20 69 3b 0d 0a 20 20 20 20   iPos + i;..    
2ebc0 20 20 20 20 69 66 28 20 70 50 6f 73 2d 3e 69 50      if( pPos->iP
2ebd0 6f 73 21 3d 69 41 64 6a 20 29 7b 0d 0a 20 20 20  os!=iAdj ){..   
2ebe0 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20         bMatch = 
2ebf0 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 77 68  0;..          wh
2ec00 69 6c 65 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3c  ile( pPos->iPos<
2ec10 69 41 64 6a 20 29 7b 0d 0a 20 20 20 20 20 20 20  iAdj ){..       
2ec20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2ec30 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2ec40 72 4e 65 78 74 28 70 50 6f 73 29 20 29 20 67 6f  rNext(pPos) ) go
2ec50 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0d  to ismatch_out;.
2ec60 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2ec70 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6f 73          if( pPos
2ec80 2d 3e 69 50 6f 73 3e 69 41 64 6a 20 29 20 69 50  ->iPos>iAdj ) iP
2ec90 6f 73 20 3d 20 70 50 6f 73 2d 3e 69 50 6f 73 2d  os = pPos->iPos-
2eca0 69 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  i;..        }.. 
2ecb0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 77 68 69       }..    }whi
2ecc0 6c 65 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b  le( bMatch==0 );
2ecd0 0d 0a 0d 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  ....    /* Appen
2ece0 64 20 70 6f 73 69 74 69 6f 6e 20 69 50 6f 73 20  d position iPos 
2ecf0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f  to the output */
2ed00 0d 0a 20 20 20 20 69 66 28 20 62 46 69 72 73 74  ..    if( bFirst
2ed10 3d 3d 30 20 7c 7c 20 46 54 53 35 5f 50 4f 53 32  ==0 || FTS5_POS2
2ed20 4f 46 46 53 45 54 28 69 50 6f 73 29 3d 3d 30 20  OFFSET(iPos)==0 
2ed30 29 7b 0d 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ){..      rc = s
2ed40 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2ed50 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 70  tWriterAppend(&p
2ed60 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2c  Phrase->poslist,
2ed70 20 26 77 72 69 74 65 72 2c 20 69 50 6f 73 29 3b   &writer, iPos);
2ed80 0d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
2ed90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2eda0 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0d 0a 20   ismatch_out;.. 
2edb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 66 6f 72 28     }....    for(
2edc0 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e  i=0; i<pPhrase->
2edd0 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a 20 20  nTerm; i++){..  
2ede0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
2edf0 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2ee00 4e 65 78 74 28 26 61 49 74 65 72 5b 69 5d 29 20  Next(&aIter[i]) 
2ee10 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f  ) goto ismatch_o
2ee20 75 74 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  ut;..    }..  }.
2ee30 0a 0d 0a 20 69 73 6d 61 74 63 68 5f 6f 75 74 3a  ... ismatch_out:
2ee40 0d 0a 20 20 2a 70 62 4d 61 74 63 68 20 3d 20 28  ..  *pbMatch = (
2ee50 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
2ee60 2e 6e 3e 30 29 3b 0d 0a 20 20 66 6f 72 28 69 3d  .n>0);..  for(i=
2ee70 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54  0; i<pPhrase->nT
2ee80 65 72 6d 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20  erm; i++){..    
2ee90 69 66 28 20 61 49 74 65 72 5b 69 5d 2e 62 46 6c  if( aIter[i].bFl
2eea0 61 67 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  ag ) sqlite3_fre
2eeb0 65 28 28 75 38 2a 29 61 49 74 65 72 5b 69 5d 2e  e((u8*)aIter[i].
2eec0 61 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20  a);..  }..  if( 
2eed0 61 49 74 65 72 21 3d 61 53 74 61 74 69 63 20 29  aIter!=aStatic )
2eee0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49   sqlite3_free(aI
2eef0 74 65 72 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20  ter);..  return 
2ef00 72 63 3b 0d 0a 7d 0d 0a 0d 0a 74 79 70 65 64 65  rc;..}....typede
2ef10 66 20 73 74 72 75 63 74 20 46 74 73 35 4c 6f 6f  f struct Fts5Loo
2ef20 6b 61 68 65 61 64 52 65 61 64 65 72 20 46 74 73  kaheadReader Fts
2ef30 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72  5LookaheadReader
2ef40 3b 0d 0a 73 74 72 75 63 74 20 46 74 73 35 4c 6f  ;..struct Fts5Lo
2ef50 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20 7b 0d  okaheadReader {.
2ef60 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20  .  const u8 *a; 
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef80 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
2ef90 74 61 69 6e 69 6e 67 20 70 6f 73 69 74 69 6f 6e  taining position
2efa0 20 6c 69 73 74 20 2a 2f 0d 0a 20 20 69 6e 74 20   list */..  int 
2efb0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2efd0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 5b  ize of buffer a[
2efe0 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d 0a 20  ] in bytes */.. 
2eff0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f010 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73   /* Current offs
2f020 65 74 20 69 6e 20 70 6f 73 69 74 69 6f 6e 20 6c  et in position l
2f030 69 73 74 20 2a 2f 0d 0a 20 20 69 36 34 20 69 50  ist */..  i64 iP
2f040 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
2f050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2f060 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f  rent position */
2f070 0d 0a 20 20 69 36 34 20 69 4c 6f 6f 6b 61 68 65  ..  i64 iLookahe
2f080 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
2f090 20 20 20 20 2f 2a 20 4e 65 78 74 20 70 6f 73 69      /* Next posi
2f0a0 74 69 6f 6e 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 23  tion */..};....#
2f0b0 64 65 66 69 6e 65 20 46 54 53 35 5f 4c 4f 4f 4b  define FTS5_LOOK
2f0c0 41 48 45 41 44 5f 45 4f 46 20 28 28 28 69 36 34  AHEAD_EOF (((i64
2f0d0 29 31 29 20 3c 3c 20 36 32 29 0d 0a 0d 0a 73 74  )1) << 62)....st
2f0e0 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 6f 6f  atic int fts5Loo
2f0f0 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65 78 74  kaheadReaderNext
2f100 28 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65  (Fts5LookaheadRe
2f110 61 64 65 72 20 2a 70 29 7b 0d 0a 20 20 70 2d 3e  ader *p){..  p->
2f120 69 50 6f 73 20 3d 20 70 2d 3e 69 4c 6f 6f 6b 61  iPos = p->iLooka
2f130 68 65 61 64 3b 0d 0a 20 20 69 66 28 20 73 71 6c  head;..  if( sql
2f140 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
2f150 65 78 74 36 34 28 70 2d 3e 61 2c 20 70 2d 3e 6e  ext64(p->a, p->n
2f160 2c 20 26 70 2d 3e 69 2c 20 26 70 2d 3e 69 4c 6f  , &p->i, &p->iLo
2f170 6f 6b 61 68 65 61 64 29 20 29 7b 0d 0a 20 20 20  okahead) ){..   
2f180 20 70 2d 3e 69 4c 6f 6f 6b 61 68 65 61 64 20 3d   p->iLookahead =
2f190 20 46 54 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f   FTS5_LOOKAHEAD_
2f1a0 45 4f 46 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74  EOF;..  }..  ret
2f1b0 75 72 6e 20 28 70 2d 3e 69 50 6f 73 3d 3d 46 54  urn (p->iPos==FT
2f1c0 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46  S5_LOOKAHEAD_EOF
2f1d0 29 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20  );..}....static 
2f1e0 69 6e 74 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61  int fts5Lookahea
2f1f0 64 52 65 61 64 65 72 49 6e 69 74 28 0d 0a 20 20  dReaderInit(..  
2f200 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2f210 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
2f220 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61  /* Buffer to rea
2f230 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  d position list 
2f240 66 72 6f 6d 20 2a 2f 0d 0a 20 20 46 74 73 35 4c  from */..  Fts5L
2f250 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20 2a  ookaheadReader *
2f260 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74  p          /* It
2f270 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 74 6f  erator object to
2f280 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0d 0a   initialize */..
2f290 29 7b 0d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  ){..  memset(p, 
2f2a0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 4c 6f  0, sizeof(Fts5Lo
2f2b0 6f 6b 61 68 65 61 64 52 65 61 64 65 72 29 29 3b  okaheadReader));
2f2c0 0d 0a 20 20 70 2d 3e 61 20 3d 20 61 3b 0d 0a 20  ..  p->a = a;.. 
2f2d0 20 70 2d 3e 6e 20 3d 20 6e 3b 0d 0a 20 20 66 74   p->n = n;..  ft
2f2e0 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65  s5LookaheadReade
2f2f0 72 4e 65 78 74 28 70 29 3b 0d 0a 20 20 72 65 74  rNext(p);..  ret
2f300 75 72 6e 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61  urn fts5Lookahea
2f310 64 52 65 61 64 65 72 4e 65 78 74 28 70 29 3b 0d  dReaderNext(p);.
2f320 0a 7d 0d 0a 0d 0a 74 79 70 65 64 65 66 20 73 74  .}....typedef st
2f330 72 75 63 74 20 46 74 73 35 4e 65 61 72 54 72 69  ruct Fts5NearTri
2f340 6d 6d 65 72 20 46 74 73 35 4e 65 61 72 54 72 69  mmer Fts5NearTri
2f350 6d 6d 65 72 3b 0d 0a 73 74 72 75 63 74 20 46 74  mmer;..struct Ft
2f360 73 35 4e 65 61 72 54 72 69 6d 6d 65 72 20 7b 0d  s5NearTrimmer {.
2f370 0a 20 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64  .  Fts5Lookahead
2f380 52 65 61 64 65 72 20 72 65 61 64 65 72 3b 20 20  Reader reader;  
2f390 20 20 20 2f 2a 20 49 6e 70 75 74 20 69 74 65 72     /* Input iter
2f3a0 61 74 6f 72 20 2a 2f 0d 0a 20 20 46 74 73 35 50  ator */..  Fts5P
2f3b0 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69  oslistWriter wri
2f3c0 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57 72  ter;       /* Wr
2f3d0 69 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0d  iter context */.
2f3e0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2f3f0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
2f400 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 70 6f 73     /* Output pos
2f410 6c 69 73 74 20 2a 2f 0d 0a 7d 3b 0d 0a 0d 0a 2f  list */..};..../
2f420 2a 0d 0a 2a 2a 20 54 68 65 20 6e 65 61 72 2d 73  *..** The near-s
2f430 65 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  et object passed
2f440 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
2f450 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  gument contains 
2f460 6d 6f 72 65 20 74 68 61 6e 0d 0a 2a 2a 20 6f 6e  more than..** on
2f470 65 20 70 68 72 61 73 65 2e 20 41 6c 6c 20 70 68  e phrase. All ph
2f480 72 61 73 65 73 20 63 75 72 72 65 6e 74 6c 79 20  rases currently 
2f490 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
2f4a0 65 20 72 6f 77 2e 20 54 68 65 0d 0a 2a 2a 20 46  e row. The..** F
2f4b0 74 73 35 45 78 70 72 50 68 72 61 73 65 2e 70 6f  ts5ExprPhrase.po
2f4c0 73 6c 69 73 74 20 62 75 66 66 65 72 73 20 61 72  slist buffers ar
2f4d0 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
2f4e0 72 64 69 6e 67 6c 79 2e 20 54 68 69 73 20 66 75  rdingly. This fu
2f4f0 6e 63 74 69 6f 6e 0d 0a 2a 2a 20 74 65 73 74 73  nction..** tests
2f500 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
2f510 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 69 6e 73  row contains ins
2f520 74 61 6e 63 65 73 20 6f 66 20 65 61 63 68 20 70  tances of each p
2f530 68 72 61 73 65 20 73 75 66 66 69 63 69 65 6e 74  hrase sufficient
2f540 6c 79 0d 0a 2a 2a 20 63 6c 6f 73 65 20 74 6f 67  ly..** close tog
2f550 65 74 68 65 72 20 74 6f 20 6d 65 65 74 20 74 68  ether to meet th
2f560 65 20 4e 45 41 52 20 63 6f 6e 73 74 72 61 69 6e  e NEAR constrain
2f570 74 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  t. Non-zero is r
2f580 65 74 75 72 6e 65 64 20 69 66 20 69 74 0d 0a 2a  eturned if it..*
2f590 2a 20 64 6f 65 73 2c 20 6f 72 20 7a 65 72 6f 20  * does, or zero 
2f5a0 6f 74 68 65 72 77 69 73 65 2e 0d 0a 2a 2a 0d 0a  otherwise...**..
2f5b0 2a 2a 20 49 66 20 69 6e 2f 6f 75 74 20 70 61 72  ** If in/out par
2f5c0 61 6d 65 74 65 72 20 28 2a 70 52 63 29 20 69 73  ameter (*pRc) is
2f5d0 20 73 65 74 20 74 6f 20 6f 74 68 65 72 20 74 68   set to other th
2f5e0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  an SQLITE_OK whe
2f5f0 6e 20 74 68 69 73 0d 0a 2a 2a 20 66 75 6e 63 74  n this..** funct
2f600 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
2f610 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 72  t is a no-op. Or
2f620 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65  , if an error (e
2f630 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .g. SQLITE_NOMEM
2f640 29 0d 0a 2a 2a 20 6f 63 63 75 72 73 20 77 69 74  )..** occurs wit
2f650 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
2f660 6e 20 28 2a 70 52 63 29 20 69 73 20 73 65 74 20  n (*pRc) is set 
2f670 61 63 63 6f 72 64 69 6e 67 6c 79 20 62 65 66 6f  accordingly befo
2f680 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0d 0a 2a  re returning...*
2f690 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2f6a0 75 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ue is undefined 
2f6b0 69 6e 20 62 6f 74 68 20 74 68 65 73 65 20 63 61  in both these ca
2f6c0 73 65 73 2e 0d 0a 2a 2a 20 0d 0a 2a 2a 20 49 66  ses...** ..** If
2f6d0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2f6e0 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 28 61   and non-zero (a
2f6f0 20 6d 61 74 63 68 29 20 69 73 20 72 65 74 75 72   match) is retur
2f700 6e 65 64 2c 20 74 68 65 20 70 6f 73 69 74 69 6f  ned, the positio
2f710 6e 2d 6c 69 73 74 0d 0a 2a 2a 20 6f 66 20 65 61  n-list..** of ea
2f720 63 68 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74  ch phrase object
2f730 20 69 73 20 65 64 69 74 65 64 20 74 6f 20 63 6f   is edited to co
2f740 6e 74 61 69 6e 20 6f 6e 6c 79 20 74 68 6f 73 65  ntain only those
2f750 20 65 6e 74 72 69 65 73 20 74 68 61 74 0d 0a 2a   entries that..*
2f760 2a 20 6d 65 65 74 20 74 68 65 20 63 6f 6e 73 74  * meet the const
2f770 72 61 69 6e 74 20 62 65 66 6f 72 65 20 72 65 74  raint before ret
2f780 75 72 6e 69 6e 67 2e 0d 0a 2a 2f 0d 0a 73 74 61  urning...*/..sta
2f790 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
2f7a0 4e 65 61 72 49 73 4d 61 74 63 68 28 69 6e 74 20  NearIsMatch(int 
2f7b0 2a 70 52 63 2c 20 46 74 73 35 45 78 70 72 4e 65  *pRc, Fts5ExprNe
2f7c0 61 72 73 65 74 20 2a 70 4e 65 61 72 29 7b 0d 0a  arset *pNear){..
2f7d0 20 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65    Fts5NearTrimme
2f7e0 72 20 61 53 74 61 74 69 63 5b 34 5d 3b 0d 0a 20  r aStatic[4];.. 
2f7f0 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65 72   Fts5NearTrimmer
2f800 20 2a 61 20 3d 20 61 53 74 61 74 69 63 3b 0d 0a   *a = aStatic;..
2f810 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
2f820 20 2a 2a 61 70 50 68 72 61 73 65 20 3d 20 70 4e   **apPhrase = pN
2f830 65 61 72 2d 3e 61 70 50 68 72 61 73 65 3b 0d 0a  ear->apPhrase;..
2f840 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 20 20 69 6e  ..  int i;..  in
2f850 74 20 72 63 20 3d 20 2a 70 52 63 3b 0d 0a 20 20  t rc = *pRc;..  
2f860 69 6e 74 20 62 4d 61 74 63 68 3b 0d 0a 0d 0a 20  int bMatch;.... 
2f870 20 61 73 73 65 72 74 28 20 70 4e 65 61 72 2d 3e   assert( pNear->
2f880 6e 50 68 72 61 73 65 3e 31 20 29 3b 0d 0a 0d 0a  nPhrase>1 );....
2f890 20 20 2f 2a 20 49 66 20 74 68 65 20 61 53 74 61    /* If the aSta
2f8a0 74 69 63 5b 5d 20 61 72 72 61 79 20 69 73 20 6e  tic[] array is n
2f8b0 6f 74 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c  ot large enough,
2f8c0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6c 61 72 67   allocate a larg
2f8d0 65 20 61 72 72 61 79 0d 0a 20 20 2a 2a 20 75 73  e array..  ** us
2f8e0 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ing sqlite3_mall
2f8f0 6f 63 28 29 2e 20 54 68 69 73 20 61 70 70 72 6f  oc(). This appro
2f900 61 63 68 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  ach could be imp
2f910 72 6f 76 65 64 20 75 70 6f 6e 2e 20 2a 2f 0d 0a  roved upon. */..
2f920 20 20 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68    if( pNear->nPh
2f930 72 61 73 65 3e 41 72 72 61 79 53 69 7a 65 28 61  rase>ArraySize(a
2f940 53 74 61 74 69 63 29 20 29 7b 0d 0a 20 20 20 20  Static) ){..    
2f950 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
2f960 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
2f970 35 4e 65 61 72 54 72 69 6d 6d 65 72 29 20 2a 20  5NearTrimmer) * 
2f980 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 0d  pNear->nPhrase;.
2f990 0a 20 20 20 20 61 20 3d 20 28 46 74 73 35 4e 65  .    a = (Fts5Ne
2f9a0 61 72 54 72 69 6d 6d 65 72 2a 29 73 71 6c 69 74  arTrimmer*)sqlit
2f9b0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
2f9c0 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0d 0a 20  (&rc, nByte);.. 
2f9d0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 6d 65 6d   }else{..    mem
2f9e0 73 65 74 28 61 53 74 61 74 69 63 2c 20 30 2c 20  set(aStatic, 0, 
2f9f0 73 69 7a 65 6f 66 28 61 53 74 61 74 69 63 29 29  sizeof(aStatic))
2fa00 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63  ;..  }..  if( rc
2fa10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  !=SQLITE_OK ){..
2fa20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0d 0a      *pRc = rc;..
2fa30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20      return 0;.. 
2fa40 20 7d 0d 0a 0d 0a 20 20 2f 2a 20 49 6e 69 74 69   }....  /* Initi
2fa50 61 6c 69 7a 65 20 61 20 6c 6f 6f 6b 61 68 65 61  alize a lookahea
2fa60 64 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 65  d iterator for e
2fa70 61 63 68 20 70 68 72 61 73 65 2e 20 41 66 74 65  ach phrase. Afte
2fa80 72 20 70 61 73 73 69 6e 67 20 74 68 65 0d 0a 20  r passing the.. 
2fa90 20 2a 2a 20 62 75 66 66 65 72 20 61 6e 64 20 62   ** buffer and b
2faa0 75 66 66 65 72 20 73 69 7a 65 20 74 6f 20 74 68  uffer size to th
2fab0 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 72 65 61 64  e lookaside-read
2fac0 65 72 20 69 6e 69 74 20 66 75 6e 63 74 69 6f 6e  er init function
2fad0 2c 20 7a 65 72 6f 0d 0a 20 20 2a 2a 20 74 68 65  , zero..  ** the
2fae0 20 70 68 72 61 73 65 20 70 6f 73 6c 69 73 74 20   phrase poslist 
2faf0 62 75 66 66 65 72 2e 20 54 68 65 20 6e 65 77 20  buffer. The new 
2fb00 70 6f 73 6c 69 73 74 20 66 6f 72 20 74 68 65 20  poslist for the 
2fb10 70 68 72 61 73 65 20 28 63 6f 6e 74 61 69 6e 69  phrase (containi
2fb20 6e 67 0d 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  ng..  ** the sam
2fb30 65 20 65 6e 74 72 69 65 73 20 61 73 20 74 68 65  e entries as the
2fb40 20 6f 72 69 67 69 6e 61 6c 20 77 69 74 68 20 73   original with s
2fb50 6f 6d 65 20 65 6e 74 72 69 65 73 20 72 65 6d 6f  ome entries remo
2fb60 76 65 64 20 6f 6e 20 61 63 63 6f 75 6e 74 20 0d  ved on account .
2fb70 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4e 45 41  .  ** of the NEA
2fb80 52 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 69 73  R constraint) is
2fb90 20 77 72 69 74 74 65 6e 20 6f 76 65 72 20 74 68   written over th
2fba0 65 20 6f 72 69 67 69 6e 61 6c 20 65 76 65 6e 20  e original even 
2fbb0 61 73 20 69 74 20 69 73 0d 0a 20 20 2a 2a 20 62  as it is..  ** b
2fbc0 65 69 6e 67 20 72 65 61 64 2e 20 54 68 69 73 20  eing read. This 
2fbd0 69 73 20 73 61 66 65 20 61 73 20 74 68 65 20 65  is safe as the e
2fbe0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
2fbf0 65 77 20 70 6f 73 6c 69 73 74 20 61 72 65 20 61  ew poslist are a
2fc00 0d 0a 20 20 2a 2a 20 73 75 62 73 65 74 20 6f 66  ..  ** subset of
2fc10 20 74 68 65 20 6f 6c 64 2c 20 73 6f 20 69 74 20   the old, so it 
2fc20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
2fc30 66 6f 72 20 64 61 74 61 20 79 65 74 20 74 6f 20  for data yet to 
2fc40 62 65 20 72 65 61 64 20 74 6f 0d 0a 20 20 2a 2a  be read to..  **
2fc50 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   be overwritten.
2fc60 20 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d 30 3b    */..  for(i=0;
2fc70 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
2fc80 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 46 74  e; i++){..    Ft
2fc90 73 35 42 75 66 66 65 72 20 2a 70 50 6f 73 6c 69  s5Buffer *pPosli
2fca0 73 74 20 3d 20 26 61 70 50 68 72 61 73 65 5b 69  st = &apPhrase[i
2fcb0 5d 2d 3e 70 6f 73 6c 69 73 74 3b 0d 0a 20 20 20  ]->poslist;..   
2fcc0 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
2fcd0 61 64 65 72 49 6e 69 74 28 70 50 6f 73 6c 69 73  aderInit(pPoslis
2fce0 74 2d 3e 70 2c 20 70 50 6f 73 6c 69 73 74 2d 3e  t->p, pPoslist->
2fcf0 6e 2c 20 26 61 5b 69 5d 2e 72 65 61 64 65 72 29  n, &a[i].reader)
2fd00 3b 0d 0a 20 20 20 20 70 50 6f 73 6c 69 73 74 2d  ;..    pPoslist-
2fd10 3e 6e 20 3d 20 30 3b 0d 0a 20 20 20 20 61 5b 69  >n = 0;..    a[i
2fd20 5d 2e 70 4f 75 74 20 3d 20 70 50 6f 73 6c 69 73  ].pOut = pPoslis
2fd30 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 77 68 69  t;..  }....  whi
2fd40 6c 65 28 20 31 20 29 7b 0d 0a 20 20 20 20 69 6e  le( 1 ){..    in
2fd50 74 20 69 41 64 76 3b 0d 0a 20 20 20 20 69 36 34  t iAdv;..    i64
2fd60 20 69 4d 69 6e 3b 0d 0a 20 20 20 20 69 36 34 20   iMin;..    i64 
2fd70 69 4d 61 78 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20  iMax;....    /* 
2fd80 54 68 69 73 20 62 6c 6f 63 6b 20 61 64 76 61 6e  This block advan
2fd90 63 65 73 20 74 68 65 20 70 68 72 61 73 65 20 69  ces the phrase i
2fda0 74 65 72 61 74 6f 72 73 20 75 6e 74 69 6c 20 74  terators until t
2fdb0 68 65 79 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  hey point to a s
2fdc0 65 74 20 6f 66 0d 0a 20 20 20 20 2a 2a 20 65 6e  et of..    ** en
2fdd0 74 72 69 65 73 20 74 68 61 74 20 74 6f 67 65 74  tries that toget
2fde0 68 65 72 20 63 6f 6d 70 72 69 73 65 20 61 20 6d  her comprise a m
2fdf0 61 74 63 68 2e 20 20 2a 2f 0d 0a 20 20 20 20 69  atch.  */..    i
2fe00 4d 61 78 20 3d 20 61 5b 30 5d 2e 72 65 61 64 65  Max = a[0].reade
2fe10 72 2e 69 50 6f 73 3b 0d 0a 20 20 20 20 64 6f 20  r.iPos;..    do 
2fe20 7b 0d 0a 20 20 20 20 20 20 62 4d 61 74 63 68 20  {..      bMatch 
2fe30 3d 20 31 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28  = 1;..      for(
2fe40 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
2fe50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20  hrase; i++){..  
2fe60 20 20 20 20 20 20 46 74 73 35 4c 6f 6f 6b 61 68        Fts5Lookah
2fe70 65 61 64 52 65 61 64 65 72 20 2a 70 50 6f 73 20  eadReader *pPos 
2fe80 3d 20 26 61 5b 69 5d 2e 72 65 61 64 65 72 3b 0d  = &a[i].reader;.
2fe90 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  .        iMin = 
2fea0 69 4d 61 78 20 2d 20 70 4e 65 61 72 2d 3e 61 70  iMax - pNear->ap
2feb0 50 68 72 61 73 65 5b 69 5d 2d 3e 6e 54 65 72 6d  Phrase[i]->nTerm
2fec0 20 2d 20 70 4e 65 61 72 2d 3e 6e 4e 65 61 72 3b   - pNear->nNear;
2fed0 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
2fee0 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e 20 7c 7c  os->iPos<iMin ||
2fef0 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69 4d 61 78   pPos->iPos>iMax
2ff00 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62   ){..          b
2ff10 4d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20  Match = 0;..    
2ff20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 6f        while( pPo
2ff30 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e 20 29 7b 0d  s->iPos<iMin ){.
2ff40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ff50 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
2ff60 61 64 65 72 4e 65 78 74 28 70 50 6f 73 29 20 29  aderNext(pPos) )
2ff70 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75   goto ismatch_ou
2ff80 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t;..          }.
2ff90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ffa0 50 6f 73 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29  Pos->iPos>iMax )
2ffb0 20 69 4d 61 78 20 3d 20 70 50 6f 73 2d 3e 69 50   iMax = pPos->iP
2ffc0 6f 73 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  os;..        }..
2ffd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 77 68        }..    }wh
2ffe0 69 6c 65 28 20 62 4d 61 74 63 68 3d 3d 30 20 29  ile( bMatch==0 )
2fff0 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 41 64 64 20  ;....    /* Add 
30000 61 6e 20 65 6e 74 72 79 20 74 6f 20 65 61 63 68  an entry to each
30010 20 6f 75 74 70 75 74 20 70 6f 73 69 74 69 6f 6e   output position
30020 20 6c 69 73 74 20 2a 2f 0d 0a 20 20 20 20 66 6f   list */..    fo
30030 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e  r(i=0; i<pNear->
30040 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a  nPhrase; i++){..
30050 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d        i64 iPos =
30060 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 50 6f   a[i].reader.iPo
30070 73 3b 0d 0a 20 20 20 20 20 20 46 74 73 35 50 6f  s;..      Fts5Po
30080 73 6c 69 73 74 57 72 69 74 65 72 20 2a 70 57 72  slistWriter *pWr
30090 69 74 65 72 20 3d 20 26 61 5b 69 5d 2e 77 72 69  iter = &a[i].wri
300a0 74 65 72 3b 0d 0a 20 20 20 20 20 20 69 66 28 20  ter;..      if( 
300b0 61 5b 69 5d 2e 70 4f 75 74 2d 3e 6e 3d 3d 30 20  a[i].pOut->n==0 
300c0 7c 7c 20 69 50 6f 73 21 3d 70 57 72 69 74 65 72  || iPos!=pWriter
300d0 2d 3e 69 50 72 65 76 20 29 7b 0d 0a 20 20 20 20  ->iPrev ){..    
300e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
300f0 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65  oslistWriterAppe
30100 6e 64 28 61 5b 69 5d 2e 70 4f 75 74 2c 20 70 57  nd(a[i].pOut, pW
30110 72 69 74 65 72 2c 20 69 50 6f 73 29 3b 0d 0a 20  riter, iPos);.. 
30120 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
30130 0a 20 20 20 20 69 41 64 76 20 3d 20 30 3b 0d 0a  .    iAdv = 0;..
30140 20 20 20 20 69 4d 69 6e 20 3d 20 61 5b 30 5d 2e      iMin = a[0].
30150 72 65 61 64 65 72 2e 69 4c 6f 6f 6b 61 68 65 61  reader.iLookahea
30160 64 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  d;..    for(i=0;
30170 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
30180 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  e; i++){..      
30190 69 66 28 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e  if( a[i].reader.
301a0 69 4c 6f 6f 6b 61 68 65 61 64 20 3c 20 69 4d 69  iLookahead < iMi
301b0 6e 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 4d  n ){..        iM
301c0 69 6e 20 3d 20 61 5b 69 5d 2e 72 65 61 64 65 72  in = a[i].reader
301d0 2e 69 4c 6f 6f 6b 61 68 65 61 64 3b 0d 0a 20 20  .iLookahead;..  
301e0 20 20 20 20 20 20 69 41 64 76 20 3d 20 69 3b 0d        iAdv = i;.
301f0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
30200 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 6f 6f  .    if( fts5Loo
30210 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65 78 74  kaheadReaderNext
30220 28 26 61 5b 69 41 64 76 5d 2e 72 65 61 64 65 72  (&a[iAdv].reader
30230 29 20 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68  ) ) goto ismatch
30240 5f 6f 75 74 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  _out;..  }....  
30250 69 73 6d 61 74 63 68 5f 6f 75 74 3a 20 7b 0d 0a  ismatch_out: {..
30260 20 20 20 20 69 6e 74 20 62 52 65 74 20 3d 20 61      int bRet = a
30270 5b 30 5d 2e 70 4f 75 74 2d 3e 6e 3e 30 3b 0d 0a  [0].pOut->n>0;..
30280 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0d 0a      *pRc = rc;..
30290 20 20 20 20 69 66 28 20 61 21 3d 61 53 74 61 74      if( a!=aStat
302a0 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  ic ) sqlite3_fre
302b0 65 28 61 29 3b 0d 0a 20 20 20 20 72 65 74 75 72  e(a);..    retur
302c0 6e 20 62 52 65 74 3b 0d 0a 20 20 7d 0d 0a 7d 0d  n bRet;..  }..}.
302d0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63  .../*..** Advanc
302e0 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
302f0 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
30300 20 74 6f 20 61 20 76 61 6c 75 65 20 65 71 75 61   to a value equa
30310 6c 20 74 6f 20 6f 72 20 6c 61 73 74 65 72 0d 0a  l to or laster..
30320 2a 2a 20 74 68 61 6e 20 74 68 65 20 69 6e 69 74  ** than the init
30330 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 69  ial value of *pi
30340 4c 61 73 74 2e 20 49 66 20 74 68 69 73 20 6d 65  Last. If this me
30350 61 6e 73 20 74 68 65 20 69 74 65 72 61 74 6f 72  ans the iterator
30360 20 70 6f 69 6e 74 73 0d 0a 2a 2a 20 74 6f 20 61   points..** to a
30370 20 76 61 6c 75 65 20 6c 61 73 74 65 72 20 74 68   value laster th
30380 61 6e 20 2a 70 69 4c 61 73 74 2c 20 75 70 64 61  an *piLast, upda
30390 74 65 20 2a 70 69 4c 61 73 74 20 74 6f 20 74 68  te *piLast to th
303a0 65 20 6e 65 77 20 6c 61 73 74 65 73 74 20 76 61  e new lastest va
303b0 6c 75 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20  lue...**..** If 
303c0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
303d0 63 68 65 73 20 45 4f 46 2c 20 73 65 74 20 2a 70  ches EOF, set *p
303e0 62 45 6f 66 20 74 6f 20 74 72 75 65 20 62 65 66  bEof to true bef
303f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
30400 66 0d 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  f..** an error o
30410 63 63 75 72 73 2c 20 73 65 74 20 2a 70 52 63 20  ccurs, set *pRc 
30420 74 6f 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  to an error code
30430 2e 20 49 66 20 65 69 74 68 65 72 20 2a 70 62 45  . If either *pbE
30440 6f 66 20 6f 72 20 2a 70 52 63 0d 0a 2a 2a 20 61  of or *pRc..** a
30450 72 65 20 73 65 74 2c 20 72 65 74 75 72 6e 20 61  re set, return a
30460 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e   non-zero value.
30470 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
30480 72 6e 20 7a 65 72 6f 2e 0d 0a 2a 2f 0d 0a 73 74  rn zero...*/..st
30490 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
304a0 72 41 64 76 61 6e 63 65 74 6f 28 0d 0a 20 20 46  rAdvanceto(..  F
304b0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
304c0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ter,           /
304d0 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
304e0 76 61 6e 63 65 20 2a 2f 0d 0a 20 20 69 6e 74 20  vance */..  int 
304f0 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
30500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30510 72 75 65 20 69 66 20 69 74 65 72 61 74 6f 72 20  rue if iterator 
30520 69 73 20 22 72 6f 77 69 64 20 44 45 53 43 22 20  is "rowid DESC" 
30530 2a 2f 0d 0a 20 20 69 36 34 20 2a 70 69 4c 61 73  */..  i64 *piLas
30540 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
30550 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
30560 20 4c 61 73 74 65 73 74 20 72 6f 77 69 64 20 73   Lastest rowid s
30570 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0d 0a 20  een so far */.. 
30580 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
30590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305a0 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 63   /* OUT: Error c
305b0 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 2a 70  ode */..  int *p
305c0 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  bEof            
305d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
305e0 3a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  : Set to true if
305f0 20 45 4f 46 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69   EOF */..){..  i
30600 36 34 20 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61  64 iLast = *piLa
30610 73 74 3b 0d 0a 20 20 69 36 34 20 69 52 6f 77 69  st;..  i64 iRowi
30620 64 3b 0d 0a 0d 0a 20 20 69 52 6f 77 69 64 20 3d  d;....  iRowid =
30630 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0d   pIter->iRowid;.
30640 0a 20 20 69 66 28 20 28 62 44 65 73 63 3d 3d 30  .  if( (bDesc==0
30650 20 26 26 20 69 4c 61 73 74 3e 69 52 6f 77 69 64   && iLast>iRowid
30660 29 20 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69  ) || (bDesc && i
30670 4c 61 73 74 3c 69 52 6f 77 69 64 29 20 29 7b 0d  Last<iRowid) ){.
30680 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
30690 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
306a0 74 46 72 6f 6d 28 70 49 74 65 72 2c 20 69 4c 61  tFrom(pIter, iLa
306b0 73 74 29 3b 0d 0a 20 20 20 20 69 66 28 20 72 63  st);..    if( rc
306c0 20 7c 7c 20 73 71 6c 69 74 65 33 46 74 73 35 49   || sqlite3Fts5I
306d0 74 65 72 45 6f 66 28 70 49 74 65 72 29 20 29 7b  terEof(pIter) ){
306e0 0d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72  ..      *pRc = r
306f0 63 3b 0d 0a 20 20 20 20 20 20 2a 70 62 45 6f 66  c;..      *pbEof
30700 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 72 65 74   = 1;..      ret
30710 75 72 6e 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a 20  urn 1;..    }.. 
30720 20 20 20 69 52 6f 77 69 64 20 3d 20 70 49 74 65     iRowid = pIte
30730 72 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 20 20  r->iRowid;..    
30740 61 73 73 65 72 74 28 20 28 62 44 65 73 63 3d 3d  assert( (bDesc==
30750 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c 61  0 && iRowid>=iLa
30760 73 74 29 20 7c 7c 20 28 62 44 65 73 63 3d 3d 31  st) || (bDesc==1
30770 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73   && iRowid<=iLas
30780 74 29 20 29 3b 0d 0a 20 20 7d 0d 0a 20 20 2a 70  t) );..  }..  *p
30790 69 4c 61 73 74 20 3d 20 69 52 6f 77 69 64 3b 0d  iLast = iRowid;.
307a0 0a 0d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a  ...  return 0;..
307b0 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  }....static int 
307c0 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 41  fts5ExprSynonymA
307d0 64 76 61 6e 63 65 74 6f 28 0d 0a 20 20 46 74 73  dvanceto(..  Fts
307e0 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
307f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30800 54 65 72 6d 20 69 74 65 72 61 74 6f 72 20 74 6f  Term iterator to
30810 20 61 64 76 61 6e 63 65 20 2a 2f 0d 0a 20 20 69   advance */..  i
30820 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20  nt bDesc,       
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30840 2a 20 54 72 75 65 20 69 66 20 69 74 65 72 61 74  * True if iterat
30850 6f 72 20 69 73 20 22 72 6f 77 69 64 20 44 45 53  or is "rowid DES
30860 43 22 20 2a 2f 0d 0a 20 20 69 36 34 20 2a 70 69  C" */..  i64 *pi
30870 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
30880 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
30890 55 54 3a 20 4c 61 73 74 65 73 74 20 72 6f 77 69  UT: Lastest rowi
308a0 64 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  d seen so far */
308b0 0d 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  ..  int *pRc    
308c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308d0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f      /* OUT: Erro
308e0 72 20 63 6f 64 65 20 2a 2f 0d 0a 29 7b 0d 0a 20  r code */..){.. 
308f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30900 5f 4f 4b 3b 0d 0a 20 20 69 36 34 20 69 4c 61 73  _OK;..  i64 iLas
30910 74 20 3d 20 2a 70 69 4c 61 73 74 3b 0d 0a 20 20  t = *piLast;..  
30920 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 3b  Fts5ExprTerm *p;
30930 0d 0a 20 20 69 6e 74 20 62 45 6f 66 20 3d 20 30  ..  int bEof = 0
30940 3b 0d 0a 0d 0a 20 20 66 6f 72 28 70 3d 70 54 65  ;....  for(p=pTe
30950 72 6d 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rm; rc==SQLITE_O
30960 4b 20 26 26 20 70 3b 20 70 3d 70 2d 3e 70 53 79  K && p; p=p->pSy
30970 6e 6f 6e 79 6d 29 7b 0d 0a 20 20 20 20 69 66 28  nonym){..    if(
30980 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
30990 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30  Eof(p->pIter)==0
309a0 20 29 7b 0d 0a 20 20 20 20 20 20 69 36 34 20 69   ){..      i64 i
309b0 52 6f 77 69 64 20 3d 20 70 2d 3e 70 49 74 65 72  Rowid = p->pIter
309c0 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 20 20 20  ->iRowid;..     
309d0 20 69 66 28 20 28 62 44 65 73 63 3d 3d 30 20 26   if( (bDesc==0 &
309e0 26 20 69 4c 61 73 74 3e 69 52 6f 77 69 64 29 20  & iLast>iRowid) 
309f0 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69 4c 61  || (bDesc && iLa
30a00 73 74 3c 69 52 6f 77 69 64 29 20 29 7b 0d 0a 20  st<iRowid) ){.. 
30a10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30a20 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
30a30 72 6f 6d 28 70 2d 3e 70 49 74 65 72 2c 20 69 4c  rom(p->pIter, iL
30a40 61 73 74 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  ast);..      }..
30a50 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
30a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30a70 4b 20 29 7b 0d 0a 20 20 20 20 2a 70 52 63 20 3d  K ){..    *pRc =
30a80 20 72 63 3b 0d 0a 20 20 20 20 62 45 6f 66 20 3d   rc;..    bEof =
30a90 20 31 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20   1;..  }else{.. 
30aa0 20 20 20 2a 70 69 4c 61 73 74 20 3d 20 66 74 73     *piLast = fts
30ab0 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69  5ExprSynonymRowi
30ac0 64 28 70 54 65 72 6d 2c 20 62 44 65 73 63 2c 20  d(pTerm, bDesc, 
30ad0 26 62 45 6f 66 29 3b 0d 0a 20 20 7d 0d 0a 20 20  &bEof);..  }..  
30ae0 72 65 74 75 72 6e 20 62 45 6f 66 3b 0d 0a 7d 0d  return bEof;..}.
30af0 0a 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .....static int 
30b00 66 74 73 35 45 78 70 72 4e 65 61 72 54 65 73 74  fts5ExprNearTest
30b10 28 0d 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0d 0a  (..  int *pRc,..
30b20 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70    Fts5Expr *pExp
30b30 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
30b40 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
30b50 74 68 61 74 20 70 4e 65 61 72 20 69 73 20 61 20  that pNear is a 
30b60 70 61 72 74 20 6f 66 20 2a 2f 0d 0a 20 20 46 74  part of */..  Ft
30b70 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
30b80 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
30b90 20 54 68 65 20 22 4e 45 41 52 22 20 6e 6f 64 65   The "NEAR" node
30ba0 20 28 46 54 53 35 5f 53 54 52 49 4e 47 29 20 2a   (FTS5_STRING) *
30bb0 2f 0d 0a 29 7b 0d 0a 20 20 46 74 73 35 45 78 70  /..){..  Fts5Exp
30bc0 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
30bd0 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d  = pNode->pNear;.
30be0 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63  .  int rc = *pRc
30bf0 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 45 78 70 72  ;....  if( pExpr
30c00 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
30c10 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
30c20 46 55 4c 4c 20 29 7b 0d 0a 20 20 20 20 46 74 73  FULL ){..    Fts
30c30 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
30c40 3b 0d 0a 20 20 20 20 46 74 73 35 45 78 70 72 50  ;..    Fts5ExprP
30c50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d  hrase *pPhrase =
30c60 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65   pNear->apPhrase
30c70 5b 30 5d 3b 0d 0a 20 20 20 20 70 50 68 72 61 73  [0];..    pPhras
30c80 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30  e->poslist.n = 0
30c90 3b 0d 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  ;..    for(pTerm
30ca0 3d 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  =&pPhrase->aTerm
30cb0 5b 30 5d 3b 20 70 54 65 72 6d 3b 20 70 54 65 72  [0]; pTerm; pTer
30cc0 6d 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79  m=pTerm->pSynony
30cd0 6d 29 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 49  m){..      Fts5I
30ce0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
30cf0 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0d  = pTerm->pIter;.
30d00 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
30d10 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
30d20 74 65 72 29 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  ter)==0 ){..    
30d30 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
30d40 52 6f 77 69 64 3d 3d 70 4e 6f 64 65 2d 3e 69 52  Rowid==pNode->iR
30d50 6f 77 69 64 20 26 26 20 70 49 74 65 72 2d 3e 6e  owid && pIter->n
30d60 44 61 74 61 3e 30 20 29 7b 0d 0a 20 20 20 20 20  Data>0 ){..     
30d70 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 70 6f       pPhrase->po
30d80 73 6c 69 73 74 2e 6e 20 3d 20 31 3b 0d 0a 20 20  slist.n = 1;..  
30d90 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
30da0 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74  ..    }..    ret
30db0 75 72 6e 20 70 50 68 72 61 73 65 2d 3e 70 6f 73  urn pPhrase->pos
30dc0 6c 69 73 74 2e 6e 3b 0d 0a 20 20 7d 65 6c 73 65  list.n;..  }else
30dd0 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 0d  {..    int i;...
30de0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
30df0 61 74 20 65 61 63 68 20 70 68 72 61 73 65 20 69  at each phrase i
30e00 6e 20 74 68 65 20 6e 65 61 72 73 65 74 20 6d 61  n the nearset ma
30e10 74 63 68 65 73 20 74 68 65 20 63 75 72 72 65 6e  tches the curren
30e20 74 20 72 6f 77 2e 0d 0a 20 20 20 20 2a 2a 20 50  t row...    ** P
30e30 6f 70 75 6c 61 74 65 20 74 68 65 20 70 50 68 72  opulate the pPhr
30e40 61 73 65 2d 3e 70 6f 73 6c 69 73 74 20 62 75 66  ase->poslist buf
30e50 66 65 72 73 20 61 74 20 74 68 65 20 73 61 6d 65  fers at the same
30e60 20 74 69 6d 65 2e 20 49 66 20 61 6e 79 0d 0a 20   time. If any.. 
30e70 20 20 20 2a 2a 20 70 68 72 61 73 65 20 69 73 20     ** phrase is 
30e80 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 62 72 65  not a match, bre
30e90 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
30ea0 6f 70 20 65 61 72 6c 79 2e 20 20 2a 2f 0d 0a 20  op early.  */.. 
30eb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
30ec0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
30ed0 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69  Near->nPhrase; i
30ee0 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 46 74 73 35  ++){..      Fts5
30ef0 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
30f00 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50  ase = pNear->apP
30f10 68 72 61 73 65 5b 69 5d 3b 0d 0a 20 20 20 20 20  hrase[i];..     
30f20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54   if( pPhrase->nT
30f30 65 72 6d 3e 31 20 7c 7c 20 70 50 68 72 61 73 65  erm>1 || pPhrase
30f40 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f  ->aTerm[0].pSyno
30f50 6e 79 6d 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20  nym ..       || 
30f60 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 7c  pNear->pColset |
30f70 7c 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  | pPhrase->aTerm
30f80 5b 30 5d 2e 62 46 69 72 73 74 0d 0a 20 20 20 20  [0].bFirst..    
30f90 20 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e    ){..        in
30fa0 74 20 62 4d 61 74 63 68 20 3d 20 30 3b 0d 0a 20  t bMatch = 0;.. 
30fb0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
30fc0 45 78 70 72 50 68 72 61 73 65 49 73 4d 61 74 63  ExprPhraseIsMatc
30fd0 68 28 70 4e 6f 64 65 2c 20 70 50 68 72 61 73 65  h(pNode, pPhrase
30fe0 2c 20 26 62 4d 61 74 63 68 29 3b 0d 0a 20 20 20  , &bMatch);..   
30ff0 20 20 20 20 20 69 66 28 20 62 4d 61 74 63 68 3d       if( bMatch=
31000 3d 30 20 29 20 62 72 65 61 6b 3b 0d 0a 20 20 20  =0 ) break;..   
31010 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
31020 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72     Fts5IndexIter
31030 20 2a 70 49 74 65 72 20 3d 20 70 50 68 72 61 73   *pIter = pPhras
31040 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65  e->aTerm[0].pIte
31050 72 3b 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35  r;..        fts5
31060 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26  BufferSet(&rc, &
31070 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
31080 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20  , pIter->nData, 
31090 70 49 74 65 72 2d 3e 70 44 61 74 61 29 3b 0d 0a  pIter->pData);..
310a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
310b0 0d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  ..    *pRc = rc;
310c0 0d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4e 65  ..    if( i==pNe
310d0 61 72 2d 3e 6e 50 68 72 61 73 65 20 26 26 20 28  ar->nPhrase && (
310e0 69 3d 3d 31 20 7c 7c 20 66 74 73 35 45 78 70 72  i==1 || fts5Expr
310f0 4e 65 61 72 49 73 4d 61 74 63 68 28 70 52 63 2c  NearIsMatch(pRc,
31100 20 70 4e 65 61 72 29 29 20 29 7b 0d 0a 20 20 20   pNear)) ){..   
31110 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20     return 1;..  
31120 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
31130 30 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a  0;..  }..}......
31140 2f 2a 0d 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  /*..** Initializ
31150 65 20 61 6c 6c 20 74 65 72 6d 20 69 74 65 72 61  e all term itera
31160 74 6f 72 73 20 69 6e 20 74 68 65 20 70 4e 65 61  tors in the pNea
31170 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 79  r object. If any
31180 20 74 65 72 6d 20 69 73 20 66 6f 75 6e 64 0d 0a   term is found..
31190 2a 2a 20 74 6f 20 6d 61 74 63 68 20 6e 6f 20 64  ** to match no d
311a0 6f 63 75 6d 65 6e 74 73 20 61 74 20 61 6c 6c 2c  ocuments at all,
311b0 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
311c0 65 6c 79 20 77 69 74 68 6f 75 74 20 69 6e 69 74  ely without init
311d0 69 61 6c 69 7a 69 6e 67 20 61 6e 79 0d 0a 2a 2a  ializing any..**
311e0 20 66 75 72 74 68 65 72 20 69 74 65 72 61 74 6f   further iterato
311f0 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61  rs...**..** If a
31200 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
31210 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
31220 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
31230 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0d 0a  erwise, return..
31240 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74  ** SQLITE_OK. It
31250 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
31260 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 73  ed an error if s
31270 6f 6d 65 20 74 65 72 6d 20 6d 61 74 63 68 65 73  ome term matches
31280 20 7a 65 72 6f 0d 0a 2a 2a 20 64 6f 63 75 6d 65   zero..** docume
31290 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  nts...*/..static
312a0 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 65 61   int fts5ExprNea
312b0 72 49 6e 69 74 41 6c 6c 28 0d 0a 20 20 46 74 73  rInitAll(..  Fts
312c0 35 45 78 70 72 20 2a 70 45 78 70 72 2c 0d 0a 20  5Expr *pExpr,.. 
312d0 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
312e0 4e 6f 64 65 0d 0a 29 7b 0d 0a 20 20 46 74 73 35  Node..){..  Fts5
312f0 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65  ExprNearset *pNe
31300 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  ar = pNode->pNea
31310 72 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a 0d 0a  r;..  int i;....
31320 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
31330 3e 62 4e 6f 6d 61 74 63 68 3d 3d 30 20 29 3b 0d  >bNomatch==0 );.
31340 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e  .  for(i=0; i<pN
31350 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  ear->nPhrase; i+
31360 2b 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78 70  +){..    Fts5Exp
31370 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
31380 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
31390 73 65 5b 69 5d 3b 0d 0a 20 20 20 20 69 66 28 20  se[i];..    if( 
313a0 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d  pPhrase->nTerm==
313b0 30 20 29 7b 0d 0a 20 20 20 20 20 20 70 4e 6f 64  0 ){..      pNod
313c0 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20  e->bEof = 1;..  
313d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
313e0 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 65 6c 73 65  E_OK;..    }else
313f0 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0d  {..      int j;.
31400 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
31410 6a 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  j<pPhrase->nTerm
31420 3b 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 20  ; j++){..       
31430 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
31440 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d  Term = &pPhrase-
31450 3e 61 54 65 72 6d 5b 6a 5d 3b 0d 0a 20 20 20 20  >aTerm[j];..    
31460 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
31470 20 2a 70 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e   *p;..        in
31480 74 20 62 48 69 74 20 3d 20 30 3b 0d 0a 0d 0a 20  t bHit = 0;.... 
31490 20 20 20 20 20 20 20 66 6f 72 28 70 3d 70 54 65         for(p=pTe
314a0 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e  rm; p; p=p->pSyn
314b0 6f 6e 79 6d 29 7b 0d 0a 20 20 20 20 20 20 20 20  onym){..        
314c0 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 20 20 20    int rc;..     
314d0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 49 74 65       if( p->pIte
314e0 72 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  r ){..          
314f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
31500 72 43 6c 6f 73 65 28 70 2d 3e 70 49 74 65 72 29  rClose(p->pIter)
31510 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
31520 2d 3e 70 49 74 65 72 20 3d 20 30 3b 0d 0a 20 20  ->pIter = 0;..  
31530 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
31540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31550 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
31560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
31570 70 45 78 70 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pExpr->pIndex, p
31580 2d 3e 7a 54 65 72 6d 2c 20 28 69 6e 74 29 73 74  ->zTerm, (int)st
31590 72 6c 65 6e 28 70 2d 3e 7a 54 65 72 6d 29 2c 0d  rlen(p->zTerm),.
315a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
315b0 70 54 65 72 6d 2d 3e 62 50 72 65 66 69 78 20 3f  pTerm->bPrefix ?
315c0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
315d0 5f 50 52 45 46 49 58 20 3a 20 30 29 20 7c 0d 0a  _PREFIX : 0) |..
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
315f0 45 78 70 72 2d 3e 62 44 65 73 63 20 3f 20 46 54  Expr->bDesc ? FT
31600 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
31610 53 43 20 3a 20 30 29 2c 0d 0a 20 20 20 20 20 20  SC : 0),..      
31620 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d 3e 70          pNear->p
31630 43 6f 6c 73 65 74 2c 0d 0a 20 20 20 20 20 20 20  Colset,..       
31640 20 20 20 20 20 20 20 26 70 2d 3e 70 49 74 65 72         &p->pIter
31650 0d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0d 0a  ..          );..
31660 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31670 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
31680 29 3d 3d 28 70 2d 3e 70 49 74 65 72 21 3d 30 29  )==(p->pIter!=0)
31690 20 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69   );..          i
316a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
316b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20   ) return rc;.. 
316c0 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d           if( 0==
316d0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
316e0 6f 66 28 70 2d 3e 70 49 74 65 72 29 20 29 7b 0d  of(p->pIter) ){.
316f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 48 69  .            bHi
31700 74 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20  t = 1;..        
31710 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
31720 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 48  ..        if( bH
31730 69 74 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20  it==0 ){..      
31740 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20      pNode->bEof 
31750 3d 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
31760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31770 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
31780 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
31790 7d 0d 0a 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 45  }....  pNode->bE
317a0 6f 66 20 3d 20 30 3b 0d 0a 20 20 72 65 74 75 72  of = 0;..  retur
317b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 7d 0d  n SQLITE_OK;..}.
317c0 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49 66 20 70 45 78  .../*..** If pEx
317d0 70 72 20 69 73 20 61 6e 20 41 53 43 20 69 74 65  pr is an ASC ite
317e0 72 61 74 6f 72 2c 20 74 68 69 73 20 66 75 6e 63  rator, this func
317f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 76  tion returns a v
31800 61 6c 75 65 20 77 69 74 68 20 74 68 65 0d 0a 2a  alue with the..*
31810 2a 20 73 61 6d 65 20 73 69 67 6e 20 61 73 3a 0d  * same sign as:.
31820 0a 2a 2a 0d 0a 2a 2a 20 20 20 28 69 4c 68 73 20  .**..**   (iLhs 
31830 2d 20 69 52 68 73 29 0d 0a 2a 2a 0d 0a 2a 2a 20  - iRhs)..**..** 
31840 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
31850 69 73 20 69 73 20 61 20 44 45 53 43 20 69 74 65  is is a DESC ite
31860 72 61 74 6f 72 2c 20 74 68 65 20 6f 70 70 6f 73  rator, the oppos
31870 69 74 65 20 69 73 20 72 65 74 75 72 6e 65 64 3a  ite is returned:
31880 0d 0a 2a 2a 0d 0a 2a 2a 20 20 20 28 69 52 68 73  ..**..**   (iRhs
31890 20 2d 20 69 4c 68 73 29 0d 0a 2a 2f 0d 0a 73 74   - iLhs)..*/..st
318a0 61 74 69 63 20 69 6e 74 20 66 74 73 35 52 6f 77  atic int fts5Row
318b0 69 64 43 6d 70 28 0d 0a 20 20 46 74 73 35 45 78  idCmp(..  Fts5Ex
318c0 70 72 20 2a 70 45 78 70 72 2c 0d 0a 20 20 69 36  pr *pExpr,..  i6
318d0 34 20 69 4c 68 73 2c 0d 0a 20 20 69 36 34 20 69  4 iLhs,..  i64 i
318e0 52 68 73 0d 0a 29 7b 0d 0a 20 20 61 73 73 65 72  Rhs..){..  asser
318f0 74 28 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d  t( pExpr->bDesc=
31900 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 62 44 65  =0 || pExpr->bDe
31910 73 63 3d 3d 31 20 29 3b 0d 0a 20 20 69 66 28 20  sc==1 );..  if( 
31920 70 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d 30 20  pExpr->bDesc==0 
31930 29 7b 0d 0a 20 20 20 20 69 66 28 20 69 4c 68 73  ){..    if( iLhs
31940 3c 69 52 68 73 20 29 20 72 65 74 75 72 6e 20 2d  <iRhs ) return -
31950 31 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 28  1;..    return (
31960 69 4c 68 73 20 3e 20 69 52 68 73 29 3b 0d 0a 20  iLhs > iRhs);.. 
31970 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69 66 28   }else{..    if(
31980 20 69 4c 68 73 3e 69 52 68 73 20 29 20 72 65 74   iLhs>iRhs ) ret
31990 75 72 6e 20 2d 31 3b 0d 0a 20 20 20 20 72 65 74  urn -1;..    ret
319a0 75 72 6e 20 28 69 4c 68 73 20 3c 20 69 52 68 73  urn (iLhs < iRhs
319b0 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74  );..  }..}....st
319c0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 45 78  atic void fts5Ex
319d0 70 72 53 65 74 45 6f 66 28 46 74 73 35 45 78 70  prSetEof(Fts5Exp
319e0 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0d 0a  rNode *pNode){..
319f0 20 20 69 6e 74 20 69 3b 0d 0a 20 20 70 4e 6f 64    int i;..  pNod
31a00 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20  e->bEof = 1;..  
31a10 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20  pNode->bNomatch 
31a20 3d 20 30 3b 0d 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
31a30 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
31a40 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 66 74 73  ; i++){..    fts
31a50 35 45 78 70 72 53 65 74 45 6f 66 28 70 4e 6f 64  5ExprSetEof(pNod
31a60 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0d  e->apChild[i]);.
31a70 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69  .  }..}....stati
31a80 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 4e  c void fts5ExprN
31a90 6f 64 65 5a 65 72 6f 50 6f 73 6c 69 73 74 28 46  odeZeroPoslist(F
31aa0 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f  ts5ExprNode *pNo
31ab0 64 65 29 7b 0d 0a 20 20 69 66 28 20 70 4e 6f 64  de){..  if( pNod
31ac0 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53  e->eType==FTS5_S
31ad0 54 52 49 4e 47 20 7c 7c 20 70 4e 6f 64 65 2d 3e  TRING || pNode->
31ae0 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d  eType==FTS5_TERM
31af0 20 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78 70   ){..    Fts5Exp
31b00 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
31b10 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0d  = pNode->pNear;.
31b20 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20  .    int i;..   
31b30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61   for(i=0; i<pNea
31b40 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29  r->nPhrase; i++)
31b50 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  {..      Fts5Exp
31b60 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
31b70 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
31b80 73 65 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 70 50  se[i];..      pP
31b90 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e  hrase->poslist.n
31ba0 20 3d 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20   = 0;..    }..  
31bb0 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69 6e 74 20  }else{..    int 
31bc0 69 3b 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  i;..    for(i=0;
31bd0 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
31be0 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 66  ; i++){..      f
31bf0 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
31c00 6f 73 6c 69 73 74 28 70 4e 6f 64 65 2d 3e 61 70  oslist(pNode->ap
31c10 43 68 69 6c 64 5b 69 5d 29 3b 0d 0a 20 20 20 20  Child[i]);..    
31c20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d  }..  }..}.......
31c30 0a 2f 2a 0d 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ./*..** Compare 
31c40 74 68 65 20 76 61 6c 75 65 73 20 63 75 72 72 65  the values curre
31c50 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
31c60 79 20 74 68 65 20 74 77 6f 20 6e 6f 64 65 73 20  y the two nodes 
31c70 61 73 20 66 6f 6c 6c 6f 77 73 3a 0d 0a 2a 2a 0d  as follows:..**.
31c80 0a 2a 2a 20 20 20 20 72 65 73 20 3d 20 28 2a 70  .**    res = (*p
31c90 31 29 20 2d 20 28 2a 70 32 29 0d 0a 2a 2a 0d 0a  1) - (*p2)..**..
31ca0 2a 2a 20 4e 6f 64 65 73 20 74 68 61 74 20 70 6f  ** Nodes that po
31cb0 69 6e 74 20 74 6f 20 76 61 6c 75 65 73 20 74 68  int to values th
31cc0 61 74 20 63 6f 6d 65 20 6c 61 74 65 72 20 69 6e  at come later in
31cd0 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 6f   the iteration o
31ce0 72 64 65 72 20 61 72 65 0d 0a 2a 2a 20 63 6f 6e  rder are..** con
31cf0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 6c 61  sidered to be la
31d00 72 67 65 72 2e 20 4e 6f 64 65 73 20 61 74 20 45  rger. Nodes at E
31d10 4f 46 20 61 72 65 20 74 68 65 20 6c 61 72 67 65  OF are the large
31d20 73 74 20 6f 66 20 61 6c 6c 2e 0d 0a 2a 2a 0d 0a  st of all...**..
31d30 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
31d40 61 74 20 69 66 20 74 68 65 20 69 74 65 72 61 74  at if the iterat
31d50 69 6f 6e 20 6f 72 64 65 72 20 69 73 20 41 53 43  ion order is ASC
31d60 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 61 6c  , then numerical
31d70 6c 79 20 6c 61 72 67 65 72 0d 0a 2a 2a 20 72 6f  ly larger..** ro
31d80 77 69 64 73 20 61 72 65 20 63 6f 6e 73 69 64 65  wids are conside
31d90 72 65 64 20 6c 61 72 67 65 72 2e 20 4f 72 20 69  red larger. Or i
31da0 66 20 69 74 20 69 73 20 74 68 65 20 64 65 66 61  f it is the defa
31db0 75 6c 74 20 44 45 53 43 2c 20 6e 75 6d 65 72 69  ult DESC, numeri
31dc0 63 61 6c 6c 79 0d 0a 2a 2a 20 73 6d 61 6c 6c 65  cally..** smalle
31dd0 72 20 72 6f 77 69 64 73 20 61 72 65 20 6c 61 72  r rowids are lar
31de0 67 65 72 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  ger...*/..static
31df0 20 69 6e 74 20 66 74 73 35 4e 6f 64 65 43 6f 6d   int fts5NodeCom
31e00 70 61 72 65 28 0d 0a 20 20 46 74 73 35 45 78 70  pare(..  Fts5Exp
31e10 72 20 2a 70 45 78 70 72 2c 0d 0a 20 20 46 74 73  r *pExpr,..  Fts
31e20 35 45 78 70 72 4e 6f 64 65 20 2a 70 31 2c 20 0d  5ExprNode *p1, .
31e30 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
31e40 2a 70 32 0d 0a 29 7b 0d 0a 20 20 69 66 28 20 70  *p2..){..  if( p
31e50 32 2d 3e 62 45 6f 66 20 29 20 72 65 74 75 72 6e  2->bEof ) return
31e60 20 2d 31 3b 0d 0a 20 20 69 66 28 20 70 31 2d 3e   -1;..  if( p1->
31e70 62 45 6f 66 20 29 20 72 65 74 75 72 6e 20 2b 31  bEof ) return +1
31e80 3b 0d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ;..  return fts5
31e90 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20  RowidCmp(pExpr, 
31ea0 70 31 2d 3e 69 52 6f 77 69 64 2c 20 70 32 2d 3e  p1->iRowid, p2->
31eb0 69 52 6f 77 69 64 29 3b 0d 0a 7d 0d 0a 0d 0a 2f  iRowid);..}..../
31ec0 2a 0d 0a 2a 2a 20 41 6c 6c 20 69 6e 64 69 76 69  *..** All indivi
31ed0 64 75 61 6c 20 74 65 72 6d 20 69 74 65 72 61 74  dual term iterat
31ee0 6f 72 73 20 69 6e 20 70 4e 65 61 72 20 61 72 65  ors in pNear are
31ef0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
31f00 65 20 76 61 6c 69 64 20 77 68 65 6e 0d 0a 2a 2a  e valid when..**
31f10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31f20 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 66  s called. This f
31f30 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
31f40 66 20 61 6c 6c 20 74 65 72 6d 20 69 74 65 72 61  f all term itera
31f50 74 6f 72 73 0d 0a 2a 2a 20 70 6f 69 6e 74 20 74  tors..** point t
31f60 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69 64  o the same rowid
31f70 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 61 64  , and if not, ad
31f80 76 61 6e 63 65 73 20 74 68 65 6d 20 75 6e 74 69  vances them unti
31f90 6c 20 74 68 65 79 20 64 6f 2e 0d 0a 2a 2a 20 49  l they do...** I
31fa0 66 20 61 6e 20 45 4f 46 20 69 73 20 72 65 61 63  f an EOF is reac
31fb0 68 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  hed before this 
31fc0 68 61 70 70 65 6e 73 2c 20 2a 70 62 45 6f 66 20  happens, *pbEof 
31fd0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 62  is set to true b
31fe0 65 66 6f 72 65 0d 0a 2a 2a 20 72 65 74 75 72 6e  efore..** return
31ff0 69 6e 67 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 53 51 4c  ing...**..** SQL
32000 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
32010 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
32020 63 63 75 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c  ccurs, or an SQL
32030 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 0d  ite error code .
32040 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 49  .** otherwise. I
32050 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
32060 72 65 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  red an error cod
32070 65 20 69 66 20 61 6e 20 69 74 65 72 61 74 6f 72  e if an iterator
32080 20 72 65 61 63 68 65 73 0d 0a 2a 2a 20 45 4f 46   reaches..** EOF
32090 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
320a0 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65  t fts5ExprNodeTe
320b0 73 74 5f 53 54 52 49 4e 47 28 0d 0a 20 20 46 74  st_STRING(..  Ft
320c0 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s5Expr *pExpr,  
320d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
320e0 20 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72   Expression pPhr
320f0 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  ase belongs to *
32100 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  /..  Fts5ExprNod
32110 65 20 2a 70 4e 6f 64 65 0d 0a 29 7b 0d 0a 20 20  e *pNode..){..  
32120 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
32130 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e  *pNear = pNode->
32140 70 4e 65 61 72 3b 0d 0a 20 20 46 74 73 35 45 78  pNear;..  Fts5Ex
32150 70 72 50 68 72 61 73 65 20 2a 70 4c 65 66 74 20  prPhrase *pLeft 
32160 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  = pNear->apPhras
32170 65 5b 30 5d 3b 0d 0a 20 20 69 6e 74 20 72 63 20  e[0];..  int rc 
32180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  = SQLITE_OK;..  
32190 69 36 34 20 69 4c 61 73 74 3b 20 20 20 20 20 20  i64 iLast;      
321a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321b0 2f 2a 20 4c 61 73 74 65 73 74 20 72 6f 77 69 64  /* Lastest rowid
321c0 20 61 6e 79 20 69 74 65 72 61 74 6f 72 20 70 6f   any iterator po
321d0 69 6e 74 73 20 74 6f 20 2a 2f 0d 0a 20 20 69 6e  ints to */..  in
321e0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
321f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32200 20 50 68 72 61 73 65 20 61 6e 64 20 74 6f 6b 65   Phrase and toke
32210 6e 20 69 6e 64 65 78 2c 20 72 65 73 70 65 63 74  n index, respect
32220 69 76 65 6c 79 20 2a 2f 0d 0a 20 20 69 6e 74 20  ively */..  int 
32230 62 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  bMatch;         
32240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32250 72 75 65 20 69 66 20 61 6c 6c 20 74 65 72 6d 73  rue if all terms
32260 20 61 72 65 20 61 74 20 74 68 65 20 73 61 6d 65   are at the same
32270 20 72 6f 77 69 64 20 2a 2f 0d 0a 20 20 63 6f 6e   rowid */..  con
32280 73 74 20 69 6e 74 20 62 44 65 73 63 20 3d 20 70  st int bDesc = p
32290 45 78 70 72 2d 3e 62 44 65 73 63 3b 0d 0a 0d 0a  Expr->bDesc;....
322a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
322b0 74 68 69 73 20 6e 6f 64 65 20 73 68 6f 75 6c 64  this node should
322c0 20 6e 6f 74 20 62 65 20 46 54 53 35 5f 54 45 52   not be FTS5_TER
322d0 4d 20 2a 2f 0d 0a 20 20 61 73 73 65 72 74 28 20  M */..  assert( 
322e0 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e 31  pNear->nPhrase>1
322f0 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65   ..       || pNe
32300 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
32310 3e 6e 54 65 72 6d 3e 31 20 0d 0a 20 20 20 20 20  >nTerm>1 ..     
32320 20 20 7c 7c 20 70 4e 65 61 72 2d 3e 61 70 50 68    || pNear->apPh
32330 72 61 73 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30  rase[0]->aTerm[0
32340 5d 2e 70 53 79 6e 6f 6e 79 6d 0d 0a 20 20 20 20  ].pSynonym..    
32350 20 20 20 7c 7c 20 70 4e 65 61 72 2d 3e 61 70 50     || pNear->apP
32360 68 72 61 73 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b  hrase[0]->aTerm[
32370 30 5d 2e 62 46 69 72 73 74 0d 0a 20 20 29 3b 0d  0].bFirst..  );.
32380 0a 0d 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ...  /* Initiali
32390 7a 65 20 69 4c 61 73 74 2c 20 74 68 65 20 22 6c  ze iLast, the "l
323a0 61 73 74 65 73 74 22 20 72 6f 77 69 64 20 61 6e  astest" rowid an
323b0 79 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  y iterator point
323c0 73 20 74 6f 2e 20 49 66 20 74 68 65 0d 0a 20 20  s to. If the..  
323d0 2a 2a 20 69 74 65 72 61 74 6f 72 20 73 6b 69 70  ** iterator skip
323e0 73 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 73  s through rowids
323f0 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20   in the default 
32400 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c  ascending order,
32410 20 74 68 69 73 20 6d 65 61 6e 73 0d 0a 20 20 2a   this means..  *
32420 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f  * the maximum ro
32430 77 69 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  wid. Or, if the 
32440 69 74 65 72 61 74 6f 72 20 69 73 20 22 4f 52 44  iterator is "ORD
32450 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
32460 22 2c 20 74 68 65 6e 20 69 74 0d 0a 20 20 2a 2a  ", then it..  **
32470 20 6d 65 61 6e 73 20 74 68 65 20 6d 69 6e 69 6d   means the minim
32480 75 6d 20 72 6f 77 69 64 2e 20 20 2a 2f 0d 0a 20  um rowid.  */.. 
32490 20 69 66 28 20 70 4c 65 66 74 2d 3e 61 54 65 72   if( pLeft->aTer
324a0 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 20 29 7b  m[0].pSynonym ){
324b0 0d 0a 20 20 20 20 69 4c 61 73 74 20 3d 20 66 74  ..    iLast = ft
324c0 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77  s5ExprSynonymRow
324d0 69 64 28 26 70 4c 65 66 74 2d 3e 61 54 65 72 6d  id(&pLeft->aTerm
324e0 5b 30 5d 2c 20 62 44 65 73 63 2c 20 30 29 3b 0d  [0], bDesc, 0);.
324f0 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 69  .  }else{..    i
32500 4c 61 73 74 20 3d 20 70 4c 65 66 74 2d 3e 61 54  Last = pLeft->aT
32510 65 72 6d 5b 30 5d 2e 70 49 74 65 72 2d 3e 69 52  erm[0].pIter->iR
32520 6f 77 69 64 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  owid;..  }....  
32530 64 6f 20 7b 0d 0a 20 20 20 20 62 4d 61 74 63 68  do {..    bMatch
32540 20 3d 20 31 3b 0d 0a 20 20 20 20 66 6f 72 28 69   = 1;..    for(i
32550 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68  =0; i<pNear->nPh
32560 72 61 73 65 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20  rase; i++){..   
32570 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
32580 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65  e *pPhrase = pNe
32590 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b  ar->apPhrase[i];
325a0 0d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ..      for(j=0;
325b0 20 6a 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72   j<pPhrase->nTer
325c0 6d 3b 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20 20 20  m; j++){..      
325d0 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
325e0 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
325f0 2d 3e 61 54 65 72 6d 5b 6a 5d 3b 0d 0a 20 20 20  ->aTerm[j];..   
32600 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
32610 70 53 79 6e 6f 6e 79 6d 20 29 7b 0d 0a 20 20 20  pSynonym ){..   
32620 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69         i64 iRowi
32630 64 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e 6f  d = fts5ExprSyno
32640 6e 79 6d 52 6f 77 69 64 28 70 54 65 72 6d 2c 20  nymRowid(pTerm, 
32650 62 44 65 73 63 2c 20 30 29 3b 0d 0a 20 20 20 20  bDesc, 0);..    
32660 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
32670 3d 3d 69 4c 61 73 74 20 29 20 63 6f 6e 74 69 6e  ==iLast ) contin
32680 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  ue;..          b
32690 4d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20  Match = 0;..    
326a0 20 20 20 20 20 20 69 66 28 20 66 74 73 35 45 78        if( fts5Ex
326b0 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e 63 65  prSynonymAdvance
326c0 74 6f 28 70 54 65 72 6d 2c 20 62 44 65 73 63 2c  to(pTerm, bDesc,
326d0 20 26 69 4c 61 73 74 2c 20 26 72 63 29 20 29 7b   &iLast, &rc) ){
326e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  ..            pN
326f0 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20  ode->bNomatch = 
32700 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0;..            
32710 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b  pNode->bEof = 1;
32720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
32730 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20  turn rc;..      
32740 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
32750 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 20  else{..         
32760 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
32770 70 49 74 65 72 20 3d 20 70 50 68 72 61 73 65 2d  pIter = pPhrase-
32780 3e 61 54 65 72 6d 5b 6a 5d 2e 70 49 74 65 72 3b  >aTerm[j].pIter;
32790 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
327a0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3d 3d 69  pIter->iRowid==i
327b0 4c 61 73 74 20 7c 7c 20 70 49 74 65 72 2d 3e 62  Last || pIter->b
327c0 45 6f 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0d  Eof ) continue;.
327d0 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74 63  .          bMatc
327e0 68 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20  h = 0;..        
327f0 20 20 69 66 28 20 66 74 73 35 45 78 70 72 41 64    if( fts5ExprAd
32800 76 61 6e 63 65 74 6f 28 70 49 74 65 72 2c 20 62  vanceto(pIter, b
32810 44 65 73 63 2c 20 26 69 4c 61 73 74 2c 20 26 72  Desc, &iLast, &r
32820 63 2c 20 26 70 4e 6f 64 65 2d 3e 62 45 6f 66 29  c, &pNode->bEof)
32830 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ){..           
32840 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 20 20 20   return rc;..   
32850 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
32860 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
32870 20 20 7d 0d 0a 20 20 7d 77 68 69 6c 65 28 20 62    }..  }while( b
32880 4d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a 20  Match==0 );.... 
32890 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d   pNode->iRowid =
328a0 20 69 4c 61 73 74 3b 0d 0a 20 20 70 4e 6f 64 65   iLast;..  pNode
328b0 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28 28 30  ->bNomatch = ((0
328c0 3d 3d 66 74 73 35 45 78 70 72 4e 65 61 72 54 65  ==fts5ExprNearTe
328d0 73 74 28 26 72 63 2c 20 70 45 78 70 72 2c 20 70  st(&rc, pExpr, p
328e0 4e 6f 64 65 29 29 20 26 26 20 72 63 3d 3d 53 51  Node)) && rc==SQ
328f0 4c 49 54 45 5f 4f 4b 29 3b 0d 0a 20 20 61 73 73  LITE_OK);..  ass
32900 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66  ert( pNode->bEof
32910 3d 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 4e  ==0 || pNode->bN
32920 6f 6d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a  omatch==0 );....
32930 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
32940 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 41 64 76 61 6e 63  .../*..** Advanc
32950 65 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  e the first term
32960 20 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65   iterator in the
32970 20 66 69 72 73 74 20 70 68 72 61 73 65 20 6f 66   first phrase of
32980 20 70 4e 65 61 72 2e 20 53 65 74 20 6f 75 74 70   pNear. Set outp
32990 75 74 0d 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ut..** variable 
329a0 2a 70 62 45 6f 66 20 74 6f 20 74 72 75 65 20 69  *pbEof to true i
329b0 66 20 69 74 20 72 65 61 63 68 65 73 20 45 4f 46  f it reaches EOF
329c0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
329d0 6f 63 63 75 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  occurs...**..** 
329e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
329f0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
32a00 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
32a10 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
32a20 72 6f 72 0d 0a 2a 2a 20 6f 63 63 75 72 73 2e 0d  ror..** occurs..
32a30 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
32a40 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
32a50 5f 53 54 52 49 4e 47 28 0d 0a 20 20 46 74 73 35  _STRING(..  Fts5
32a60 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
32a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
32a80 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73  xpression pPhras
32a90 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0d  e belongs to */.
32aa0 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
32ab0 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
32ac0 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 52 49 4e     /* FTS5_STRIN
32ad0 47 20 6f 72 20 46 54 53 35 5f 54 45 52 4d 20 6e  G or FTS5_TERM n
32ae0 6f 64 65 20 2a 2f 0d 0a 20 20 69 6e 74 20 62 46  ode */..  int bF
32af0 72 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20 69 36 34  romValid,..  i64
32b00 20 69 46 72 6f 6d 20 0d 0a 29 7b 0d 0a 20 20 46   iFrom ..){..  F
32b10 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
32b20 72 6d 20 3d 20 26 70 4e 6f 64 65 2d 3e 70 4e 65  rm = &pNode->pNe
32b30 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
32b40 3e 61 54 65 72 6d 5b 30 5d 3b 0d 0a 20 20 69 6e  >aTerm[0];..  in
32b50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32b60 3b 0d 0a 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e  ;....  pNode->bN
32b70 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 69  omatch = 0;..  i
32b80 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  f( pTerm->pSynon
32b90 79 6d 20 29 7b 0d 0a 20 20 20 20 69 6e 74 20 62  ym ){..    int b
32ba0 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 20 20 46 74  Eof = 1;..    Ft
32bb0 73 35 45 78 70 72 54 65 72 6d 20 2a 70 3b 0d 0a  s5ExprTerm *p;..
32bc0 0d 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
32bd0 65 20 66 69 72 73 74 65 73 74 20 72 6f 77 69 64  e firstest rowid
32be0 20 61 6e 79 20 73 79 6e 6f 6e 79 6d 20 70 6f 69   any synonym poi
32bf0 6e 74 73 20 74 6f 2e 20 2a 2f 0d 0a 20 20 20 20  nts to. */..    
32c00 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
32c10 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69  5ExprSynonymRowi
32c20 64 28 70 54 65 72 6d 2c 20 70 45 78 70 72 2d 3e  d(pTerm, pExpr->
32c30 62 44 65 73 63 2c 20 30 29 3b 0d 0a 0d 0a 20 20  bDesc, 0);....  
32c40 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63    /* Advance eac
32c50 68 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  h iterator that 
32c60 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
32c70 20 74 6f 20 69 52 6f 77 69 64 2e 20 4f 72 2c 20   to iRowid. Or, 
32c80 69 66 20 69 46 72 6f 6d 0d 0a 20 20 20 20 2a 2a  if iFrom..    **
32c90 20 69 73 20 76 61 6c 69 64 20 2d 20 65 61 63 68   is valid - each
32ca0 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 70   iterator that p
32cb0 6f 69 6e 74 73 20 74 6f 20 61 20 72 6f 77 69 64  oints to a rowid
32cc0 20 62 65 66 6f 72 65 20 69 46 72 6f 6d 2e 20 20   before iFrom.  
32cd0 2a 2f 0d 0a 20 20 20 20 66 6f 72 28 70 3d 70 54  */..    for(p=pT
32ce0 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
32cf0 6e 6f 6e 79 6d 29 7b 0d 0a 20 20 20 20 20 20 69  nonym){..      i
32d00 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  f( sqlite3Fts5It
32d10 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d  erEof(p->pIter)=
32d20 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 69  =0 ){..        i
32d30 36 34 20 69 69 20 3d 20 70 2d 3e 70 49 74 65 72  64 ii = p->pIter
32d40 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20 20 20 20  ->iRowid;..     
32d50 20 20 20 69 66 28 20 69 69 3d 3d 69 52 6f 77 69     if( ii==iRowi
32d60 64 20 0d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  d ..         || 
32d70 28 62 46 72 6f 6d 56 61 6c 69 64 20 26 26 20 69  (bFromValid && i
32d80 69 21 3d 69 46 72 6f 6d 20 26 26 20 28 69 69 3e  i!=iFrom && (ii>
32d90 69 46 72 6f 6d 29 3d 3d 70 45 78 70 72 2d 3e 62  iFrom)==pExpr->b
32da0 44 65 73 63 29 20 0d 0a 20 20 20 20 20 20 20 20  Desc) ..        
32db0 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ){..          if
32dc0 28 20 62 46 72 6f 6d 56 61 6c 69 64 20 29 7b 0d  ( bFromValid ){.
32dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32de0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
32df0 72 4e 65 78 74 46 72 6f 6d 28 70 2d 3e 70 49 74  rNextFrom(p->pIt
32e00 65 72 2c 20 69 46 72 6f 6d 29 3b 0d 0a 20 20 20  er, iFrom);..   
32e10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20         }else{.. 
32e20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32e30 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
32e40 65 78 74 28 70 2d 3e 70 49 74 65 72 29 3b 0d 0a  ext(p->pIter);..
32e50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
32e60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32e70 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
32e80 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
32e90 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
32ea0 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30  Eof(p->pIter)==0
32eb0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ){..           
32ec0 20 62 45 6f 66 20 3d 20 30 3b 0d 0a 20 20 20 20   bEof = 0;..    
32ed0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
32ee0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20   }else{..       
32ef0 20 20 20 62 45 6f 66 20 3d 20 30 3b 0d 0a 20 20     bEof = 0;..  
32f00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
32f10 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
32f20 2a 20 53 65 74 20 74 68 65 20 45 4f 46 20 66 6c  * Set the EOF fl
32f30 61 67 20 69 66 20 65 69 74 68 65 72 20 61 6c 6c  ag if either all
32f40 20 73 79 6e 6f 6e 79 6d 20 69 74 65 72 61 74 6f   synonym iterato
32f50 72 73 20 61 72 65 20 61 74 20 45 4f 46 20 6f 72  rs are at EOF or
32f60 20 61 6e 0d 0a 20 20 20 20 2a 2a 20 65 72 72 6f   an..    ** erro
32f70 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
32f80 20 2a 2f 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e   */..    pNode->
32f90 62 45 6f 66 20 3d 20 28 72 63 20 7c 7c 20 62 45  bEof = (rc || bE
32fa0 6f 66 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a  of);..  }else{..
32fb0 20 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65      Fts5IndexIte
32fc0 72 20 2a 70 49 74 65 72 20 3d 20 70 54 65 72 6d  r *pIter = pTerm
32fd0 2d 3e 70 49 74 65 72 3b 0d 0a 0d 0a 20 20 20 20  ->pIter;....    
32fe0 61 73 73 65 72 74 28 20 46 74 73 35 4e 6f 64 65  assert( Fts5Node
32ff0 49 73 53 74 72 69 6e 67 28 70 4e 6f 64 65 29 20  IsString(pNode) 
33000 29 3b 0d 0a 20 20 20 20 69 66 28 20 62 46 72 6f  );..    if( bFro
33010 6d 56 61 6c 69 64 20 29 7b 0d 0a 20 20 20 20 20  mValid ){..     
33020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
33030 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49  5IterNextFrom(pI
33040 74 65 72 2c 20 69 46 72 6f 6d 29 3b 0d 0a 20 20  ter, iFrom);..  
33050 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
33060 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
33070 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b  IterNext(pIter);
33080 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70  ..    }....    p
33090 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 28 72 63  Node->bEof = (rc
330a0 20 7c 7c 20 73 71 6c 69 74 65 33 46 74 73 35 49   || sqlite3Fts5I
330b0 74 65 72 45 6f 66 28 70 49 74 65 72 29 29 3b 0d  terEof(pIter));.
330c0 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 70 4e  .  }....  if( pN
330d0 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0d  ode->bEof==0 ){.
330e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
330f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20  =SQLITE_OK );.. 
33100 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
33110 4e 6f 64 65 54 65 73 74 5f 53 54 52 49 4e 47 28  NodeTest_STRING(
33120 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a  pExpr, pNode);..
33130 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20    }....  return 
33140 72 63 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 73 74 61 74  rc;..}......stat
33150 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e  ic int fts5ExprN
33160 6f 64 65 54 65 73 74 5f 54 45 52 4d 28 0d 0a 20  odeTest_TERM(.. 
33170 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
33180 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33190 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
331a0 68 61 74 20 70 4e 65 61 72 20 69 73 20 61 20 70  hat pNear is a p
331b0 61 72 74 20 6f 66 20 2a 2f 0d 0a 20 20 46 74 73  art of */..  Fts
331c0 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
331d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
331e0 54 68 65 20 22 4e 45 41 52 22 20 6e 6f 64 65 20  The "NEAR" node 
331f0 28 46 54 53 35 5f 54 45 52 4d 29 20 2a 2f 0d 0a  (FTS5_TERM) */..
33200 29 7b 0d 0a 20 20 2f 2a 20 41 73 20 74 68 69 73  ){..  /* As this
33210 20 22 4e 45 41 52 22 20 6f 62 6a 65 63 74 20 69   "NEAR" object i
33220 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 69 6e  s actually a sin
33230 67 6c 65 20 70 68 72 61 73 65 20 74 68 61 74 20  gle phrase that 
33240 63 6f 6e 73 69 73 74 73 20 0d 0a 20 20 2a 2a 20  consists ..  ** 
33250 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  of a single term
33260 20 6f 6e 6c 79 2c 20 67 72 61 62 20 70 6f 69 6e   only, grab poin
33270 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 70 6f  ters into the po
33280 73 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79  slist managed by
33290 20 74 68 65 0d 0a 20 20 2a 2a 20 66 74 73 35 5f   the..  ** fts5_
332a0 69 6e 64 65 78 2e 63 20 69 74 65 72 61 74 6f 72  index.c iterator
332b0 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 69 73   object. This is
332c0 20 6d 75 63 68 20 66 61 73 74 65 72 20 74 68 61   much faster tha
332d0 6e 20 73 79 6e 74 68 65 73 69 7a 69 6e 67 20 0d  n synthesizing .
332e0 0a 20 20 2a 2a 20 61 20 6e 65 77 20 70 6f 73 6c  .  ** a new posl
332f0 69 73 74 20 74 68 65 20 77 61 79 20 77 65 20 68  ist the way we h
33300 61 76 65 20 74 6f 20 66 6f 72 20 6d 6f 72 65 20  ave to for more 
33310 63 6f 6d 70 6c 69 63 61 74 65 64 20 70 68 72 61  complicated phra
33320 73 65 20 6f 72 20 4e 45 41 52 0d 0a 20 20 2a 2a  se or NEAR..  **
33330 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 2a   expressions.  *
33340 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 50 68 72  /..  Fts5ExprPhr
33350 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
33360 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e 61 70 50  Node->pNear->apP
33370 68 72 61 73 65 5b 30 5d 3b 0d 0a 20 20 46 74 73  hrase[0];..  Fts
33380 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
33390 72 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65  r = pPhrase->aTe
333a0 72 6d 5b 30 5d 2e 70 49 74 65 72 3b 0d 0a 0d 0a  rm[0].pIter;....
333b0 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
333c0 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
333d0 4d 20 29 3b 0d 0a 20 20 61 73 73 65 72 74 28 20  M );..  assert( 
333e0 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e 6e 50  pNode->pNear->nP
333f0 68 72 61 73 65 3d 3d 31 20 26 26 20 70 50 68 72  hrase==1 && pPhr
33400 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d 31 20 29 3b  ase->nTerm==1 );
33410 0d 0a 20 20 61 73 73 65 72 74 28 20 70 50 68 72  ..  assert( pPhr
33420 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53  ase->aTerm[0].pS
33430 79 6e 6f 6e 79 6d 3d 3d 30 20 29 3b 0d 0a 0d 0a  ynonym==0 );....
33440 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69    pPhrase->posli
33450 73 74 2e 6e 20 3d 20 70 49 74 65 72 2d 3e 6e 44  st.n = pIter->nD
33460 61 74 61 3b 0d 0a 20 20 69 66 28 20 70 45 78 70  ata;..  if( pExp
33470 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  r->pConfig->eDet
33480 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
33490 5f 46 55 4c 4c 20 29 7b 0d 0a 20 20 20 20 70 50  _FULL ){..    pP
334a0 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 70  hrase->poslist.p
334b0 20 3d 20 28 75 38 2a 29 70 49 74 65 72 2d 3e 70   = (u8*)pIter->p
334c0 44 61 74 61 3b 0d 0a 20 20 7d 0d 0a 20 20 70 4e  Data;..  }..  pN
334d0 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 49  ode->iRowid = pI
334e0 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20 20  ter->iRowid;..  
334f0 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20  pNode->bNomatch 
33500 3d 20 28 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  = (pPhrase->posl
33510 69 73 74 2e 6e 3d 3d 30 29 3b 0d 0a 20 20 72 65  ist.n==0);..  re
33520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d  turn SQLITE_OK;.
33530 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 78 4e 65  .}..../*..** xNe
33540 78 74 28 29 20 6d 65 74 68 6f 64 20 66 6f 72 20  xt() method for 
33550 61 20 6e 6f 64 65 20 6f 66 20 74 79 70 65 20 46  a node of type F
33560 54 53 35 5f 54 45 52 4d 2e 0d 0a 2a 2f 0d 0a 73  TS5_TERM...*/..s
33570 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
33580 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45 52 4d 28  prNodeNext_TERM(
33590 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  ..  Fts5Expr *pE
335a0 78 70 72 2c 20 0d 0a 20 20 46 74 73 35 45 78 70  xpr, ..  Fts5Exp
335b0 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0d 0a 20  rNode *pNode,.. 
335c0 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c   int bFromValid,
335d0 0d 0a 20 20 69 36 34 20 69 46 72 6f 6d 0d 0a 29  ..  i64 iFrom..)
335e0 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20  {..  int rc;..  
335f0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
33600 49 74 65 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e  Iter = pNode->pN
33610 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
33620 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72  ->aTerm[0].pIter
33630 3b 0d 0a 0d 0a 20 20 61 73 73 65 72 74 28 20 70  ;....  assert( p
33640 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b  Node->bEof==0 );
33650 0d 0a 20 20 69 66 28 20 62 46 72 6f 6d 56 61 6c  ..  if( bFromVal
33660 69 64 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20  id ){..    rc = 
33670 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
33680 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2c 20 69  extFrom(pIter, i
33690 46 72 6f 6d 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b  From);..  }else{
336a0 0d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
336b0 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70  e3Fts5IterNext(p
336c0 49 74 65 72 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69  Iter);..  }..  i
336d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
336e0 20 26 26 20 73 71 6c 69 74 65 33 46 74 73 35 49   && sqlite3Fts5I
336f0 74 65 72 45 6f 66 28 70 49 74 65 72 29 3d 3d 30  terEof(pIter)==0
33700 20 29 7b 0d 0a 20 20 20 20 72 63 20 3d 20 66 74   ){..    rc = ft
33710 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 54  s5ExprNodeTest_T
33720 45 52 4d 28 70 45 78 70 72 2c 20 70 4e 6f 64 65  ERM(pExpr, pNode
33730 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20  );..  }else{..  
33740 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
33750 31 3b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62  1;..    pNode->b
33760 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20  Nomatch = 0;..  
33770 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  }..  return rc;.
33780 0a 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 76 6f 69  .}....static voi
33790 64 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65  d fts5ExprNodeTe
337a0 73 74 5f 4f 52 28 0d 0a 20 20 46 74 73 35 45 78  st_OR(..  Fts5Ex
337b0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
337c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
337d0 72 65 73 73 69 6f 6e 20 6f 66 20 77 68 69 63 68  ression of which
337e0 20 70 4e 6f 64 65 20 69 73 20 61 20 70 61 72 74   pNode is a part
337f0 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e   */..  Fts5ExprN
33800 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20 20  ode *pNode      
33810 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
33820 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 74 65 73  sion node to tes
33830 74 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 46 74 73 35  t */..){..  Fts5
33840 45 78 70 72 4e 6f 64 65 20 2a 70 4e 65 78 74 20  ExprNode *pNext 
33850 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  = pNode->apChild
33860 5b 30 5d 3b 0d 0a 20 20 69 6e 74 20 69 3b 0d 0a  [0];..  int i;..
33870 0d 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  ..  for(i=1; i<p
33880 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b  Node->nChild; i+
33890 2b 29 7b 0d 0a 20 20 20 20 46 74 73 35 45 78 70  +){..    Fts5Exp
338a0 72 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d 20  rNode *pChild = 
338b0 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69  pNode->apChild[i
338c0 5d 3b 0d 0a 20 20 20 20 69 6e 74 20 63 6d 70 20  ];..    int cmp 
338d0 3d 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72  = fts5NodeCompar
338e0 65 28 70 45 78 70 72 2c 20 70 4e 65 78 74 2c 20  e(pExpr, pNext, 
338f0 70 43 68 69 6c 64 29 3b 0d 0a 20 20 20 20 69 66  pChild);..    if
33900 28 20 63 6d 70 3e 30 20 7c 7c 20 28 63 6d 70 3d  ( cmp>0 || (cmp=
33910 3d 30 20 26 26 20 70 43 68 69 6c 64 2d 3e 62 4e  =0 && pChild->bN
33920 6f 6d 61 74 63 68 3d 3d 30 29 20 29 7b 0d 0a 20  omatch==0) ){.. 
33930 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 43 68       pNext = pCh
33940 69 6c 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  ild;..    }..  }
33950 0d 0a 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69  ..  pNode->iRowi
33960 64 20 3d 20 70 4e 65 78 74 2d 3e 69 52 6f 77 69  d = pNext->iRowi
33970 64 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f  d;..  pNode->bEo
33980 66 20 3d 20 70 4e 65 78 74 2d 3e 62 45 6f 66 3b  f = pNext->bEof;
33990 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61  ..  pNode->bNoma
339a0 74 63 68 20 3d 20 70 4e 65 78 74 2d 3e 62 4e 6f  tch = pNext->bNo
339b0 6d 61 74 63 68 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61  match;..}....sta
339c0 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
339d0 4e 6f 64 65 4e 65 78 74 5f 4f 52 28 0d 0a 20 20  NodeNext_OR(..  
339e0 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts5Expr *pExpr,
339f0 20 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64   ..  Fts5ExprNod
33a00 65 20 2a 70 4e 6f 64 65 2c 0d 0a 20 20 69 6e 74  e *pNode,..  int
33a10 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20   bFromValid,..  
33a20 69 36 34 20 69 46 72 6f 6d 0d 0a 29 7b 0d 0a 20  i64 iFrom..){.. 
33a30 20 69 6e 74 20 69 3b 0d 0a 20 20 69 36 34 20 69   int i;..  i64 i
33a40 4c 61 73 74 20 3d 20 70 4e 6f 64 65 2d 3e 69 52  Last = pNode->iR
33a50 6f 77 69 64 3b 0d 0a 0d 0a 20 20 66 6f 72 28 69  owid;....  for(i
33a60 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68  =0; i<pNode->nCh
33a70 69 6c 64 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20  ild; i++){..    
33a80 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 31  Fts5ExprNode *p1
33a90 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c   = pNode->apChil
33aa0 64 5b 69 5d 3b 0d 0a 20 20 20 20 61 73 73 65 72  d[i];..    asser
33ab0 74 28 20 70 31 2d 3e 62 45 6f 66 20 7c 7c 20 66  t( p1->bEof || f
33ac0 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70  ts5RowidCmp(pExp
33ad0 72 2c 20 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69  r, p1->iRowid, i
33ae0 4c 61 73 74 29 3e 3d 30 20 29 3b 0d 0a 20 20 20  Last)>=0 );..   
33af0 20 69 66 28 20 70 31 2d 3e 62 45 6f 66 3d 3d 30   if( p1->bEof==0
33b00 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28 20 28   ){..      if( (
33b10 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73  p1->iRowid==iLas
33b20 74 29 20 0d 0a 20 20 20 20 20 20 20 7c 7c 20 28  t) ..       || (
33b30 62 46 72 6f 6d 56 61 6c 69 64 20 26 26 20 66 74  bFromValid && ft
33b40 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72  s5RowidCmp(pExpr
33b50 2c 20 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69 46  , p1->iRowid, iF
33b60 72 6f 6d 29 3c 30 29 0d 0a 20 20 20 20 20 20 29  rom)<0)..      )
33b70 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  {..        int r
33b80 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
33b90 4e 65 78 74 28 70 45 78 70 72 2c 20 70 31 2c 20  Next(pExpr, p1, 
33ba0 62 46 72 6f 6d 56 61 6c 69 64 2c 20 69 46 72 6f  bFromValid, iFro
33bb0 6d 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 28  m);..        if(
33bc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33bd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f  {..          pNo
33be0 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30  de->bNomatch = 0
33bf0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ;..          ret
33c00 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 20 20 20  urn rc;..       
33c10 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
33c20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 66 74 73   }..  }....  fts
33c30 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f 52  5ExprNodeTest_OR
33c40 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d  (pExpr, pNode);.
33c50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33c60 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a  _OK;..}..../*..*
33c70 2a 20 41 72 67 75 6d 65 6e 74 20 70 4e 6f 64 65  * Argument pNode
33c80 20 69 73 20 61 6e 20 46 54 53 35 5f 41 4e 44 20   is an FTS5_AND 
33c90 6e 6f 64 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  node...*/..stati
33ca0 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f  c int fts5ExprNo
33cb0 64 65 54 65 73 74 5f 41 4e 44 28 0d 0a 20 20 46  deTest_AND(..  F
33cc0 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ts5Expr *pExpr, 
33cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33ce0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68  * Expression pPh
33cf0 72 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rase belongs to 
33d00 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  */..  Fts5ExprNo
33d10 64 65 20 2a 70 41 6e 64 20 20 20 20 20 20 20 20  de *pAnd        
33d20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 41 4e        /* FTS5_AN
33d30 44 20 6e 6f 64 65 20 74 6f 20 61 64 76 61 6e 63  D node to advanc
33d40 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  e */..){..  int 
33d50 69 43 68 69 6c 64 3b 0d 0a 20 20 69 36 34 20 69  iChild;..  i64 i
33d60 4c 61 73 74 20 3d 20 70 41 6e 64 2d 3e 69 52 6f  Last = pAnd->iRo
33d70 77 69 64 3b 0d 0a 20 20 69 6e 74 20 72 63 20 3d  wid;..  int rc =
33d80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 69   SQLITE_OK;..  i
33d90 6e 74 20 62 4d 61 74 63 68 3b 0d 0a 0d 0a 20 20  nt bMatch;....  
33da0 61 73 73 65 72 74 28 20 70 41 6e 64 2d 3e 62 45  assert( pAnd->bE
33db0 6f 66 3d 3d 30 20 29 3b 0d 0a 20 20 64 6f 20 7b  of==0 );..  do {
33dc0 0d 0a 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d  ..    pAnd->bNom
33dd0 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20 62  atch = 0;..    b
33de0 4d 61 74 63 68 20 3d 20 31 3b 0d 0a 20 20 20 20  Match = 1;..    
33df0 66 6f 72 28 69 43 68 69 6c 64 3d 30 3b 20 69 43  for(iChild=0; iC
33e00 68 69 6c 64 3c 70 41 6e 64 2d 3e 6e 43 68 69 6c  hild<pAnd->nChil
33e10 64 3b 20 69 43 68 69 6c 64 2b 2b 29 7b 0d 0a 20  d; iChild++){.. 
33e20 20 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64       Fts5ExprNod
33e30 65 20 2a 70 43 68 69 6c 64 20 3d 20 70 41 6e 64  e *pChild = pAnd
33e40 2d 3e 61 70 43 68 69 6c 64 5b 69 43 68 69 6c 64  ->apChild[iChild
33e50 5d 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20 63 6d  ];..      int cm
33e60 70 20 3d 20 66 74 73 35 52 6f 77 69 64 43 6d 70  p = fts5RowidCmp
33e70 28 70 45 78 70 72 2c 20 69 4c 61 73 74 2c 20 70  (pExpr, iLast, p
33e80 43 68 69 6c 64 2d 3e 69 52 6f 77 69 64 29 3b 0d  Child->iRowid);.
33e90 0a 20 20 20 20 20 20 69 66 28 20 63 6d 70 3e 30  .      if( cmp>0
33ea0 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2a 20   ){..        /* 
33eb0 41 64 76 61 6e 63 65 20 70 43 68 69 6c 64 20 75  Advance pChild u
33ec0 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
33ed0 6f 20 69 4c 61 73 74 20 6f 72 20 6c 61 73 74 65  o iLast or laste
33ee0 72 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 72 63  r */..        rc
33ef0 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e   = fts5ExprNodeN
33f00 65 78 74 28 70 45 78 70 72 2c 20 70 43 68 69 6c  ext(pExpr, pChil
33f10 64 2c 20 31 2c 20 69 4c 61 73 74 29 3b 0d 0a 20  d, 1, iLast);.. 
33f20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33f30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
33f40 20 20 20 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f         pAnd->bNo
33f50 6d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20 20 20  match = 0;..    
33f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
33f70 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
33f80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a     }....      /*
33f90 20 49 66 20 74 68 65 20 63 68 69 6c 64 20 6e 6f   If the child no
33fa0 64 65 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46  de is now at EOF
33fb0 2c 20 73 6f 20 69 73 20 74 68 65 20 70 61 72 65  , so is the pare
33fc0 6e 74 20 41 4e 44 20 6e 6f 64 65 2e 20 4f 74 68  nt AND node. Oth
33fd0 65 72 77 69 73 65 2c 0d 0a 20 20 20 20 20 20 2a  erwise,..      *
33fe0 2a 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65  * the child node
33ff0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
34000 6f 20 68 61 76 65 20 61 64 76 61 6e 63 65 64 20  o have advanced 
34010 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20  at least as far 
34020 61 73 0d 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77  as..      ** row
34030 69 64 20 69 4c 61 73 74 2e 20 53 6f 20 69 66 20  id iLast. So if 
34040 69 74 20 69 73 20 6e 6f 74 20 61 74 20 65 78 61  it is not at exa
34050 63 74 6c 79 20 69 4c 61 73 74 2c 20 70 43 68 69  ctly iLast, pChi
34060 6c 64 2d 3e 69 52 6f 77 69 64 20 69 73 20 74 68  ld->iRowid is th
34070 65 0d 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 20  e..      ** new 
34080 6c 61 73 74 65 73 74 20 72 6f 77 69 64 20 73 65  lastest rowid se
34090 65 6e 20 73 6f 20 66 61 72 2e 20 20 2a 2f 0d 0a  en so far.  */..
340a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
340b0 68 69 6c 64 2d 3e 62 45 6f 66 20 7c 7c 20 66 74  hild->bEof || ft
340c0 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72  s5RowidCmp(pExpr
340d0 2c 20 69 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d  , iLast, pChild-
340e0 3e 69 52 6f 77 69 64 29 3c 3d 30 20 29 3b 0d 0a  >iRowid)<=0 );..
340f0 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64        if( pChild
34100 2d 3e 62 45 6f 66 20 29 7b 0d 0a 20 20 20 20 20  ->bEof ){..     
34110 20 20 20 66 74 73 35 45 78 70 72 53 65 74 45 6f     fts5ExprSetEo
34120 66 28 70 41 6e 64 29 3b 0d 0a 20 20 20 20 20 20  f(pAnd);..      
34130 20 20 62 4d 61 74 63 68 20 3d 20 31 3b 0d 0a 20    bMatch = 1;.. 
34140 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
34150 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
34160 4c 61 73 74 21 3d 70 43 68 69 6c 64 2d 3e 69 52  Last!=pChild->iR
34170 6f 77 69 64 20 29 7b 0d 0a 20 20 20 20 20 20 20  owid ){..       
34180 20 62 4d 61 74 63 68 20 3d 20 30 3b 0d 0a 20 20   bMatch = 0;..  
34190 20 20 20 20 20 20 69 4c 61 73 74 20 3d 20 70 43        iLast = pC
341a0 68 69 6c 64 2d 3e 69 52 6f 77 69 64 3b 0d 0a 20  hild->iRowid;.. 
341b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
341c0 69 66 28 20 70 43 68 69 6c 64 2d 3e 62 4e 6f 6d  if( pChild->bNom
341d0 61 74 63 68 20 29 7b 0d 0a 20 20 20 20 20 20 20  atch ){..       
341e0 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63 68 20   pAnd->bNomatch 
341f0 3d 20 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  = 1;..      }.. 
34200 20 20 20 7d 0d 0a 20 20 7d 77 68 69 6c 65 28 20     }..  }while( 
34210 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0d 0a 0d 0a  bMatch==0 );....
34220 20 20 69 66 28 20 70 41 6e 64 2d 3e 62 4e 6f 6d    if( pAnd->bNom
34230 61 74 63 68 20 26 26 20 70 41 6e 64 21 3d 70 45  atch && pAnd!=pE
34240 78 70 72 2d 3e 70 52 6f 6f 74 20 29 7b 0d 0a 20  xpr->pRoot ){.. 
34250 20 20 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a     fts5ExprNodeZ
34260 65 72 6f 50 6f 73 6c 69 73 74 28 70 41 6e 64 29  eroPoslist(pAnd)
34270 3b 0d 0a 20 20 7d 0d 0a 20 20 70 41 6e 64 2d 3e  ;..  }..  pAnd->
34280 69 52 6f 77 69 64 20 3d 20 69 4c 61 73 74 3b 0d  iRowid = iLast;.
34290 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
342a0 5f 4f 4b 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69  _OK;..}....stati
342b0 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f  c int fts5ExprNo
342c0 64 65 4e 65 78 74 5f 41 4e 44 28 0d 0a 20 20 46  deNext_AND(..  F
342d0 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ts5Expr *pExpr, 
342e0 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ..  Fts5ExprNode
342f0 20 2a 70 4e 6f 64 65 2c 0d 0a 20 20 69 6e 74 20   *pNode,..  int 
34300 62 46 72 6f 6d 56 61 6c 69 64 2c 0d 0a 20 20 69  bFromValid,..  i
34310 36 34 20 69 46 72 6f 6d 0d 0a 29 7b 0d 0a 20 20  64 iFrom..){..  
34320 69 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78 70  int rc = fts5Exp
34330 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c  rNodeNext(pExpr,
34340 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
34350 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20  0], bFromValid, 
34360 69 46 72 6f 6d 29 3b 0d 0a 20 20 69 66 28 20 72  iFrom);..  if( r
34370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
34380 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78  .    rc = fts5Ex
34390 70 72 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28 70  prNodeTest_AND(p
343a0 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20  Expr, pNode);.. 
343b0 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 70 4e 6f   }else{..    pNo
343c0 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30  de->bNomatch = 0
343d0 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e  ;..  }..  return
343e0 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a 73 74 61 74 69   rc;..}....stati
343f0 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f  c int fts5ExprNo
34400 64 65 54 65 73 74 5f 4e 4f 54 28 0d 0a 20 20 46  deTest_NOT(..  F
34410 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ts5Expr *pExpr, 
34420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34430 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68  * Expression pPh
34440 72 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rase belongs to 
34450 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  */..  Fts5ExprNo
34460 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20 20 20  de *pNode       
34470 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4e 4f        /* FTS5_NO
34480 54 20 6e 6f 64 65 20 74 6f 20 61 64 76 61 6e 63  T node to advanc
34490 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20  e */..){..  int 
344a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d  rc = SQLITE_OK;.
344b0 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
344c0 2a 70 31 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43  *p1 = pNode->apC
344d0 68 69 6c 64 5b 30 5d 3b 0d 0a 20 20 46 74 73 35  hild[0];..  Fts5
344e0 45 78 70 72 4e 6f 64 65 20 2a 70 32 20 3d 20 70  ExprNode *p2 = p
344f0 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 31 5d  Node->apChild[1]
34500 3b 0d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f  ;..  assert( pNo
34510 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 32 20 29 3b  de->nChild==2 );
34520 0d 0a 0d 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  ....  while( rc=
34530 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31  =SQLITE_OK && p1
34540 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0d 0a 20 20  ->bEof==0 ){..  
34550 20 20 69 6e 74 20 63 6d 70 20 3d 20 66 74 73 35    int cmp = fts5
34560 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45 78 70  NodeCompare(pExp
34570 72 2c 20 70 31 2c 20 70 32 29 3b 0d 0a 20 20 20  r, p1, p2);..   
34580 20 69 66 28 20 63 6d 70 3e 30 20 29 7b 0d 0a 20   if( cmp>0 ){.. 
34590 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78       rc = fts5Ex
345a0 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72  prNodeNext(pExpr
345b0 2c 20 70 32 2c 20 31 2c 20 70 31 2d 3e 69 52 6f  , p2, 1, p1->iRo
345c0 77 69 64 29 3b 0d 0a 20 20 20 20 20 20 63 6d 70  wid);..      cmp
345d0 20 3d 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61   = fts5NodeCompa
345e0 72 65 28 70 45 78 70 72 2c 20 70 31 2c 20 70 32  re(pExpr, p1, p2
345f0 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 61  );..    }..    a
34600 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
34610 45 5f 4f 4b 20 7c 7c 20 63 6d 70 3c 3d 30 20 29  E_OK || cmp<=0 )
34620 3b 0d 0a 20 20 20 20 69 66 28 20 63 6d 70 20 7c  ;..    if( cmp |
34630 7c 20 70 32 2d 3e 62 4e 6f 6d 61 74 63 68 20 29  | p2->bNomatch )
34640 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 72 63 20   break;..    rc 
34650 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  = fts5ExprNodeNe
34660 78 74 28 70 45 78 70 72 2c 20 70 31 2c 20 30 2c  xt(pExpr, p1, 0,
34670 20 30 29 3b 0d 0a 20 20 7d 0d 0a 20 20 70 4e 6f   0);..  }..  pNo
34680 64 65 2d 3e 62 45 6f 66 20 3d 20 70 31 2d 3e 62  de->bEof = p1->b
34690 45 6f 66 3b 0d 0a 20 20 70 4e 6f 64 65 2d 3e 62  Eof;..  pNode->b
346a0 4e 6f 6d 61 74 63 68 20 3d 20 70 31 2d 3e 62 4e  Nomatch = p1->bN
346b0 6f 6d 61 74 63 68 3b 0d 0a 20 20 70 4e 6f 64 65  omatch;..  pNode
346c0 2d 3e 69 52 6f 77 69 64 20 3d 20 70 31 2d 3e 69  ->iRowid = p1->i
346d0 52 6f 77 69 64 3b 0d 0a 20 20 69 66 28 20 70 31  Rowid;..  if( p1
346e0 2d 3e 62 45 6f 66 20 29 7b 0d 0a 20 20 20 20 66  ->bEof ){..    f
346f0 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
34700 6f 73 6c 69 73 74 28 70 32 29 3b 0d 0a 20 20 7d  oslist(p2);..  }
34710 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
34720 7d 0d 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20  }....static int 
34730 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
34740 5f 4e 4f 54 28 0d 0a 20 20 46 74 73 35 45 78 70  _NOT(..  Fts5Exp
34750 72 20 2a 70 45 78 70 72 2c 20 0d 0a 20 20 46 74  r *pExpr, ..  Ft
34760 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
34770 65 2c 0d 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56  e,..  int bFromV
34780 61 6c 69 64 2c 0d 0a 20 20 69 36 34 20 69 46 72  alid,..  i64 iFr
34790 6f 6d 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63  om..){..  int rc
347a0 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e   = fts5ExprNodeN
347b0 65 78 74 28 70 45 78 70 72 2c 20 70 4e 6f 64 65  ext(pExpr, pNode
347c0 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2c 20 62 46  ->apChild[0], bF
347d0 72 6f 6d 56 61 6c 69 64 2c 20 69 46 72 6f 6d 29  romValid, iFrom)
347e0 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
347f0 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72  ITE_OK ){..    r
34800 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
34810 54 65 73 74 5f 4e 4f 54 28 70 45 78 70 72 2c 20  Test_NOT(pExpr, 
34820 70 4e 6f 64 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20  pNode);..  }..  
34830 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34840 4b 20 29 7b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d  K ){..    pNode-
34850 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0d 0a  >bNomatch = 0;..
34860 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
34870 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 49  ;..}..../*..** I
34880 66 20 70 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  f pNode currentl
34890 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6d 61  y points to a ma
348a0 74 63 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69  tch, this functi
348b0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
348c0 45 5f 4f 4b 0d 0a 2a 2a 20 77 69 74 68 6f 75 74  E_OK..** without
348d0 20 6d 6f 64 69 66 79 69 6e 67 20 69 74 2e 20 4f   modifying it. O
348e0 74 68 65 72 77 69 73 65 2c 20 70 4e 6f 64 65 20  therwise, pNode 
348f0 69 73 20 61 64 76 61 6e 63 65 64 20 75 6e 74 69  is advanced unti
34900 6c 20 69 74 20 64 6f 65 73 20 70 6f 69 6e 74 0d  l it does point.
34910 0a 2a 2a 20 74 6f 20 61 20 6d 61 74 63 68 20 6f  .** to a match o
34920 72 20 45 4f 46 20 69 73 20 72 65 61 63 68 65 64  r EOF is reached
34930 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e  ...*/..static in
34940 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65  t fts5ExprNodeTe
34950 73 74 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20  st(..  Fts5Expr 
34960 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
34970 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
34980 73 69 6f 6e 20 6f 66 20 77 68 69 63 68 20 70 4e  sion of which pN
34990 6f 64 65 20 69 73 20 61 20 70 61 72 74 20 2a 2f  ode is a part */
349a0 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ..  Fts5ExprNode
349b0 20 2a 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20   *pNode         
349c0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
349d0 6e 20 6e 6f 64 65 20 74 6f 20 74 65 73 74 20 2a  n node to test *
349e0 2f 0d 0a 29 7b 0d 0a 20 20 69 6e 74 20 72 63 20  /..){..  int rc 
349f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20  = SQLITE_OK;..  
34a00 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d  if( pNode->bEof=
34a10 3d 30 20 29 7b 0d 0a 20 20 20 20 73 77 69 74 63  =0 ){..    switc
34a20 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20  h( pNode->eType 
34a30 29 7b 0d 0a 0d 0a 20 20 20 20 20 20 63 61 73 65  ){....      case
34a40 20 46 54 53 35 5f 53 54 52 49 4e 47 3a 20 7b 0d   FTS5_STRING: {.
34a50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
34a60 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 53  s5ExprNodeTest_S
34a70 54 52 49 4e 47 28 70 45 78 70 72 2c 20 70 4e 6f  TRING(pExpr, pNo
34a80 64 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 62 72  de);..        br
34a90 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  eak;..      }...
34aa0 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53 35  .      case FTS5
34ab0 5f 54 45 52 4d 3a 20 7b 0d 0a 20 20 20 20 20 20  _TERM: {..      
34ac0 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
34ad0 6f 64 65 54 65 73 74 5f 54 45 52 4d 28 70 45 78  odeTest_TERM(pEx
34ae0 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 20  pr, pNode);..   
34af0 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
34b00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 63 61     }....      ca
34b10 73 65 20 46 54 53 35 5f 41 4e 44 3a 20 7b 0d 0a  se FTS5_AND: {..
34b20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
34b30 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 41 4e  5ExprNodeTest_AN
34b40 44 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b  D(pExpr, pNode);
34b50 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
34b60 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
34b70 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a     case FTS5_OR:
34b80 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 74 73 35   {..        fts5
34b90 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f 52 28  ExprNodeTest_OR(
34ba0 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d 0a  pExpr, pNode);..
34bb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
34bc0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
34bd0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
34be0 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d  ( pNode->eType==
34bf0 46 54 53 35 5f 4e 4f 54 20 29 3b 20 7b 0d 0a 20  FTS5_NOT ); {.. 
34c00 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
34c10 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4e 4f 54  ExprNodeTest_NOT
34c20 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0d  (pExpr, pNode);.
34c30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  .        break;.
34c40 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
34c50 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
34c60 63 3b 0d 0a 7d 0d 0a 0d 0a 20 0d 0a 2f 2a 0d 0a  c;..}.... ../*..
34c70 2a 2a 20 53 65 74 20 6e 6f 64 65 20 70 4e 6f 64  ** Set node pNod
34c80 65 2c 20 77 68 69 63 68 20 69 73 20 70 61 72 74  e, which is part
34c90 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
34ca0 45 78 70 72 2c 20 74 6f 20 70 6f 69 6e 74 20 74  Expr, to point t
34cb0 6f 20 74 68 65 20 66 69 72 73 74 0d 0a 2a 2a 20  o the first..** 
34cc0 6d 61 74 63 68 2e 20 49 66 20 74 68 65 72 65 20  match. If there 
34cd0 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20  are no matches, 
34ce0 73 65 74 20 74 68 65 20 4e 6f 64 65 2e 62 45 6f  set the Node.bEo
34cf0 66 20 66 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  f flag to indica
34d00 74 65 20 45 4f 46 2e 0d 0a 2a 2a 0d 0a 2a 2a 20  te EOF...**..** 
34d10 52 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  Return an SQLite
34d20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
34d30 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
34d40 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 74 68  or SQLITE_OK oth
34d50 65 72 77 69 73 65 2e 0d 0a 2a 2a 20 49 74 20 69  erwise...** It i
34d60 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  s not an error i
34d70 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
34d80 61 74 63 68 65 73 2e 0d 0a 2a 2f 0d 0a 73 74 61  atches...*/..sta
34d90 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
34da0 4e 6f 64 65 46 69 72 73 74 28 46 74 73 35 45 78  NodeFirst(Fts5Ex
34db0 70 72 20 2a 70 45 78 70 72 2c 20 46 74 73 35 45  pr *pExpr, Fts5E
34dc0 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b  xprNode *pNode){
34dd0 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
34de0 49 54 45 5f 4f 4b 3b 0d 0a 20 20 70 4e 6f 64 65  ITE_OK;..  pNode
34df0 2d 3e 62 45 6f 66 20 3d 20 30 3b 0d 0a 20 20 70  ->bEof = 0;..  p
34e00 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d  Node->bNomatch =
34e10 20 30 3b 0d 0a 0d 0a 20 20 69 66 28 20 46 74 73   0;....  if( Fts
34e20 35 4e 6f 64 65 49 73 53 74 72 69 6e 67 28 70 4e  5NodeIsString(pN
34e30 6f 64 65 29 20 29 7b 0d 0a 20 20 20 20 2f 2a 20  ode) ){..    /* 
34e40 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 74  Initialize all t
34e50 65 72 6d 20 69 74 65 72 61 74 6f 72 73 20 69 6e  erm iterators in
34e60 20 74 68 65 20 4e 45 41 52 20 6f 62 6a 65 63 74   the NEAR object
34e70 2e 20 2a 2f 0d 0a 20 20 20 20 72 63 20 3d 20 66  . */..    rc = f
34e80 74 73 35 45 78 70 72 4e 65 61 72 49 6e 69 74 41  ts5ExprNearInitA
34e90 6c 6c 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29  ll(pExpr, pNode)
34ea0 3b 0d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ;..  }else if( p
34eb0 4e 6f 64 65 2d 3e 78 4e 65 78 74 3d 3d 30 20 29  Node->xNext==0 )
34ec0 7b 0d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45  {..    pNode->bE
34ed0 6f 66 20 3d 20 31 3b 0d 0a 20 20 7d 65 6c 73 65  of = 1;..  }else
34ee0 7b 0d 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20  {..    int i;.. 
34ef0 20 20 20 69 6e 74 20 6e 45 6f 66 20 3d 20 30 3b     int nEof = 0;
34f00 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
34f10 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 20 26  <pNode->nChild &
34f20 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
34f30 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 46 74   i++){..      Ft
34f40 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 43 68 69  s5ExprNode *pChi
34f50 6c 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68  ld = pNode->apCh
34f60 69 6c 64 5b 69 5d 3b 0d 0a 20 20 20 20 20 20 72  ild[i];..      r
34f70 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
34f80 46 69 72 73 74 28 70 45 78 70 72 2c 20 70 4e 6f  First(pExpr, pNo
34f90 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b  de->apChild[i]);
34fa0 0d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
34fb0 70 43 68 69 6c 64 2d 3e 62 45 6f 66 3d 3d 30 20  pChild->bEof==0 
34fc0 7c 7c 20 70 43 68 69 6c 64 2d 3e 62 45 6f 66 3d  || pChild->bEof=
34fd0 3d 31 20 29 3b 0d 0a 20 20 20 20 20 20 6e 45 6f  =1 );..      nEo
34fe0 66 20 2b 3d 20 70 43 68 69 6c 64 2d 3e 62 45 6f  f += pChild->bEo
34ff0 66 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70  f;..    }..    p
35000 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70  Node->iRowid = p
35010 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d  Node->apChild[0]
35020 2d 3e 69 52 6f 77 69 64 3b 0d 0a 0d 0a 20 20 20  ->iRowid;....   
35030 20 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e   switch( pNode->
35040 65 54 79 70 65 20 29 7b 0d 0a 20 20 20 20 20 20  eType ){..      
35050 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a 0d 0a  case FTS5_AND:..
35060 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 6f 66          if( nEof
35070 3e 30 20 29 20 66 74 73 35 45 78 70 72 53 65 74  >0 ) fts5ExprSet
35080 45 6f 66 28 70 4e 6f 64 65 29 3b 0d 0a 20 20 20  Eof(pNode);..   
35090 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20       break;.... 
350a0 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f       case FTS5_O
350b0 52 3a 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20  R:..        if( 
350c0 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 6e  pNode->nChild==n
350d0 45 6f 66 20 29 20 66 74 73 35 45 78 70 72 53 65  Eof ) fts5ExprSe
350e0 74 45 6f 66 28 70 4e 6f 64 65 29 3b 0d 0a 20 20  tEof(pNode);..  
350f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a        break;....
35100 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a        default:..
35110 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35120 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
35130 53 35 5f 4e 4f 54 20 29 3b 0d 0a 20 20 20 20 20  S5_NOT );..     
35140 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d     pNode->bEof =
35150 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
35160 30 5d 2d 3e 62 45 6f 66 3b 0d 0a 20 20 20 20 20  0]->bEof;..     
35170 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d     break;..    }
35180 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28 20 72  ..  }....  if( r
35190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
351a0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78  .    rc = fts5Ex
351b0 70 72 4e 6f 64 65 54 65 73 74 28 70 45 78 70 72  prNodeTest(pExpr
351c0 2c 20 70 4e 6f 64 65 29 3b 0d 0a 20 20 7d 0d 0a  , pNode);..  }..
351d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
351e0 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 42 65 67 69  ...../*..** Begi
351f0 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  n iterating thro
35200 75 67 68 20 74 68 65 20 73 65 74 20 6f 66 20 64  ugh the set of d
35210 6f 63 75 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65  ocuments in inde
35220 78 20 70 49 64 78 20 6d 61 74 63 68 65 64 20 62  x pIdx matched b
35230 79 0d 0a 2a 2a 20 74 68 65 20 4d 41 54 43 48 20  y..** the MATCH 
35240 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
35250 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
35260 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  rgument. If the 
35270 22 62 44 65 73 63 22 20 0d 0a 2a 2a 20 70 61 72  "bDesc" ..** par
35280 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
35290 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
352a0 65 2c 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20  e, iteration is 
352b0 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  in descending ro
352c0 77 69 64 20 0d 0a 2a 2a 20 6f 72 64 65 72 2e 20  wid ..** order. 
352d0 4f 72 2c 20 69 66 20 69 74 20 69 73 20 7a 65 72  Or, if it is zer
352e0 6f 2c 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  o, in ascending 
352f0 6f 72 64 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49  order...**..** I
35300 66 20 69 74 65 72 61 74 69 6e 67 20 69 6e 20 61  f iterating in a
35310 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f  scending rowid o
35320 72 64 65 72 20 28 62 44 65 73 63 3d 3d 30 29 2c  rder (bDesc==0),
35330 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 75 6d   the first docum
35340 65 6e 74 0d 0a 2a 2a 20 76 69 73 69 74 65 64 20  ent..** visited 
35350 69 73 20 74 68 61 74 20 77 69 74 68 20 74 68 65  is that with the
35360 20 73 6d 61 6c 6c 65 73 74 20 72 6f 77 69 64 20   smallest rowid 
35370 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
35380 68 61 6e 20 6f 72 20 65 71 75 61 6c 0d 0a 2a 2a  han or equal..**
35390 20 74 6f 20 70 61 72 61 6d 65 74 65 72 20 69 46   to parameter iF
353a0 69 72 73 74 2e 20 4f 72 2c 20 69 66 20 69 74 65  irst. Or, if ite
353b0 72 61 74 69 6e 67 20 69 6e 20 61 73 63 65 6e 64  rating in ascend
353c0 69 6e 67 20 6f 72 64 65 72 20 28 62 44 65 73 63  ing order (bDesc
353d0 3d 3d 31 29 2c 0d 0a 2a 2a 20 74 68 65 6e 20 74  ==1),..** then t
353e0 68 65 20 66 69 72 73 74 20 64 6f 63 75 6d 65 6e  he first documen
353f0 74 20 76 69 73 69 74 65 64 20 6d 75 73 74 20 68  t visited must h
35400 61 76 65 20 61 20 72 6f 77 69 64 20 73 6d 61 6c  ave a rowid smal
35410 6c 65 72 20 74 68 61 6e 20 6f 72 0d 0a 2a 2a 20  ler than or..** 
35420 65 71 75 61 6c 20 74 6f 20 69 46 69 72 73 74 2e  equal to iFirst.
35430 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e 20  ..**..** Return 
35440 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
35450 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
35460 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
35470 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 0d 0a   otherwise. It..
35480 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
35490 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
354a0 20 74 68 65 20 71 75 65 72 79 20 64 6f 65 73 20   the query does 
354b0 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 64 6f  not match any do
354c0 63 75 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73 74  cuments...*/..st
354d0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
354e0 46 74 73 35 45 78 70 72 46 69 72 73 74 28 46 74  Fts5ExprFirst(Ft
354f0 73 35 45 78 70 72 20 2a 70 2c 20 46 74 73 35 49  s5Expr *p, Fts5I
35500 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 36 34 20  ndex *pIdx, i64 
35510 69 46 69 72 73 74 2c 20 69 6e 74 20 62 44 65 73  iFirst, int bDes
35520 63 29 7b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e  c){..  Fts5ExprN
35530 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e  ode *pRoot = p->
35540 70 52 6f 6f 74 3b 0d 0a 20 20 69 6e 74 20 72 63  pRoot;..  int rc
35550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
35570 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 0d 0a 20  urn code */.... 
35580 20 70 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64   p->pIndex = pId
35590 78 3b 0d 0a 20 20 70 2d 3e 62 44 65 73 63 20 3d  x;..  p->bDesc =
355a0 20 62 44 65 73 63 3b 0d 0a 20 20 72 63 20 3d 20   bDesc;..  rc = 
355b0 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72 73  fts5ExprNodeFirs
355c0 74 28 70 2c 20 70 52 6f 6f 74 29 3b 0d 0a 0d 0a  t(p, pRoot);....
355d0 20 20 2f 2a 20 49 66 20 6e 6f 74 20 61 74 20 45    /* If not at E
355e0 4f 46 20 62 75 74 20 74 68 65 20 63 75 72 72 65  OF but the curre
355f0 6e 74 20 72 6f 77 69 64 20 6f 63 63 75 72 73 20  nt rowid occurs 
35600 65 61 72 6c 69 65 72 20 74 68 61 6e 20 69 46 69  earlier than iFi
35610 72 73 74 20 69 6e 0d 0a 20 20 2a 2a 20 74 68 65  rst in..  ** the
35620 20 69 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72   iteration order
35630 2c 20 6d 6f 76 65 20 74 6f 20 64 6f 63 75 6d 65  , move to docume
35640 6e 74 20 69 46 69 72 73 74 20 6f 72 20 6c 61 74  nt iFirst or lat
35650 65 72 2e 20 2a 2f 0d 0a 20 20 69 66 28 20 72 63  er. */..  if( rc
35660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0d 0a 20 20  ==SQLITE_OK ..  
35670 20 26 26 20 30 3d 3d 70 52 6f 6f 74 2d 3e 62 45   && 0==pRoot->bE
35680 6f 66 20 0d 0a 20 20 20 26 26 20 66 74 73 35 52  of ..   && fts5R
35690 6f 77 69 64 43 6d 70 28 70 2c 20 70 52 6f 6f 74  owidCmp(p, pRoot
356a0 2d 3e 69 52 6f 77 69 64 2c 20 69 46 69 72 73 74  ->iRowid, iFirst
356b0 29 3c 30 20 0d 0a 20 20 29 7b 0d 0a 20 20 20 20  )<0 ..  ){..    
356c0 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
356d0 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74 2c 20  eNext(p, pRoot, 
356e0 31 2c 20 69 46 69 72 73 74 29 3b 0d 0a 20 20 7d  1, iFirst);..  }
356f0 0d 0a 0d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ....  /* If the 
35700 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20  iterator is not 
35710 61 74 20 61 20 72 65 61 6c 20 6d 61 74 63 68 2c  at a real match,
35720 20 73 6b 69 70 20 66 6f 72 77 61 72 64 20 75 6e   skip forward un
35730 74 69 6c 20 69 74 20 69 73 2e 20 2a 2f 0d 0a 20  til it is. */.. 
35740 20 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e 62   while( pRoot->b
35750 4e 6f 6d 61 74 63 68 20 29 7b 0d 0a 20 20 20 20  Nomatch ){..    
35760 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62  assert( pRoot->b
35770 45 6f 66 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  Eof==0 && rc==SQ
35780 4c 49 54 45 5f 4f 4b 20 29 3b 0d 0a 20 20 20 20  LITE_OK );..    
35790 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
357a0 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74 2c 20  eNext(p, pRoot, 
357b0 30 2c 20 30 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72  0, 0);..  }..  r
357c0 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 0d 0a  eturn rc;..}....
357d0 2f 2a 0d 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  /*..** Move to t
357e0 68 65 20 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74  he next document
357f0 20 0d 0a 2a 2a 0d 0a 2a 2a 20 52 65 74 75 72 6e   ..**..** Return
35800 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
35810 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
35820 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
35830 65 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 0d  e otherwise. It.
35840 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
35850 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
35860 66 20 74 68 65 20 71 75 65 72 79 20 64 6f 65 73  f the query does
35870 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 64   not match any d
35880 6f 63 75 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 73  ocuments...*/..s
35890 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
358a0 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 46 74  3Fts5ExprNext(Ft
358b0 73 35 45 78 70 72 20 2a 70 2c 20 69 36 34 20 69  s5Expr *p, i64 i
358c0 4c 61 73 74 29 7b 0d 0a 20 20 69 6e 74 20 72 63  Last){..  int rc
358d0 3b 0d 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  ;..  Fts5ExprNod
358e0 65 20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52  e *pRoot = p->pR
358f0 6f 6f 74 3b 0d 0a 20 20 61 73 73 65 72 74 28 20  oot;..  assert( 
35900 70 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26  pRoot->bEof==0 &
35910 26 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63  & pRoot->bNomatc
35920 68 3d 3d 30 20 29 3b 0d 0a 20 20 64 6f 20 7b 0d  h==0 );..  do {.
35930 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78  .    rc = fts5Ex
35940 70 72 4e 6f 64 65 4e 65 78 74 28 70 2c 20 70 52  prNodeNext(p, pR
35950 6f 6f 74 2c 20 30 2c 20 30 29 3b 0d 0a 20 20 20  oot, 0, 0);..   
35960 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
35970 62 4e 6f 6d 61 74 63 68 3d 3d 30 20 7c 7c 20 28  bNomatch==0 || (
35980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35990 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 29   pRoot->bEof==0)
359a0 20 29 3b 0d 0a 20 20 7d 77 68 69 6c 65 28 20 70   );..  }while( p
359b0 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 20 29  Root->bNomatch )
359c0 3b 0d 0a 20 20 69 66 28 20 66 74 73 35 52 6f 77  ;..  if( fts5Row
359d0 69 64 43 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e  idCmp(p, pRoot->
359e0 69 52 6f 77 69 64 2c 20 69 4c 61 73 74 29 3e 30  iRowid, iLast)>0
359f0 20 29 7b 0d 0a 20 20 20 20 70 52 6f 6f 74 2d 3e   ){..    pRoot->
35a00 62 45 6f 66 20 3d 20 31 3b 0d 0a 20 20 7d 0d 0a  bEof = 1;..  }..
35a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
35a20 0a 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  ...static int sq
35a30 6c 69 74 65 33 46 74 73 35 45 78 70 72 45 6f 66  lite3Fts5ExprEof
35a40 28 46 74 73 35 45 78 70 72 20 2a 70 29 7b 0d 0a  (Fts5Expr *p){..
35a50 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f    return p->pRoo
35a60 74 2d 3e 62 45 6f 66 3b 0d 0a 7d 0d 0a 0d 0a 73  t->bEof;..}....s
35a70 74 61 74 69 63 20 69 36 34 20 73 71 6c 69 74 65  tatic i64 sqlite
35a80 33 46 74 73 35 45 78 70 72 52 6f 77 69 64 28 46  3Fts5ExprRowid(F
35a90 74 73 35 45 78 70 72 20 2a 70 29 7b 0d 0a 20 20  ts5Expr *p){..  
35aa0 72 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d  return p->pRoot-
35ab0 3e 69 52 6f 77 69 64 3b 0d 0a 7d 0d 0a 0d 0a 73  >iRowid;..}....s
35ac0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 61  tatic int fts5Pa
35ad0 72 73 65 53 74 72 69 6e 67 46 72 6f 6d 54 6f 6b  rseStringFromTok
35ae0 65 6e 28 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54  en(Fts5Token *pT
35af0 6f 6b 65 6e 2c 20 63 68 61 72 20 2a 2a 70 7a 29  oken, char **pz)
35b00 7b 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  {..  int rc = SQ
35b10 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 2a 70 7a 20  LITE_OK;..  *pz 
35b20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 72  = sqlite3Fts5Str
35b30 6e 64 75 70 28 26 72 63 2c 20 70 54 6f 6b 65 6e  ndup(&rc, pToken
35b40 2d 3e 70 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->p, pToken->n);
35b50 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a  ..  return rc;..
35b60 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65  }..../*..** Free
35b70 20 74 68 65 20 70 68 72 61 73 65 20 6f 62 6a 65   the phrase obje
35b80 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
35b90 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d   only argument..
35ba0 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
35bb0 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65 46   fts5ExprPhraseF
35bc0 72 65 65 28 46 74 73 35 45 78 70 72 50 68 72 61  ree(Fts5ExprPhra
35bd0 73 65 20 2a 70 50 68 72 61 73 65 29 7b 0d 0a 20  se *pPhrase){.. 
35be0 20 69 66 28 20 70 50 68 72 61 73 65 20 29 7b 0d   if( pPhrase ){.
35bf0 0a 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20  .    int i;..   
35c00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72   for(i=0; i<pPhr
35c10 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  ase->nTerm; i++)
35c20 7b 0d 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  {..      Fts5Exp
35c30 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0d 0a 20 20  rTerm *pSyn;..  
35c40 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
35c50 20 2a 70 4e 65 78 74 3b 0d 0a 20 20 20 20 20 20   *pNext;..      
35c60 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
35c70 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e  erm = &pPhrase->
35c80 61 54 65 72 6d 5b 69 5d 3b 0d 0a 20 20 20 20 20  aTerm[i];..     
35c90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
35ca0 65 72 6d 2d 3e 7a 54 65 72 6d 29 3b 0d 0a 20 20  erm->zTerm);..  
35cb0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
35cc0 74 65 72 43 6c 6f 73 65 28 70 54 65 72 6d 2d 3e  terClose(pTerm->
35cd0 70 49 74 65 72 29 3b 0d 0a 20 20 20 20 20 20 66  pIter);..      f
35ce0 6f 72 28 70 53 79 6e 3d 70 54 65 72 6d 2d 3e 70  or(pSyn=pTerm->p
35cf0 53 79 6e 6f 6e 79 6d 3b 20 70 53 79 6e 3b 20 70  Synonym; pSyn; p
35d00 53 79 6e 3d 70 4e 65 78 74 29 7b 0d 0a 20 20 20  Syn=pNext){..   
35d10 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 79       pNext = pSy
35d20 6e 2d 3e 70 53 79 6e 6f 6e 79 6d 3b 0d 0a 20 20  n->pSynonym;..  
35d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
35d40 35 49 74 65 72 43 6c 6f 73 65 28 70 53 79 6e 2d  5IterClose(pSyn-
35d50 3e 70 49 74 65 72 29 3b 0d 0a 20 20 20 20 20 20  >pIter);..      
35d60 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
35d70 28 28 46 74 73 35 42 75 66 66 65 72 2a 29 26 70  ((Fts5Buffer*)&p
35d80 53 79 6e 5b 31 5d 29 3b 0d 0a 20 20 20 20 20 20  Syn[1]);..      
35d90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
35da0 53 79 6e 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  Syn);..      }..
35db0 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 28 20 70      }..    if( p
35dc0 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
35dd0 6e 53 70 61 63 65 3e 30 20 29 20 66 74 73 35 42  nSpace>0 ) fts5B
35de0 75 66 66 65 72 46 72 65 65 28 26 70 50 68 72 61  ufferFree(&pPhra
35df0 73 65 2d 3e 70 6f 73 6c 69 73 74 29 3b 0d 0a 20  se->poslist);.. 
35e00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
35e10 70 50 68 72 61 73 65 29 3b 0d 0a 20 20 7d 0d 0a  pPhrase);..  }..
35e20 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 53 65 74 20  }..../*..** Set 
35e30 74 68 65 20 22 62 46 69 72 73 74 22 20 66 6c 61  the "bFirst" fla
35e40 67 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 74  g on the first t
35e50 6f 6b 65 6e 20 6f 66 20 74 68 65 20 70 68 72 61  oken of the phra
35e60 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
35e70 0d 0a 2a 2a 20 6f 6e 6c 79 20 61 72 67 75 6d 65  ..** only argume
35e80 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20  nt...*/..static 
35e90 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
35ea0 50 61 72 73 65 53 65 74 43 61 72 65 74 28 46 74  ParseSetCaret(Ft
35eb0 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
35ec0 68 72 61 73 65 29 7b 0d 0a 20 20 69 66 28 20 70  hrase){..  if( p
35ed0 50 68 72 61 73 65 20 26 26 20 70 50 68 72 61 73  Phrase && pPhras
35ee0 65 2d 3e 6e 54 65 72 6d 20 29 7b 0d 0a 20 20 20  e->nTerm ){..   
35ef0 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b   pPhrase->aTerm[
35f00 30 5d 2e 62 46 69 72 73 74 20 3d 20 31 3b 0d 0a  0].bFirst = 1;..
35f10 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a    }..}..../*..**
35f20 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 4e 65   If argument pNe
35f30 61 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  ar is NULL, then
35f40 20 61 20 6e 65 77 20 46 74 73 35 45 78 70 72 4e   a new Fts5ExprN
35f50 65 61 72 73 65 74 20 6f 62 6a 65 63 74 20 69 73  earset object is
35f60 20 61 6c 6c 6f 63 61 74 65 64 0d 0a 2a 2a 20 61   allocated..** a
35f70 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
35f80 68 20 70 50 68 72 61 73 65 2e 20 4f 72 2c 20 69  h pPhrase. Or, i
35f90 66 20 70 4e 65 61 72 20 69 73 20 6e 6f 74 20 4e  f pNear is not N
35fa0 55 4c 4c 2c 20 70 68 72 61 73 65 20 70 50 68 72  ULL, phrase pPhr
35fb0 61 73 65 20 69 73 0d 0a 2a 2a 20 61 70 70 65 6e  ase is..** appen
35fc0 64 65 64 20 74 6f 20 69 74 20 61 6e 64 20 74 68  ded to it and th
35fd0 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
35fe0 65 64 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 49 66 20 61  ed...**..** If a
35ff0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
36000 72 73 2c 20 62 6f 74 68 20 74 68 65 20 70 4e 65  rs, both the pNe
36010 61 72 20 61 6e 64 20 70 50 68 72 61 73 65 20 6f  ar and pPhrase o
36020 62 6a 65 63 74 73 20 61 72 65 20 66 72 65 65 64  bjects are freed
36030 20 61 6e 64 0d 0a 2a 2a 20 4e 55 4c 4c 20 72 65   and..** NULL re
36040 74 75 72 6e 65 64 2e 0d 0a 2a 2f 0d 0a 73 74 61  turned...*/..sta
36050 74 69 63 20 46 74 73 35 45 78 70 72 4e 65 61 72  tic Fts5ExprNear
36060 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35  set *sqlite3Fts5
36070 50 61 72 73 65 4e 65 61 72 73 65 74 28 0d 0a 20  ParseNearset(.. 
36080 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
36090 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
360a0 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
360b0 74 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72  t */..  Fts5Expr
360c0 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 2c 20  Nearset *pNear, 
360d0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74          /* Exist
360e0 69 6e 67 20 6e 65 61 72 73 65 74 2c 20 6f 72 20  ing nearset, or 
360f0 4e 55 4c 4c 20 2a 2f 0d 0a 20 20 46 74 73 35 45  NULL */..  Fts5E
36100 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61  xprPhrase *pPhra
36110 73 65 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  se         /* Re
36120 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 70 68  cently parsed ph
36130 72 61 73 65 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 63  rase */..){..  c
36140 6f 6e 73 74 20 69 6e 74 20 53 5a 41 4c 4c 4f 43  onst int SZALLOC
36150 20 3d 20 38 3b 0d 0a 20 20 46 74 73 35 45 78 70   = 8;..  Fts5Exp
36160 72 4e 65 61 72 73 65 74 20 2a 70 52 65 74 20 3d  rNearset *pRet =
36170 20 30 3b 0d 0a 0d 0a 20 20 69 66 28 20 70 50 61   0;....  if( pPa
36180 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
36190 4f 4b 20 29 7b 0d 0a 20 20 20 20 69 66 28 20 70  OK ){..    if( p
361a0 50 68 72 61 73 65 3d 3d 30 20 29 7b 0d 0a 20 20  Phrase==0 ){..  
361b0 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65 61 72      return pNear
361c0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66  ;..    }..    if
361d0 28 20 70 4e 65 61 72 3d 3d 30 20 29 7b 0d 0a 20  ( pNear==0 ){.. 
361e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
361f0 36 34 20 6e 42 79 74 65 3b 0d 0a 20 20 20 20 20  64 nByte;..     
36200 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
36210 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 29  Fts5ExprNearset)
36220 20 2b 20 53 5a 41 4c 4c 4f 43 20 2a 20 73 69 7a   + SZALLOC * siz
36230 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61  eof(Fts5ExprPhra
36240 73 65 2a 29 3b 0d 0a 20 20 20 20 20 20 70 52 65  se*);..      pRe
36250 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
36260 6f 63 36 34 28 6e 42 79 74 65 29 3b 0d 0a 20 20  oc64(nByte);..  
36270 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
36280 29 7b 0d 0a 20 20 20 20 20 20 20 20 70 50 61 72  ){..        pPar
36290 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
362a0 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 7d 65  NOMEM;..      }e
362b0 6c 73 65 7b 0d 0a 20 20 20 20 20 20 20 20 6d 65  lse{..        me
362c0 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 28 73  mset(pRet, 0, (s
362d0 69 7a 65 5f 74 29 6e 42 79 74 65 29 3b 0d 0a 20  ize_t)nByte);.. 
362e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 65 6c 73       }..    }els
362f0 65 20 69 66 28 20 28 70 4e 65 61 72 2d 3e 6e 50  e if( (pNear->nP
36300 68 72 61 73 65 20 25 20 53 5a 41 4c 4c 4f 43 29  hrase % SZALLOC)
36310 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e  ==0 ){..      in
36320 74 20 6e 4e 65 77 20 3d 20 70 4e 65 61 72 2d 3e  t nNew = pNear->
36330 6e 50 68 72 61 73 65 20 2b 20 53 5a 41 4c 4c 4f  nPhrase + SZALLO
36340 43 3b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C;..      sqlite
36350 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 3b 0d 0a  3_int64 nByte;..
36360 0d 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20  ..      nByte = 
36370 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e  sizeof(Fts5ExprN
36380 65 61 72 73 65 74 29 20 2b 20 6e 4e 65 77 20 2a  earset) + nNew *
36390 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
363a0 50 68 72 61 73 65 2a 29 3b 0d 0a 20 20 20 20 20  Phrase*);..     
363b0 20 70 52 65 74 20 3d 20 28 46 74 73 35 45 78 70   pRet = (Fts5Exp
363c0 72 4e 65 61 72 73 65 74 2a 29 73 71 6c 69 74 65  rNearset*)sqlite
363d0 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 4e 65 61  3_realloc64(pNea
363e0 72 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20  r, nByte);..    
363f0 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
36400 0d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ..        pParse
36410 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
36420 4d 45 4d 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  MEM;..      }.. 
36430 20 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20     }else{..     
36440 20 70 52 65 74 20 3d 20 70 4e 65 61 72 3b 0d 0a   pRet = pNear;..
36450 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
36460 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0d 0a  if( pRet==0 ){..
36470 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
36480 73 65 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se->rc!=SQLITE_O
36490 4b 20 29 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65  K );..    sqlite
364a0 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65  3Fts5ParseNearse
364b0 74 46 72 65 65 28 70 4e 65 61 72 29 3b 0d 0a 20  tFree(pNear);.. 
364c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
364d0 72 73 65 50 68 72 61 73 65 46 72 65 65 28 70 50  rsePhraseFree(pP
364e0 68 72 61 73 65 29 3b 0d 0a 20 20 7d 65 6c 73 65  hrase);..  }else
364f0 7b 0d 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d  {..    if( pRet-
36500 3e 6e 50 68 72 61 73 65 3e 30 20 29 7b 0d 0a 20  >nPhrase>0 ){.. 
36510 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72       Fts5ExprPhr
36520 61 73 65 20 2a 70 4c 61 73 74 20 3d 20 70 52 65  ase *pLast = pRe
36530 74 2d 3e 61 70 50 68 72 61 73 65 5b 70 52 65 74  t->apPhrase[pRet
36540 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 3b 0d 0a 20  ->nPhrase-1];.. 
36550 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 61       assert( pLa
36560 73 74 3d 3d 70 50 61 72 73 65 2d 3e 61 70 50 68  st==pParse->apPh
36570 72 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68  rase[pParse->nPh
36580 72 61 73 65 2d 32 5d 20 29 3b 0d 0a 20 20 20 20  rase-2] );..    
36590 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 6e    if( pPhrase->n
365a0 54 65 72 6d 3d 3d 30 20 29 7b 0d 0a 20 20 20 20  Term==0 ){..    
365b0 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72 61      fts5ExprPhra
365c0 73 65 46 72 65 65 28 70 50 68 72 61 73 65 29 3b  seFree(pPhrase);
365d0 0d 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ..        pRet->
365e0 6e 50 68 72 61 73 65 2d 2d 3b 0d 0a 20 20 20 20  nPhrase--;..    
365f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72      pParse->nPhr
36600 61 73 65 2d 2d 3b 0d 0a 20 20 20 20 20 20 20 20  ase--;..        
36610 70 50 68 72 61 73 65 20 3d 20 70 4c 61 73 74 3b  pPhrase = pLast;
36620 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ..      }else if
36630 28 20 70 4c 61 73 74 2d 3e 6e 54 65 72 6d 3d 3d  ( pLast->nTerm==
36640 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 66 74  0 ){..        ft
36650 73 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65  s5ExprPhraseFree
36660 28 70 4c 61 73 74 29 3b 0d 0a 20 20 20 20 20 20  (pLast);..      
36670 20 20 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61    pParse->apPhra
36680 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72 61  se[pParse->nPhra
36690 73 65 2d 32 5d 20 3d 20 70 50 68 72 61 73 65 3b  se-2] = pPhrase;
366a0 0d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ..        pParse
366b0 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0d 0a 20 20  ->nPhrase--;..  
366c0 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68 72        pRet->nPhr
366d0 61 73 65 2d 2d 3b 0d 0a 20 20 20 20 20 20 7d 0d  ase--;..      }.
366e0 0a 20 20 20 20 7d 0d 0a 20 20 20 20 70 52 65 74  .    }..    pRet
366f0 2d 3e 61 70 50 68 72 61 73 65 5b 70 52 65 74 2d  ->apPhrase[pRet-
36700 3e 6e 50 68 72 61 73 65 2b 2b 5d 20 3d 20 70 50  >nPhrase++] = pP
36710 68 72 61 73 65 3b 0d 0a 20 20 7d 0d 0a 20 20 72  hrase;..  }..  r
36720 65 74 75 72 6e 20 70 52 65 74 3b 0d 0a 7d 0d 0a  eturn pRet;..}..
36730 0d 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
36740 20 54 6f 6b 65 6e 43 74 78 20 54 6f 6b 65 6e 43   TokenCtx TokenC
36750 74 78 3b 0d 0a 73 74 72 75 63 74 20 54 6f 6b 65  tx;..struct Toke
36760 6e 43 74 78 20 7b 0d 0a 20 20 46 74 73 35 45 78  nCtx {..  Fts5Ex
36770 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
36780 65 3b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 7d  e;..  int rc;..}
36790 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 61 6c 6c  ;..../*..** Call
367a0 62 61 63 6b 20 66 6f 72 20 74 6f 6b 65 6e 69 7a  back for tokeniz
367b0 69 6e 67 20 74 65 72 6d 73 20 75 73 65 64 20 62  ing terms used b
367c0 79 20 50 61 72 73 65 54 65 72 6d 28 29 2e 0d 0a  y ParseTerm()...
367d0 2a 2f 0d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */..static int f
367e0 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65  ts5ParseTokenize
367f0 28 0d 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  (..  void *pCont
36800 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
36810 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
36820 74 6f 20 46 74 73 35 49 6e 73 65 72 74 43 74 78  to Fts5InsertCtx
36830 20 6f 62 6a 65 63 74 20 2a 2f 0d 0a 20 20 69 6e   object */..  in
36840 74 20 74 66 6c 61 67 73 2c 20 20 20 20 20 20 20  t tflags,       
36850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36860 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 54 4f   Mask of FTS5_TO
36870 4b 45 4e 5f 2a 20 66 6c 61 67 73 20 2a 2f 0d 0a  KEN_* flags */..
36880 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
36890 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
368a0 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
368b0 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0d  aining token */.
368c0 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20  .  int nToken,  
368d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 6f     /* Size of to
368f0 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0d  ken in bytes */.
36900 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64 31 2c  .  int iUnused1,
36910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36920 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 66 73     /* Start offs
36930 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0d 0a  et of token */..
36940 20 20 69 6e 74 20 69 55 6e 75 73 65 64 32 20 20    int iUnused2  
36950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36960 20 20 2f 2a 20 45 6e 64 20 6f 66 66 73 65 74 20    /* End offset 
36970 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0d 0a 29 7b 0d  of token */..){.
36980 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36990 54 45 5f 4f 4b 3b 0d 0a 20 20 63 6f 6e 73 74 20  TE_OK;..  const 
369a0 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20 38 3b  int SZALLOC = 8;
369b0 0d 0a 20 20 54 6f 6b 65 6e 43 74 78 20 2a 70 43  ..  TokenCtx *pC
369c0 74 78 20 3d 20 28 54 6f 6b 65 6e 43 74 78 2a 29  tx = (TokenCtx*)
369d0 70 43 6f 6e 74 65 78 74 3b 0d 0a 20 20 46 74 73  pContext;..  Fts
369e0 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
369f0 72 61 73 65 20 3d 20 70 43 74 78 2d 3e 70 50 68  rase = pCtx->pPh
36a00 72 61 73 65 3b 0d 0a 0d 0a 20 20 55 4e 55 53 45  rase;....  UNUSE
36a10 44 5f 50 41 52 41 4d 32 28 69 55 6e 75 73 65 64  D_PARAM2(iUnused
36a20 31 2c 20 69 55 6e 75 73 65 64 32 29 3b 0d 0a 0d  1, iUnused2);...
36a30 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
36a40 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
36a50 63 75 72 72 65 64 2c 20 74 68 69 73 20 69 73 20  curred, this is 
36a60 61 20 6e 6f 2d 6f 70 20 2a 2f 0d 0a 20 20 69 66  a no-op */..  if
36a70 28 20 70 43 74 78 2d 3e 72 63 21 3d 53 51 4c 49  ( pCtx->rc!=SQLI
36a80 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 70  TE_OK ) return p
36a90 43 74 78 2d 3e 72 63 3b 0d 0a 20 20 69 66 28 20  Ctx->rc;..  if( 
36aa0 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58 5f  nToken>FTS5_MAX_
36ab0 54 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54 6f  TOKEN_SIZE ) nTo
36ac0 6b 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f 54  ken = FTS5_MAX_T
36ad0 4f 4b 45 4e 5f 53 49 5a 45 3b 0d 0a 0d 0a 20 20  OKEN_SIZE;....  
36ae0 69 66 28 20 70 50 68 72 61 73 65 20 26 26 20 70  if( pPhrase && p
36af0 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 30 20  Phrase->nTerm>0 
36b00 26 26 20 28 74 66 6c 61 67 73 20 26 20 46 54 53  && (tflags & FTS
36b10 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45  5_TOKEN_COLOCATE
36b20 44 29 20 29 7b 0d 0a 20 20 20 20 46 74 73 35 45  D) ){..    Fts5E
36b30 78 70 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0d 0a  xprTerm *pSyn;..
36b40 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
36b50 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  4 nByte = sizeof
36b60 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 20 2b  (Fts5ExprTerm) +
36b70 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
36b80 65 72 29 20 2b 20 6e 54 6f 6b 65 6e 2b 31 3b 0d  er) + nToken+1;.
36b90 0a 20 20 20 20 70 53 79 6e 20 3d 20 28 46 74 73  .    pSyn = (Fts
36ba0 35 45 78 70 72 54 65 72 6d 2a 29 73 71 6c 69 74  5ExprTerm*)sqlit
36bb0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
36bc0 65 29 3b 0d 0a 20 20 20 20 69 66 28 20 70 53 79  e);..    if( pSy
36bd0 6e 3d 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 72  n==0 ){..      r
36be0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
36bf0 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a 20  ;..    }else{.. 
36c00 20 20 20 20 20 6d 65 6d 73 65 74 28 70 53 79 6e       memset(pSyn
36c10 2c 20 30 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79  , 0, (size_t)nBy
36c20 74 65 29 3b 0d 0a 20 20 20 20 20 20 70 53 79 6e  te);..      pSyn
36c30 2d 3e 7a 54 65 72 6d 20 3d 20 28 28 63 68 61 72  ->zTerm = ((char
36c40 2a 29 70 53 79 6e 29 20 2b 20 73 69 7a 65 6f 66  *)pSyn) + sizeof
36c50 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 20 2b  (Fts5ExprTerm) +
36c60 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
36c70 65 72 29 3b 0d 0a 20 20 20 20 20 20 6d 65 6d 63  er);..      memc
36c80 70 79 28 70 53 79 6e 2d 3e 7a 54 65 72 6d 2c 20  py(pSyn->zTerm, 
36c90 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
36ca0 0d 0a 20 20 20 20 20 20 70 53 79 6e 2d 3e 70 53  ..      pSyn->pS
36cb0 79 6e 6f 6e 79 6d 20 3d 20 70 50 68 72 61 73 65  ynonym = pPhrase
36cc0 2d 3e 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d  ->aTerm[pPhrase-
36cd0 3e 6e 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e  >nTerm-1].pSynon
36ce0 79 6d 3b 0d 0a 20 20 20 20 20 20 70 50 68 72 61  ym;..      pPhra
36cf0 73 65 2d 3e 61 54 65 72 6d 5b 70 50 68 72 61 73  se->aTerm[pPhras
36d00 65 2d 3e 6e 54 65 72 6d 2d 31 5d 2e 70 53 79 6e  e->nTerm-1].pSyn
36d10 6f 6e 79 6d 20 3d 20 70 53 79 6e 3b 0d 0a 20 20  onym = pSyn;..  
36d20 20 20 7d 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20    }..  }else{.. 
36d30 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
36d40 2a 70 54 65 72 6d 3b 0d 0a 20 20 20 20 69 66 28  *pTerm;..    if(
36d50 20 70 50 68 72 61 73 65 3d 3d 30 20 7c 7c 20 28   pPhrase==0 || (
36d60 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20 25  pPhrase->nTerm %
36d70 20 53 5a 41 4c 4c 4f 43 29 3d 3d 30 20 29 7b 0d   SZALLOC)==0 ){.
36d80 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50  .      Fts5ExprP
36d90 68 72 61 73 65 20 2a 70 4e 65 77 3b 0d 0a 20 20  hrase *pNew;..  
36da0 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 53      int nNew = S
36db0 5a 41 4c 4c 4f 43 20 2b 20 28 70 50 68 72 61 73  ZALLOC + (pPhras
36dc0 65 20 3f 20 70 50 68 72 61 73 65 2d 3e 6e 54 65  e ? pPhrase->nTe
36dd0 72 6d 20 3a 20 30 29 3b 0d 0a 0d 0a 20 20 20 20  rm : 0);....    
36de0 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 45 78    pNew = (Fts5Ex
36df0 70 72 50 68 72 61 73 65 2a 29 73 71 6c 69 74 65  prPhrase*)sqlite
36e00 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 50 68 72  3_realloc64(pPhr
36e10 61 73 65 2c 20 0d 0a 20 20 20 20 20 20 20 20 20  ase, ..         
36e20 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
36e30 50 68 72 61 73 65 29 20 2b 20 73 69 7a 65 6f 66  Phrase) + sizeof
36e40 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 20 2a  (Fts5ExprTerm) *
36e50 20 6e 4e 65 77 0d 0a 20 20 20 20 20 20 29 3b 0d   nNew..      );.
36e60 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d  .      if( pNew=
36e70 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 72  =0 ){..        r
36e80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
36e90 3b 0d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0d  ;..      }else{.
36ea0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 68  .        if( pPh
36eb0 72 61 73 65 3d 3d 30 20 29 20 6d 65 6d 73 65 74  rase==0 ) memset
36ec0 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
36ed0 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 29  (Fts5ExprPhrase)
36ee0 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 43 74 78  );..        pCtx
36ef0 2d 3e 70 50 68 72 61 73 65 20 3d 20 70 50 68 72  ->pPhrase = pPhr
36f00 61 73 65 20 3d 20 70 4e 65 77 3b 0d 0a 20 20 20  ase = pNew;..   
36f10 20 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d       pNew->nTerm
36f20 20 3d 20 6e 4e 65 77 20 2d 20 53 5a 41 4c 4c 4f   = nNew - SZALLO
36f30 43 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  C;..      }..   
36f40 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28 20 72 63   }....    if( rc
36f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
36f60 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
36f70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 70 50  Phrase->aTerm[pP
36f80 68 72 61 73 65 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  hrase->nTerm++];
36f90 0d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ..      memset(p
36fa0 54 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Term, 0, sizeof(
36fb0 46 74 73 35 45 78 70 72 54 65 72 6d 29 29 3b 0d  Fts5ExprTerm));.
36fc0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 7a 54  .      pTerm->zT
36fd0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 46 74 73  erm = sqlite3Fts
36fe0 35 53 74 72 6e 64 75 70 28 26 72 63 2c 20 70 54  5Strndup(&rc, pT
36ff0 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0d 0a  oken, nToken);..
37000 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
37010 70 43 74 78 2d 3e 72 63 20 3d 20 72 63 3b 0d 0a  pCtx->rc = rc;..
37020 20 20 72 65 74 75 72 6e 20 72 63 3b 0d 0a 7d 0d    return rc;..}.
37030 0a 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 46 72 65 65  ...../*..** Free
37040 20 74 68 65 20 70 68 72 61 73 65 20 6f 62 6a 65   the phrase obje
37050 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
37060 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0d   only argument..
37070 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/..static void
37080 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
37090 65 50 68 72 61 73 65 46 72 65 65 28 46 74 73 35  ePhraseFree(Fts5
370a0 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
370b0 61 73 65 29 7b 0d 0a 20 20 66 74 73 35 45 78 70  ase){..  fts5Exp
370c0 72 50 68 72 61 73 65 46 72 65 65 28 70 50 68 72  rPhraseFree(pPhr
370d0 61 73 65 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a  ase);..}..../*..
370e0 2a 2a 20 46 72 65 65 20 74 68 65 20 70 68 72 61  ** Free the phra
370f0 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  se object passed
37100 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
37110 72 67 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74  rgument...*/..st
37120 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
37130 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65  3Fts5ParseNearse
37140 74 46 72 65 65 28 46 74 73 35 45 78 70 72 4e 65  tFree(Fts5ExprNe
37150 61 72 73 65 74 20 2a 70 4e 65 61 72 29 7b 0d 0a  arset *pNear){..
37160 20 20 69 66 28 20 70 4e 65 61 72 20 29 7b 0d 0a    if( pNear ){..
37170 20 20 20 20 69 6e 74 20 69 3b 0d 0a 20 20 20 20      int i;..    
37180 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72  for(i=0; i<pNear
37190 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b  ->nPhrase; i++){
371a0 0d 0a 20 20 20 20 20 20 66 74 73 35 45 78 70 72  ..      fts5Expr
371b0 50 68 72 61 73 65 46 72 65 65 28 70 4e 65 61 72  PhraseFree(pNear
371c0 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 29 3b 0d  ->apPhrase[i]);.
371d0 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
371e0 74 65 33 5f 66 72 65 65 28 70 4e 65 61 72 2d 3e  te3_free(pNear->
371f0 70 43 6f 6c 73 65 74 29 3b 0d 0a 20 20 20 20 73  pColset);..    s
37200 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 61  qlite3_free(pNea
37210 72 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 73  r);..  }..}....s
37220 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
37230 65 33 46 74 73 35 50 61 72 73 65 46 69 6e 69 73  e3Fts5ParseFinis
37240 68 65 64 28 46 74 73 35 50 61 72 73 65 20 2a 70  hed(Fts5Parse *p
37250 50 61 72 73 65 2c 20 46 74 73 35 45 78 70 72 4e  Parse, Fts5ExprN
37260 6f 64 65 20 2a 70 29 7b 0d 0a 20 20 61 73 73 65  ode *p){..  asse
37270 72 74 28 20 70 50 61 72 73 65 2d 3e 70 45 78 70  rt( pParse->pExp
37280 72 3d 3d 30 20 29 3b 0d 0a 20 20 70 50 61 72 73  r==0 );..  pPars
37290 65 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0d 0a 7d  e->pExpr = p;..}
372a0 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 69 73 20  ..../*..** This 
372b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
372c0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
372d0 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 74   to process a st
372e0 72 69 6e 67 20 74 6f 6b 65 6e 2e 20 54 68 65 0d  ring token. The.
372f0 0a 2a 2a 20 73 74 72 69 6e 67 20 6d 61 79 20 6f  .** string may o
37300 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 6f  r may not be quo
37310 74 65 64 2e 20 49 6e 20 61 6e 79 20 63 61 73 65  ted. In any case
37320 20 69 74 20 69 73 20 74 6f 6b 65 6e 69 7a 65 64   it is tokenized
37330 20 61 6e 64 20 61 0d 0a 2a 2a 20 70 68 72 61 73   and a..** phras
37340 65 20 6f 62 6a 65 63 74 20 63 6f 6e 73 69 73 74  e object consist
37350 69 6e 67 20 6f 66 20 61 6c 6c 20 74 6f 6b 65 6e  ing of all token
37360 73 20 72 65 74 75 72 6e 65 64 2e 0d 0a 2a 2f 0d  s returned...*/.
37370 0a 73 74 61 74 69 63 20 46 74 73 35 45 78 70 72  .static Fts5Expr
37380 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65 33 46  Phrase *sqlite3F
37390 74 73 35 50 61 72 73 65 54 65 72 6d 28 0d 0a 20  ts5ParseTerm(.. 
373a0 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
373b0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
373c0 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
373d0 74 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70 72  t */..  Fts5Expr
373e0 50 68 72 61 73 65 20 2a 70 41 70 70 65 6e 64 2c  Phrase *pAppend,
373f0 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
37400 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a  e to append to *
37410 2f 0d 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a  /..  Fts5Token *
37420 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  pToken,         
37430 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74       /* String t
37440 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0d 0a 20  o tokenize */.. 
37450 20 69 6e 74 20 62 50 72 65 66 69 78 20 20 20 20   int bPrefix    
37460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37470 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
37480 65 20 69 73 20 61 20 74 72 61 69 6c 69 6e 67 20  e is a trailing 
37490 22 2a 22 20 2a 2f 0d 0a 29 7b 0d 0a 20 20 46 74  "*" */..){..  Ft
374a0 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
374b0 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  g = pParse->pCon
374c0 66 69 67 3b 0d 0a 20 20 54 6f 6b 65 6e 43 74 78  fig;..  TokenCtx
374d0 20 73 43 74 78 3b 20 20 20 20 20 20 20 20 20 20   sCtx;          
374e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
374f0 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  xt object passed
37500 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0d   to callback */.
37510 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
37520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37530 20 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 20 72     /* Tokenize r
37540 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0d 0a 20  eturn code */.. 
37550 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0d 0a 0d   char *z = 0;...
37560 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c  .  memset(&sCtx,
37570 20 30 2c 20 73 69 7a 65 6f 66 28 54 6f 6b 65 6e   0, sizeof(Token
37580 43 74 78 29 29 3b 0d 0a 20 20 73 43 74 78 2e 70  Ctx));..  sCtx.p
37590 50 68 72 61 73 65 20 3d 20 70 41 70 70 65 6e 64  Phrase = pAppend
375a0 3b 0d 0a 0d 0a 20 20 72 63 20 3d 20 66 74 73 35  ;....  rc = fts5
375b0 50 61 72 73 65 53 74 72 69 6e 67 46 72 6f 6d 54  ParseStringFromT
375c0 6f 6b 65 6e 28 70 54 6f 6b 65 6e 2c 20 26 7a 29  oken(pToken, &z)
375d0 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
375e0 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 69  ITE_OK ){..    i
375f0 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 5f  nt flags = FTS5_
37600 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 20 7c  TOKENIZE_QUERY |
37610 20 28 62 50 72 65 66 69 78 20 3f 20 46 54 53 35   (bPrefix ? FTS5
37620 5f 54 4f 4b 45 4e 49 5a 45 5f 50 52 45 46 49 58  _TOKENIZE_PREFIX
37630 20 3a 20 30 29 3b 0d 0a 20 20 20 20 69 6e 74 20   : 0);..    int 
37640 6e 3b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 46  n;..    sqlite3F
37650 74 73 35 44 65 71 75 6f 74 65 28 7a 29 3b 0d 0a  ts5Dequote(z);..
37660 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72      n = (int)str
37670 6c 65 6e 28 7a 29 3b 0d 0a 20 20 20 20 72 63 20  len(z);..    rc 
37680 3d 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b  = sqlite3Fts5Tok
37690 65 6e 69 7a 65 28 70 43 6f 6e 66 69 67 2c 20 66  enize(pConfig, f
376a0 6c 61 67 73 2c 20 7a 2c 20 6e 2c 20 26 73 43 74  lags, z, n, &sCt
376b0 78 2c 20 66 74 73 35 50 61 72 73 65 54 6f 6b 65  x, fts5ParseToke
376c0 6e 69 7a 65 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73  nize);..  }..  s
376d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0d  qlite3_free(z);.
376e0 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 28 72 63  .  if( rc || (rc
376f0 20 3d 20 73 43 74 78 2e 72 63 29 20 29 7b 0d 0a   = sCtx.rc) ){..
37700 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
37710 20 72 63 3b 0d 0a 20 20 20 20 66 74 73 35 45 78   rc;..    fts5Ex
37720 70 72 50 68 72 61 73 65 46 72 65 65 28 73 43 74  prPhraseFree(sCt
37730 78 2e 70 50 68 72 61 73 65 29 3b 0d 0a 20 20 20  x.pPhrase);..   
37740 20 73 43 74 78 2e 70 50 68 72 61 73 65 20 3d 20   sCtx.pPhrase = 
37750 30 3b 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 0d 0a  0;..  }else{....
37760 20 20 20 20 69 66 28 20 70 41 70 70 65 6e 64 3d      if( pAppend=
37770 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 69 66 28  =0 ){..      if(
37780 20 28 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73   (pParse->nPhras
37790 65 20 25 20 38 29 3d 3d 30 20 29 7b 0d 0a 20 20  e % 8)==0 ){..  
377a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
377b0 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
377c0 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73  of(Fts5ExprPhras
377d0 65 2a 29 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e  e*) * (pParse->n
377e0 50 68 72 61 73 65 20 2b 20 38 29 3b 0d 0a 20 20  Phrase + 8);..  
377f0 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68        Fts5ExprPh
37800 72 61 73 65 20 2a 2a 61 70 4e 65 77 3b 0d 0a 20  rase **apNew;.. 
37810 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 28         apNew = (
37820 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 2a  Fts5ExprPhrase**
37830 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
37840 36 34 28 70 50 61 72 73 65 2d 3e 61 70 50 68 72  64(pParse->apPhr
37850 61 73 65 2c 20 6e 42 79 74 65 29 3b 0d 0a 20 20  ase, nByte);..  
37860 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d        if( apNew=
37870 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 20 20 20  =0 ){..         
37880 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
37890 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20  LITE_NOMEM;..   
378a0 20 20 20 20 20 20 20 66 74 73 35 45 78 70 72 50         fts5ExprP
378b0 68 72 61 73 65 46 72 65 65 28 73 43 74 78 2e 70  hraseFree(sCtx.p
378c0 50 68 72 61 73 65 29 3b 0d 0a 20 20 20 20 20 20  Phrase);..      
378d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20      return 0;.. 
378e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
378f0 20 20 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61    pParse->apPhra
37900 73 65 20 3d 20 61 70 4e 65 77 3b 0d 0a 20 20 20  se = apNew;..   
37910 20 20 20 7d 0d 0a 20 20 20 20 20 20 70 50 61 72     }..      pPar
37920 73 65 2d 3e 6e 50 68 72 61 73 65 2b 2b 3b 0d 0a  se->nPhrase++;..
37930 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 28      }....    if(
37940 20 73 43 74 78 2e 70 50 68 72 61 73 65 3d 3d 30   sCtx.pPhrase==0
37950 20 29 7b 0d 0a 20 20 20 20 20 20 2f 2a 20 54 68   ){..      /* Th
37960 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
37970 70 61 72 73 69 6e 67 20 61 20 74 6f 6b 65 6e 20  parsing a token 
37980 6f 72 20 71 75 6f 74 65 64 20 70 68 72 61 73 65  or quoted phrase
37990 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0d 0a   that contains..
379a0 20 20 20 20 20 20 2a 2a 20 6e 6f 20 74 6f 6b 65        ** no toke
379b0 6e 20 63 68 61 72 61 63 74 65 72 73 20 61 74 20  n characters at 
379c0 61 6c 6c 2e 20 28 65 2e 67 20 2e 2e 2e 20 4d 41  all. (e.g ... MA
379d0 54 43 48 20 27 22 22 27 29 2e 20 2a 2f 0d 0a 20  TCH '""'). */.. 
379e0 20 20 20 20 20 73 43 74 78 2e 70 50 68 72 61 73       sCtx.pPhras
379f0 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  e = sqlite3Fts5M
37a00 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 50 61 72 73  allocZero(&pPars
37a10 65 2d 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74  e->rc, sizeof(Ft
37a20 73 35 45 78 70 72 50 68 72 61 73 65 29 29 3b 0d  s5ExprPhrase));.
37a30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
37a40 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e 54 65  Ctx.pPhrase->nTe
37a50 72 6d 20 29 7b 0d 0a 20 20 20 20 20 20 73 43 74  rm ){..      sCt
37a60 78 2e 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  x.pPhrase->aTerm
37a70 5b 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e  [sCtx.pPhrase->n
37a80 54 65 72 6d 2d 31 5d 2e 62 50 72 65 66 69 78 20  Term-1].bPrefix 
37a90 3d 20 28 75 38 29 62 50 72 65 66 69 78 3b 0d 0a  = (u8)bPrefix;..
37aa0 20 20 20 20 7d 0d 0a 20 20 20 20 70 50 61 72 73      }..    pPars
37ab0 65 2d 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72  e->apPhrase[pPar
37ac0 73 65 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 20 3d  se->nPhrase-1] =
37ad0 20 73 43 74 78 2e 70 50 68 72 61 73 65 3b 0d 0a   sCtx.pPhrase;..
37ae0 20 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20    }....  return 
37af0 73 43 74 78 2e 70 50 68 72 61 73 65 3b 0d 0a 7d  sCtx.pPhrase;..}
37b00 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 43 72 65 61 74  ..../*..** Creat
37b10 65 20 61 20 6e 65 77 20 46 54 53 35 20 65 78 70  e a new FTS5 exp
37b20 72 65 73 73 69 6f 6e 20 62 79 20 63 6c 6f 6e 69  ression by cloni
37b30 6e 67 20 70 68 72 61 73 65 20 69 50 68 72 61 73  ng phrase iPhras
37b40 65 20 6f 66 20 74 68 65 0d 0a 2a 2a 20 65 78 70  e of the..** exp
37b50 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
37b60 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
37b70 75 6d 65 6e 74 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  ument...*/..stat
37b80 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ic int sqlite3Ft
37b90 73 35 45 78 70 72 43 6c 6f 6e 65 50 68 72 61 73  s5ExprClonePhras
37ba0 65 28 0d 0a 20 20 46 74 73 35 45 78 70 72 20 2a  e(..  Fts5Expr *
37bb0 70 45 78 70 72 2c 20 0d 0a 20 20 69 6e 74 20 69  pExpr, ..  int i
37bc0 50 68 72 61 73 65 2c 20 0d 0a 20 20 46 74 73 35  Phrase, ..  Fts5
37bd0 45 78 70 72 20 2a 2a 70 70 4e 65 77 0d 0a 29 7b  Expr **ppNew..){
37be0 0d 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
37bf0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
37c00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37c10 64 65 20 2a 2f 0d 0a 20 20 46 74 73 35 45 78 70  de */..  Fts5Exp
37c20 72 50 68 72 61 73 65 20 2a 70 4f 72 69 67 3b 20  rPhrase *pOrig; 
37c30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
37c40 70 68 72 61 73 65 20 65 78 74 72 61 63 74 65 64  phrase extracted
37c50 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0d 0a   from pExpr */..
37c60 20 20 46 74 73 35 45 78 70 72 20 2a 70 4e 65 77    Fts5Expr *pNew
37c70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
37c80 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
37c90 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
37ca0 70 4e 65 77 20 2a 2f 0d 0a 20 20 54 6f 6b 65 6e  pNew */..  Token
37cb0 43 74 78 20 73 43 74 78 20 3d 20 7b 30 2c 30 7d  Ctx sCtx = {0,0}
37cc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
37cd0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72  ntext object for
37ce0 20 66 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69   fts5ParseTokeni
37cf0 7a 65 20 2a 2f 0d 0a 0d 0a 20 20 70 4f 72 69 67  ze */....  pOrig
37d00 20 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72   = pExpr->apExpr
37d10 50 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d 3b  Phrase[iPhrase];
37d20 0d 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35  ..  pNew = (Fts5
37d30 45 78 70 72 2a 29 73 71 6c 69 74 65 33 46 74 73  Expr*)sqlite3Fts
37d40 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
37d50 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
37d60 29 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  ));..  if( rc==S
37d70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
37d80 20 70 4e 65 77 2d 3e 61 70 45 78 70 72 50 68 72   pNew->apExprPhr
37d90 61 73 65 20 3d 20 28 46 74 73 35 45 78 70 72 50  ase = (Fts5ExprP
37da0 68 72 61 73 65 2a 2a 29 73 71 6c 69 74 65 33 46  hrase**)sqlite3F
37db0 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
37dc0 63 2c 20 0d 0a 20 20 20 20 20 20 20 20 73 69 7a  c, ..        siz
37dd0 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61  eof(Fts5ExprPhra
37de0 73 65 2a 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69  se*));..  }..  i
37df0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37e00 20 29 7b 0d 0a 20 20 20 20 70 4e 65 77 2d 3e 70   ){..    pNew->p
37e10 52 6f 6f 74 20 3d 20 28 46 74 73 35 45 78 70 72  Root = (Fts5Expr
37e20 4e 6f 64 65 2a 29 73 71 6c 69 74 65 33 46 74 73  Node*)sqlite3Fts
37e30 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
37e40 20 0d 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f   ..        sizeo
37e50 66 28 46 74 73 35 45 78 70 72 4e 6f 64 65 29 29  f(Fts5ExprNode))
37e60 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20 72 63  ;..  }..  if( rc
37e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a  ==SQLITE_OK ){..
37e80 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d      pNew->pRoot-
37e90 3e 70 4e 65 61 72 20 3d 20 28 46 74 73 35 45 78  >pNear = (Fts5Ex
37ea0 70 72 4e 65 61 72 73 65 74 2a 29 73 71 6c 69 74  prNearset*)sqlit
37eb0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
37ec0 28 26 72 63 2c 20 0d 0a 20 20 20 20 20 20 20 20  (&rc, ..        
37ed0 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e  sizeof(Fts5ExprN
37ee0 65 61 72 73 65 74 29 20 2b 20 73 69 7a 65 6f 66  earset) + sizeof
37ef0 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a  (Fts5ExprPhrase*
37f00 29 29 3b 0d 0a 20 20 7d 0d 0a 20 20 69 66 28 20  ));..  }..  if( 
37f10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37f20 0d 0a 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74  ..    Fts5Colset
37f30 20 2a 70 43 6f 6c 73 65 74 4f 72 69 67 20 3d 20   *pColsetOrig = 
37f40 70 4f 72 69 67 2d 3e 70 4e 6f 64 65 2d 3e 70 4e  pOrig->pNode->pN
37f50 65 61 72 2d 3e 70 43 6f 6c 73 65 74 3b 0d 0a 20  ear->pColset;.. 
37f60 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 4f 72     if( pColsetOr
37f70 69 67 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c  ig ){..      sql
37f80 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
37f90 3b 0d 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6c  ;..      Fts5Col
37fa0 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 0d 0a 20  set *pColset;.. 
37fb0 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a       nByte = siz
37fc0 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74 29 20  eof(Fts5Colset) 
37fd0 2b 20 28 70 43 6f 6c 73 65 74 4f 72 69 67 2d 3e  + (pColsetOrig->
37fe0 6e 43 6f 6c 2d 31 29 20 2a 20 73 69 7a 65 6f 66  nCol-1) * sizeof
37ff0 28 69 6e 74 29 3b 0d 0a 20 20 20 20 20 20 70 43  (int);..      pC
38000 6f 6c 73 65 74 20 3d 20 28 46 74 73 35 43 6f 6c  olset = (Fts5Col
38010 73 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  set*)sqlite3Fts5
38020 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
38030 6e 42 79 74 65 29 3b 0d 0a 20 20 20 20 20 20 69  nByte);..      i
38040 66 28 20 70 43 6f 6c 73 65 74 20 29 7b 20 0d 0a  f( pColset ){ ..
38050 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
38060 43 6f 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74 4f  Colset, pColsetO
38070 72 69 67 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79  rig, (size_t)nBy
38080 74 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  te);..      }.. 
38090 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74       pNew->pRoot
380a0 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  ->pNear->pColset
380b0 20 3d 20 70 43 6f 6c 73 65 74 3b 0d 0a 20 20 20   = pColset;..   
380c0 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 66 28   }..  }....  if(
380d0 20 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 20 29 7b   pOrig->nTerm ){
380e0 0d 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  ..    int i;    
380f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38100 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
38110 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
38120 20 70 68 72 61 73 65 20 74 65 72 6d 73 20 2a 2f   phrase terms */
38130 0d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  ..    for(i=0; r
38140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
38150 69 3c 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 3b 20  i<pOrig->nTerm; 
38160 69 2b 2b 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74  i++){..      int
38170 20 74 66 6c 61 67 73 20 3d 20 30 3b 0d 0a 20 20   tflags = 0;..  
38180 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
38190 20 2a 70 3b 0d 0a 20 20 20 20 20 20 66 6f 72 28   *p;..      for(
381a0 70 3d 26 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b  p=&pOrig->aTerm[
381b0 69 5d 3b 20 70 20 26 26 20 72 63 3d 3d 53 51 4c  i]; p && rc==SQL
381c0 49 54 45 5f 4f 4b 3b 20 70 3d 70 2d 3e 70 53 79  ITE_OK; p=p->pSy
381d0 6e 6f 6e 79 6d 29 7b 0d 0a 20 20 20 20 20 20 20  nonym){..       
381e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
381f0 72 6d 20 3d 20 70 2d 3e 7a 54 65 72 6d 3b 0d 0a  rm = p->zTerm;..
38200 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
38210 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65 28 28  5ParseTokenize((
38220 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 74 66 6c  void*)&sCtx, tfl
38230 61 67 73 2c 20 7a 54 65 72 6d 2c 20 28 69 6e 74  ags, zTerm, (int
38240 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0d  )strlen(zTerm),.
38250 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  .            0, 
38260 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 74 66 6c  0);..        tfl
38270 61 67 73 20 3d 20 46 54 53 35 5f 54 4f 4b 45 4e  ags = FTS5_TOKEN
38280 5f 43 4f 4c 4f 43 41 54 45 44 3b 0d 0a 20 20 20  _COLOCATED;..   
38290 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
382a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
382b0 0d 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ..        sCtx.p
382c0 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 5d  Phrase->aTerm[i]
382d0 2e 62 50 72 65 66 69 78 20 3d 20 70 4f 72 69 67  .bPrefix = pOrig
382e0 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 50 72 65 66  ->aTerm[i].bPref
382f0 69 78 3b 0d 0a 20 20 20 20 20 20 20 20 73 43 74  ix;..        sCt
38300 78 2e 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  x.pPhrase->aTerm
38310 5b 69 5d 2e 62 46 69 72 73 74 20 3d 20 70 4f 72  [i].bFirst = pOr
38320 69 67 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 46 69  ig->aTerm[i].bFi
38330 72 73 74 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  rst;..      }.. 
38340 20 20 20 7d 0d 0a 20 20 7d 65 6c 73 65 7b