/ Hex Artifact Content
Login

Artifact 36054b1dfc4881a9b94f945b348ab6cc01c0c7a5:


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 63 6f 6c 75 6d 6e 20 2a 2f 0a 23 64 65 66  k column */.#def
0340: 69 6e 65 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41  ine FTS5_RANK_NA
0350: 4d 45 20 22 72 61 6e 6b 22 0a 0a 2f 2a 2a 2a 2a  ME "rank"../****
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
03b0: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
03c0: 74 73 35 2e 63 2e 20 0a 2a 2f 0a 74 79 70 65 64  ts5.c. .*/.typed
03d0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 47 6c  ef struct Fts5Gl
03e0: 6f 62 61 6c 20 46 74 73 35 47 6c 6f 62 61 6c 3b  obal Fts5Global;
03f0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
0400: 35 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 0a 20  5GetTokenizer(. 
0410: 20 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 0a 20   Fts5Global*, . 
0420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a   const char **az
0430: 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  Arg,.  int nArg,
0440: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  .  Fts5Tokenizer
0450: 2a 2a 2c 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e  **,.  fts5_token
0460: 69 7a 65 72 2a 2a 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  izer**.);../*.**
0470: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
0480: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
0490: 35 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  5.c..***********
04a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f  ***************/
04e0: 0a 0a 2f 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 2a 2a 2a 2a 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 0a 2a 2a  *************.**
0530: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
0540: 64 65 20 69 6e 20 66 74 73 35 5f 63 6f 6e 66 69  de in fts5_confi
0550: 67 2e 63 2e 20 66 74 73 35 5f 63 6f 6e 66 69 67  g.c. fts5_config
0560: 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74  .c contains cont
0570: 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f 20  ains code.** to 
0580: 70 61 72 73 65 20 74 68 65 20 61 72 67 75 6d 65  parse the argume
0590: 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  nts passed to th
05a0: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
05b0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
05c0: 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74  ..*/..typedef st
05d0: 72 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67 20  ruct Fts5Config 
05e0: 46 74 73 35 43 6f 6e 66 69 67 3b 0a 0a 2f 2a 0a  Fts5Config;../*.
05f0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
0600: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0610: 73 74 72 75 63 74 75 72 65 20 65 6e 63 6f 64 65  structure encode
0620: 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  s all informatio
0630: 6e 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65  n that can.** be
0640: 20 67 6c 65 61 6e 65 64 20 66 72 6f 6d 20 74 68   gleaned from th
0650: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
0660: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
0670: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 64 20 61 6c 6c 20  ..**.** And all 
0680: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 6f 61 64  information load
0690: 65 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f  ed from the %_co
06a0: 6e 66 69 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  nfig table..**.*
06b0: 2a 20 6e 41 75 74 6f 6d 65 72 67 65 3a 0a 2a 2a  * nAutomerge:.**
06c0: 20 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 6e     The minimum n
06d0: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
06e0: 73 20 74 68 61 74 20 61 6e 20 61 75 74 6f 2d 6d  s that an auto-m
06f0: 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 73  erge operation s
0700: 68 6f 75 6c 64 0a 2a 2a 20 20 20 61 74 74 65 6d  hould.**   attem
0710: 70 74 20 74 6f 20 6d 65 72 67 65 20 74 6f 67 65  pt to merge toge
0720: 74 68 65 72 2e 20 41 20 76 61 6c 75 65 20 6f 66  ther. A value of
0730: 20 31 20 73 65 74 73 20 74 68 65 20 6f 62 6a 65   1 sets the obje
0740: 63 74 20 74 6f 20 75 73 65 20 74 68 65 20 0a 2a  ct to use the .*
0750: 2a 20 20 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  *   compile time
0760: 20 64 65 66 61 75 6c 74 2e 20 5a 65 72 6f 20 64   default. Zero d
0770: 69 73 61 62 6c 65 73 20 61 75 74 6f 2d 6d 65 72  isables auto-mer
0780: 67 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a  ge altogether..*
0790: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 43 6f 6e  /.struct Fts5Con
07a0: 66 69 67 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  fig {.  sqlite3 
07b0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
07d0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
07e0: 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0800: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
0810: 69 6e 67 20 46 54 53 20 69 6e 64 65 78 20 28 65  ing FTS index (e
0820: 2e 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20  .g. "main") */. 
0830: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 46 54 53 20   /* Name of FTS 
0860: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
0870: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
0880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0890: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
08a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  */.  char **azCo
08b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
08c0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
08d0: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ames */.  int nP
08e0: 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
08f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0900: 62 65 72 20 6f 66 20 70 72 65 66 69 78 20 69 6e  ber of prefix in
0910: 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  dexes */.  int *
0920: 61 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  aPrefix;        
0930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
0940: 7a 65 73 20 69 6e 20 62 79 74 65 73 20 6f 66 20  zes in bytes of 
0950: 6e 50 72 65 66 69 78 20 70 72 65 66 69 78 20 69  nPrefix prefix i
0960: 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35  ndexes */.  Fts5
0970: 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 3b  Tokenizer *pTok;
0980: 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  .  fts5_tokenize
0990: 72 20 2a 70 54 6f 6b 41 70 69 3b 0a 0a 20 20 2f  r *pTokApi;..  /
09a0: 2a 20 56 61 6c 75 65 73 20 6c 6f 61 64 65 64 20  * Values loaded 
09b0: 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 66 69  from the %_confi
09c0: 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  g table */.  int
09d0: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
09f0: 49 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  Incremented when
0a00: 20 25 5f 63 6f 6e 66 69 67 20 69 73 20 6d 6f 64   %_config is mod
0a10: 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 70  ified */.  int p
0a20: 67 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20  gsz;            
0a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
0a40: 70 72 6f 78 69 6d 61 74 65 20 70 61 67 65 20 73  proximate page s
0a50: 69 7a 65 20 75 73 65 64 20 69 6e 20 25 5f 64 61  ize used in %_da
0a60: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 75 74  ta */.  int nAut
0a70: 6f 6d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20  omerge;         
0a80: 20 20 20 20 20 20 20 20 2f 2a 20 27 61 75 74 6f          /* 'auto
0a90: 6d 65 72 67 65 27 20 73 65 74 74 69 6e 67 20 2a  merge' setting *
0aa0: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 3b  /.  char *zRank;
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 72      /* Name of r
0ad0: 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ank function */.
0ae0: 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67    char *zRankArg
0af0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
0b00: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
0b10: 6f 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20  o rank function 
0b20: 2a 2f 0a 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  */.};..int sqlit
0b30: 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73  e3Fts5ConfigPars
0b40: 65 28 0a 20 20 20 20 46 74 73 35 47 6c 6f 62 61  e(.    Fts5Globa
0b50: 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 69 6e  l*, sqlite3*, in
0b60: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  t, const char **
0b70: 2c 20 46 74 73 35 43 6f 6e 66 69 67 2a 2a 2c 20  , Fts5Config**, 
0b80: 63 68 61 72 2a 2a 0a 29 3b 0a 76 6f 69 64 20 73  char**.);.void s
0b90: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
0ba0: 46 72 65 65 28 46 74 73 35 43 6f 6e 66 69 67 2a  Free(Fts5Config*
0bb0: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
0bc0: 74 73 35 43 6f 6e 66 69 67 44 65 63 6c 61 72 65  ts5ConfigDeclare
0bd0: 56 74 61 62 28 46 74 73 35 43 6f 6e 66 69 67 20  Vtab(Fts5Config 
0be0: 2a 70 43 6f 6e 66 69 67 29 3b 0a 0a 69 6e 74 20  *pConfig);..int 
0bf0: 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e  sqlite3Fts5Token
0c00: 69 7a 65 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  ize(.  Fts5Confi
0c10: 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20  g *pConfig,     
0c20: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43         /* FTS5 C
0c30: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
0c40: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
0c50: 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74 20  har *pText, int 
0c60: 6e 54 65 78 74 2c 20 20 20 2f 2a 20 54 65 78 74  nText,   /* Text
0c70: 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a   to tokenize */.
0c80: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61 73    /* Context pas
0cb0: 73 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20  sed to xToken() 
0cc0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65  */.  int (*xToke
0cd0: 6e 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20  n)(void*, const 
0ce0: 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c  char*, int, int,
0cf0: 20 69 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f 2a   int, int)    /*
0d00: 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 3b 0a   Callback */.);.
0d10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
0d20: 35 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a  5Dequote(char *z
0d30: 29 3b 0a 0a 2f 2a 20 4c 6f 61 64 20 74 68 65 20  );../* Load the 
0d40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
0d50: 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65 20 2a  %_config table *
0d60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
0d70: 35 43 6f 6e 66 69 67 4c 6f 61 64 28 46 74 73 35  5ConfigLoad(Fts5
0d80: 43 6f 6e 66 69 67 2a 2c 20 69 6e 74 29 3b 0a 0a  Config*, int);..
0d90: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  /* Set the value
0da0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e   of a single con
0db0: 66 69 67 20 61 74 74 72 69 62 75 74 65 20 2a 2f  fig attribute */
0dc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
0dd0: 43 6f 6e 66 69 67 53 65 74 56 61 6c 75 65 28 46  ConfigSetValue(F
0de0: 74 73 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73  ts5Config*, cons
0df0: 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33  t char*, sqlite3
0e00: 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 2a 29 3b 0a  _value*, int*);.
0e10: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
0e20: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
0e30: 69 6e 20 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63  in fts5_config.c
0e40: 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
0e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e  **********.** In
0ee0: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
0ef0: 69 6e 20 66 74 73 35 5f 62 75 66 66 65 72 2e 63  in fts5_buffer.c
0f00: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  ..*/../*.** Buff
0f10: 65 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  er object for th
0f20: 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 75  e incremental bu
0f30: 69 6c 64 69 6e 67 20 6f 66 20 73 74 72 69 6e 67  ilding of string
0f40: 20 64 61 74 61 2e 0a 2a 2f 0a 74 79 70 65 64 65   data..*/.typede
0f50: 66 20 73 74 72 75 63 74 20 46 74 73 35 42 75 66  f struct Fts5Buf
0f60: 66 65 72 20 46 74 73 35 42 75 66 66 65 72 3b 0a  fer Fts5Buffer;.
0f70: 73 74 72 75 63 74 20 46 74 73 35 42 75 66 66 65  struct Fts5Buffe
0f80: 72 20 7b 0a 20 20 75 38 20 2a 70 3b 0a 20 20 69  r {.  u8 *p;.  i
0f90: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 53 70 61  nt n;.  int nSpa
0fa0: 63 65 3b 0a 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69  ce;.};..int sqli
0fb0: 74 65 33 46 74 73 35 42 75 66 66 65 72 47 72 6f  te3Fts5BufferGro
0fc0: 77 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66  w(int*, Fts5Buff
0fd0: 65 72 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20  er*, int);.void 
0fe0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
0ff0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 69 6e  rAppendVarint(in
1000: 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c  t*, Fts5Buffer*,
1010: 20 69 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c 69   i64);.void sqli
1020: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1030: 65 6e 64 42 6c 6f 62 28 69 6e 74 2a 2c 20 46 74  endBlob(int*, Ft
1040: 73 35 42 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20  s5Buffer*, int, 
1050: 63 6f 6e 73 74 20 75 38 2a 29 3b 0a 76 6f 69 64  const u8*);.void
1060: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1070: 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28 69  erAppendString(i
1080: 6e 74 20 2a 2c 20 46 74 73 35 42 75 66 66 65 72  nt *, Fts5Buffer
1090: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
10a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
10b0: 35 42 75 66 66 65 72 46 72 65 65 28 46 74 73 35  5BufferFree(Fts5
10c0: 42 75 66 66 65 72 2a 29 3b 0a 76 6f 69 64 20 73  Buffer*);.void s
10d0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
10e0: 5a 65 72 6f 28 46 74 73 35 42 75 66 66 65 72 2a  Zero(Fts5Buffer*
10f0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
1100: 74 73 35 42 75 66 66 65 72 53 65 74 28 69 6e 74  ts5BufferSet(int
1110: 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
1120: 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38 2a 29 3b  int, const u8*);
1130: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
1140: 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
1150: 6e 74 66 28 69 6e 74 20 2a 2c 20 46 74 73 35 42  ntf(int *, Fts5B
1160: 75 66 66 65 72 2a 2c 20 63 68 61 72 20 2a 7a 46  uffer*, char *zF
1170: 6d 74 2c 20 2e 2e 2e 29 3b 0a 76 6f 69 64 20 73  mt, ...);.void s
1180: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1190: 41 70 70 65 6e 64 4c 69 73 74 45 6c 65 6d 28 69  AppendListElem(i
11a0: 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  nt*, Fts5Buffer*
11b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
11c0: 6e 74 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  nt);.void sqlite
11d0: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
11e0: 64 33 32 28 69 6e 74 2a 2c 20 46 74 73 35 42 75  d32(int*, Fts5Bu
11f0: 66 66 65 72 2a 2c 20 69 6e 74 29 3b 0a 0a 23 64  ffer*, int);..#d
1200: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
1210: 5a 65 72 6f 28 78 29 20 20 20 20 20 20 20 20 20  Zero(x)         
1220: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1230: 75 66 66 65 72 5a 65 72 6f 28 78 29 0a 23 64 65  ufferZero(x).#de
1240: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 47  fine fts5BufferG
1250: 72 6f 77 28 61 2c 62 2c 63 29 20 20 20 20 20 20  row(a,b,c)      
1260: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1270: 66 66 65 72 47 72 6f 77 28 61 2c 62 2c 63 29 0a  fferGrow(a,b,c).
1280: 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66  #define fts5Buff
1290: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 61  erAppendVarint(a
12a0: 2c 62 2c 63 29 20 73 71 6c 69 74 65 33 46 74 73  ,b,c) sqlite3Fts
12b0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
12c0: 69 6e 74 28 61 2c 62 2c 63 29 0a 23 64 65 66 69  int(a,b,c).#defi
12d0: 6e 65 20 66 74 73 35 42 75 66 66 65 72 46 72 65  ne fts5BufferFre
12e0: 65 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  e(a)            
12f0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1300: 65 72 46 72 65 65 28 61 29 0a 23 64 65 66 69 6e  erFree(a).#defin
1310: 65 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65  e fts5BufferAppe
1320: 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20  ndBlob(a,b,c,d) 
1330: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1340: 72 41 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c  rAppendBlob(a,b,
1350: 63 2c 64 29 0a 23 64 65 66 69 6e 65 20 66 74 73  c,d).#define fts
1360: 35 42 75 66 66 65 72 53 65 74 28 61 2c 62 2c 63  5BufferSet(a,b,c
1370: 2c 64 29 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,d)        sqlit
1380: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
1390: 61 2c 62 2c 63 2c 64 29 0a 23 64 65 66 69 6e 65  a,b,c,d).#define
13a0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
13b0: 64 33 32 28 61 2c 62 2c 63 29 20 20 20 20 20 73  d32(a,b,c)     s
13c0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
13d0: 41 70 70 65 6e 64 33 32 28 61 2c 62 2c 63 29 0a  Append32(a,b,c).
13e0: 0a 2f 2a 20 57 72 69 74 65 20 61 6e 64 20 64 65  ./* Write and de
13f0: 63 6f 64 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  code big-endian 
1400: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  32-bit integer v
1410: 61 6c 75 65 73 20 2a 2f 0a 76 6f 69 64 20 73 71  alues */.void sq
1420: 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 75  lite3Fts5Put32(u
1430: 38 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71  8*, int);.int sq
1440: 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28 63  lite3Fts5Get32(c
1450: 6f 6e 73 74 20 75 38 2a 29 3b 0a 0a 74 79 70 65  onst u8*);..type
1460: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50  def struct Fts5P
1470: 6f 73 6c 69 73 74 52 65 61 64 65 72 20 46 74 73  oslistReader Fts
1480: 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 3b 0a  5PoslistReader;.
1490: 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69  struct Fts5Posli
14a0: 73 74 52 65 61 64 65 72 20 7b 0a 20 20 2f 2a 20  stReader {.  /* 
14b0: 56 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 6f  Variables used o
14c0: 6e 6c 79 20 62 79 20 73 71 6c 69 74 65 33 46 74  nly by sqlite3Ft
14d0: 73 35 50 6f 73 6c 69 73 74 49 74 65 72 58 58 58  s5PoslistIterXXX
14e0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f  () functions. */
14f0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 2f 2a 20 49 66 20 28 69 43 6f 6c 3e 3d     /* If (iCol>=
1520: 30 29 2c 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  0), this column 
1530: 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  only */.  const 
1540: 75 38 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  u8 *a;          
1550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
1560: 69 74 69 6f 6e 20 6c 69 73 74 20 74 6f 20 69 74  ition list to it
1570: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
1580: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
15b0: 66 66 65 72 20 61 74 20 61 5b 5d 20 69 6e 20 62  ffer at a[] in b
15c0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ytes */.  int i;
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
15f0: 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 61  rent offset in a
1600: 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70  [] */..  /* Outp
1610: 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a  ut variables */.
1620: 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20    int bEof;     
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
1650: 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34   at EOF */.  i64
1660: 20 69 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   iPos;          
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1680: 28 69 43 6f 6c 3c 3c 33 32 29 20 2b 20 69 50 6f  (iCol<<32) + iPo
1690: 73 20 2a 2f 0a 7d 3b 0a 69 6e 74 20 73 71 6c 69  s */.};.int sqli
16a0: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
16b0: 61 64 65 72 49 6e 69 74 28 0a 20 20 69 6e 74 20  aderInit(.  int 
16c0: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16e0: 66 20 28 69 43 6f 6c 3e 3d 30 29 2c 20 74 68 69  f (iCol>=0), thi
16f0: 73 20 63 6f 6c 75 6d 6e 20 6f 6e 6c 79 20 2a 2f  s column only */
1700: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  .  const u8 *a, 
1710: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
1720: 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 62 75     /* Poslist bu
1730: 66 66 65 72 20 74 6f 20 69 74 65 72 61 74 65 20  ffer to iterate 
1740: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 46 74 73  through */.  Fts
1750: 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a  5PoslistReader *
1760: 70 49 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20  pIter        /* 
1770: 49 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  Iterator object 
1780: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f  to initialize */
1790: 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .);.int sqlite3F
17a0: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
17b0: 4e 65 78 74 28 46 74 73 35 50 6f 73 6c 69 73 74  Next(Fts5Poslist
17c0: 52 65 61 64 65 72 2a 29 3b 0a 0a 74 79 70 65 64  Reader*);..typed
17d0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50 6f  ef struct Fts5Po
17e0: 73 6c 69 73 74 57 72 69 74 65 72 20 46 74 73 35  slistWriter Fts5
17f0: 50 6f 73 6c 69 73 74 57 72 69 74 65 72 3b 0a 73  PoslistWriter;.s
1800: 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73  truct Fts5Poslis
1810: 74 57 72 69 74 65 72 20 7b 0a 20 20 69 36 34 20  tWriter {.  i64 
1820: 69 50 72 65 76 3b 0a 7d 3b 0a 69 6e 74 20 73 71  iPrev;.};.int sq
1830: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1840: 57 72 69 74 65 72 41 70 70 65 6e 64 28 46 74 73  WriterAppend(Fts
1850: 35 42 75 66 66 65 72 2a 2c 20 46 74 73 35 50 6f  5Buffer*, Fts5Po
1860: 73 6c 69 73 74 57 72 69 74 65 72 2a 2c 20 69 36  slistWriter*, i6
1870: 34 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  4);..int sqlite3
1880: 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 28  Fts5PoslistNext(
1890: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  .  const u8 *a, 
18a0: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
18b0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
18c0: 74 61 69 6e 69 6e 67 20 70 6f 73 6c 69 73 74 20  taining poslist 
18d0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 2c 20 20 20  */.  int *pi,   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1900: 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 61 5b  Offset within a[
1910: 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  ] */.  int *piCo
1920: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1930: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
1940: 3a 20 43 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  : Current column
1950: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 4f 66 66   */.  int *piOff
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1980: 20 43 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 6f   Current token o
1990: 66 66 73 65 74 20 2a 2f 0a 29 3b 0a 0a 69 6e 74  ffset */.);..int
19a0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
19b0: 69 73 74 4e 65 78 74 36 34 28 0a 20 20 63 6f 6e  istNext64(.  con
19c0: 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c  st u8 *a, int n,
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e0: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
19f0: 67 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69  g poslist */.  i
1a00: 6e 74 20 2a 70 69 2c 20 20 20 20 20 20 20 20 20  nt *pi,         
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a20: 2a 20 49 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74  * IN/OUT: Offset
1a30: 20 77 69 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20   within a[] */. 
1a40: 20 69 36 34 20 2a 70 69 4f 66 66 20 20 20 20 20   i64 *piOff     
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
1a70: 65 6e 74 20 6f 66 66 73 65 74 20 2a 2f 0a 29 3b  ent offset */.);
1a80: 0a 0a 2f 2a 20 4d 61 6c 6c 6f 63 20 75 74 69 6c  ../* Malloc util
1a90: 69 74 79 20 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ity */.void *sql
1aa0: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
1ab0: 72 6f 28 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74  ro(int *pRc, int
1ac0: 20 6e 42 79 74 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20   nByte);../*.** 
1ad0: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
1ae0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
1af0: 5f 62 75 66 66 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a  _buffer.c..*****
1b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b40: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b90: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
1ba0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
1bb0: 5f 69 6e 64 65 78 2e 63 2e 20 66 74 73 35 5f 69  _index.c. fts5_i
1bc0: 6e 64 65 78 2e 63 20 63 6f 6e 74 61 69 6e 73 20  ndex.c contains 
1bd0: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 0a 2a 2a  contains code.**
1be0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1bf0: 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
1c00: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
1c10: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  */..typedef stru
1c20: 63 74 20 46 74 73 35 49 6e 64 65 78 20 46 74 73  ct Fts5Index Fts
1c30: 35 49 6e 64 65 78 3b 0a 74 79 70 65 64 65 66 20  5Index;.typedef 
1c40: 73 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78  struct Fts5Index
1c50: 49 74 65 72 20 46 74 73 35 49 6e 64 65 78 49 74  Iter Fts5IndexIt
1c60: 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65  er;../*.** Value
1c70: 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
1c80: 66 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75  f the flags argu
1c90: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 49  ment passed to I
1ca0: 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a  ndexQuery()..*/.
1cb0: 23 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45  #define FTS5INDE
1cc0: 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 30  X_QUERY_PREFIX 0
1cd0: 78 30 30 30 31 20 20 20 20 20 20 20 2f 2a 20 50  x0001       /* P
1ce0: 72 65 66 69 78 20 71 75 65 72 79 20 2a 2f 0a 23  refix query */.#
1cf0: 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58  define FTS5INDEX
1d00: 5f 51 55 45 52 59 5f 41 53 43 20 20 20 20 30 78  _QUERY_ASC    0x
1d10: 30 30 30 32 20 20 20 20 20 20 20 2f 2a 20 44 6f  0002       /* Do
1d20: 63 73 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  cs in ascending 
1d30: 72 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 0a  rowid order */..
1d40: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 2f 64 65 73  /*.** Create/des
1d50: 74 72 6f 79 20 61 6e 20 46 74 73 35 49 6e 64 65  troy an Fts5Inde
1d60: 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74  x object..*/.int
1d70: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1d80: 78 4f 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67  xOpen(Fts5Config
1d90: 20 2a 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20 62   *pConfig, int b
1da0: 43 72 65 61 74 65 2c 20 46 74 73 35 49 6e 64 65  Create, Fts5Inde
1db0: 78 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69 6e  x**, char**);.in
1dc0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
1dd0: 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  exClose(Fts5Inde
1de0: 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 73 74 72  x *p, int bDestr
1df0: 6f 79 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28  oy);../*.** for(
1e00: 0a 2a 2a 20 20 20 70 49 74 65 72 20 3d 20 73 71  .**   pIter = sq
1e10: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
1e20: 65 72 79 28 70 2c 20 22 74 6f 6b 65 6e 22 2c 20  ery(p, "token", 
1e30: 35 2c 20 30 29 3b 0a 2a 2a 20 20 20 30 3d 3d 73  5, 0);.**   0==s
1e40: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
1e50: 66 28 70 49 74 65 72 29 3b 0a 2a 2a 20 20 20 73  f(pIter);.**   s
1e60: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
1e70: 78 74 28 70 49 74 65 72 29 0a 2a 2a 20 29 7b 0a  xt(pIter).** ){.
1e80: 2a 2a 20 20 20 69 36 34 20 69 44 6f 63 69 64 20  **   i64 iDocid 
1e90: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
1ea0: 65 78 44 6f 63 69 64 28 70 49 74 65 72 29 3b 0a  exDocid(pIter);.
1eb0: 2a 2a 20 7d 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4f  ** }.*/../*.** O
1ec0: 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74  pen a new iterat
1ed0: 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
1ee0: 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69 64 73 20  ough all docids 
1ef0: 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a  that match the .
1f00: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b  ** specified tok
1f10: 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
1f20: 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ix..*/.int sqlit
1f30: 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
1f40: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1f50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f60: 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78      /* FTS index
1f70: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63   to query */.  c
1f80: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
1f90: 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f  n, int nToken, /
1fa0: 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66  * Token (or pref
1fb0: 69 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ix) to query for
1fc0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1ff0: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
2000: 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  _X flags */.  Ft
2010: 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70  s5IndexIter **pp
2020: 49 74 65 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  Iter.);../*.** D
2030: 6f 63 69 64 20 6c 69 73 74 20 69 74 65 72 61 74  ocid list iterat
2040: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
2050: 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 46  te3Fts5IterEof(F
2060: 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a  ts5IndexIter*);.
2070: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2080: 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65  terNext(Fts5Inde
2090: 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20 73 71 6c  xIter*);.int sql
20a0: 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
20b0: 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74  From(Fts5IndexIt
20c0: 65 72 2a 2c 20 69 36 34 20 69 4d 61 74 63 68 29  er*, i64 iMatch)
20d0: 3b 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74 73  ;.i64 sqlite3Fts
20e0: 35 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49  5IterRowid(Fts5I
20f0: 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 2f 2a 0a  ndexIter*);../*.
2100: 2a 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 6f  ** Obtain the po
2110: 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74  sition list that
2120: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2130: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
2140: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
2150: 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
2160: 69 73 74 28 46 74 73 35 49 6e 64 65 78 49 74 65  ist(Fts5IndexIte
2170: 72 2a 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  r*, const u8 **p
2180: 70 2c 20 69 6e 74 20 2a 70 6e 29 3b 0a 0a 2f 2a  p, int *pn);../*
2190: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65  .** Close an ite
21a0: 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  rator opened by 
21b0: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
21c0: 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Query()..*/.void
21d0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
21e0: 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49  Close(Fts5IndexI
21f0: 74 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ter*);../*.** In
2200: 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64  sert or remove d
2210: 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ata to or from t
2220: 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74  he index. Each t
2230: 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  ime a document i
2240: 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f  s .** added to o
2250: 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
2260: 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66  he index, this f
2270: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2280: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  d one or more.**
2290: 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   times..**.** Fo
22a0: 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20  r an insert, it 
22b0: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f  must be called o
22c0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  nce for each tok
22d0: 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f  en in the new do
22e0: 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68  cument..** If th
22f0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
2300: 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74   delete, it must
2310: 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c   be called (at l
2320: 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65  east) once for e
2330: 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f  ach.** unique to
2340: 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  ken in the docum
2350: 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c  ent with an iCol
2360: 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e   value less than
2370: 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a   zero. The iPos.
2380: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
2390: 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c  gnored for a del
23a0: 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ete..*/.int sqli
23b0: 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
23c0: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
23d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23e0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
23f0: 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
2400: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2420: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
2430: 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
2440: 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
2450: 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2470: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
2480: 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
2490: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
24a0: 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
24b0: 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
24c0: 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
24d0: 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
24e0: 78 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49  x */.);../*.** I
24f0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 73 75 62  ndicate that sub
2500: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
2510: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2520: 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e  xWrite() pertain
2530: 20 74 6f 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20   to.** document 
2540: 69 44 6f 63 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73  iDocid..*/.int s
2550: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42  qlite3Fts5IndexB
2560: 65 67 69 6e 57 72 69 74 65 28 0a 20 20 46 74 73  eginWrite(.  Fts
2570: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2590: 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74  Index to write t
25a0: 6f 20 2a 2f 0a 20 20 69 36 34 20 69 44 6f 63 69  o */.  i64 iDoci
25b0: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
25c0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20         /* Docid 
25d0: 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
25e0: 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 29 3b   data from */.);
25f0: 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
2600: 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
2610: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
2620: 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68  ash tables to th
2630: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 49  e database..** I
2640: 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 66 6c  f the bCommit fl
2650: 61 67 20 69 73 20 74 72 75 65 2c 20 61 6c 73 6f  ag is true, also
2660: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 70 65 6e 20   close any open 
2670: 62 6c 6f 62 20 68 61 6e 64 6c 65 73 2e 0a 2a 2f  blob handles..*/
2680: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2690: 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e  IndexSync(Fts5In
26a0: 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d  dex *p, int bCom
26b0: 6d 69 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  mit);../*.** Dis
26c0: 63 61 72 64 20 61 6e 79 20 64 61 74 61 20 73 74  card any data st
26d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
26e0: 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
26f0: 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  s. Do not write 
2700: 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  it.** to the dat
2710: 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
2720: 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lly, assume that
2730: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2740: 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74   the %_data.** t
2750: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68  able may have ch
2760: 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53  anged on disk. S
2770: 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20  o any in-memory 
2780: 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61  caches of %_data
2790: 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73   .** records mus
27a0: 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  t be invalidated
27b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27c0: 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63  Fts5IndexRollbac
27d0: 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b  k(Fts5Index *p);
27e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
27f0: 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 63   and clear the c
2800: 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  urrent error cod
2810: 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  e, respectively.
2820: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2830: 74 73 35 49 6e 64 65 78 45 72 72 63 6f 64 65 28  ts5IndexErrcode(
2840: 46 74 73 35 49 6e 64 65 78 2a 29 3b 0a 76 6f 69  Fts5Index*);.voi
2850: 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  d sqlite3Fts5Ind
2860: 65 78 52 65 73 65 74 28 46 74 73 35 49 6e 64 65  exReset(Fts5Inde
2870: 78 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  x*);../*.** Get 
2880: 6f 72 20 73 65 74 20 74 68 65 20 22 61 76 65 72  or set the "aver
2890: 61 67 65 73 22 20 72 65 63 6f 72 64 2e 0a 2a 2f  ages" record..*/
28a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
28b0: 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73  IndexGetAverages
28c0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
28d0: 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29  ts5Buffer *pBuf)
28e0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
28f0: 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65  5IndexSetAverage
2900: 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
2910: 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 3b  const u8*, int);
2920: 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
2930: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2940: 73 74 6f 72 61 67 65 20 6d 6f 64 75 6c 65 20 61  storage module a
2950: 73 20 70 61 72 74 20 6f 66 20 69 6e 74 65 67 72  s part of integr
2960: 69 74 79 2d 63 68 65 63 6b 2e 0a 2a 2f 0a 75 36  ity-check..*/.u6
2970: 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  4 sqlite3Fts5Ind
2980: 65 78 43 6b 73 75 6d 28 46 74 73 35 43 6f 6e 66  exCksum(Fts5Conf
2990: 69 67 2a 2c 69 36 34 2c 69 6e 74 2c 69 6e 74 2c  ig*,i64,int,int,
29a0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
29b0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
29c0: 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
29d0: 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78 2a 2c  heck(Fts5Index*,
29e0: 20 75 36 34 20 63 6b 73 75 6d 29 3b 0a 0a 2f 2a   u64 cksum);../*
29f0: 20 0a 2a 2a 20 43 61 6c 6c 65 64 20 64 75 72 69   .** Called duri
2a00: 6e 67 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ng virtual modul
2a10: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
2a20: 20 74 6f 20 72 65 67 69 73 74 65 72 20 55 44 46   to register UDF
2a30: 20 0a 2a 2a 20 66 74 73 35 5f 64 65 63 6f 64 65   .** fts5_decode
2a40: 28 29 20 77 69 74 68 20 53 51 4c 69 74 65 20 0a  () with SQLite .
2a50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2a60: 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69  s5IndexInit(sqli
2a70: 74 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  te3*);..int sqli
2a80: 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43  te3Fts5IndexSetC
2a90: 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 2a  ookie(Fts5Index*
2aa0: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52  , int);../*.** R
2ab0: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
2ac0: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
2ad0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
2ae0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 62 79 20  %_data table by 
2af0: 0a 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  .** this connect
2b00: 69 6f 6e 20 73 69 6e 63 65 20 69 74 20 77 61 73  ion since it was
2b10: 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74   created..*/.int
2b20: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2b30: 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65 78  xReads(Fts5Index
2b40: 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64   *p);../*.** End
2b50: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
2b60: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 69 6e   code in fts5_in
2b70: 64 65 78 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  dex.c..*********
2b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc0: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
2bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2c10: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
2c20: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61 73  code in fts5_has
2c30: 68 2e 63 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66  h.c. .*/.typedef
2c40: 20 73 74 72 75 63 74 20 46 74 73 35 48 61 73 68   struct Fts5Hash
2c50: 20 46 74 73 35 48 61 73 68 3b 0a 0a 2f 2a 0a 2a   Fts5Hash;../*.*
2c60: 2a 20 43 72 65 61 74 65 20 61 20 68 61 73 68 20  * Create a hash 
2c70: 74 61 62 6c 65 2c 20 66 72 65 65 20 61 20 68 61  table, free a ha
2c80: 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  sh table..*/.int
2c90: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
2ca0: 4e 65 77 28 46 74 73 35 48 61 73 68 2a 2a 2c 20  New(Fts5Hash**, 
2cb0: 69 6e 74 20 2a 70 6e 53 69 7a 65 29 3b 0a 76 6f  int *pnSize);.vo
2cc0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  id sqlite3Fts5Ha
2cd0: 73 68 46 72 65 65 28 46 74 73 35 48 61 73 68 2a  shFree(Fts5Hash*
2ce0: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
2cf0: 74 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20  ts5HashWrite(.  
2d00: 46 74 73 35 48 61 73 68 2a 2c 0a 20 20 69 36 34  Fts5Hash*,.  i64
2d10: 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d30: 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 65  Rowid for this e
2d40: 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ntry */.  int iC
2d50: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
2d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
2d70: 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  umn token appear
2d80: 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c  s in (-ve -> del
2d90: 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ete) */.  int iP
2da0: 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  os,             
2db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
2dc0: 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77  ition of token w
2dd0: 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ithin column */.
2de0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
2df0: 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
2e00: 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64    /* Token to ad
2e10: 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f  d or remove to o
2e20: 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a  r from index */.
2e30: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70 74 79 20  );../*.** Empty 
2e40: 28 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65  (but do not dele
2e50: 74 65 29 20 61 20 68 61 73 68 20 74 61 62 6c 65  te) a hash table
2e60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2e70: 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 46  3Fts5HashClear(F
2e80: 74 73 35 48 61 73 68 2a 29 3b 0a 0a 2f 2a 0a 2a  ts5Hash*);../*.*
2e90: 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
2ea0: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
2eb0: 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  f the hash table
2ec0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ed0: 46 74 73 35 48 61 73 68 49 74 65 72 61 74 65 28  Fts5HashIterate(
2ee0: 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 0a 20 20  .  Fts5Hash*,.  
2ef0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
2f00: 74 20 28 2a 78 54 65 72 6d 29 28 76 6f 69 64 2a  t (*xTerm)(void*
2f10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
2f20: 6e 74 29 2c 0a 20 20 69 6e 74 20 28 2a 78 45 6e  nt),.  int (*xEn
2f30: 74 72 79 29 28 76 6f 69 64 2a 2c 20 69 36 34 2c  try)(void*, i64,
2f40: 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29   const u8*, int)
2f50: 2c 0a 20 20 69 6e 74 20 28 2a 78 54 65 72 6d 44  ,.  int (*xTermD
2f60: 6f 6e 65 29 28 76 6f 69 64 2a 29 0a 29 3b 0a 0a  one)(void*).);..
2f70: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
2f80: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
2f90: 20 69 6e 20 66 74 73 35 5f 68 61 73 68 2e 63 2e   in fts5_hash.c.
2fa0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
2ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
3040: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
3050: 6e 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63  n fts5_storage.c
3060: 2e 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63  . fts5_storage.c
3070: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69   contains contai
3080: 6e 73 20 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 61  ns .** code to a
3090: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 20 73  ccess the data s
30a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f 63  tored in the %_c
30b0: 6f 6e 74 65 6e 74 20 61 6e 64 20 25 5f 64 6f 63  ontent and %_doc
30c0: 73 69 7a 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  size tables..*/.
30d0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
30e0: 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20 30 20 20  MT_SCAN_ASC  0  
30f0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77     /* SELECT row
3100: 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  id, * FROM ... O
3110: 52 44 45 52 20 42 59 20 31 20 41 53 43 20 2a 2f  RDER BY 1 ASC */
3120: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
3130: 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20 31 20 20  MT_SCAN_DESC 1  
3140: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77     /* SELECT row
3150: 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  id, * FROM ... O
3160: 52 44 45 52 20 42 59 20 31 20 44 45 53 43 20 2a  RDER BY 1 DESC *
3170: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  /.#define FTS5_S
3180: 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20 20 32 20  TMT_LOOKUP    2 
3190: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f      /* SELECT ro
31a0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20  wid, * FROM ... 
31b0: 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 20 2a 2f  WHERE rowid=? */
31c0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
31d0: 20 46 74 73 35 53 74 6f 72 61 67 65 20 46 74 73   Fts5Storage Fts
31e0: 35 53 74 6f 72 61 67 65 3b 0a 0a 69 6e 74 20 73  5Storage;..int s
31f0: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
3200: 65 4f 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67  eOpen(Fts5Config
3210: 2a 2c 20 46 74 73 35 49 6e 64 65 78 2a 2c 20 69  *, Fts5Index*, i
3220: 6e 74 2c 20 46 74 73 35 53 74 6f 72 61 67 65 2a  nt, Fts5Storage*
3230: 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69 6e 74 20  *, char**);.int 
3240: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
3250: 67 65 43 6c 6f 73 65 28 46 74 73 35 53 74 6f 72  geClose(Fts5Stor
3260: 61 67 65 20 2a 70 2c 20 69 6e 74 20 62 44 65 73  age *p, int bDes
3270: 74 72 6f 79 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  troy);..int sqli
3280: 74 65 33 46 74 73 35 44 72 6f 70 54 61 62 6c 65  te3Fts5DropTable
3290: 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 63 6f  (Fts5Config*, co
32a0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f 73 74 29  nst char *zPost)
32b0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
32c0: 35 43 72 65 61 74 65 54 61 62 6c 65 28 46 74 73  5CreateTable(Fts
32d0: 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20  5Config*, const 
32e0: 63 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61  char*, const cha
32f0: 72 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2a  r*, int, char **
3300: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
3310: 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65  ts5StorageDelete
3320: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
3330: 20 69 36 34 29 3b 0a 69 6e 74 20 73 71 6c 69 74   i64);.int sqlit
3340: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 73  e3Fts5StorageIns
3350: 65 72 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  ert(Fts5Storage 
3360: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  *p, sqlite3_valu
3370: 65 20 2a 2a 61 70 56 61 6c 2c 20 69 6e 74 2c 20  e **apVal, int, 
3380: 69 36 34 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  i64*);..int sqli
3390: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e  te3Fts5StorageIn
33a0: 74 65 67 72 69 74 79 28 46 74 73 35 53 74 6f 72  tegrity(Fts5Stor
33b0: 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71  age *p);..int sq
33c0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
33d0: 53 74 6d 74 28 46 74 73 35 53 74 6f 72 61 67 65  Stmt(Fts5Storage
33e0: 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20   *p, int eStmt, 
33f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 29  sqlite3_stmt **)
3400: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
3410: 73 35 53 74 6f 72 61 67 65 53 74 6d 74 52 65 6c  s5StorageStmtRel
3420: 65 61 73 65 28 46 74 73 35 53 74 6f 72 61 67 65  ease(Fts5Storage
3430: 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20   *p, int eStmt, 
3440: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a  sqlite3_stmt*);.
3450: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3460: 53 74 6f 72 61 67 65 44 6f 63 73 69 7a 65 28 46  StorageDocsize(F
3470: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
3480: 36 34 20 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a  64 iRowid, int *
3490: 61 43 6f 6c 29 3b 0a 69 6e 74 20 73 71 6c 69 74  aCol);.int sqlit
34a0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 53 69 7a  e3Fts5StorageSiz
34b0: 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  e(Fts5Storage *p
34c0: 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 36 34 20  , int iCol, i64 
34d0: 2a 70 6e 41 76 67 29 3b 0a 69 6e 74 20 73 71 6c  *pnAvg);.int sql
34e0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
34f0: 6f 77 43 6f 75 6e 74 28 46 74 73 35 53 74 6f 72  owCount(Fts5Stor
3500: 61 67 65 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52  age *p, i64 *pnR
3510: 6f 77 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ow);..int sqlite
3520: 33 46 74 73 35 53 74 6f 72 61 67 65 53 79 6e 63  3Fts5StorageSync
3530: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
3540: 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 3b 0a 69   int bCommit);.i
3550: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
3560: 6f 72 61 67 65 52 6f 6c 6c 62 61 63 6b 28 46 74  orageRollback(Ft
3570: 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0a 0a  s5Storage *p);..
3580: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
3590: 74 6f 72 61 67 65 43 6f 6e 66 69 67 56 61 6c 75  torageConfigValu
35a0: 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  e(Fts5Storage *p
35b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73  , const char*, s
35c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b 0a  qlite3_value*);.
35d0: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
35e0: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
35f0: 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e  in fts5_storage.
3600: 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c..*************
3610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
3650: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
3660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
36a0: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
36b0: 65 20 69 6e 20 66 74 73 35 5f 65 78 70 72 2e 63  e in fts5_expr.c
36c0: 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  . .*/.typedef st
36d0: 72 75 63 74 20 46 74 73 35 45 78 70 72 20 46 74  ruct Fts5Expr Ft
36e0: 73 35 45 78 70 72 3b 0a 74 79 70 65 64 65 66 20  s5Expr;.typedef 
36f0: 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72 4e  struct Fts5ExprN
3700: 6f 64 65 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ode Fts5ExprNode
3710: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
3720: 20 46 74 73 35 50 61 72 73 65 20 46 74 73 35 50   Fts5Parse Fts5P
3730: 61 72 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74  arse;.typedef st
3740: 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e 20 46  ruct Fts5Token F
3750: 74 73 35 54 6f 6b 65 6e 3b 0a 74 79 70 65 64 65  ts5Token;.typede
3760: 66 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70  f struct Fts5Exp
3770: 72 50 68 72 61 73 65 20 46 74 73 35 45 78 70 72  rPhrase Fts5Expr
3780: 50 68 72 61 73 65 3b 0a 74 79 70 65 64 65 66 20  Phrase;.typedef 
3790: 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72 4e  struct Fts5ExprN
37a0: 65 61 72 73 65 74 20 46 74 73 35 45 78 70 72 4e  earset Fts5ExprN
37b0: 65 61 72 73 65 74 3b 0a 0a 73 74 72 75 63 74 20  earset;..struct 
37c0: 46 74 73 35 54 6f 6b 65 6e 20 7b 0a 20 20 63 6f  Fts5Token {.  co
37d0: 6e 73 74 20 63 68 61 72 20 2a 70 3b 20 20 20 20  nst char *p;    
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37f0: 20 54 6f 6b 65 6e 20 74 65 78 74 20 28 6e 6f 74   Token text (not
3800: 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64   NULL terminated
3810: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  ) */.  int n;   
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
3840: 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62 79  f buffer p in by
3850: 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61  tes */.};../* Pa
3860: 72 73 65 20 61 20 4d 41 54 43 48 20 65 78 70 72  rse a MATCH expr
3870: 65 73 73 69 6f 6e 2e 20 2a 2f 0a 69 6e 74 20 73  ession. */.int s
3880: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e 65  qlite3Fts5ExprNe
3890: 77 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  w(.  Fts5Config 
38a0: 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 63 6f 6e  *pConfig, .  con
38b0: 73 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c 0a  st char *zExpr,.
38c0: 20 20 46 74 73 35 45 78 70 72 20 2a 2a 70 70 4e    Fts5Expr **ppN
38d0: 65 77 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a  ew, .  char **pz
38e0: 45 72 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f  Err.);../*.** fo
38f0: 72 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  r(rc = sqlite3Ft
3900: 73 35 45 78 70 72 46 69 72 73 74 28 70 45 78 70  s5ExprFirst(pExp
3910: 72 2c 20 70 49 64 78 2c 20 62 41 73 63 29 3b 0a  r, pIdx, bAsc);.
3920: 2a 2a 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  **     rc==SQLIT
3930: 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74  E_OK && 0==sqlit
3940: 65 33 46 74 73 35 45 78 70 72 45 6f 66 28 70 45  e3Fts5ExprEof(pE
3950: 78 70 72 29 3b 0a 2a 2a 20 20 20 20 20 72 63 20  xpr);.**     rc 
3960: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  = sqlite3Fts5Exp
3970: 72 4e 65 78 74 28 70 45 78 70 72 29 0a 2a 2a 20  rNext(pExpr).** 
3980: 29 7b 0a 2a 2a 20 20 20 2f 2f 20 54 68 65 20 64  ){.**   // The d
3990: 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77  ocument with row
39a0: 69 64 20 69 52 6f 77 69 64 20 6d 61 74 63 68 65  id iRowid matche
39b0: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
39c0: 21 0a 2a 2a 20 20 20 69 36 34 20 69 52 6f 77 69  !.**   i64 iRowi
39d0: 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  d = sqlite3Fts5E
39e0: 78 70 72 52 6f 77 69 64 28 70 45 78 70 72 29 3b  xprRowid(pExpr);
39f0: 0a 2a 2a 20 7d 0a 2a 2f 0a 69 6e 74 20 73 71 6c  .** }.*/.int sql
3a00: 69 74 65 33 46 74 73 35 45 78 70 72 46 69 72 73  ite3Fts5ExprFirs
3a10: 74 28 46 74 73 35 45 78 70 72 2a 2c 20 46 74 73  t(Fts5Expr*, Fts
3a20: 35 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e  5Index *pIdx, in
3a30: 74 20 62 41 73 63 29 3b 0a 69 6e 74 20 73 71 6c  t bAsc);.int sql
3a40: 69 74 65 33 46 74 73 35 45 78 70 72 4e 65 78 74  ite3Fts5ExprNext
3a50: 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 69 6e 74  (Fts5Expr*);.int
3a60: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
3a70: 45 6f 66 28 46 74 73 35 45 78 70 72 2a 29 3b 0a  Eof(Fts5Expr*);.
3a80: 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 45  i64 sqlite3Fts5E
3a90: 78 70 72 52 6f 77 69 64 28 46 74 73 35 45 78 70  xprRowid(Fts5Exp
3aa0: 72 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74  r*);..void sqlit
3ab0: 65 33 46 74 73 35 45 78 70 72 46 72 65 65 28 46  e3Fts5ExprFree(F
3ac0: 74 73 35 45 78 70 72 2a 29 3b 0a 0a 2f 2a 20 43  ts5Expr*);../* C
3ad0: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 73 74 61  alled during sta
3ae0: 72 74 75 70 20 74 6f 20 72 65 67 69 73 74 65 72  rtup to register
3af0: 20 61 20 55 44 46 20 77 69 74 68 20 53 51 4c 69   a UDF with SQLi
3b00: 74 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  te */.int sqlite
3b10: 33 46 74 73 35 45 78 70 72 49 6e 69 74 28 46 74  3Fts5ExprInit(Ft
3b20: 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74  s5Global*, sqlit
3b30: 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  e3*);..int sqlit
3b40: 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65  e3Fts5ExprPhrase
3b50: 43 6f 75 6e 74 28 46 74 73 35 45 78 70 72 2a 29  Count(Fts5Expr*)
3b60: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
3b70: 35 45 78 70 72 50 68 72 61 73 65 53 69 7a 65 28  5ExprPhraseSize(
3b80: 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 20 69  Fts5Expr*, int i
3b90: 50 68 72 61 73 65 29 3b 0a 69 6e 74 20 73 71 6c  Phrase);.int sql
3ba0: 69 74 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c  ite3Fts5ExprPosl
3bb0: 69 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20 69  ist(Fts5Expr*, i
3bc0: 6e 74 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 29  nt, const u8 **)
3bd0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
3be0: 73 35 45 78 70 72 50 68 72 61 73 65 45 78 70 72  s5ExprPhraseExpr
3bf0: 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46 74  (Fts5Config*, Ft
3c00: 73 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20 46 74  s5Expr*, int, Ft
3c10: 73 35 45 78 70 72 2a 2a 29 3b 0a 0a 2f 2a 2a 2a  s5Expr**);../***
3c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c40: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
3c50: 66 74 73 35 5f 65 78 70 72 2e 63 20 41 50 49 20  fts5_expr.c API 
3c60: 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74  above this point
3c70: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
3c80: 6f 74 68 65 72 20 68 61 6e 64 2d 77 72 69 74 74  other hand-writt
3c90: 65 6e 0a 2a 2a 20 43 20 63 6f 64 65 20 69 6e 20  en.** C code in 
3ca0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 20 54 68 65  this module. The
3cb0: 20 69 6e 74 65 72 66 61 63 65 73 20 62 65 6c 6f   interfaces belo
3cc0: 77 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65  w this point are
3cd0: 20 63 61 6c 6c 65 64 20 62 79 0a 2a 2a 20 74 68   called by.** th
3ce0: 65 20 70 61 72 73 65 72 20 63 6f 64 65 20 69 6e  e parser code in
3cf0: 20 66 74 73 35 70 61 72 73 65 2e 79 2e 20 20 2a   fts5parse.y.  *
3d00: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  /..void sqlite3F
3d10: 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 46 74  ts5ParseError(Ft
3d20: 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s5Parse *pParse,
3d30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
3d40: 74 2c 20 2e 2e 2e 29 3b 0a 0a 46 74 73 35 45 78  t, ...);..Fts5Ex
3d50: 70 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65 33 46  prNode *sqlite3F
3d60: 74 73 35 50 61 72 73 65 4e 6f 64 65 28 0a 20 20  ts5ParseNode(.  
3d70: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
3d80: 65 2c 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 0a  e,.  int eType,.
3d90: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
3da0: 70 4c 65 66 74 2c 0a 20 20 46 74 73 35 45 78 70  pLeft,.  Fts5Exp
3db0: 72 4e 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a 20  rNode *pRight,. 
3dc0: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
3dd0: 20 2a 70 4e 65 61 72 0a 29 3b 0a 0a 46 74 73 35   *pNear.);..Fts5
3de0: 45 78 70 72 50 68 72 61 73 65 20 2a 73 71 6c 69  ExprPhrase *sqli
3df0: 74 65 33 46 74 73 35 50 61 72 73 65 54 65 72 6d  te3Fts5ParseTerm
3e00: 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70  (.  Fts5Parse *p
3e10: 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78  Parse, .  Fts5Ex
3e20: 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
3e30: 65 2c 20 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20  e, .  Fts5Token 
3e40: 2a 70 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 62  *pToken,.  int b
3e50: 50 72 65 66 69 78 0a 29 3b 0a 0a 46 74 73 35 45  Prefix.);..Fts5E
3e60: 78 70 72 4e 65 61 72 73 65 74 20 2a 73 71 6c 69  xprNearset *sqli
3e70: 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72  te3Fts5ParseNear
3e80: 73 65 74 28 0a 20 20 46 74 73 35 50 61 72 73 65  set(.  Fts5Parse
3e90: 2a 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e 65  *, .  Fts5ExprNe
3ea0: 61 72 73 65 74 2a 2c 0a 20 20 46 74 73 35 45 78  arset*,.  Fts5Ex
3eb0: 70 72 50 68 72 61 73 65 2a 20 0a 29 3b 0a 0a 76  prPhrase* .);..v
3ec0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
3ed0: 61 72 73 65 50 68 72 61 73 65 46 72 65 65 28 46  arsePhraseFree(F
3ee0: 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b  ts5ExprPhrase*);
3ef0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
3f00: 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72 65  5ParseNearsetFre
3f10: 65 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  e(Fts5ExprNearse
3f20: 74 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  t*);.void sqlite
3f30: 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72  3Fts5ParseNodeFr
3f40: 65 65 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a  ee(Fts5ExprNode*
3f50: 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  );..void sqlite3
3f60: 46 74 73 35 50 61 72 73 65 53 65 74 44 69 73 74  Fts5ParseSetDist
3f70: 61 6e 63 65 28 46 74 73 35 50 61 72 73 65 2a 2c  ance(Fts5Parse*,
3f80: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
3f90: 2a 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a  *, Fts5Token*);.
3fa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
3fb0: 50 61 72 73 65 53 65 74 43 6f 6c 75 6d 6e 28 46  ParseSetColumn(F
3fc0: 74 73 35 50 61 72 73 65 2a 2c 20 46 74 73 35 45  ts5Parse*, Fts5E
3fd0: 78 70 72 4e 65 61 72 73 65 74 2a 2c 20 46 74 73  xprNearset*, Fts
3fe0: 35 54 6f 6b 65 6e 2a 29 3b 0a 76 6f 69 64 20 73  5Token*);.void s
3ff0: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46  qlite3Fts5ParseF
4000: 69 6e 69 73 68 65 64 28 46 74 73 35 50 61 72 73  inished(Fts5Pars
4010: 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45  e *pParse, Fts5E
4020: 78 70 72 4e 6f 64 65 20 2a 70 29 3b 0a 76 6f 69  xprNode *p);.voi
4030: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
4040: 73 65 4e 65 61 72 28 46 74 73 35 50 61 72 73 65  seNear(Fts5Parse
4050: 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 54 6f   *pParse, Fts5To
4060: 6b 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e  ken*);../*.** En
4070: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
4080: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 65  o code in fts5_e
4090: 78 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  xpr.c..*********
40a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40e0: 2a 2f 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  */..../*********
40f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4130: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
4140: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 61  o code in fts5_a
4150: 75 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73  ux.c. .*/..int s
4160: 71 6c 69 74 65 33 46 74 73 35 41 75 78 49 6e 69  qlite3Fts5AuxIni
4170: 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a  t(fts5_api*);./*
4180: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
4190: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
41a0: 66 74 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a 2a 2a  fts5_aux.c..****
41b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
4200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4240: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
4250: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
4260: 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 20 0a  5_tokenizer.c. .
4270: 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  */..int sqlite3F
4280: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e 69 74  ts5TokenizerInit
4290: 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a  (fts5_api*);./*.
42a0: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
42b0: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
42c0: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e  ts5_tokenizer.c.
42d0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
42e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
4320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
4370: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
4380: 6e 20 66 74 73 35 5f 73 6f 72 74 65 72 2e 63 2e  n fts5_sorter.c.
4390: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
43a0: 75 63 74 20 46 74 73 35 53 6f 72 74 65 72 20 46  uct Fts5Sorter F
43b0: 74 73 35 53 6f 72 74 65 72 3b 0a 0a 69 6e 74 20  ts5Sorter;..int 
43c0: 73 71 6c 69 74 65 33 46 74 73 35 53 6f 72 74 65  sqlite3Fts5Sorte
43d0: 72 4e 65 77 28 46 74 73 35 45 78 70 72 20 2a 70  rNew(Fts5Expr *p
43e0: 45 78 70 72 2c 20 46 74 73 35 53 6f 72 74 65 72  Expr, Fts5Sorter
43f0: 20 2a 2a 70 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45   **pp);../*.** E
4400: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
4410: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
4420: 73 6f 72 74 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  sorter.c..******
4430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4470: 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 0a        ****/..#endif.