/ Hex Artifact Content
Login

Artifact c1dbc904ab1c2d687b97643c671795456228ab22:


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 2f 0a 0a 23 69 66  *****.**.*/..#if
0180: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0190: 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65  _CORE) || define
01a0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
01b0: 46 54 53 33 29 0a 23 69 66 64 65 66 20 53 51 4c  FTS3).#ifdef SQL
01c0: 49 54 45 5f 54 45 53 54 0a 0a 23 69 6e 63 6c 75  ITE_TEST..#inclu
01d0: 64 65 20 22 66 74 73 33 49 6e 74 2e 68 22 0a 23  de "fts3Int.h".#
01e0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
01f0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
0200: 65 72 74 2e 68 3e 0a 0a 74 79 70 65 64 65 66 20  ert.h>..typedef 
0210: 73 74 72 75 63 74 20 46 74 73 33 74 65 72 6d 54  struct Fts3termT
0220: 61 62 6c 65 20 46 74 73 33 74 65 72 6d 54 61 62  able Fts3termTab
0230: 6c 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  le;.typedef stru
0240: 63 74 20 46 74 73 33 74 65 72 6d 43 75 72 73 6f  ct Fts3termCurso
0250: 72 20 46 74 73 33 74 65 72 6d 43 75 72 73 6f 72  r Fts3termCursor
0260: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 33 74 65  ;..struct Fts3te
0270: 72 6d 54 61 62 6c 65 20 7b 0a 20 20 73 71 6c 69  rmTable {.  sqli
0280: 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20  te3_vtab base;  
0290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
02a0: 61 73 65 20 63 6c 61 73 73 20 75 73 65 64 20 62  ase class used b
02b0: 79 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  y SQLite core */
02c0: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 46  .  Fts3Table *pF
02d0: 74 73 33 54 61 62 3b 0a 7d 3b 0a 0a 73 74 72 75  ts3Tab;.};..stru
02e0: 63 74 20 46 74 73 33 74 65 72 6d 43 75 72 73 6f  ct Fts3termCurso
02f0: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  r {.  sqlite3_vt
0300: 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20  ab_cursor base; 
0310: 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c        /* Base cl
0320: 61 73 73 20 75 73 65 64 20 62 79 20 53 51 4c 69  ass used by SQLi
0330: 74 65 20 63 6f 72 65 20 2a 2f 0a 20 20 46 74 73  te core */.  Fts
0340: 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72  3SegReaderCursor
0350: 20 63 73 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   csr;        /* 
0360: 4d 75 73 74 20 62 65 20 72 69 67 68 74 20 61 66  Must be right af
0370: 74 65 72 20 22 62 61 73 65 22 20 2a 2f 0a 20 20  ter "base" */.  
0380: 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 66 69  Fts3SegFilter fi
0390: 6c 74 65 72 3b 0a 0a 20 20 69 6e 74 20 69 73 45  lter;..  int isE
03a0: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
03b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
03c0: 20 69 66 20 63 75 72 73 6f 72 20 69 73 20 61 74   if cursor is at
03d0: 20 45 4f 46 20 2a 2f 0a 20 20 63 68 61 72 20 2a   EOF */.  char *
03e0: 70 4e 65 78 74 3b 0a 0a 20 20 73 71 6c 69 74 65  pNext;..  sqlite
03f0: 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 20  3_int64 iRowid; 
0400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
0410: 72 65 6e 74 20 27 72 6f 77 69 64 27 20 76 61 6c  rent 'rowid' val
0420: 75 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ue */.  sqlite3_
0430: 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20 20  int64 iDocid;   
0440: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
0450: 6e 74 20 27 64 6f 63 69 64 27 20 76 61 6c 75 65  nt 'docid' value
0460: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
0490: 20 27 63 6f 6c 27 20 76 61 6c 75 65 20 2a 2f 0a   'col' value */.
04a0: 20 20 69 6e 74 20 69 50 6f 73 3b 20 20 20 20 20    int iPos;     
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 70 6f    /* Current 'po
04d0: 73 27 20 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a 0a  s' value */.};..
04e0: 2f 2a 0a 2a 2a 20 53 63 68 65 6d 61 20 6f 66 20  /*.** Schema of 
04f0: 74 68 65 20 74 65 72 6d 73 20 74 61 62 6c 65 2e  the terms table.
0500: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 33  .*/.#define FTS3
0510: 5f 54 45 52 4d 53 5f 53 43 48 45 4d 41 20 22 43  _TERMS_SCHEMA "C
0520: 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 74 65  REATE TABLE x(te
0530: 72 6d 2c 20 64 6f 63 69 64 2c 20 63 6f 6c 2c 20  rm, docid, col, 
0540: 70 6f 73 29 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  pos)"../*.** Thi
0550: 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
0560: 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 66 6f 72  all the work for
0570: 20 62 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e 65   both the xConne
0580: 63 74 20 61 6e 64 20 78 43 72 65 61 74 65 20 6d  ct and xCreate m
0590: 65 74 68 6f 64 73 2e 0a 2a 2a 20 54 68 65 73 65  ethods..** These
05a0: 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e 6f 20   tables have no 
05b0: 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
05c0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
05d0: 69 72 20 6f 77 6e 2c 20 73 6f 20 78 43 6f 6e 6e  ir own, so xConn
05e0: 65 63 74 0a 2a 2a 20 61 6e 64 20 78 43 72 65 61  ect.** and xCrea
05f0: 74 65 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  te are identical
0600: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
0610: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 74  static int fts3t
0620: 65 72 6d 43 6f 6e 6e 65 63 74 4d 65 74 68 6f 64  ermConnectMethod
0630: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0650: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
0660: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
0670: 76 6f 69 64 20 2a 70 55 6e 75 73 65 64 2c 20 20  void *pUnused,  
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 69  /* Unused */.  i
06a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
06c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
06d0: 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72 72  ents in argv arr
06e0: 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ay */.  const ch
06f0: 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67 76  ar * const *argv
0700: 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61  ,       /* xCrea
0710: 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67 75  te/xConnect argu
0720: 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  ment array */.  
0730: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
0740: 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20  pVtab,          
0750: 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c 69  /* OUT: New sqli
0760: 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20  te3_vtab object 
0770: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
0780: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
0790: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c       /* OUT: sql
07a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65 72  ite3_malloc'd er
07b0: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29  ror message */.)
07c0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
07d0: 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
07e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
07f0: 61 74 61 62 61 73 65 20 28 65 2e 67 2e 20 22 6d  atabase (e.g. "m
0800: 61 69 6e 22 29 20 2a 2f 0a 20 20 63 68 61 72 20  ain") */.  char 
0810: 63 6f 6e 73 74 20 2a 7a 46 74 73 33 3b 20 20 20  const *zFts3;   
0820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
0830: 6d 65 20 6f 66 20 66 74 73 33 20 74 61 62 6c 65  me of fts3 table
0840: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 62 3b 20 20   */.  int nDb;  
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
0870: 6f 66 20 73 74 72 6c 65 6e 28 7a 44 62 29 20 2a  of strlen(zDb) *
0880: 2f 0a 20 20 69 6e 74 20 6e 46 74 73 33 3b 20 20  /.  int nFts3;  
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
08b0: 20 73 74 72 6c 65 6e 28 7a 46 74 73 33 29 20 2a   strlen(zFts3) *
08c0: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
08f0: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
0900: 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
0910: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
0930: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
0940: 20 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20   declare_vtab() 
0950: 2a 2f 0a 20 20 46 74 73 33 74 65 72 6d 54 61 62  */.  Fts3termTab
0960: 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  le *p;          
0970: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
0980: 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74 6f   table object to
0990: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 55 4e   return */..  UN
09a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
09b0: 55 6e 75 73 65 64 29 3b 0a 0a 20 20 2f 2a 20 54  Unused);..  /* T
09c0: 68 65 20 75 73 65 72 20 73 68 6f 75 6c 64 20 73  he user should s
09d0: 70 65 63 69 66 79 20 61 20 73 69 6e 67 6c 65 20  pecify a single 
09e0: 61 72 67 75 6d 65 6e 74 20 2d 20 74 68 65 20 6e  argument - the n
09f0: 61 6d 65 20 6f 66 20 61 6e 20 66 74 73 33 20 74  ame of an fts3 t
0a00: 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 61  able. */.  if( a
0a10: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 2a 70  rgc!=4 ){.    *p
0a20: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
0a30: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
0a40: 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "wrong number of
0a50: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 74   arguments to ft
0a60: 73 34 74 65 72 6d 20 63 6f 6e 73 74 72 75 63 74  s4term construct
0a70: 6f 72 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  or".    );.    r
0a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
0a90: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44 62 20 3d  OR;.  }..  zDb =
0aa0: 20 61 72 67 76 5b 31 5d 3b 20 0a 20 20 6e 44 62   argv[1]; .  nDb
0ab0: 20 3d 20 73 74 72 6c 65 6e 28 7a 44 62 29 3b 0a   = strlen(zDb);.
0ac0: 20 20 7a 46 74 73 33 20 3d 20 61 72 67 76 5b 33    zFts3 = argv[3
0ad0: 5d 3b 0a 20 20 6e 46 74 73 33 20 3d 20 73 74 72  ];.  nFts3 = str
0ae0: 6c 65 6e 28 7a 46 74 73 33 29 3b 0a 0a 20 20 72  len(zFts3);..  r
0af0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
0b00: 61 72 65 5f 76 74 61 62 28 64 62 2c 20 46 54 53  are_vtab(db, FTS
0b10: 33 5f 54 45 52 4d 53 5f 53 43 48 45 4d 41 29 3b  3_TERMS_SCHEMA);
0b20: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
0b30: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
0b40: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  ;..  nByte = siz
0b50: 65 6f 66 28 46 74 73 33 74 65 72 6d 54 61 62 6c  eof(Fts3termTabl
0b60: 65 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33  e) + sizeof(Fts3
0b70: 54 61 62 6c 65 29 20 2b 20 6e 44 62 20 2b 20 6e  Table) + nDb + n
0b80: 46 74 73 33 20 2b 20 32 3b 0a 20 20 70 20 3d 20  Fts3 + 2;.  p = 
0b90: 28 46 74 73 33 74 65 72 6d 54 61 62 6c 65 20 2a  (Fts3termTable *
0ba0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
0bb0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21 70  nByte);.  if( !p
0bc0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
0bd0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
0be0: 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a  (p, 0, nByte);..
0bf0: 20 20 70 2d 3e 70 46 74 73 33 54 61 62 20 3d 20    p->pFts3Tab = 
0c00: 28 46 74 73 33 54 61 62 6c 65 20 2a 29 26 70 5b  (Fts3Table *)&p[
0c10: 31 5d 3b 0a 20 20 70 2d 3e 70 46 74 73 33 54 61  1];.  p->pFts3Ta
0c20: 62 2d 3e 7a 44 62 20 3d 20 28 63 68 61 72 20 2a  b->zDb = (char *
0c30: 29 26 70 2d 3e 70 46 74 73 33 54 61 62 5b 31 5d  )&p->pFts3Tab[1]
0c40: 3b 0a 20 20 70 2d 3e 70 46 74 73 33 54 61 62 2d  ;.  p->pFts3Tab-
0c50: 3e 7a 4e 61 6d 65 20 3d 20 26 70 2d 3e 70 46 74  >zName = &p->pFt
0c60: 73 33 54 61 62 2d 3e 7a 44 62 5b 6e 44 62 2b 31  s3Tab->zDb[nDb+1
0c70: 5d 3b 0a 20 20 70 2d 3e 70 46 74 73 33 54 61 62  ];.  p->pFts3Tab
0c80: 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 20 20 6d 65  ->db = db;..  me
0c90: 6d 63 70 79 28 28 63 68 61 72 20 2a 29 70 2d 3e  mcpy((char *)p->
0ca0: 70 46 74 73 33 54 61 62 2d 3e 7a 44 62 2c 20 7a  pFts3Tab->zDb, z
0cb0: 44 62 2c 20 6e 44 62 29 3b 0a 20 20 6d 65 6d 63  Db, nDb);.  memc
0cc0: 70 79 28 28 63 68 61 72 20 2a 29 70 2d 3e 70 46  py((char *)p->pF
0cd0: 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  ts3Tab->zName, z
0ce0: 46 74 73 33 2c 20 6e 46 74 73 33 29 3b 0a 20 20  Fts3, nFts3);.  
0cf0: 73 71 6c 69 74 65 33 46 74 73 33 44 65 71 75 6f  sqlite3Fts3Dequo
0d00: 74 65 28 28 63 68 61 72 20 2a 29 70 2d 3e 70 46  te((char *)p->pF
0d10: 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ts3Tab->zName);.
0d20: 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71  .  *ppVtab = (sq
0d30: 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70 3b 0a  lite3_vtab *)p;.
0d40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0d50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
0d60: 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
0d70: 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 62 6f 74  the work for bot
0d80: 68 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  h the xDisconnec
0d90: 74 20 61 6e 64 20 78 44 65 73 74 72 6f 79 20 6d  t and xDestroy m
0da0: 65 74 68 6f 64 73 2e 0a 2a 2a 20 54 68 65 73 65  ethods..** These
0db0: 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e 6f 20   tables have no 
0dc0: 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
0dd0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
0de0: 69 72 20 6f 77 6e 2c 20 73 6f 20 78 44 69 73 63  ir own, so xDisc
0df0: 6f 6e 6e 65 63 74 0a 2a 2a 20 61 6e 64 20 78 44  onnect.** and xD
0e00: 65 73 74 72 6f 79 20 61 72 65 20 69 64 65 6e 74  estroy are ident
0e10: 69 63 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e  ical operations.
0e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
0e30: 74 73 33 74 65 72 6d 44 69 73 63 6f 6e 6e 65 63  ts3termDisconnec
0e40: 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  tMethod(sqlite3_
0e50: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
0e60: 46 74 73 33 74 65 72 6d 54 61 62 6c 65 20 2a 70  Fts3termTable *p
0e70: 20 3d 20 28 46 74 73 33 74 65 72 6d 54 61 62 6c   = (Fts3termTabl
0e80: 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 46 74 73  e *)pVtab;.  Fts
0e90: 33 54 61 62 6c 65 20 2a 70 46 74 73 33 20 3d 20  3Table *pFts3 = 
0ea0: 70 2d 3e 70 46 74 73 33 54 61 62 3b 0a 20 20 69  p->pFts3Tab;.  i
0eb0: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nt i;..  /* Free
0ec0: 20 61 6e 79 20 70 72 65 70 61 72 65 64 20 73 74   any prepared st
0ed0: 61 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 2a 2f  atements held */
0ee0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 69  .  for(i=0; i<Si
0ef0: 7a 65 6f 66 41 72 72 61 79 28 70 46 74 73 33 2d  zeofArray(pFts3-
0f00: 3e 61 53 74 6d 74 29 3b 20 69 2b 2b 29 7b 0a 20  >aStmt); i++){. 
0f10: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
0f20: 69 7a 65 28 70 46 74 73 33 2d 3e 61 53 74 6d 74  ize(pFts3->aStmt
0f30: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
0f40: 74 65 33 5f 66 72 65 65 28 70 46 74 73 33 2d 3e  te3_free(pFts3->
0f50: 7a 53 65 67 6d 65 6e 74 73 54 62 6c 29 3b 0a 20  zSegmentsTbl);. 
0f60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
0f70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0f80: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  E_OK;.}..#define
0f90: 20 46 54 53 34 41 55 58 5f 45 51 5f 43 4f 4e 53   FTS4AUX_EQ_CONS
0fa0: 54 52 41 49 4e 54 20 31 0a 23 64 65 66 69 6e 65  TRAINT 1.#define
0fb0: 20 46 54 53 34 41 55 58 5f 47 45 5f 43 4f 4e 53   FTS4AUX_GE_CONS
0fc0: 54 52 41 49 4e 54 20 32 0a 23 64 65 66 69 6e 65  TRAINT 2.#define
0fd0: 20 46 54 53 34 41 55 58 5f 4c 45 5f 43 4f 4e 53   FTS4AUX_LE_CONS
0fe0: 54 52 41 49 4e 54 20 34 0a 0a 2f 2a 0a 2a 2a 20  TRAINT 4../*.** 
0ff0: 78 42 65 73 74 49 6e 64 65 78 20 2d 20 41 6e 61  xBestIndex - Ana
1000: 6c 79 7a 65 20 61 20 57 48 45 52 45 20 61 6e 64  lyze a WHERE and
1010: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1030: 66 74 73 33 74 65 72 6d 42 65 73 74 49 6e 64 65  fts3termBestInde
1040: 78 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  xMethod(.  sqlit
1050: 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20  e3_vtab *pVTab, 
1060: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
1070: 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 0a 29 7b 0a  _info *pInfo.){.
1080: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1090: 45 52 28 70 56 54 61 62 29 3b 0a 20 20 55 4e 55  ER(pVTab);.  UNU
10a0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 49  SED_PARAMETER(pI
10b0: 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  nfo);.  return S
10c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10d0: 2a 2a 20 78 4f 70 65 6e 20 2d 20 4f 70 65 6e 20  ** xOpen - Open 
10e0: 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  a cursor..*/.sta
10f0: 74 69 63 20 69 6e 74 20 66 74 73 33 74 65 72 6d  tic int fts3term
1100: 4f 70 65 6e 4d 65 74 68 6f 64 28 73 71 6c 69 74  OpenMethod(sqlit
1110: 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20  e3_vtab *pVTab, 
1120: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
1130: 73 6f 72 20 2a 2a 70 70 43 73 72 29 7b 0a 20 20  sor **ppCsr){.  
1140: 46 74 73 33 74 65 72 6d 43 75 72 73 6f 72 20 2a  Fts3termCursor *
1150: 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20  pCsr;           
1160: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
1170: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20  ursor object to 
1180: 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 55 4e 55  return */..  UNU
1190: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
11a0: 54 61 62 29 3b 0a 0a 20 20 70 43 73 72 20 3d 20  Tab);..  pCsr = 
11b0: 28 46 74 73 33 74 65 72 6d 43 75 72 73 6f 72 20  (Fts3termCursor 
11c0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
11d0: 28 73 69 7a 65 6f 66 28 46 74 73 33 74 65 72 6d  (sizeof(Fts3term
11e0: 43 75 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20  Cursor));.  if( 
11f0: 21 70 43 73 72 20 29 20 72 65 74 75 72 6e 20 53  !pCsr ) return S
1200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
1210: 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73  emset(pCsr, 0, s
1220: 69 7a 65 6f 66 28 46 74 73 33 74 65 72 6d 43 75  izeof(Fts3termCu
1230: 72 73 6f 72 29 29 3b 0a 0a 20 20 2a 70 70 43 73  rsor));..  *ppCs
1240: 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  r = (sqlite3_vta
1250: 62 5f 63 75 72 73 6f 72 20 2a 29 70 43 73 72 3b  b_cursor *)pCsr;
1260: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1270: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 43  _OK;.}../*.** xC
1280: 6c 6f 73 65 20 2d 20 43 6c 6f 73 65 20 61 20 63  lose - Close a c
1290: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
12a0: 20 69 6e 74 20 66 74 73 33 74 65 72 6d 43 6c 6f   int fts3termClo
12b0: 73 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  seMethod(sqlite3
12c0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
12d0: 75 72 73 6f 72 29 7b 0a 20 20 46 74 73 33 54 61  ursor){.  Fts3Ta
12e0: 62 6c 65 20 2a 70 46 74 73 33 20 3d 20 28 28 46  ble *pFts3 = ((F
12f0: 74 73 33 74 65 72 6d 54 61 62 6c 65 20 2a 29 70  ts3termTable *)p
1300: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 2d 3e  Cursor->pVtab)->
1310: 70 46 74 73 33 54 61 62 3b 0a 20 20 46 74 73 33  pFts3Tab;.  Fts3
1320: 74 65 72 6d 43 75 72 73 6f 72 20 2a 70 43 73 72  termCursor *pCsr
1330: 20 3d 20 28 46 74 73 33 74 65 72 6d 43 75 72 73   = (Fts3termCurs
1340: 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a 20  or *)pCursor;.. 
1350: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d   sqlite3Fts3Segm
1360: 65 6e 74 73 43 6c 6f 73 65 28 70 46 74 73 33 29  entsClose(pFts3)
1370: 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  ;.  sqlite3Fts3S
1380: 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 26  egReaderFinish(&
1390: 70 43 73 72 2d 3e 63 73 72 29 3b 0a 20 20 73 71  pCsr->csr);.  sq
13a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29  lite3_free(pCsr)
13b0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  E_OK;.}../*.** x
13d0: 4e 65 78 74 20 2d 20 41 64 76 61 6e 63 65 20 74  Next - Advance t
13e0: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
13f0: 20 6e 65 78 74 20 72 6f 77 2c 20 69 66 20 61 6e   next row, if an
1400: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1410: 20 66 74 73 33 74 65 72 6d 4e 65 78 74 4d 65 74   fts3termNextMet
1420: 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
1430: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
1440: 29 7b 0a 20 20 46 74 73 33 74 65 72 6d 43 75 72  ){.  Fts3termCur
1450: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73  sor *pCsr = (Fts
1460: 33 74 65 72 6d 43 75 72 73 6f 72 20 2a 29 70 43  3termCursor *)pC
1470: 75 72 73 6f 72 3b 0a 20 20 46 74 73 33 54 61 62  ursor;.  Fts3Tab
1480: 6c 65 20 2a 70 46 74 73 33 20 3d 20 28 28 46 74  le *pFts3 = ((Ft
1490: 73 33 74 65 72 6d 54 61 62 6c 65 20 2a 29 70 43  s3termTable *)pC
14a0: 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 2d 3e 70  ursor->pVtab)->p
14b0: 46 74 73 33 54 61 62 3b 0a 20 20 69 6e 74 20 72  Fts3Tab;.  int r
14c0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
14d0: 36 34 20 76 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  64 v;..  /* Incr
14e0: 65 6d 65 6e 74 20 6f 75 72 20 70 72 65 74 65 6e  ement our preten
14f0: 64 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 2a  d rowid value. *
1500: 2f 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64  /.  pCsr->iRowid
1510: 2b 2b 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63  ++;..  /* Advanc
1520: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65  e to the next te
1530: 72 6d 20 69 6e 20 74 68 65 20 66 75 6c 6c 2d 74  rm in the full-t
1540: 65 78 74 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  ext index. */.  
1550: 69 66 28 20 70 43 73 72 2d 3e 63 73 72 2e 61 44  if( pCsr->csr.aD
1560: 6f 63 6c 69 73 74 3d 3d 30 20 0a 20 20 20 7c 7c  oclist==0 .   ||
1570: 20 70 43 73 72 2d 3e 70 4e 65 78 74 3e 3d 26 70   pCsr->pNext>=&p
1580: 43 73 72 2d 3e 63 73 72 2e 61 44 6f 63 6c 69 73  Csr->csr.aDoclis
1590: 74 5b 70 43 73 72 2d 3e 63 73 72 2e 6e 44 6f 63  t[pCsr->csr.nDoc
15a0: 6c 69 73 74 2d 31 5d 0a 20 20 29 7b 0a 20 20 20  list-1].  ){.   
15b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
15c0: 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70  3SegReaderStep(p
15d0: 46 74 73 33 2c 20 26 70 43 73 72 2d 3e 63 73 72  Fts3, &pCsr->csr
15e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15f0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1600: 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d     pCsr->isEof =
1610: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
1620: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1630: 70 43 73 72 2d 3e 69 43 6f 6c 20 3d 20 30 3b 0a  pCsr->iCol = 0;.
1640: 20 20 20 20 70 43 73 72 2d 3e 69 50 6f 73 20 3d      pCsr->iPos =
1650: 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69 44   0;.    pCsr->iD
1660: 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 43  ocid = 0;.    pC
1670: 73 72 2d 3e 70 4e 65 78 74 20 3d 20 70 43 73 72  sr->pNext = pCsr
1680: 2d 3e 63 73 72 2e 61 44 6f 63 6c 69 73 74 3b 0a  ->csr.aDoclist;.
1690: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 64 6f 63  .    /* Read doc
16a0: 69 64 20 2a 2f 0a 20 20 20 20 70 43 73 72 2d 3e  id */.    pCsr->
16b0: 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65 33  pNext += sqlite3
16c0: 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43  Fts3GetVarint(pC
16d0: 73 72 2d 3e 70 4e 65 78 74 2c 20 26 70 43 73 72  sr->pNext, &pCsr
16e0: 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 0a  ->iDocid);.  }..
16f0: 20 20 70 43 73 72 2d 3e 70 4e 65 78 74 20 2b 3d    pCsr->pNext +=
1700: 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
1710: 61 72 69 6e 74 28 70 43 73 72 2d 3e 70 4e 65 78  arint(pCsr->pNex
1720: 74 2c 20 26 76 29 3b 0a 20 20 69 66 28 20 76 3d  t, &v);.  if( v=
1730: 3d 30 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e  =0 ){.    pCsr->
1740: 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65 33  pNext += sqlite3
1750: 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43  Fts3GetVarint(pC
1760: 73 72 2d 3e 70 4e 65 78 74 2c 20 26 76 29 3b 0a  sr->pNext, &v);.
1770: 20 20 20 20 70 43 73 72 2d 3e 69 44 6f 63 69 64      pCsr->iDocid
1780: 20 2b 3d 20 76 3b 0a 20 20 20 20 70 43 73 72 2d   += v;.    pCsr-
1790: 3e 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74 65  >pNext += sqlite
17a0: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70  3Fts3GetVarint(p
17b0: 43 73 72 2d 3e 70 4e 65 78 74 2c 20 26 76 29 3b  Csr->pNext, &v);
17c0: 0a 20 20 20 20 70 43 73 72 2d 3e 69 43 6f 6c 20  .    pCsr->iCol 
17d0: 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69  = 0;.    pCsr->i
17e0: 50 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Pos = 0;.  }..  
17f0: 69 66 28 20 76 3d 3d 31 20 29 7b 0a 20 20 20 20  if( v==1 ){.    
1800: 70 43 73 72 2d 3e 70 4e 65 78 74 20 2b 3d 20 73  pCsr->pNext += s
1810: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
1820: 69 6e 74 28 70 43 73 72 2d 3e 70 4e 65 78 74 2c  int(pCsr->pNext,
1830: 20 26 76 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e   &v);.    pCsr->
1840: 69 43 6f 6c 20 2b 3d 20 76 3b 0a 20 20 20 20 70  iCol += v;.    p
1850: 43 73 72 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a 20  Csr->iPos = 0;. 
1860: 20 20 20 70 43 73 72 2d 3e 70 4e 65 78 74 20 2b     pCsr->pNext +
1870: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
1880: 56 61 72 69 6e 74 28 70 43 73 72 2d 3e 70 4e 65  Varint(pCsr->pNe
1890: 78 74 2c 20 26 76 29 3b 0a 20 20 7d 0a 0a 20 20  xt, &v);.  }..  
18a0: 70 43 73 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 76  pCsr->iPos += (v
18b0: 20 2d 20 32 29 3b 0a 0a 20 20 72 65 74 75 72 6e   - 2);..  return
18c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18d0: 2a 0a 2a 2a 20 78 46 69 6c 74 65 72 20 2d 20 49  *.** xFilter - I
18e0: 6e 69 74 69 61 6c 69 7a 65 20 61 20 63 75 72 73  nitialize a curs
18f0: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  or to point at t
1900: 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 73 20  he start of its 
1910: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
1920: 69 6e 74 20 66 74 73 33 74 65 72 6d 46 69 6c 74  int fts3termFilt
1930: 65 72 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69  erMethod(.  sqli
1940: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
1950: 2a 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20 54  *pCursor,   /* T
1960: 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  he cursor used f
1970: 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
1980: 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 20  .  int idxNum,  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 2f 2a 20 53 74 72 61 74 65 67 79 20 69     /* Strategy i
19b0: 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
19c0: 63 68 61 72 20 2a 69 64 78 53 74 72 2c 20 20 20  char *idxStr,   
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75            /* Unu
19e0: 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  sed */.  int nVa
19f0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a10: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1a20: 6e 20 61 70 56 61 6c 20 2a 2f 0a 20 20 73 71 6c  n apVal */.  sql
1a30: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
1a40: 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
1a50: 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68  Arguments for th
1a60: 65 20 69 6e 64 65 78 69 6e 67 20 73 63 68 65 6d  e indexing schem
1a70: 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 74 65  e */.){.  Fts3te
1a80: 72 6d 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  rmCursor *pCsr =
1a90: 20 28 46 74 73 33 74 65 72 6d 43 75 72 73 6f 72   (Fts3termCursor
1aa0: 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 46 74   *)pCursor;.  Ft
1ab0: 73 33 54 61 62 6c 65 20 2a 70 46 74 73 33 20 3d  s3Table *pFts3 =
1ac0: 20 28 28 46 74 73 33 74 65 72 6d 54 61 62 6c 65   ((Fts3termTable
1ad0: 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61   *)pCursor->pVta
1ae0: 62 29 2d 3e 70 46 74 73 33 54 61 62 3b 0a 20 20  b)->pFts3Tab;.  
1af0: 69 6e 74 20 72 63 3b 0a 0a 20 20 55 4e 55 53 45  int rc;..  UNUSE
1b00: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c  D_PARAMETER(nVal
1b10: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1b20: 4d 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20  METER(idxNum);. 
1b30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b40: 52 28 69 64 78 53 74 72 29 3b 0a 20 20 55 4e 55  R(idxStr);.  UNU
1b50: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70  SED_PARAMETER(ap
1b60: 56 61 6c 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Val);..  assert(
1b70: 20 69 64 78 53 74 72 3d 3d 30 20 26 26 20 69 64   idxStr==0 && id
1b80: 78 4e 75 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  xNum==0 );..  /*
1b90: 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 63 75   In case this cu
1ba0: 72 73 6f 72 20 69 73 20 62 65 69 6e 67 20 72 65  rsor is being re
1bb0: 75 73 65 64 2c 20 63 6c 6f 73 65 20 61 6e 64 20  used, close and 
1bc0: 7a 65 72 6f 20 69 74 2e 20 2a 2f 0a 20 20 74 65  zero it. */.  te
1bd0: 73 74 63 61 73 65 28 70 43 73 72 2d 3e 66 69 6c  stcase(pCsr->fil
1be0: 74 65 72 2e 7a 54 65 72 6d 29 3b 0a 20 20 73 71  ter.zTerm);.  sq
1bf0: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
1c00: 65 72 46 69 6e 69 73 68 28 26 70 43 73 72 2d 3e  erFinish(&pCsr->
1c10: 63 73 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  csr);.  memset(&
1c20: 70 43 73 72 2d 3e 63 73 72 2c 20 30 2c 20 28 28  pCsr->csr, 0, ((
1c30: 75 38 2a 29 26 70 43 73 72 5b 31 5d 29 20 2d 20  u8*)&pCsr[1]) - 
1c40: 28 75 38 2a 29 26 70 43 73 72 2d 3e 63 73 72 29  (u8*)&pCsr->csr)
1c50: 3b 0a 0a 20 20 70 43 73 72 2d 3e 66 69 6c 74 65  ;..  pCsr->filte
1c60: 72 2e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53  r.flags = FTS3_S
1c70: 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50  EGMENT_REQUIRE_P
1c80: 4f 53 7c 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f  OS|FTS3_SEGMENT_
1c90: 49 47 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20  IGNORE_EMPTY;.  
1ca0: 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e 66 6c 61  pCsr->filter.fla
1cb0: 67 73 20 7c 3d 20 46 54 53 33 5f 53 45 47 4d 45  gs |= FTS3_SEGME
1cc0: 4e 54 5f 53 43 41 4e 3b 0a 0a 20 20 72 63 20 3d  NT_SCAN;..  rc =
1cd0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
1ce0: 65 61 64 65 72 43 75 72 73 6f 72 28 70 46 74 73  eaderCursor(pFts
1cf0: 33 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  3, FTS3_SEGCURSO
1d00: 52 5f 41 4c 4c 2c 0a 20 20 20 20 20 20 70 43 73  R_ALL,.      pCs
1d10: 72 2d 3e 66 69 6c 74 65 72 2e 7a 54 65 72 6d 2c  r->filter.zTerm,
1d20: 20 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e 6e 54   pCsr->filter.nT
1d30: 65 72 6d 2c 20 30 2c 20 31 2c 20 26 70 43 73 72  erm, 0, 1, &pCsr
1d40: 2d 3e 63 73 72 0a 20 20 29 3b 0a 20 20 69 66 28  ->csr.  );.  if(
1d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d60: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1d70: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
1d80: 74 61 72 74 28 70 46 74 73 33 2c 20 26 70 43 73  tart(pFts3, &pCs
1d90: 72 2d 3e 63 73 72 2c 20 26 70 43 73 72 2d 3e 66  r->csr, &pCsr->f
1da0: 69 6c 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  ilter);.  }.  if
1db0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dc0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
1dd0: 74 65 72 6d 4e 65 78 74 4d 65 74 68 6f 64 28 70  termNextMethod(p
1de0: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  Cursor);.  }.  r
1df0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e00: 2a 2a 20 78 45 6f 66 20 2d 20 52 65 74 75 72 6e  ** xEof - Return
1e10: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
1e20: 73 6f 72 20 69 73 20 61 74 20 45 4f 46 2c 20 6f  sor is at EOF, o
1e30: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
1e40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e50: 20 66 74 73 33 74 65 72 6d 45 6f 66 4d 65 74 68   fts3termEofMeth
1e60: 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  od(sqlite3_vtab_
1e70: 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29  cursor *pCursor)
1e80: 7b 0a 20 20 46 74 73 33 74 65 72 6d 43 75 72 73  {.  Fts3termCurs
1e90: 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33  or *pCsr = (Fts3
1ea0: 74 65 72 6d 43 75 72 73 6f 72 20 2a 29 70 43 75  termCursor *)pCu
1eb0: 72 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  rsor;.  return p
1ec0: 43 73 72 2d 3e 69 73 45 6f 66 3b 0a 7d 0a 0a 2f  Csr->isEof;.}../
1ed0: 2a 0a 2a 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 52  *.** xColumn - R
1ee0: 65 74 75 72 6e 20 61 20 63 6f 6c 75 6d 6e 20 76  eturn a column v
1ef0: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1f00: 69 6e 74 20 66 74 73 33 74 65 72 6d 43 6f 6c 75  int fts3termColu
1f10: 6d 6e 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69  mnMethod(.  sqli
1f20: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
1f30: 2a 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20 43  *pCursor,   /* C
1f40: 75 72 73 6f 72 20 74 6f 20 72 65 74 72 69 65 76  ursor to retriev
1f50: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a  e value from */.
1f60: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1f70: 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
1f80: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
1f90: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1fa0: 78 78 78 28 29 20 63 61 6c 6c 73 20 2a 2f 0a 20  xxx() calls */. 
1fb0: 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1fe0: 75 6d 6e 20 74 6f 20 72 65 61 64 20 76 61 6c 75  umn to read valu
1ff0: 65 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 46  e from */.){.  F
2000: 74 73 33 74 65 72 6d 43 75 72 73 6f 72 20 2a 70  ts3termCursor *p
2010: 20 3d 20 28 46 74 73 33 74 65 72 6d 43 75 72 73   = (Fts3termCurs
2020: 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a 20  or *)pCursor;.. 
2030: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
2040: 20 26 26 20 69 43 6f 6c 3c 3d 33 20 29 3b 0a 20   && iCol<=3 );. 
2050: 20 73 77 69 74 63 68 28 20 69 43 6f 6c 20 29 7b   switch( iCol ){
2060: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20  .    case 0:.   
2070: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2080: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 70 2d 3e  t_text(pCtx, p->
2090: 63 73 72 2e 7a 54 65 72 6d 2c 20 70 2d 3e 63 73  csr.zTerm, p->cs
20a0: 72 2e 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f  r.nTerm, SQLITE_
20b0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
20c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
20d0: 65 20 31 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  e 1:.      sqlit
20e0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
20f0: 70 43 74 78 2c 20 70 2d 3e 69 44 6f 63 69 64 29  pCtx, p->iDocid)
2100: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2110: 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
2120: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2130: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 69  int64(pCtx, p->i
2140: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Col);.      brea
2150: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
2160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2170: 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
2180: 20 70 2d 3e 69 50 6f 73 29 3b 0a 20 20 20 20 20   p->iPos);.     
2190: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72   break;.  }..  r
21a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 52 6f 77 69 64  .}../*.** xRowid
21c0: 20 2d 20 52 65 74 75 72 6e 20 74 68 65 20 63 75   - Return the cu
21d0: 72 72 65 6e 74 20 72 6f 77 69 64 20 66 6f 72 20  rrent rowid for 
21e0: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  the cursor..*/.s
21f0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 74 65  tatic int fts3te
2200: 72 6d 52 6f 77 69 64 4d 65 74 68 6f 64 28 0a 20  rmRowidMethod(. 
2210: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
2220: 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 20  rsor *pCursor,  
2230: 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
2240: 74 72 69 65 76 65 20 76 61 6c 75 65 20 66 72 6f  trieve value fro
2250: 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e  m */.  sqlite_in
2260: 74 36 34 20 2a 70 52 6f 77 69 64 20 20 20 20 20  t64 *pRowid     
2270: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2280: 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  owid value */.){
2290: 0a 20 20 46 74 73 33 74 65 72 6d 43 75 72 73 6f  .  Fts3termCurso
22a0: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33 74  r *pCsr = (Fts3t
22b0: 65 72 6d 43 75 72 73 6f 72 20 2a 29 70 43 75 72  ermCursor *)pCur
22c0: 73 6f 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d  sor;.  *pRowid =
22d0: 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20   pCsr->iRowid;. 
22e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
2300: 73 74 65 72 20 74 68 65 20 66 74 73 33 74 65 72  ster the fts3ter
2310: 6d 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61  m module with da
2320: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2330: 6e 20 64 62 2e 20 52 65 74 75 72 6e 20 53 51 4c  n db. Return SQL
2340: 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
2350: 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 65 72  cessful or an er
2360: 72 6f 72 20 63 6f 64 65 20 69 66 20 73 71 6c 69  ror code if sqli
2370: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
2380: 65 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  e() fails..*/.in
2390: 74 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  t sqlite3Fts3Ini
23a0: 74 54 65 72 6d 28 73 71 6c 69 74 65 33 20 2a 64  tTerm(sqlite3 *d
23b0: 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
23c0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
23d0: 65 20 66 74 73 33 74 65 72 6d 5f 6d 6f 64 75 6c  e fts3term_modul
23e0: 65 20 3d 20 7b 0a 20 20 20 20 20 30 2c 20 20 20  e = {.     0,   
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2410: 69 6f 6e 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ion      */.    
2420: 20 66 74 73 33 74 65 72 6d 43 6f 6e 6e 65 63 74   fts3termConnect
2430: 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 2f 2a  Method,       /*
2440: 20 78 43 72 65 61 74 65 20 20 20 20 20 20 20 2a   xCreate       *
2450: 2f 0a 20 20 20 20 20 66 74 73 33 74 65 72 6d 43  /.     fts3termC
2460: 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 20 20 20  onnectMethod,   
2470: 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
2480: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73       */.     fts
2490: 33 74 65 72 6d 42 65 73 74 49 6e 64 65 78 4d 65  3termBestIndexMe
24a0: 74 68 6f 64 2c 20 20 20 20 20 2f 2a 20 78 42 65  thod,     /* xBe
24b0: 73 74 49 6e 64 65 78 20 20 20 20 2a 2f 0a 20 20  stIndex    */.  
24c0: 20 20 20 66 74 73 33 74 65 72 6d 44 69 73 63 6f     fts3termDisco
24d0: 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 20 20 20 20  nnectMethod,    
24e0: 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 20  /* xDisconnect  
24f0: 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 74 65 72   */.     fts3ter
2500: 6d 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f  mDisconnectMetho
2510: 64 2c 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f  d,    /* xDestro
2520: 79 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66  y      */.     f
2530: 74 73 33 74 65 72 6d 4f 70 65 6e 4d 65 74 68 6f  ts3termOpenMetho
2540: 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  d,          /* x
2550: 4f 70 65 6e 20 20 20 20 20 20 20 20 20 2a 2f 0a  Open         */.
2560: 20 20 20 20 20 66 74 73 33 74 65 72 6d 43 6c 6f       fts3termClo
2570: 73 65 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20  seMethod,       
2580: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20 20 20    /* xClose     
2590: 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 74     */.     fts3t
25a0: 65 72 6d 46 69 6c 74 65 72 4d 65 74 68 6f 64 2c  ermFilterMethod,
25b0: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
25c0: 65 72 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  er       */.    
25d0: 20 66 74 73 33 74 65 72 6d 4e 65 78 74 4d 65 74   fts3termNextMet
25e0: 68 6f 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  hod,          /*
25f0: 20 78 4e 65 78 74 20 20 20 20 20 20 20 20 20 2a   xNext         *
2600: 2f 0a 20 20 20 20 20 66 74 73 33 74 65 72 6d 45  /.     fts3termE
2610: 6f 66 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20  ofMethod,       
2620: 20 20 20 20 2f 2a 20 78 45 6f 66 20 20 20 20 20      /* xEof     
2630: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73       */.     fts
2640: 33 74 65 72 6d 43 6f 6c 75 6d 6e 4d 65 74 68 6f  3termColumnMetho
2650: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f  d,        /* xCo
2660: 6c 75 6d 6e 20 20 20 20 20 20 20 2a 2f 0a 20 20  lumn       */.  
2670: 20 20 20 66 74 73 33 74 65 72 6d 52 6f 77 69 64     fts3termRowid
2680: 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20 20  Method,         
2690: 2f 2a 20 78 52 6f 77 69 64 20 20 20 20 20 20 20  /* xRowid       
26a0: 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20   */.     0,     
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65        /* xUpdate
26d0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30         */.     0
26e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2700: 42 65 67 69 6e 20 20 20 20 20 20 20 20 2a 2f 0a  Begin        */.
2710: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 2f 2a 20 78 53 79 6e 63 20 20 20 20 20 20    /* xSync      
2740: 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20     */.     0,   
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
2770: 69 74 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  it       */.    
2780: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a0: 20 78 52 6f 6c 6c 62 61 63 6b 20 20 20 20 20 2a   xRollback     *
27b0: 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  /.     0,       
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63      /* xFindFunc
27e0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 30 20 20  tion */.     0  
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
2810: 6e 61 6d 65 20 20 20 20 20 20 20 2a 2f 0a 20 20  name       */.  
2820: 7d 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  };.  int rc;    
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2850: 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73  ode */..  rc = s
2860: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f  qlite3_create_mo
2870: 64 75 6c 65 28 64 62 2c 20 22 66 74 73 34 74 65  dule(db, "fts4te
2880: 72 6d 22 2c 20 26 66 74 73 33 74 65 72 6d 5f 6d  rm", &fts3term_m
2890: 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74  odule, 0);.  ret
28a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
28b0: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  f.#endif /* !def
28c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45  ined(SQLITE_CORE
28d0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
28e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29  ITE_ENABLE_FTS3)
28f0: 20 2a 2f 0a                                       */.