/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1:


0000: 2f 2a 0a 2a 2a 20 32 30 31 31 20 4a 61 6e 20 32  /*.** 2011 Jan 2
0010: 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  7.**.** 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 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 61 72   file is not par
0190: 74 20 6f 66 20 74 68 65 20 70 72 6f 64 75 63 74  t of the product
01a0: 69 6f 6e 20 46 54 53 20 63 6f 64 65 2e 20 49 74  ion FTS code. It
01b0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
01c0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 2e 20 49 74  r.** testing. It
01d0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 76 69 72 74   contains a virt
01e0: 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d  ual table implem
01f0: 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 70 72  entation that pr
0200: 6f 76 69 64 65 73 20 64 69 72 65 63 74 20 0a 2a  ovides direct .*
0210: 2a 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  * access to the 
0220: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
0230: 6f 66 20 61 6e 20 46 54 53 20 74 61 62 6c 65 2e  of an FTS table.
0240: 20 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22   .*/..#include "
0250: 66 74 73 33 49 6e 74 2e 68 22 0a 23 69 66 20 21  fts3Int.h".#if !
0260: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
0270: 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ORE) || defined(
0280: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
0290: 53 33 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  S3).#ifdef SQLIT
02a0: 45 5f 54 45 53 54 0a 0a 23 69 6e 63 6c 75 64 65  E_TEST..#include
02b0: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
02c0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
02d0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
02e0: 2e 68 3e 0a 0a 74 79 70 65 64 65 66 20 73 74 72  .h>..typedef str
02f0: 75 63 74 20 46 74 73 33 74 65 72 6d 54 61 62 6c  uct Fts3termTabl
0300: 65 20 46 74 73 33 74 65 72 6d 54 61 62 6c 65 3b  e Fts3termTable;
0310: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0320: 46 74 73 33 74 65 72 6d 43 75 72 73 6f 72 20 46  Fts3termCursor F
0330: 74 73 33 74 65 72 6d 43 75 72 73 6f 72 3b 0a 0a  ts3termCursor;..
0340: 73 74 72 75 63 74 20 46 74 73 33 74 65 72 6d 54  struct Fts3termT
0350: 61 62 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  able {.  sqlite3
0360: 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20 20 20  _vtab base;     
0370: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
0380: 20 63 6c 61 73 73 20 75 73 65 64 20 62 79 20 53   class used by S
0390: 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 20 20  QLite core */.  
03a0: 69 6e 74 20 69 49 6e 64 65 78 3b 20 20 20 20 20  int iIndex;     
03b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03c0: 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46 74 73  /* Index for Fts
03d0: 33 54 61 62 6c 65 2e 61 49 6e 64 65 78 5b 5d 20  3Table.aIndex[] 
03e0: 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  */.  Fts3Table *
03f0: 70 46 74 73 33 54 61 62 3b 0a 7d 3b 0a 0a 73 74  pFts3Tab;.};..st
0400: 72 75 63 74 20 46 74 73 33 74 65 72 6d 43 75 72  ruct Fts3termCur
0410: 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
0420: 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
0430: 3b 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20  ;       /* Base 
0440: 63 6c 61 73 73 20 75 73 65 64 20 62 79 20 53 51  class used by SQ
0450: 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 20 20 46  Lite core */.  F
0460: 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
0470: 72 20 63 73 72 3b 20 20 20 20 20 20 20 20 2f 2a  r csr;        /*
0480: 20 4d 75 73 74 20 62 65 20 72 69 67 68 74 20 61   Must be right a
0490: 66 74 65 72 20 22 62 61 73 65 22 20 2a 2f 0a 20  fter "base" */. 
04a0: 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 66   Fts3SegFilter f
04b0: 69 6c 74 65 72 3b 0a 0a 20 20 69 6e 74 20 69 73  ilter;..  int is
04c0: 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Eof;            
04d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
04e0: 65 20 69 66 20 63 75 72 73 6f 72 20 69 73 20 61  e if cursor is a
04f0: 74 20 45 4f 46 20 2a 2f 0a 20 20 63 68 61 72 20  t EOF */.  char 
0500: 2a 70 4e 65 78 74 3b 0a 0a 20 20 73 71 6c 69 74  *pNext;..  sqlit
0510: 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b  e3_int64 iRowid;
0520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
0530: 72 72 65 6e 74 20 27 72 6f 77 69 64 27 20 76 61  rrent 'rowid' va
0540: 6c 75 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  lue */.  sqlite3
0550: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20  _int64 iDocid;  
0560: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
0570: 65 6e 74 20 27 64 6f 63 69 64 27 20 76 61 6c 75  ent 'docid' valu
0580: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  e */.  int iCol;
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
05b0: 74 20 27 63 6f 6c 27 20 76 61 6c 75 65 20 2a 2f  t 'col' value */
05c0: 0a 20 20 69 6e 74 20 69 50 6f 73 3b 20 20 20 20  .  int iPos;    
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 70     /* Current 'p
05f0: 6f 73 27 20 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a  os' value */.};.
0600: 0a 2f 2a 0a 2a 2a 20 53 63 68 65 6d 61 20 6f 66  ./*.** Schema of
0610: 20 74 68 65 20 74 65 72 6d 73 20 74 61 62 6c 65   the terms table
0620: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ..*/.#define FTS
0630: 33 5f 54 45 52 4d 53 5f 53 43 48 45 4d 41 20 22  3_TERMS_SCHEMA "
0640: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 74  CREATE TABLE x(t
0650: 65 72 6d 2c 20 64 6f 63 69 64 2c 20 63 6f 6c 2c  erm, docid, col,
0660: 20 70 6f 73 29 22 0a 0a 2f 2a 0a 2a 2a 20 54 68   pos)"../*.** Th
0670: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
0680: 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 66 6f   all the work fo
0690: 72 20 62 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e  r both the xConn
06a0: 65 63 74 20 61 6e 64 20 78 43 72 65 61 74 65 20  ect and xCreate 
06b0: 6d 65 74 68 6f 64 73 2e 0a 2a 2a 20 54 68 65 73  methods..** Thes
06c0: 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e 6f  e tables have no
06d0: 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72   persistent repr
06e0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
06f0: 65 69 72 20 6f 77 6e 2c 20 73 6f 20 78 43 6f 6e  eir own, so xCon
0700: 6e 65 63 74 0a 2a 2a 20 61 6e 64 20 78 43 72 65  nect.** and xCre
0710: 61 74 65 20 61 72 65 20 69 64 65 6e 74 69 63 61  ate are identica
0720: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  l operations..*/
0730: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
0740: 74 65 72 6d 43 6f 6e 6e 65 63 74 4d 65 74 68 6f  termConnectMetho
0750: 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
0760: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0770: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
0780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
0790: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   /* Non-zero for
07c0: 20 61 6e 20 66 74 73 34 70 72 65 66 69 78 20 74   an fts4prefix t
07d0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 72  able */.  int ar
07e0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
07f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0800: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
0810: 69 6e 20 61 72 67 76 20 61 72 72 61 79 20 2a 2f  in argv array */
0820: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  .  const char * 
0830: 63 6f 6e 73 74 20 2a 61 72 67 76 2c 20 20 20 20  const *argv,    
0840: 20 20 20 2f 2a 20 78 43 72 65 61 74 65 2f 78 43     /* xCreate/xC
0850: 6f 6e 6e 65 63 74 20 61 72 67 75 6d 65 6e 74 20  onnect argument 
0860: 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74  array */.  sqlit
0870: 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62  e3_vtab **ppVtab
0880: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  ,          /* OU
0890: 54 3a 20 4e 65 77 20 73 71 6c 69 74 65 33 5f 76  T: New sqlite3_v
08a0: 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tab object */.  
08b0: 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20  char **pzErr    
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 2f 2a 20 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f  /* OUT: sqlite3_
08e0: 6d 61 6c 6c 6f 63 27 64 20 65 72 72 6f 72 20 6d  malloc'd error m
08f0: 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 63  essage */.){.  c
0900: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 62 3b 20  har const *zDb; 
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0920: 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61  * Name of databa
0930: 73 65 20 28 65 2e 67 2e 20 22 6d 61 69 6e 22 29  se (e.g. "main")
0940: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
0950: 20 2a 7a 46 74 73 33 3b 20 20 20 20 20 20 20 20   *zFts3;        
0960: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
0970: 20 66 74 73 33 20 74 61 62 6c 65 20 2a 2f 0a 20   fts3 table */. 
0980: 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20   int nDb;       
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 73 74   /* Result of st
09b0: 72 6c 65 6e 28 7a 44 62 29 20 2a 2f 0a 20 20 69  rlen(zDb) */.  i
09c0: 6e 74 20 6e 46 74 73 33 3b 20 20 20 20 20 20 20  nt nFts3;       
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
09e0: 2a 20 52 65 73 75 6c 74 20 6f 66 20 73 74 72 6c  * Result of strl
09f0: 65 6e 28 7a 46 74 73 33 29 20 2a 2f 0a 20 20 73  en(zFts3) */.  s
0a00: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
0a10: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  te;            /
0a20: 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
0a30: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 68 65 72   to allocate her
0a40: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 20 20 20 2f 2a 20 76 61 6c 75 65 20         /* value 
0a70: 72 65 74 75 72 6e 65 64 20 62 79 20 64 65 63 6c  returned by decl
0a80: 61 72 65 5f 76 74 61 62 28 29 20 2a 2f 0a 20 20  are_vtab() */.  
0a90: 46 74 73 33 74 65 72 6d 54 61 62 6c 65 20 2a 70  Fts3termTable *p
0aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0ab0: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
0ac0: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
0ad0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  n */.  int iInde
0ae0: 78 20 3d 20 30 3b 0a 0a 20 20 55 4e 55 53 45 44  x = 0;..  UNUSED
0af0: 5f 50 41 52 41 4d 45 54 45 52 28 70 43 74 78 29  _PARAMETER(pCtx)
0b00: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
0b10: 29 7b 0a 20 20 20 20 69 49 6e 64 65 78 20 3d 20  ){.    iIndex = 
0b20: 61 74 6f 69 28 61 72 67 76 5b 34 5d 29 3b 0a 20  atoi(argv[4]);. 
0b30: 20 20 20 61 72 67 63 2d 2d 3b 0a 20 20 7d 0a 0a     argc--;.  }..
0b40: 20 20 2f 2a 20 54 68 65 20 75 73 65 72 20 73 68    /* The user sh
0b50: 6f 75 6c 64 20 73 70 65 63 69 66 79 20 61 20 73  ould specify a s
0b60: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 2d  ingle argument -
0b70: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
0b80: 66 74 73 33 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  fts3 table. */. 
0b90: 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a   if( argc!=4 ){.
0ba0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45      sqlite3Fts3E
0bb0: 72 72 4d 73 67 28 70 7a 45 72 72 2c 0a 20 20 20  rrMsg(pzErr,.   
0bc0: 20 20 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d 62       "wrong numb
0bd0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
0be0: 74 6f 20 66 74 73 34 74 65 72 6d 20 63 6f 6e 73  to fts4term cons
0bf0: 74 72 75 63 74 6f 72 22 0a 20 20 20 20 29 3b 0a  tructor".    );.
0c00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0c10: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
0c20: 7a 44 62 20 3d 20 61 72 67 76 5b 31 5d 3b 20 0a  zDb = argv[1]; .
0c30: 20 20 6e 44 62 20 3d 20 28 69 6e 74 29 73 74 72    nDb = (int)str
0c40: 6c 65 6e 28 7a 44 62 29 3b 0a 20 20 7a 46 74 73  len(zDb);.  zFts
0c50: 33 20 3d 20 61 72 67 76 5b 33 5d 3b 0a 20 20 6e  3 = argv[3];.  n
0c60: 46 74 73 33 20 3d 20 28 69 6e 74 29 73 74 72 6c  Fts3 = (int)strl
0c70: 65 6e 28 7a 46 74 73 33 29 3b 0a 0a 20 20 72 63  en(zFts3);..  rc
0c80: 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61   = sqlite3_decla
0c90: 72 65 5f 76 74 61 62 28 64 62 2c 20 46 54 53 33  re_vtab(db, FTS3
0ca0: 5f 54 45 52 4d 53 5f 53 43 48 45 4d 41 29 3b 0a  _TERMS_SCHEMA);.
0cb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
0cc0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
0cd0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ..  nByte = size
0ce0: 6f 66 28 46 74 73 33 74 65 72 6d 54 61 62 6c 65  of(Fts3termTable
0cf0: 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 54  ) + sizeof(Fts3T
0d00: 61 62 6c 65 29 20 2b 20 6e 44 62 20 2b 20 6e 46  able) + nDb + nF
0d10: 74 73 33 20 2b 20 32 3b 0a 20 20 70 20 3d 20 28  ts3 + 2;.  p = (
0d20: 46 74 73 33 74 65 72 6d 54 61 62 6c 65 20 2a 29  Fts3termTable *)
0d30: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
0d40: 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21  (nByte);.  if( !
0d50: 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  p ) return SQLIT
0d60: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  E_NOMEM;.  memse
0d70: 74 28 70 2c 20 30 2c 20 28 73 69 7a 65 5f 74 29  t(p, 0, (size_t)
0d80: 6e 42 79 74 65 29 3b 0a 0a 20 20 70 2d 3e 70 46  nByte);..  p->pF
0d90: 74 73 33 54 61 62 20 3d 20 28 46 74 73 33 54 61  ts3Tab = (Fts3Ta
0da0: 62 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 70  ble *)&p[1];.  p
0db0: 2d 3e 70 46 74 73 33 54 61 62 2d 3e 7a 44 62 20  ->pFts3Tab->zDb 
0dc0: 3d 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 70 46  = (char *)&p->pF
0dd0: 74 73 33 54 61 62 5b 31 5d 3b 0a 20 20 70 2d 3e  ts3Tab[1];.  p->
0de0: 70 46 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65 20  pFts3Tab->zName 
0df0: 3d 20 26 70 2d 3e 70 46 74 73 33 54 61 62 2d 3e  = &p->pFts3Tab->
0e00: 7a 44 62 5b 6e 44 62 2b 31 5d 3b 0a 20 20 70 2d  zDb[nDb+1];.  p-
0e10: 3e 70 46 74 73 33 54 61 62 2d 3e 64 62 20 3d 20  >pFts3Tab->db = 
0e20: 64 62 3b 0a 20 20 70 2d 3e 70 46 74 73 33 54 61  db;.  p->pFts3Ta
0e30: 62 2d 3e 6e 49 6e 64 65 78 20 3d 20 69 49 6e 64  b->nIndex = iInd
0e40: 65 78 2b 31 3b 0a 20 20 70 2d 3e 69 49 6e 64 65  ex+1;.  p->iInde
0e50: 78 20 3d 20 69 49 6e 64 65 78 3b 0a 0a 20 20 6d  x = iIndex;..  m
0e60: 65 6d 63 70 79 28 28 63 68 61 72 20 2a 29 70 2d  emcpy((char *)p-
0e70: 3e 70 46 74 73 33 54 61 62 2d 3e 7a 44 62 2c 20  >pFts3Tab->zDb, 
0e80: 7a 44 62 2c 20 6e 44 62 29 3b 0a 20 20 6d 65 6d  zDb, nDb);.  mem
0e90: 63 70 79 28 28 63 68 61 72 20 2a 29 70 2d 3e 70  cpy((char *)p->p
0ea0: 46 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  Fts3Tab->zName, 
0eb0: 7a 46 74 73 33 2c 20 6e 46 74 73 33 29 3b 0a 20  zFts3, nFts3);. 
0ec0: 20 73 71 6c 69 74 65 33 46 74 73 33 44 65 71 75   sqlite3Fts3Dequ
0ed0: 6f 74 65 28 28 63 68 61 72 20 2a 29 70 2d 3e 70  ote((char *)p->p
0ee0: 46 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  Fts3Tab->zName);
0ef0: 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73  ..  *ppVtab = (s
0f00: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70 3b  qlite3_vtab *)p;
0f10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
0f20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
0f30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
0f40: 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 62 6f   the work for bo
0f50: 74 68 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  th the xDisconne
0f60: 63 74 20 61 6e 64 20 78 44 65 73 74 72 6f 79 20  ct and xDestroy 
0f70: 6d 65 74 68 6f 64 73 2e 0a 2a 2a 20 54 68 65 73  methods..** Thes
0f80: 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e 6f  e tables have no
0f90: 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72   persistent repr
0fa0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
0fb0: 65 69 72 20 6f 77 6e 2c 20 73 6f 20 78 44 69 73  eir own, so xDis
0fc0: 63 6f 6e 6e 65 63 74 0a 2a 2a 20 61 6e 64 20 78  connect.** and x
0fd0: 44 65 73 74 72 6f 79 20 61 72 65 20 69 64 65 6e  Destroy are iden
0fe0: 74 69 63 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73  tical operations
0ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1000: 66 74 73 33 74 65 72 6d 44 69 73 63 6f 6e 6e 65  fts3termDisconne
1010: 63 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  ctMethod(sqlite3
1020: 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
1030: 20 46 74 73 33 74 65 72 6d 54 61 62 6c 65 20 2a   Fts3termTable *
1040: 70 20 3d 20 28 46 74 73 33 74 65 72 6d 54 61 62  p = (Fts3termTab
1050: 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 46 74  le *)pVtab;.  Ft
1060: 73 33 54 61 62 6c 65 20 2a 70 46 74 73 33 20 3d  s3Table *pFts3 =
1070: 20 70 2d 3e 70 46 74 73 33 54 61 62 3b 0a 20 20   p->pFts3Tab;.  
1080: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65  int i;..  /* Fre
1090: 65 20 61 6e 79 20 70 72 65 70 61 72 65 64 20 73  e any prepared s
10a0: 74 61 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 2a  tatements held *
10b0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53  /.  for(i=0; i<S
10c0: 69 7a 65 6f 66 41 72 72 61 79 28 70 46 74 73 33  izeofArray(pFts3
10d0: 2d 3e 61 53 74 6d 74 29 3b 20 69 2b 2b 29 7b 0a  ->aStmt); i++){.
10e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
10f0: 6c 69 7a 65 28 70 46 74 73 33 2d 3e 61 53 74 6d  lize(pFts3->aStm
1100: 74 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  t[i]);.  }.  sql
1110: 69 74 65 33 5f 66 72 65 65 28 70 46 74 73 33 2d  ite3_free(pFts3-
1120: 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 29 3b 0a  >zSegmentsTbl);.
1130: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1140: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1150: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 64 65 66 69 6e  TE_OK;.}..#defin
1160: 65 20 46 54 53 34 41 55 58 5f 45 51 5f 43 4f 4e  e FTS4AUX_EQ_CON
1170: 53 54 52 41 49 4e 54 20 31 0a 23 64 65 66 69 6e  STRAINT 1.#defin
1180: 65 20 46 54 53 34 41 55 58 5f 47 45 5f 43 4f 4e  e FTS4AUX_GE_CON
1190: 53 54 52 41 49 4e 54 20 32 0a 23 64 65 66 69 6e  STRAINT 2.#defin
11a0: 65 20 46 54 53 34 41 55 58 5f 4c 45 5f 43 4f 4e  e FTS4AUX_LE_CON
11b0: 53 54 52 41 49 4e 54 20 34 0a 0a 2f 2a 0a 2a 2a  STRAINT 4../*.**
11c0: 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20 41 6e   xBestIndex - An
11d0: 61 6c 79 7a 65 20 61 20 57 48 45 52 45 20 61 6e  alyze a WHERE an
11e0: 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  d ORDER BY claus
11f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1200: 20 66 74 73 33 74 65 72 6d 42 65 73 74 49 6e 64   fts3termBestInd
1210: 65 78 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69  exMethod(.  sqli
1220: 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c  te3_vtab *pVTab,
1230: 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   .  sqlite3_inde
1240: 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 0a 29 7b  x_info *pInfo.){
1250: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1260: 54 45 52 28 70 56 54 61 62 29 3b 0a 0a 20 20 2f  TER(pVTab);..  /
1270: 2a 20 54 68 69 73 20 76 74 61 62 20 6e 61 74 75  * This vtab natu
1280: 72 61 6c 6c 79 20 64 6f 65 73 20 22 4f 52 44 45  rally does "ORDE
1290: 52 20 42 59 20 74 65 72 6d 2c 20 64 6f 63 69 64  R BY term, docid
12a0: 2c 20 63 6f 6c 2c 20 70 6f 73 22 2e 20 20 2a 2f  , col, pos".  */
12b0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4f  .  if( pInfo->nO
12c0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
12d0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
12e0: 3b 20 69 3c 70 49 6e 66 6f 2d 3e 6e 4f 72 64 65  ; i<pInfo->nOrde
12f0: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
1300: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 61 4f 72 64   if( pInfo->aOrd
1310: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 21  erBy[i].iColumn!
1320: 3d 69 20 7c 7c 20 70 49 6e 66 6f 2d 3e 61 4f 72  =i || pInfo->aOr
1330: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 29 20  derBy[i].desc ) 
1340: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1350: 20 69 66 28 20 69 3d 3d 70 49 6e 66 6f 2d 3e 6e   if( i==pInfo->n
1360: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1370: 20 70 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43   pInfo->orderByC
1380: 6f 6e 73 75 6d 65 64 20 3d 20 31 3b 0a 20 20 20  onsumed = 1;.   
1390: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
13a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13b0: 2a 0a 2a 2a 20 78 4f 70 65 6e 20 2d 20 4f 70 65  *.** xOpen - Ope
13c0: 6e 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  n a cursor..*/.s
13d0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 74 65  tatic int fts3te
13e0: 72 6d 4f 70 65 6e 4d 65 74 68 6f 64 28 73 71 6c  rmOpenMethod(sql
13f0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
1400: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
1410: 75 72 73 6f 72 20 2a 2a 70 70 43 73 72 29 7b 0a  ursor **ppCsr){.
1420: 20 20 46 74 73 33 74 65 72 6d 43 75 72 73 6f 72    Fts3termCursor
1430: 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20   *pCsr;         
1440: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1450: 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 74   cursor object t
1460: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 55  o return */..  U
1470: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1480: 70 56 54 61 62 29 3b 0a 0a 20 20 70 43 73 72 20  pVTab);..  pCsr 
1490: 3d 20 28 46 74 73 33 74 65 72 6d 43 75 72 73 6f  = (Fts3termCurso
14a0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
14b0: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 74 65  oc(sizeof(Fts3te
14c0: 72 6d 43 75 72 73 6f 72 29 29 3b 0a 20 20 69 66  rmCursor));.  if
14d0: 28 20 21 70 43 73 72 20 29 20 72 65 74 75 72 6e  ( !pCsr ) return
14e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14f0: 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c   memset(pCsr, 0,
1500: 20 73 69 7a 65 6f 66 28 46 74 73 33 74 65 72 6d   sizeof(Fts3term
1510: 43 75 72 73 6f 72 29 29 3b 0a 0a 20 20 2a 70 70  Cursor));..  *pp
1520: 43 73 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Csr = (sqlite3_v
1530: 74 61 62 5f 63 75 72 73 6f 72 20 2a 29 70 43 73  tab_cursor *)pCs
1540: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
1550: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1560: 78 43 6c 6f 73 65 20 2d 20 43 6c 6f 73 65 20 61  xClose - Close a
1570: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
1580: 69 63 20 69 6e 74 20 66 74 73 33 74 65 72 6d 43  ic int fts3termC
1590: 6c 6f 73 65 4d 65 74 68 6f 64 28 73 71 6c 69 74  loseMethod(sqlit
15a0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
15b0: 70 43 75 72 73 6f 72 29 7b 0a 20 20 46 74 73 33  pCursor){.  Fts3
15c0: 54 61 62 6c 65 20 2a 70 46 74 73 33 20 3d 20 28  Table *pFts3 = (
15d0: 28 46 74 73 33 74 65 72 6d 54 61 62 6c 65 20 2a  (Fts3termTable *
15e0: 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29  )pCursor->pVtab)
15f0: 2d 3e 70 46 74 73 33 54 61 62 3b 0a 20 20 46 74  ->pFts3Tab;.  Ft
1600: 73 33 74 65 72 6d 43 75 72 73 6f 72 20 2a 70 43  s3termCursor *pC
1610: 73 72 20 3d 20 28 46 74 73 33 74 65 72 6d 43 75  sr = (Fts3termCu
1620: 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a  rsor *)pCursor;.
1630: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
1640: 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 46 74 73  gmentsClose(pFts
1650: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  3);.  sqlite3Fts
1660: 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73 68  3SegReaderFinish
1670: 28 26 70 43 73 72 2d 3e 63 73 72 29 3b 0a 20 20  (&pCsr->csr);.  
1680: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
1690: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
16a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16b0: 20 78 4e 65 78 74 20 2d 20 41 64 76 61 6e 63 65   xNext - Advance
16c0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
16d0: 68 65 20 6e 65 78 74 20 72 6f 77 2c 20 69 66 20  he next row, if 
16e0: 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  any..*/.static i
16f0: 6e 74 20 66 74 73 33 74 65 72 6d 4e 65 78 74 4d  nt fts3termNextM
1700: 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74  ethod(sqlite3_vt
1710: 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  ab_cursor *pCurs
1720: 6f 72 29 7b 0a 20 20 46 74 73 33 74 65 72 6d 43  or){.  Fts3termC
1730: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
1740: 74 73 33 74 65 72 6d 43 75 72 73 6f 72 20 2a 29  ts3termCursor *)
1750: 70 43 75 72 73 6f 72 3b 0a 20 20 46 74 73 33 54  pCursor;.  Fts3T
1760: 61 62 6c 65 20 2a 70 46 74 73 33 20 3d 20 28 28  able *pFts3 = ((
1770: 46 74 73 33 74 65 72 6d 54 61 62 6c 65 20 2a 29  Fts3termTable *)
1780: 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 2d  pCursor->pVtab)-
1790: 3e 70 46 74 73 33 54 61 62 3b 0a 20 20 69 6e 74  >pFts3Tab;.  int
17a0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   rc;.  sqlite3_i
17b0: 6e 74 36 34 20 76 3b 0a 0a 20 20 2f 2a 20 49 6e  nt64 v;..  /* In
17c0: 63 72 65 6d 65 6e 74 20 6f 75 72 20 70 72 65 74  crement our pret
17d0: 65 6e 64 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  end rowid value.
17e0: 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77   */.  pCsr->iRow
17f0: 69 64 2b 2b 3b 0a 0a 20 20 2f 2a 20 41 64 76 61  id++;..  /* Adva
1800: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
1810: 74 65 72 6d 20 69 6e 20 74 68 65 20 66 75 6c 6c  term in the full
1820: 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 2a 2f 0a  -text index. */.
1830: 20 20 69 66 28 20 70 43 73 72 2d 3e 63 73 72 2e    if( pCsr->csr.
1840: 61 44 6f 63 6c 69 73 74 3d 3d 30 20 0a 20 20 20  aDoclist==0 .   
1850: 7c 7c 20 70 43 73 72 2d 3e 70 4e 65 78 74 3e 3d  || pCsr->pNext>=
1860: 26 70 43 73 72 2d 3e 63 73 72 2e 61 44 6f 63 6c  &pCsr->csr.aDocl
1870: 69 73 74 5b 70 43 73 72 2d 3e 63 73 72 2e 6e 44  ist[pCsr->csr.nD
1880: 6f 63 6c 69 73 74 2d 31 5d 0a 20 20 29 7b 0a 20  oclist-1].  ){. 
1890: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
18a0: 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70  ts3SegReaderStep
18b0: 28 70 46 74 73 33 2c 20 26 70 43 73 72 2d 3e 63  (pFts3, &pCsr->c
18c0: 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sr);.    if( rc!
18d0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
18e0: 20 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66       pCsr->isEof
18f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
1900: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1910: 20 20 70 43 73 72 2d 3e 69 43 6f 6c 20 3d 20 30    pCsr->iCol = 0
1920: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69 50 6f 73  ;.    pCsr->iPos
1930: 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
1940: 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20  iDocid = 0;.    
1950: 70 43 73 72 2d 3e 70 4e 65 78 74 20 3d 20 70 43  pCsr->pNext = pC
1960: 73 72 2d 3e 63 73 72 2e 61 44 6f 63 6c 69 73 74  sr->csr.aDoclist
1970: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 64  ;..    /* Read d
1980: 6f 63 69 64 20 2a 2f 0a 20 20 20 20 70 43 73 72  ocid */.    pCsr
1990: 2d 3e 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74  ->pNext += sqlit
19a0: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
19b0: 70 43 73 72 2d 3e 70 4e 65 78 74 2c 20 26 70 43  pCsr->pNext, &pC
19c0: 73 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20 7d  sr->iDocid);.  }
19d0: 0a 0a 20 20 70 43 73 72 2d 3e 70 4e 65 78 74 20  ..  pCsr->pNext 
19e0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
19f0: 74 56 61 72 69 6e 74 28 70 43 73 72 2d 3e 70 4e  tVarint(pCsr->pN
1a00: 65 78 74 2c 20 26 76 29 3b 0a 20 20 69 66 28 20  ext, &v);.  if( 
1a10: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 73 72  v==0 ){.    pCsr
1a20: 2d 3e 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74  ->pNext += sqlit
1a30: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
1a40: 70 43 73 72 2d 3e 70 4e 65 78 74 2c 20 26 76 29  pCsr->pNext, &v)
1a50: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69 44 6f 63  ;.    pCsr->iDoc
1a60: 69 64 20 2b 3d 20 76 3b 0a 20 20 20 20 70 43 73  id += v;.    pCs
1a70: 72 2d 3e 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69  r->pNext += sqli
1a80: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
1a90: 28 70 43 73 72 2d 3e 70 4e 65 78 74 2c 20 26 76  (pCsr->pNext, &v
1aa0: 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69 43 6f  );.    pCsr->iCo
1ab0: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d  l = 0;.    pCsr-
1ac0: 3e 69 50 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >iPos = 0;.  }..
1ad0: 20 20 69 66 28 20 76 3d 3d 31 20 29 7b 0a 20 20    if( v==1 ){.  
1ae0: 20 20 70 43 73 72 2d 3e 70 4e 65 78 74 20 2b 3d    pCsr->pNext +=
1af0: 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
1b00: 61 72 69 6e 74 28 70 43 73 72 2d 3e 70 4e 65 78  arint(pCsr->pNex
1b10: 74 2c 20 26 76 29 3b 0a 20 20 20 20 70 43 73 72  t, &v);.    pCsr
1b20: 2d 3e 69 43 6f 6c 20 2b 3d 20 28 69 6e 74 29 76  ->iCol += (int)v
1b30: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69 50 6f 73  ;.    pCsr->iPos
1b40: 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
1b50: 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65 33  pNext += sqlite3
1b60: 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43  Fts3GetVarint(pC
1b70: 73 72 2d 3e 70 4e 65 78 74 2c 20 26 76 29 3b 0a  sr->pNext, &v);.
1b80: 20 20 7d 0a 0a 20 20 70 43 73 72 2d 3e 69 50 6f    }..  pCsr->iPo
1b90: 73 20 2b 3d 20 28 69 6e 74 29 28 76 20 2d 20 32  s += (int)(v - 2
1ba0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
1bb0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1bc0: 20 78 46 69 6c 74 65 72 20 2d 20 49 6e 69 74 69   xFilter - Initi
1bd0: 61 6c 69 7a 65 20 61 20 63 75 72 73 6f 72 20 74  alize a cursor t
1be0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 73  o point at the s
1bf0: 74 61 72 74 20 6f 66 20 69 74 73 20 64 61 74 61  tart of its data
1c00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c10: 66 74 73 33 74 65 72 6d 46 69 6c 74 65 72 4d 65  fts3termFilterMe
1c20: 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
1c30: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
1c40: 72 73 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63  rsor,   /* The c
1c50: 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74  ursor used for t
1c60: 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
1c70: 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20  nt idxNum,      
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c90: 2a 20 53 74 72 61 74 65 67 79 20 69 6e 64 65 78  * Strategy index
1ca0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1cb0: 20 2a 69 64 78 53 74 72 2c 20 20 20 20 20 20 20   *idxStr,       
1cc0: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
1cd0: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d00: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70  f elements in ap
1d10: 56 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  Val */.  sqlite3
1d20: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
1d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
1d40: 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e  ments for the in
1d50: 64 65 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f  dexing scheme */
1d60: 0a 29 7b 0a 20 20 46 74 73 33 74 65 72 6d 43 75  .){.  Fts3termCu
1d70: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
1d80: 73 33 74 65 72 6d 43 75 72 73 6f 72 20 2a 29 70  s3termCursor *)p
1d90: 43 75 72 73 6f 72 3b 0a 20 20 46 74 73 33 74 65  Cursor;.  Fts3te
1da0: 72 6d 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  rmTable *p = (Ft
1db0: 73 33 74 65 72 6d 54 61 62 6c 65 20 2a 29 70 43  s3termTable *)pC
1dc0: 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20  ursor->pVtab;.  
1dd0: 46 74 73 33 54 61 62 6c 65 20 2a 70 46 74 73 33  Fts3Table *pFts3
1de0: 20 3d 20 70 2d 3e 70 46 74 73 33 54 61 62 3b 0a   = p->pFts3Tab;.
1df0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 55 4e 55    int rc;..  UNU
1e00: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 56  SED_PARAMETER(nV
1e10: 61 6c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  al);.  UNUSED_PA
1e20: 52 41 4d 45 54 45 52 28 69 64 78 4e 75 6d 29 3b  RAMETER(idxNum);
1e30: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1e40: 54 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20 55  TER(idxStr);.  U
1e50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1e60: 61 70 56 61 6c 29 3b 0a 0a 20 20 61 73 73 65 72  apVal);..  asser
1e70: 74 28 20 69 64 78 53 74 72 3d 3d 30 20 26 26 20  t( idxStr==0 && 
1e80: 69 64 78 4e 75 6d 3d 3d 30 20 29 3b 0a 0a 20 20  idxNum==0 );..  
1e90: 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 69 73 20  /* In case this 
1ea0: 63 75 72 73 6f 72 20 69 73 20 62 65 69 6e 67 20  cursor is being 
1eb0: 72 65 75 73 65 64 2c 20 63 6c 6f 73 65 20 61 6e  reused, close an
1ec0: 64 20 7a 65 72 6f 20 69 74 2e 20 2a 2f 0a 20 20  d zero it. */.  
1ed0: 74 65 73 74 63 61 73 65 28 70 43 73 72 2d 3e 66  testcase(pCsr->f
1ee0: 69 6c 74 65 72 2e 7a 54 65 72 6d 29 3b 0a 20 20  ilter.zTerm);.  
1ef0: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
1f00: 61 64 65 72 46 69 6e 69 73 68 28 26 70 43 73 72  aderFinish(&pCsr
1f10: 2d 3e 63 73 72 29 3b 0a 20 20 6d 65 6d 73 65 74  ->csr);.  memset
1f20: 28 26 70 43 73 72 2d 3e 63 73 72 2c 20 30 2c 20  (&pCsr->csr, 0, 
1f30: 28 28 75 38 2a 29 26 70 43 73 72 5b 31 5d 29 20  ((u8*)&pCsr[1]) 
1f40: 2d 20 28 75 38 2a 29 26 70 43 73 72 2d 3e 63 73  - (u8*)&pCsr->cs
1f50: 72 29 3b 0a 0a 20 20 70 43 73 72 2d 3e 66 69 6c  r);..  pCsr->fil
1f60: 74 65 72 2e 66 6c 61 67 73 20 3d 20 46 54 53 33  ter.flags = FTS3
1f70: 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45  _SEGMENT_REQUIRE
1f80: 5f 50 4f 53 7c 46 54 53 33 5f 53 45 47 4d 45 4e  _POS|FTS3_SEGMEN
1f90: 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a  T_IGNORE_EMPTY;.
1fa0: 20 20 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e 66    pCsr->filter.f
1fb0: 6c 61 67 73 20 7c 3d 20 46 54 53 33 5f 53 45 47  lags |= FTS3_SEG
1fc0: 4d 45 4e 54 5f 53 43 41 4e 3b 0a 0a 20 20 72 63  MENT_SCAN;..  rc
1fd0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65   = sqlite3Fts3Se
1fe0: 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 70 46  gReaderCursor(pF
1ff0: 74 73 33 2c 20 30 2c 20 70 2d 3e 69 49 6e 64 65  ts3, 0, p->iInde
2000: 78 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  x, FTS3_SEGCURSO
2010: 52 5f 41 4c 4c 2c 0a 20 20 20 20 20 20 70 43 73  R_ALL,.      pCs
2020: 72 2d 3e 66 69 6c 74 65 72 2e 7a 54 65 72 6d 2c  r->filter.zTerm,
2030: 20 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e 6e 54   pCsr->filter.nT
2040: 65 72 6d 2c 20 30 2c 20 31 2c 20 26 70 43 73 72  erm, 0, 1, &pCsr
2050: 2d 3e 63 73 72 0a 20 20 29 3b 0a 20 20 69 66 28  ->csr.  );.  if(
2060: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2070: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2080: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
2090: 74 61 72 74 28 70 46 74 73 33 2c 20 26 70 43 73  tart(pFts3, &pCs
20a0: 72 2d 3e 63 73 72 2c 20 26 70 43 73 72 2d 3e 66  r->csr, &pCsr->f
20b0: 69 6c 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  ilter);.  }.  if
20c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
20e0: 74 65 72 6d 4e 65 78 74 4d 65 74 68 6f 64 28 70  termNextMethod(p
20f0: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  Cursor);.  }.  r
2100: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2110: 2a 2a 20 78 45 6f 66 20 2d 20 52 65 74 75 72 6e  ** xEof - Return
2120: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
2130: 73 6f 72 20 69 73 20 61 74 20 45 4f 46 2c 20 6f  sor is at EOF, o
2140: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
2150: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2160: 20 66 74 73 33 74 65 72 6d 45 6f 66 4d 65 74 68   fts3termEofMeth
2170: 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  od(sqlite3_vtab_
2180: 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29  cursor *pCursor)
2190: 7b 0a 20 20 46 74 73 33 74 65 72 6d 43 75 72 73  {.  Fts3termCurs
21a0: 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33  or *pCsr = (Fts3
21b0: 74 65 72 6d 43 75 72 73 6f 72 20 2a 29 70 43 75  termCursor *)pCu
21c0: 72 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  rsor;.  return p
21d0: 43 73 72 2d 3e 69 73 45 6f 66 3b 0a 7d 0a 0a 2f  Csr->isEof;.}../
21e0: 2a 0a 2a 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 52  *.** xColumn - R
21f0: 65 74 75 72 6e 20 61 20 63 6f 6c 75 6d 6e 20 76  eturn a column v
2200: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
2210: 69 6e 74 20 66 74 73 33 74 65 72 6d 43 6f 6c 75  int fts3termColu
2220: 6d 6e 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69  mnMethod(.  sqli
2230: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
2240: 2a 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20 43  *pCursor,   /* C
2250: 75 72 73 6f 72 20 74 6f 20 72 65 74 72 69 65 76  ursor to retriev
2260: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a  e value from */.
2270: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2280: 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
2290: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
22a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
22b0: 78 78 78 28 29 20 63 61 6c 6c 73 20 2a 2f 0a 20  xxx() calls */. 
22c0: 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
22f0: 75 6d 6e 20 74 6f 20 72 65 61 64 20 76 61 6c 75  umn to read valu
2300: 65 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 46  e from */.){.  F
2310: 74 73 33 74 65 72 6d 43 75 72 73 6f 72 20 2a 70  ts3termCursor *p
2320: 20 3d 20 28 46 74 73 33 74 65 72 6d 43 75 72 73   = (Fts3termCurs
2330: 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a 20  or *)pCursor;.. 
2340: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
2350: 20 26 26 20 69 43 6f 6c 3c 3d 33 20 29 3b 0a 20   && iCol<=3 );. 
2360: 20 73 77 69 74 63 68 28 20 69 43 6f 6c 20 29 7b   switch( iCol ){
2370: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20  .    case 0:.   
2380: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2390: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 70 2d 3e  t_text(pCtx, p->
23a0: 63 73 72 2e 7a 54 65 72 6d 2c 20 70 2d 3e 63 73  csr.zTerm, p->cs
23b0: 72 2e 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f  r.nTerm, SQLITE_
23c0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
23d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
23e0: 65 20 31 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  e 1:.      sqlit
23f0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
2400: 70 43 74 78 2c 20 70 2d 3e 69 44 6f 63 69 64 29  pCtx, p->iDocid)
2410: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2420: 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
2430: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2440: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 69  int64(pCtx, p->i
2450: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Col);.      brea
2460: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
2470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2480: 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
2490: 20 70 2d 3e 69 50 6f 73 29 3b 0a 20 20 20 20 20   p->iPos);.     
24a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72   break;.  }..  r
24b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 52 6f 77 69 64  .}../*.** xRowid
24d0: 20 2d 20 52 65 74 75 72 6e 20 74 68 65 20 63 75   - Return the cu
24e0: 72 72 65 6e 74 20 72 6f 77 69 64 20 66 6f 72 20  rrent rowid for 
24f0: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  the cursor..*/.s
2500: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 74 65  tatic int fts3te
2510: 72 6d 52 6f 77 69 64 4d 65 74 68 6f 64 28 0a 20  rmRowidMethod(. 
2520: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
2530: 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 20  rsor *pCursor,  
2540: 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
2550: 74 72 69 65 76 65 20 76 61 6c 75 65 20 66 72 6f  trieve value fro
2560: 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e  m */.  sqlite_in
2570: 74 36 34 20 2a 70 52 6f 77 69 64 20 20 20 20 20  t64 *pRowid     
2580: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2590: 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  owid value */.){
25a0: 0a 20 20 46 74 73 33 74 65 72 6d 43 75 72 73 6f  .  Fts3termCurso
25b0: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33 74  r *pCsr = (Fts3t
25c0: 65 72 6d 43 75 72 73 6f 72 20 2a 29 70 43 75 72  ermCursor *)pCur
25d0: 73 6f 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d  sor;.  *pRowid =
25e0: 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20   pCsr->iRowid;. 
25f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2600: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
2610: 73 74 65 72 20 74 68 65 20 66 74 73 33 74 65 72  ster the fts3ter
2620: 6d 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61  m module with da
2630: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2640: 6e 20 64 62 2e 20 52 65 74 75 72 6e 20 53 51 4c  n db. Return SQL
2650: 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
2660: 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 65 72  cessful or an er
2670: 72 6f 72 20 63 6f 64 65 20 69 66 20 73 71 6c 69  ror code if sqli
2680: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
2690: 65 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  e() fails..*/.in
26a0: 74 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  t sqlite3Fts3Ini
26b0: 74 54 65 72 6d 28 73 71 6c 69 74 65 33 20 2a 64  tTerm(sqlite3 *d
26c0: 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
26d0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
26e0: 65 20 66 74 73 33 74 65 72 6d 5f 6d 6f 64 75 6c  e fts3term_modul
26f0: 65 20 3d 20 7b 0a 20 20 20 20 20 30 2c 20 20 20  e = {.     0,   
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2720: 69 6f 6e 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ion      */.    
2730: 20 66 74 73 33 74 65 72 6d 43 6f 6e 6e 65 63 74   fts3termConnect
2740: 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 2f 2a  Method,       /*
2750: 20 78 43 72 65 61 74 65 20 20 20 20 20 20 20 2a   xCreate       *
2760: 2f 0a 20 20 20 20 20 66 74 73 33 74 65 72 6d 43  /.     fts3termC
2770: 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 20 20 20  onnectMethod,   
2780: 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
2790: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73       */.     fts
27a0: 33 74 65 72 6d 42 65 73 74 49 6e 64 65 78 4d 65  3termBestIndexMe
27b0: 74 68 6f 64 2c 20 20 20 20 20 2f 2a 20 78 42 65  thod,     /* xBe
27c0: 73 74 49 6e 64 65 78 20 20 20 20 2a 2f 0a 20 20  stIndex    */.  
27d0: 20 20 20 66 74 73 33 74 65 72 6d 44 69 73 63 6f     fts3termDisco
27e0: 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 20 20 20 20  nnectMethod,    
27f0: 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 20  /* xDisconnect  
2800: 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 74 65 72   */.     fts3ter
2810: 6d 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f  mDisconnectMetho
2820: 64 2c 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f  d,    /* xDestro
2830: 79 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66  y      */.     f
2840: 74 73 33 74 65 72 6d 4f 70 65 6e 4d 65 74 68 6f  ts3termOpenMetho
2850: 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  d,          /* x
2860: 4f 70 65 6e 20 20 20 20 20 20 20 20 20 2a 2f 0a  Open         */.
2870: 20 20 20 20 20 66 74 73 33 74 65 72 6d 43 6c 6f       fts3termClo
2880: 73 65 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20  seMethod,       
2890: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20 20 20    /* xClose     
28a0: 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 74     */.     fts3t
28b0: 65 72 6d 46 69 6c 74 65 72 4d 65 74 68 6f 64 2c  ermFilterMethod,
28c0: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
28d0: 65 72 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  er       */.    
28e0: 20 66 74 73 33 74 65 72 6d 4e 65 78 74 4d 65 74   fts3termNextMet
28f0: 68 6f 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  hod,          /*
2900: 20 78 4e 65 78 74 20 20 20 20 20 20 20 20 20 2a   xNext         *
2910: 2f 0a 20 20 20 20 20 66 74 73 33 74 65 72 6d 45  /.     fts3termE
2920: 6f 66 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20  ofMethod,       
2930: 20 20 20 20 2f 2a 20 78 45 6f 66 20 20 20 20 20      /* xEof     
2940: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73       */.     fts
2950: 33 74 65 72 6d 43 6f 6c 75 6d 6e 4d 65 74 68 6f  3termColumnMetho
2960: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f  d,        /* xCo
2970: 6c 75 6d 6e 20 20 20 20 20 20 20 2a 2f 0a 20 20  lumn       */.  
2980: 20 20 20 66 74 73 33 74 65 72 6d 52 6f 77 69 64     fts3termRowid
2990: 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20 20  Method,         
29a0: 2f 2a 20 78 52 6f 77 69 64 20 20 20 20 20 20 20  /* xRowid       
29b0: 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20   */.     0,     
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65        /* xUpdate
29e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30         */.     0
29f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a10: 42 65 67 69 6e 20 20 20 20 20 20 20 20 2a 2f 0a  Begin        */.
2a20: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 2f 2a 20 78 53 79 6e 63 20 20 20 20 20 20    /* xSync      
2a50: 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20     */.     0,   
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
2a80: 69 74 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  it       */.    
2a90: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ab0: 20 78 52 6f 6c 6c 62 61 63 6b 20 20 20 20 20 2a   xRollback     *
2ac0: 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  /.     0,       
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63      /* xFindFunc
2af0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 30 2c 20  tion */.     0, 
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
2b20: 6e 61 6d 65 20 20 20 20 20 20 20 2a 2f 0a 20 20  name       */.  
2b30: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 20 20  /* xSavepoint   
2b60: 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20   */.     0,     
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73        /* xReleas
2b90: 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30  e      */.     0
2ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2bc0: 52 6f 6c 6c 62 61 63 6b 54 6f 20 20 20 2a 2f 0a  RollbackTo   */.
2bd0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d 65    /* xShadowName
2c00: 20 20 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 6e 74     */.  };.  int
2c10: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c30: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2c40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
2c50: 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c  reate_module(db,
2c60: 20 22 66 74 73 34 74 65 72 6d 22 2c 20 26 66 74   "fts4term", &ft
2c70: 73 33 74 65 72 6d 5f 6d 6f 64 75 6c 65 2c 20 30  s3term_module, 0
2c80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2c90: 7d 0a 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  }..#endif.#endif
2ca0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
2cb0: 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66  ITE_CORE) || def
2cc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
2cd0: 4c 45 5f 46 54 53 33 29 20 2a 2f 0a              LE_FTS3) */.