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

Artifact 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34:


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 4c 61 6e 67 69 64 3b 20 20 20 20  int iLangid;    
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03f0: 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74  /* Language id t
0400: 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  o query */.  int
0410: 20 69 73 45 6f 66 3b 20 20 20 20 20 20 20 20 20   isEof;         
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0430: 54 72 75 65 20 69 66 20 63 75 72 73 6f 72 20 69  True if cursor i
0440: 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 73 71  s at EOF */.  sq
0450: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77  lite3_int64 iRow
0460: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id;           /*
0470: 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a   Current rowid *
0480: 2f 0a 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  /..  int iCol;  
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
04b0: 76 61 6c 75 65 20 6f 66 20 27 63 6f 6c 27 20 63  value of 'col' c
04c0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  olumn */.  int n
04d0: 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
04e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
04f0: 7a 65 20 6f 66 20 61 53 74 61 74 5b 5d 20 61 72  ze of aStat[] ar
0500: 72 61 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ray */.  struct 
0510: 46 74 73 33 61 75 78 43 6f 6c 73 74 61 74 73 20  Fts3auxColstats 
0520: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
0530: 74 36 34 20 6e 44 6f 63 3b 20 20 20 20 20 20 20  t64 nDoc;       
0540: 20 20 20 20 2f 2a 20 27 64 6f 63 75 6d 65 6e 74      /* 'document
0550: 73 27 20 76 61 6c 75 65 73 20 66 6f 72 20 63 75  s' values for cu
0560: 72 72 65 6e 74 20 63 73 72 20 72 6f 77 20 2a 2f  rrent csr row */
0570: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
0580: 36 34 20 6e 4f 63 63 3b 20 20 20 20 20 20 20 20  64 nOcc;        
0590: 20 20 20 2f 2a 20 27 6f 63 63 75 72 72 65 6e 63     /* 'occurrenc
05a0: 65 73 27 20 76 61 6c 75 65 73 20 66 6f 72 20 63  es' values for c
05b0: 75 72 72 65 6e 74 20 63 73 72 20 72 6f 77 20 2a  urrent csr row *
05c0: 2f 0a 20 20 7d 20 2a 61 53 74 61 74 3b 0a 7d 3b  /.  } *aStat;.};
05d0: 0a 0a 2f 2a 0a 2a 2a 20 53 63 68 65 6d 61 20 6f  ../*.** Schema o
05e0: 66 20 74 68 65 20 74 65 72 6d 73 20 74 61 62 6c  f the terms tabl
05f0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  e..*/.#define FT
0600: 53 33 5f 41 55 58 5f 53 43 48 45 4d 41 20 5c 0a  S3_AUX_SCHEMA \.
0610: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
0620: 78 28 74 65 72 6d 2c 20 63 6f 6c 2c 20 64 6f 63  x(term, col, doc
0630: 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e  uments, occurren
0640: 63 65 73 2c 20 6c 61 6e 67 75 61 67 65 69 64 20  ces, languageid 
0650: 48 49 44 44 45 4e 29 22 0a 0a 2f 2a 0a 2a 2a 20  HIDDEN)"../*.** 
0660: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
0670: 65 73 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  es all the work 
0680: 66 6f 72 20 62 6f 74 68 20 74 68 65 20 78 43 6f  for both the xCo
0690: 6e 6e 65 63 74 20 61 6e 64 20 78 43 72 65 61 74  nnect and xCreat
06a0: 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 20 54 68  e methods..** Th
06b0: 65 73 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  ese tables have 
06c0: 6e 6f 20 70 65 72 73 69 73 74 65 6e 74 20 72 65  no persistent re
06d0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
06e0: 74 68 65 69 72 20 6f 77 6e 2c 20 73 6f 20 78 43  their own, so xC
06f0: 6f 6e 6e 65 63 74 0a 2a 2a 20 61 6e 64 20 78 43  onnect.** and xC
0700: 72 65 61 74 65 20 61 72 65 20 69 64 65 6e 74 69  reate are identi
0710: 63 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  cal operations..
0720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
0730: 73 33 61 75 78 43 6f 6e 6e 65 63 74 4d 65 74 68  s3auxConnectMeth
0740: 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  od(.  sqlite3 *d
0750: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
0760: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
0770: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
0780: 20 20 76 6f 69 64 20 2a 70 55 6e 75 73 65 64 2c    void *pUnused,
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07a0: 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20    /* Unused */. 
07b0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
07e0: 65 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61  ements in argv a
07f0: 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rray */.  const 
0800: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72  char * const *ar
0810: 67 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72  gv,       /* xCr
0820: 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72  eate/xConnect ar
0830: 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a  gument array */.
0840: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
0850: 2a 70 70 56 74 61 62 2c 20 20 20 20 20 20 20 20  *ppVtab,        
0860: 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71    /* OUT: New sq
0870: 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63  lite3_vtab objec
0880: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t */.  char **pz
0890: 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
08a0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
08b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20  qlite3_malloc'd 
08c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  error message */
08d0: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
08e0: 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
08f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
0900: 20 64 61 74 61 62 61 73 65 20 28 65 2e 67 2e 20   database (e.g. 
0910: 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 63 68 61  "main") */.  cha
0920: 72 20 63 6f 6e 73 74 20 2a 7a 46 74 73 33 3b 20  r const *zFts3; 
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0940: 4e 61 6d 65 20 6f 66 20 66 74 73 33 20 74 61 62  Name of fts3 tab
0950: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 62 3b  le */.  int nDb;
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
0980: 74 20 6f 66 20 73 74 72 6c 65 6e 28 7a 44 62 29  t of strlen(zDb)
0990: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 74 73 33 3b   */.  int nFts3;
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
09c0: 6f 66 20 73 74 72 6c 65 6e 28 7a 46 74 73 33 29  of strlen(zFts3)
09d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
09e0: 74 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20  t64 nByte;      
09f0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
0a00: 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
0a10: 61 74 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ate here */.  in
0a20: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0a40: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
0a50: 62 79 20 64 65 63 6c 61 72 65 5f 76 74 61 62 28  by declare_vtab(
0a60: 29 20 2a 2f 0a 20 20 46 74 73 33 61 75 78 54 61  ) */.  Fts3auxTa
0a70: 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ble *p;         
0a80: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
0a90: 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74  l table object t
0aa0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 55  o return */..  U
0ab0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0ac0: 70 55 6e 75 73 65 64 29 3b 0a 0a 20 20 2f 2a 20  pUnused);..  /* 
0ad0: 54 68 65 20 75 73 65 72 20 73 68 6f 75 6c 64 20  The user should 
0ae0: 69 6e 76 6f 6b 65 20 74 68 69 73 20 69 6e 20 6f  invoke this in o
0af0: 6e 65 20 6f 66 20 74 77 6f 20 66 6f 72 6d 73 3a  ne of two forms:
0b00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
0b10: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0b20: 42 4c 45 20 78 78 78 20 55 53 49 4e 47 20 66 74  BLE xxx USING ft
0b30: 73 34 61 75 78 28 66 74 73 34 2d 74 61 62 6c 65  s4aux(fts4-table
0b40: 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
0b50: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0b60: 20 78 78 78 20 55 53 49 4e 47 20 66 74 73 34 61   xxx USING fts4a
0b70: 75 78 28 66 74 73 34 2d 74 61 62 6c 65 2d 64 62  ux(fts4-table-db
0b80: 2c 20 66 74 73 34 2d 74 61 62 6c 65 29 3b 0a 20  , fts4-table);. 
0b90: 20 2a 2f 0a 20 20 69 66 28 20 61 72 67 63 21 3d   */.  if( argc!=
0ba0: 34 20 26 26 20 61 72 67 63 21 3d 35 20 29 20 67  4 && argc!=5 ) g
0bb0: 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 0a 20  oto bad_args;.. 
0bc0: 20 7a 44 62 20 3d 20 61 72 67 76 5b 31 5d 3b 20   zDb = argv[1]; 
0bd0: 0a 20 20 6e 44 62 20 3d 20 28 69 6e 74 29 73 74  .  nDb = (int)st
0be0: 72 6c 65 6e 28 7a 44 62 29 3b 0a 20 20 69 66 28  rlen(zDb);.  if(
0bf0: 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20   argc==5 ){.    
0c00: 69 66 28 20 6e 44 62 3d 3d 34 20 26 26 20 30 3d  if( nDb==4 && 0=
0c10: 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
0c20: 70 28 22 74 65 6d 70 22 2c 20 7a 44 62 2c 20 34  p("temp", zDb, 4
0c30: 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d  ) ){.      zDb =
0c40: 20 61 72 67 76 5b 33 5d 3b 20 0a 20 20 20 20 20   argv[3]; .     
0c50: 20 6e 44 62 20 3d 20 28 69 6e 74 29 73 74 72 6c   nDb = (int)strl
0c60: 65 6e 28 7a 44 62 29 3b 0a 20 20 20 20 20 20 7a  en(zDb);.      z
0c70: 46 74 73 33 20 3d 20 61 72 67 76 5b 34 5d 3b 0a  Fts3 = argv[4];.
0c80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0c90: 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a   goto bad_args;.
0ca0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
0cb0: 20 20 20 7a 46 74 73 33 20 3d 20 61 72 67 76 5b     zFts3 = argv[
0cc0: 33 5d 3b 0a 20 20 7d 0a 20 20 6e 46 74 73 33 20  3];.  }.  nFts3 
0cd0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
0ce0: 74 73 33 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  ts3);..  rc = sq
0cf0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
0d00: 61 62 28 64 62 2c 20 46 54 53 33 5f 41 55 58 5f  ab(db, FTS3_AUX_
0d10: 53 43 48 45 4d 41 29 3b 0a 20 20 69 66 28 20 72  SCHEMA);.  if( r
0d20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
0d30: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6e 42 79  eturn rc;..  nBy
0d40: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33  te = sizeof(Fts3
0d50: 61 75 78 54 61 62 6c 65 29 20 2b 20 73 69 7a 65  auxTable) + size
0d60: 6f 66 28 46 74 73 33 54 61 62 6c 65 29 20 2b 20  of(Fts3Table) + 
0d70: 6e 44 62 20 2b 20 6e 46 74 73 33 20 2b 20 32 3b  nDb + nFts3 + 2;
0d80: 0a 20 20 70 20 3d 20 28 46 74 73 33 61 75 78 54  .  p = (Fts3auxT
0d90: 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  able *)sqlite3_m
0da0: 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
0db0: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
0dc0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
0dd0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e    memset(p, 0, n
0de0: 42 79 74 65 29 3b 0a 0a 20 20 70 2d 3e 70 46 74  Byte);..  p->pFt
0df0: 73 33 54 61 62 20 3d 20 28 46 74 73 33 54 61 62  s3Tab = (Fts3Tab
0e00: 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d  le *)&p[1];.  p-
0e10: 3e 70 46 74 73 33 54 61 62 2d 3e 7a 44 62 20 3d  >pFts3Tab->zDb =
0e20: 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 70 46 74   (char *)&p->pFt
0e30: 73 33 54 61 62 5b 31 5d 3b 0a 20 20 70 2d 3e 70  s3Tab[1];.  p->p
0e40: 46 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  Fts3Tab->zName =
0e50: 20 26 70 2d 3e 70 46 74 73 33 54 61 62 2d 3e 7a   &p->pFts3Tab->z
0e60: 44 62 5b 6e 44 62 2b 31 5d 3b 0a 20 20 70 2d 3e  Db[nDb+1];.  p->
0e70: 70 46 74 73 33 54 61 62 2d 3e 64 62 20 3d 20 64  pFts3Tab->db = d
0e80: 62 3b 0a 20 20 70 2d 3e 70 46 74 73 33 54 61 62  b;.  p->pFts3Tab
0e90: 2d 3e 6e 49 6e 64 65 78 20 3d 20 31 3b 0a 0a 20  ->nIndex = 1;.. 
0ea0: 20 6d 65 6d 63 70 79 28 28 63 68 61 72 20 2a 29   memcpy((char *)
0eb0: 70 2d 3e 70 46 74 73 33 54 61 62 2d 3e 7a 44 62  p->pFts3Tab->zDb
0ec0: 2c 20 7a 44 62 2c 20 6e 44 62 29 3b 0a 20 20 6d  , zDb, nDb);.  m
0ed0: 65 6d 63 70 79 28 28 63 68 61 72 20 2a 29 70 2d  emcpy((char *)p-
0ee0: 3e 70 46 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65  >pFts3Tab->zName
0ef0: 2c 20 7a 46 74 73 33 2c 20 6e 46 74 73 33 29 3b  , zFts3, nFts3);
0f00: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 44 65  .  sqlite3Fts3De
0f10: 71 75 6f 74 65 28 28 63 68 61 72 20 2a 29 70 2d  quote((char *)p-
0f20: 3e 70 46 74 73 33 54 61 62 2d 3e 7a 4e 61 6d 65  >pFts3Tab->zName
0f30: 29 3b 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20  );..  *ppVtab = 
0f40: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29  (sqlite3_vtab *)
0f50: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
0f60: 54 45 5f 4f 4b 3b 0a 0a 20 62 61 64 5f 61 72 67  TE_OK;.. bad_arg
0f70: 73 3a 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  s:.  sqlite3Fts3
0f80: 45 72 72 4d 73 67 28 70 7a 45 72 72 2c 20 22 69  ErrMsg(pzErr, "i
0f90: 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
0fa0: 20 74 6f 20 66 74 73 34 61 75 78 20 63 6f 6e 73   to fts4aux cons
0fb0: 74 72 75 63 74 6f 72 22 29 3b 0a 20 20 72 65 74  tructor");.  ret
0fc0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
0fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0fe0: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
0ff0: 65 20 77 6f 72 6b 20 66 6f 72 20 62 6f 74 68 20  e work for both 
1000: 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  the xDisconnect 
1010: 61 6e 64 20 78 44 65 73 74 72 6f 79 20 6d 65 74  and xDestroy met
1020: 68 6f 64 73 2e 0a 2a 2a 20 54 68 65 73 65 20 74  hods..** These t
1030: 61 62 6c 65 73 20 68 61 76 65 20 6e 6f 20 70 65  ables have no pe
1040: 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  rsistent represe
1050: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 69 72  ntation of their
1060: 20 6f 77 6e 2c 20 73 6f 20 78 44 69 73 63 6f 6e   own, so xDiscon
1070: 6e 65 63 74 0a 2a 2a 20 61 6e 64 20 78 44 65 73  nect.** and xDes
1080: 74 72 6f 79 20 61 72 65 20 69 64 65 6e 74 69 63  troy are identic
1090: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  al operations..*
10a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
10b0: 33 61 75 78 44 69 73 63 6f 6e 6e 65 63 74 4d 65  3auxDisconnectMe
10c0: 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
10d0: 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 46 74 73  b *pVtab){.  Fts
10e0: 33 61 75 78 54 61 62 6c 65 20 2a 70 20 3d 20 28  3auxTable *p = (
10f0: 46 74 73 33 61 75 78 54 61 62 6c 65 20 2a 29 70  Fts3auxTable *)p
1100: 56 74 61 62 3b 0a 20 20 46 74 73 33 54 61 62 6c  Vtab;.  Fts3Tabl
1110: 65 20 2a 70 46 74 73 33 20 3d 20 70 2d 3e 70 46  e *pFts3 = p->pF
1120: 74 73 33 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b  ts3Tab;.  int i;
1130: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
1140: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1150: 6e 74 73 20 68 65 6c 64 20 2a 2f 0a 20 20 66 6f  nts held */.  fo
1160: 72 28 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41  r(i=0; i<SizeofA
1170: 72 72 61 79 28 70 46 74 73 33 2d 3e 61 53 74 6d  rray(pFts3->aStm
1180: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t); i++){.    sq
1190: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
11a0: 46 74 73 33 2d 3e 61 53 74 6d 74 5b 69 5d 29 3b  Fts3->aStmt[i]);
11b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
11c0: 72 65 65 28 70 46 74 73 33 2d 3e 7a 53 65 67 6d  ree(pFts3->zSegm
11d0: 65 6e 74 73 54 62 6c 29 3b 0a 20 20 73 71 6c 69  entsTbl);.  sqli
11e0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
11f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1200: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 34  .}..#define FTS4
1210: 41 55 58 5f 45 51 5f 43 4f 4e 53 54 52 41 49 4e  AUX_EQ_CONSTRAIN
1220: 54 20 31 0a 23 64 65 66 69 6e 65 20 46 54 53 34  T 1.#define FTS4
1230: 41 55 58 5f 47 45 5f 43 4f 4e 53 54 52 41 49 4e  AUX_GE_CONSTRAIN
1240: 54 20 32 0a 23 64 65 66 69 6e 65 20 46 54 53 34  T 2.#define FTS4
1250: 41 55 58 5f 4c 45 5f 43 4f 4e 53 54 52 41 49 4e  AUX_LE_CONSTRAIN
1260: 54 20 34 0a 0a 2f 2a 0a 2a 2a 20 78 42 65 73 74  T 4../*.** xBest
1270: 49 6e 64 65 78 20 2d 20 41 6e 61 6c 79 7a 65 20  Index - Analyze 
1280: 61 20 57 48 45 52 45 20 61 6e 64 20 4f 52 44 45  a WHERE and ORDE
1290: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
12a0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 61  static int fts3a
12b0: 75 78 42 65 73 74 49 6e 64 65 78 4d 65 74 68 6f  uxBestIndexMetho
12c0: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  d(.  sqlite3_vta
12d0: 62 20 2a 70 56 54 61 62 2c 20 0a 20 20 73 71 6c  b *pVTab, .  sql
12e0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12f0: 2a 70 49 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74 20  *pInfo.){.  int 
1300: 69 3b 0a 20 20 69 6e 74 20 69 45 71 20 3d 20 2d  i;.  int iEq = -
1310: 31 3b 0a 20 20 69 6e 74 20 69 47 65 20 3d 20 2d  1;.  int iGe = -
1320: 31 3b 0a 20 20 69 6e 74 20 69 4c 65 20 3d 20 2d  1;.  int iLe = -
1330: 31 3b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  1;.  int iLangid
1340: 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 4e 65   = -1;.  int iNe
1350: 78 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  xt = 1;         
1360: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1370: 20 66 72 65 65 20 61 72 67 76 49 6e 64 65 78 20   free argvIndex 
1380: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 55 4e 55 53  value */..  UNUS
1390: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 54  ED_PARAMETER(pVT
13a0: 61 62 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ab);..  /* This 
13b0: 76 74 61 62 20 64 65 6c 69 76 65 72 73 20 61 6c  vtab delivers al
13c0: 77 61 79 73 20 72 65 73 75 6c 74 73 20 69 6e 20  ways results in 
13d0: 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 41  "ORDER BY term A
13e0: 53 43 22 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  SC" order. */.  
13f0: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4f 72 64 65  if( pInfo->nOrde
1400: 72 42 79 3d 3d 31 20 0a 20 20 20 26 26 20 70 49  rBy==1 .   && pI
1410: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d  nfo->aOrderBy[0]
1420: 2e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 0a 20 20 20  .iColumn==0 .   
1430: 26 26 20 70 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  && pInfo->aOrder
1440: 42 79 5b 30 5d 2e 64 65 73 63 3d 3d 30 0a 20 20  By[0].desc==0.  
1450: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6f 72  ){.    pInfo->or
1460: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
1470: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61  1;.  }..  /* Sea
1480: 72 63 68 20 66 6f 72 20 65 71 75 61 6c 69 74 79  rch for equality
1490: 20 61 6e 64 20 72 61 6e 67 65 20 63 6f 6e 73 74   and range const
14a0: 72 61 69 6e 74 73 20 6f 6e 20 74 68 65 20 22 74  raints on the "t
14b0: 65 72 6d 22 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20  erm" column. .  
14c0: 2a 2a 20 41 6e 64 20 65 71 75 61 6c 69 74 79 20  ** And equality 
14d0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74  constraints on t
14e0: 68 65 20 68 69 64 64 65 6e 20 22 6c 61 6e 67 75  he hidden "langu
14f0: 61 67 65 69 64 22 20 63 6f 6c 75 6d 6e 2e 20 2a  ageid" column. *
1500: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
1510: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
1520: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
1530: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61   pInfo->aConstra
1540: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 29 7b  int[i].usable ){
1550: 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
1560: 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  pInfo->aConstrai
1570: 6e 74 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20 20 20  nt[i].op;.      
1580: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 6e 66 6f  int iCol = pInfo
1590: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
15a0: 2e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20  .iColumn;..     
15b0: 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29 7b 0a   if( iCol==0 ){.
15c0: 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d          if( op==
15d0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15e0: 53 54 52 41 49 4e 54 5f 45 51 20 29 20 69 45 71  STRAINT_EQ ) iEq
15f0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66   = i;.        if
1600: 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ( op==SQLITE_IND
1610: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
1620: 20 29 20 69 4c 65 20 3d 20 69 3b 0a 20 20 20 20   ) iLe = i;.    
1630: 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
1640: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
1650: 49 4e 54 5f 4c 45 20 29 20 69 4c 65 20 3d 20 69  INT_LE ) iLe = i
1660: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 70  ;.        if( op
1670: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
1680: 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 20 69  ONSTRAINT_GT ) i
1690: 47 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  Ge = i;.        
16a0: 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  if( op==SQLITE_I
16b0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
16c0: 47 45 20 29 20 69 47 65 20 3d 20 69 3b 0a 20 20  GE ) iGe = i;.  
16d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16e0: 69 43 6f 6c 3d 3d 34 20 29 7b 0a 20 20 20 20 20  iCol==4 ){.     
16f0: 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54     if( op==SQLIT
1700: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
1710: 4e 54 5f 45 51 20 29 20 69 4c 61 6e 67 69 64 20  NT_EQ ) iLangid 
1720: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
1730: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 45   }.  }..  if( iE
1740: 71 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 66  q>=0 ){.    pInf
1750: 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 46 54 53 34  o->idxNum = FTS4
1760: 41 55 58 5f 45 51 5f 43 4f 4e 53 54 52 41 49 4e  AUX_EQ_CONSTRAIN
1770: 54 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  T;.    pInfo->aC
1780: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
1790: 45 71 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  Eq].argvIndex = 
17a0: 69 4e 65 78 74 2b 2b 3b 0a 20 20 20 20 70 49 6e  iNext++;.    pIn
17b0: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
17c0: 74 20 3d 20 35 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 5;.  }else{.
17d0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75      pInfo->idxNu
17e0: 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f  m = 0;.    pInfo
17f0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
1800: 3d 20 32 30 30 30 30 3b 0a 20 20 20 20 69 66 28  = 20000;.    if(
1810: 20 69 47 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20   iGe>=0 ){.     
1820: 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 2b   pInfo->idxNum +
1830: 3d 20 46 54 53 34 41 55 58 5f 47 45 5f 43 4f 4e  = FTS4AUX_GE_CON
1840: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 70  STRAINT;.      p
1850: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1860: 74 55 73 61 67 65 5b 69 47 65 5d 2e 61 72 67 76  tUsage[iGe].argv
1870: 49 6e 64 65 78 20 3d 20 69 4e 65 78 74 2b 2b 3b  Index = iNext++;
1880: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73  .      pInfo->es
1890: 74 69 6d 61 74 65 64 43 6f 73 74 20 2f 3d 20 32  timatedCost /= 2
18a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18b0: 69 4c 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  iLe>=0 ){.      
18c0: 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 2b 3d  pInfo->idxNum +=
18d0: 20 46 54 53 34 41 55 58 5f 4c 45 5f 43 4f 4e 53   FTS4AUX_LE_CONS
18e0: 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 70 49  TRAINT;.      pI
18f0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
1900: 55 73 61 67 65 5b 69 4c 65 5d 2e 61 72 67 76 49  Usage[iLe].argvI
1910: 6e 64 65 78 20 3d 20 69 4e 65 78 74 2b 2b 3b 0a  ndex = iNext++;.
1920: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74        pInfo->est
1930: 69 6d 61 74 65 64 43 6f 73 74 20 2f 3d 20 32 3b  imatedCost /= 2;
1940: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1950: 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 7b 0a 20   iLangid>=0 ){. 
1960: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74     pInfo->aConst
1970: 72 61 69 6e 74 55 73 61 67 65 5b 69 4c 61 6e 67  raintUsage[iLang
1980: 69 64 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  id].argvIndex = 
1990: 69 4e 65 78 74 2b 2b 3b 0a 20 20 20 20 70 49 6e  iNext++;.    pIn
19a0: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
19b0: 74 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  t--;.  }..  retu
19c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19d0: 0a 2f 2a 0a 2a 2a 20 78 4f 70 65 6e 20 2d 20 4f  ./*.** xOpen - O
19e0: 70 65 6e 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  pen a cursor..*/
19f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1a00: 61 75 78 4f 70 65 6e 4d 65 74 68 6f 64 28 73 71  auxOpenMethod(sq
1a10: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61  lite3_vtab *pVTa
1a20: 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  b, sqlite3_vtab_
1a30: 63 75 72 73 6f 72 20 2a 2a 70 70 43 73 72 29 7b  cursor **ppCsr){
1a40: 0a 20 20 46 74 73 33 61 75 78 43 75 72 73 6f 72  .  Fts3auxCursor
1a50: 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20   *pCsr;         
1a60: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1a70: 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 74   cursor object t
1a80: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 55  o return */..  U
1a90: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1aa0: 70 56 54 61 62 29 3b 0a 0a 20 20 70 43 73 72 20  pVTab);..  pCsr 
1ab0: 3d 20 28 46 74 73 33 61 75 78 43 75 72 73 6f 72  = (Fts3auxCursor
1ac0: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
1ad0: 63 28 73 69 7a 65 6f 66 28 46 74 73 33 61 75 78  c(sizeof(Fts3aux
1ae0: 43 75 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20  Cursor));.  if( 
1af0: 21 70 43 73 72 20 29 20 72 65 74 75 72 6e 20 53  !pCsr ) return S
1b00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
1b10: 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73  emset(pCsr, 0, s
1b20: 69 7a 65 6f 66 28 46 74 73 33 61 75 78 43 75 72  izeof(Fts3auxCur
1b30: 73 6f 72 29 29 3b 0a 0a 20 20 2a 70 70 43 73 72  sor));..  *ppCsr
1b40: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62   = (sqlite3_vtab
1b50: 5f 63 75 72 73 6f 72 20 2a 29 70 43 73 72 3b 0a  _cursor *)pCsr;.
1b60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 43 6c  OK;.}../*.** xCl
1b80: 6f 73 65 20 2d 20 43 6c 6f 73 65 20 61 20 63 75  ose - Close a cu
1b90: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
1ba0: 69 6e 74 20 66 74 73 33 61 75 78 43 6c 6f 73 65  int fts3auxClose
1bb0: 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
1bc0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tab_cursor *pCur
1bd0: 73 6f 72 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  sor){.  Fts3Tabl
1be0: 65 20 2a 70 46 74 73 33 20 3d 20 28 28 46 74 73  e *pFts3 = ((Fts
1bf0: 33 61 75 78 54 61 62 6c 65 20 2a 29 70 43 75 72  3auxTable *)pCur
1c00: 73 6f 72 2d 3e 70 56 74 61 62 29 2d 3e 70 46 74  sor->pVtab)->pFt
1c10: 73 33 54 61 62 3b 0a 20 20 46 74 73 33 61 75 78  s3Tab;.  Fts3aux
1c20: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
1c30: 46 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a 29  Fts3auxCursor *)
1c40: 70 43 75 72 73 6f 72 3b 0a 0a 20 20 73 71 6c 69  pCursor;..  sqli
1c50: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
1c60: 6c 6f 73 65 28 70 46 74 73 33 29 3b 0a 20 20 73  lose(pFts3);.  s
1c70: 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
1c80: 64 65 72 46 69 6e 69 73 68 28 26 70 43 73 72 2d  derFinish(&pCsr-
1c90: 3e 63 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  >csr);.  sqlite3
1ca0: 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29 70 43  _free((void *)pC
1cb0: 73 72 2d 3e 66 69 6c 74 65 72 2e 7a 54 65 72 6d  sr->filter.zTerm
1cc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1cd0: 65 28 70 43 73 72 2d 3e 7a 53 74 6f 70 29 3b 0a  e(pCsr->zStop);.
1ce0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1cf0: 43 73 72 2d 3e 61 53 74 61 74 29 3b 0a 20 20 73  Csr->aStat);.  s
1d00: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
1d10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1d20: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
1d30: 20 69 6e 74 20 66 74 73 33 61 75 78 47 72 6f 77   int fts3auxGrow
1d40: 53 74 61 74 41 72 72 61 79 28 46 74 73 33 61 75  StatArray(Fts3au
1d50: 78 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69  xCursor *pCsr, i
1d60: 6e 74 20 6e 53 69 7a 65 29 7b 0a 20 20 69 66 28  nt nSize){.  if(
1d70: 20 6e 53 69 7a 65 3e 70 43 73 72 2d 3e 6e 53 74   nSize>pCsr->nSt
1d80: 61 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  at ){.    struct
1d90: 20 46 74 73 33 61 75 78 43 6f 6c 73 74 61 74 73   Fts3auxColstats
1da0: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
1db0: 20 3d 20 28 73 74 72 75 63 74 20 46 74 73 33 61   = (struct Fts3a
1dc0: 75 78 43 6f 6c 73 74 61 74 73 20 2a 29 73 71 6c  uxColstats *)sql
1dd0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
1de0: 43 73 72 2d 3e 61 53 74 61 74 2c 20 0a 20 20 20  Csr->aStat, .   
1df0: 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75       sizeof(stru
1e00: 63 74 20 46 74 73 33 61 75 78 43 6f 6c 73 74 61  ct Fts3auxColsta
1e10: 74 73 29 20 2a 20 6e 53 69 7a 65 0a 20 20 20 20  ts) * nSize.    
1e20: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
1e30: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1e40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
1e50: 6d 73 65 74 28 26 61 4e 65 77 5b 70 43 73 72 2d  mset(&aNew[pCsr-
1e60: 3e 6e 53 74 61 74 5d 2c 20 30 2c 20 0a 20 20 20  >nStat], 0, .   
1e70: 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75       sizeof(stru
1e80: 63 74 20 46 74 73 33 61 75 78 43 6f 6c 73 74 61  ct Fts3auxColsta
1e90: 74 73 29 20 2a 20 28 6e 53 69 7a 65 20 2d 20 70  ts) * (nSize - p
1ea0: 43 73 72 2d 3e 6e 53 74 61 74 29 0a 20 20 20 20  Csr->nStat).    
1eb0: 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 53 74  );.    pCsr->aSt
1ec0: 61 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70  at = aNew;.    p
1ed0: 43 73 72 2d 3e 6e 53 74 61 74 20 3d 20 6e 53 69  Csr->nStat = nSi
1ee0: 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ze;.  }.  return
1ef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f00: 2a 0a 2a 2a 20 78 4e 65 78 74 20 2d 20 41 64 76  *.** xNext - Adv
1f10: 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
1f20: 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2c  to the next row,
1f30: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74   if any..*/.stat
1f40: 69 63 20 69 6e 74 20 66 74 73 33 61 75 78 4e 65  ic int fts3auxNe
1f50: 78 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  xtMethod(sqlite3
1f60: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
1f70: 75 72 73 6f 72 29 7b 0a 20 20 46 74 73 33 61 75  ursor){.  Fts3au
1f80: 78 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  xCursor *pCsr = 
1f90: 28 46 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a  (Fts3auxCursor *
1fa0: 29 70 43 75 72 73 6f 72 3b 0a 20 20 46 74 73 33  )pCursor;.  Fts3
1fb0: 54 61 62 6c 65 20 2a 70 46 74 73 33 20 3d 20 28  Table *pFts3 = (
1fc0: 28 46 74 73 33 61 75 78 54 61 62 6c 65 20 2a 29  (Fts3auxTable *)
1fd0: 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 2d  pCursor->pVtab)-
1fe0: 3e 70 46 74 73 33 54 61 62 3b 0a 20 20 69 6e 74  >pFts3Tab;.  int
1ff0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65   rc;..  /* Incre
2000: 6d 65 6e 74 20 6f 75 72 20 70 72 65 74 65 6e 64  ment our pretend
2010: 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 2a 2f   rowid value. */
2020: 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b  .  pCsr->iRowid+
2030: 2b 3b 0a 0a 20 20 66 6f 72 28 70 43 73 72 2d 3e  +;..  for(pCsr->
2040: 69 43 6f 6c 2b 2b 3b 20 70 43 73 72 2d 3e 69 43  iCol++; pCsr->iC
2050: 6f 6c 3c 70 43 73 72 2d 3e 6e 53 74 61 74 3b 20  ol<pCsr->nStat; 
2060: 70 43 73 72 2d 3e 69 43 6f 6c 2b 2b 29 7b 0a 20  pCsr->iCol++){. 
2070: 20 20 20 69 66 28 20 70 43 73 72 2d 3e 61 53 74     if( pCsr->aSt
2080: 61 74 5b 70 43 73 72 2d 3e 69 43 6f 6c 5d 2e 6e  at[pCsr->iCol].n
2090: 44 6f 63 3e 30 20 29 20 72 65 74 75 72 6e 20 53  Doc>0 ) return S
20a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
20b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
20c0: 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70  3SegReaderStep(p
20d0: 46 74 73 33 2c 20 26 70 43 73 72 2d 3e 63 73 72  Fts3, &pCsr->csr
20e0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20f0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
2100: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nt i = 0;.    in
2110: 74 20 6e 44 6f 63 6c 69 73 74 20 3d 20 70 43 73  t nDoclist = pCs
2120: 72 2d 3e 63 73 72 2e 6e 44 6f 63 6c 69 73 74 3b  r->csr.nDoclist;
2130: 0a 20 20 20 20 63 68 61 72 20 2a 61 44 6f 63 6c  .    char *aDocl
2140: 69 73 74 20 3d 20 70 43 73 72 2d 3e 63 73 72 2e  ist = pCsr->csr.
2150: 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e  aDoclist;.    in
2160: 74 20 69 43 6f 6c 3b 0a 0a 20 20 20 20 69 6e 74  t iCol;..    int
2170: 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20   eState = 0;..  
2180: 20 20 69 66 28 20 70 43 73 72 2d 3e 7a 53 74 6f    if( pCsr->zSto
2190: 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  p ){.      int n
21a0: 20 3d 20 28 70 43 73 72 2d 3e 6e 53 74 6f 70 3c   = (pCsr->nStop<
21b0: 70 43 73 72 2d 3e 63 73 72 2e 6e 54 65 72 6d 29  pCsr->csr.nTerm)
21c0: 20 3f 20 70 43 73 72 2d 3e 6e 53 74 6f 70 20 3a   ? pCsr->nStop :
21d0: 20 70 43 73 72 2d 3e 63 73 72 2e 6e 54 65 72 6d   pCsr->csr.nTerm
21e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 63 20 3d  ;.      int mc =
21f0: 20 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a 53   memcmp(pCsr->zS
2200: 74 6f 70 2c 20 70 43 73 72 2d 3e 63 73 72 2e 7a  top, pCsr->csr.z
2210: 54 65 72 6d 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Term, n);.      
2220: 69 66 28 20 6d 63 3c 30 20 7c 7c 20 28 6d 63 3d  if( mc<0 || (mc=
2230: 3d 30 20 26 26 20 70 43 73 72 2d 3e 63 73 72 2e  =0 && pCsr->csr.
2240: 6e 54 65 72 6d 3e 70 43 73 72 2d 3e 6e 53 74 6f  nTerm>pCsr->nSto
2250: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  p) ){.        pC
2260: 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31 3b 0a 20  sr->isEof = 1;. 
2270: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2280: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2290: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
22a0: 66 74 73 33 61 75 78 47 72 6f 77 53 74 61 74 41  fts3auxGrowStatA
22b0: 72 72 61 79 28 70 43 73 72 2c 20 32 29 20 29 20  rray(pCsr, 2) ) 
22c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
22d0: 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  MEM;.    memset(
22e0: 70 43 73 72 2d 3e 61 53 74 61 74 2c 20 30 2c 20  pCsr->aStat, 0, 
22f0: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 46 74  sizeof(struct Ft
2300: 73 33 61 75 78 43 6f 6c 73 74 61 74 73 29 20 2a  s3auxColstats) *
2310: 20 70 43 73 72 2d 3e 6e 53 74 61 74 29 3b 0a 20   pCsr->nStat);. 
2320: 20 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 0a 20 20     iCol = 0;..  
2330: 20 20 77 68 69 6c 65 28 20 69 3c 6e 44 6f 63 6c    while( i<nDocl
2340: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ist ){.      sql
2350: 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d 20 30  ite3_int64 v = 0
2360: 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 73 71  ;..      i += sq
2370: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
2380: 6e 74 28 26 61 44 6f 63 6c 69 73 74 5b 69 5d 2c  nt(&aDoclist[i],
2390: 20 26 76 29 3b 0a 20 20 20 20 20 20 73 77 69 74   &v);.      swit
23a0: 63 68 28 20 65 53 74 61 74 65 20 29 7b 0a 20 20  ch( eState ){.  
23b0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20 30        /* State 0
23c0: 2e 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20  . In this state 
23d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6a 75 73 74  the integer just
23e0: 20 72 65 61 64 20 77 61 73 20 61 20 64 6f 63 69   read was a doci
23f0: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  d. */.        ca
2400: 73 65 20 30 3a 0a 20 20 20 20 20 20 20 20 20 20  se 0:.          
2410: 70 43 73 72 2d 3e 61 53 74 61 74 5b 30 5d 2e 6e  pCsr->aStat[0].n
2420: 44 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Doc++;.         
2430: 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20   eState = 1;.   
2440: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 30 3b         iCol = 0;
2450: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2460: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ;..        /* St
2470: 61 74 65 20 31 2e 20 49 6e 20 74 68 69 73 20 73  ate 1. In this s
2480: 74 61 74 65 20 77 65 20 61 72 65 20 65 78 70 65  tate we are expe
2490: 63 74 69 6e 67 20 65 69 74 68 65 72 20 61 20 31  cting either a 1
24a0: 2c 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  , indicating.   
24b0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65       ** that the
24c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67   following integ
24d0: 65 72 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6c  er will be a col
24e0: 75 6d 6e 20 6e 75 6d 62 65 72 2c 20 6f 72 20 74  umn number, or t
24f0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  he.        ** st
2500: 61 72 74 20 6f 66 20 61 20 70 6f 73 69 74 69 6f  art of a positio
2510: 6e 20 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d  n list for colum
2520: 6e 20 30 2e 20 20 0a 20 20 20 20 20 20 20 20 2a  n 0.  .        *
2530: 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  * .        ** Th
2540: 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63  e only differenc
2550: 65 20 62 65 74 77 65 65 6e 20 73 74 61 74 65 20  e between state 
2560: 31 20 61 6e 64 20 73 74 61 74 65 20 32 20 69 73  1 and state 2 is
2570: 20 74 68 61 74 20 69 66 20 74 68 65 0a 20 20 20   that if the.   
2580: 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20       ** integer 
2590: 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 73  encountered in s
25a0: 74 61 74 65 20 31 20 69 73 20 6e 6f 74 20 30 20  tate 1 is not 0 
25b0: 6f 72 20 31 2c 20 74 68 65 6e 20 77 65 20 6e 65  or 1, then we ne
25c0: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ed to.        **
25d0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63   increment the c
25e0: 6f 6c 75 6d 6e 20 30 20 22 6e 44 6f 63 22 20 63  olumn 0 "nDoc" c
25f0: 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 74 65  ount for this te
2600: 72 6d 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  rm..        */. 
2610: 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 0a 20         case 1:. 
2620: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2630: 20 69 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20   iCol==0 );.    
2640: 20 20 20 20 20 20 69 66 28 20 76 3e 31 20 29 7b        if( v>1 ){
2650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
2660: 72 2d 3e 61 53 74 61 74 5b 31 5d 2e 6e 44 6f 63  r->aStat[1].nDoc
2670: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
2680: 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
2690: 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20   = 2;.          
26a0: 2f 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* fall through 
26b0: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 63 61 73 65  */..        case
26c0: 20 32 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66   2:.          if
26d0: 28 20 76 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ( v==0 ){       
26e0: 2f 2a 20 30 78 30 30 2e 20 4e 65 78 74 20 69 6e  /* 0x00. Next in
26f0: 74 65 67 65 72 20 77 69 6c 6c 20 62 65 20 61 20  teger will be a 
2700: 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20  docid. */.      
2710: 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 30        eState = 0
2720: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2730: 65 20 69 66 28 20 76 3d 3d 31 20 29 7b 20 2f 2a  e if( v==1 ){ /*
2740: 20 30 78 30 31 2e 20 4e 65 78 74 20 69 6e 74 65   0x01. Next inte
2750: 67 65 72 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  ger will be a co
2760: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  lumn number. */.
2770: 20 20 20 20 20 20 20 20 20 20 20 20 65 53 74 61              eSta
2780: 74 65 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  te = 3;.        
2790: 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
27a0: 20 20 20 20 2f 2a 20 32 20 6f 72 20 67 72 65 61      /* 2 or grea
27b0: 74 65 72 2e 20 41 20 70 6f 73 69 74 69 6f 6e 2e  ter. A position.
27c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
27d0: 70 43 73 72 2d 3e 61 53 74 61 74 5b 69 43 6f 6c  pCsr->aStat[iCol
27e0: 2b 31 5d 2e 6e 4f 63 63 2b 2b 3b 0a 20 20 20 20  +1].nOcc++;.    
27f0: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 53          pCsr->aS
2800: 74 61 74 5b 30 5d 2e 6e 4f 63 63 2b 2b 3b 0a 20  tat[0].nOcc++;. 
2810: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2830: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20 33 2e       /* State 3.
2840: 20 54 68 65 20 69 6e 74 65 67 65 72 20 6a 75 73   The integer jus
2850: 74 20 72 65 61 64 20 69 73 20 61 20 63 6f 6c 75  t read is a colu
2860: 6d 6e 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  mn number. */.  
2870: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61        default: a
2880: 73 73 65 72 74 28 20 65 53 74 61 74 65 3d 3d 33  ssert( eState==3
2890: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43   );.          iC
28a0: 6f 6c 20 3d 20 28 69 6e 74 29 76 3b 0a 20 20 20  ol = (int)v;.   
28b0: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 33 61         if( fts3a
28c0: 75 78 47 72 6f 77 53 74 61 74 41 72 72 61 79 28  uxGrowStatArray(
28d0: 70 43 73 72 2c 20 69 43 6f 6c 2b 32 29 20 29 20  pCsr, iCol+2) ) 
28e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
28f0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  MEM;.          p
2900: 43 73 72 2d 3e 61 53 74 61 74 5b 69 43 6f 6c 2b  Csr->aStat[iCol+
2910: 31 5d 2e 6e 44 6f 63 2b 2b 3b 0a 20 20 20 20 20  1].nDoc++;.     
2920: 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b       eState = 2;
2930: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2950: 0a 20 20 20 20 70 43 73 72 2d 3e 69 43 6f 6c 20  .    pCsr->iCol 
2960: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
2970: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2980: 7b 0a 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f  {.    pCsr->isEo
2990: 66 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  f = 1;.  }.  ret
29a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29b0: 20 78 46 69 6c 74 65 72 20 2d 20 49 6e 69 74 69   xFilter - Initi
29c0: 61 6c 69 7a 65 20 61 20 63 75 72 73 6f 72 20 74  alize a cursor t
29d0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 73  o point at the s
29e0: 74 61 72 74 20 6f 66 20 69 74 73 20 64 61 74 61  tart of its data
29f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a00: 66 74 73 33 61 75 78 46 69 6c 74 65 72 4d 65 74  fts3auxFilterMet
2a10: 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  hod(.  sqlite3_v
2a20: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tab_cursor *pCur
2a30: 73 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75  sor,   /* The cu
2a40: 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74 68  rsor used for th
2a50: 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
2a60: 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20 20  t idxNum,       
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a80: 20 53 74 72 61 74 65 67 79 20 69 6e 64 65 78 20   Strategy index 
2a90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2aa0: 2a 69 64 78 53 74 72 2c 20 20 20 20 20 20 20 20  *idxStr,        
2ab0: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a       /* Unused *
2ac0: 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20  /.  int nVal,   
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2af0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70 56   elements in apV
2b00: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
2b10: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
2b20: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
2b30: 65 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e 64  ents for the ind
2b40: 65 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f 0a  exing scheme */.
2b50: 29 7b 0a 20 20 46 74 73 33 61 75 78 43 75 72 73  ){.  Fts3auxCurs
2b60: 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33  or *pCsr = (Fts3
2b70: 61 75 78 43 75 72 73 6f 72 20 2a 29 70 43 75 72  auxCursor *)pCur
2b80: 73 6f 72 3b 0a 20 20 46 74 73 33 54 61 62 6c 65  sor;.  Fts3Table
2b90: 20 2a 70 46 74 73 33 20 3d 20 28 28 46 74 73 33   *pFts3 = ((Fts3
2ba0: 61 75 78 54 61 62 6c 65 20 2a 29 70 43 75 72 73  auxTable *)pCurs
2bb0: 6f 72 2d 3e 70 56 74 61 62 29 2d 3e 70 46 74 73  or->pVtab)->pFts
2bc0: 33 54 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  3Tab;.  int rc;.
2bd0: 20 20 69 6e 74 20 69 73 53 63 61 6e 20 3d 20 30    int isScan = 0
2be0: 3b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 56 61 6c  ;.  int iLangVal
2bf0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2c00: 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
2c10: 69 64 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 0a  id to query */..
2c20: 20 20 69 6e 74 20 69 45 71 20 3d 20 2d 31 3b 20    int iEq = -1; 
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 65    /* Index of te
2c50: 72 6d 3d 3f 20 76 61 6c 75 65 20 69 6e 20 61 70  rm=? value in ap
2c60: 56 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 47 65  Val */.  int iGe
2c70: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
2c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2c90: 78 20 6f 66 20 74 65 72 6d 3e 3d 3f 20 76 61 6c  x of term>=? val
2ca0: 75 65 20 69 6e 20 61 70 56 61 6c 20 2a 2f 0a 20  ue in apVal */. 
2cb0: 20 69 6e 74 20 69 4c 65 20 3d 20 2d 31 3b 20 20   int iLe = -1;  
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 65 72   /* Index of ter
2ce0: 6d 3c 3d 3f 20 76 61 6c 75 65 20 69 6e 20 61 70  m<=? value in ap
2cf0: 56 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61  Val */.  int iLa
2d00: 6e 67 69 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  ngid = -1;      
2d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2d20: 78 20 6f 66 20 6c 61 6e 67 75 61 67 65 69 64 3d  x of languageid=
2d30: 3f 20 76 61 6c 75 65 20 69 6e 20 61 70 56 61 6c  ? value in apVal
2d40: 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 20   */.  int iNext 
2d50: 3d 20 30 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  = 0;..  UNUSED_P
2d60: 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a  ARAMETER(nVal);.
2d70: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d80: 45 52 28 69 64 78 53 74 72 29 3b 0a 0a 20 20 61  ER(idxStr);..  a
2d90: 73 73 65 72 74 28 20 69 64 78 53 74 72 3d 3d 30  ssert( idxStr==0
2da0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
2db0: 78 4e 75 6d 3d 3d 46 54 53 34 41 55 58 5f 45 51  xNum==FTS4AUX_EQ
2dc0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 7c 7c 20 69  _CONSTRAINT || i
2dd0: 64 78 4e 75 6d 3d 3d 30 0a 20 20 20 20 20 20 20  dxNum==0.       
2de0: 7c 7c 20 69 64 78 4e 75 6d 3d 3d 46 54 53 34 41  || idxNum==FTS4A
2df0: 55 58 5f 4c 45 5f 43 4f 4e 53 54 52 41 49 4e 54  UX_LE_CONSTRAINT
2e00: 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d 46 54 53 34   || idxNum==FTS4
2e10: 41 55 58 5f 47 45 5f 43 4f 4e 53 54 52 41 49 4e  AUX_GE_CONSTRAIN
2e20: 54 0a 20 20 20 20 20 20 20 7c 7c 20 69 64 78 4e  T.       || idxN
2e30: 75 6d 3d 3d 28 46 54 53 34 41 55 58 5f 4c 45 5f  um==(FTS4AUX_LE_
2e40: 43 4f 4e 53 54 52 41 49 4e 54 7c 46 54 53 34 41  CONSTRAINT|FTS4A
2e50: 55 58 5f 47 45 5f 43 4f 4e 53 54 52 41 49 4e 54  UX_GE_CONSTRAINT
2e60: 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 69 64  ).  );..  if( id
2e70: 78 4e 75 6d 3d 3d 46 54 53 34 41 55 58 5f 45 51  xNum==FTS4AUX_EQ
2e80: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
2e90: 20 20 20 69 45 71 20 3d 20 69 4e 65 78 74 2b 2b     iEq = iNext++
2ea0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2eb0: 73 53 63 61 6e 20 3d 20 31 3b 0a 20 20 20 20 69  sScan = 1;.    i
2ec0: 66 28 20 69 64 78 4e 75 6d 20 26 20 46 54 53 34  f( idxNum & FTS4
2ed0: 41 55 58 5f 47 45 5f 43 4f 4e 53 54 52 41 49 4e  AUX_GE_CONSTRAIN
2ee0: 54 20 29 7b 0a 20 20 20 20 20 20 69 47 65 20 3d  T ){.      iGe =
2ef0: 20 69 4e 65 78 74 2b 2b 3b 0a 20 20 20 20 7d 0a   iNext++;.    }.
2f00: 20 20 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26      if( idxNum &
2f10: 20 46 54 53 34 41 55 58 5f 4c 45 5f 43 4f 4e 53   FTS4AUX_LE_CONS
2f20: 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
2f30: 69 4c 65 20 3d 20 69 4e 65 78 74 2b 2b 3b 0a 20  iLe = iNext++;. 
2f40: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
2f50: 4e 65 78 74 3c 6e 56 61 6c 20 29 7b 0a 20 20 20  Next<nVal ){.   
2f60: 20 69 4c 61 6e 67 69 64 20 3d 20 69 4e 65 78 74   iLangid = iNext
2f70: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  ++;.  }..  /* In
2f80: 20 63 61 73 65 20 74 68 69 73 20 63 75 72 73 6f   case this curso
2f90: 72 20 69 73 20 62 65 69 6e 67 20 72 65 75 73 65  r is being reuse
2fa0: 64 2c 20 63 6c 6f 73 65 20 61 6e 64 20 7a 65 72  d, close and zer
2fb0: 6f 20 69 74 2e 20 2a 2f 0a 20 20 74 65 73 74 63  o it. */.  testc
2fc0: 61 73 65 28 70 43 73 72 2d 3e 66 69 6c 74 65 72  ase(pCsr->filter
2fd0: 2e 7a 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74  .zTerm);.  sqlit
2fe0: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46  e3Fts3SegReaderF
2ff0: 69 6e 69 73 68 28 26 70 43 73 72 2d 3e 63 73 72  inish(&pCsr->csr
3000: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3010: 65 28 28 76 6f 69 64 20 2a 29 70 43 73 72 2d 3e  e((void *)pCsr->
3020: 66 69 6c 74 65 72 2e 7a 54 65 72 6d 29 3b 0a 20  filter.zTerm);. 
3030: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
3040: 73 72 2d 3e 61 53 74 61 74 29 3b 0a 20 20 6d 65  sr->aStat);.  me
3050: 6d 73 65 74 28 26 70 43 73 72 2d 3e 63 73 72 2c  mset(&pCsr->csr,
3060: 20 30 2c 20 28 28 75 38 2a 29 26 70 43 73 72 5b   0, ((u8*)&pCsr[
3070: 31 5d 29 20 2d 20 28 75 38 2a 29 26 70 43 73 72  1]) - (u8*)&pCsr
3080: 2d 3e 63 73 72 29 3b 0a 0a 20 20 70 43 73 72 2d  ->csr);..  pCsr-
3090: 3e 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20  >filter.flags = 
30a0: 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51  FTS3_SEGMENT_REQ
30b0: 55 49 52 45 5f 50 4f 53 7c 46 54 53 33 5f 53 45  UIRE_POS|FTS3_SE
30c0: 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50  GMENT_IGNORE_EMP
30d0: 54 59 3b 0a 20 20 69 66 28 20 69 73 53 63 61 6e  TY;.  if( isScan
30e0: 20 29 20 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e   ) pCsr->filter.
30f0: 66 6c 61 67 73 20 7c 3d 20 46 54 53 33 5f 53 45  flags |= FTS3_SE
3100: 47 4d 45 4e 54 5f 53 43 41 4e 3b 0a 0a 20 20 69  GMENT_SCAN;..  i
3110: 66 28 20 69 45 71 3e 3d 30 20 7c 7c 20 69 47 65  f( iEq>=0 || iGe
3120: 3e 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=0 ){.    const
3130: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3140: 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  zStr = sqlite3_v
3150: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
3160: 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
3170: 20 28 69 45 71 3d 3d 30 20 26 26 20 69 47 65 3d   (iEq==0 && iGe=
3180: 3d 2d 31 29 20 7c 7c 20 28 69 45 71 3d 3d 2d 31  =-1) || (iEq==-1
3190: 20 26 26 20 69 47 65 3d 3d 30 29 20 29 3b 0a 20   && iGe==0) );. 
31a0: 20 20 20 69 66 28 20 7a 53 74 72 20 29 7b 0a 20     if( zStr ){. 
31b0: 20 20 20 20 20 70 43 73 72 2d 3e 66 69 6c 74 65       pCsr->filte
31c0: 72 2e 7a 54 65 72 6d 20 3d 20 73 71 6c 69 74 65  r.zTerm = sqlite
31d0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
31e0: 7a 53 74 72 29 3b 0a 20 20 20 20 20 20 69 66 28  zStr);.      if(
31f0: 20 70 43 73 72 2d 3e 66 69 6c 74 65 72 2e 7a 54   pCsr->filter.zT
3200: 65 72 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  erm==0 ) return 
3210: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
3220: 20 20 20 20 70 43 73 72 2d 3e 66 69 6c 74 65 72      pCsr->filter
3230: 2e 6e 54 65 72 6d 20 3d 20 28 69 6e 74 29 73 74  .nTerm = (int)st
3240: 72 6c 65 6e 28 70 43 73 72 2d 3e 66 69 6c 74 65  rlen(pCsr->filte
3250: 72 2e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  r.zTerm);.    }.
3260: 20 20 7d 0a 0a 20 20 69 66 28 20 69 4c 65 3e 3d    }..  if( iLe>=
3270: 30 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 7a  0 ){.    pCsr->z
3280: 53 74 6f 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Stop = sqlite3_m
3290: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
32a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
32b0: 61 70 56 61 6c 5b 69 4c 65 5d 29 29 3b 0a 20 20  apVal[iLe]));.  
32c0: 20 20 69 66 28 20 70 43 73 72 2d 3e 7a 53 74 6f    if( pCsr->zSto
32d0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
32e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
32f0: 70 43 73 72 2d 3e 6e 53 74 6f 70 20 3d 20 28 69  pCsr->nStop = (i
3300: 6e 74 29 73 74 72 6c 65 6e 28 70 43 73 72 2d 3e  nt)strlen(pCsr->
3310: 7a 53 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 0a 20  zStop);.  }.  . 
3320: 20 69 66 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20   if( iLangid>=0 
3330: 29 7b 0a 20 20 20 20 69 4c 61 6e 67 56 61 6c 20  ){.    iLangVal 
3340: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3350: 69 6e 74 28 61 70 56 61 6c 5b 69 4c 61 6e 67 69  int(apVal[iLangi
3360: 64 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  d]);..    /* If 
3370: 74 68 65 20 75 73 65 72 20 73 70 65 63 69 66 69  the user specifi
3380: 65 64 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  ed a negative va
3390: 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 6e 67  lue for the lang
33a0: 75 61 67 65 69 64 2c 20 75 73 65 20 7a 65 72 6f  uageid, use zero
33b0: 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61 64 2e  .    ** instead.
33c0: 20 54 68 69 73 20 77 6f 72 6b 73 2c 20 61 73 20   This works, as 
33d0: 74 68 65 20 22 6c 61 6e 67 75 61 67 65 69 64 3d  the "languageid=
33e0: 3f 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 69  ?" constraint wi
33f0: 6c 6c 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 62  ll also.    ** b
3400: 65 20 74 65 73 74 65 64 20 62 79 20 74 68 65 20  e tested by the 
3410: 56 44 42 45 20 6c 61 79 65 72 2e 20 54 68 65 20  VDBE layer. The 
3420: 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
3430: 20 62 65 20 66 61 6c 73 65 20 28 73 69 6e 63 65   be false (since
3440: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 6f 64  .    ** this mod
3450: 75 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 72 65 74  ule will not ret
3460: 75 72 6e 20 61 20 72 6f 77 20 77 69 74 68 20 61  urn a row with a
3470: 20 6e 65 67 61 74 69 76 65 20 6c 61 6e 67 75 61   negative langua
3480: 67 65 69 64 29 2c 20 61 6e 64 0a 20 20 20 20 2a  geid), and.    *
3490: 2a 20 73 6f 20 74 68 65 20 6f 76 65 72 61 6c 6c  * so the overall
34a0: 20 71 75 65 72 79 20 77 69 6c 6c 20 72 65 74 75   query will retu
34b0: 72 6e 20 7a 65 72 6f 20 72 6f 77 73 2e 20 20 2a  rn zero rows.  *
34c0: 2f 0a 20 20 20 20 69 66 28 20 69 4c 61 6e 67 56  /.    if( iLangV
34d0: 61 6c 3c 30 20 29 20 69 4c 61 6e 67 56 61 6c 20  al<0 ) iLangVal 
34e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 73 72 2d  = 0;.  }.  pCsr-
34f0: 3e 69 4c 61 6e 67 69 64 20 3d 20 69 4c 61 6e 67  >iLangid = iLang
3500: 56 61 6c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  Val;..  rc = sql
3510: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
3520: 72 43 75 72 73 6f 72 28 70 46 74 73 33 2c 20 69  rCursor(pFts3, i
3530: 4c 61 6e 67 56 61 6c 2c 20 30 2c 20 46 54 53 33  LangVal, 0, FTS3
3540: 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 2c 0a  _SEGCURSOR_ALL,.
3550: 20 20 20 20 20 20 70 43 73 72 2d 3e 66 69 6c 74        pCsr->filt
3560: 65 72 2e 7a 54 65 72 6d 2c 20 70 43 73 72 2d 3e  er.zTerm, pCsr->
3570: 66 69 6c 74 65 72 2e 6e 54 65 72 6d 2c 20 30 2c  filter.nTerm, 0,
3580: 20 69 73 53 63 61 6e 2c 20 26 70 43 73 72 2d 3e   isScan, &pCsr->
3590: 63 73 72 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  csr.  );.  if( r
35a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35c0: 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  Fts3SegReaderSta
35d0: 72 74 28 70 46 74 73 33 2c 20 26 70 43 73 72 2d  rt(pFts3, &pCsr-
35e0: 3e 63 73 72 2c 20 26 70 43 73 72 2d 3e 66 69 6c  >csr, &pCsr->fil
35f0: 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ter);.  }..  if(
3600: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3610: 20 72 63 20 3d 20 66 74 73 33 61 75 78 4e 65 78   rc = fts3auxNex
3620: 74 4d 65 74 68 6f 64 28 70 43 75 72 73 6f 72 29  tMethod(pCursor)
3630: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
3640: 0a 0a 2f 2a 0a 2a 2a 20 78 45 6f 66 20 2d 20 52  ../*.** xEof - R
3650: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
3660: 65 20 63 75 72 73 6f 72 20 69 73 20 61 74 20 45  e cursor is at E
3670: 4f 46 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  OF, or false oth
3680: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
3690: 63 20 69 6e 74 20 66 74 73 33 61 75 78 45 6f 66  c int fts3auxEof
36a0: 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
36b0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tab_cursor *pCur
36c0: 73 6f 72 29 7b 0a 20 20 46 74 73 33 61 75 78 43  sor){.  Fts3auxC
36d0: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
36e0: 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a 29 70  ts3auxCursor *)p
36f0: 43 75 72 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e  Cursor;.  return
3700: 20 70 43 73 72 2d 3e 69 73 45 6f 66 3b 0a 7d 0a   pCsr->isEof;.}.
3710: 0a 2f 2a 0a 2a 2a 20 78 43 6f 6c 75 6d 6e 20 2d  ./*.** xColumn -
3720: 20 52 65 74 75 72 6e 20 61 20 63 6f 6c 75 6d 6e   Return a column
3730: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
3740: 63 20 69 6e 74 20 66 74 73 33 61 75 78 43 6f 6c  c int fts3auxCol
3750: 75 6d 6e 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c  umnMethod(.  sql
3760: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
3770: 20 2a 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20   *pCursor,   /* 
3780: 43 75 72 73 6f 72 20 74 6f 20 72 65 74 72 69 65  Cursor to retrie
3790: 76 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f  ve value from */
37a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
37b0: 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
37c0: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f     /* Context fo
37d0: 72 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  r sqlite3_result
37e0: 5f 78 78 78 28 29 20 63 61 6c 6c 73 20 2a 2f 0a  _xxx() calls */.
37f0: 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20    int iCol      
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
3820: 6c 75 6d 6e 20 74 6f 20 72 65 61 64 20 76 61 6c  lumn to read val
3830: 75 65 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20  ue from */.){.  
3840: 46 74 73 33 61 75 78 43 75 72 73 6f 72 20 2a 70  Fts3auxCursor *p
3850: 20 3d 20 28 46 74 73 33 61 75 78 43 75 72 73 6f   = (Fts3auxCurso
3860: 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 0a 20 20  r *)pCursor;..  
3870: 61 73 73 65 72 74 28 20 70 2d 3e 69 73 45 6f 66  assert( p->isEof
3880: 3d 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ==0 );.  switch(
3890: 20 69 43 6f 6c 20 29 7b 0a 20 20 20 20 63 61 73   iCol ){.    cas
38a0: 65 20 30 3a 20 2f 2a 20 74 65 72 6d 20 2a 2f 0a  e 0: /* term */.
38b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
38c0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
38d0: 70 2d 3e 63 73 72 2e 7a 54 65 72 6d 2c 20 70 2d  p->csr.zTerm, p-
38e0: 3e 63 73 72 2e 6e 54 65 72 6d 2c 20 53 51 4c 49  >csr.nTerm, SQLI
38f0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
3900: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
3910: 20 63 61 73 65 20 31 3a 20 2f 2a 20 63 6f 6c 20   case 1: /* col 
3920: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
3930: 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  iCol ){.        
3940: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3950: 6e 74 28 70 43 74 78 2c 20 70 2d 3e 69 43 6f 6c  nt(pCtx, p->iCol
3960: 2d 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  -1);.      }else
3970: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3980: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
3990: 74 78 2c 20 22 2a 22 2c 20 2d 31 2c 20 53 51 4c  tx, "*", -1, SQL
39a0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
39b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
39c0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 32 3a 20 2f  ;..    case 2: /
39d0: 2a 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20  * documents */. 
39e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
39f0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
3a00: 70 2d 3e 61 53 74 61 74 5b 70 2d 3e 69 43 6f 6c  p->aStat[p->iCol
3a10: 5d 2e 6e 44 6f 63 29 3b 0a 20 20 20 20 20 20 62  ].nDoc);.      b
3a20: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
3a30: 33 3a 20 2f 2a 20 6f 63 63 75 72 72 65 6e 63 65  3: /* occurrence
3a40: 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  s */.      sqlit
3a50: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
3a60: 70 43 74 78 2c 20 70 2d 3e 61 53 74 61 74 5b 70  pCtx, p->aStat[p
3a70: 2d 3e 69 43 6f 6c 5d 2e 6e 4f 63 63 29 3b 0a 20  ->iCol].nOcc);. 
3a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
3a90: 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 6c 61 6e   default: /* lan
3aa0: 67 75 61 67 65 69 64 20 2a 2f 0a 20 20 20 20 20  guageid */.     
3ab0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 34   assert( iCol==4
3ac0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
3ad0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74  3_result_int(pCt
3ae0: 78 2c 20 70 2d 3e 69 4c 61 6e 67 69 64 29 3b 0a  x, p->iLangid);.
3af0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
3b00: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
3b10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  E_OK;.}../*.** x
3b20: 52 6f 77 69 64 20 2d 20 52 65 74 75 72 6e 20 74  Rowid - Return t
3b30: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64  he current rowid
3b40: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2e   for the cursor.
3b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
3b60: 74 73 33 61 75 78 52 6f 77 69 64 4d 65 74 68 6f  ts3auxRowidMetho
3b70: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  d(.  sqlite3_vta
3b80: 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  b_cursor *pCurso
3b90: 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74  r,   /* Cursor t
3ba0: 6f 20 72 65 74 72 69 65 76 65 20 76 61 6c 75 65  o retrieve value
3bb0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74   from */.  sqlit
3bc0: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 20  e_int64 *pRowid 
3bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
3be0: 54 3a 20 52 6f 77 69 64 20 76 61 6c 75 65 20 2a  T: Rowid value *
3bf0: 2f 0a 29 7b 0a 20 20 46 74 73 33 61 75 78 43 75  /.){.  Fts3auxCu
3c00: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
3c10: 73 33 61 75 78 43 75 72 73 6f 72 20 2a 29 70 43  s3auxCursor *)pC
3c20: 75 72 73 6f 72 3b 0a 20 20 2a 70 52 6f 77 69 64  ursor;.  *pRowid
3c30: 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 3b   = pCsr->iRowid;
3c40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3c50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
3c60: 67 69 73 74 65 72 20 74 68 65 20 66 74 73 33 61  gister the fts3a
3c70: 75 78 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64  ux module with d
3c80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3c90: 6f 6e 20 64 62 2e 20 52 65 74 75 72 6e 20 53 51  on db. Return SQ
3ca0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
3cb0: 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 65  ccessful or an e
3cc0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 71 6c  rror code if sql
3cd0: 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
3ce0: 6c 65 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  le() fails..*/.i
3cf0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e  nt sqlite3Fts3In
3d00: 69 74 41 75 78 28 73 71 6c 69 74 65 33 20 2a 64  itAux(sqlite3 *d
3d10: 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
3d20: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
3d30: 65 20 66 74 73 33 61 75 78 5f 6d 6f 64 75 6c 65  e fts3aux_module
3d40: 20 3d 20 7b 0a 20 20 20 20 20 30 2c 20 20 20 20   = {.     0,    
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
3d70: 6f 6e 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  on      */.     
3d80: 66 74 73 33 61 75 78 43 6f 6e 6e 65 63 74 4d 65  fts3auxConnectMe
3d90: 74 68 6f 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  thod,        /* 
3da0: 78 43 72 65 61 74 65 20 20 20 20 20 20 20 2a 2f  xCreate       */
3db0: 0a 20 20 20 20 20 66 74 73 33 61 75 78 43 6f 6e  .     fts3auxCon
3dc0: 6e 65 63 74 4d 65 74 68 6f 64 2c 20 20 20 20 20  nectMethod,     
3dd0: 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 20     /* xConnect  
3de0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73 33      */.     fts3
3df0: 61 75 78 42 65 73 74 49 6e 64 65 78 4d 65 74 68  auxBestIndexMeth
3e00: 6f 64 2c 20 20 20 20 20 20 2f 2a 20 78 42 65 73  od,      /* xBes
3e10: 74 49 6e 64 65 78 20 20 20 20 2a 2f 0a 20 20 20  tIndex    */.   
3e20: 20 20 66 74 73 33 61 75 78 44 69 73 63 6f 6e 6e    fts3auxDisconn
3e30: 65 63 74 4d 65 74 68 6f 64 2c 20 20 20 20 20 2f  ectMethod,     /
3e40: 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 20 20  * xDisconnect   
3e50: 2a 2f 0a 20 20 20 20 20 66 74 73 33 61 75 78 44  */.     fts3auxD
3e60: 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c  isconnectMethod,
3e70: 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79       /* xDestroy
3e80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74        */.     ft
3e90: 73 33 61 75 78 4f 70 65 6e 4d 65 74 68 6f 64 2c  s3auxOpenMethod,
3ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
3eb0: 70 65 6e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  pen         */. 
3ec0: 20 20 20 20 66 74 73 33 61 75 78 43 6c 6f 73 65      fts3auxClose
3ed0: 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20 20  Method,         
3ee0: 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20 20 20 20   /* xClose      
3ef0: 20 20 2a 2f 0a 20 20 20 20 20 66 74 73 33 61 75    */.     fts3au
3f00: 78 46 69 6c 74 65 72 4d 65 74 68 6f 64 2c 20 20  xFilterMethod,  
3f10: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
3f20: 72 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r       */.     
3f30: 66 74 73 33 61 75 78 4e 65 78 74 4d 65 74 68 6f  fts3auxNextMetho
3f40: 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
3f50: 78 4e 65 78 74 20 20 20 20 20 20 20 20 20 2a 2f  xNext         */
3f60: 0a 20 20 20 20 20 66 74 73 33 61 75 78 45 6f 66  .     fts3auxEof
3f70: 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 20 20  Method,         
3f80: 20 20 20 2f 2a 20 78 45 6f 66 20 20 20 20 20 20     /* xEof      
3f90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 66 74 73 33      */.     fts3
3fa0: 61 75 78 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 2c  auxColumnMethod,
3fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
3fc0: 75 6d 6e 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  umn       */.   
3fd0: 20 20 66 74 73 33 61 75 78 52 6f 77 69 64 4d 65    fts3auxRowidMe
3fe0: 74 68 6f 64 2c 20 20 20 20 20 20 20 20 20 20 2f  thod,          /
3ff0: 2a 20 78 52 6f 77 69 64 20 20 20 20 20 20 20 20  * xRowid        
4000: 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20 20  */.     0,      
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20       /* xUpdate 
4030: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c        */.     0,
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
4060: 65 67 69 6e 20 20 20 20 20 20 20 20 2a 2f 0a 20  egin        */. 
4070: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 2f 2a 20 78 53 79 6e 63 20 20 20 20 20 20 20   /* xSync       
40a0: 20 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20 20    */.     0,    
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69         /* xCommi
40d0: 74 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t       */.     
40e0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4100: 78 52 6f 6c 6c 62 61 63 6b 20 20 20 20 20 2a 2f  xRollback     */
4110: 0a 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  .     0,        
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 20 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74     /* xFindFunct
4140: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 30 2c 20 20  ion */.     0,  
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4160: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e           /* xRen
4170: 61 6d 65 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ame       */.   
4180: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41a0: 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 20 20 20  * xSavepoint    
41b0: 2a 2f 0a 20 20 20 20 20 30 2c 20 20 20 20 20 20  */.     0,      
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65       /* xRelease
41e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 30 2c        */.     0,
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
4210: 6f 6c 6c 62 61 63 6b 54 6f 20 20 20 2a 2f 0a 20  ollbackTo   */. 
4220: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d 65 20   /* xShadowName 
4250: 20 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    */.  };.  int 
4260: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
4270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
4280: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
4290: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
42a0: 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20  eate_module(db, 
42b0: 22 66 74 73 34 61 75 78 22 2c 20 26 66 74 73 33  "fts4aux", &fts3
42c0: 61 75 78 5f 6d 6f 64 75 6c 65 2c 20 30 29 3b 0a  aux_module, 0);.
42d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
42e0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
42f0: 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20  ed(SQLITE_CORE) 
4300: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
4310: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 2a  E_ENABLE_FTS3) *
4320: 2f 0a                                            /.