/ Hex Artifact Content
Login

Artifact 9e931f55eed8498dafe7bc1160f10cbb1a652fdf:


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 0a 23 69 6e 63 6c 75 64 65 20  FTS3)..#include 
01c0: 22 66 74 73 33 49 6e 74 2e 68 22 0a 23 69 6e 63  "fts3Int.h".#inc
01d0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
01e0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
01f0: 2e 68 3e 0a 0a 74 79 70 65 64 65 66 20 73 74 72  .h>..typedef str
0200: 75 63 74 20 46 74 73 33 61 75 78 54 61 62 6c 65  uct Fts3auxTable
0210: 20 46 74 73 33 61 75 78 54 61 62 6c 65 3b 0a 74   Fts3auxTable;.t
0220: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
0230: 73 33 61 75 78 43 75 72 73 6f 72 20 46 74 73 33  s3auxCursor Fts3
0240: 61 75 78 43 75 72 73 6f 72 3b 0a 0a 73 74 72 75  auxCursor;..stru
0250: 63 74 20 46 74 73 33 61 75 78 54 61 62 6c 65 20  ct Fts3auxTable 
0260: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
0270: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
0280: 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73      /* Base clas
0290: 73 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  s used by SQLite
02a0: 20 63 6f 72 65 20 2a 2f 0a 20 20 46 74 73 33 54   core */.  Fts3T
02b0: 61 62 6c 65 20 2a 70 46 74 73 33 54 61 62 3b 0a  able *pFts3Tab;.
02c0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 33 61  };..struct Fts3a
02d0: 75 78 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  uxCursor {.  sql
02e0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
02f0: 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20   base;       /* 
0300: 42 61 73 65 20 63 6c 61 73 73 20 75 73 65 64 20  Base class used 
0310: 62 79 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  by SQLite core *
0320: 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65  /.  Fts3SegReade
0330: 72 43 75 72 73 6f 72 20 63 73 72 3b 20 20 20 20  rCursor csr;    
0340: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 72      /* Must be r
0350: 69 67 68 74 20 61 66 74 65 72 20 22 62 61 73 65  ight after "base
0360: 22 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69  " */.  Fts3SegFi
0370: 6c 74 65 72 20 66 69 6c 74 65 72 3b 0a 20 20 63  lter filter;.  c
0380: 68 61 72 20 2a 7a 53 74 6f 70 3b 0a 20 20 69 6e  har *zStop;.  in
0390: 74 20 6e 53 74 6f 70 3b 20 20 20 20 20 20 20 20  t nStop;        
03a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03b0: 20 42 79 74 65 2d 6c 65 6e 67 74 68 20 6f 66 20   Byte-length of 
03c0: 73 74 72 69 6e 67 20 7a 53 74 6f 70 20 2a 2f 0a  string zStop */.
03d0: 20 20 69 6e 74 20 69 73 45 6f 66 3b 20 20 20 20    int isEof;    
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 75 72    /* True if cur
0400: 73 6f 72 20 69 73 20 61 74 20 45 4f 46 20 2a 2f  sor is at EOF */
0410: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
0420: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
0430: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
0440: 77 69 64 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43  wid */..  int iC
0450: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
0470: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 27 63  rent value of 'c
0480: 6f 6c 27 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ol' column */.  
0490: 69 6e 74 20 6e 53 74 61 74 3b 20 20 20 20 20 20  int nStat;      
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 74 61 74  /* Size of aStat
04c0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 74  [] array */.  st
04d0: 72 75 63 74 20 46 74 73 33 61 75 78 43 6f 6c 73  ruct Fts3auxCols
04e0: 74 61 74 73 20 7b 0a 20 20 20 20 73 71 6c 69 74  tats {.    sqlit
04f0: 65 33 5f 69 6e 74 36 34 20 6e 44 6f 63 3b 20 20  e3_int64 nDoc;  
0500: 20 20 20 20 20 20 20 20 20 2f 2a 20 27 64 6f 63           /* 'doc
0510: 75 6d 65 6e 74 73 27 20 76 61 6c 75 65 73 20 66  uments' values f
0520: 6f 72 20 63 75 72 72 65 6e 74 20 63 73 72 20 72  or current csr r
0530: 6f 77 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ow */.    sqlite
0540: 33 5f 69 6e 74 36 34 20 6e 4f 63 63 3b 20 20 20  3_int64 nOcc;   
0550: 20 20 20 20 20 20 20 20 2f 2a 20 27 6f 63 63 75          /* 'occu
0560: 72 72 65 6e 63 65 73 27 20 76 61 6c 75 65 73 20  rrences' values 
0570: 66 6f 72 20 63 75 72 72 65 6e 74 20 63 73 72 20  for current csr 
0580: 72 6f 77 20 2a 2f 0a 20 20 7d 20 2a 61 53 74 61  row */.  } *aSta
0590: 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 68  t;.};../*.** Sch
05a0: 65 6d 61 20 6f 66 20 74 68 65 20 74 65 72 6d 73  ema of the terms
05b0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69   table..*/.#defi
05c0: 6e 65 20 46 54 53 33 5f 54 45 52 4d 53 5f 53 43  ne FTS3_TERMS_SC
05d0: 48 45 4d 41 20 22 43 52 45 41 54 45 20 54 41 42  HEMA "CREATE TAB
05e0: 4c 45 20 78 28 74 65 72 6d 2c 20 63 6f 6c 2c 20  LE x(term, col, 
05f0: 64 6f 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72  documents, occur
0600: 72 65 6e 63 65 73 29 22 0a 0a 2f 2a 0a 2a 2a 20  rences)"../*.** 
0610: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
0620: 65 73 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  es all the work 
0630: 66 6f 72 20 62 6f 74 68 20 74 68 65 20 78 43 6f  for both the xCo
0640: 6e 6e 65 63 74 20 61 6e 64 20 78 43 72 65 61 74  nnect and xCreat
0650: 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 20 54 68  e methods..** Th
0660: 65 73 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  ese tables have 
0670: 6e 6f 20 70 65 72 73 69 73 74 65 6e 74 20 72 65  no persistent re
0680: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
0690: 74 68 65 69 72 20 6f 77 6e 2c 20 73 6f 20 78 43  their own, so xC
06a0: 6f 6e 6e 65 63 74 0a 2a 2a 20 61 6e 64 20 78 43  onnect.** and xC
06b0: 72 65 61 74 65 20 61 72 65 20 69 64 65 6e 74 69  reate are identi
06c0: 63 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  cal operations..
06d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
06e0: 73 33 61 75 78 43 6f 6e 6e 65 63 74 4d 65 74 68  s3auxConnectMeth
06f0: 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  od(.  sqlite3 *d
0700: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
0710: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
0720: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
0730: 20 20 76 6f 69 64 20 2a 70 55 6e 75 73 65 64 2c    void *pUnused,
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20    /* Unused */. 
0760: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
0790: 65 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61  ements in argv a
07a0: 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rray */.  const 
07b0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72  char * const *ar
07c0: 67 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72  gv,       /* xCr
07d0: 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72  eate/xConnect ar
07e0: 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a  gument array */.
07f0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
0800: 2a 70 70 56 74 61 62 2c 20 20 20 20 20 20 20 20  *ppVtab,        
0810: 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71    /* OUT: New sq
0820: 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63  lite3_vtab objec
0830: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t */.  char **pz
0840: 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
0850: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
0860: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20  qlite3_malloc'd 
0870: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  error message */
0880: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
0890: 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
08a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
08b0: 20 64 61 74 61 62 61 73 65 20 28 65 2e 67 2e 20   database (e.g. 
08c0: 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 63 68 61  "main") */.  cha
08d0: 72 20 63 6f 6e 73 74 20 2a 7a 46 74 73 33 3b 20  r const *zFts3; 
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
08f0: 4e 61 6d 65 20 6f 66 20 66 74 73 33 20 74 61 62  Name of fts3 tab
0900: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 62 3b  le */.  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 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
0930: 74 20 6f 66 20 73 74 72 6c 65 6e 28 7a 44 62 29  t of strlen(zDb)
0940: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 74 73 33 3b   */.  int nFts3;
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
0970: 6f 66 20 73 74 72 6c 65 6e 28 7a 46 74 73 33 29  of strlen(zFts3)
0980: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
09b0: 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
09c0: 61 74 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ate here */.  in
09d0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
09f0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
0a00: 62 79 20 64 65 63 6c 61 72 65 5f 76 74 61 62 28  by declare_vtab(
0a10: 29 20 2a 2f 0a 20 20 46 74 73 33 61 75 78 54 61  ) */.  Fts3auxTa
0a20: 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ble *p;         
0a30: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
0a40: 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74  l table object t
0a50: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 55  o return */..  U
0a60: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0a70: 70 55 6e 75 73 65 64 29 3b 0a 0a 20 20 2f 2a 20  pUnused);..  /* 
0a80: 54 68 65 20 75 73 65 72 20 73 68 6f 75 6c 64 20  The user should 
0a90: 73 70 65 63 69 66 79 20 61 20 73 69 6e 67 6c 65  specify a single
0aa0: 20 61 72 67 75 6d 65 6e 74 20 2d 20 74 68 65 20   argument - the 
0ab0: 6e 61 6d 65 20 6f 66 20 61 6e 20 66 74 73 33 20  name of an fts3 
0ac0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20  table. */.  if( 
0ad0: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 2a  argc!=4 ){.    *
0ae0: 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
0af0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
0b00: 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
0b10: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
0b20: 74 73 34 61 75 78 20 63 6f 6e 73 74 72 75 63 74  ts4aux construct
0b30: 6f 72 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  or".    );.    r
0b40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
0b50: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44 62 20 3d  OR;.  }..  zDb =
0b60: 20 61 72 67 76 5b 31 5d 3b 20 0a 20 20 6e 44 62   argv[1]; .  nDb
0b70: 20 3d 20 73 74 72 6c 65 6e 28 7a 44 62 29 3b 0a   = strlen(zDb);.
0b80: 20 20 7a 46 74 73 33 20 3d 20 61 72 67 76 5b 33    zFts3 = argv[3
0b90: 5d 3b 0a 20 20 6e 46 74 73 33 20 3d 20 73 74 72  ];.  nFts3 = str
0ba0: 6c 65 6e 28 7a 46 74 73 33 29 3b 0a 0a 20 20 72  len(zFts3);..  r
0bb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
0bc0: 61 72 65 5f 76 74 61 62 28 64 62 2c 20 46 54 53  are_vtab(db, FTS
0bd0: 33 5f 54 45 52 4d 53 5f 53 43 48 45 4d 41 29 3b  3_TERMS_SCHEMA);
0be0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
0bf0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
0c00: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  ;..  nByte = siz
0c10: 65 6f 66 28 46 74 73 33 61 75 78 54 61 62 6c 65  eof(Fts3auxTable
0c20: 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 54  ) + sizeof(Fts3T
0c30: 61 62 6c 65 29 20 2b 20 6e 44 62 20 2b 20 6e 46  able) + nDb + nF
0c40: 74 73 33 20 2b 20 32 3b 0a 20 20 70 20 3d 20 28  ts3 + 2;.  p = (
0c50: 46 74 73 33 61 75 78 54 61 62 6c 65 20 2a 29 73  Fts3auxTable *)s
0c60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
0c70: 79 74 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29  yte);.  if( !p )
0c80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
0c90: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
0ca0: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  , 0, nByte);..  
0cb0: 70 2d 3e 70 46 74 73 33 54 61 62 20 3d 20 28 46  p->pFts3Tab = (F
0cc0: 74 73 33 54 61 62 6c 65 20 2a 29 26 70 5b 31 5d  ts3Table *)&p[1]
0cd0: 3b 0a 20 20 70 2d 3e 70 46 74 73 33 54 61 62 2d  ;.  p->pFts3Tab-
0ce0: 3e 7a 44 62 20 3d 20 28 63 68 61 72 20 2a 29 26  >zDb = (char *)&
0cf0: 70 2d 3e 70 46 74 73 33 54 61 62 5b 31 5d 3b 0a  p->pFts3Tab[1];.
0d00: 20 20 70 2d 3e 70 46 74 73 33 54 61 62 2d 3e 7a    p->pFts3Tab->z
0d10: 4e 61 6d 65 20 3d 20 26 70 2d 3e 70 46 74 73 33  Name = &p->pFts3
0d20: 54 61 62 2d 3e 7a 44 62 5b 6e 44 62 2b 31 5d 3b  Tab->zDb[nDb+1];
0d30: 0a 20 20 70 2d 3e 70 46 74 73 33 54 61 62 2d 3e  .  p->pFts3Tab->
0d40: 64 62 20 3d 20 64 62 3b 0a 0a 20 20 6d 65 6d 63  db = db;..  memc
0d50: 70 79 28 28 63 68 61 72 20 2a 29 70 2d 3e 70 46  py((char *)p->pF
0d60: 74 73 33 54 61 62 2d 3e 7a 44 62 2c 20 7a 44 62  ts3Tab->zDb, zDb
0d70: 2c 20 6e 44 62 29 3b 0a 20 20 6d 65 6d 63 70 79  , nDb);.  memcpy
0d80: 28 28 63 68 61 72 20 2a 29 70 2d 3e 70 46 74 73  ((char *)p->pFts
0d90: 33 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 74  3Tab->zName, zFt
0da0: 73 33 2c 20 6e 46 74 73 33 29 3b 0a 20 20 73 71  s3, nFts3);.  sq
0db0: 6c 69 74 65 33 46 74 73 33 44 65 71 75 6f 74 65  lite3Fts3Dequote
0dc0: 28 28 63 68 61 72 20 2a 29 70 2d 3e 70 46 74 73  ((char *)p->pFts
0dd0: 33 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  3Tab->zName);.. 
0de0: 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69   *ppVtab = (sqli
0df0: 74 65 33 5f 76 74 61 62 20 2a 29 70 3b 0a 20 20  te3_vtab *)p;.  
0e00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0e20: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
0e30: 65 20 77 6f 72 6b 20 66 6f 72 20 62 6f 74 68 20  e work for both 
0e40: 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  the xDisconnect 
0e50: 61 6e 64 20 78 44 65 73 74 72 6f 79 20 6d 65 74  and xDestroy met
0e60: 68 6f 64 73 2e 0a 2a 2a 20 54 68 65 73 65 20 74  hods..** These t
0e70: 61 62 6c 65 73 20 68 61 76 65 20 6e 6f 20 70 65  ables have no pe
0e80: 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  rsistent represe
0e90: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 69 72  ntation of their
0ea0: 20 6f 77 6e 2c 20 73 6f 20 78 44 69 73 63 6f 6e   own, so xDiscon
0eb0: 6e 65 63 74 0a 2a 2a 20 61 6e 64 20 78 44 65 73  nect.** and xDes
0ec0: 74 72 6f 79 20 61 72 65 20 69 64 65 6e 74 69 63  troy are identic
0ed0: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  al operations..*
0ee0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
0ef0: 33 61 75 78 44 69 73 63 6f 6e 6e 65 63 74 4d 65  3auxDisconnectMe
0f00: 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
0f10: 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 46 74 73  b *pVtab){.  Fts
0f20: 33 61 75 78 54 61 62 6c 65 20 2a 70 20 3d 20 28  3auxTable *p = (
0f30: 46 74 73 33 61 75 78 54 61 62 6c 65 20 2a 29 70  Fts3auxTable *)p
0f40: 56 74 61 62 3b 0a 20 20 46 74 73 33 54 61 62 6c  Vtab;.  Fts3Tabl
0f50: 65 20 2a 70 46 74 73 33 20 3d 20 70 2d 3e 70 46  e *pFts3 = p->pF
0f60: 74 73 33 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b  ts3Tab;.  int i;
0f70: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
0f80: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0f90: 6e 74 73 20 68 65 6c 64 20 2a 2f 0a 20 20 66 6f  nts held */.  fo
0fa0: 72 28 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41  r(i=0; i<SizeofA
0fb0: 72 72 61 79 28 70 46 74 73 33 2d 3e 61 53 74 6d  rray(pFts3->aStm
0fc0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t); i++){.    sq
0fd0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
0fe0: 46 74 73 33 2d 3e 61 53 74 6d 74 5b 69 5d 29 3b  Fts3->aStmt[i]);
0ff0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1000: 72 65 65 28 70 46 74 73 33 2d 3e 7a 53 65 67 6d  ree(pFts3->zSegm
1010: 65 6e 74 73 54 62 6c 29 3b 0a 20 20 73 71 6c 69  entsTbl);.  sqli
1020: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
1030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1040: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 34  .}..#define FTS4
1050: 41 55 58 5f 45 51 5f 43 4f 4e 53 54 52 41 49 4e  AUX_EQ_CONSTRAIN
1060: 54 20 31 0a 23 64 65 66 69 6e 65 20 46 54 53 34  T 1.#define FTS4
1070: 41 55 58 5f 47 45 5f 43 4f 4e 53 54 52 41 49 4e  AUX_GE_CONSTRAIN
1080: 54 20 32 0a 23 64 65 66 69 6e 65 20 46 54 53 34  T 2.#define FTS4
1090: 41 55 58 5f 4c 45 5f 43 4f 4e 53 54 52 41 49 4e  AUX_LE_CONSTRAIN
10a0: 54 20 34 0a 0a 2f 2a 0a 2a 2a 20 78 42 65 73 74  T 4../*.** xBest
10b0: 49 6e 64 65 78 20 2d 20 41 6e 61 6c 79 7a 65 20  Index - Analyze 
10c0: 61 20 57 48 45 52 45 20 61 6e 64 20 4f 52 44 45  a WHERE and ORDE
10d0: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
10e0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61  static int fts3a
10f0: 75 78 42 65 73 74 49 6e 64 65 78 4d 65 74 68 6f  uxBestIndexMetho
1100: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  d(.  sqlite3_vta
1110: 62 20 2a 70 56 54 61 62 2c 20 0a 20 20 73 71 6c  b *pVTab, .  sql
1120: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1130: 2a 70 49 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74 20  *pInfo.){.  int 
1140: 69 3b 0a 20 20 69 6e 74 20 69 45 71 20 3d 20 2d  i;.  int iEq = -
1150: 31 3b 0a 20 20 69 6e 74 20 69 47 65 20 3d 20 2d  1;.  int iGe = -
1160: 31 3b 0a 20 20 69 6e 74 20 69 4c 65 20 3d 20 2d  1;.  int iLe = -
1170: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
1180: 41 4d 45 54 45 52 28 70 56 54 61 62 29 3b 0a 0a  AMETER(pVTab);..
1190: 20 20 2f 2a 20 54 68 69 73 20 76 74 61 62 20 64    /* This vtab d
11a0: 65 6c 69 76 65 72 73 20 61 6c 77 61 79 73 20 72  elivers always r
11b0: 65 73 75 6c 74 73 20 69 6e 20 22 4f 52 44 45 52  esults in "ORDER
11c0: 20 42 59 20 74 65 72 6d 20 41 53 43 22 20 6f 72   BY term ASC" or
11d0: 64 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49  der. */.  if( pI
11e0: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d 31  nfo->nOrderBy==1
11f0: 20 0a 20 20 20 26 26 20 70 49 6e 66 6f 2d 3e 61   .   && pInfo->a
1200: 4f 72 64 65 72 42 79 5b 30 5d 2e 69 43 6f 6c 75  OrderBy[0].iColu
1210: 6d 6e 3d 3d 30 20 0a 20 20 20 26 26 20 70 49 6e  mn==0 .   && pIn
1220: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e  fo->aOrderBy[0].
1230: 64 65 73 63 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  desc==0.  ){.   
1240: 20 70 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43   pInfo->orderByC
1250: 6f 6e 73 75 6d 65 64 20 3d 20 31 3b 0a 20 20 7d  onsumed = 1;.  }
1260: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
1270: 72 20 65 71 75 61 6c 69 74 79 20 61 6e 64 20 72  r equality and r
1280: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1290: 20 6f 6e 20 74 68 65 20 22 74 65 72 6d 22 20 63   on the "term" c
12a0: 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  olumn. */.  for(
12b0: 69 3d 30 3b 20 69 3c 70 49 6e 66 6f 2d 3e 6e 43  i=0; i<pInfo->nC
12c0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
12d0: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
12e0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
12f0: 73 61 62 6c 65 20 26 26 20 70 49 6e 66 6f 2d 3e  sable && pInfo->
1300: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
1310: 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
1320: 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 49 6e 66     int op = pInf
1330: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  o->aConstraint[i
1340: 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20  ].op;.      if( 
1350: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
1360: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
1370: 20 69 45 71 20 3d 20 69 3b 0a 20 20 20 20 20 20   iEq = i;.      
1380: 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  if( op==SQLITE_I
1390: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
13a0: 4c 54 20 29 20 69 4c 65 20 3d 20 69 3b 0a 20 20  LT ) iLe = i;.  
13b0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
13c0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
13d0: 49 4e 54 5f 4c 45 20 29 20 69 4c 65 20 3d 20 69  INT_LE ) iLe = i
13e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
13f0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
1400: 53 54 52 41 49 4e 54 5f 47 54 20 29 20 69 47 65  STRAINT_GT ) iGe
1410: 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
1420: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
1430: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
1440: 20 69 47 65 20 3d 20 69 3b 0a 20 20 20 20 7d 0a   iGe = i;.    }.
1450: 20 20 7d 0a 0a 20 20 69 66 28 20 69 45 71 3e 3d    }..  if( iEq>=
1460: 30 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  0 ){.    pInfo->
1470: 69 64 78 4e 75 6d 20 3d 20 46 54 53 34 41 55 58  idxNum = FTS4AUX
1480: 5f 45 51 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  _EQ_CONSTRAINT;.
1490: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73      pInfo->aCons
14a0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 45 71 5d  traintUsage[iEq]
14b0: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a  .argvIndex = 1;.
14c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d      pInfo->estim
14d0: 61 74 65 64 43 6f 73 74 20 3d 20 35 3b 0a 20 20  atedCost = 5;.  
14e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
14f0: 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
1500: 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74    pInfo->estimat
1510: 65 64 43 6f 73 74 20 3d 20 32 30 30 30 30 3b 0a  edCost = 20000;.
1520: 20 20 20 20 69 66 28 20 69 47 65 3e 3d 30 20 29      if( iGe>=0 )
1530: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69  {.      pInfo->i
1540: 64 78 4e 75 6d 20 2b 3d 20 46 54 53 34 41 55 58  dxNum += FTS4AUX
1550: 5f 47 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  _GE_CONSTRAINT;.
1560: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
1570: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 47  nstraintUsage[iG
1580: 65 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31  e].argvIndex = 1
1590: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 65  ;.      pInfo->e
15a0: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 2f 3d 20  stimatedCost /= 
15b0: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  2;.    }.    if(
15c0: 20 69 4c 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20   iLe>=0 ){.     
15d0: 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 2b   pInfo->idxNum +
15e0: 3d 20 46 54 53 34 41 55 58 5f 4c 45 5f 43 4f 4e  = FTS4AUX_LE_CON
15f0: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 70  STRAINT;.      p
1600: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1610: 74 55 73 61 67 65 5b 69 4c 65 5d 2e 61 72 67 76  tUsage[iLe].argv
1620: 49 6e 64 65 78 20 3d 20 31 20 2b 20 28 69 47 65  Index = 1 + (iGe
1630: 3e 3d 30 29 3b 0a 20 20 20 20 20 20 70 49 6e 66  >=0);.      pInf
1640: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1650: 20 2f 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   /= 2;.    }.  }
1660: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1670: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  E_OK;.}../*.** x
1680: 4f 70 65 6e 20 2d 20 4f 70 65 6e 20 61 20 63 75  Open - Open a cu
1690: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
16a0: 69 6e 74 20 66 74 73 33 61 75 78 4f 70 65 6e 4d  int fts3auxOpenM
16b0: 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74  ethod(sqlite3_vt
16c0: 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74  ab *pVTab, sqlit
16d0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
16e0: 2a 70 70 43 73 72 29 7b 0a 20 20 46 74 73 33 61  *ppCsr){.  Fts3a
16f0: 75 78 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 20  uxCursor *pCsr; 
1700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1710: 69 6e 74 65 72 20 74 6f 20 63 75 72 73 6f 72 20  inter to cursor 
1720: 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e  object to return
1730: 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   */..  UNUSED_PA
1740: 52 41 4d 45 54 45 52 28 70 56 54 61 62 29 3b 0a  RAMETER(pVTab);.
1750: 0a 20 20 70 43 73 72 20 3d 20 28 46 74 73 33 61  .  pCsr = (Fts3a
1760: 75 78 43 75 72 73 6f 72 20 2a 29 73 71 6c 69 74  uxCursor *)sqlit
1770: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
1780: 28 46 74 73 33 61 75 78 43 75 72 73 6f 72 29 29  (Fts3auxCursor))
1790: 3b 0a 20 20 69 66 28 20 21 70 43 73 72 20 29 20  ;.  if( !pCsr ) 
17a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
17b0: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  MEM;.  memset(pC
17c0: 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  sr, 0, sizeof(Ft
17d0: 73 33 61 75 78 43 75 72 73 6f 72 29 29 3b 0a 0a  s3auxCursor));..
17e0: 20 20 2a 70 70 43 73 72 20 3d 20 28 73 71 6c 69    *ppCsr = (sqli
17f0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
1800: 2a 29 70 43 73 72 3b 0a 20 20 72 65 74 75 72 6e  *)pCsr;.  return
1810: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1820: 2a 0a 2a 2a 20 78 43 6c 6f 73 65 20 2d 20 43 6c  *.** xClose - Cl
1830: 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  ose a cursor..*/
1840: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1850: 61 75 78 43 6c 6f 73 65 4d 65 74 68 6f 64 28 73  auxCloseMethod(s
1860: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
1870: 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20  or *pCursor){.  
1880: 46 74 73 33 54 61 62 6c 65 20 2a 70 46 74 73 33  Fts3Table *pFts3
1890: 20 3d 20 28 28 46 74 73 33 61 75 78 54 61 62 6c   = ((Fts3auxTabl
18a0: 65 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74  e *)pCursor->pVt
18b0: 61 62 29 2d 3e 70 46 74 73 33 54 61 62 3b 0a 20  ab)->pFts3Tab;. 
18c0: 20 46 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a   Fts3auxCursor *
18d0: 70 43 73 72 20 3d 20 28 46 74 73 33 61 75 78 43  pCsr = (Fts3auxC
18e0: 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b  ursor *)pCursor;
18f0: 0a 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  ..  sqlite3Fts3S
1900: 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 46 74  egmentsClose(pFt
1910: 73 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  s3);.  sqlite3Ft
1920: 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73  s3SegReaderFinis
1930: 68 28 26 70 43 73 72 2d 3e 63 73 72 29 3b 0a 20  h(&pCsr->csr);. 
1940: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
1950: 6f 69 64 20 2a 29 70 43 73 72 2d 3e 66 69 6c 74  oid *)pCsr->filt
1960: 65 72 2e 7a 54 65 72 6d 29 3b 0a 20 20 73 71 6c  er.zTerm);.  sql
1970: 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
1980: 7a 53 74 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  zStop);.  sqlite
1990: 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 53 74  3_free(pCsr->aSt
19a0: 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  at);.  sqlite3_f
19b0: 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74  ree(pCsr);.  ret
19c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
19e0: 33 61 75 78 47 72 6f 77 53 74 61 74 41 72 72 61  3auxGrowStatArra
19f0: 79 28 46 74 73 33 61 75 78 43 75 72 73 6f 72 20  y(Fts3auxCursor 
1a00: 2a 70 43 73 72 2c 20 69 6e 74 20 6e 53 69 7a 65  *pCsr, int nSize
1a10: 29 7b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  ){.  if( nSize>p
1a20: 43 73 72 2d 3e 6e 53 74 61 74 20 29 7b 0a 20 20  Csr->nStat ){.  
1a30: 20 20 73 74 72 75 63 74 20 46 74 73 33 61 75 78    struct Fts3aux
1a40: 43 6f 6c 73 74 61 74 73 20 2a 61 4e 65 77 3b 0a  Colstats *aNew;.
1a50: 20 20 20 20 61 4e 65 77 20 3d 20 28 73 74 72 75      aNew = (stru
1a60: 63 74 20 46 74 73 33 61 75 78 43 6f 6c 73 74 61  ct Fts3auxColsta
1a70: 74 73 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ts *)sqlite3_rea
1a80: 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 53 74 61 74  lloc(pCsr->aStat
1a90: 2c 20 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f  , .        sizeo
1aa0: 66 28 73 74 72 75 63 74 20 46 74 73 33 61 75 78  f(struct Fts3aux
1ab0: 43 6f 6c 73 74 61 74 73 29 20 2a 20 6e 53 69 7a  Colstats) * nSiz
1ac0: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
1ad0: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
1ae0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1af0: 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
1b00: 5b 70 43 73 72 2d 3e 6e 53 74 61 74 5d 2c 20 30  [pCsr->nStat], 0
1b10: 2c 20 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f  , .        sizeo
1b20: 66 28 73 74 72 75 63 74 20 46 74 73 33 61 75 78  f(struct Fts3aux
1b30: 43 6f 6c 73 74 61 74 73 29 20 2a 20 28 6e 53 69  Colstats) * (nSi
1b40: 7a 65 20 2d 20 70 43 73 72 2d 3e 6e 53 74 61 74  ze - pCsr->nStat
1b50: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 43 73  ).    );.    pCs
1b60: 72 2d 3e 61 53 74 61 74 20 3d 20 61 4e 65 77 3b  r->aStat = aNew;
1b70: 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 74 61 74  .    pCsr->nStat
1b80: 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 0a 20 20   = nSize;.  }.  
1b90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ba0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 4e 65 78 74  ;.}../*.** xNext
1bb0: 20 2d 20 41 64 76 61 6e 63 65 20 74 68 65 20 63   - Advance the c
1bc0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
1bd0: 74 20 72 6f 77 2c 20 69 66 20 61 6e 79 2e 0a 2a  t row, if any..*
1be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1bf0: 33 61 75 78 4e 65 78 74 4d 65 74 68 6f 64 28 73  3auxNextMethod(s
1c00: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
1c10: 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20  or *pCursor){.  
1c20: 46 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a 70  Fts3auxCursor *p
1c30: 43 73 72 20 3d 20 28 46 74 73 33 61 75 78 43 75  Csr = (Fts3auxCu
1c40: 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a  rsor *)pCursor;.
1c50: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 46 74    Fts3Table *pFt
1c60: 73 33 20 3d 20 28 28 46 74 73 33 61 75 78 54 61  s3 = ((Fts3auxTa
1c70: 62 6c 65 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70  ble *)pCursor->p
1c80: 56 74 61 62 29 2d 3e 70 46 74 73 33 54 61 62 3b  Vtab)->pFts3Tab;
1c90: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1ca0: 20 49 6e 63 72 65 6d 65 6e 74 20 6f 75 72 20 70   Increment our p
1cb0: 72 65 74 65 6e 64 20 72 6f 77 69 64 20 76 61 6c  retend rowid val
1cc0: 75 65 2e 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69  ue. */.  pCsr->i
1cd0: 52 6f 77 69 64 2b 2b 3b 0a 0a 20 20 66 6f 72 28  Rowid++;..  for(
1ce0: 70 43 73 72 2d 3e 69 43 6f 6c 2b 2b 3b 20 70 43  pCsr->iCol++; pC
1cf0: 73 72 2d 3e 69 43 6f 6c 3c 70 43 73 72 2d 3e 6e  sr->iCol<pCsr->n
1d00: 53 74 61 74 3b 20 70 43 73 72 2d 3e 69 43 6f 6c  Stat; pCsr->iCol
1d10: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 73  ++){.    if( pCs
1d20: 72 2d 3e 61 53 74 61 74 5b 70 43 73 72 2d 3e 69  r->aStat[pCsr->i
1d30: 43 6f 6c 5d 2e 6e 44 6f 63 3e 30 20 29 20 72 65  Col].nDoc>0 ) re
1d40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d50: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
1d60: 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
1d70: 53 74 65 70 28 70 46 74 73 33 2c 20 26 70 43 73  Step(pFts3, &pCs
1d80: 72 2d 3e 63 73 72 29 3b 0a 20 20 69 66 28 20 72  r->csr);.  if( r
1d90: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
1da0: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
1db0: 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74      int nDoclist
1dc0: 20 3d 20 70 43 73 72 2d 3e 63 73 72 2e 6e 44 6f   = pCsr->csr.nDo
1dd0: 63 6c 69 73 74 3b 0a 20 20 20 20 63 68 61 72 20  clist;.    char 
1de0: 2a 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72  *aDoclist = pCsr
1df0: 2d 3e 63 73 72 2e 61 44 6f 63 6c 69 73 74 3b 0a  ->csr.aDoclist;.
1e00: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20      int iCol;.. 
1e10: 20 20 20 69 6e 74 20 65 53 74 61 74 65 20 3d 20     int eState = 
1e20: 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 73 72  0;..    if( pCsr
1e30: 2d 3e 7a 53 74 6f 70 20 29 7b 0a 20 20 20 20 20  ->zStop ){.     
1e40: 20 69 6e 74 20 6e 20 3d 20 28 70 43 73 72 2d 3e   int n = (pCsr->
1e50: 6e 53 74 6f 70 3c 70 43 73 72 2d 3e 63 73 72 2e  nStop<pCsr->csr.
1e60: 6e 54 65 72 6d 29 20 3f 20 70 43 73 72 2d 3e 6e  nTerm) ? pCsr->n
1e70: 53 74 6f 70 20 3a 20 70 43 73 72 2d 3e 63 73 72  Stop : pCsr->csr
1e80: 2e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  .nTerm;.      in
1e90: 74 20 6d 63 20 3d 20 6d 65 6d 63 6d 70 28 70 43  t mc = memcmp(pC
1ea0: 73 72 2d 3e 7a 53 74 6f 70 2c 20 70 43 73 72 2d  sr->zStop, pCsr-
1eb0: 3e 63 73 72 2e 7a 54 65 72 6d 2c 20 6e 29 3b 0a  >csr.zTerm, n);.
1ec0: 20 20 20 20 20 20 69 66 28 20 6d 63 3c 30 20 7c        if( mc<0 |
1ed0: 7c 20 28 6d 63 3d 3d 30 20 26 26 20 70 43 73 72  | (mc==0 && pCsr
1ee0: 2d 3e 63 73 72 2e 6e 54 65 72 6d 3e 70 43 73 72  ->csr.nTerm>pCsr
1ef0: 2d 3e 6e 53 74 6f 70 29 20 29 7b 0a 20 20 20 20  ->nStop) ){.    
1f00: 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20      pCsr->isEof 
1f10: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
1f20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f40: 20 20 69 66 28 20 66 74 73 33 61 75 78 47 72 6f    if( fts3auxGro
1f50: 77 53 74 61 74 41 72 72 61 79 28 70 43 73 72 2c  wStatArray(pCsr,
1f60: 20 32 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c   2) ) return SQL
1f70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d  ITE_NOMEM;.    m
1f80: 65 6d 73 65 74 28 70 43 73 72 2d 3e 61 53 74 61  emset(pCsr->aSta
1f90: 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74 72  t, 0, sizeof(str
1fa0: 75 63 74 20 46 74 73 33 61 75 78 43 6f 6c 73 74  uct Fts3auxColst
1fb0: 61 74 73 29 20 2a 20 70 43 73 72 2d 3e 6e 53 74  ats) * pCsr->nSt
1fc0: 61 74 29 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  at);.    iCol = 
1fd0: 30 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69  0;..    while( i
1fe0: 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  <nDoclist ){.   
1ff0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2000: 20 76 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69   v = 0;..      i
2010: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
2020: 65 74 56 61 72 69 6e 74 28 26 61 44 6f 63 6c 69  etVarint(&aDocli
2030: 73 74 5b 69 5d 2c 20 26 76 29 3b 0a 20 20 20 20  st[i], &v);.    
2040: 20 20 73 77 69 74 63 68 28 20 65 53 74 61 74 65    switch( eState
2050: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
2060: 74 61 74 65 20 30 2e 20 49 6e 20 74 68 69 73 20  tate 0. In this 
2070: 73 74 61 74 65 20 74 68 65 20 69 6e 74 65 67 65  state the intege
2080: 72 20 6a 75 73 74 20 72 65 61 64 20 77 61 73 20  r just read was 
2090: 61 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20 20  a docid. */.    
20a0: 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20      case 0:.    
20b0: 20 20 20 20 20 20 70 43 73 72 2d 3e 61 53 74 61        pCsr->aSta
20c0: 74 5b 30 5d 2e 6e 44 6f 63 2b 2b 3b 0a 20 20 20  t[0].nDoc++;.   
20d0: 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
20e0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  1;.          iCo
20f0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  l = 0;.         
2100: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
2110: 20 2f 2a 20 53 74 61 74 65 20 31 2e 20 49 6e 20   /* State 1. In 
2120: 74 68 69 73 20 73 74 61 74 65 20 77 65 20 61 72  this state we ar
2130: 65 20 65 78 70 65 63 74 69 6e 67 20 65 69 74 68  e expecting eith
2140: 65 72 20 61 20 31 2c 20 69 6e 64 69 63 61 74 69  er a 1, indicati
2150: 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ng.        ** th
2160: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  at the following
2170: 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62 65   integer will be
2180: 20 61 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72   a column number
2190: 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20  , or the.       
21a0: 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 61 20 70   ** start of a p
21b0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72  osition list for
21c0: 20 63 6f 6c 75 6d 6e 20 30 2e 20 20 0a 20 20 20   column 0.  .   
21d0: 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
21e0: 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66   ** The only dif
21f0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
2200: 73 74 61 74 65 20 31 20 61 6e 64 20 73 74 61 74  state 1 and stat
2210: 65 20 32 20 69 73 20 74 68 61 74 20 69 66 20 74  e 2 is that if t
2220: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
2230: 74 65 67 65 72 20 65 6e 63 6f 75 6e 74 65 72 65  teger encountere
2240: 64 20 69 6e 20 73 74 61 74 65 20 31 20 69 73 20  d in state 1 is 
2250: 6e 6f 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e  not 0 or 1, then
2260: 20 77 65 20 6e 65 65 64 20 74 6f 0a 20 20 20 20   we need to.    
2270: 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
2280: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 30 20 22 6e   the column 0 "n
2290: 44 6f 63 22 20 63 6f 75 6e 74 20 66 6f 72 20 74  Doc" count for t
22a0: 68 69 73 20 74 65 72 6d 2e 0a 20 20 20 20 20 20  his term..      
22b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73    */.        cas
22c0: 65 20 31 3a 0a 20 20 20 20 20 20 20 20 20 20 61  e 1:.          a
22d0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 30 20 29  ssert( iCol==0 )
22e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22f0: 76 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  v>1 ){.         
2300: 20 20 20 70 43 73 72 2d 3e 61 53 74 61 74 5b 31     pCsr->aStat[1
2310: 5d 2e 6e 44 6f 63 2b 2b 3b 0a 20 20 20 20 20 20  ].nDoc++;.      
2320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2330: 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
2340: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
2350: 72 6f 75 67 68 20 2a 2f 0a 0a 20 20 20 20 20 20  rough */..      
2360: 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20    case 2:.      
2370: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 20      if( v==0 ){ 
2380: 20 20 20 20 20 20 2f 2a 20 30 78 30 30 2e 20 4e        /* 0x00. N
2390: 65 78 74 20 69 6e 74 65 67 65 72 20 77 69 6c 6c  ext integer will
23a0: 20 62 65 20 61 20 64 6f 63 69 64 2e 20 2a 2f 0a   be a docid. */.
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 65 53 74 61              eSta
23c0: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
23d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 31    }else if( v==1
23e0: 20 29 7b 20 2f 2a 20 30 78 30 31 2e 20 4e 65 78   ){ /* 0x01. Nex
23f0: 74 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62  t integer will b
2400: 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  e a column numbe
2410: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
2420: 20 20 65 53 74 61 74 65 20 3d 20 33 3b 0a 20 20    eState = 3;.  
2430: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 20          }else{  
2440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20 6f            /* 2 o
2450: 72 20 67 72 65 61 74 65 72 2e 20 41 20 70 6f 73  r greater. A pos
2460: 69 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ition. */.      
2470: 20 20 20 20 20 20 70 43 73 72 2d 3e 61 53 74 61        pCsr->aSta
2480: 74 5b 69 43 6f 6c 2b 31 5d 2e 6e 4f 63 63 2b 2b  t[iCol+1].nOcc++
2490: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
24a0: 73 72 2d 3e 61 53 74 61 74 5b 30 5d 2e 6e 4f 63  sr->aStat[0].nOc
24b0: 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  c++;.          }
24c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
24d0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ;..        /* St
24e0: 61 74 65 20 33 2e 20 54 68 65 20 69 6e 74 65 67  ate 3. The integ
24f0: 65 72 20 6a 75 73 74 20 72 65 61 64 20 69 73 20  er just read is 
2500: 61 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e  a column number.
2510: 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 65 66 61   */.        defa
2520: 75 6c 74 3a 20 61 73 73 65 72 74 28 20 65 53 74  ult: assert( eSt
2530: 61 74 65 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ate==3 );.      
2540: 20 20 20 20 69 43 6f 6c 20 3d 20 28 69 6e 74 29      iCol = (int)
2550: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  v;.          if(
2560: 20 66 74 73 33 61 75 78 47 72 6f 77 53 74 61 74   fts3auxGrowStat
2570: 41 72 72 61 79 28 70 43 73 72 2c 20 69 43 6f 6c  Array(pCsr, iCol
2580: 2b 32 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +2) ) return SQL
2590: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
25a0: 20 20 20 20 20 70 43 73 72 2d 3e 61 53 74 61 74       pCsr->aStat
25b0: 5b 69 43 6f 6c 2b 31 5d 2e 6e 44 6f 63 2b 2b 3b  [iCol+1].nDoc++;
25c0: 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
25d0: 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20  e = 2;.         
25e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25f0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d      }..    pCsr-
2600: 3e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  >iCol = 0;.    r
2610: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 73 72   }else{.    pCsr
2630: 2d 3e 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  ->isEof = 1;.  }
2640: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2650: 0a 2f 2a 0a 2a 2a 20 78 46 69 6c 74 65 72 20 2d  ./*.** xFilter -
2660: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 63 75   Initialize a cu
2670: 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  rsor to point at
2680: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
2690: 73 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  s data..*/.stati
26a0: 63 20 69 6e 74 20 66 74 73 33 61 75 78 46 69 6c  c int fts3auxFil
26b0: 74 65 72 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c  terMethod(.  sql
26c0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
26d0: 20 2a 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20   *pCursor,   /* 
26e0: 54 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  The cursor used 
26f0: 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a  for this query *
2700: 2f 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20  /.  int idxNum, 
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 20 20 2f 2a 20 53 74 72 61 74 65 67 79 20      /* Strategy 
2730: 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
2740: 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 20 20   char *idxStr,  
2750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
2760: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  used */.  int nV
2770: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
2780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2790: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
27a0: 69 6e 20 61 70 56 61 6c 20 2a 2f 0a 20 20 73 71  in apVal */.  sq
27b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
27c0: 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
27d0: 20 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74   Arguments for t
27e0: 68 65 20 69 6e 64 65 78 69 6e 67 20 73 63 68 65  he indexing sche
27f0: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 61  me */.){.  Fts3a
2800: 75 78 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  uxCursor *pCsr =
2810: 20 28 46 74 73 33 61 75 78 43 75 72 73 6f 72 20   (Fts3auxCursor 
2820: 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 46 74 73  *)pCursor;.  Fts
2830: 33 54 61 62 6c 65 20 2a 70 46 74 73 33 20 3d 20  3Table *pFts3 = 
2840: 28 28 46 74 73 33 61 75 78 54 61 62 6c 65 20 2a  ((Fts3auxTable *
2850: 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29  )pCursor->pVtab)
2860: 2d 3e 70 46 74 73 33 54 61 62 3b 0a 20 20 69 6e  ->pFts3Tab;.  in
2870: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 73 53 63  t rc;.  int isSc
2880: 61 6e 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  an;..  UNUSED_PA
2890: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 0a  RAMETER(nVal);..
28a0: 20 20 61 73 73 65 72 74 28 20 69 64 78 53 74 72    assert( idxStr
28b0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
28c0: 20 69 64 78 4e 75 6d 3d 3d 46 54 53 34 41 55 58   idxNum==FTS4AUX
28d0: 5f 45 51 5f 43 4f 4e 53 54 52 41 49 4e 54 20 7c  _EQ_CONSTRAINT |
28e0: 7c 20 69 64 78 4e 75 6d 3d 3d 30 0a 20 20 20 20  | idxNum==0.    
28f0: 20 20 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d 46 54     || idxNum==FT
2900: 53 34 41 55 58 5f 4c 45 5f 43 4f 4e 53 54 52 41  S4AUX_LE_CONSTRA
2910: 49 4e 54 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d 46  INT || idxNum==F
2920: 54 53 34 41 55 58 5f 47 45 5f 43 4f 4e 53 54 52  TS4AUX_GE_CONSTR
2930: 41 49 4e 54 0a 20 20 20 20 20 20 20 7c 7c 20 69  AINT.       || i
2940: 64 78 4e 75 6d 3d 3d 28 46 54 53 34 41 55 58 5f  dxNum==(FTS4AUX_
2950: 4c 45 5f 43 4f 4e 53 54 52 41 49 4e 54 7c 46 54  LE_CONSTRAINT|FT
2960: 53 34 41 55 58 5f 47 45 5f 43 4f 4e 53 54 52 41  S4AUX_GE_CONSTRA
2970: 49 4e 54 29 0a 20 20 29 3b 0a 20 20 69 73 53 63  INT).  );.  isSc
2980: 61 6e 20 3d 20 28 69 64 78 4e 75 6d 21 3d 46 54  an = (idxNum!=FT
2990: 53 34 41 55 58 5f 45 51 5f 43 4f 4e 53 54 52 41  S4AUX_EQ_CONSTRA
29a0: 49 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63  INT);..  /* In c
29b0: 61 73 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ase this cursor 
29c0: 69 73 20 62 65 69 6e 67 20 72 65 75 73 65 64 2c  is being reused,
29d0: 20 63 6c 6f 73 65 20 61 6e 64 20 7a 65 72 6f 20   close and zero 
29e0: 69 74 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  it. */.  testcas
29f0: 65 28 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e 7a  e(pCsr->filter.z
2a00: 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  Term);.  sqlite3
2a10: 46 74 73 33 53 65 67 52 65 61 64 65 72 46 69 6e  Fts3SegReaderFin
2a20: 69 73 68 28 26 70 43 73 72 2d 3e 63 73 72 29 3b  ish(&pCsr->csr);
2a30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2a40: 28 76 6f 69 64 20 2a 29 70 43 73 72 2d 3e 66 69  (void *)pCsr->fi
2a50: 6c 74 65 72 2e 7a 54 65 72 6d 29 3b 0a 20 20 73  lter.zTerm);.  s
2a60: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
2a70: 2d 3e 61 53 74 61 74 29 3b 0a 20 20 6d 65 6d 73  ->aStat);.  mems
2a80: 65 74 28 26 70 43 73 72 2d 3e 63 73 72 2c 20 30  et(&pCsr->csr, 0
2a90: 2c 20 28 28 75 38 2a 29 26 70 43 73 72 5b 31 5d  , ((u8*)&pCsr[1]
2aa0: 29 20 2d 20 28 75 38 2a 29 26 70 43 73 72 2d 3e  ) - (u8*)&pCsr->
2ab0: 63 73 72 29 3b 0a 0a 20 20 70 43 73 72 2d 3e 66  csr);..  pCsr->f
2ac0: 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20 46 54  ilter.flags = FT
2ad0: 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49  S3_SEGMENT_REQUI
2ae0: 52 45 5f 50 4f 53 7c 46 54 53 33 5f 53 45 47 4d  RE_POS|FTS3_SEGM
2af0: 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59  ENT_IGNORE_EMPTY
2b00: 3b 0a 20 20 69 66 28 20 69 73 53 63 61 6e 20 29  ;.  if( isScan )
2b10: 20 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e 66 6c   pCsr->filter.fl
2b20: 61 67 73 20 7c 3d 20 46 54 53 33 5f 53 45 47 4d  ags |= FTS3_SEGM
2b30: 45 4e 54 5f 53 43 41 4e 3b 0a 0a 20 20 69 66 28  ENT_SCAN;..  if(
2b40: 20 69 64 78 4e 75 6d 26 28 46 54 53 34 41 55 58   idxNum&(FTS4AUX
2b50: 5f 45 51 5f 43 4f 4e 53 54 52 41 49 4e 54 7c 46  _EQ_CONSTRAINT|F
2b60: 54 53 34 41 55 58 5f 47 45 5f 43 4f 4e 53 54 52  TS4AUX_GE_CONSTR
2b70: 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 63 6f 6e  AINT) ){.    con
2b80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2b90: 20 2a 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33   *zStr = sqlite3
2ba0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
2bb0: 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  l[0]);.    if( z
2bc0: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 70 43 73  Str ){.      pCs
2bd0: 72 2d 3e 66 69 6c 74 65 72 2e 7a 54 65 72 6d 20  r->filter.zTerm 
2be0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2bf0: 66 28 22 25 73 22 2c 20 7a 53 74 72 29 3b 0a 20  f("%s", zStr);. 
2c00: 20 20 20 20 20 70 43 73 72 2d 3e 66 69 6c 74 65       pCsr->filte
2c10: 72 2e 6e 54 65 72 6d 20 3d 20 73 71 6c 69 74 65  r.nTerm = sqlite
2c20: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70  3_value_bytes(ap
2c30: 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  Val[0]);.      i
2c40: 66 28 20 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e  f( pCsr->filter.
2c50: 7a 54 65 72 6d 3d 3d 30 20 29 20 72 65 74 75 72  zTerm==0 ) retur
2c60: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2c70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2c80: 69 64 78 4e 75 6d 26 46 54 53 34 41 55 58 5f 4c  idxNum&FTS4AUX_L
2c90: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
2ca0: 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28      int iIdx = (
2cb0: 69 64 78 4e 75 6d 26 46 54 53 34 41 55 58 5f 47  idxNum&FTS4AUX_G
2cc0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 3f 20  E_CONSTRAINT) ? 
2cd0: 31 20 3a 20 30 3b 0a 20 20 20 20 70 43 73 72 2d  1 : 0;.    pCsr-
2ce0: 3e 7a 53 74 6f 70 20 3d 20 73 71 6c 69 74 65 33  >zStop = sqlite3
2cf0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
2d00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2d10: 74 28 61 70 56 61 6c 5b 69 49 64 78 5d 29 29 3b  t(apVal[iIdx]));
2d20: 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 74 6f 70  .    pCsr->nStop
2d30: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2d40: 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 69 49 64  _bytes(apVal[iId
2d50: 78 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 43 73  x]);.    if( pCs
2d60: 72 2d 3e 7a 53 74 6f 70 3d 3d 30 20 29 20 72 65  r->zStop==0 ) re
2d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d80: 4d 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  M;.  }..  rc = s
2d90: 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
2da0: 64 65 72 43 75 72 73 6f 72 28 70 46 74 73 33 2c  derCursor(pFts3,
2db0: 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f   FTS3_SEGCURSOR_
2dc0: 41 4c 4c 2c 0a 20 20 20 20 20 20 70 43 73 72 2d  ALL,.      pCsr-
2dd0: 3e 66 69 6c 74 65 72 2e 7a 54 65 72 6d 2c 20 70  >filter.zTerm, p
2de0: 43 73 72 2d 3e 66 69 6c 74 65 72 2e 6e 54 65 72  Csr->filter.nTer
2df0: 6d 2c 20 30 2c 20 69 73 53 63 61 6e 2c 20 26 70  m, 0, isScan, &p
2e00: 43 73 72 2d 3e 63 73 72 0a 20 20 29 3b 0a 20 20  Csr->csr.  );.  
2e10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e20: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
2e30: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
2e40: 65 72 53 74 61 72 74 28 70 46 74 73 33 2c 20 26  erStart(pFts3, &
2e50: 70 43 73 72 2d 3e 63 73 72 2c 20 26 70 43 73 72  pCsr->csr, &pCsr
2e60: 2d 3e 66 69 6c 74 65 72 29 3b 0a 20 20 7d 0a 0a  ->filter);.  }..
2e70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e80: 5f 4f 4b 20 29 20 72 63 20 3d 20 66 74 73 33 61  _OK ) rc = fts3a
2e90: 75 78 4e 65 78 74 4d 65 74 68 6f 64 28 70 43 75  uxNextMethod(pCu
2ea0: 72 73 6f 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  rsor);.  return 
2eb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 45 6f  rc;.}../*.** xEo
2ec0: 66 20 2d 20 52 65 74 75 72 6e 20 74 72 75 65 20  f - Return true 
2ed0: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2ee0: 20 61 74 20 45 4f 46 2c 20 6f 72 20 66 61 6c 73   at EOF, or fals
2ef0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
2f00: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61  static int fts3a
2f10: 75 78 45 6f 66 4d 65 74 68 6f 64 28 73 71 6c 69  uxEofMethod(sqli
2f20: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
2f30: 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 46 74 73  *pCursor){.  Fts
2f40: 33 61 75 78 43 75 72 73 6f 72 20 2a 70 43 73 72  3auxCursor *pCsr
2f50: 20 3d 20 28 46 74 73 33 61 75 78 43 75 72 73 6f   = (Fts3auxCurso
2f60: 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 72  r *)pCursor;.  r
2f70: 65 74 75 72 6e 20 70 43 73 72 2d 3e 69 73 45 6f  eturn pCsr->isEo
2f80: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6c  f;.}../*.** xCol
2f90: 75 6d 6e 20 2d 20 52 65 74 75 72 6e 20 61 20 63  umn - Return a c
2fa0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a  olumn value..*/.
2fb0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61  static int fts3a
2fc0: 75 78 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 28 0a  uxColumnMethod(.
2fd0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
2fe0: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
2ff0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
3000: 65 74 72 69 65 76 65 20 76 61 6c 75 65 20 66 72  etrieve value fr
3010: 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  om */.  sqlite3_
3020: 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  context *pContex
3030: 74 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  t,      /* Conte
3040: 78 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 72  xt for sqlite3_r
3050: 65 73 75 6c 74 5f 78 78 78 28 29 20 63 61 6c 6c  esult_xxx() call
3060: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  s */.  int iCol 
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3090: 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 61  of column to rea
30a0: 64 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a  d value from */.
30b0: 29 7b 0a 20 20 46 74 73 33 61 75 78 43 75 72 73  ){.  Fts3auxCurs
30c0: 6f 72 20 2a 70 20 3d 20 28 46 74 73 33 61 75 78  or *p = (Fts3aux
30d0: 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
30e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
30f0: 69 73 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66  isEof==0 );.  if
3100: 28 20 69 43 6f 6c 3d 3d 30 20 29 7b 20 20 20 20  ( iCol==0 ){    
3110: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 22 74      /* Column "t
3120: 65 72 6d 22 20 2a 2f 0a 20 20 20 20 73 71 6c 69  erm" */.    sqli
3130: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
3140: 70 43 6f 6e 74 65 78 74 2c 20 70 2d 3e 63 73 72  pContext, p->csr
3150: 2e 7a 54 65 72 6d 2c 20 70 2d 3e 63 73 72 2e 6e  .zTerm, p->csr.n
3160: 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f 54 52 41  Term, SQLITE_TRA
3170: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
3180: 20 69 66 28 20 69 43 6f 6c 3d 3d 31 20 29 7b 20   if( iCol==1 ){ 
3190: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 22 63 6f 6c 22   /* Column "col"
31a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
31b0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
31c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
31d0: 70 43 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 43 6f  pContext, p->iCo
31e0: 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  l-1);.    }else{
31f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
3200: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 6f 6e 74  esult_text(pCont
3210: 65 78 74 2c 20 22 2a 22 2c 20 2d 31 2c 20 53 51  ext, "*", -1, SQ
3220: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
3230: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
3240: 69 43 6f 6c 3d 3d 32 20 29 7b 20 20 2f 2a 20 43  iCol==2 ){  /* C
3250: 6f 6c 75 6d 6e 20 22 64 6f 63 75 6d 65 6e 74 73  olumn "documents
3260: 22 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  " */.    sqlite3
3270: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
3280: 6f 6e 74 65 78 74 2c 20 70 2d 3e 61 53 74 61 74  ontext, p->aStat
3290: 5b 70 2d 3e 69 43 6f 6c 5d 2e 6e 44 6f 63 29 3b  [p->iCol].nDoc);
32a0: 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
32b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
32c0: 6d 6e 20 22 6f 63 63 75 72 72 65 6e 63 65 73 22  mn "occurrences"
32d0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
32e0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 6f  result_int64(pCo
32f0: 6e 74 65 78 74 2c 20 70 2d 3e 61 53 74 61 74 5b  ntext, p->aStat[
3300: 70 2d 3e 69 43 6f 6c 5d 2e 6e 4f 63 63 29 3b 0a  p->iCol].nOcc);.
3310: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
3320: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3330: 2a 20 78 52 6f 77 69 64 20 2d 20 52 65 74 75 72  * xRowid - Retur
3340: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
3350: 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 73  wid for the curs
3360: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
3370: 74 20 66 74 73 33 61 75 78 52 6f 77 69 64 4d 65  t fts3auxRowidMe
3380: 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
3390: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
33a0: 72 73 6f 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f  rsor,   /* Curso
33b0: 72 20 74 6f 20 72 65 74 72 69 65 76 65 20 76 61  r to retrieve va
33c0: 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71  lue from */.  sq
33d0: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
33e0: 69 64 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id            /*
33f0: 20 4f 55 54 3a 20 52 6f 77 69 64 20 76 61 6c 75   OUT: Rowid valu
3400: 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 61 75  e */.){.  Fts3au
3410: 78 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  xCursor *pCsr = 
3420: 28 46 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a  (Fts3auxCursor *
3430: 29 70 43 75 72 73 6f 72 3b 0a 20 20 2a 70 52 6f  )pCursor;.  *pRo
3440: 77 69 64 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77  wid = pCsr->iRow
3450: 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
3460: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3470: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66 74   Register the ft
3480: 73 33 61 75 78 20 6d 6f 64 75 6c 65 20 77 69 74  s3aux module wit
3490: 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  h database conne
34a0: 63 74 69 6f 6e 20 64 62 2e 20 52 65 74 75 72 6e  ction db. Return
34b0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66   SQLITE_OK.** if
34c0: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
34d0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
34e0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
34f0: 6f 64 75 6c 65 28 29 20 66 61 69 6c 73 2e 0a 2a  odule() fails..*
3500: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3510: 33 49 6e 69 74 41 75 78 28 73 71 6c 69 74 65 33  3InitAux(sqlite3
3520: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
3530: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
3540: 64 75 6c 65 20 66 74 73 33 61 75 78 5f 6d 6f 64  dule fts3aux_mod
3550: 75 6c 65 20 3d 20 7b 0a 20 20 20 20 20 30 2c 20  ule = {.     0, 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
3580: 72 73 69 6f 6e 20 20 20 20 20 20 2a 2f 0a 20 20  rsion      */.  
3590: 20 20 20 66 74 73 33 61 75 78 43 6f 6e 6e 65 63     fts3auxConnec
35a0: 74 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20  tMethod,        
35b0: 2f 2a 20 78 43 72 65 61 74 65 20 20 20 20 20 20  /* xCreate      
35c0: 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 61 75 78   */.     fts3aux
35d0: 43 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 20 20  ConnectMethod,  
35e0: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63        /* xConnec
35f0: 74 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66  t      */.     f
3600: 74 73 33 61 75 78 42 65 73 74 49 6e 64 65 78 4d  ts3auxBestIndexM
3610: 65 74 68 6f 64 2c 20 20 20 20 20 20 2f 2a 20 78  ethod,      /* x
3620: 42 65 73 74 49 6e 64 65 78 20 20 20 20 2a 2f 0a  BestIndex    */.
3630: 20 20 20 20 20 66 74 73 33 61 75 78 44 69 73 63       fts3auxDisc
3640: 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 20 20 20  onnectMethod,   
3650: 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
3660: 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 61     */.     fts3a
3670: 75 78 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68  uxDisconnectMeth
3680: 6f 64 2c 20 20 20 20 20 2f 2a 20 78 44 65 73 74  od,     /* xDest
3690: 72 6f 79 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  roy      */.    
36a0: 20 66 74 73 33 61 75 78 4f 70 65 6e 4d 65 74 68   fts3auxOpenMeth
36b0: 6f 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  od,           /*
36c0: 20 78 4f 70 65 6e 20 20 20 20 20 20 20 20 20 2a   xOpen         *
36d0: 2f 0a 20 20 20 20 20 66 74 73 33 61 75 78 43 6c  /.     fts3auxCl
36e0: 6f 73 65 4d 65 74 68 6f 64 2c 20 20 20 20 20 20  oseMethod,      
36f0: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20      /* xClose   
3700: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73       */.     fts
3710: 33 61 75 78 46 69 6c 74 65 72 4d 65 74 68 6f 64  3auxFilterMethod
3720: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69  ,         /* xFi
3730: 6c 74 65 72 20 20 20 20 20 20 20 2a 2f 0a 20 20  lter       */.  
3740: 20 20 20 66 74 73 33 61 75 78 4e 65 78 74 4d 65     fts3auxNextMe
3750: 74 68 6f 64 2c 20 20 20 20 20 20 20 20 20 20 20  thod,           
3760: 2f 2a 20 78 4e 65 78 74 20 20 20 20 20 20 20 20  /* xNext        
3770: 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 61 75 78   */.     fts3aux
3780: 45 6f 66 4d 65 74 68 6f 64 2c 20 20 20 20 20 20  EofMethod,      
3790: 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 20 20        /* xEof   
37a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66         */.     f
37b0: 74 73 33 61 75 78 43 6f 6c 75 6d 6e 4d 65 74 68  ts3auxColumnMeth
37c0: 6f 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  od,         /* x
37d0: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 2a 2f 0a  Column       */.
37e0: 20 20 20 20 20 66 74 73 33 61 75 78 52 6f 77 69       fts3auxRowi
37f0: 64 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20  dMethod,        
3800: 20 20 2f 2a 20 78 52 6f 77 69 64 20 20 20 20 20    /* xRowid     
3810: 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20     */.     0,   
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
3840: 74 65 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  te       */.    
3850: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3870: 20 78 42 65 67 69 6e 20 20 20 20 20 20 20 20 2a   xBegin        *
3880: 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  /.     0,       
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 20 20 20      /* xSync    
38b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20       */.     0, 
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
38e0: 6d 6d 69 74 20 20 20 20 20 20 20 2a 2f 0a 20 20  mmit       */.  
38f0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3910: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 20 20 20  /* xRollback    
3920: 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20   */.     0,     
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3940: 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75        /* xFindFu
3950: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 30  nction */.     0
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
3980: 52 65 6e 61 6d 65 20 20 20 20 20 20 20 2a 2f 0a  Rename       */.
3990: 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20    };.  int rc;  
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
39c0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d   code */..  rc =
39d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
39e0: 6d 6f 64 75 6c 65 28 64 62 2c 20 22 66 74 73 34  module(db, "fts4
39f0: 61 75 78 22 2c 20 26 66 74 73 33 61 75 78 5f 6d  aux", &fts3aux_m
3a00: 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74  odule, 0);.  ret
3a10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
3a20: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
3a30: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
3a40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
3a50: 42 4c 45 5f 46 54 53 33 29 20 2a 2f 0a           BLE_FTS3) */.