/ Hex Artifact Content
Login

Artifact b02632f6dd0e375ce97870206d914ea6d8df5ccd:


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 23 69 6e 63  *****.**.*/.#inc
0180: 6c 75 64 65 20 22 66 74 73 33 49 6e 74 2e 68 22  lude "fts3Int.h"
0190: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
01a0: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
01b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
01c0: 42 4c 45 5f 46 54 53 33 29 0a 0a 23 69 6e 63 6c  BLE_FTS3)..#incl
01d0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
01e0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
01f0: 68 3e 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  h>..typedef stru
0200: 63 74 20 46 74 73 33 61 75 78 54 61 62 6c 65 20  ct Fts3auxTable 
0210: 46 74 73 33 61 75 78 54 61 62 6c 65 3b 0a 74 79  Fts3auxTable;.ty
0220: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
0230: 33 61 75 78 43 75 72 73 6f 72 20 46 74 73 33 61  3auxCursor Fts3a
0240: 75 78 43 75 72 73 6f 72 3b 0a 0a 73 74 72 75 63  uxCursor;..struc
0250: 74 20 46 74 73 33 61 75 78 54 61 62 6c 65 20 7b  t Fts3auxTable {
0260: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
0270: 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  base;           
0280: 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
0290: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
02a0: 63 6f 72 65 20 2a 2f 0a 20 20 46 74 73 33 54 61  core */.  Fts3Ta
02b0: 62 6c 65 20 2a 70 46 74 73 33 54 61 62 3b 0a 7d  ble *pFts3Tab;.}
02c0: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 33 61 75  ;..struct Fts3au
02d0: 78 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69  xCursor {.  sqli
02e0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
02f0: 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 42  base;       /* B
0300: 61 73 65 20 63 6c 61 73 73 20 75 73 65 64 20 62  ase class used b
0310: 79 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  y SQLite core */
0320: 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
0330: 65 61 64 65 72 20 63 73 72 3b 20 20 20 20 20 20  eader csr;      
0340: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 72 69 67    /* Must be rig
0350: 68 74 20 61 66 74 65 72 20 22 62 61 73 65 22 20  ht after "base" 
0360: 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74  */.  Fts3SegFilt
0370: 65 72 20 66 69 6c 74 65 72 3b 0a 20 20 63 68 61  er filter;.  cha
0380: 72 20 2a 7a 53 74 6f 70 3b 0a 20 20 69 6e 74 20  r *zStop;.  int 
0390: 6e 53 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nStop;          
03a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
03b0: 79 74 65 2d 6c 65 6e 67 74 68 20 6f 66 20 73 74  yte-length of st
03c0: 72 69 6e 67 20 7a 53 74 6f 70 20 2a 2f 0a 20 20  ring zStop */.  
03d0: 69 6e 74 20 69 73 45 6f 66 3b 20 20 20 20 20 20  int isEof;      
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03f0: 2f 2a 20 54 72 75 65 20 69 66 20 63 75 72 73 6f  /* True if curso
0400: 72 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  r is at EOF */. 
0410: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
0420: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
0430: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
0440: 64 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43 6f 6c  d */..  int iCol
0450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0460: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
0470: 6e 74 20 76 61 6c 75 65 20 6f 66 20 27 63 6f 6c  nt value of 'col
0480: 27 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  ' column */.  in
0490: 74 20 6e 53 74 61 74 3b 20 20 20 20 20 20 20 20  t nStat;        
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
04b0: 20 53 69 7a 65 20 6f 66 20 61 53 74 61 74 5b 5d   Size of aStat[]
04c0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 74 72 75   array */.  stru
04d0: 63 74 20 46 74 73 33 61 75 78 43 6f 6c 73 74 61  ct Fts3auxColsta
04e0: 74 73 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ts {.    sqlite3
04f0: 5f 69 6e 74 36 34 20 6e 44 6f 63 3b 20 20 20 20  _int64 nDoc;    
0500: 20 20 20 20 20 20 20 2f 2a 20 27 64 6f 63 75 6d         /* 'docum
0510: 65 6e 74 73 27 20 76 61 6c 75 65 73 20 66 6f 72  ents' values for
0520: 20 63 75 72 72 65 6e 74 20 63 73 72 20 72 6f 77   current csr row
0530: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
0540: 69 6e 74 36 34 20 6e 4f 63 63 3b 20 20 20 20 20  int64 nOcc;     
0550: 20 20 20 20 20 20 2f 2a 20 27 6f 63 63 75 72 72        /* 'occurr
0560: 65 6e 63 65 73 27 20 76 61 6c 75 65 73 20 66 6f  ences' values fo
0570: 72 20 63 75 72 72 65 6e 74 20 63 73 72 20 72 6f  r current csr ro
0580: 77 20 2a 2f 0a 20 20 7d 20 2a 61 53 74 61 74 3b  w */.  } *aStat;
0590: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 68 65 6d  .};../*.** Schem
05a0: 61 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 74  a of the terms t
05b0: 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  able..*/.#define
05c0: 20 46 54 53 33 5f 54 45 52 4d 53 5f 53 43 48 45   FTS3_TERMS_SCHE
05d0: 4d 41 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  MA "CREATE TABLE
05e0: 20 78 28 74 65 72 6d 2c 20 63 6f 6c 2c 20 64 6f   x(term, col, do
05f0: 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65  cuments, occurre
0600: 6e 63 65 73 29 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  nces)"../*.** Th
0610: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
0620: 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 66 6f   all the work fo
0630: 72 20 62 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e  r both the xConn
0640: 65 63 74 20 61 6e 64 20 78 43 72 65 61 74 65 20  ect and xCreate 
0650: 6d 65 74 68 6f 64 73 2e 0a 2a 2a 20 54 68 65 73  methods..** Thes
0660: 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e 6f  e tables have no
0670: 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72   persistent repr
0680: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
0690: 65 69 72 20 6f 77 6e 2c 20 73 6f 20 78 43 6f 6e  eir own, so xCon
06a0: 6e 65 63 74 0a 2a 2a 20 61 6e 64 20 78 43 72 65  nect.** and xCre
06b0: 61 74 65 20 61 72 65 20 69 64 65 6e 74 69 63 61  ate are identica
06c0: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  l operations..*/
06d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
06e0: 61 75 78 43 6f 6e 6e 65 63 74 4d 65 74 68 6f 64  auxConnectMethod
06f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
0720: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
0730: 76 6f 69 64 20 2a 70 55 6e 75 73 65 64 2c 20 20  void *pUnused,  
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 69  /* Unused */.  i
0760: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0780: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
0790: 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72 72  ents in argv arr
07a0: 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ay */.  const ch
07b0: 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67 76  ar * const *argv
07c0: 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61  ,       /* xCrea
07d0: 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67 75  te/xConnect argu
07e0: 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  ment array */.  
07f0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
0800: 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20  pVtab,          
0810: 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c 69  /* OUT: New sqli
0820: 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20  te3_vtab object 
0830: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
0840: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
0850: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c       /* OUT: sql
0860: 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65 72  ite3_malloc'd er
0870: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29  ror message */.)
0880: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
0890: 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
08a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
08b0: 61 74 61 62 61 73 65 20 28 65 2e 67 2e 20 22 6d  atabase (e.g. "m
08c0: 61 69 6e 22 29 20 2a 2f 0a 20 20 63 68 61 72 20  ain") */.  char 
08d0: 63 6f 6e 73 74 20 2a 7a 46 74 73 33 3b 20 20 20  const *zFts3;   
08e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
08f0: 6d 65 20 6f 66 20 66 74 73 33 20 74 61 62 6c 65  me of fts3 table
0900: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 62 3b 20 20   */.  int nDb;  
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
0930: 6f 66 20 73 74 72 6c 65 6e 28 7a 44 62 29 20 2a  of strlen(zDb) *
0940: 2f 0a 20 20 69 6e 74 20 6e 46 74 73 33 3b 20 20  /.  int nFts3;  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
0970: 20 73 74 72 6c 65 6e 28 7a 46 74 73 33 29 20 2a   strlen(zFts3) *
0980: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
09b0: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
09c0: 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
09d0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
09f0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
0a00: 20 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20   declare_vtab() 
0a10: 2a 2f 0a 20 20 46 74 73 33 61 75 78 54 61 62 6c  */.  Fts3auxTabl
0a20: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
0a30: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
0a40: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74 6f 20  table object to 
0a50: 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 55 4e 55  return */..  UNU
0a60: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 55  SED_PARAMETER(pU
0a70: 6e 75 73 65 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  nused);..  /* Th
0a80: 65 20 75 73 65 72 20 73 68 6f 75 6c 64 20 69 6e  e user should in
0a90: 76 6f 6b 65 20 74 68 69 73 20 69 6e 20 6f 6e 65  voke this in one
0aa0: 20 6f 66 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 20   of two forms:. 
0ab0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
0ac0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0ad0: 45 20 78 78 78 20 55 53 49 4e 47 20 66 74 73 34  E xxx USING fts4
0ae0: 61 75 78 28 66 74 73 34 2d 74 61 62 6c 65 29 3b  aux(fts4-table);
0af0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
0b00: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 78   VIRTUAL TABLE x
0b10: 78 78 20 55 53 49 4e 47 20 66 74 73 34 61 75 78  xx USING fts4aux
0b20: 28 66 74 73 34 2d 74 61 62 6c 65 2d 64 62 2c 20  (fts4-table-db, 
0b30: 66 74 73 34 2d 74 61 62 6c 65 29 3b 0a 20 20 2a  fts4-table);.  *
0b40: 2f 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  /.  if( argc!=4 
0b50: 26 26 20 61 72 67 63 21 3d 35 20 29 20 67 6f 74  && argc!=5 ) got
0b60: 6f 20 62 61 64 5f 61 72 67 73 3b 0a 0a 20 20 7a  o bad_args;..  z
0b70: 44 62 20 3d 20 61 72 67 76 5b 31 5d 3b 20 0a 20  Db = argv[1]; . 
0b80: 20 6e 44 62 20 3d 20 28 69 6e 74 29 73 74 72 6c   nDb = (int)strl
0b90: 65 6e 28 7a 44 62 29 3b 0a 20 20 69 66 28 20 61  en(zDb);.  if( a
0ba0: 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66  rgc==5 ){.    if
0bb0: 28 20 6e 44 62 3d 3d 34 20 26 26 20 30 3d 3d 73  ( nDb==4 && 0==s
0bc0: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
0bd0: 22 74 65 6d 70 22 2c 20 7a 44 62 2c 20 34 29 20  "temp", zDb, 4) 
0be0: 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 61  ){.      zDb = a
0bf0: 72 67 76 5b 33 5d 3b 20 0a 20 20 20 20 20 20 6e  rgv[3]; .      n
0c00: 44 62 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  Db = (int)strlen
0c10: 28 7a 44 62 29 3b 0a 20 20 20 20 20 20 7a 46 74  (zDb);.      zFt
0c20: 73 33 20 3d 20 61 72 67 76 5b 34 5d 3b 0a 20 20  s3 = argv[4];.  
0c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
0c40: 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
0c50: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
0c60: 20 7a 46 74 73 33 20 3d 20 61 72 67 76 5b 33 5d   zFts3 = argv[3]
0c70: 3b 0a 20 20 7d 0a 20 20 6e 46 74 73 33 20 3d 20  ;.  }.  nFts3 = 
0c80: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 74 73  (int)strlen(zFts
0c90: 33 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  3);..  rc = sqli
0ca0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
0cb0: 28 64 62 2c 20 46 54 53 33 5f 54 45 52 4d 53 5f  (db, FTS3_TERMS_
0cc0: 53 43 48 45 4d 41 29 3b 0a 20 20 69 66 28 20 72  SCHEMA);.  if( r
0cd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
0ce0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6e 42 79  eturn rc;..  nBy
0cf0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33  te = sizeof(Fts3
0d00: 61 75 78 54 61 62 6c 65 29 20 2b 20 73 69 7a 65  auxTable) + size
0d10: 6f 66 28 46 74 73 33 54 61 62 6c 65 29 20 2b 20  of(Fts3Table) + 
0d20: 6e 44 62 20 2b 20 6e 46 74 73 33 20 2b 20 32 3b  nDb + nFts3 + 2;
0d30: 0a 20 20 70 20 3d 20 28 46 74 73 33 61 75 78 54  .  p = (Fts3auxT
0d40: 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  able *)sqlite3_m
0d50: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
0d60: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
0d70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
0d80: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 42 79  memset(p, 0, nBy
0d90: 74 65 29 3b 0a 0a 20 20 70 2d 3e 70 46 74 73 33  te);..  p->pFts3
0da0: 54 61 62 20 3d 20 28 46 74 73 33 54 61 62 6c 65  Tab = (Fts3Table
0db0: 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70   *)&p[1];.  p->p
0dc0: 46 74 73 33 54 61 62 2d 3e 7a 44 62 20 3d 20 28  Fts3Tab->zDb = (
0dd0: 63 68 61 72 20 2a 29 26 70 2d 3e 70 46 74 73 33  char *)&p->pFts3
0de0: 54 61 62 5b 31 5d 3b 0a 20 20 70 2d 3e 70 46 74  Tab[1];.  p->pFt
0df0: 73 33 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 26  s3Tab->zName = &
0e00: 70 2d 3e 70 46 74 73 33 54 61 62 2d 3e 7a 44 62  p->pFts3Tab->zDb
0e10: 5b 6e 44 62 2b 31 5d 3b 0a 20 20 70 2d 3e 70 46  [nDb+1];.  p->pF
0e20: 74 73 33 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b  ts3Tab->db = db;
0e30: 0a 20 20 70 2d 3e 70 46 74 73 33 54 61 62 2d 3e  .  p->pFts3Tab->
0e40: 6e 49 6e 64 65 78 20 3d 20 31 3b 0a 0a 20 20 6d  nIndex = 1;..  m
0e50: 65 6d 63 70 79 28 28 63 68 61 72 20 2a 29 70 2d  emcpy((char *)p-
0e60: 3e 70 46 74 73 33 54 61 62 2d 3e 7a 44 62 2c 20  >pFts3Tab->zDb, 
0e70: 7a 44 62 2c 20 6e 44 62 29 3b 0a 20 20 6d 65 6d  zDb, nDb);.  mem
0e80: 63 70 79 28 28 63 68 61 72 20 2a 29 70 2d 3e 70  cpy((char *)p->p
0e90: 46 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  Fts3Tab->zName, 
0ea0: 7a 46 74 73 33 2c 20 6e 46 74 73 33 29 3b 0a 20  zFts3, nFts3);. 
0eb0: 20 73 71 6c 69 74 65 33 46 74 73 33 44 65 71 75   sqlite3Fts3Dequ
0ec0: 6f 74 65 28 28 63 68 61 72 20 2a 29 70 2d 3e 70  ote((char *)p->p
0ed0: 46 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  Fts3Tab->zName);
0ee0: 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73  ..  *ppVtab = (s
0ef0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70 3b  qlite3_vtab *)p;
0f00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
0f10: 5f 4f 4b 3b 0a 0a 20 62 61 64 5f 61 72 67 73 3a  _OK;.. bad_args:
0f20: 0a 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69  .  *pzErr = sqli
0f30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
0f40: 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20 74  alid arguments t
0f50: 6f 20 66 74 73 34 61 75 78 20 63 6f 6e 73 74 72  o fts4aux constr
0f60: 75 63 74 6f 72 22 29 3b 0a 20 20 72 65 74 75 72  uctor");.  retur
0f70: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
0f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
0f90: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
0fa0: 77 6f 72 6b 20 66 6f 72 20 62 6f 74 68 20 74 68  work for both th
0fb0: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 61 6e  e xDisconnect an
0fc0: 64 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f  d xDestroy metho
0fd0: 64 73 2e 0a 2a 2a 20 54 68 65 73 65 20 74 61 62  ds..** These tab
0fe0: 6c 65 73 20 68 61 76 65 20 6e 6f 20 70 65 72 73  les have no pers
0ff0: 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
1000: 61 74 69 6f 6e 20 6f 66 20 74 68 65 69 72 20 6f  ation of their o
1010: 77 6e 2c 20 73 6f 20 78 44 69 73 63 6f 6e 6e 65  wn, so xDisconne
1020: 63 74 0a 2a 2a 20 61 6e 64 20 78 44 65 73 74 72  ct.** and xDestr
1030: 6f 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  oy are identical
1040: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
1050: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61  static int fts3a
1060: 75 78 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68  uxDisconnectMeth
1070: 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  od(sqlite3_vtab 
1080: 2a 70 56 74 61 62 29 7b 0a 20 20 46 74 73 33 61  *pVtab){.  Fts3a
1090: 75 78 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  uxTable *p = (Ft
10a0: 73 33 61 75 78 54 61 62 6c 65 20 2a 29 70 56 74  s3auxTable *)pVt
10b0: 61 62 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ab;.  Fts3Table 
10c0: 2a 70 46 74 73 33 20 3d 20 70 2d 3e 70 46 74 73  *pFts3 = p->pFts
10d0: 33 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  3Tab;.  int i;..
10e0: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 70 72    /* Free any pr
10f0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1100: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 66 6f 72 28  s held */.  for(
1110: 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72  i=0; i<SizeofArr
1120: 61 79 28 70 46 74 73 33 2d 3e 61 53 74 6d 74 29  ay(pFts3->aStmt)
1130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1140: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 46 74  te3_finalize(pFt
1150: 73 33 2d 3e 61 53 74 6d 74 5b 69 5d 29 3b 0a 20  s3->aStmt[i]);. 
1160: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1170: 65 28 70 46 74 73 33 2d 3e 7a 53 65 67 6d 65 6e  e(pFts3->zSegmen
1180: 74 73 54 62 6c 29 3b 0a 20 20 73 71 6c 69 74 65  tsTbl);.  sqlite
1190: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
11a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11b0: 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 34 41 55  ..#define FTS4AU
11c0: 58 5f 45 51 5f 43 4f 4e 53 54 52 41 49 4e 54 20  X_EQ_CONSTRAINT 
11d0: 31 0a 23 64 65 66 69 6e 65 20 46 54 53 34 41 55  1.#define FTS4AU
11e0: 58 5f 47 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  X_GE_CONSTRAINT 
11f0: 32 0a 23 64 65 66 69 6e 65 20 46 54 53 34 41 55  2.#define FTS4AU
1200: 58 5f 4c 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  X_LE_CONSTRAINT 
1210: 34 0a 0a 2f 2a 0a 2a 2a 20 78 42 65 73 74 49 6e  4../*.** xBestIn
1220: 64 65 78 20 2d 20 41 6e 61 6c 79 7a 65 20 61 20  dex - Analyze a 
1230: 57 48 45 52 45 20 61 6e 64 20 4f 52 44 45 52 20  WHERE and ORDER 
1240: 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
1250: 61 74 69 63 20 69 6e 74 20 66 74 73 33 61 75 78  atic int fts3aux
1260: 42 65 73 74 49 6e 64 65 78 4d 65 74 68 6f 64 28  BestIndexMethod(
1270: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
1280: 2a 70 56 54 61 62 2c 20 0a 20 20 73 71 6c 69 74  *pVTab, .  sqlit
1290: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12a0: 49 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Info.){.  int i;
12b0: 0a 20 20 69 6e 74 20 69 45 71 20 3d 20 2d 31 3b  .  int iEq = -1;
12c0: 0a 20 20 69 6e 74 20 69 47 65 20 3d 20 2d 31 3b  .  int iGe = -1;
12d0: 0a 20 20 69 6e 74 20 69 4c 65 20 3d 20 2d 31 3b  .  int iLe = -1;
12e0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
12f0: 45 54 45 52 28 70 56 54 61 62 29 3b 0a 0a 20 20  ETER(pVTab);..  
1300: 2f 2a 20 54 68 69 73 20 76 74 61 62 20 64 65 6c  /* This vtab del
1310: 69 76 65 72 73 20 61 6c 77 61 79 73 20 72 65 73  ivers always res
1320: 75 6c 74 73 20 69 6e 20 22 4f 52 44 45 52 20 42  ults in "ORDER B
1330: 59 20 74 65 72 6d 20 41 53 43 22 20 6f 72 64 65  Y term ASC" orde
1340: 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 6e 66  r. */.  if( pInf
1350: 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d 31 20 0a  o->nOrderBy==1 .
1360: 20 20 20 26 26 20 70 49 6e 66 6f 2d 3e 61 4f 72     && pInfo->aOr
1370: 64 65 72 42 79 5b 30 5d 2e 69 43 6f 6c 75 6d 6e  derBy[0].iColumn
1380: 3d 3d 30 20 0a 20 20 20 26 26 20 70 49 6e 66 6f  ==0 .   && pInfo
1390: 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e 64 65  ->aOrderBy[0].de
13a0: 73 63 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  sc==0.  ){.    p
13b0: 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
13c0: 73 75 6d 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  sumed = 1;.  }..
13d0: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
13e0: 65 71 75 61 6c 69 74 79 20 61 6e 64 20 72 61 6e  equality and ran
13f0: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  ge constraints o
1400: 6e 20 74 68 65 20 22 74 65 72 6d 22 20 63 6f 6c  n the "term" col
1410: 75 6d 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  umn. */.  for(i=
1420: 30 3b 20 69 3c 70 49 6e 66 6f 2d 3e 6e 43 6f 6e  0; i<pInfo->nCon
1430: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
1440: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 61 43     if( pInfo->aC
1450: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
1460: 62 6c 65 20 26 26 20 70 49 6e 66 6f 2d 3e 61 43  ble && pInfo->aC
1470: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
1480: 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
1490: 20 69 6e 74 20 6f 70 20 3d 20 70 49 6e 66 6f 2d   int op = pInfo-
14a0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
14b0: 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  op;.      if( op
14c0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14d0: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20 69  ONSTRAINT_EQ ) i
14e0: 45 71 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  Eq = i;.      if
14f0: 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ( op==SQLITE_IND
1500: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
1510: 20 29 20 69 4c 65 20 3d 20 69 3b 0a 20 20 20 20   ) iLe = i;.    
1520: 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
1530: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
1540: 54 5f 4c 45 20 29 20 69 4c 65 20 3d 20 69 3b 0a  T_LE ) iLe = i;.
1550: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51        if( op==SQ
1560: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
1570: 52 41 49 4e 54 5f 47 54 20 29 20 69 47 65 20 3d  RAINT_GT ) iGe =
1580: 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   i;.      if( op
1590: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
15a0: 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 20 69  ONSTRAINT_GE ) i
15b0: 47 65 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  Ge = i;.    }.  
15c0: 7d 0a 0a 20 20 69 66 28 20 69 45 71 3e 3d 30 20  }..  if( iEq>=0 
15d0: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64  ){.    pInfo->id
15e0: 78 4e 75 6d 20 3d 20 46 54 53 34 41 55 58 5f 45  xNum = FTS4AUX_E
15f0: 51 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  Q_CONSTRAINT;.  
1600: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72    pInfo->aConstr
1610: 61 69 6e 74 55 73 61 67 65 5b 69 45 71 5d 2e 61  aintUsage[iEq].a
1620: 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20  rgvIndex = 1;.  
1630: 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74    pInfo->estimat
1640: 65 64 43 6f 73 74 20 3d 20 35 3b 0a 20 20 7d 65  edCost = 5;.  }e
1650: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
1660: 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
1670: 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  pInfo->estimated
1680: 43 6f 73 74 20 3d 20 32 30 30 30 30 3b 0a 20 20  Cost = 20000;.  
1690: 20 20 69 66 28 20 69 47 65 3e 3d 30 20 29 7b 0a    if( iGe>=0 ){.
16a0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78        pInfo->idx
16b0: 4e 75 6d 20 2b 3d 20 46 54 53 34 41 55 58 5f 47  Num += FTS4AUX_G
16c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
16d0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73      pInfo->aCons
16e0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 47 65 5d  traintUsage[iGe]
16f0: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a  .argvIndex = 1;.
1700: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74        pInfo->est
1710: 69 6d 61 74 65 64 43 6f 73 74 20 2f 3d 20 32 3b  imatedCost /= 2;
1720: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1730: 4c 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  Le>=0 ){.      p
1740: 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 2b 3d 20  Info->idxNum += 
1750: 46 54 53 34 41 55 58 5f 4c 45 5f 43 4f 4e 53 54  FTS4AUX_LE_CONST
1760: 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 70 49 6e  RAINT;.      pIn
1770: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
1780: 73 61 67 65 5b 69 4c 65 5d 2e 61 72 67 76 49 6e  sage[iLe].argvIn
1790: 64 65 78 20 3d 20 31 20 2b 20 28 69 47 65 3e 3d  dex = 1 + (iGe>=
17a0: 30 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  0);.      pInfo-
17b0: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 2f  >estimatedCost /
17c0: 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 2;.    }.  }..
17d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 4f 70  OK;.}../*.** xOp
17f0: 65 6e 20 2d 20 4f 70 65 6e 20 61 20 63 75 72 73  en - Open a curs
1800: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
1810: 74 20 66 74 73 33 61 75 78 4f 70 65 6e 4d 65 74  t fts3auxOpenMet
1820: 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
1830: 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33   *pVTab, sqlite3
1840: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
1850: 70 43 73 72 29 7b 0a 20 20 46 74 73 33 61 75 78  pCsr){.  Fts3aux
1860: 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20  Cursor *pCsr;   
1870: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1880: 74 65 72 20 74 6f 20 63 75 72 73 6f 72 20 6f 62  ter to cursor ob
1890: 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a  ject to return *
18a0: 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  /..  UNUSED_PARA
18b0: 4d 45 54 45 52 28 70 56 54 61 62 29 3b 0a 0a 20  METER(pVTab);.. 
18c0: 20 70 43 73 72 20 3d 20 28 46 74 73 33 61 75 78   pCsr = (Fts3aux
18d0: 43 75 72 73 6f 72 20 2a 29 73 71 6c 69 74 65 33  Cursor *)sqlite3
18e0: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46  _malloc(sizeof(F
18f0: 74 73 33 61 75 78 43 75 72 73 6f 72 29 29 3b 0a  ts3auxCursor));.
1900: 20 20 69 66 28 20 21 70 43 73 72 20 29 20 72 65    if( !pCsr ) re
1910: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1920: 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72  M;.  memset(pCsr
1930: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
1940: 61 75 78 43 75 72 73 6f 72 29 29 3b 0a 0a 20 20  auxCursor));..  
1950: 2a 70 70 43 73 72 20 3d 20 28 73 71 6c 69 74 65  *ppCsr = (sqlite
1960: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 29  3_vtab_cursor *)
1970: 70 43 73 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  pCsr;.  return S
1980: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1990: 2a 2a 20 78 43 6c 6f 73 65 20 2d 20 43 6c 6f 73  ** xClose - Clos
19a0: 65 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  e a cursor..*/.s
19b0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61 75  tatic int fts3au
19c0: 78 43 6c 6f 73 65 4d 65 74 68 6f 64 28 73 71 6c  xCloseMethod(sql
19d0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
19e0: 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 46 74   *pCursor){.  Ft
19f0: 73 33 54 61 62 6c 65 20 2a 70 46 74 73 33 20 3d  s3Table *pFts3 =
1a00: 20 28 28 46 74 73 33 61 75 78 54 61 62 6c 65 20   ((Fts3auxTable 
1a10: 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  *)pCursor->pVtab
1a20: 29 2d 3e 70 46 74 73 33 54 61 62 3b 0a 20 20 46  )->pFts3Tab;.  F
1a30: 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a 70 43  ts3auxCursor *pC
1a40: 73 72 20 3d 20 28 46 74 73 33 61 75 78 43 75 72  sr = (Fts3auxCur
1a50: 73 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a  sor *)pCursor;..
1a60: 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
1a70: 6d 65 6e 74 73 43 6c 6f 73 65 28 70 46 74 73 33  mentsClose(pFts3
1a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
1a90: 53 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28  SegReaderFinish(
1aa0: 26 70 43 73 72 2d 3e 63 73 72 29 3b 0a 20 20 73  &pCsr->csr);.  s
1ab0: 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69  qlite3_free((voi
1ac0: 64 20 2a 29 70 43 73 72 2d 3e 66 69 6c 74 65 72  d *)pCsr->filter
1ad0: 2e 7a 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74  .zTerm);.  sqlit
1ae0: 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 7a 53  e3_free(pCsr->zS
1af0: 74 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  top);.  sqlite3_
1b00: 66 72 65 65 28 70 43 73 72 2d 3e 61 53 74 61 74  free(pCsr->aStat
1b10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1b20: 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
1b30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61  static int fts3a
1b50: 75 78 47 72 6f 77 53 74 61 74 41 72 72 61 79 28  uxGrowStatArray(
1b60: 46 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a 70  Fts3auxCursor *p
1b70: 43 73 72 2c 20 69 6e 74 20 6e 53 69 7a 65 29 7b  Csr, int nSize){
1b80: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 43 73  .  if( nSize>pCs
1b90: 72 2d 3e 6e 53 74 61 74 20 29 7b 0a 20 20 20 20  r->nStat ){.    
1ba0: 73 74 72 75 63 74 20 46 74 73 33 61 75 78 43 6f  struct Fts3auxCo
1bb0: 6c 73 74 61 74 73 20 2a 61 4e 65 77 3b 0a 20 20  lstats *aNew;.  
1bc0: 20 20 61 4e 65 77 20 3d 20 28 73 74 72 75 63 74    aNew = (struct
1bd0: 20 46 74 73 33 61 75 78 43 6f 6c 73 74 61 74 73   Fts3auxColstats
1be0: 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   *)sqlite3_reall
1bf0: 6f 63 28 70 43 73 72 2d 3e 61 53 74 61 74 2c 20  oc(pCsr->aStat, 
1c00: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
1c10: 73 74 72 75 63 74 20 46 74 73 33 61 75 78 43 6f  struct Fts3auxCo
1c20: 6c 73 74 61 74 73 29 20 2a 20 6e 53 69 7a 65 0a  lstats) * nSize.
1c30: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61      );.    if( a
1c40: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
1c50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1c60: 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
1c70: 43 73 72 2d 3e 6e 53 74 61 74 5d 2c 20 30 2c 20  Csr->nStat], 0, 
1c80: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
1c90: 73 74 72 75 63 74 20 46 74 73 33 61 75 78 43 6f  struct Fts3auxCo
1ca0: 6c 73 74 61 74 73 29 20 2a 20 28 6e 53 69 7a 65  lstats) * (nSize
1cb0: 20 2d 20 70 43 73 72 2d 3e 6e 53 74 61 74 29 0a   - pCsr->nStat).
1cc0: 20 20 20 20 29 3b 0a 20 20 20 20 70 43 73 72 2d      );.    pCsr-
1cd0: 3e 61 53 74 61 74 20 3d 20 61 4e 65 77 3b 0a 20  >aStat = aNew;. 
1ce0: 20 20 20 70 43 73 72 2d 3e 6e 53 74 61 74 20 3d     pCsr->nStat =
1cf0: 20 6e 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65   nSize;.  }.  re
1d00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 78 4e 65 78 74 20 2d  }../*.** xNext -
1d20: 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
1d30: 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
1d40: 72 6f 77 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  row, if any..*/.
1d50: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61  static int fts3a
1d60: 75 78 4e 65 78 74 4d 65 74 68 6f 64 28 73 71 6c  uxNextMethod(sql
1d70: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
1d80: 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 46 74   *pCursor){.  Ft
1d90: 73 33 61 75 78 43 75 72 73 6f 72 20 2a 70 43 73  s3auxCursor *pCs
1da0: 72 20 3d 20 28 46 74 73 33 61 75 78 43 75 72 73  r = (Fts3auxCurs
1db0: 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20  or *)pCursor;.  
1dc0: 46 74 73 33 54 61 62 6c 65 20 2a 70 46 74 73 33  Fts3Table *pFts3
1dd0: 20 3d 20 28 28 46 74 73 33 61 75 78 54 61 62 6c   = ((Fts3auxTabl
1de0: 65 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74  e *)pCursor->pVt
1df0: 61 62 29 2d 3e 70 46 74 73 33 54 61 62 3b 0a 20  ab)->pFts3Tab;. 
1e00: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49   int rc;..  /* I
1e10: 6e 63 72 65 6d 65 6e 74 20 6f 75 72 20 70 72 65  ncrement our pre
1e20: 74 65 6e 64 20 72 6f 77 69 64 20 76 61 6c 75 65  tend rowid value
1e30: 2e 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69 52 6f  . */.  pCsr->iRo
1e40: 77 69 64 2b 2b 3b 0a 0a 20 20 66 6f 72 28 70 43  wid++;..  for(pC
1e50: 73 72 2d 3e 69 43 6f 6c 2b 2b 3b 20 70 43 73 72  sr->iCol++; pCsr
1e60: 2d 3e 69 43 6f 6c 3c 70 43 73 72 2d 3e 6e 53 74  ->iCol<pCsr->nSt
1e70: 61 74 3b 20 70 43 73 72 2d 3e 69 43 6f 6c 2b 2b  at; pCsr->iCol++
1e80: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d  ){.    if( pCsr-
1e90: 3e 61 53 74 61 74 5b 70 43 73 72 2d 3e 69 43 6f  >aStat[pCsr->iCo
1ea0: 6c 5d 2e 6e 44 6f 63 3e 30 20 29 20 72 65 74 75  l].nDoc>0 ) retu
1eb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ec0: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1ed0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
1ee0: 65 70 28 70 46 74 73 33 2c 20 26 70 43 73 72 2d  ep(pFts3, &pCsr-
1ef0: 3e 63 73 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  >csr);.  if( rc=
1f00: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1f10: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
1f20: 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 3d    int nDoclist =
1f30: 20 70 43 73 72 2d 3e 63 73 72 2e 6e 44 6f 63 6c   pCsr->csr.nDocl
1f40: 69 73 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 61  ist;.    char *a
1f50: 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e  Doclist = pCsr->
1f60: 63 73 72 2e 61 44 6f 63 6c 69 73 74 3b 0a 20 20  csr.aDoclist;.  
1f70: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 20    int iCol;..   
1f80: 20 69 6e 74 20 65 53 74 61 74 65 20 3d 20 30 3b   int eState = 0;
1f90: 0a 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e  ..    if( pCsr->
1fa0: 7a 53 74 6f 70 20 29 7b 0a 20 20 20 20 20 20 69  zStop ){.      i
1fb0: 6e 74 20 6e 20 3d 20 28 70 43 73 72 2d 3e 6e 53  nt n = (pCsr->nS
1fc0: 74 6f 70 3c 70 43 73 72 2d 3e 63 73 72 2e 6e 54  top<pCsr->csr.nT
1fd0: 65 72 6d 29 20 3f 20 70 43 73 72 2d 3e 6e 53 74  erm) ? pCsr->nSt
1fe0: 6f 70 20 3a 20 70 43 73 72 2d 3e 63 73 72 2e 6e  op : pCsr->csr.n
1ff0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
2000: 6d 63 20 3d 20 6d 65 6d 63 6d 70 28 70 43 73 72  mc = memcmp(pCsr
2010: 2d 3e 7a 53 74 6f 70 2c 20 70 43 73 72 2d 3e 63  ->zStop, pCsr->c
2020: 73 72 2e 7a 54 65 72 6d 2c 20 6e 29 3b 0a 20 20  sr.zTerm, n);.  
2030: 20 20 20 20 69 66 28 20 6d 63 3c 30 20 7c 7c 20      if( mc<0 || 
2040: 28 6d 63 3d 3d 30 20 26 26 20 70 43 73 72 2d 3e  (mc==0 && pCsr->
2050: 63 73 72 2e 6e 54 65 72 6d 3e 70 43 73 72 2d 3e  csr.nTerm>pCsr->
2060: 6e 53 74 6f 70 29 20 29 7b 0a 20 20 20 20 20 20  nStop) ){.      
2070: 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20    pCsr->isEof = 
2080: 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2090: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
20a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20b0: 69 66 28 20 66 74 73 33 61 75 78 47 72 6f 77 53  if( fts3auxGrowS
20c0: 74 61 74 41 72 72 61 79 28 70 43 73 72 2c 20 32  tatArray(pCsr, 2
20d0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
20e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
20f0: 73 65 74 28 70 43 73 72 2d 3e 61 53 74 61 74 2c  set(pCsr->aStat,
2100: 20 30 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63   0, sizeof(struc
2110: 74 20 46 74 73 33 61 75 78 43 6f 6c 73 74 61 74  t Fts3auxColstat
2120: 73 29 20 2a 20 70 43 73 72 2d 3e 6e 53 74 61 74  s) * pCsr->nStat
2130: 29 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 30 3b  );.    iCol = 0;
2140: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e  ..    while( i<n
2150: 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
2160: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76   sqlite3_int64 v
2170: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 20 2b   = 0;..      i +
2180: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
2190: 56 61 72 69 6e 74 28 26 61 44 6f 63 6c 69 73 74  Varint(&aDoclist
21a0: 5b 69 5d 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  [i], &v);.      
21b0: 73 77 69 74 63 68 28 20 65 53 74 61 74 65 20 29  switch( eState )
21c0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  {.        /* Sta
21d0: 74 65 20 30 2e 20 49 6e 20 74 68 69 73 20 73 74  te 0. In this st
21e0: 61 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  ate the integer 
21f0: 6a 75 73 74 20 72 65 61 64 20 77 61 73 20 61 20  just read was a 
2200: 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20  docid. */.      
2210: 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20    case 0:.      
2220: 20 20 20 20 70 43 73 72 2d 3e 61 53 74 61 74 5b      pCsr->aStat[
2230: 30 5d 2e 6e 44 6f 63 2b 2b 3b 0a 20 20 20 20 20  0].nDoc++;.     
2240: 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b       eState = 1;
2250: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
2260: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
2270: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f  reak;..        /
2280: 2a 20 53 74 61 74 65 20 31 2e 20 49 6e 20 74 68  * State 1. In th
2290: 69 73 20 73 74 61 74 65 20 77 65 20 61 72 65 20  is state we are 
22a0: 65 78 70 65 63 74 69 6e 67 20 65 69 74 68 65 72  expecting either
22b0: 20 61 20 31 2c 20 69 6e 64 69 63 61 74 69 6e 67   a 1, indicating
22c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
22d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
22e0: 6e 74 65 67 65 72 20 77 69 6c 6c 20 62 65 20 61  nteger will be a
22f0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2c 20   column number, 
2300: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  or the.        *
2310: 2a 20 73 74 61 72 74 20 6f 66 20 61 20 70 6f 73  * start of a pos
2320: 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 63  ition list for c
2330: 6f 6c 75 6d 6e 20 30 2e 20 20 0a 20 20 20 20 20  olumn 0.  .     
2340: 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a     ** .        *
2350: 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * The only diffe
2360: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 73 74  rence between st
2370: 61 74 65 20 31 20 61 6e 64 20 73 74 61 74 65 20  ate 1 and state 
2380: 32 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  2 is that if the
2390: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
23a0: 67 65 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ger encountered 
23b0: 69 6e 20 73 74 61 74 65 20 31 20 69 73 20 6e 6f  in state 1 is no
23c0: 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 77  t 0 or 1, then w
23d0: 65 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  e need to.      
23e0: 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74    ** increment t
23f0: 68 65 20 63 6f 6c 75 6d 6e 20 30 20 22 6e 44 6f  he column 0 "nDo
2400: 63 22 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  c" count for thi
2410: 73 20 74 65 72 6d 2e 0a 20 20 20 20 20 20 20 20  s term..        
2420: 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  */.        case 
2430: 31 3a 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  1:.          ass
2440: 65 72 74 28 20 69 43 6f 6c 3d 3d 30 20 29 3b 0a  ert( iCol==0 );.
2450: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
2460: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2470: 20 70 43 73 72 2d 3e 61 53 74 61 74 5b 31 5d 2e   pCsr->aStat[1].
2480: 6e 44 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nDoc++;.        
2490: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 53    }.          eS
24a0: 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20  tate = 2;.      
24b0: 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 6f      /* fall thro
24c0: 75 67 68 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ugh */..        
24d0: 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 20 20  case 2:.        
24e0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 20 20 20    if( v==0 ){   
24f0: 20 20 20 20 2f 2a 20 30 78 30 30 2e 20 4e 65 78      /* 0x00. Nex
2500: 74 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62  t integer will b
2510: 65 20 61 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20  e a docid. */.  
2520: 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
2530: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2540: 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 31 20 29  }else if( v==1 )
2550: 7b 20 2f 2a 20 30 78 30 31 2e 20 4e 65 78 74 20  { /* 0x01. Next 
2560: 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62 65 20  integer will be 
2570: 61 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e  a column number.
2580: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2590: 65 53 74 61 74 65 20 3d 20 33 3b 0a 20 20 20 20  eState = 3;.    
25a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20        }else{    
25b0: 20 20 20 20 20 20 20 20 2f 2a 20 32 20 6f 72 20          /* 2 or 
25c0: 67 72 65 61 74 65 72 2e 20 41 20 70 6f 73 69 74  greater. A posit
25d0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
25e0: 20 20 20 20 70 43 73 72 2d 3e 61 53 74 61 74 5b      pCsr->aStat[
25f0: 69 43 6f 6c 2b 31 5d 2e 6e 4f 63 63 2b 2b 3b 0a  iCol+1].nOcc++;.
2600: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
2610: 2d 3e 61 53 74 61 74 5b 30 5d 2e 6e 4f 63 63 2b  ->aStat[0].nOcc+
2620: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2630: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2640: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74  .        /* Stat
2650: 65 20 33 2e 20 54 68 65 20 69 6e 74 65 67 65 72  e 3. The integer
2660: 20 6a 75 73 74 20 72 65 61 64 20 69 73 20 61 20   just read is a 
2670: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 2a  column number. *
2680: 2f 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  /.        defaul
2690: 74 3a 20 61 73 73 65 72 74 28 20 65 53 74 61 74  t: assert( eStat
26a0: 65 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20  e==3 );.        
26b0: 20 20 69 43 6f 6c 20 3d 20 28 69 6e 74 29 76 3b    iCol = (int)v;
26c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
26d0: 74 73 33 61 75 78 47 72 6f 77 53 74 61 74 41 72  ts3auxGrowStatAr
26e0: 72 61 79 28 70 43 73 72 2c 20 69 43 6f 6c 2b 32  ray(pCsr, iCol+2
26f0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2700: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2710: 20 20 20 70 43 73 72 2d 3e 61 53 74 61 74 5b 69     pCsr->aStat[i
2720: 43 6f 6c 2b 31 5d 2e 6e 44 6f 63 2b 2b 3b 0a 20  Col+1].nDoc++;. 
2730: 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20           eState 
2740: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 2;.          b
2750: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2760: 20 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e 69    }..    pCsr->i
2770: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Col = 0;.    rc 
2780: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2790: 65 6c 73 65 7b 0a 20 20 20 20 70 43 73 72 2d 3e  else{.    pCsr->
27a0: 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 0a 20  isEof = 1;.  }. 
27b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27c0: 2a 0a 2a 2a 20 78 46 69 6c 74 65 72 20 2d 20 49  *.** xFilter - I
27d0: 6e 69 74 69 61 6c 69 7a 65 20 61 20 63 75 72 73  nitialize a curs
27e0: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  or to point at t
27f0: 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 73 20  he start of its 
2800: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
2810: 69 6e 74 20 66 74 73 33 61 75 78 46 69 6c 74 65  int fts3auxFilte
2820: 72 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  rMethod(.  sqlit
2830: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
2840: 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20 54 68  pCursor,   /* Th
2850: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
2860: 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
2870: 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20    int idxNum,   
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 2f 2a 20 53 74 72 61 74 65 67 79 20 69 6e    /* Strategy in
28a0: 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
28b0: 68 61 72 20 2a 69 64 78 53 74 72 2c 20 20 20 20  har *idxStr,    
28c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
28d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c  ed */.  int nVal
28e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2900: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
2910: 20 61 70 56 61 6c 20 2a 2f 0a 20 20 73 71 6c 69   apVal */.  sqli
2920: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
2930: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l           /* A
2940: 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65  rguments for the
2950: 20 69 6e 64 65 78 69 6e 67 20 73 63 68 65 6d 65   indexing scheme
2960: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 61 75 78   */.){.  Fts3aux
2970: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
2980: 46 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a 29  Fts3auxCursor *)
2990: 70 43 75 72 73 6f 72 3b 0a 20 20 46 74 73 33 54  pCursor;.  Fts3T
29a0: 61 62 6c 65 20 2a 70 46 74 73 33 20 3d 20 28 28  able *pFts3 = ((
29b0: 46 74 73 33 61 75 78 54 61 62 6c 65 20 2a 29 70  Fts3auxTable *)p
29c0: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 2d 3e  Cursor->pVtab)->
29d0: 70 46 74 73 33 54 61 62 3b 0a 20 20 69 6e 74 20  pFts3Tab;.  int 
29e0: 72 63 3b 0a 20 20 69 6e 74 20 69 73 53 63 61 6e  rc;.  int isScan
29f0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
2a00: 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20 20 55  METER(nVal);.  U
2a10: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a20: 69 64 78 53 74 72 29 3b 0a 0a 20 20 61 73 73 65  idxStr);..  asse
2a30: 72 74 28 20 69 64 78 53 74 72 3d 3d 30 20 29 3b  rt( idxStr==0 );
2a40: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 4e 75  .  assert( idxNu
2a50: 6d 3d 3d 46 54 53 34 41 55 58 5f 45 51 5f 43 4f  m==FTS4AUX_EQ_CO
2a60: 4e 53 54 52 41 49 4e 54 20 7c 7c 20 69 64 78 4e  NSTRAINT || idxN
2a70: 75 6d 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  um==0.       || 
2a80: 69 64 78 4e 75 6d 3d 3d 46 54 53 34 41 55 58 5f  idxNum==FTS4AUX_
2a90: 4c 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 7c 7c  LE_CONSTRAINT ||
2aa0: 20 69 64 78 4e 75 6d 3d 3d 46 54 53 34 41 55 58   idxNum==FTS4AUX
2ab0: 5f 47 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 20  _GE_CONSTRAINT. 
2ac0: 20 20 20 20 20 20 7c 7c 20 69 64 78 4e 75 6d 3d        || idxNum=
2ad0: 3d 28 46 54 53 34 41 55 58 5f 4c 45 5f 43 4f 4e  =(FTS4AUX_LE_CON
2ae0: 53 54 52 41 49 4e 54 7c 46 54 53 34 41 55 58 5f  STRAINT|FTS4AUX_
2af0: 47 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 0a 20  GE_CONSTRAINT). 
2b00: 20 29 3b 0a 20 20 69 73 53 63 61 6e 20 3d 20 28   );.  isScan = (
2b10: 69 64 78 4e 75 6d 21 3d 46 54 53 34 41 55 58 5f  idxNum!=FTS4AUX_
2b20: 45 51 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3b 0a  EQ_CONSTRAINT);.
2b30: 0a 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68  .  /* In case th
2b40: 69 73 20 63 75 72 73 6f 72 20 69 73 20 62 65 69  is cursor is bei
2b50: 6e 67 20 72 65 75 73 65 64 2c 20 63 6c 6f 73 65  ng reused, close
2b60: 20 61 6e 64 20 7a 65 72 6f 20 69 74 2e 20 2a 2f   and zero it. */
2b70: 0a 20 20 74 65 73 74 63 61 73 65 28 70 43 73 72  .  testcase(pCsr
2b80: 2d 3e 66 69 6c 74 65 72 2e 7a 54 65 72 6d 29 3b  ->filter.zTerm);
2b90: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
2ba0: 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 26 70  gReaderFinish(&p
2bb0: 43 73 72 2d 3e 63 73 72 29 3b 0a 20 20 73 71 6c  Csr->csr);.  sql
2bc0: 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20  ite3_free((void 
2bd0: 2a 29 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e 7a  *)pCsr->filter.z
2be0: 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  Term);.  sqlite3
2bf0: 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 53 74 61  _free(pCsr->aSta
2c00: 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 43  t);.  memset(&pC
2c10: 73 72 2d 3e 63 73 72 2c 20 30 2c 20 28 28 75 38  sr->csr, 0, ((u8
2c20: 2a 29 26 70 43 73 72 5b 31 5d 29 20 2d 20 28 75  *)&pCsr[1]) - (u
2c30: 38 2a 29 26 70 43 73 72 2d 3e 63 73 72 29 3b 0a  8*)&pCsr->csr);.
2c40: 0a 20 20 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e  .  pCsr->filter.
2c50: 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47  flags = FTS3_SEG
2c60: 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53  MENT_REQUIRE_POS
2c70: 7c 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47  |FTS3_SEGMENT_IG
2c80: 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 69 66  NORE_EMPTY;.  if
2c90: 28 20 69 73 53 63 61 6e 20 29 20 70 43 73 72 2d  ( isScan ) pCsr-
2ca0: 3e 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d  >filter.flags |=
2cb0: 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43   FTS3_SEGMENT_SC
2cc0: 41 4e 3b 0a 0a 20 20 69 66 28 20 69 64 78 4e 75  AN;..  if( idxNu
2cd0: 6d 26 28 46 54 53 34 41 55 58 5f 45 51 5f 43 4f  m&(FTS4AUX_EQ_CO
2ce0: 4e 53 54 52 41 49 4e 54 7c 46 54 53 34 41 55 58  NSTRAINT|FTS4AUX
2cf0: 5f 47 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20  _GE_CONSTRAINT) 
2d00: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  ){.    const uns
2d10: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72  igned char *zStr
2d20: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2d30: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
2d40: 0a 20 20 20 20 69 66 28 20 7a 53 74 72 20 29 7b  .    if( zStr ){
2d50: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 66 69 6c  .      pCsr->fil
2d60: 74 65 72 2e 7a 54 65 72 6d 20 3d 20 73 71 6c 69  ter.zTerm = sqli
2d70: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
2d80: 2c 20 7a 53 74 72 29 3b 0a 20 20 20 20 20 20 70  , zStr);.      p
2d90: 43 73 72 2d 3e 66 69 6c 74 65 72 2e 6e 54 65 72  Csr->filter.nTer
2da0: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  m = sqlite3_valu
2db0: 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 30 5d  e_bytes(apVal[0]
2dc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73  );.      if( pCs
2dd0: 72 2d 3e 66 69 6c 74 65 72 2e 7a 54 65 72 6d 3d  r->filter.zTerm=
2de0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2df0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2e00: 20 20 7d 0a 20 20 69 66 28 20 69 64 78 4e 75 6d    }.  if( idxNum
2e10: 26 46 54 53 34 41 55 58 5f 4c 45 5f 43 4f 4e 53  &FTS4AUX_LE_CONS
2e20: 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 69 6e  TRAINT ){.    in
2e30: 74 20 69 49 64 78 20 3d 20 28 69 64 78 4e 75 6d  t iIdx = (idxNum
2e40: 26 46 54 53 34 41 55 58 5f 47 45 5f 43 4f 4e 53  &FTS4AUX_GE_CONS
2e50: 54 52 41 49 4e 54 29 20 3f 20 31 20 3a 20 30 3b  TRAINT) ? 1 : 0;
2e60: 0a 20 20 20 20 70 43 73 72 2d 3e 7a 53 74 6f 70  .    pCsr->zStop
2e70: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e80: 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
2e90: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
2ea0: 6c 5b 69 49 64 78 5d 29 29 3b 0a 20 20 20 20 70  l[iIdx]));.    p
2eb0: 43 73 72 2d 3e 6e 53 74 6f 70 20 3d 20 73 71 6c  Csr->nStop = sql
2ec0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2ed0: 28 61 70 56 61 6c 5b 69 49 64 78 5d 29 3b 0a 20  (apVal[iIdx]);. 
2ee0: 20 20 20 69 66 28 20 70 43 73 72 2d 3e 7a 53 74     if( pCsr->zSt
2ef0: 6f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  op==0 ) return S
2f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2f10: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2f20: 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
2f30: 73 6f 72 28 70 46 74 73 33 2c 20 30 2c 20 30 2c  sor(pFts3, 0, 0,
2f40: 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f   FTS3_SEGCURSOR_
2f50: 41 4c 4c 2c 0a 20 20 20 20 20 20 70 43 73 72 2d  ALL,.      pCsr-
2f60: 3e 66 69 6c 74 65 72 2e 7a 54 65 72 6d 2c 20 70  >filter.zTerm, p
2f70: 43 73 72 2d 3e 66 69 6c 74 65 72 2e 6e 54 65 72  Csr->filter.nTer
2f80: 6d 2c 20 30 2c 20 69 73 53 63 61 6e 2c 20 26 70  m, 0, isScan, &p
2f90: 43 73 72 2d 3e 63 73 72 0a 20 20 29 3b 0a 20 20  Csr->csr.  );.  
2fa0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fb0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
2fc0: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
2fd0: 65 72 53 74 61 72 74 28 70 46 74 73 33 2c 20 26  erStart(pFts3, &
2fe0: 70 43 73 72 2d 3e 63 73 72 2c 20 26 70 43 73 72  pCsr->csr, &pCsr
2ff0: 2d 3e 66 69 6c 74 65 72 29 3b 0a 20 20 7d 0a 0a  ->filter);.  }..
3000: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3010: 5f 4f 4b 20 29 20 72 63 20 3d 20 66 74 73 33 61  _OK ) rc = fts3a
3020: 75 78 4e 65 78 74 4d 65 74 68 6f 64 28 70 43 75  uxNextMethod(pCu
3030: 72 73 6f 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  rsor);.  return 
3040: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 45 6f  rc;.}../*.** xEo
3050: 66 20 2d 20 52 65 74 75 72 6e 20 74 72 75 65 20  f - Return true 
3060: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
3070: 20 61 74 20 45 4f 46 2c 20 6f 72 20 66 61 6c 73   at EOF, or fals
3080: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
3090: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61  static int fts3a
30a0: 75 78 45 6f 66 4d 65 74 68 6f 64 28 73 71 6c 69  uxEofMethod(sqli
30b0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
30c0: 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 46 74 73  *pCursor){.  Fts
30d0: 33 61 75 78 43 75 72 73 6f 72 20 2a 70 43 73 72  3auxCursor *pCsr
30e0: 20 3d 20 28 46 74 73 33 61 75 78 43 75 72 73 6f   = (Fts3auxCurso
30f0: 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 72  r *)pCursor;.  r
3100: 65 74 75 72 6e 20 70 43 73 72 2d 3e 69 73 45 6f  eturn pCsr->isEo
3110: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6c  f;.}../*.** xCol
3120: 75 6d 6e 20 2d 20 52 65 74 75 72 6e 20 61 20 63  umn - Return a c
3130: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a  olumn value..*/.
3140: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61  static int fts3a
3150: 75 78 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 28 0a  uxColumnMethod(.
3160: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
3170: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
3180: 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
3190: 65 74 72 69 65 76 65 20 76 61 6c 75 65 20 66 72  etrieve value fr
31a0: 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  om */.  sqlite3_
31b0: 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  context *pContex
31c0: 74 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  t,      /* Conte
31d0: 78 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 72  xt for sqlite3_r
31e0: 65 73 75 6c 74 5f 78 78 78 28 29 20 63 61 6c 6c  esult_xxx() call
31f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  s */.  int iCol 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3220: 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 61  of column to rea
3230: 64 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a  d value from */.
3240: 29 7b 0a 20 20 46 74 73 33 61 75 78 43 75 72 73  ){.  Fts3auxCurs
3250: 6f 72 20 2a 70 20 3d 20 28 46 74 73 33 61 75 78  or *p = (Fts3aux
3260: 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
3270: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
3280: 69 73 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66  isEof==0 );.  if
3290: 28 20 69 43 6f 6c 3d 3d 30 20 29 7b 20 20 20 20  ( iCol==0 ){    
32a0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 22 74      /* Column "t
32b0: 65 72 6d 22 20 2a 2f 0a 20 20 20 20 73 71 6c 69  erm" */.    sqli
32c0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
32d0: 70 43 6f 6e 74 65 78 74 2c 20 70 2d 3e 63 73 72  pContext, p->csr
32e0: 2e 7a 54 65 72 6d 2c 20 70 2d 3e 63 73 72 2e 6e  .zTerm, p->csr.n
32f0: 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f 54 52 41  Term, SQLITE_TRA
3300: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
3310: 20 69 66 28 20 69 43 6f 6c 3d 3d 31 20 29 7b 20   if( iCol==1 ){ 
3320: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 22 63 6f 6c 22   /* Column "col"
3330: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
3340: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
3350: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
3360: 70 43 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 43 6f  pContext, p->iCo
3370: 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  l-1);.    }else{
3380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
3390: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 6f 6e 74  esult_text(pCont
33a0: 65 78 74 2c 20 22 2a 22 2c 20 2d 31 2c 20 53 51  ext, "*", -1, SQ
33b0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
33c0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
33d0: 69 43 6f 6c 3d 3d 32 20 29 7b 20 20 2f 2a 20 43  iCol==2 ){  /* C
33e0: 6f 6c 75 6d 6e 20 22 64 6f 63 75 6d 65 6e 74 73  olumn "documents
33f0: 22 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  " */.    sqlite3
3400: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
3410: 6f 6e 74 65 78 74 2c 20 70 2d 3e 61 53 74 61 74  ontext, p->aStat
3420: 5b 70 2d 3e 69 43 6f 6c 5d 2e 6e 44 6f 63 29 3b  [p->iCol].nDoc);
3430: 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
3440: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3450: 6d 6e 20 22 6f 63 63 75 72 72 65 6e 63 65 73 22  mn "occurrences"
3460: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
3470: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 6f  result_int64(pCo
3480: 6e 74 65 78 74 2c 20 70 2d 3e 61 53 74 61 74 5b  ntext, p->aStat[
3490: 70 2d 3e 69 43 6f 6c 5d 2e 6e 4f 63 63 29 3b 0a  p->iCol].nOcc);.
34a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
34b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
34c0: 2a 20 78 52 6f 77 69 64 20 2d 20 52 65 74 75 72  * xRowid - Retur
34d0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
34e0: 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 73  wid for the curs
34f0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
3500: 74 20 66 74 73 33 61 75 78 52 6f 77 69 64 4d 65  t fts3auxRowidMe
3510: 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
3520: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
3530: 72 73 6f 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f  rsor,   /* Curso
3540: 72 20 74 6f 20 72 65 74 72 69 65 76 65 20 76 61  r to retrieve va
3550: 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71  lue from */.  sq
3560: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
3570: 69 64 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id            /*
3580: 20 4f 55 54 3a 20 52 6f 77 69 64 20 76 61 6c 75   OUT: Rowid valu
3590: 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 61 75  e */.){.  Fts3au
35a0: 78 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  xCursor *pCsr = 
35b0: 28 46 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a  (Fts3auxCursor *
35c0: 29 70 43 75 72 73 6f 72 3b 0a 20 20 2a 70 52 6f  )pCursor;.  *pRo
35d0: 77 69 64 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77  wid = pCsr->iRow
35e0: 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
35f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3600: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66 74   Register the ft
3610: 73 33 61 75 78 20 6d 6f 64 75 6c 65 20 77 69 74  s3aux module wit
3620: 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  h database conne
3630: 63 74 69 6f 6e 20 64 62 2e 20 52 65 74 75 72 6e  ction db. Return
3640: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66   SQLITE_OK.** if
3650: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
3660: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
3670: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
3680: 6f 64 75 6c 65 28 29 20 66 61 69 6c 73 2e 0a 2a  odule() fails..*
3690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
36a0: 33 49 6e 69 74 41 75 78 28 73 71 6c 69 74 65 33  3InitAux(sqlite3
36b0: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
36c0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
36d0: 64 75 6c 65 20 66 74 73 33 61 75 78 5f 6d 6f 64  dule fts3aux_mod
36e0: 75 6c 65 20 3d 20 7b 0a 20 20 20 20 20 30 2c 20  ule = {.     0, 
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
3710: 72 73 69 6f 6e 20 20 20 20 20 20 2a 2f 0a 20 20  rsion      */.  
3720: 20 20 20 66 74 73 33 61 75 78 43 6f 6e 6e 65 63     fts3auxConnec
3730: 74 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20  tMethod,        
3740: 2f 2a 20 78 43 72 65 61 74 65 20 20 20 20 20 20  /* xCreate      
3750: 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 61 75 78   */.     fts3aux
3760: 43 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 20 20  ConnectMethod,  
3770: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63        /* xConnec
3780: 74 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66  t      */.     f
3790: 74 73 33 61 75 78 42 65 73 74 49 6e 64 65 78 4d  ts3auxBestIndexM
37a0: 65 74 68 6f 64 2c 20 20 20 20 20 20 2f 2a 20 78  ethod,      /* x
37b0: 42 65 73 74 49 6e 64 65 78 20 20 20 20 2a 2f 0a  BestIndex    */.
37c0: 20 20 20 20 20 66 74 73 33 61 75 78 44 69 73 63       fts3auxDisc
37d0: 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 20 20 20  onnectMethod,   
37e0: 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
37f0: 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 61     */.     fts3a
3800: 75 78 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68  uxDisconnectMeth
3810: 6f 64 2c 20 20 20 20 20 2f 2a 20 78 44 65 73 74  od,     /* xDest
3820: 72 6f 79 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  roy      */.    
3830: 20 66 74 73 33 61 75 78 4f 70 65 6e 4d 65 74 68   fts3auxOpenMeth
3840: 6f 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  od,           /*
3850: 20 78 4f 70 65 6e 20 20 20 20 20 20 20 20 20 2a   xOpen         *
3860: 2f 0a 20 20 20 20 20 66 74 73 33 61 75 78 43 6c  /.     fts3auxCl
3870: 6f 73 65 4d 65 74 68 6f 64 2c 20 20 20 20 20 20  oseMethod,      
3880: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20      /* xClose   
3890: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73       */.     fts
38a0: 33 61 75 78 46 69 6c 74 65 72 4d 65 74 68 6f 64  3auxFilterMethod
38b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69  ,         /* xFi
38c0: 6c 74 65 72 20 20 20 20 20 20 20 2a 2f 0a 20 20  lter       */.  
38d0: 20 20 20 66 74 73 33 61 75 78 4e 65 78 74 4d 65     fts3auxNextMe
38e0: 74 68 6f 64 2c 20 20 20 20 20 20 20 20 20 20 20  thod,           
38f0: 2f 2a 20 78 4e 65 78 74 20 20 20 20 20 20 20 20  /* xNext        
3900: 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 61 75 78   */.     fts3aux
3910: 45 6f 66 4d 65 74 68 6f 64 2c 20 20 20 20 20 20  EofMethod,      
3920: 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 20 20        /* xEof   
3930: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66         */.     f
3940: 74 73 33 61 75 78 43 6f 6c 75 6d 6e 4d 65 74 68  ts3auxColumnMeth
3950: 6f 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  od,         /* x
3960: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 2a 2f 0a  Column       */.
3970: 20 20 20 20 20 66 74 73 33 61 75 78 52 6f 77 69       fts3auxRowi
3980: 64 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20  dMethod,        
3990: 20 20 2f 2a 20 78 52 6f 77 69 64 20 20 20 20 20    /* xRowid     
39a0: 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20     */.     0,   
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
39d0: 74 65 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  te       */.    
39e0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a00: 20 78 42 65 67 69 6e 20 20 20 20 20 20 20 20 2a   xBegin        *
3a10: 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  /.     0,       
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 20 20 20      /* xSync    
3a40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20       */.     0, 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
3a70: 6d 6d 69 74 20 20 20 20 20 20 20 2a 2f 0a 20 20  mmit       */.  
3a80: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 20 20 20  /* xRollback    
3ab0: 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20   */.     0,     
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ad0: 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75        /* xFindFu
3ae0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 30  nction */.     0
3af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
3b10: 52 65 6e 61 6d 65 20 20 20 20 20 20 20 2a 2f 0a  Rename       */.
3b20: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20    /* xSavepoint 
3b50: 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20     */.     0,   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65          /* xRele
3b80: 61 73 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ase      */.    
3b90: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3bb0: 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 20 20 2a   xRollbackTo   *
3bc0: 2f 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63 3b  /.  };.  int rc;
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
3bf0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63  rn code */..  rc
3c00: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
3c10: 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 66 74  e_module(db, "ft
3c20: 73 34 61 75 78 22 2c 20 26 66 74 73 33 61 75 78  s4aux", &fts3aux
3c30: 5f 6d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 72  _module, 0);.  r
3c40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
3c50: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
3c60: 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
3c70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
3c80: 4e 41 42 4c 45 5f 46 54 53 33 29 20 2a 2f 0a     NABLE_FTS3) */.