/ Hex Artifact Content
Login

Artifact da4ad7558c2284fdf3297f907e2c5454a2237e15:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** 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 66 6e  *****.**.*/.#ifn
0180: 64 65 66 20 5f 46 54 53 35 49 4e 54 5f 48 0a 23  def _FTS5INT_H.#
0190: 64 65 66 69 6e 65 20 5f 46 54 53 35 49 4e 54 5f  define _FTS5INT_
01a0: 48 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 74 73  H..#include "fts
01b0: 35 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73  5.h".#include "s
01c0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
01d0: 6c 75 64 65 20 22 66 74 73 33 5f 74 6f 6b 65 6e  lude "fts3_token
01e0: 69 7a 65 72 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20  izer.h".../*.** 
01f0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
0200: 66 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  f prefix indexes
0210: 20 6f 6e 20 73 69 6e 67 6c 65 20 46 54 53 35 20   on single FTS5 
0220: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 75 73 74  table. This must
0230: 20 62 65 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e   be.** less than
0240: 20 33 32 2e 20 49 66 20 69 74 20 69 73 20 73 65   32. If it is se
0250: 74 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 6c 61  t to anything la
0260: 72 67 65 20 74 68 61 6e 20 74 68 61 74 2c 20 61  rge than that, a
0270: 6e 20 23 65 72 72 6f 72 0a 2a 2a 20 64 69 72 65  n #error.** dire
0280: 63 74 69 76 65 20 69 6e 20 66 74 73 35 5f 69 6e  ctive in fts5_in
0290: 64 65 78 2e 63 20 77 69 6c 6c 20 63 61 75 73 65  dex.c will cause
02a0: 20 74 68 65 20 62 75 69 6c 64 20 74 6f 20 66 61   the build to fa
02b0: 69 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  il..*/.#define F
02c0: 54 53 35 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49  TS5_MAX_PREFIX_I
02d0: 4e 44 45 58 45 53 20 33 31 0a 0a 23 64 65 66 69  NDEXES 31..#defi
02e0: 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f  ne FTS5_DEFAULT_
02f0: 4e 45 41 52 44 49 53 54 20 31 30 0a 23 64 65 66  NEARDIST 10.#def
0300: 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54  ine FTS5_DEFAULT
0310: 5f 52 41 4e 4b 20 20 20 20 20 22 62 6d 32 35 22  _RANK     "bm25"
0320: 0a 0a 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 61 6e  ../* Name of ran
0330: 6b 20 61 6e 64 20 72 6f 77 69 64 20 63 6f 6c 75  k and rowid colu
0340: 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  mns */.#define F
0350: 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45 20 22 72  TS5_RANK_NAME "r
0360: 61 6e 6b 22 0a 23 64 65 66 69 6e 65 20 46 54 53  ank".#define FTS
0370: 35 5f 52 4f 57 49 44 5f 4e 41 4d 45 20 22 72 6f  5_ROWID_NAME "ro
0380: 77 69 64 22 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  wid"../*********
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03d0: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
03e0: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 2e 63  o code in fts5.c
03f0: 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  . .*/.typedef st
0400: 72 75 63 74 20 46 74 73 35 47 6c 6f 62 61 6c 20  ruct Fts5Global 
0410: 46 74 73 35 47 6c 6f 62 61 6c 3b 0a 0a 69 6e 74  Fts5Global;..int
0420: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 54   sqlite3Fts5GetT
0430: 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 46 74 73 35  okenizer(.  Fts5
0440: 47 6c 6f 62 61 6c 2a 2c 20 0a 20 20 63 6f 6e 73  Global*, .  cons
0450: 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a  t char **azArg,.
0460: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74    int nArg,.  Ft
0470: 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a 20  s5Tokenizer**,. 
0480: 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2a   fts5_tokenizer*
0490: 2a 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  *.);../*.** End 
04a0: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
04b0: 63 6f 64 65 20 69 6e 20 66 74 73 35 2e 63 2e 0a  code in fts5.c..
04c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
0510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0550: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
0560: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
0570: 20 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63 2e 20   fts5_config.c. 
0580: 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63 20 63 6f  fts5_config.c co
0590: 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e 73 20  ntains contains 
05a0: 63 6f 64 65 0a 2a 2a 20 74 6f 20 70 61 72 73 65  code.** to parse
05b0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70   the arguments p
05c0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 43 52 45  assed to the CRE
05d0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
05e0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
05f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0600: 46 74 73 35 43 6f 6e 66 69 67 20 46 74 73 35 43  Fts5Config Fts5C
0610: 6f 6e 66 69 67 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  onfig;../*.** An
0620: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0630: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0640: 74 75 72 65 20 65 6e 63 6f 64 65 73 20 61 6c 6c  ture encodes all
0650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
0660: 74 20 63 61 6e 0a 2a 2a 20 62 65 20 67 6c 65 61  t can.** be glea
0670: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 43 52 45  ned from the CRE
0680: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0690: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
06a0: 2a 2a 20 41 6e 64 20 61 6c 6c 20 69 6e 66 6f 72  ** And all infor
06b0: 6d 61 74 69 6f 6e 20 6c 6f 61 64 65 64 20 66 72  mation loaded fr
06c0: 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 66 69 67 20  om the %_config 
06d0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e 41 75  table..**.** nAu
06e0: 74 6f 6d 65 72 67 65 3a 0a 2a 2a 20 20 20 54 68  tomerge:.**   Th
06f0: 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  e minimum number
0700: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68 61   of segments tha
0710: 74 20 61 6e 20 61 75 74 6f 2d 6d 65 72 67 65 20  t an auto-merge 
0720: 6f 70 65 72 61 74 69 6f 6e 20 73 68 6f 75 6c 64  operation should
0730: 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 74 6f  .**   attempt to
0740: 20 6d 65 72 67 65 20 74 6f 67 65 74 68 65 72 2e   merge together.
0750: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 20 73 65   A value of 1 se
0760: 74 73 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  ts the object to
0770: 20 75 73 65 20 74 68 65 20 0a 2a 2a 20 20 20 63   use the .**   c
0780: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 64 65 66 61  ompile time defa
0790: 75 6c 74 2e 20 5a 65 72 6f 20 64 69 73 61 62 6c  ult. Zero disabl
07a0: 65 73 20 61 75 74 6f 2d 6d 65 72 67 65 20 61 6c  es auto-merge al
07b0: 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 72  together..*/.str
07c0: 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67 20 7b  uct Fts5Config {
07d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
0800: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  andle */.  char 
0810: 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
0820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
0830: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 46  tabase holding F
0840: 54 53 20 69 6e 64 65 78 20 28 65 2e 67 2e 20 22  TS index (e.g. "
0850: 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 63 68 61 72  main") */.  char
0860: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
0870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0880: 61 6d 65 20 6f 66 20 46 54 53 20 69 6e 64 65 78  ame of FTS index
0890: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
08d0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20  char **azCol;   
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
0900: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
0910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0920: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0930: 66 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  f prefix indexes
0940: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 72 65 66   */.  int *aPref
0950: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
0960: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 69        /* Sizes i
0970: 6e 20 62 79 74 65 73 20 6f 66 20 6e 50 72 65 66  n bytes of nPref
0980: 69 78 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ix prefix indexe
0990: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 43 6f 6e 74  s */.  int eCont
09a0: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
09b0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 46 54 53         /* An FTS
09c0: 35 5f 43 4f 4e 54 45 4e 54 20 76 61 6c 75 65 20  5_CONTENT value 
09d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
09e0: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
09f0: 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 6e 74 20       /* content 
0a00: 74 61 62 6c 65 20 2a 2f 20 0a 20 20 63 68 61 72  table */ .  char
0a10: 20 2a 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3b   *zContentRowid;
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22              /* "
0a30: 63 6f 6e 74 65 6e 74 5f 72 6f 77 69 64 3d 22 20  content_rowid=" 
0a40: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 20  option value */ 
0a50: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  .  Fts5Tokenizer
0a60: 20 2a 70 54 6f 6b 3b 0a 20 20 66 74 73 35 5f 74   *pTok;.  fts5_t
0a70: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 41 70  okenizer *pTokAp
0a80: 69 3b 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73 20  i;..  /* Values 
0a90: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20  loaded from the 
0aa0: 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65 20 2a  %_config table *
0ab0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b  /.  int iCookie;
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
0ae0: 65 64 20 77 68 65 6e 20 25 5f 63 6f 6e 66 69 67  ed when %_config
0af0: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a   is modified */.
0b00: 20 20 69 6e 74 20 70 67 73 7a 3b 20 20 20 20 20    int pgsz;     
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 2f 2a 20 41 70 70 72 6f 78 69 6d 61 74 65    /* Approximate
0b30: 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
0b40: 69 6e 20 25 5f 64 61 74 61 20 2a 2f 0a 20 20 69  in %_data */.  i
0b50: 6e 74 20 6e 41 75 74 6f 6d 65 72 67 65 3b 20 20  nt nAutomerge;  
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0b70: 2a 20 27 61 75 74 6f 6d 65 72 67 65 27 20 73 65  * 'automerge' se
0b80: 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  tting */.  int n
0b90: 43 72 69 73 69 73 4d 65 72 67 65 3b 20 20 20 20  CrisisMerge;    
0ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
0bb0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65  ximum allowed se
0bc0: 67 6d 65 6e 74 73 20 70 65 72 20 6c 65 76 65 6c  gments per level
0bd0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 61 6e   */.  char *zRan
0be0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
0bf0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
0c00: 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 2a   rank function *
0c10: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 41  /.  char *zRankA
0c20: 72 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  rgs;            
0c30: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
0c40: 20 74 6f 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f   to rank functio
0c50: 6e 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  n */.};..#define
0c60: 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f   FTS5_CONTENT_NO
0c70: 52 4d 41 4c 20 20 20 30 0a 23 64 65 66 69 6e 65  RMAL   0.#define
0c80: 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f   FTS5_CONTENT_NO
0c90: 4e 45 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65  NE     1.#define
0ca0: 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 45 58   FTS5_CONTENT_EX
0cb0: 54 45 52 4e 41 4c 20 32 0a 0a 0a 0a 69 6e 74 20  TERNAL 2....int 
0cc0: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
0cd0: 67 50 61 72 73 65 28 0a 20 20 20 20 46 74 73 35  gParse(.    Fts5
0ce0: 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65 33  Global*, sqlite3
0cf0: 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68  *, int, const ch
0d00: 61 72 20 2a 2a 2c 20 46 74 73 35 43 6f 6e 66 69  ar **, Fts5Confi
0d10: 67 2a 2a 2c 20 63 68 61 72 2a 2a 0a 29 3b 0a 76  g**, char**.);.v
0d20: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 43  oid sqlite3Fts5C
0d30: 6f 6e 66 69 67 46 72 65 65 28 46 74 73 35 43 6f  onfigFree(Fts5Co
0d40: 6e 66 69 67 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  nfig*);..int sql
0d50: 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 44 65  ite3Fts5ConfigDe
0d60: 63 6c 61 72 65 56 74 61 62 28 46 74 73 35 43 6f  clareVtab(Fts5Co
0d70: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 29 3b 0a  nfig *pConfig);.
0d80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
0d90: 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35  Tokenize(.  Fts5
0da0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
0dc0: 54 53 35 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  TS5 Configuratio
0dd0: 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  n object */.  co
0de0: 6e 73 74 20 63 68 61 72 20 2a 70 54 65 78 74 2c  nst char *pText,
0df0: 20 69 6e 74 20 6e 54 65 78 74 2c 20 20 20 2f 2a   int nText,   /*
0e00: 20 54 65 78 74 20 74 6f 20 74 6f 6b 65 6e 69 7a   Text to tokeniz
0e10: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74  e */.  void *pCt
0e20: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
0e30: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
0e40: 74 20 70 61 73 73 65 64 20 74 6f 20 78 54 6f 6b  t passed to xTok
0e50: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  en() */.  int (*
0e60: 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20 63  xToken)(void*, c
0e70: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2c  onst char*, int,
0e80: 20 69 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f 2a   int, int)    /*
0e90: 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 3b 0a   Callback */.);.
0ea0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
0eb0: 35 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a  5Dequote(char *z
0ec0: 29 3b 0a 0a 2f 2a 20 4c 6f 61 64 20 74 68 65 20  );../* Load the 
0ed0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
0ee0: 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65 20 2a  %_config table *
0ef0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
0f00: 35 43 6f 6e 66 69 67 4c 6f 61 64 28 46 74 73 35  5ConfigLoad(Fts5
0f10: 43 6f 6e 66 69 67 2a 2c 20 69 6e 74 29 3b 0a 0a  Config*, int);..
0f20: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  /* Set the value
0f30: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e   of a single con
0f40: 66 69 67 20 61 74 74 72 69 62 75 74 65 20 2a 2f  fig attribute */
0f50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
0f60: 43 6f 6e 66 69 67 53 65 74 56 61 6c 75 65 28 46  ConfigSetValue(F
0f70: 74 73 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73  ts5Config*, cons
0f80: 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33  t char*, sqlite3
0f90: 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 2a 29 3b 0a  _value*, int*);.
0fa0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
0fb0: 43 6f 6e 66 69 67 50 61 72 73 65 52 61 6e 6b 28  ConfigParseRank(
0fc0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 63 68 61  const char*, cha
0fd0: 72 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 0a 2f  r**, char**);../
0fe0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
0ff0: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
1000: 20 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63 2e 0a   fts5_config.c..
1010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
1060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
10b0: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
10c0: 20 66 74 73 35 5f 62 75 66 66 65 72 2e 63 2e 0a   fts5_buffer.c..
10d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  */../*.** Buffer
10e0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
10f0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 75 69 6c  incremental buil
1100: 64 69 6e 67 20 6f 66 20 73 74 72 69 6e 67 20 64  ding of string d
1110: 61 74 61 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ata..*/.typedef 
1120: 73 74 72 75 63 74 20 46 74 73 35 42 75 66 66 65  struct Fts5Buffe
1130: 72 20 46 74 73 35 42 75 66 66 65 72 3b 0a 73 74  r Fts5Buffer;.st
1140: 72 75 63 74 20 46 74 73 35 42 75 66 66 65 72 20  ruct Fts5Buffer 
1150: 7b 0a 20 20 75 38 20 2a 70 3b 0a 20 20 69 6e 74  {.  u8 *p;.  int
1160: 20 6e 3b 0a 20 20 69 6e 74 20 6e 53 70 61 63 65   n;.  int nSpace
1170: 3b 0a 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ;.};..int sqlite
1180: 33 46 74 73 35 42 75 66 66 65 72 47 72 6f 77 28  3Fts5BufferGrow(
1190: 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72  int*, Fts5Buffer
11a0: 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 73 71  *, int);.void sq
11b0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
11c0: 70 70 65 6e 64 56 61 72 69 6e 74 28 69 6e 74 2a  ppendVarint(int*
11d0: 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69  , Fts5Buffer*, i
11e0: 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  64);.void sqlite
11f0: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1200: 64 42 6c 6f 62 28 69 6e 74 2a 2c 20 46 74 73 35  dBlob(int*, Fts5
1210: 42 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63 6f  Buffer*, int, co
1220: 6e 73 74 20 75 38 2a 29 3b 0a 76 6f 69 64 20 73  nst u8*);.void s
1230: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1240: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 69 6e 74  AppendString(int
1250: 20 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c   *, Fts5Buffer*,
1260: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 76   const char*);.v
1270: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
1280: 75 66 66 65 72 46 72 65 65 28 46 74 73 35 42 75  ufferFree(Fts5Bu
1290: 66 66 65 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  ffer*);.void sql
12a0: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
12b0: 72 6f 28 46 74 73 35 42 75 66 66 65 72 2a 29 3b  ro(Fts5Buffer*);
12c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
12d0: 35 42 75 66 66 65 72 53 65 74 28 69 6e 74 2a 2c  5BufferSet(int*,
12e0: 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69 6e   Fts5Buffer*, in
12f0: 74 2c 20 63 6f 6e 73 74 20 75 38 2a 29 3b 0a 76  t, const u8*);.v
1300: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
1310: 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
1320: 66 28 69 6e 74 20 2a 2c 20 46 74 73 35 42 75 66  f(int *, Fts5Buf
1330: 66 65 72 2a 2c 20 63 68 61 72 20 2a 7a 46 6d 74  fer*, char *zFmt
1340: 2c 20 2e 2e 2e 29 3b 0a 76 6f 69 64 20 73 71 6c  , ...);.void sql
1350: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1360: 70 65 6e 64 4c 69 73 74 45 6c 65 6d 28 69 6e 74  pendListElem(int
1370: 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
1380: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
1390: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
13a0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 33  ts5BufferAppend3
13b0: 32 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66  2(int*, Fts5Buff
13c0: 65 72 2a 2c 20 69 6e 74 29 3b 0a 0a 23 64 65 66  er*, int);..#def
13d0: 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 5a 65  ine fts5BufferZe
13e0: 72 6f 28 78 29 20 20 20 20 20 20 20 20 20 20 20  ro(x)           
13f0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1400: 66 65 72 5a 65 72 6f 28 78 29 0a 23 64 65 66 69  ferZero(x).#defi
1410: 6e 65 20 66 74 73 35 42 75 66 66 65 72 47 72 6f  ne fts5BufferGro
1420: 77 28 61 2c 62 2c 63 29 20 20 20 20 20 20 20 20  w(a,b,c)        
1430: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1440: 65 72 47 72 6f 77 28 61 2c 62 2c 63 29 0a 23 64  erGrow(a,b,c).#d
1450: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
1460: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 61 2c 62  AppendVarint(a,b
1470: 2c 63 29 20 73 71 6c 69 74 65 33 46 74 73 35 42  ,c) sqlite3Fts5B
1480: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1490: 74 28 61 2c 62 2c 63 29 0a 23 64 65 66 69 6e 65  t(a,b,c).#define
14a0: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
14b0: 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20 73  a)             s
14c0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
14d0: 46 72 65 65 28 61 29 0a 23 64 65 66 69 6e 65 20  Free(a).#define 
14e0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
14f0: 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20 73 71  Blob(a,b,c,d) sq
1500: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1510: 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c  ppendBlob(a,b,c,
1520: 64 29 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42  d).#define fts5B
1530: 75 66 66 65 72 53 65 74 28 61 2c 62 2c 63 2c 64  ufferSet(a,b,c,d
1540: 29 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  )        sqlite3
1550: 46 74 73 35 42 75 66 66 65 72 53 65 74 28 61 2c  Fts5BufferSet(a,
1560: 62 2c 63 2c 64 29 0a 23 64 65 66 69 6e 65 20 66  b,c,d).#define f
1570: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 33  ts5BufferAppend3
1580: 32 28 61 2c 62 2c 63 29 20 20 20 20 20 73 71 6c  2(a,b,c)     sql
1590: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
15a0: 70 65 6e 64 33 32 28 61 2c 62 2c 63 29 0a 0a 2f  pend32(a,b,c)../
15b0: 2a 20 57 72 69 74 65 20 61 6e 64 20 64 65 63 6f  * Write and deco
15c0: 64 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32  de big-endian 32
15d0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
15e0: 75 65 73 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ues */.void sqli
15f0: 74 65 33 46 74 73 35 50 75 74 33 32 28 75 38 2a  te3Fts5Put32(u8*
1600: 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69  , int);.int sqli
1610: 74 65 33 46 74 73 35 47 65 74 33 32 28 63 6f 6e  te3Fts5Get32(con
1620: 73 74 20 75 38 2a 29 3b 0a 0a 23 64 65 66 69 6e  st u8*);..#defin
1630: 65 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  e FTS5_POS2COLUM
1640: 4e 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69 50  N(iPos) (int)(iP
1650: 6f 73 20 3e 3e 20 33 32 29 0a 23 64 65 66 69 6e  os >> 32).#defin
1660: 65 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45  e FTS5_POS2OFFSE
1670: 54 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69 50  T(iPos) (int)(iP
1680: 6f 73 20 26 20 30 78 46 46 46 46 46 46 46 46 29  os & 0xFFFFFFFF)
1690: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
16a0: 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
16b0: 65 72 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65  er Fts5PoslistRe
16c0: 61 64 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73  ader;.struct Fts
16d0: 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 7b  5PoslistReader {
16e0: 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20  .  /* Variables 
16f0: 75 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 71 6c  used only by sql
1700: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 49  ite3Fts5PoslistI
1710: 74 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f  terXXX() functio
1720: 6e 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ns. */.  int iCo
1730: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 28           /* If (
1750: 69 43 6f 6c 3e 3d 30 29 2c 20 74 68 69 73 20 63  iCol>=0), this c
1760: 6f 6c 75 6d 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20  olumn only */.  
1770: 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20 20 20  const u8 *a;    
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74  /* Position list
17a0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
17b0: 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ugh */.  int n; 
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
17e0: 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 61 5b   of buffer at a[
17f0: 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
1800: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  /* Current offse
1830: 74 20 69 6e 20 61 5b 5d 20 2a 2f 0a 0a 20 20 2f  t in a[] */..  /
1840: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
1850: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66  es */.  int bEof
1860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1870: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
1880: 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  o true at EOF */
1890: 0a 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20 20  .  i64 iPos;    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33 32 29     /* (iCol<<32)
18c0: 20 2b 20 69 50 6f 73 20 2a 2f 0a 7d 3b 0a 69 6e   + iPos */.};.in
18d0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  t sqlite3Fts5Pos
18e0: 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 0a  listReaderInit(.
18f0: 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 2f 2a 20 49 66 20 28 69 43 6f 6c 3e 3d 30    /* If (iCol>=0
1920: 29 2c 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f  ), this column o
1930: 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nly */.  const u
1940: 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20  8 *a, int n,    
1950: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c           /* Posl
1960: 69 73 74 20 62 75 66 66 65 72 20 74 6f 20 69 74  ist buffer to it
1970: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
1980: 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65  .  Fts5PoslistRe
1990: 61 64 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  ader *pIter     
19a0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f     /* Iterator o
19b0: 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c  bject to initial
19c0: 69 7a 65 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71  ize */.);.int sq
19d0: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
19e0: 52 65 61 64 65 72 4e 65 78 74 28 46 74 73 35 50  ReaderNext(Fts5P
19f0: 6f 73 6c 69 73 74 52 65 61 64 65 72 2a 29 3b 0a  oslistReader*);.
1a00: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1a10: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
1a20: 72 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69  r Fts5PoslistWri
1a30: 74 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35  ter;.struct Fts5
1a40: 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 7b 0a  PoslistWriter {.
1a50: 20 20 69 36 34 20 69 50 72 65 76 3b 0a 7d 3b 0a    i64 iPrev;.};.
1a60: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
1a70: 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65  oslistWriterAppe
1a80: 6e 64 28 46 74 73 35 42 75 66 66 65 72 2a 2c 20  nd(Fts5Buffer*, 
1a90: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
1aa0: 72 2a 2c 20 69 36 34 29 3b 0a 0a 69 6e 74 20 73  r*, i64);..int s
1ab0: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1ac0: 74 4e 65 78 74 28 0a 20 20 63 6f 6e 73 74 20 75  tNext(.  const u
1ad0: 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20  8 *a, int n,    
1ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
1af0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 6f  er containing po
1b00: 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  slist */.  int *
1b10: 70 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pi,             
1b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
1b30: 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20 77 69 74  /OUT: Offset wit
1b40: 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  hin a[] */.  int
1b50: 20 2a 70 69 43 6f 6c 2c 20 20 20 20 20 20 20 20   *piCol,        
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b70: 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1b80: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
1b90: 2a 70 69 4f 66 66 20 20 20 20 20 20 20 20 20 20  *piOff          
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1bb0: 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 74  N/OUT: Current t
1bc0: 6f 6b 65 6e 20 6f 66 66 73 65 74 20 2a 2f 0a 29  oken offset */.)
1bd0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
1be0: 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
1bf0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  .  const u8 *a, 
1c00: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
1c10: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
1c20: 74 61 69 6e 69 6e 67 20 70 6f 73 6c 69 73 74 20  taining poslist 
1c30: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 2c 20 20 20  */.  int *pi,   
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1c60: 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 61 5b  Offset within a[
1c70: 5d 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4f 66  ] */.  i64 *piOf
1c80: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
1c90: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
1ca0: 3a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  : Current offset
1cb0: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 20 4d 61 6c 6c 6f   */.);../* Mallo
1cc0: 63 20 75 74 69 6c 69 74 79 20 2a 2f 0a 76 6f 69  c utility */.voi
1cd0: 64 20 2a 73 71 6c 69 74 65 33 46 74 73 35 4d 61  d *sqlite3Fts5Ma
1ce0: 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74 20 2a 70 52  llocZero(int *pR
1cf0: 63 2c 20 69 6e 74 20 6e 42 79 74 65 29 3b 0a 0a  c, int nByte);..
1d00: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
1d10: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
1d20: 6e 20 66 74 73 35 5f 62 75 66 66 65 72 2e 63 2e  n fts5_buffer.c.
1d30: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
1d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
1dd0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
1de0: 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e 63 2e 20  n fts5_index.c. 
1df0: 66 74 73 35 5f 69 6e 64 65 78 2e 63 20 63 6f 6e  fts5_index.c con
1e00: 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e 73 20 63  tains contains c
1e10: 6f 64 65 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  ode.** to access
1e20: 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   the data stored
1e30: 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74   in the %_data t
1e40: 61 62 6c 65 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65  able..*/..typede
1e50: 66 20 73 74 72 75 63 74 20 46 74 73 35 49 6e 64  f struct Fts5Ind
1e60: 65 78 20 46 74 73 35 49 6e 64 65 78 3b 0a 74 79  ex Fts5Index;.ty
1e70: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
1e80: 35 49 6e 64 65 78 49 74 65 72 20 46 74 73 35 49  5IndexIter Fts5I
1e90: 6e 64 65 78 49 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a  ndexIter;../*.**
1ea0: 20 56 61 6c 75 65 73 20 75 73 65 64 20 61 73 20   Values used as 
1eb0: 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 67  part of the flag
1ec0: 73 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  s argument passe
1ed0: 64 20 74 6f 20 49 6e 64 65 78 51 75 65 72 79 28  d to IndexQuery(
1ee0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  )..*/.#define FT
1ef0: 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
1f00: 45 46 49 58 20 30 78 30 30 30 31 20 20 20 20 20  EFIX 0x0001     
1f10: 20 20 2f 2a 20 50 72 65 66 69 78 20 71 75 65 72    /* Prefix quer
1f20: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  y */.#define FTS
1f30: 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 41 53 43  5INDEX_QUERY_ASC
1f40: 20 20 20 20 30 78 30 30 30 32 20 20 20 20 20 20      0x0002      
1f50: 20 2f 2a 20 44 6f 63 73 20 69 6e 20 61 73 63 65   /* Docs in asce
1f60: 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
1f70: 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r */../*.** Crea
1f80: 74 65 2f 64 65 73 74 72 6f 79 20 61 6e 20 46 74  te/destroy an Ft
1f90: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a  s5Index object..
1fa0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
1fb0: 73 35 49 6e 64 65 78 4f 70 65 6e 28 46 74 73 35  s5IndexOpen(Fts5
1fc0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
1fd0: 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 46 74   int bCreate, Ft
1fe0: 73 35 49 6e 64 65 78 2a 2a 2c 20 63 68 61 72 2a  s5Index**, char*
1ff0: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  *);.int sqlite3F
2000: 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74  ts5IndexClose(Ft
2010: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
2020: 62 44 65 73 74 72 6f 79 29 3b 0a 0a 2f 2a 0a 2a  bDestroy);../*.*
2030: 2a 20 66 6f 72 28 0a 2a 2a 20 20 20 70 49 74 65  * for(.**   pIte
2040: 72 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  r = sqlite3Fts5I
2050: 6e 64 65 78 51 75 65 72 79 28 70 2c 20 22 74 6f  ndexQuery(p, "to
2060: 6b 65 6e 22 2c 20 35 2c 20 30 29 3b 0a 2a 2a 20  ken", 5, 0);.** 
2070: 20 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35    0==sqlite3Fts5
2080: 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 3b 0a  IterEof(pIter);.
2090: 2a 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  **   sqlite3Fts5
20a0: 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 0a  IterNext(pIter).
20b0: 2a 2a 20 29 7b 0a 2a 2a 20 20 20 69 36 34 20 69  ** ){.**   i64 i
20c0: 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 46  Docid = sqlite3F
20d0: 74 73 35 49 6e 64 65 78 44 6f 63 69 64 28 70 49  ts5IndexDocid(pI
20e0: 74 65 72 29 3b 0a 2a 2a 20 7d 0a 2a 2f 0a 0a 2f  ter);.** }.*/../
20f0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
2100: 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72  iterator to iter
2110: 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 64  ate though all d
2120: 6f 63 69 64 73 20 74 68 61 74 20 6d 61 74 63 68  ocids that match
2130: 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69   the .** specifi
2140: 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  ed token or toke
2150: 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74  n prefix..*/.int
2160: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2170: 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e  xQuery(.  Fts5In
2180: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
2190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
21a0: 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20   index to query 
21b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
21c0: 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
21d0: 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f  ken, /* Token (o
21e0: 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65  r prefix) to que
21f0: 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
2200: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2220: 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
2230: 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a  _QUERY_X flags *
2240: 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
2250: 72 20 2a 2a 70 70 49 74 65 72 0a 29 3b 0a 0a 2f  r **ppIter.);../
2260: 2a 0a 2a 2a 20 44 6f 63 69 64 20 6c 69 73 74 20  *.** Docid list 
2270: 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  iteration..*/.in
2280: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
2290: 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74  rEof(Fts5IndexIt
22a0: 65 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  er*);.int sqlite
22b0: 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74  3Fts5IterNext(Ft
22c0: 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69  s5IndexIter*);.i
22d0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
22e0: 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49  erNextFrom(Fts5I
22f0: 6e 64 65 78 49 74 65 72 2a 2c 20 69 36 34 20 69  ndexIter*, i64 i
2300: 4d 61 74 63 68 29 3b 0a 69 36 34 20 73 71 6c 69  Match);.i64 sqli
2310: 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64  te3Fts5IterRowid
2320: 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29  (Fts5IndexIter*)
2330: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  ;../*.** Obtain 
2340: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
2350: 74 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  t that correspon
2360: 64 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ds to the curren
2370: 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 69  t position..*/.i
2380: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
2390: 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e  erPoslist(Fts5In
23a0: 64 65 78 49 74 65 72 2a 2c 20 63 6f 6e 73 74 20  dexIter*, const 
23b0: 75 38 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 6e  u8 **pp, int *pn
23c0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  );../*.** Close 
23d0: 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e  an iterator open
23e0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 74 73  ed by sqlite3Fts
23f0: 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a  5IndexQuery()..*
2400: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
2410: 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35  s5IterClose(Fts5
2420: 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 2f 2a  IndexIter*);../*
2430: 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
2440: 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
2450: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
2460: 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
2470: 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
2480: 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
2490: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
24a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
24b0: 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
24c0: 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
24d0: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
24e0: 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
24f0: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
2500: 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
2510: 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
2520: 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
2530: 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
2540: 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
2550: 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
2560: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
2570: 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
2580: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
2590: 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
25a0: 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
25b0: 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
25c0: 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
25d0: 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e   a delete..*/.in
25e0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
25f0: 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
2600: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
2630: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
2660: 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
2670: 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
2680: 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
26b0: 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
26c0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
26d0: 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
26e0: 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
26f0: 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
2700: 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
2710: 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a 0a 2f  m index */.);../
2720: 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
2730: 61 74 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  at subsequent ca
2740: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
2750: 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
2760: 65 72 74 61 69 6e 20 74 6f 0a 2a 2a 20 64 6f 63  ertain to.** doc
2770: 75 6d 65 6e 74 20 69 44 6f 63 69 64 2e 0a 2a 2f  ument iDocid..*/
2780: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2790: 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28  IndexBeginWrite(
27a0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
27d0: 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
27e0: 20 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20   iDocid         
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2800: 44 6f 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20  Docid to add or 
2810: 72 65 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d  remove data from
2820: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c   */.);../*.** Fl
2830: 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
2840: 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
2850: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
2860: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2870: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  ..** If the bCom
2880: 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
2890: 2c 20 61 6c 73 6f 20 63 6c 6f 73 65 20 61 6e 79  , also close any
28a0: 20 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c   open blob handl
28b0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
28c0: 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28  e3Fts5IndexSync(
28d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
28e0: 74 20 62 43 6f 6d 6d 69 74 29 3b 0a 0a 2f 2a 0a  t bCommit);../*.
28f0: 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64  ** Discard any d
2900: 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
2910: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
2920: 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20   tables. Do not 
2930: 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74  write it.** to t
2940: 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
2950: 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  itionally, assum
2960: 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  e that the conte
2970: 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
2980: 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68  a.** table may h
2990: 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64  ave changed on d
29a0: 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d  isk. So any in-m
29b0: 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20  emory caches of 
29c0: 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72  %_data .** recor
29d0: 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
29e0: 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  idated..*/.int s
29f0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
2a00: 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65  ollback(Fts5Inde
2a10: 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  x *p);../*.** Re
2a20: 74 72 69 65 76 65 20 61 6e 64 20 63 6c 65 61 72  trieve and clear
2a30: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 72 72   the current err
2a40: 6f 72 20 63 6f 64 65 2c 20 72 65 73 70 65 63 74  or code, respect
2a50: 69 76 65 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ively..*/.int sq
2a60: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 72  lite3Fts5IndexEr
2a70: 72 63 6f 64 65 28 46 74 73 35 49 6e 64 65 78 2a  rcode(Fts5Index*
2a80: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
2a90: 74 73 35 49 6e 64 65 78 52 65 73 65 74 28 46 74  ts5IndexReset(Ft
2aa0: 73 35 49 6e 64 65 78 2a 29 3b 0a 0a 2f 2a 0a 2a  s5Index*);../*.*
2ab0: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
2ac0: 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
2ad0: 72 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rd..*/.int sqlit
2ae0: 65 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76  e3Fts5IndexGetAv
2af0: 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
2b00: 20 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20   *p, Fts5Buffer 
2b10: 2a 70 42 75 66 29 3b 0a 69 6e 74 20 73 71 6c 69  *pBuf);.int sqli
2b20: 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
2b30: 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
2b40: 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 2a 2c  x *p, const u8*,
2b50: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 75   int);../*.** Fu
2b60: 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 65 64 20 62  nctions called b
2b70: 79 20 74 68 65 20 73 74 6f 72 61 67 65 20 6d 6f  y the storage mo
2b80: 64 75 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  dule as part of 
2b90: 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e  integrity-check.
2ba0: 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46  .*/.u64 sqlite3F
2bb0: 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 46 74  ts5IndexCksum(Ft
2bc0: 73 35 43 6f 6e 66 69 67 2a 2c 69 36 34 2c 69 6e  s5Config*,i64,in
2bd0: 74 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  t,int,const char
2be0: 2a 2c 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69  *,int);.int sqli
2bf0: 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65  te3Fts5IndexInte
2c00: 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49  grityCheck(Fts5I
2c10: 6e 64 65 78 2a 2c 20 75 36 34 20 63 6b 73 75 6d  ndex*, u64 cksum
2c20: 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 65  );../* .** Calle
2c30: 64 20 64 75 72 69 6e 67 20 76 69 72 74 75 61 6c  d during virtual
2c40: 20 6d 6f 64 75 6c 65 20 69 6e 69 74 69 61 6c 69   module initiali
2c50: 7a 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74  zation to regist
2c60: 65 72 20 55 44 46 20 0a 2a 2a 20 66 74 73 35 5f  er UDF .** fts5_
2c70: 64 65 63 6f 64 65 28 29 20 77 69 74 68 20 53 51  decode() with SQ
2c80: 4c 69 74 65 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  Lite .*/.int sql
2c90: 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69  ite3Fts5IndexIni
2ca0: 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e  t(sqlite3*);..in
2cb0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2cc0: 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35  exSetCookie(Fts5
2cd0: 49 6e 64 65 78 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  Index*, int);../
2ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2cf0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2d00: 65 6e 74 72 69 65 73 20 72 65 61 64 20 66 72 6f  entries read fro
2d10: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
2d20: 6c 65 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 63  le by .** this c
2d30: 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
2d40: 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  it was created..
2d50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2d60: 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73  s5IndexReads(Fts
2d70: 35 49 6e 64 65 78 20 2a 70 29 3b 0a 0a 69 6e 74  5Index *p);..int
2d80: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2d90: 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65  xReinit(Fts5Inde
2da0: 78 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74  x *p);.int sqlit
2db0: 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d  e3Fts5IndexOptim
2dc0: 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ize(Fts5Index *p
2dd0: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
2de0: 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66  ts5IndexLoadConf
2df0: 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ig(Fts5Index *p)
2e00: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
2e10: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 63 6f  s5GetVarint32(co
2e20: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2e30: 72 20 2a 70 2c 20 75 33 32 20 2a 76 29 3b 0a 23  r *p, u32 *v);.#
2e40: 64 65 66 69 6e 65 20 66 74 73 35 47 65 74 56 61  define fts5GetVa
2e50: 72 69 6e 74 33 32 28 61 2c 62 29 20 73 71 6c 69  rint32(a,b) sqli
2e60: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2e70: 33 32 28 61 2c 28 75 33 32 2a 29 26 62 29 0a 0a  32(a,(u32*)&b)..
2e80: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
2e90: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
2ea0: 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e 63 2e 0a  n fts5_index.c..
2eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
2f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f40: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
2f50: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
2f60: 20 66 74 73 35 5f 68 61 73 68 2e 63 2e 20 0a 2a   fts5_hash.c. .*
2f70: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2f80: 20 46 74 73 35 48 61 73 68 20 46 74 73 35 48 61   Fts5Hash Fts5Ha
2f90: 73 68 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  sh;../*.** Creat
2fa0: 65 20 61 20 68 61 73 68 20 74 61 62 6c 65 2c 20  e a hash table, 
2fb0: 66 72 65 65 20 61 20 68 61 73 68 20 74 61 62 6c  free a hash tabl
2fc0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2fd0: 33 46 74 73 35 48 61 73 68 4e 65 77 28 46 74 73  3Fts5HashNew(Fts
2fe0: 35 48 61 73 68 2a 2a 2c 20 69 6e 74 20 2a 70 6e  5Hash**, int *pn
2ff0: 53 69 7a 65 29 3b 0a 76 6f 69 64 20 73 71 6c 69  Size);.void sqli
3000: 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28  te3Fts5HashFree(
3010: 46 74 73 35 48 61 73 68 2a 29 3b 0a 0a 69 6e 74  Fts5Hash*);..int
3020: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
3030: 57 72 69 74 65 28 0a 20 20 46 74 73 35 48 61 73  Write(.  Fts5Has
3040: 68 2a 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64  h*,.  i64 iRowid
3050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3060: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
3070: 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 2a 2f  or this entry */
3080: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b     /* Column tok
30b0: 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d  en appears in (-
30c0: 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f  ve -> delete) */
30d0: 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
3100: 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63  f token within c
3110: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
3120: 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
3130: 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f  nt nToken  /* To
3140: 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65  ken to add or re
3150: 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20  move to or from 
3160: 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  index */.);../*.
3170: 2a 2a 20 45 6d 70 74 79 20 28 62 75 74 20 64 6f  ** Empty (but do
3180: 20 6e 6f 74 20 64 65 6c 65 74 65 29 20 61 20 68   not delete) a h
3190: 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  ash table..*/.vo
31a0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  id sqlite3Fts5Ha
31b0: 73 68 43 6c 65 61 72 28 46 74 73 35 48 61 73 68  shClear(Fts5Hash
31c0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  *);../*.** Itera
31d0: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  te through the c
31e0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68  ontents of the h
31f0: 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  ash table..*/.in
3200: 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  t sqlite3Fts5Has
3210: 68 49 74 65 72 61 74 65 28 0a 20 20 46 74 73 35  hIterate(.  Fts5
3220: 48 61 73 68 2a 2c 0a 20 20 76 6f 69 64 20 2a 70  Hash*,.  void *p
3230: 43 74 78 2c 0a 20 20 69 6e 74 20 28 2a 78 54 65  Ctx,.  int (*xTe
3240: 72 6d 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74  rm)(void*, const
3250: 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20   char*, int),.  
3260: 69 6e 74 20 28 2a 78 45 6e 74 72 79 29 28 76 6f  int (*xEntry)(vo
3270: 69 64 2a 2c 20 69 36 34 2c 20 63 6f 6e 73 74 20  id*, i64, const 
3280: 75 38 2a 2c 20 69 6e 74 29 2c 0a 20 20 69 6e 74  u8*, int),.  int
3290: 20 28 2a 78 54 65 72 6d 44 6f 6e 65 29 28 76 6f   (*xTermDone)(vo
32a0: 69 64 2a 29 0a 29 3b 0a 0a 0a 0a 2f 2a 0a 2a 2a  id*).);..../*.**
32b0: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
32c0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
32d0: 35 5f 68 61 73 68 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  5_hash.c..******
32e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3320: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
3330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3370: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
3380: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
3390: 73 74 6f 72 61 67 65 2e 63 2e 20 66 74 73 35 5f  storage.c. fts5_
33a0: 73 74 6f 72 61 67 65 2e 63 20 63 6f 6e 74 61 69  storage.c contai
33b0: 6e 73 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20  ns contains .** 
33c0: 63 6f 64 65 20 74 6f 20 61 63 63 65 73 73 20 74  code to access t
33d0: 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  he data stored i
33e0: 6e 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  n the %_content 
33f0: 61 6e 64 20 25 5f 64 6f 63 73 69 7a 65 20 74 61  and %_docsize ta
3400: 62 6c 65 73 2e 0a 2a 2f 0a 0a 23 64 65 66 69 6e  bles..*/..#defin
3410: 65 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e  e FTS5_STMT_SCAN
3420: 5f 41 53 43 20 20 30 20 20 20 20 20 2f 2a 20 53  _ASC  0     /* S
3430: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
3440: 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
3450: 20 31 20 41 53 43 20 2a 2f 0a 23 64 65 66 69 6e   1 ASC */.#defin
3460: 65 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e  e FTS5_STMT_SCAN
3470: 5f 44 45 53 43 20 31 20 20 20 20 20 2f 2a 20 53  _DESC 1     /* S
3480: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
3490: 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
34a0: 20 31 20 44 45 53 43 20 2a 2f 0a 23 64 65 66 69   1 DESC */.#defi
34b0: 6e 65 20 46 54 53 35 5f 53 54 4d 54 5f 4c 4f 4f  ne FTS5_STMT_LOO
34c0: 4b 55 50 20 20 20 20 32 20 20 20 20 20 2f 2a 20  KUP    2     /* 
34d0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
34e0: 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 72  FROM ... WHERE r
34f0: 6f 77 69 64 3d 3f 20 2a 2f 0a 0a 74 79 70 65 64  owid=? */..typed
3500: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
3510: 6f 72 61 67 65 20 46 74 73 35 53 74 6f 72 61 67  orage Fts5Storag
3520: 65 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  e;..int sqlite3F
3530: 74 73 35 53 74 6f 72 61 67 65 4f 70 65 6e 28 46  ts5StorageOpen(F
3540: 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46 74 73 35  ts5Config*, Fts5
3550: 49 6e 64 65 78 2a 2c 20 69 6e 74 2c 20 46 74 73  Index*, int, Fts
3560: 35 53 74 6f 72 61 67 65 2a 2a 2c 20 63 68 61 72  5Storage**, char
3570: 2a 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  **);.int sqlite3
3580: 46 74 73 35 53 74 6f 72 61 67 65 43 6c 6f 73 65  Fts5StorageClose
3590: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
35a0: 20 69 6e 74 20 62 44 65 73 74 72 6f 79 29 3b 0a   int bDestroy);.
35b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
35c0: 44 72 6f 70 54 61 62 6c 65 28 46 74 73 35 43 6f  DropTable(Fts5Co
35d0: 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61  nfig*, const cha
35e0: 72 20 2a 7a 50 6f 73 74 29 3b 0a 69 6e 74 20 73  r *zPost);.int s
35f0: 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
3600: 54 61 62 6c 65 28 46 74 73 35 43 6f 6e 66 69 67  Table(Fts5Config
3610: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
3620: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
3630: 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 0a 69 6e 74  , char **);..int
3640: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
3650: 61 67 65 44 65 6c 65 74 65 28 46 74 73 35 53 74  ageDelete(Fts5St
3660: 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 29 3b 0a  orage *p, i64);.
3670: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
3680: 74 6f 72 61 67 65 49 6e 73 65 72 74 28 46 74 73  torageInsert(Fts
3690: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 73 71 6c  5Storage *p, sql
36a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
36b0: 61 6c 2c 20 69 6e 74 2c 20 69 36 34 2a 29 3b 0a  al, int, i64*);.
36c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
36d0: 53 74 6f 72 61 67 65 49 6e 74 65 67 72 69 74 79  StorageIntegrity
36e0: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29  (Fts5Storage *p)
36f0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
3700: 73 35 53 74 6f 72 61 67 65 53 74 6d 74 28 46 74  s5StorageStmt(Ft
3710: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e  s5Storage *p, in
3720: 74 20 65 53 74 6d 74 2c 20 73 71 6c 69 74 65 33  t eStmt, sqlite3
3730: 5f 73 74 6d 74 2a 2a 2c 20 63 68 61 72 2a 2a 29  _stmt**, char**)
3740: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
3750: 73 35 53 74 6f 72 61 67 65 53 74 6d 74 52 65 6c  s5StorageStmtRel
3760: 65 61 73 65 28 46 74 73 35 53 74 6f 72 61 67 65  ease(Fts5Storage
3770: 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20   *p, int eStmt, 
3780: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a  sqlite3_stmt*);.
3790: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
37a0: 53 74 6f 72 61 67 65 44 6f 63 73 69 7a 65 28 46  StorageDocsize(F
37b0: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
37c0: 36 34 20 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a  64 iRowid, int *
37d0: 61 43 6f 6c 29 3b 0a 69 6e 74 20 73 71 6c 69 74  aCol);.int sqlit
37e0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 53 69 7a  e3Fts5StorageSiz
37f0: 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  e(Fts5Storage *p
3800: 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 36 34 20  , int iCol, i64 
3810: 2a 70 6e 41 76 67 29 3b 0a 69 6e 74 20 73 71 6c  *pnAvg);.int sql
3820: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
3830: 6f 77 43 6f 75 6e 74 28 46 74 73 35 53 74 6f 72  owCount(Fts5Stor
3840: 61 67 65 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52  age *p, i64 *pnR
3850: 6f 77 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ow);..int sqlite
3860: 33 46 74 73 35 53 74 6f 72 61 67 65 53 79 6e 63  3Fts5StorageSync
3870: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
3880: 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 3b 0a 69   int bCommit);.i
3890: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
38a0: 6f 72 61 67 65 52 6f 6c 6c 62 61 63 6b 28 46 74  orageRollback(Ft
38b0: 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0a 0a  s5Storage *p);..
38c0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
38d0: 74 6f 72 61 67 65 43 6f 6e 66 69 67 56 61 6c 75  torageConfigValu
38e0: 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  e(Fts5Storage *p
38f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73  , const char*, s
3900: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b 0a  qlite3_value*);.
3910: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3920: 53 74 6f 72 61 67 65 53 70 65 63 69 61 6c 44 65  StorageSpecialDe
3930: 6c 65 74 65 28 46 74 73 35 53 74 6f 72 61 67 65  lete(Fts5Storage
3940: 20 2a 70 2c 20 69 36 34 20 69 44 65 6c 2c 20 73   *p, i64 iDel, s
3950: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b  qlite3_value**);
3960: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
3970: 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 41 6c  5StorageDeleteAl
3980: 6c 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  l(Fts5Storage *p
3990: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
39a0: 73 35 53 74 6f 72 61 67 65 52 65 62 75 69 6c 64  s5StorageRebuild
39b0: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29  (Fts5Storage *p)
39c0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
39d0: 35 53 74 6f 72 61 67 65 4f 70 74 69 6d 69 7a 65  5StorageOptimize
39e0: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29  (Fts5Storage *p)
39f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  ;../*.** End of 
3a00: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  interface to cod
3a10: 65 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67  e in fts5_storag
3a20: 65 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.c..***********
3a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
3a70: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
3ac0: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63  * Interface to c
3ad0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 65 78 70 72  ode in fts5_expr
3ae0: 2e 63 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20  .c. .*/.typedef 
3af0: 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72 20  struct Fts5Expr 
3b00: 46 74 73 35 45 78 70 72 3b 0a 74 79 70 65 64 65  Fts5Expr;.typede
3b10: 66 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70  f struct Fts5Exp
3b20: 72 4e 6f 64 65 20 46 74 73 35 45 78 70 72 4e 6f  rNode Fts5ExprNo
3b30: 64 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  de;.typedef stru
3b40: 63 74 20 46 74 73 35 50 61 72 73 65 20 46 74 73  ct Fts5Parse Fts
3b50: 35 50 61 72 73 65 3b 0a 74 79 70 65 64 65 66 20  5Parse;.typedef 
3b60: 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e  struct Fts5Token
3b70: 20 46 74 73 35 54 6f 6b 65 6e 3b 0a 74 79 70 65   Fts5Token;.type
3b80: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 45  def struct Fts5E
3b90: 78 70 72 50 68 72 61 73 65 20 46 74 73 35 45 78  xprPhrase Fts5Ex
3ba0: 70 72 50 68 72 61 73 65 3b 0a 74 79 70 65 64 65  prPhrase;.typede
3bb0: 66 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70  f struct Fts5Exp
3bc0: 72 4e 65 61 72 73 65 74 20 46 74 73 35 45 78 70  rNearset Fts5Exp
3bd0: 72 4e 65 61 72 73 65 74 3b 0a 0a 73 74 72 75 63  rNearset;..struc
3be0: 74 20 46 74 73 35 54 6f 6b 65 6e 20 7b 0a 20 20  t Fts5Token {.  
3bf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 20 20  const char *p;  
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 2f 2a 20 54 6f 6b 65 6e 20 74 65 78 74 20 28 6e  /* Token text (n
3c20: 6f 74 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74  ot NULL terminat
3c30: 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ed) */.  int n; 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
3c60: 20 6f 66 20 62 75 66 66 65 72 20 70 20 69 6e 20   of buffer p in 
3c70: 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  bytes */.};../* 
3c80: 50 61 72 73 65 20 61 20 4d 41 54 43 48 20 65 78  Parse a MATCH ex
3c90: 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 69 6e 74  pression. */.int
3ca0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
3cb0: 4e 65 77 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  New(.  Fts5Confi
3cc0: 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 63  g *pConfig, .  c
3cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 72  onst char *zExpr
3ce0: 2c 0a 20 20 46 74 73 35 45 78 70 72 20 2a 2a 70  ,.  Fts5Expr **p
3cf0: 70 4e 65 77 2c 20 0a 20 20 63 68 61 72 20 2a 2a  pNew, .  char **
3d00: 70 7a 45 72 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  pzErr.);../*.** 
3d10: 66 6f 72 28 72 63 20 3d 20 73 71 6c 69 74 65 33  for(rc = sqlite3
3d20: 46 74 73 35 45 78 70 72 46 69 72 73 74 28 70 45  Fts5ExprFirst(pE
3d30: 78 70 72 2c 20 70 49 64 78 2c 20 62 41 73 63 29  xpr, pIdx, bAsc)
3d40: 3b 0a 2a 2a 20 20 20 20 20 72 63 3d 3d 53 51 4c  ;.**     rc==SQL
3d50: 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
3d60: 69 74 65 33 46 74 73 35 45 78 70 72 45 6f 66 28  ite3Fts5ExprEof(
3d70: 70 45 78 70 72 29 3b 0a 2a 2a 20 20 20 20 20 72  pExpr);.**     r
3d80: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  c = sqlite3Fts5E
3d90: 78 70 72 4e 65 78 74 28 70 45 78 70 72 29 0a 2a  xprNext(pExpr).*
3da0: 2a 20 29 7b 0a 2a 2a 20 20 20 2f 2f 20 54 68 65  * ){.**   // The
3db0: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72   document with r
3dc0: 6f 77 69 64 20 69 52 6f 77 69 64 20 6d 61 74 63  owid iRowid matc
3dd0: 68 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  hes the expressi
3de0: 6f 6e 21 0a 2a 2a 20 20 20 69 36 34 20 69 52 6f  on!.**   i64 iRo
3df0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73  wid = sqlite3Fts
3e00: 35 45 78 70 72 52 6f 77 69 64 28 70 45 78 70 72  5ExprRowid(pExpr
3e10: 29 3b 0a 2a 2a 20 7d 0a 2a 2f 0a 69 6e 74 20 73  );.** }.*/.int s
3e20: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 69  qlite3Fts5ExprFi
3e30: 72 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20 46  rst(Fts5Expr*, F
3e40: 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  ts5Index *pIdx, 
3e50: 69 6e 74 20 62 41 73 63 29 3b 0a 69 6e 74 20 73  int bAsc);.int s
3e60: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e 65  qlite3Fts5ExprNe
3e70: 78 74 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 69  xt(Fts5Expr*);.i
3e80: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
3e90: 70 72 45 6f 66 28 46 74 73 35 45 78 70 72 2a 29  prEof(Fts5Expr*)
3ea0: 3b 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74 73  ;.i64 sqlite3Fts
3eb0: 35 45 78 70 72 52 6f 77 69 64 28 46 74 73 35 45  5ExprRowid(Fts5E
3ec0: 78 70 72 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c  xpr*);..void sql
3ed0: 69 74 65 33 46 74 73 35 45 78 70 72 46 72 65 65  ite3Fts5ExprFree
3ee0: 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 0a 2f 2a  (Fts5Expr*);../*
3ef0: 20 43 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 73   Called during s
3f00: 74 61 72 74 75 70 20 74 6f 20 72 65 67 69 73 74  tartup to regist
3f10: 65 72 20 61 20 55 44 46 20 77 69 74 68 20 53 51  er a UDF with SQ
3f20: 4c 69 74 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  Lite */.int sqli
3f30: 74 65 33 46 74 73 35 45 78 70 72 49 6e 69 74 28  te3Fts5ExprInit(
3f40: 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c  Fts5Global*, sql
3f50: 69 74 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  ite3*);..int sql
3f60: 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61  ite3Fts5ExprPhra
3f70: 73 65 43 6f 75 6e 74 28 46 74 73 35 45 78 70 72  seCount(Fts5Expr
3f80: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  *);.int sqlite3F
3f90: 74 73 35 45 78 70 72 50 68 72 61 73 65 53 69 7a  ts5ExprPhraseSiz
3fa0: 65 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74  e(Fts5Expr*, int
3fb0: 20 69 50 68 72 61 73 65 29 3b 0a 69 6e 74 20 73   iPhrase);.int s
3fc0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 6f  qlite3Fts5ExprPo
3fd0: 73 6c 69 73 74 28 46 74 73 35 45 78 70 72 2a 2c  slist(Fts5Expr*,
3fe0: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38 20 2a   int, const u8 *
3ff0: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
4000: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 45 78  Fts5ExprPhraseEx
4010: 70 72 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20  pr(Fts5Config*, 
4020: 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20  Fts5Expr*, int, 
4030: 46 74 73 35 45 78 70 72 2a 2a 29 3b 0a 0a 2f 2a  Fts5Expr**);../*
4040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
4070: 65 20 66 74 73 35 5f 65 78 70 72 2e 63 20 41 50  e fts5_expr.c AP
4080: 49 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69  I above this poi
4090: 6e 74 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nt is used by th
40a0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2d 77 72 69  e other hand-wri
40b0: 74 74 65 6e 0a 2a 2a 20 43 20 63 6f 64 65 20 69  tten.** C code i
40c0: 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 20 54  n this module. T
40d0: 68 65 20 69 6e 74 65 72 66 61 63 65 73 20 62 65  he interfaces be
40e0: 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 61  low this point a
40f0: 72 65 20 63 61 6c 6c 65 64 20 62 79 0a 2a 2a 20  re called by.** 
4100: 74 68 65 20 70 61 72 73 65 72 20 63 6f 64 65 20  the parser code 
4110: 69 6e 20 66 74 73 35 70 61 72 73 65 2e 79 2e 20  in fts5parse.y. 
4120: 20 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65   */..void sqlite
4130: 33 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28  3Fts5ParseError(
4140: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
4150: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
4160: 46 6d 74 2c 20 2e 2e 2e 29 3b 0a 0a 46 74 73 35  Fmt, ...);..Fts5
4170: 45 78 70 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65  ExprNode *sqlite
4180: 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28 0a  3Fts5ParseNode(.
4190: 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61    Fts5Parse *pPa
41a0: 72 73 65 2c 0a 20 20 69 6e 74 20 65 54 79 70 65  rse,.  int eType
41b0: 2c 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ,.  Fts5ExprNode
41c0: 20 2a 70 4c 65 66 74 2c 0a 20 20 46 74 73 35 45   *pLeft,.  Fts5E
41d0: 78 70 72 4e 6f 64 65 20 2a 70 52 69 67 68 74 2c  xprNode *pRight,
41e0: 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  .  Fts5ExprNears
41f0: 65 74 20 2a 70 4e 65 61 72 0a 29 3b 0a 0a 46 74  et *pNear.);..Ft
4200: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 73 71  s5ExprPhrase *sq
4210: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 54 65  lite3Fts5ParseTe
4220: 72 6d 28 0a 20 20 46 74 73 35 50 61 72 73 65 20  rm(.  Fts5Parse 
4230: 2a 70 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35  *pParse, .  Fts5
4240: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
4250: 61 73 65 2c 20 0a 20 20 46 74 73 35 54 6f 6b 65  ase, .  Fts5Toke
4260: 6e 20 2a 70 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74  n *pToken,.  int
4270: 20 62 50 72 65 66 69 78 0a 29 3b 0a 0a 46 74 73   bPrefix.);..Fts
4280: 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 73 71  5ExprNearset *sq
4290: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
42a0: 61 72 73 65 74 28 0a 20 20 46 74 73 35 50 61 72  arset(.  Fts5Par
42b0: 73 65 2a 2c 20 0a 20 20 46 74 73 35 45 78 70 72  se*, .  Fts5Expr
42c0: 4e 65 61 72 73 65 74 2a 2c 0a 20 20 46 74 73 35  Nearset*,.  Fts5
42d0: 45 78 70 72 50 68 72 61 73 65 2a 20 0a 29 3b 0a  ExprPhrase* .);.
42e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
42f0: 35 50 61 72 73 65 50 68 72 61 73 65 46 72 65 65  5ParsePhraseFree
4300: 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a  (Fts5ExprPhrase*
4310: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
4320: 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46  ts5ParseNearsetF
4330: 72 65 65 28 46 74 73 35 45 78 70 72 4e 65 61 72  ree(Fts5ExprNear
4340: 73 65 74 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69  set*);.void sqli
4350: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
4360: 46 72 65 65 28 46 74 73 35 45 78 70 72 4e 6f 64  Free(Fts5ExprNod
4370: 65 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74  e*);..void sqlit
4380: 65 33 46 74 73 35 50 61 72 73 65 53 65 74 44 69  e3Fts5ParseSetDi
4390: 73 74 61 6e 63 65 28 46 74 73 35 50 61 72 73 65  stance(Fts5Parse
43a0: 2a 2c 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  *, Fts5ExprNears
43b0: 65 74 2a 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29  et*, Fts5Token*)
43c0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
43d0: 73 35 50 61 72 73 65 53 65 74 43 6f 6c 75 6d 6e  s5ParseSetColumn
43e0: 28 46 74 73 35 50 61 72 73 65 2a 2c 20 46 74 73  (Fts5Parse*, Fts
43f0: 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 20 46  5ExprNearset*, F
4400: 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a 76 6f 69 64  ts5Token*);.void
4410: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
4420: 65 46 69 6e 69 73 68 65 64 28 46 74 73 35 50 61  eFinished(Fts5Pa
4430: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73  rse *pParse, Fts
4440: 35 45 78 70 72 4e 6f 64 65 20 2a 70 29 3b 0a 76  5ExprNode *p);.v
4450: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
4460: 61 72 73 65 4e 65 61 72 28 46 74 73 35 50 61 72  arseNear(Fts5Par
4470: 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35  se *pParse, Fts5
4480: 54 6f 6b 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  Token*);../*.** 
4490: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
44a0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
44b0: 5f 65 78 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  _expr.c..*******
44c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
44d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
44e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
44f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4500: 2a 2a 2a 2f 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ***/..../*******
4510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4550: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
4560: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
4570: 5f 61 75 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74  _aux.c. .*/..int
4580: 20 73 71 6c 69 74 65 33 46 74 73 35 41 75 78 49   sqlite3Fts5AuxI
4590: 6e 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a  nit(fts5_api*);.
45a0: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
45b0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
45c0: 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a  n fts5_aux.c..**
45d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
4620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4660: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
4670: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
4680: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e  ts5_tokenizer.c.
4690: 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65   .*/..int sqlite
46a0: 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e  3Fts5TokenizerIn
46b0: 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f  it(fts5_api*);./
46c0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
46d0: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
46e0: 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e   fts5_tokenizer.
46f0: 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c..*************
4700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
4740: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
4750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49  ***********.** I
4790: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
47a0: 20 69 6e 20 66 74 73 35 5f 73 6f 72 74 65 72 2e   in fts5_sorter.
47b0: 63 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  c. .*/.typedef s
47c0: 74 72 75 63 74 20 46 74 73 35 53 6f 72 74 65 72  truct Fts5Sorter
47d0: 20 46 74 73 35 53 6f 72 74 65 72 3b 0a 0a 69 6e   Fts5Sorter;..in
47e0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 6f 72  t sqlite3Fts5Sor
47f0: 74 65 72 4e 65 77 28 46 74 73 35 45 78 70 72 20  terNew(Fts5Expr 
4800: 2a 70 45 78 70 72 2c 20 46 74 73 35 53 6f 72 74  *pExpr, Fts5Sort
4810: 65 72 20 2a 2a 70 70 29 3b 0a 0a 2f 2a 0a 2a 2a  er **pp);../*.**
4820: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
4830: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
4840: 35 5f 73 6f 72 74 65 72 2e 63 2e 0a 2a 2a 2a 2a  5_sorter.c..****
4850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4890: 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 0a  ******/..#endif.