/ Hex Artifact Content
Login

Artifact 1cd79854cb21543e66507b25b0578bc1b20aa6a1349b7feceb8e8fed0e7a77a6:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 20 4d 61 79 20 30  /*.** 2015 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 69 73 20 61 6e 20 53 51 4c 69 74 65 20 76 69   is an SQLite vi
0190: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
01a0: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  le implementing 
01b0: 64 69 72 65 63 74 20 61 63 63 65 73 73 20 74 6f  direct access to
01c0: 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
01d0: 46 54 53 35 20 69 6e 64 65 78 2e 20 54 68 65 20  FTS5 index. The 
01e0: 6d 6f 64 75 6c 65 20 6d 61 79 20 63 72 65 61 74  module may creat
01f0: 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  e several differ
0200: 65 6e 74 20 74 79 70 65 73 20 6f 66 20 0a 2a 2a  ent types of .**
0210: 20 74 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 63   tables:.**.** c
0220: 6f 6c 3a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  ol:.**     CREAT
0230: 45 20 54 41 42 4c 45 20 76 6f 63 61 62 28 74 65  E TABLE vocab(te
0240: 72 6d 2c 20 63 6f 6c 2c 20 64 6f 63 2c 20 63 6e  rm, col, doc, cn
0250: 74 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 74  t, PRIMARY KEY(t
0260: 65 72 6d 2c 20 63 6f 6c 29 29 3b 0a 2a 2a 0a 2a  erm, col));.**.*
0270: 2a 20 20 20 4f 6e 65 20 72 6f 77 20 66 6f 72 20  *   One row for 
0280: 65 61 63 68 20 74 65 72 6d 2f 63 6f 6c 75 6d 6e  each term/column
0290: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 54 68   combination. Th
02a0: 65 20 76 61 6c 75 65 20 6f 66 20 24 64 6f 63 20  e value of $doc 
02b0: 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 74  is set to.**   t
02c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 74 73  he number of fts
02d0: 35 20 72 6f 77 73 20 74 68 61 74 20 63 6f 6e 74  5 rows that cont
02e0: 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
02f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 65 72   instance of ter
0300: 6d 0a 2a 2a 20 20 20 24 74 65 72 6d 20 77 69 74  m.**   $term wit
0310: 68 69 6e 20 63 6f 6c 75 6d 6e 20 24 63 6f 6c 2e  hin column $col.
0320: 20 46 69 65 6c 64 20 24 63 6e 74 20 69 73 20 73   Field $cnt is s
0330: 65 74 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  et to the total 
0340: 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 20 20  number of .**   
0350: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 65 72  instances of ter
0360: 6d 20 24 74 65 72 6d 20 69 6e 20 63 6f 6c 75 6d  m $term in colum
0370: 6e 20 24 63 6f 6c 20 28 69 6e 20 61 6e 79 20 72  n $col (in any r
0380: 6f 77 20 6f 66 20 74 68 65 20 66 74 73 35 20 74  ow of the fts5 t
0390: 61 62 6c 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 72 6f  able). .**.** ro
03a0: 77 3a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45  w:.**     CREATE
03b0: 20 54 41 42 4c 45 20 76 6f 63 61 62 28 74 65 72   TABLE vocab(ter
03c0: 6d 2c 20 64 6f 63 2c 20 63 6e 74 2c 20 50 52 49  m, doc, cnt, PRI
03d0: 4d 41 52 59 20 4b 45 59 28 74 65 72 6d 29 29 3b  MARY KEY(term));
03e0: 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 65 20 72 6f 77  .**.**   One row
03f0: 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
0400: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
0410: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 24 64 6f  The value of $do
0420: 63 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 20  c is set to.**  
0430: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
0440: 74 73 35 20 72 6f 77 73 20 74 68 61 74 20 63 6f  ts5 rows that co
0450: 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f  ntain at least o
0460: 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
0470: 65 72 6d 0a 2a 2a 20 20 20 24 74 65 72 6d 2e 20  erm.**   $term. 
0480: 46 69 65 6c 64 20 24 63 6e 74 20 69 73 20 73 65  Field $cnt is se
0490: 74 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  t to the total n
04a0: 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63  umber of instanc
04b0: 65 73 20 6f 66 20 74 65 72 6d 20 0a 2a 2a 20 20  es of term .**  
04c0: 20 24 74 65 72 6d 20 69 6e 20 74 68 65 20 64 61   $term in the da
04d0: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 69 6e  tabase..**.** in
04e0: 73 74 61 6e 63 65 3a 0a 2a 2a 20 20 20 20 20 43  stance:.**     C
04f0: 52 45 41 54 45 20 54 41 42 4c 45 20 76 6f 63 61  REATE TABLE voca
0500: 62 28 74 65 72 6d 2c 20 64 6f 63 2c 20 63 6f 6c  b(term, doc, col
0510: 2c 20 6f 66 66 73 65 74 2c 20 50 52 49 4d 41 52  , offset, PRIMAR
0520: 59 20 4b 45 59 28 3c 61 6c 6c 2d 66 69 65 6c 64  Y KEY(<all-field
0530: 73 3e 29 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e  s>));.**.**   On
0540: 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 74  e row for each t
0550: 65 72 6d 20 69 6e 73 74 61 6e 63 65 20 69 6e 20  erm instance in 
0560: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a  the database. .*
0570: 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 74  /...#include "ft
0580: 73 35 49 6e 74 2e 68 22 0a 0a 0a 74 79 70 65 64  s5Int.h"...typed
0590: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 56 6f  ef struct Fts5Vo
05a0: 63 61 62 54 61 62 6c 65 20 46 74 73 35 56 6f 63  cabTable Fts5Voc
05b0: 61 62 54 61 62 6c 65 3b 0a 74 79 70 65 64 65 66  abTable;.typedef
05c0: 20 73 74 72 75 63 74 20 46 74 73 35 56 6f 63 61   struct Fts5Voca
05d0: 62 43 75 72 73 6f 72 20 46 74 73 35 56 6f 63 61  bCursor Fts5Voca
05e0: 62 43 75 72 73 6f 72 3b 0a 0a 73 74 72 75 63 74  bCursor;..struct
05f0: 20 46 74 73 35 56 6f 63 61 62 54 61 62 6c 65 20   Fts5VocabTable 
0600: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
0610: 20 62 61 73 65 3b 0a 20 20 63 68 61 72 20 2a 7a   base;.  char *z
0620: 46 74 73 35 54 62 6c 3b 20 20 20 20 20 20 20 20  Fts5Tbl;        
0630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0640: 20 6f 66 20 66 74 73 35 20 74 61 62 6c 65 20 2a   of fts5 table *
0650: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 74 73 35 44  /.  char *zFts5D
0660: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0670: 20 20 20 20 2f 2a 20 44 62 20 63 6f 6e 74 61 69      /* Db contai
0680: 6e 69 6e 67 20 66 74 73 35 20 74 61 62 6c 65 20  ning fts5 table 
0690: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
06a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
06b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
06c0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
06d0: 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c  5Global *pGlobal
06e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
06f0: 46 54 53 35 20 67 6c 6f 62 61 6c 20 6f 62 6a 65  FTS5 global obje
0700: 63 74 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ct for this data
0710: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54  base */.  int eT
0720: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
0730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
0740: 35 5f 56 4f 43 41 42 5f 43 4f 4c 2c 20 52 4f 57  5_VOCAB_COL, ROW
0750: 20 6f 72 20 49 4e 53 54 41 4e 43 45 20 2a 2f 0a   or INSTANCE */.
0760: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 56  };..struct Fts5V
0770: 6f 63 61 62 43 75 72 73 6f 72 20 7b 0a 20 20 73  ocabCursor {.  s
0780: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
0790: 6f 72 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74  or base;.  sqlit
07a0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
07b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
07c0: 61 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67 20  atement holding 
07d0: 6c 6f 63 6b 20 6f 6e 20 70 49 6e 64 65 78 20 2a  lock on pIndex *
07e0: 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  /.  Fts5Index *p
07f0: 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
0800: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
0810: 64 20 46 54 53 35 20 69 6e 64 65 78 20 2a 2f 0a  d FTS5 index */.
0820: 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20  .  int bEof;    
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
0850: 69 73 20 63 75 72 73 6f 72 20 69 73 20 61 74 20  is cursor is at 
0860: 45 4f 46 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  EOF */.  Fts5Ind
0870: 65 78 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20  exIter *pIter;  
0880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
0890: 2f 72 6f 77 69 64 20 69 74 65 72 61 74 6f 72 20  /rowid iterator 
08a0: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 69 6e 74  object */..  int
08b0: 20 6e 4c 65 54 65 72 6d 3b 20 20 20 20 20 20 20   nLeTerm;       
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
08d0: 53 69 7a 65 20 6f 66 20 7a 4c 65 54 65 72 6d 20  Size of zLeTerm 
08e0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
08f0: 61 72 20 2a 7a 4c 65 54 65 72 6d 3b 20 20 20 20  ar *zLeTerm;    
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0910: 20 28 74 65 72 6d 20 3c 3d 20 24 7a 4c 65 54 65   (term <= $zLeTe
0920: 72 6d 29 20 70 61 72 61 6d 61 74 65 72 2c 20 6f  rm) paramater, o
0930: 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 2f 2a 20  r NULL */..  /* 
0940: 54 68 65 73 65 20 61 72 65 20 75 73 65 64 20 62  These are used b
0950: 79 20 27 63 6f 6c 27 20 74 61 62 6c 65 73 20 6f  y 'col' tables o
0960: 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  nly */.  Fts5Con
0970: 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20 20  fig *pConfig;   
0980: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35           /* Fts5
0990: 20 74 61 62 6c 65 20 63 6f 6e 66 69 67 75 72 61   table configura
09a0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tion */.  int iC
09b0: 6f 6c 3b 0a 20 20 69 36 34 20 2a 61 43 6e 74 3b  ol;.  i64 *aCnt;
09c0: 0a 20 20 69 36 34 20 2a 61 44 6f 63 3b 0a 0a 20  .  i64 *aDoc;.. 
09d0: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 6c 75 65   /* Output value
09e0: 73 20 75 73 65 64 20 62 79 20 61 6c 6c 20 74 61  s used by all ta
09f0: 62 6c 65 73 2e 20 2a 2f 0a 20 20 69 36 34 20 72  bles. */.  i64 r
0a00: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
0a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0a20: 69 73 20 74 61 62 6c 65 27 73 20 63 75 72 72 65  is table's curre
0a30: 6e 74 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a  nt rowid value *
0a40: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
0a50: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
0a60: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 76      /* Current v
0a70: 61 6c 75 65 20 6f 66 20 27 74 65 72 6d 27 20 63  alue of 'term' c
0a80: 6f 6c 75 6d 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  olumn */..  /* O
0a90: 75 74 70 75 74 20 76 61 6c 75 65 73 20 55 73 65  utput values Use
0aa0: 64 20 62 79 20 27 69 6e 73 74 61 6e 63 65 27 20  d by 'instance' 
0ab0: 74 61 62 6c 65 73 20 6f 6e 6c 79 20 2a 2f 0a 20  tables only */. 
0ac0: 20 69 36 34 20 69 49 6e 73 74 50 6f 73 3b 0a 20   i64 iInstPos;. 
0ad0: 20 69 6e 74 20 69 49 6e 73 74 4f 66 66 3b 0a 7d   int iInstOff;.}
0ae0: 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  ;..#define FTS5_
0af0: 56 4f 43 41 42 5f 43 4f 4c 20 20 20 20 20 20 30  VOCAB_COL      0
0b00: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 56 4f  .#define FTS5_VO
0b10: 43 41 42 5f 52 4f 57 20 20 20 20 20 20 31 0a 23  CAB_ROW      1.#
0b20: 64 65 66 69 6e 65 20 46 54 53 35 5f 56 4f 43 41  define FTS5_VOCA
0b30: 42 5f 49 4e 53 54 41 4e 43 45 20 32 0a 0a 23 64  B_INSTANCE 2..#d
0b40: 65 66 69 6e 65 20 46 54 53 35 5f 56 4f 43 41 42  efine FTS5_VOCAB
0b50: 5f 43 4f 4c 5f 53 43 48 45 4d 41 20 20 22 74 65  _COL_SCHEMA  "te
0b60: 72 6d 2c 20 63 6f 6c 2c 20 64 6f 63 2c 20 63 6e  rm, col, doc, cn
0b70: 74 22 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  t".#define FTS5_
0b80: 56 4f 43 41 42 5f 52 4f 57 5f 53 43 48 45 4d 41  VOCAB_ROW_SCHEMA
0b90: 20 20 22 74 65 72 6d 2c 20 64 6f 63 2c 20 63 6e    "term, doc, cn
0ba0: 74 22 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  t".#define FTS5_
0bb0: 56 4f 43 41 42 5f 49 4e 53 54 5f 53 43 48 45 4d  VOCAB_INST_SCHEM
0bc0: 41 20 22 74 65 72 6d 2c 20 64 6f 63 2c 20 63 6f  A "term, doc, co
0bd0: 6c 2c 20 6f 66 66 73 65 74 22 0a 0a 2f 2a 0a 2a  l, offset"../*.*
0be0: 2a 20 42 69 74 73 20 66 6f 72 20 74 68 65 20 6d  * Bits for the m
0bf0: 61 73 6b 20 75 73 65 64 20 61 73 20 74 68 65 20  ask used as the 
0c00: 69 64 78 4e 75 6d 20 76 61 6c 75 65 20 62 79 20  idxNum value by 
0c10: 78 42 65 73 74 49 6e 64 65 78 2f 78 46 69 6c 74  xBestIndex/xFilt
0c20: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  er..*/.#define F
0c30: 54 53 35 5f 56 4f 43 41 42 5f 54 45 52 4d 5f 45  TS5_VOCAB_TERM_E
0c40: 51 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46  Q 0x01.#define F
0c50: 54 53 35 5f 56 4f 43 41 42 5f 54 45 52 4d 5f 47  TS5_VOCAB_TERM_G
0c60: 45 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 46  E 0x02.#define F
0c70: 54 53 35 5f 56 4f 43 41 42 5f 54 45 52 4d 5f 4c  TS5_VOCAB_TERM_L
0c80: 45 20 30 78 30 34 0a 0a 0a 2f 2a 0a 2a 2a 20 54  E 0x04.../*.** T
0c90: 72 61 6e 73 6c 61 74 65 20 61 20 73 74 72 69 6e  ranslate a strin
0ca0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  g containing an 
0cb0: 66 74 73 35 76 6f 63 61 62 20 74 61 62 6c 65 20  fts5vocab table 
0cc0: 74 79 70 65 20 74 6f 20 61 6e 20 0a 2a 2a 20 46  type to an .** F
0cd0: 54 53 35 5f 56 4f 43 41 42 5f 58 58 58 20 63 6f  TS5_VOCAB_XXX co
0ce0: 6e 73 74 61 6e 74 2e 20 49 66 20 73 75 63 63 65  nstant. If succe
0cf0: 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 65 54 79  ssful, set *peTy
0d00: 70 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  pe to the output
0d10: 0a 2a 2a 20 76 61 6c 75 65 20 61 6e 64 20 72 65  .** value and re
0d20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
0d30: 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a  Otherwise, set *
0d40: 70 7a 45 72 72 20 74 6f 20 61 6e 20 65 72 72 6f  pzErr to an erro
0d50: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 61 6e 64  r message.** and
0d60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
0d70: 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  RROR..*/.static 
0d80: 69 6e 74 20 66 74 73 35 56 6f 63 61 62 54 61 62  int fts5VocabTab
0d90: 6c 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  leType(const cha
0da0: 72 20 2a 7a 54 79 70 65 2c 20 63 68 61 72 20 2a  r *zType, char *
0db0: 2a 70 7a 45 72 72 2c 20 69 6e 74 20 2a 70 65 54  *pzErr, int *peT
0dc0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
0dd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
0de0: 61 72 20 2a 7a 43 6f 70 79 20 3d 20 73 71 6c 69  ar *zCopy = sqli
0df0: 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26  te3Fts5Strndup(&
0e00: 72 63 2c 20 7a 54 79 70 65 2c 20 2d 31 29 3b 0a  rc, zType, -1);.
0e10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
0e20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
0e30: 65 33 46 74 73 35 44 65 71 75 6f 74 65 28 7a 43  e3Fts5Dequote(zC
0e40: 6f 70 79 29 3b 0a 20 20 20 20 69 66 28 20 73 71  opy);.    if( sq
0e50: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 43  lite3_stricmp(zC
0e60: 6f 70 79 2c 20 22 63 6f 6c 22 29 3d 3d 30 20 29  opy, "col")==0 )
0e70: 7b 0a 20 20 20 20 20 20 2a 70 65 54 79 70 65 20  {.      *peType 
0e80: 3d 20 46 54 53 35 5f 56 4f 43 41 42 5f 43 4f 4c  = FTS5_VOCAB_COL
0e90: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
0ea0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
0eb0: 69 63 6d 70 28 7a 43 6f 70 79 2c 20 22 72 6f 77  icmp(zCopy, "row
0ec0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ")==0 ){.      *
0ed0: 70 65 54 79 70 65 20 3d 20 46 54 53 35 5f 56 4f  peType = FTS5_VO
0ee0: 43 41 42 5f 52 4f 57 3b 0a 20 20 20 20 7d 65 6c  CAB_ROW;.    }el
0ef0: 73 65 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  se.    if( sqlit
0f00: 65 33 5f 73 74 72 69 63 6d 70 28 7a 43 6f 70 79  e3_stricmp(zCopy
0f10: 2c 20 22 69 6e 73 74 61 6e 63 65 22 29 3d 3d 30  , "instance")==0
0f20: 20 29 7b 0a 20 20 20 20 20 20 2a 70 65 54 79 70   ){.      *peTyp
0f30: 65 20 3d 20 46 54 53 35 5f 56 4f 43 41 42 5f 49  e = FTS5_VOCAB_I
0f40: 4e 53 54 41 4e 43 45 3b 0a 20 20 20 20 7d 65 6c  NSTANCE;.    }el
0f50: 73 65 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 2a  se.    {.      *
0f60: 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
0f70: 6d 70 72 69 6e 74 66 28 22 66 74 73 35 76 6f 63  mprintf("fts5voc
0f80: 61 62 3a 20 75 6e 6b 6e 6f 77 6e 20 74 61 62 6c  ab: unknown tabl
0f90: 65 20 74 79 70 65 3a 20 25 51 22 2c 20 7a 43 6f  e type: %Q", zCo
0fa0: 70 79 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  py);.      rc = 
0fb0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
0fc0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
0fd0: 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20 20 7d  free(zCopy);.  }
0fe0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
0ff0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 44 69  .../*.** The xDi
1000: 73 63 6f 6e 6e 65 63 74 28 29 20 76 69 72 74 75  sconnect() virtu
1010: 61 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e  al table method.
1020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1030: 74 73 35 56 6f 63 61 62 44 69 73 63 6f 6e 6e 65  ts5VocabDisconne
1040: 63 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  ctMethod(sqlite3
1050: 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
1060: 20 46 74 73 35 56 6f 63 61 62 54 61 62 6c 65 20   Fts5VocabTable 
1070: 2a 70 54 61 62 20 3d 20 28 46 74 73 35 56 6f 63  *pTab = (Fts5Voc
1080: 61 62 54 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a  abTable*)pVtab;.
1090: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10a0: 54 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Tab);.  return S
10b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10c0: 2a 2a 20 54 68 65 20 78 44 65 73 74 72 6f 79 28  ** The xDestroy(
10d0: 29 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  ) virtual table 
10e0: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
10f0: 63 20 69 6e 74 20 66 74 73 35 56 6f 63 61 62 44  c int fts5VocabD
1100: 65 73 74 72 6f 79 4d 65 74 68 6f 64 28 73 71 6c  estroyMethod(sql
1110: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1120: 29 7b 0a 20 20 46 74 73 35 56 6f 63 61 62 54 61  ){.  Fts5VocabTa
1130: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73  ble *pTab = (Fts
1140: 35 56 6f 63 61 62 54 61 62 6c 65 2a 29 70 56 74  5VocabTable*)pVt
1150: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ab;.  sqlite3_fr
1160: 65 65 28 70 54 61 62 29 3b 0a 20 20 72 65 74 75  ee(pTab);.  retu
1170: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1180: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1190: 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c  tion is the impl
11a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f  ementation of bo
11b0: 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 20  th the xConnect 
11c0: 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a 20 6d  and xCreate.** m
11d0: 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 46 54  ethods of the FT
11e0: 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  S3 virtual table
11f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 76  ..**.** The argv
1200: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
1210: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
1220: 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30 5d  .**.**   argv[0]
1230: 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d     -> module nam
1240: 65 20 20 28 22 66 74 73 35 76 6f 63 61 62 22 29  e  ("fts5vocab")
1250: 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d 20 20 20  .**   argv[1]   
1260: 2d 3e 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  -> database name
1270: 0a 2a 2a 20 20 20 61 72 67 76 5b 32 5d 20 20 20  .**   argv[2]   
1280: 2d 3e 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a  -> table name.**
1290: 0a 2a 2a 20 74 68 65 6e 3a 0a 2a 2a 0a 2a 2a 20  .** then:.**.** 
12a0: 20 20 61 72 67 76 5b 33 5d 20 20 20 2d 3e 20 6e    argv[3]   -> n
12b0: 61 6d 65 20 6f 66 20 66 74 73 35 20 74 61 62 6c  ame of fts5 tabl
12c0: 65 0a 2a 2a 20 20 20 61 72 67 76 5b 34 5d 20 20  e.**   argv[4]  
12d0: 20 2d 3e 20 74 79 70 65 20 6f 66 20 66 74 73 35   -> type of fts5
12e0: 76 6f 63 61 62 20 74 61 62 6c 65 0a 2a 2a 0a 2a  vocab table.**.*
12f0: 2a 20 6f 72 2c 20 66 6f 72 20 74 61 62 6c 65 73  * or, for tables
1300: 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73 63 68   in the TEMP sch
1310: 65 6d 61 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ema only..**.** 
1320: 20 20 61 72 67 76 5b 33 5d 20 20 20 2d 3e 20 6e    argv[3]   -> n
1330: 61 6d 65 20 6f 66 20 66 74 73 35 20 74 61 62 6c  ame of fts5 tabl
1340: 65 73 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  es database.**  
1350: 20 61 72 67 76 5b 34 5d 20 20 20 2d 3e 20 6e 61   argv[4]   -> na
1360: 6d 65 20 6f 66 20 66 74 73 35 20 74 61 62 6c 65  me of fts5 table
1370: 0a 2a 2a 20 20 20 61 72 67 76 5b 35 5d 20 20 20  .**   argv[5]   
1380: 2d 3e 20 74 79 70 65 20 6f 66 20 66 74 73 35 76  -> type of fts5v
1390: 6f 63 61 62 20 74 61 62 6c 65 0a 2a 2f 0a 73 74  ocab table.*/.st
13a0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 56 6f 63  atic int fts5Voc
13b0: 61 62 49 6e 69 74 56 74 61 62 28 0a 20 20 73 71  abInitVtab(.  sq
13c0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13e0: 20 54 68 65 20 53 51 4c 69 74 65 20 64 61 74 61   The SQLite data
13f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1400: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  */.  void *pAux,
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1430: 74 6f 20 46 74 73 35 47 6c 6f 62 61 6c 20 6f 62  to Fts5Global ob
1440: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 72  ject */.  int ar
1450: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1470: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1480: 69 6e 20 61 72 67 76 20 61 72 72 61 79 20 2a 2f  in argv array */
1490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  .  const char * 
14a0: 63 6f 6e 73 74 20 2a 61 72 67 76 2c 20 20 20 20  const *argv,    
14b0: 20 20 20 2f 2a 20 78 43 72 65 61 74 65 2f 78 43     /* xCreate/xC
14c0: 6f 6e 6e 65 63 74 20 61 72 67 75 6d 65 6e 74 20  onnect argument 
14d0: 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74  array */.  sqlit
14e0: 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62  e3_vtab **ppVTab
14f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ,          /* Wr
1500: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ite the resultin
1510: 67 20 76 74 61 62 20 73 74 72 75 63 74 75 72 65  g vtab structure
1520: 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20   here */.  char 
1530: 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20 20  **pzErr         
1540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1550: 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
1560: 73 73 61 67 65 20 68 65 72 65 20 2a 2f 0a 29 7b  ssage here */.){
1570: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
1580: 7a 53 63 68 65 6d 61 5b 5d 20 3d 20 7b 20 0a 20  zSchema[] = { . 
1590: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 6c 45     "CREATE TABlE
15a0: 20 76 6f 63 61 62 28 22 20 46 54 53 35 5f 56 4f   vocab(" FTS5_VO
15b0: 43 41 42 5f 43 4f 4c 5f 53 43 48 45 4d 41 20 20  CAB_COL_SCHEMA  
15c0: 22 29 22 2c 20 0a 20 20 20 20 22 43 52 45 41 54  ")", .    "CREAT
15d0: 45 20 54 41 42 6c 45 20 76 6f 63 61 62 28 22 20  E TABlE vocab(" 
15e0: 46 54 53 35 5f 56 4f 43 41 42 5f 52 4f 57 5f 53  FTS5_VOCAB_ROW_S
15f0: 43 48 45 4d 41 20 20 22 29 22 2c 0a 20 20 20 20  CHEMA  ")",.    
1600: 22 43 52 45 41 54 45 20 54 41 42 6c 45 20 76 6f  "CREATE TABlE vo
1610: 63 61 62 28 22 20 46 54 53 35 5f 56 4f 43 41 42  cab(" FTS5_VOCAB
1620: 5f 49 4e 53 54 5f 53 43 48 45 4d 41 20 22 29 22  _INST_SCHEMA ")"
1630: 0a 20 20 7d 3b 0a 0a 20 20 46 74 73 35 56 6f 63  .  };..  Fts5Voc
1640: 61 62 54 61 62 6c 65 20 2a 70 52 65 74 20 3d 20  abTable *pRet = 
1650: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
1660: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1670: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1680: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 62  ode */.  int bDb
1690: 3b 0a 0a 20 20 62 44 62 20 3d 20 28 61 72 67 63  ;..  bDb = (argc
16a0: 3d 3d 36 20 26 26 20 73 74 72 6c 65 6e 28 61 72  ==6 && strlen(ar
16b0: 67 76 5b 31 5d 29 3d 3d 34 20 26 26 20 6d 65 6d  gv[1])==4 && mem
16c0: 63 6d 70 28 22 74 65 6d 70 22 2c 20 61 72 67 76  cmp("temp", argv
16d0: 5b 31 5d 2c 20 34 29 3d 3d 30 29 3b 0a 0a 20 20  [1], 4)==0);..  
16e0: 69 66 28 20 61 72 67 63 21 3d 35 20 26 26 20 62  if( argc!=5 && b
16f0: 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a  Db==0 ){.    *pz
1700: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
1710: 72 69 6e 74 66 28 22 77 72 6f 6e 67 20 6e 75 6d  rintf("wrong num
1720: 62 65 72 20 6f 66 20 76 74 61 62 6c 65 20 61 72  ber of vtable ar
1730: 67 75 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 72  guments");.    r
1740: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1750: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1760: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1780: 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
1790: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
17a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17b0: 7a 44 62 20 3d 20 62 44 62 20 3f 20 61 72 67 76  zDb = bDb ? argv
17c0: 5b 33 5d 20 3a 20 61 72 67 76 5b 31 5d 3b 0a 20  [3] : argv[1];. 
17d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17e0: 54 61 62 20 3d 20 62 44 62 20 3f 20 61 72 67 76  Tab = bDb ? argv
17f0: 5b 34 5d 20 3a 20 61 72 67 76 5b 33 5d 3b 0a 20  [4] : argv[3];. 
1800: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1810: 54 79 70 65 20 3d 20 62 44 62 20 3f 20 61 72 67  Type = bDb ? arg
1820: 76 5b 35 5d 20 3a 20 61 72 67 76 5b 34 5d 3b 0a  v[5] : argv[4];.
1830: 20 20 20 20 69 6e 74 20 6e 44 62 20 3d 20 28 69      int nDb = (i
1840: 6e 74 29 73 74 72 6c 65 6e 28 7a 44 62 29 2b 31  nt)strlen(zDb)+1
1850: 3b 20 0a 20 20 20 20 69 6e 74 20 6e 54 61 62 20  ; .    int nTab 
1860: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  = (int)strlen(zT
1870: 61 62 29 2b 31 3b 0a 20 20 20 20 69 6e 74 20 65  ab)+1;.    int e
1880: 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 0a 20  Type = 0;.    . 
1890: 20 20 20 72 63 20 3d 20 66 74 73 35 56 6f 63 61     rc = fts5Voca
18a0: 62 54 61 62 6c 65 54 79 70 65 28 7a 54 79 70 65  bTableType(zType
18b0: 2c 20 70 7a 45 72 72 2c 20 26 65 54 79 70 65 29  , pzErr, &eType)
18c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
18d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18e0: 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3e 3d   assert( eType>=
18f0: 30 20 26 26 20 65 54 79 70 65 3c 41 72 72 61 79  0 && eType<Array
1900: 53 69 7a 65 28 61 7a 53 63 68 65 6d 61 29 20 29  Size(azSchema) )
1910: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1920: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
1930: 62 28 64 62 2c 20 61 7a 53 63 68 65 6d 61 5b 65  b(db, azSchema[e
1940: 54 79 70 65 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20  Type]);.    }.. 
1950: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
1960: 66 28 46 74 73 35 56 6f 63 61 62 54 61 62 6c 65  f(Fts5VocabTable
1970: 29 20 2b 20 6e 44 62 20 2b 20 6e 54 61 62 3b 0a  ) + nDb + nTab;.
1980: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
1990: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
19a0: 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  (&rc, nByte);.  
19b0: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
19c0: 20 20 20 20 70 52 65 74 2d 3e 70 47 6c 6f 62 61      pRet->pGloba
19d0: 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61 6c 2a  l = (Fts5Global*
19e0: 29 70 41 75 78 3b 0a 20 20 20 20 20 20 70 52 65  )pAux;.      pRe
19f0: 74 2d 3e 65 54 79 70 65 20 3d 20 65 54 79 70 65  t->eType = eType
1a00: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 64 62  ;.      pRet->db
1a10: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 52 65   = db;.      pRe
1a20: 74 2d 3e 7a 46 74 73 35 54 62 6c 20 3d 20 28 63  t->zFts5Tbl = (c
1a30: 68 61 72 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20  har*)&pRet[1];. 
1a40: 20 20 20 20 20 70 52 65 74 2d 3e 7a 46 74 73 35       pRet->zFts5
1a50: 44 62 20 3d 20 26 70 52 65 74 2d 3e 7a 46 74 73  Db = &pRet->zFts
1a60: 35 54 62 6c 5b 6e 54 61 62 5d 3b 0a 20 20 20 20  5Tbl[nTab];.    
1a70: 20 20 6d 65 6d 63 70 79 28 70 52 65 74 2d 3e 7a    memcpy(pRet->z
1a80: 46 74 73 35 54 62 6c 2c 20 7a 54 61 62 2c 20 6e  Fts5Tbl, zTab, n
1a90: 54 61 62 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  Tab);.      memc
1aa0: 70 79 28 70 52 65 74 2d 3e 7a 46 74 73 35 44 62  py(pRet->zFts5Db
1ab0: 2c 20 7a 44 62 2c 20 6e 44 62 29 3b 0a 20 20 20  , zDb, nDb);.   
1ac0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 44 65     sqlite3Fts5De
1ad0: 71 75 6f 74 65 28 70 52 65 74 2d 3e 7a 46 74 73  quote(pRet->zFts
1ae0: 35 54 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  5Tbl);.      sql
1af0: 69 74 65 33 46 74 73 35 44 65 71 75 6f 74 65 28  ite3Fts5Dequote(
1b00: 70 52 65 74 2d 3e 7a 46 74 73 35 44 62 29 3b 0a  pRet->zFts5Db);.
1b10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
1b20: 56 54 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f  VTab = (sqlite3_
1b30: 76 74 61 62 2a 29 70 52 65 74 3b 0a 20 20 72 65  vtab*)pRet;.  re
1b40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1b50: 2a 2a 20 54 68 65 20 78 43 6f 6e 6e 65 63 74 28  ** The xConnect(
1b60: 29 20 61 6e 64 20 78 43 72 65 61 74 65 28 29 20  ) and xCreate() 
1b70: 6d 65 74 68 6f 64 73 20 66 6f 72 20 74 68 65 20  methods for the 
1b80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 41  virtual table. A
1b90: 6c 6c 20 74 68 65 0a 2a 2a 20 77 6f 72 6b 20 69  ll the.** work i
1ba0: 73 20 64 6f 6e 65 20 69 6e 20 66 75 6e 63 74 69  s done in functi
1bb0: 6f 6e 20 66 74 73 35 56 6f 63 61 62 49 6e 69 74  on fts5VocabInit
1bc0: 56 74 61 62 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Vtab()..*/.stati
1bd0: 63 20 69 6e 74 20 66 74 73 35 56 6f 63 61 62 43  c int fts5VocabC
1be0: 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 0a 20 20  onnectMethod(.  
1bf0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1c20: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  ection */.  void
1c30: 20 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20 20   *pAux,         
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c50: 6f 69 6e 74 65 72 20 74 6f 20 74 6f 6b 65 6e 69  ointer to tokeni
1c60: 7a 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  zer hash table *
1c70: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ca0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72 67   elements in arg
1cb0: 76 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e  v array */.  con
1cc0: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
1cd0: 2a 61 72 67 76 2c 20 20 20 20 20 20 20 2f 2a 20  *argv,       /* 
1ce0: 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74  xCreate/xConnect
1cf0: 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20   argument array 
1d00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  */.  sqlite3_vta
1d10: 62 20 2a 2a 70 70 56 74 61 62 2c 20 20 20 20 20  b **ppVtab,     
1d20: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
1d30: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62   sqlite3_vtab ob
1d40: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
1d50: 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20  *pzErr          
1d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1d70: 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  : sqlite3_malloc
1d80: 27 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  'd error message
1d90: 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1da0: 66 74 73 35 56 6f 63 61 62 49 6e 69 74 56 74 61  fts5VocabInitVta
1db0: 62 28 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63  b(db, pAux, argc
1dc0: 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20  , argv, ppVtab, 
1dd0: 70 7a 45 72 72 29 3b 0a 7d 0a 73 74 61 74 69 63  pzErr);.}.static
1de0: 20 69 6e 74 20 66 74 73 35 56 6f 63 61 62 43 72   int fts5VocabCr
1df0: 65 61 74 65 4d 65 74 68 6f 64 28 0a 20 20 73 71  eateMethod(.  sq
1e00: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1e30: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
1e40: 70 41 75 78 2c 20 20 20 20 20 20 20 20 20 20 20  pAux,           
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1e60: 6e 74 65 72 20 74 6f 20 74 6f 6b 65 6e 69 7a 65  nter to tokenize
1e70: 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  r hash table */.
1e80: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1eb0: 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20  lements in argv 
1ec0: 61 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  array */.  const
1ed0: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61   char * const *a
1ee0: 72 67 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43  rgv,       /* xC
1ef0: 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61  reate/xConnect a
1f00: 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f  rgument array */
1f10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
1f20: 2a 2a 70 70 56 74 61 62 2c 20 20 20 20 20 20 20  **ppVtab,       
1f30: 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73     /* OUT: New s
1f40: 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65  qlite3_vtab obje
1f50: 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ct */.  char **p
1f60: 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  zErr            
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1f80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64  sqlite3_malloc'd
1f90: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   error message *
1fa0: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  /.){.  return ft
1fb0: 73 35 56 6f 63 61 62 49 6e 69 74 56 74 61 62 28  s5VocabInitVtab(
1fc0: 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
1fd0: 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a  argv, ppVtab, pz
1fe0: 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  Err);.}../* .** 
1ff0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2000: 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  f the xBestIndex
2010: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 4f   method..**.** O
2020: 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nly constraints 
2030: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
2040: 2a 2a 20 20 20 20 20 74 65 72 6d 20 3c 3d 20 3f  **     term <= ?
2050: 0a 2a 2a 20 20 20 20 20 74 65 72 6d 20 3d 3d 20  .**     term == 
2060: 3f 0a 2a 2a 20 20 20 20 20 74 65 72 6d 20 3e 3d  ?.**     term >=
2070: 20 3f 0a 2a 2a 0a 2a 2a 20 61 72 65 20 69 6e 74   ?.**.** are int
2080: 65 72 70 72 65 74 65 64 2e 20 4c 65 73 73 2d 74  erpreted. Less-t
2090: 68 61 6e 20 61 6e 64 20 6c 65 73 73 2d 74 68 61  han and less-tha
20a0: 6e 2d 6f 72 2d 65 71 75 61 6c 20 61 72 65 20 74  n-or-equal are t
20b0: 72 65 61 74 65 64 20 0a 2a 2a 20 69 64 65 6e 74  reated .** ident
20c0: 69 63 61 6c 6c 79 2c 20 61 73 20 61 72 65 20 67  ically, as are g
20d0: 72 65 61 74 65 72 2d 74 68 61 6e 20 61 6e 64 20  reater-than and 
20e0: 67 72 65 61 74 65 72 2d 74 68 61 6e 2d 6f 72 2d  greater-than-or-
20f0: 65 71 75 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  equal..*/.static
2100: 20 69 6e 74 20 66 74 73 35 56 6f 63 61 62 42 65   int fts5VocabBe
2110: 73 74 49 6e 64 65 78 4d 65 74 68 6f 64 28 0a 20  stIndexMethod(. 
2120: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
2130: 55 6e 75 73 65 64 2c 0a 20 20 73 71 6c 69 74 65  Unused,.  sqlite
2140: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
2150: 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nfo.){.  int i;.
2160: 20 20 69 6e 74 20 69 54 65 72 6d 45 71 20 3d 20    int iTermEq = 
2170: 2d 31 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 47  -1;.  int iTermG
2180: 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 54  e = -1;.  int iT
2190: 65 72 6d 4c 65 20 3d 20 2d 31 3b 0a 20 20 69 6e  ermLe = -1;.  in
21a0: 74 20 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  t idxNum = 0;.  
21b0: 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 0a 20  int nArg = 0;.. 
21c0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
21d0: 6e 75 73 65 64 29 3b 0a 0a 20 20 66 6f 72 28 69  nused);..  for(i
21e0: 3d 30 3b 20 69 3c 70 49 6e 66 6f 2d 3e 6e 43 6f  =0; i<pInfo->nCo
21f0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
2200: 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
2210: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2220: 69 6e 74 20 2a 70 20 3d 20 26 70 49 6e 66 6f 2d  int *p = &pInfo-
2230: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 3b  >aConstraint[i];
2240: 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73 61 62  .    if( p->usab
2250: 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  le==0 ) continue
2260: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 43 6f  ;.    if( p->iCo
2270: 6c 75 6d 6e 3d 3d 30 20 29 7b 20 20 20 20 20 20  lumn==0 ){      
2280: 20 20 20 20 2f 2a 20 74 65 72 6d 20 63 6f 6c 75      /* term colu
2290: 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  mn */.      if( 
22a0: 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  p->op==SQLITE_IN
22b0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
22c0: 51 20 29 20 69 54 65 72 6d 45 71 20 3d 20 69 3b  Q ) iTermEq = i;
22d0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
22e0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
22f0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 20 69  ONSTRAINT_LE ) i
2300: 54 65 72 6d 4c 65 20 3d 20 69 3b 0a 20 20 20 20  TermLe = i;.    
2310: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 53 51 4c    if( p->op==SQL
2320: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
2330: 41 49 4e 54 5f 4c 54 20 29 20 69 54 65 72 6d 4c  AINT_LT ) iTermL
2340: 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  e = i;.      if(
2350: 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49   p->op==SQLITE_I
2360: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
2370: 47 45 20 29 20 69 54 65 72 6d 47 65 20 3d 20 69  GE ) iTermGe = i
2380: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  ;.      if( p->o
2390: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
23a0: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 20  CONSTRAINT_GT ) 
23b0: 69 54 65 72 6d 47 65 20 3d 20 69 3b 0a 20 20 20  iTermGe = i;.   
23c0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 54   }.  }..  if( iT
23d0: 65 72 6d 45 71 3e 3d 30 20 29 7b 0a 20 20 20 20  ermEq>=0 ){.    
23e0: 69 64 78 4e 75 6d 20 7c 3d 20 46 54 53 35 5f 56  idxNum |= FTS5_V
23f0: 4f 43 41 42 5f 54 45 52 4d 5f 45 51 3b 0a 20 20  OCAB_TERM_EQ;.  
2400: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72    pInfo->aConstr
2410: 61 69 6e 74 55 73 61 67 65 5b 69 54 65 72 6d 45  aintUsage[iTermE
2420: 71 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 2b  q].argvIndex = +
2430: 2b 6e 41 72 67 3b 0a 20 20 20 20 70 49 6e 66 6f  +nArg;.    pInfo
2440: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
2450: 3d 20 31 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 100;.  }else{.
2460: 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d      pInfo->estim
2470: 61 74 65 64 43 6f 73 74 20 3d 20 31 30 30 30 30  atedCost = 10000
2480: 30 30 3b 0a 20 20 20 20 69 66 28 20 69 54 65 72  00;.    if( iTer
2490: 6d 47 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  mGe>=0 ){.      
24a0: 69 64 78 4e 75 6d 20 7c 3d 20 46 54 53 35 5f 56  idxNum |= FTS5_V
24b0: 4f 43 41 42 5f 54 45 52 4d 5f 47 45 3b 0a 20 20  OCAB_TERM_GE;.  
24c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73      pInfo->aCons
24d0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 54 65 72  traintUsage[iTer
24e0: 6d 47 65 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  mGe].argvIndex =
24f0: 20 2b 2b 6e 41 72 67 3b 0a 20 20 20 20 20 20 70   ++nArg;.      p
2500: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
2510: 6f 73 74 20 3d 20 70 49 6e 66 6f 2d 3e 65 73 74  ost = pInfo->est
2520: 69 6d 61 74 65 64 43 6f 73 74 20 2f 20 32 3b 0a  imatedCost / 2;.
2530: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 54      }.    if( iT
2540: 65 72 6d 4c 65 3e 3d 30 20 29 7b 0a 20 20 20 20  ermLe>=0 ){.    
2550: 20 20 69 64 78 4e 75 6d 20 7c 3d 20 46 54 53 35    idxNum |= FTS5
2560: 5f 56 4f 43 41 42 5f 54 45 52 4d 5f 4c 45 3b 0a  _VOCAB_TERM_LE;.
2570: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
2580: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 54  nstraintUsage[iT
2590: 65 72 6d 4c 65 5d 2e 61 72 67 76 49 6e 64 65 78  ermLe].argvIndex
25a0: 20 3d 20 2b 2b 6e 41 72 67 3b 0a 20 20 20 20 20   = ++nArg;.     
25b0: 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65   pInfo->estimate
25c0: 64 43 6f 73 74 20 3d 20 70 49 6e 66 6f 2d 3e 65  dCost = pInfo->e
25d0: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 2f 20 32  stimatedCost / 2
25e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
25f0: 2a 20 54 68 69 73 20 76 69 72 74 75 61 6c 20 74  * This virtual t
2600: 61 62 6c 65 20 61 6c 77 61 79 73 20 64 65 6c 69  able always deli
2610: 76 65 72 73 20 72 65 73 75 6c 74 73 20 69 6e 20  vers results in 
2620: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
2630: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 22 74 65 72  of.  ** the "ter
2640: 6d 22 20 63 6f 6c 75 6d 6e 20 28 63 6f 6c 75 6d  m" column (colum
2650: 6e 20 30 29 2e 20 53 6f 20 69 66 20 74 68 65 20  n 0). So if the 
2660: 75 73 65 72 20 68 61 73 20 72 65 71 75 65 73 74  user has request
2670: 65 64 20 74 68 69 73 0a 20 20 2a 2a 20 73 70 65  ed this.  ** spe
2680: 63 69 66 69 63 61 6c 6c 79 20 2d 20 22 4f 52 44  cifically - "ORD
2690: 45 52 20 42 59 20 74 65 72 6d 22 20 6f 72 20 22  ER BY term" or "
26a0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 41 53  ORDER BY term AS
26b0: 43 22 20 2d 20 73 65 74 20 74 68 65 0a 20 20 2a  C" - set the.  *
26c0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  * sqlite3_index_
26d0: 69 6e 66 6f 2e 6f 72 64 65 72 42 79 43 6f 6e 73  info.orderByCons
26e0: 75 6d 65 64 20 66 6c 61 67 20 74 6f 20 74 65 6c  umed flag to tel
26f0: 6c 20 74 68 65 20 63 6f 72 65 20 74 68 65 20 72  l the core the r
2700: 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 72 65 20  esults.  ** are 
2710: 61 6c 72 65 61 64 79 20 69 6e 20 73 6f 72 74 65  already in sorte
2720: 64 20 6f 72 64 65 72 2e 20 20 2a 2f 0a 20 20 69  d order.  */.  i
2730: 66 28 20 70 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  f( pInfo->nOrder
2740: 42 79 3d 3d 31 20 0a 20 20 20 26 26 20 70 49 6e  By==1 .   && pIn
2750: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e  fo->aOrderBy[0].
2760: 69 43 6f 6c 75 6d 6e 3d 3d 30 20 0a 20 20 20 26  iColumn==0 .   &
2770: 26 20 70 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  & pInfo->aOrderB
2780: 79 5b 30 5d 2e 64 65 73 63 3d 3d 30 0a 20 20 29  y[0].desc==0.  )
2790: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6f 72 64  {.    pInfo->ord
27a0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 31  erByConsumed = 1
27b0: 3b 0a 20 20 7d 0a 0a 20 20 70 49 6e 66 6f 2d 3e  ;.  }..  pInfo->
27c0: 69 64 78 4e 75 6d 20 3d 20 69 64 78 4e 75 6d 3b  idxNum = idxNum;
27d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
27f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2800: 78 4f 70 65 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f  xOpen method..*/
2810: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2820: 56 6f 63 61 62 4f 70 65 6e 4d 65 74 68 6f 64 28  VocabOpenMethod(
2830: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
2840: 2a 70 56 54 61 62 2c 20 0a 20 20 73 71 6c 69 74  *pVTab, .  sqlit
2850: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
2860: 2a 70 70 43 73 72 0a 29 7b 0a 20 20 46 74 73 35  *ppCsr.){.  Fts5
2870: 56 6f 63 61 62 54 61 62 6c 65 20 2a 70 54 61 62  VocabTable *pTab
2880: 20 3d 20 28 46 74 73 35 56 6f 63 61 62 54 61 62   = (Fts5VocabTab
2890: 6c 65 2a 29 70 56 54 61 62 3b 0a 20 20 46 74 73  le*)pVTab;.  Fts
28a0: 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d  5Index *pIndex =
28b0: 20 30 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   0;.  Fts5Config
28c0: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 30 3b 0a 20   *pConfig = 0;. 
28d0: 20 46 74 73 35 56 6f 63 61 62 43 75 72 73 6f 72   Fts5VocabCursor
28e0: 20 2a 70 43 73 72 20 3d 20 30 3b 0a 20 20 69 6e   *pCsr = 0;.  in
28f0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2900: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
2910: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
2920: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 0a  har *zSql = 0;..
2930: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2940: 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
2950: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74  .      "SELECT t
2960: 2e 25 51 20 46 52 4f 4d 20 25 51 2e 25 51 20 41  .%Q FROM %Q.%Q A
2970: 53 20 74 20 57 48 45 52 45 20 74 2e 25 51 20 4d  S t WHERE t.%Q M
2980: 41 54 43 48 20 27 2a 69 64 27 22 2c 0a 20 20 20  ATCH '*id'",.   
2990: 20 20 20 70 54 61 62 2d 3e 7a 46 74 73 35 54 62     pTab->zFts5Tb
29a0: 6c 2c 20 70 54 61 62 2d 3e 7a 46 74 73 35 44 62  l, pTab->zFts5Db
29b0: 2c 20 70 54 61 62 2d 3e 7a 46 74 73 35 54 62 6c  , pTab->zFts5Tbl
29c0: 2c 20 70 54 61 62 2d 3e 7a 46 74 73 35 54 62 6c  , pTab->zFts5Tbl
29d0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  .  );.  if( zSql
29e0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
29f0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2a00: 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  pTab->db, zSql, 
2a10: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2a20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2a30: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 61 73 73 65  ee(zSql);.  asse
2a40: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2a50: 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 20 29 3b  K || pStmt==0 );
2a60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a70: 45 5f 45 52 52 4f 52 20 29 20 72 63 20 3d 20 53  E_ERROR ) rc = S
2a80: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
2a90: 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65   pStmt && sqlite
2aa0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
2ab0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2ac0: 20 69 36 34 20 69 49 64 20 3d 20 73 71 6c 69 74   i64 iId = sqlit
2ad0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
2ae0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70  pStmt, 0);.    p
2af0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
2b00: 74 73 35 49 6e 64 65 78 46 72 6f 6d 43 73 72 69  ts5IndexFromCsri
2b10: 64 28 70 54 61 62 2d 3e 70 47 6c 6f 62 61 6c 2c  d(pTab->pGlobal,
2b20: 20 69 49 64 2c 20 26 70 43 6f 6e 66 69 67 29 3b   iId, &pConfig);
2b30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
2b40: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 6e  SQLITE_OK && pIn
2b50: 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  dex==0 ){.    rc
2b60: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
2b70: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
2b80: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
2b90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ba0: 20 29 7b 0a 20 20 20 20 20 20 70 56 54 61 62 2d   ){.      pVTab-
2bb0: 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
2bc0: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2bd0: 20 20 20 20 20 20 22 6e 6f 20 73 75 63 68 20 66        "no such f
2be0: 74 73 35 20 74 61 62 6c 65 3a 20 25 73 2e 25 73  ts5 table: %s.%s
2bf0: 22 2c 20 70 54 61 62 2d 3e 7a 46 74 73 35 44 62  ", pTab->zFts5Db
2c00: 2c 20 70 54 61 62 2d 3e 7a 46 74 73 35 54 62 6c  , pTab->zFts5Tbl
2c10: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
2c20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2c30: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  R;.    }.  }..  
2c40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c50: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  K ){.    int nBy
2c60: 74 65 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 6e 43  te = pConfig->nC
2c70: 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 69 36 34 29  ol * sizeof(i64)
2c80: 20 2a 20 32 20 2b 20 73 69 7a 65 6f 66 28 46 74   * 2 + sizeof(Ft
2c90: 73 35 56 6f 63 61 62 43 75 72 73 6f 72 29 3b 0a  s5VocabCursor);.
2ca0: 20 20 20 20 70 43 73 72 20 3d 20 28 46 74 73 35      pCsr = (Fts5
2cb0: 56 6f 63 61 62 43 75 72 73 6f 72 2a 29 73 71 6c  VocabCursor*)sql
2cc0: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
2cd0: 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a  ro(&rc, nByte);.
2ce0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 73 72 20    }..  if( pCsr 
2cf0: 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 70 49 6e  ){.    pCsr->pIn
2d00: 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
2d10: 20 20 70 43 73 72 2d 3e 70 53 74 6d 74 20 3d 20    pCsr->pStmt = 
2d20: 70 53 74 6d 74 3b 0a 20 20 20 20 70 43 73 72 2d  pStmt;.    pCsr-
2d30: 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
2d40: 69 67 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 43  ig;.    pCsr->aC
2d50: 6e 74 20 3d 20 28 69 36 34 2a 29 26 70 43 73 72  nt = (i64*)&pCsr
2d60: 5b 31 5d 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61  [1];.    pCsr->a
2d70: 44 6f 63 20 3d 20 26 70 43 73 72 2d 3e 61 43 6e  Doc = &pCsr->aCn
2d80: 74 5b 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 5d  t[pConfig->nCol]
2d90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2da0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2db0: 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a  pStmt);.  }..  *
2dc0: 70 70 43 73 72 20 3d 20 28 73 71 6c 69 74 65 33  ppCsr = (sqlite3
2dd0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 70 43  _vtab_cursor*)pC
2de0: 73 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sr;.  return rc;
2df0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2e00: 66 74 73 35 56 6f 63 61 62 52 65 73 65 74 43 75  fts5VocabResetCu
2e10: 72 73 6f 72 28 46 74 73 35 56 6f 63 61 62 43 75  rsor(Fts5VocabCu
2e20: 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 70  rsor *pCsr){.  p
2e30: 43 73 72 2d 3e 72 6f 77 69 64 20 3d 20 30 3b 0a  Csr->rowid = 0;.
2e40: 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
2e50: 72 43 6c 6f 73 65 28 70 43 73 72 2d 3e 70 49 74  rClose(pCsr->pIt
2e60: 65 72 29 3b 0a 20 20 70 43 73 72 2d 3e 70 49 74  er);.  pCsr->pIt
2e70: 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
2e80: 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 7a 4c 65  3_free(pCsr->zLe
2e90: 54 65 72 6d 29 3b 0a 20 20 70 43 73 72 2d 3e 6e  Term);.  pCsr->n
2ea0: 4c 65 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 70  LeTerm = -1;.  p
2eb0: 43 73 72 2d 3e 7a 4c 65 54 65 72 6d 20 3d 20 30  Csr->zLeTerm = 0
2ec0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
2ed0: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 46 6f   the cursor.  Fo
2ee0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2ef0: 6f 72 6d 61 74 69 6f 6e 20 73 65 65 20 74 68 65  ormation see the
2f00: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a   documentation.*
2f10: 2a 20 6f 6e 20 74 68 65 20 78 43 6c 6f 73 65 20  * on the xClose 
2f20: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
2f30: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 74 65  rtual table inte
2f40: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
2f50: 20 69 6e 74 20 66 74 73 35 56 6f 63 61 62 43 6c   int fts5VocabCl
2f60: 6f 73 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  oseMethod(sqlite
2f70: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
2f80: 43 75 72 73 6f 72 29 7b 0a 20 20 46 74 73 35 56  Cursor){.  Fts5V
2f90: 6f 63 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  ocabCursor *pCsr
2fa0: 20 3d 20 28 46 74 73 35 56 6f 63 61 62 43 75 72   = (Fts5VocabCur
2fb0: 73 6f 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20  sor*)pCursor;.  
2fc0: 66 74 73 35 56 6f 63 61 62 52 65 73 65 74 43 75  fts5VocabResetCu
2fd0: 72 73 6f 72 28 70 43 73 72 29 3b 0a 20 20 73 71  rsor(pCsr);.  sq
2fe0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
2ff0: 72 65 65 28 26 70 43 73 72 2d 3e 74 65 72 6d 29  ree(&pCsr->term)
3000: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
3010: 6c 69 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d 74  lize(pCsr->pStmt
3020: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3030: 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
3040: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3050: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 56  static int fts5V
3060: 6f 63 61 62 49 6e 73 74 61 6e 63 65 4e 65 77 54  ocabInstanceNewT
3070: 65 72 6d 28 46 74 73 35 56 6f 63 61 62 43 75 72  erm(Fts5VocabCur
3080: 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
3090: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30a0: 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74  ;.  .  if( sqlit
30b0: 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 43  e3Fts5IterEof(pC
30c0: 73 72 2d 3e 70 49 74 65 72 29 20 29 7b 0a 20 20  sr->pIter) ){.  
30d0: 20 20 70 43 73 72 2d 3e 62 45 6f 66 20 3d 20 31    pCsr->bEof = 1
30e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
30f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
3100: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b  ;.    int nTerm;
3110: 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20 73 71 6c  .    zTerm = sql
3120: 69 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d  ite3Fts5IterTerm
3130: 28 70 43 73 72 2d 3e 70 49 74 65 72 2c 20 26 6e  (pCsr->pIter, &n
3140: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
3150: 43 73 72 2d 3e 6e 4c 65 54 65 72 6d 3e 3d 30 20  Csr->nLeTerm>=0 
3160: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d  ){.      int nCm
3170: 70 20 3d 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 70  p = MIN(nTerm, p
3180: 43 73 72 2d 3e 6e 4c 65 54 65 72 6d 29 3b 0a 20  Csr->nLeTerm);. 
3190: 20 20 20 20 20 69 6e 74 20 62 43 6d 70 20 3d 20       int bCmp = 
31a0: 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a 4c 65  memcmp(pCsr->zLe
31b0: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 43 6d  Term, zTerm, nCm
31c0: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 43  p);.      if( bC
31d0: 6d 70 3c 30 20 7c 7c 20 28 62 43 6d 70 3d 3d 30  mp<0 || (bCmp==0
31e0: 20 26 26 20 70 43 73 72 2d 3e 6e 4c 65 54 65 72   && pCsr->nLeTer
31f0: 6d 3c 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  m<nTerm) ){.    
3200: 20 20 20 20 70 43 73 72 2d 3e 62 45 6f 66 20 3d      pCsr->bEof =
3210: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
3220: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  }..    sqlite3Ft
3230: 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
3240: 20 26 70 43 73 72 2d 3e 74 65 72 6d 2c 20 6e 54   &pCsr->term, nT
3250: 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  erm, (const u8*)
3260: 7a 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 72 65  zTerm);.  }.  re
3270: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
3280: 69 63 20 69 6e 74 20 66 74 73 35 56 6f 63 61 62  ic int fts5Vocab
3290: 49 6e 73 74 61 6e 63 65 4e 65 78 74 28 46 74 73  InstanceNext(Fts
32a0: 35 56 6f 63 61 62 43 75 72 73 6f 72 20 2a 70 43  5VocabCursor *pC
32b0: 73 72 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61  sr){.  int eDeta
32c0: 69 6c 20 3d 20 70 43 73 72 2d 3e 70 43 6f 6e 66  il = pCsr->pConf
32d0: 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69  ig->eDetail;.  i
32e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
32f0: 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  K;.  Fts5IndexIt
3300: 65 72 20 2a 70 49 74 65 72 20 3d 20 70 43 73 72  er *pIter = pCsr
3310: 2d 3e 70 49 74 65 72 3b 0a 20 20 69 36 34 20 2a  ->pIter;.  i64 *
3320: 70 70 20 3d 20 26 70 43 73 72 2d 3e 69 49 6e 73  pp = &pCsr->iIns
3330: 74 50 6f 73 3b 0a 20 20 69 6e 74 20 2a 70 6f 20  tPos;.  int *po 
3340: 3d 20 26 70 43 73 72 2d 3e 69 49 6e 73 74 4f 66  = &pCsr->iInstOf
3350: 66 3b 0a 20 20 0a 20 20 77 68 69 6c 65 28 20 65  f;.  .  while( e
3360: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
3370: 41 49 4c 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 7c  AIL_NONE.      |
3380: 7c 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  | sqlite3Fts5Pos
3390: 6c 69 73 74 4e 65 78 74 36 34 28 70 49 74 65 72  listNext64(pIter
33a0: 2d 3e 70 44 61 74 61 2c 20 70 49 74 65 72 2d 3e  ->pData, pIter->
33b0: 6e 44 61 74 61 2c 20 70 6f 2c 20 70 70 29 20 0a  nData, po, pp) .
33c0: 20 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 69    ){.    pCsr->i
33d0: 49 6e 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20 20  InstPos = 0;.   
33e0: 20 70 43 73 72 2d 3e 69 49 6e 73 74 4f 66 66 20   pCsr->iInstOff 
33f0: 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  = 0;..    rc = s
3400: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
3410: 78 74 53 63 61 6e 28 70 43 73 72 2d 3e 70 49 74  xtScan(pCsr->pIt
3420: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
3430: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3440: 20 20 20 20 72 63 20 3d 20 66 74 73 35 56 6f 63      rc = fts5Voc
3450: 61 62 49 6e 73 74 61 6e 63 65 4e 65 77 54 65 72  abInstanceNewTer
3460: 6d 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20 69  m(pCsr);.      i
3470: 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
3480: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 20 62  _DETAIL_NONE ) b
3490: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
34a0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
34b0: 70 43 73 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  pCsr->bEof = 1;.
34c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
34d0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
34e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
34f0: 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
3500: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
3510: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
3520: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
3530: 35 56 6f 63 61 62 4e 65 78 74 4d 65 74 68 6f 64  5VocabNextMethod
3540: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
3550: 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a  rsor *pCursor){.
3560: 20 20 46 74 73 35 56 6f 63 61 62 43 75 72 73 6f    Fts5VocabCurso
3570: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 56  r *pCsr = (Fts5V
3580: 6f 63 61 62 43 75 72 73 6f 72 2a 29 70 43 75 72  ocabCursor*)pCur
3590: 73 6f 72 3b 0a 20 20 46 74 73 35 56 6f 63 61 62  sor;.  Fts5Vocab
35a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
35b0: 74 73 35 56 6f 63 61 62 54 61 62 6c 65 2a 29 70  ts5VocabTable*)p
35c0: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20  Cursor->pVtab;. 
35d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35e0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  _OK;.  int nCol 
35f0: 3d 20 70 43 73 72 2d 3e 70 43 6f 6e 66 69 67 2d  = pCsr->pConfig-
3600: 3e 6e 43 6f 6c 3b 0a 0a 20 20 70 43 73 72 2d 3e  >nCol;..  pCsr->
3610: 72 6f 77 69 64 2b 2b 3b 0a 0a 20 20 69 66 28 20  rowid++;..  if( 
3620: 70 54 61 62 2d 3e 65 54 79 70 65 3d 3d 46 54 53  pTab->eType==FTS
3630: 35 5f 56 4f 43 41 42 5f 49 4e 53 54 41 4e 43 45  5_VOCAB_INSTANCE
3640: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66   ){.    return f
3650: 74 73 35 56 6f 63 61 62 49 6e 73 74 61 6e 63 65  ts5VocabInstance
3660: 4e 65 78 74 28 70 43 73 72 29 3b 0a 20 20 7d 0a  Next(pCsr);.  }.
3670: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 65 54 79  .  if( pTab->eTy
3680: 70 65 3d 3d 46 54 53 35 5f 56 4f 43 41 42 5f 43  pe==FTS5_VOCAB_C
3690: 4f 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 43  OL ){.    for(pC
36a0: 73 72 2d 3e 69 43 6f 6c 2b 2b 3b 20 70 43 73 72  sr->iCol++; pCsr
36b0: 2d 3e 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 70 43 73  ->iCol<nCol; pCs
36c0: 72 2d 3e 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  r->iCol++){.    
36d0: 20 20 69 66 28 20 70 43 73 72 2d 3e 61 44 6f 63    if( pCsr->aDoc
36e0: 5b 70 43 73 72 2d 3e 69 43 6f 6c 5d 20 29 20 62  [pCsr->iCol] ) b
36f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3700: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 65 54 79  .  if( pTab->eTy
3710: 70 65 21 3d 46 54 53 35 5f 56 4f 43 41 42 5f 43  pe!=FTS5_VOCAB_C
3720: 4f 4c 20 7c 7c 20 70 43 73 72 2d 3e 69 43 6f 6c  OL || pCsr->iCol
3730: 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66  >=nCol ){.    if
3740: 28 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ( sqlite3Fts5Ite
3750: 72 45 6f 66 28 70 43 73 72 2d 3e 70 49 74 65 72  rEof(pCsr->pIter
3760: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d  ) ){.      pCsr-
3770: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  >bEof = 1;.    }
3780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
3790: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a 20  t char *zTerm;. 
37a0: 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a       int nTerm;.
37b0: 0a 20 20 20 20 20 20 7a 54 65 72 6d 20 3d 20 73  .      zTerm = s
37c0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 54 65  qlite3Fts5IterTe
37d0: 72 6d 28 70 43 73 72 2d 3e 70 49 74 65 72 2c 20  rm(pCsr->pIter, 
37e0: 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69  &nTerm);.      i
37f0: 66 28 20 70 43 73 72 2d 3e 6e 4c 65 54 65 72 6d  f( pCsr->nLeTerm
3800: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
3810: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 54  nt nCmp = MIN(nT
3820: 65 72 6d 2c 20 70 43 73 72 2d 3e 6e 4c 65 54 65  erm, pCsr->nLeTe
3830: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  rm);.        int
3840: 20 62 43 6d 70 20 3d 20 6d 65 6d 63 6d 70 28 70   bCmp = memcmp(p
3850: 43 73 72 2d 3e 7a 4c 65 54 65 72 6d 2c 20 7a 54  Csr->zLeTerm, zT
3860: 65 72 6d 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  erm, nCmp);.    
3870: 20 20 20 20 69 66 28 20 62 43 6d 70 3c 30 20 7c      if( bCmp<0 |
3880: 7c 20 28 62 43 6d 70 3d 3d 30 20 26 26 20 70 43  | (bCmp==0 && pC
3890: 73 72 2d 3e 6e 4c 65 54 65 72 6d 3c 6e 54 65 72  sr->nLeTerm<nTer
38a0: 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m) ){.          
38b0: 70 43 73 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  pCsr->bEof = 1;.
38c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
38d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
38e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
38f0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
3900: 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26  BufferSet(&rc, &
3910: 70 43 73 72 2d 3e 74 65 72 6d 2c 20 6e 54 65 72  pCsr->term, nTer
3920: 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54  m, (const u8*)zT
3930: 65 72 6d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  erm);.      mems
3940: 65 74 28 70 43 73 72 2d 3e 61 43 6e 74 2c 20 30  et(pCsr->aCnt, 0
3950: 2c 20 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f 66 28  , nCol * sizeof(
3960: 69 36 34 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  i64));.      mem
3970: 73 65 74 28 70 43 73 72 2d 3e 61 44 6f 63 2c 20  set(pCsr->aDoc, 
3980: 30 2c 20 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f 66  0, nCol * sizeof
3990: 28 69 36 34 29 29 3b 0a 20 20 20 20 20 20 70 43  (i64));.      pC
39a0: 73 72 2d 3e 69 43 6f 6c 20 3d 20 30 3b 0a 0a 20  sr->iCol = 0;.. 
39b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
39c0: 62 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 56  b->eType==FTS5_V
39d0: 4f 43 41 42 5f 43 4f 4c 20 7c 7c 20 70 54 61 62  OCAB_COL || pTab
39e0: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 56 4f  ->eType==FTS5_VO
39f0: 43 41 42 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20  CAB_ROW );.     
3a00: 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
3a10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
3a20: 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70   int eDetail = p
3a30: 43 73 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  Csr->pConfig->eD
3a40: 65 74 61 69 6c 3b 0a 20 20 20 20 20 20 20 20 63  etail;.        c
3a50: 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b 20 69  onst u8 *pPos; i
3a60: 6e 74 20 6e 50 6f 73 3b 20 20 20 2f 2a 20 50 6f  nt nPos;   /* Po
3a70: 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
3a80: 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 20         i64 iPos 
3a90: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
3aa0: 20 20 20 2f 2a 20 36 34 2d 62 69 74 20 70 6f 73     /* 64-bit pos
3ab0: 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20  ition read from 
3ac0: 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  poslist */.     
3ad0: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3af0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
3b00: 20 77 69 74 68 69 6e 20 70 6f 73 69 74 69 6f 6e   within position
3b10: 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
3b20: 20 20 70 50 6f 73 20 3d 20 70 43 73 72 2d 3e 70    pPos = pCsr->p
3b30: 49 74 65 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  Iter->pData;.   
3b40: 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 43 73 72       nPos = pCsr
3b50: 2d 3e 70 49 74 65 72 2d 3e 6e 44 61 74 61 3b 0a  ->pIter->nData;.
3b60: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
3b70: 20 70 54 61 62 2d 3e 65 54 79 70 65 20 29 7b 0a   pTab->eType ){.
3b80: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 46            case F
3b90: 54 53 35 5f 56 4f 43 41 42 5f 52 4f 57 3a 0a 20  TS5_VOCAB_ROW:. 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65             if( e
3bb0: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
3bc0: 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
3bd0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
3be0: 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 50   0==sqlite3Fts5P
3bf0: 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70 50 6f  oslistNext64(pPo
3c00: 73 2c 20 6e 50 6f 73 2c 20 26 69 4f 66 66 2c 20  s, nPos, &iOff, 
3c10: 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20  &iPos) ){.      
3c20: 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e            pCsr->
3c30: 61 43 6e 74 5b 30 5d 2b 2b 3b 0a 20 20 20 20 20  aCnt[0]++;.     
3c40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3c50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3c60: 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 5b       pCsr->aDoc[
3c70: 30 5d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  0]++;.          
3c80: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
3c90: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 56 4f      case FTS5_VO
3ca0: 43 41 42 5f 43 4f 4c 3a 0a 20 20 20 20 20 20 20  CAB_COL:.       
3cb0: 20 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c       if( eDetail
3cc0: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55  ==FTS5_DETAIL_FU
3cd0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
3ce0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
3cf0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
3d00: 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74   while( 0==sqlit
3d10: 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
3d20: 74 36 34 28 70 50 6f 73 2c 20 6e 50 6f 73 2c 20  t64(pPos, nPos, 
3d30: 26 69 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b  &iOff, &iPos) ){
3d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d50: 20 69 6e 74 20 69 69 20 3d 20 46 54 53 35 5f 50   int ii = FTS5_P
3d60: 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b  OS2COLUMN(iPos);
3d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d80: 20 70 43 73 72 2d 3e 61 43 6e 74 5b 69 69 5d 2b   pCsr->aCnt[ii]+
3d90: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
3da0: 20 20 20 69 66 28 20 69 43 6f 6c 21 3d 69 69 20     if( iCol!=ii 
3db0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3dc0: 20 20 20 20 20 69 66 28 20 69 69 3e 3d 6e 43 6f       if( ii>=nCo
3dd0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
3de0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54           rc = FT
3df0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
3e20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73               pCs
3e40: 72 2d 3e 61 44 6f 63 5b 69 69 5d 2b 2b 3b 0a 20  r->aDoc[ii]++;. 
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 69 43 6f 6c 20 3d 20 69 69 3b 0a 20 20 20 20   iCol = ii;.    
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3e90: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
3ea0: 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
3eb0: 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53  5_DETAIL_COLUMNS
3ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3ed0: 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69    while( 0==sqli
3ee0: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
3ef0: 78 74 36 34 28 70 50 6f 73 2c 20 6e 50 6f 73 2c  xt64(pPos, nPos,
3f00: 20 26 69 4f 66 66 2c 26 69 50 6f 73 29 20 29 7b   &iOff,&iPos) ){
3f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3f20: 20 61 73 73 65 72 74 5f 6e 63 28 20 69 50 6f 73   assert_nc( iPos
3f30: 3e 3d 30 20 26 26 20 69 50 6f 73 3c 6e 43 6f 6c  >=0 && iPos<nCol
3f40: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
3f50: 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43      if( iPos>=nC
3f60: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
3f70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53          rc = FTS
3f80: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
3fa0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
3fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3fc0: 20 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63        pCsr->aDoc
3fd0: 5b 69 50 6f 73 5d 2b 2b 3b 0a 20 20 20 20 20 20  [iPos]++;.      
3fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ff0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4000: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
4010: 74 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  t( eDetail==FTS5
4020: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a  _DETAIL_NONE );.
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
4040: 73 72 2d 3e 61 44 6f 63 5b 30 5d 2b 2b 3b 0a 20  sr->aDoc[0]++;. 
4050: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4060: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4070: 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75  .          defau
4080: 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt:.            
4090: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 65 54  assert( pTab->eT
40a0: 79 70 65 3d 3d 46 54 53 35 5f 56 4f 43 41 42 5f  ype==FTS5_VOCAB_
40b0: 49 4e 53 54 41 4e 43 45 20 29 3b 0a 20 20 20 20  INSTANCE );.    
40c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
40d0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
40e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
40f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
4100: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
4110: 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 70 43  5IterNextScan(pC
4120: 73 72 2d 3e 70 49 74 65 72 29 3b 0a 20 20 20 20  sr->pIter);.    
4130: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
4140: 28 20 70 54 61 62 2d 3e 65 54 79 70 65 3d 3d 46  ( pTab->eType==F
4150: 54 53 35 5f 56 4f 43 41 42 5f 49 4e 53 54 41 4e  TS5_VOCAB_INSTAN
4160: 43 45 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  CE ) break;..   
4170: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
4180: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4190: 20 20 20 20 7a 54 65 72 6d 20 3d 20 73 71 6c 69      zTerm = sqli
41a0: 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28  te3Fts5IterTerm(
41b0: 70 43 73 72 2d 3e 70 49 74 65 72 2c 20 26 6e 54  pCsr->pIter, &nT
41c0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
41d0: 69 66 28 20 6e 54 65 72 6d 21 3d 70 43 73 72 2d  if( nTerm!=pCsr-
41e0: 3e 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d  >term.n || memcm
41f0: 70 28 7a 54 65 72 6d 2c 20 70 43 73 72 2d 3e 74  p(zTerm, pCsr->t
4200: 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b  erm.p, nTerm) ){
4210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
4220: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
4230: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
4240: 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
4250: 28 70 43 73 72 2d 3e 70 49 74 65 72 29 20 29 20  (pCsr->pIter) ) 
4260: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4280: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
4290: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 73 72 2d  LITE_OK && pCsr-
42a0: 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70 54 61 62  >bEof==0 && pTab
42b0: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 56 4f  ->eType==FTS5_VO
42c0: 43 41 42 5f 43 4f 4c 20 29 7b 0a 20 20 20 20 77  CAB_COL ){.    w
42d0: 68 69 6c 65 28 20 70 43 73 72 2d 3e 61 44 6f 63  hile( pCsr->aDoc
42e0: 5b 70 43 73 72 2d 3e 69 43 6f 6c 5d 3d 3d 30 20  [pCsr->iCol]==0 
42f0: 29 20 70 43 73 72 2d 3e 69 43 6f 6c 2b 2b 3b 0a  ) pCsr->iCol++;.
4300: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72      assert( pCsr
4310: 2d 3e 69 43 6f 6c 3c 70 43 73 72 2d 3e 70 43 6f  ->iCol<pCsr->pCo
4320: 6e 66 69 67 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  nfig->nCol );.  
4330: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4340: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
4350: 74 68 65 20 78 46 69 6c 74 65 72 20 69 6d 70 6c  the xFilter impl
4360: 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  ementation for t
4370: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
4380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4390: 66 74 73 35 56 6f 63 61 62 46 69 6c 74 65 72 4d  fts5VocabFilterM
43a0: 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33  ethod(.  sqlite3
43b0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
43c0: 75 72 73 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20  ursor,   /* The 
43d0: 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
43e0: 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
43f0: 69 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20  int idxNum,     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 2f 2a 20 53 74 72 61 74 65 67 79 20 69 6e 64 65  /* Strategy inde
4420: 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
4430: 72 20 2a 7a 55 6e 75 73 65 64 2c 20 20 20 20 20  r *zUnused,     
4440: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
4450: 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 6e 75 73 65   */.  int nUnuse
4460: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
4470: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4480: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
4490: 70 56 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pVal */.  sqlite
44a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
44b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
44c0: 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20 69  uments for the i
44d0: 6e 64 65 78 69 6e 67 20 73 63 68 65 6d 65 20 2a  ndexing scheme *
44e0: 2f 0a 29 7b 0a 20 20 46 74 73 35 56 6f 63 61 62  /.){.  Fts5Vocab
44f0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
4500: 74 73 35 56 6f 63 61 62 54 61 62 6c 65 2a 29 70  ts5VocabTable*)p
4510: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20  Cursor->pVtab;. 
4520: 20 46 74 73 35 56 6f 63 61 62 43 75 72 73 6f 72   Fts5VocabCursor
4530: 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 56 6f   *pCsr = (Fts5Vo
4540: 63 61 62 43 75 72 73 6f 72 2a 29 70 43 75 72 73  cabCursor*)pCurs
4550: 6f 72 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20  or;.  int eType 
4560: 3d 20 70 54 61 62 2d 3e 65 54 79 70 65 3b 0a 20  = pTab->eType;. 
4570: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4580: 5f 4f 4b 3b 0a 0a 20 20 69 6e 74 20 69 56 61 6c  _OK;..  int iVal
4590: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 20 3d 20   = 0;.  int f = 
45a0: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
45b0: 53 43 41 4e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  SCAN;.  const ch
45c0: 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20  ar *zTerm = 0;. 
45d0: 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 30 3b 0a   int nTerm = 0;.
45e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
45f0: 20 2a 70 45 71 20 3d 20 30 3b 0a 20 20 73 71 6c   *pEq = 0;.  sql
4600: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 47 65 20  ite3_value *pGe 
4610: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  = 0;.  sqlite3_v
4620: 61 6c 75 65 20 2a 70 4c 65 20 3d 20 30 3b 0a 0a  alue *pLe = 0;..
4630: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28    UNUSED_PARAM2(
4640: 7a 55 6e 75 73 65 64 2c 20 6e 55 6e 75 73 65 64  zUnused, nUnused
4650: 29 3b 0a 0a 20 20 66 74 73 35 56 6f 63 61 62 52  );..  fts5VocabR
4660: 65 73 65 74 43 75 72 73 6f 72 28 70 43 73 72 29  esetCursor(pCsr)
4670: 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26  ;.  if( idxNum &
4680: 20 46 54 53 35 5f 56 4f 43 41 42 5f 54 45 52 4d   FTS5_VOCAB_TERM
4690: 5f 45 51 20 29 20 70 45 71 20 3d 20 61 70 56 61  _EQ ) pEq = apVa
46a0: 6c 5b 69 56 61 6c 2b 2b 5d 3b 0a 20 20 69 66 28  l[iVal++];.  if(
46b0: 20 69 64 78 4e 75 6d 20 26 20 46 54 53 35 5f 56   idxNum & FTS5_V
46c0: 4f 43 41 42 5f 54 45 52 4d 5f 47 45 20 29 20 70  OCAB_TERM_GE ) p
46d0: 47 65 20 3d 20 61 70 56 61 6c 5b 69 56 61 6c 2b  Ge = apVal[iVal+
46e0: 2b 5d 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d  +];.  if( idxNum
46f0: 20 26 20 46 54 53 35 5f 56 4f 43 41 42 5f 54 45   & FTS5_VOCAB_TE
4700: 52 4d 5f 4c 45 20 29 20 70 4c 65 20 3d 20 61 70  RM_LE ) pLe = ap
4710: 56 61 6c 5b 69 56 61 6c 2b 2b 5d 3b 0a 0a 20 20  Val[iVal++];..  
4720: 69 66 28 20 70 45 71 20 29 7b 0a 20 20 20 20 7a  if( pEq ){.    z
4730: 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68  Term = (const ch
4740: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
4750: 75 65 5f 74 65 78 74 28 70 45 71 29 3b 0a 20 20  ue_text(pEq);.  
4760: 20 20 6e 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    nTerm = sqlite
4770: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 45  3_value_bytes(pE
4780: 71 29 3b 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20  q);.    f = 0;. 
4790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
47a0: 70 47 65 20 29 7b 0a 20 20 20 20 20 20 7a 54 65  pGe ){.      zTe
47b0: 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rm = (const char
47c0: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
47d0: 5f 74 65 78 74 28 70 47 65 29 3b 0a 20 20 20 20  _text(pGe);.    
47e0: 20 20 6e 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    nTerm = sqlite
47f0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 47  3_value_bytes(pG
4800: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
4810: 28 20 70 4c 65 20 29 7b 0a 20 20 20 20 20 20 63  ( pLe ){.      c
4820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 70 79  onst char *zCopy
4830: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
4840: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
4850: 65 78 74 28 70 4c 65 29 3b 0a 20 20 20 20 20 20  ext(pLe);.      
4860: 70 43 73 72 2d 3e 6e 4c 65 54 65 72 6d 20 3d 20  pCsr->nLeTerm = 
4870: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
4880: 74 65 73 28 70 4c 65 29 3b 0a 20 20 20 20 20 20  tes(pLe);.      
4890: 70 43 73 72 2d 3e 7a 4c 65 54 65 72 6d 20 3d 20  pCsr->zLeTerm = 
48a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
48b0: 43 73 72 2d 3e 6e 4c 65 54 65 72 6d 2b 31 29 3b  Csr->nLeTerm+1);
48c0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d  .      if( pCsr-
48d0: 3e 7a 4c 65 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  >zLeTerm==0 ){. 
48e0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
48f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
4900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
4910: 65 6d 63 70 79 28 70 43 73 72 2d 3e 7a 4c 65 54  emcpy(pCsr->zLeT
4920: 65 72 6d 2c 20 7a 43 6f 70 79 2c 20 70 43 73 72  erm, zCopy, pCsr
4930: 2d 3e 6e 4c 65 54 65 72 6d 2b 31 29 3b 0a 20 20  ->nLeTerm+1);.  
4940: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4950: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4960: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
4970: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
4980: 78 51 75 65 72 79 28 70 43 73 72 2d 3e 70 49 6e  xQuery(pCsr->pIn
4990: 64 65 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  dex, zTerm, nTer
49a0: 6d 2c 20 66 2c 20 30 2c 20 26 70 43 73 72 2d 3e  m, f, 0, &pCsr->
49b0: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  pIter);.  }.  if
49c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
49d0: 26 26 20 65 54 79 70 65 3d 3d 46 54 53 35 5f 56  && eType==FTS5_V
49e0: 4f 43 41 42 5f 49 4e 53 54 41 4e 43 45 20 29 7b  OCAB_INSTANCE ){
49f0: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 56 6f  .    rc = fts5Vo
4a00: 63 61 62 49 6e 73 74 61 6e 63 65 4e 65 77 54 65  cabInstanceNewTe
4a10: 72 6d 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20  rm(pCsr);.  }.  
4a20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4a30: 4b 20 0a 20 20 20 26 26 20 21 70 43 73 72 2d 3e  K .   && !pCsr->
4a40: 62 45 6f 66 20 0a 20 20 20 26 26 20 28 65 54 79  bEof .   && (eTy
4a50: 70 65 21 3d 46 54 53 35 5f 56 4f 43 41 42 5f 49  pe!=FTS5_VOCAB_I
4a60: 4e 53 54 41 4e 43 45 20 7c 7c 20 70 43 73 72 2d  NSTANCE || pCsr-
4a70: 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
4a80: 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l!=FTS5_DETAIL_N
4a90: 4f 4e 45 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  ONE).  ){.    rc
4aa0: 20 3d 20 66 74 73 35 56 6f 63 61 62 4e 65 78 74   = fts5VocabNext
4ab0: 4d 65 74 68 6f 64 28 70 43 75 72 73 6f 72 29 3b  Method(pCursor);
4ac0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
4ad0: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
4ae0: 73 20 69 73 20 74 68 65 20 78 45 6f 66 20 6d 65  s is the xEof me
4af0: 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74  thod of the virt
4b00: 75 61 6c 20 74 61 62 6c 65 2e 20 53 51 4c 69 74  ual table. SQLit
4b10: 65 20 63 61 6c 6c 73 20 74 68 69 73 20 0a 2a 2a  e calls this .**
4b20: 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 6e 64   routine to find
4b30: 20 6f 75 74 20 69 66 20 69 74 20 68 61 73 20 72   out if it has r
4b40: 65 61 63 68 65 64 20 74 68 65 20 65 6e 64 20 6f  eached the end o
4b50: 66 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  f a result set..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
4b70: 73 35 56 6f 63 61 62 45 6f 66 4d 65 74 68 6f 64  s5VocabEofMethod
4b80: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
4b90: 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a  rsor *pCursor){.
4ba0: 20 20 46 74 73 35 56 6f 63 61 62 43 75 72 73 6f    Fts5VocabCurso
4bb0: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 56  r *pCsr = (Fts5V
4bc0: 6f 63 61 62 43 75 72 73 6f 72 2a 29 70 43 75 72  ocabCursor*)pCur
4bd0: 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  sor;.  return pC
4be0: 73 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61  sr->bEof;.}..sta
4bf0: 74 69 63 20 69 6e 74 20 66 74 73 35 56 6f 63 61  tic int fts5Voca
4c00: 62 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 28 0a 20  bColumnMethod(. 
4c10: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
4c20: 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 20  rsor *pCursor,  
4c30: 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
4c40: 74 72 69 65 76 65 20 76 61 6c 75 65 20 66 72 6f  trieve value fro
4c50: 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  m */.  sqlite3_c
4c60: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
4c70: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
4c80: 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 72 65  t for sqlite3_re
4c90: 73 75 6c 74 5f 78 78 78 28 29 20 63 61 6c 6c 73  sult_xxx() calls
4ca0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
4cd0: 66 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 61 64  f column to read
4ce0: 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 29   value from */.)
4cf0: 7b 0a 20 20 46 74 73 35 56 6f 63 61 62 43 75 72  {.  Fts5VocabCur
4d00: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73  sor *pCsr = (Fts
4d10: 35 56 6f 63 61 62 43 75 72 73 6f 72 2a 29 70 43  5VocabCursor*)pC
4d20: 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 65 44 65  ursor;.  int eDe
4d30: 74 61 69 6c 20 3d 20 70 43 73 72 2d 3e 70 43 6f  tail = pCsr->pCo
4d40: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20  nfig->eDetail;. 
4d50: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 28 28 46   int eType = ((F
4d60: 74 73 35 56 6f 63 61 62 54 61 62 6c 65 2a 29 28  ts5VocabTable*)(
4d70: 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 29  pCursor->pVtab))
4d80: 2d 3e 65 54 79 70 65 3b 0a 20 20 69 36 34 20 69  ->eType;.  i64 i
4d90: 56 61 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Val = 0;..  if( 
4da0: 69 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73  iCol==0 ){.    s
4db0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
4dc0: 78 74 28 0a 20 20 20 20 20 20 20 20 70 43 74 78  xt(.        pCtx
4dd0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
4de0: 43 73 72 2d 3e 74 65 72 6d 2e 70 2c 20 70 43 73  Csr->term.p, pCs
4df0: 72 2d 3e 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54  r->term.n, SQLIT
4e00: 45 5f 54 52 41 4e 53 49 45 4e 54 0a 20 20 20 20  E_TRANSIENT.    
4e10: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  );.  }else if( e
4e20: 54 79 70 65 3d 3d 46 54 53 35 5f 56 4f 43 41 42  Type==FTS5_VOCAB
4e30: 5f 43 4f 4c 20 29 7b 0a 20 20 20 20 61 73 73 65  _COL ){.    asse
4e40: 72 74 28 20 69 43 6f 6c 3d 3d 31 20 7c 7c 20 69  rt( iCol==1 || i
4e50: 43 6f 6c 3d 3d 32 20 7c 7c 20 69 43 6f 6c 3d 3d  Col==2 || iCol==
4e60: 33 20 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  3 );.    if( iCo
4e70: 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  l==1 ){.      if
4e80: 28 20 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ( eDetail!=FTS5_
4e90: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
4ea0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
4eb0: 72 20 2a 7a 20 3d 20 70 43 73 72 2d 3e 70 43 6f  r *z = pCsr->pCo
4ec0: 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 70 43 73 72  nfig->azCol[pCsr
4ed0: 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20  ->iCol];.       
4ee0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4ef0: 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31  text(pCtx, z, -1
4f00: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
4f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
4f20: 6c 73 65 20 69 66 28 20 69 43 6f 6c 3d 3d 32 20  lse if( iCol==2 
4f30: 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  ){.      iVal = 
4f40: 70 43 73 72 2d 3e 61 44 6f 63 5b 70 43 73 72 2d  pCsr->aDoc[pCsr-
4f50: 3e 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73  >iCol];.    }els
4f60: 65 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  e{.      iVal = 
4f70: 70 43 73 72 2d 3e 61 43 6e 74 5b 70 43 73 72 2d  pCsr->aCnt[pCsr-
4f80: 3e 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20  >iCol];.    }.  
4f90: 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d  }else if( eType=
4fa0: 3d 46 54 53 35 5f 56 4f 43 41 42 5f 52 4f 57 20  =FTS5_VOCAB_ROW 
4fb0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
4fc0: 43 6f 6c 3d 3d 31 20 7c 7c 20 69 43 6f 6c 3d 3d  Col==1 || iCol==
4fd0: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  2 );.    if( iCo
4fe0: 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 56  l==1 ){.      iV
4ff0: 61 6c 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 5b  al = pCsr->aDoc[
5000: 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0];.    }else{. 
5010: 20 20 20 20 20 69 56 61 6c 20 3d 20 70 43 73 72       iVal = pCsr
5020: 2d 3e 61 43 6e 74 5b 30 5d 3b 0a 20 20 20 20 7d  ->aCnt[0];.    }
5030: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
5040: 73 65 72 74 28 20 65 54 79 70 65 3d 3d 46 54 53  sert( eType==FTS
5050: 35 5f 56 4f 43 41 42 5f 49 4e 53 54 41 4e 43 45  5_VOCAB_INSTANCE
5060: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
5070: 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  iCol ){.      ca
5080: 73 65 20 31 3a 0a 20 20 20 20 20 20 20 20 73 71  se 1:.        sq
5090: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
50a0: 36 34 28 70 43 74 78 2c 20 70 43 73 72 2d 3e 70  64(pCtx, pCsr->p
50b0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
50c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
50d0: 20 20 20 20 63 61 73 65 20 32 3a 20 7b 0a 20 20      case 2: {.  
50e0: 20 20 20 20 20 20 69 6e 74 20 69 69 20 3d 20 2d        int ii = -
50f0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  1;.        if( e
5100: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
5110: 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
5120: 20 20 20 20 20 20 69 69 20 3d 20 46 54 53 35 5f        ii = FTS5_
5130: 50 4f 53 32 43 4f 4c 55 4d 4e 28 70 43 73 72 2d  POS2COLUMN(pCsr-
5140: 3e 69 49 6e 73 74 50 6f 73 29 3b 0a 20 20 20 20  >iInstPos);.    
5150: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
5160: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
5170: 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 7b 0a 20 20  IL_COLUMNS ){.  
5180: 20 20 20 20 20 20 20 20 69 69 20 3d 20 28 69 6e          ii = (in
5190: 74 29 70 43 73 72 2d 3e 69 49 6e 73 74 50 6f 73  t)pCsr->iInstPos
51a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
51b0: 20 20 20 20 69 66 28 20 69 69 3e 3d 30 20 26 26      if( ii>=0 &&
51c0: 20 69 69 3c 70 43 73 72 2d 3e 70 43 6f 6e 66 69   ii<pCsr->pConfi
51d0: 67 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  g->nCol ){.     
51e0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
51f0: 2a 7a 20 3d 20 70 43 73 72 2d 3e 70 43 6f 6e 66  *z = pCsr->pConf
5200: 69 67 2d 3e 61 7a 43 6f 6c 5b 69 69 5d 3b 0a 20  ig->azCol[ii];. 
5210: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5220: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
5230: 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  x, z, -1, SQLITE
5240: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
5250: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5260: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5270: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5280: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
5290: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==3 );.        i
52a0: 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
52b0: 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a  _DETAIL_FULL ){.
52c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
52d0: 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
52e0: 45 54 28 70 43 73 72 2d 3e 69 49 6e 73 74 50 6f  ET(pCsr->iInstPo
52f0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  s);.          sq
5300: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5310: 28 70 43 74 78 2c 20 69 69 29 3b 0a 20 20 20 20  (pCtx, ii);.    
5320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5330: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5340: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 56   }.  }..  if( iV
5350: 61 6c 3e 30 20 29 20 73 71 6c 69 74 65 33 5f 72  al>0 ) sqlite3_r
5360: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
5370: 2c 20 69 56 61 6c 29 3b 0a 20 20 72 65 74 75 72  , iVal);.  retur
5380: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5390: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  /* .** This is t
53a0: 68 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64  he xRowid method
53b0: 2e 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  . The SQLite cor
53c0: 65 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  e calls this rou
53d0: 74 69 6e 65 20 74 6f 0a 2a 2a 20 72 65 74 72 69  tine to.** retri
53e0: 65 76 65 20 74 68 65 20 72 6f 77 69 64 20 66 6f  eve the rowid fo
53f0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
5400: 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  w of the result 
5410: 73 65 74 2e 20 54 68 65 0a 2a 2a 20 72 6f 77 69  set. The.** rowi
5420: 64 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  d should be writ
5430: 74 65 6e 20 74 6f 20 2a 70 52 6f 77 69 64 2e 0a  ten to *pRowid..
5440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
5450: 73 35 56 6f 63 61 62 52 6f 77 69 64 4d 65 74 68  s5VocabRowidMeth
5460: 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
5470: 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  ab_cursor *pCurs
5480: 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e  or, .  sqlite_in
5490: 74 36 34 20 2a 70 52 6f 77 69 64 0a 29 7b 0a 20  t64 *pRowid.){. 
54a0: 20 46 74 73 35 56 6f 63 61 62 43 75 72 73 6f 72   Fts5VocabCursor
54b0: 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 56 6f   *pCsr = (Fts5Vo
54c0: 63 61 62 43 75 72 73 6f 72 2a 29 70 43 75 72 73  cabCursor*)pCurs
54d0: 6f 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20  or;.  *pRowid = 
54e0: 70 43 73 72 2d 3e 72 6f 77 69 64 3b 0a 20 20 72  pCsr->rowid;.  r
54f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5500: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
5510: 74 73 35 56 6f 63 61 62 49 6e 69 74 28 46 74 73  ts5VocabInit(Fts
5520: 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c  5Global *pGlobal
5530: 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  , sqlite3 *db){.
5540: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
5550: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 66 74  qlite3_module ft
5560: 73 35 56 6f 63 61 62 20 3d 20 7b 0a 20 20 20 20  s5Vocab = {.    
5570: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 20 20 20 20  /* iVersion     
5580: 20 2a 2f 20 32 2c 0a 20 20 20 20 2f 2a 20 78 43   */ 2,.    /* xC
5590: 72 65 61 74 65 20 20 20 20 20 20 20 2a 2f 20 66  reate       */ f
55a0: 74 73 35 56 6f 63 61 62 43 72 65 61 74 65 4d 65  ts5VocabCreateMe
55b0: 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 43 6f  thod,.    /* xCo
55c0: 6e 6e 65 63 74 20 20 20 20 20 20 2a 2f 20 66 74  nnect      */ ft
55d0: 73 35 56 6f 63 61 62 43 6f 6e 6e 65 63 74 4d 65  s5VocabConnectMe
55e0: 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 42 65  thod,.    /* xBe
55f0: 73 74 49 6e 64 65 78 20 20 20 20 2a 2f 20 66 74  stIndex    */ ft
5600: 73 35 56 6f 63 61 62 42 65 73 74 49 6e 64 65 78  s5VocabBestIndex
5610: 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78  Method,.    /* x
5620: 44 69 73 63 6f 6e 6e 65 63 74 20 20 20 2a 2f 20  Disconnect   */ 
5630: 66 74 73 35 56 6f 63 61 62 44 69 73 63 6f 6e 6e  fts5VocabDisconn
5640: 65 63 74 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f  ectMethod,.    /
5650: 2a 20 78 44 65 73 74 72 6f 79 20 20 20 20 20 20  * xDestroy      
5660: 2a 2f 20 66 74 73 35 56 6f 63 61 62 44 65 73 74  */ fts5VocabDest
5670: 72 6f 79 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f  royMethod,.    /
5680: 2a 20 78 4f 70 65 6e 20 20 20 20 20 20 20 20 20  * xOpen         
5690: 2a 2f 20 66 74 73 35 56 6f 63 61 62 4f 70 65 6e  */ fts5VocabOpen
56a0: 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78  Method,.    /* x
56b0: 43 6c 6f 73 65 20 20 20 20 20 20 20 20 2a 2f 20  Close        */ 
56c0: 66 74 73 35 56 6f 63 61 62 43 6c 6f 73 65 4d 65  fts5VocabCloseMe
56d0: 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 46 69  thod,.    /* xFi
56e0: 6c 74 65 72 20 20 20 20 20 20 20 2a 2f 20 66 74  lter       */ ft
56f0: 73 35 56 6f 63 61 62 46 69 6c 74 65 72 4d 65 74  s5VocabFilterMet
5700: 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 4e 65 78  hod,.    /* xNex
5710: 74 20 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73  t         */ fts
5720: 35 56 6f 63 61 62 4e 65 78 74 4d 65 74 68 6f 64  5VocabNextMethod
5730: 2c 0a 20 20 20 20 2f 2a 20 78 45 6f 66 20 20 20  ,.    /* xEof   
5740: 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35 56 6f         */ fts5Vo
5750: 63 61 62 45 6f 66 4d 65 74 68 6f 64 2c 0a 20 20  cabEofMethod,.  
5760: 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 20 20 20    /* xColumn    
5770: 20 20 20 2a 2f 20 66 74 73 35 56 6f 63 61 62 43     */ fts5VocabC
5780: 6f 6c 75 6d 6e 4d 65 74 68 6f 64 2c 0a 20 20 20  olumnMethod,.   
5790: 20 2f 2a 20 78 52 6f 77 69 64 20 20 20 20 20 20   /* xRowid      
57a0: 20 20 2a 2f 20 66 74 73 35 56 6f 63 61 62 52 6f    */ fts5VocabRo
57b0: 77 69 64 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f  widMethod,.    /
57c0: 2a 20 78 55 70 64 61 74 65 20 20 20 20 20 20 20  * xUpdate       
57d0: 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 78 42 65  */ 0,.    /* xBe
57e0: 67 69 6e 20 20 20 20 20 20 20 20 2a 2f 20 30 2c  gin        */ 0,
57f0: 0a 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 20 20  .    /* xSync   
5800: 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
5810: 2f 2a 20 78 43 6f 6d 6d 69 74 20 20 20 20 20 20  /* xCommit      
5820: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 78 52   */ 0,.    /* xR
5830: 6f 6c 6c 62 61 63 6b 20 20 20 20 20 2a 2f 20 30  ollback     */ 0
5840: 2c 0a 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75  ,.    /* xFindFu
5850: 6e 63 74 69 6f 6e 20 2a 2f 20 30 2c 0a 20 20 20  nction */ 0,.   
5860: 20 2f 2a 20 78 52 65 6e 61 6d 65 20 20 20 20 20   /* xRename     
5870: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 78    */ 0,.    /* x
5880: 53 61 76 65 70 6f 69 6e 74 20 20 20 20 2a 2f 20  Savepoint    */ 
5890: 30 2c 0a 20 20 20 20 2f 2a 20 78 52 65 6c 65 61  0,.    /* xRelea
58a0: 73 65 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20  se      */ 0,.  
58b0: 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f    /* xRollbackTo
58c0: 20 20 20 2a 2f 20 30 2c 0a 20 20 7d 3b 0a 20 20     */ 0,.  };.  
58d0: 76 6f 69 64 20 2a 70 20 3d 20 28 76 6f 69 64 2a  void *p = (void*
58e0: 29 70 47 6c 6f 62 61 6c 3b 0a 0a 20 20 72 65 74  )pGlobal;..  ret
58f0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61  urn sqlite3_crea
5900: 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c  te_module_v2(db,
5910: 20 22 66 74 73 35 76 6f 63 61 62 22 2c 20 26 66   "fts5vocab", &f
5920: 74 73 35 56 6f 63 61 62 2c 20 70 2c 20 30 29 3b  ts5Vocab, p, 0);
5930: 0a 7d 0a 0a 0a                                   .}...