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

Artifact a6d1c30e1655bd91484cb98661581e35a130b87b:


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 0a 23 69 6e 63 6c 75 64 65 20 3c  5.h"..#include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
01d0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23  de <assert.h>..#
01e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
01f0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 0a 74 79 70 65  ALGAMATION..type
0200: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61  def unsigned cha
0210: 72 20 20 75 38 3b 0a 74 79 70 65 64 65 66 20 75  r  u8;.typedef u
0220: 6e 73 69 67 6e 65 64 20 69 6e 74 20 20 20 75 33  nsigned int   u3
0230: 32 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  2;.typedef unsig
0240: 6e 65 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74  ned short u16;.t
0250: 79 70 65 64 65 66 20 73 71 6c 69 74 65 33 5f 69  ypedef sqlite3_i
0260: 6e 74 36 34 20 69 36 34 3b 0a 74 79 70 65 64 65  nt64 i64;.typede
0270: 66 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34  f sqlite3_uint64
0280: 20 75 36 34 3b 0a 0a 23 64 65 66 69 6e 65 20 41   u64;..#define A
0290: 72 72 61 79 53 69 7a 65 28 78 29 20 28 73 69 7a  rraySize(x) (siz
02a0: 65 6f 66 28 78 29 20 2f 20 73 69 7a 65 6f 66 28  eof(x) / sizeof(
02b0: 78 5b 30 5d 29 29 0a 0a 23 64 65 66 69 6e 65 20  x[0]))..#define 
02c0: 74 65 73 74 63 61 73 65 28 78 29 0a 23 64 65 66  testcase(x).#def
02d0: 69 6e 65 20 41 4c 57 41 59 53 28 78 29 20 31 0a  ine ALWAYS(x) 1.
02e0: 23 64 65 66 69 6e 65 20 4e 45 56 45 52 28 78 29  #define NEVER(x)
02f0: 20 30 0a 0a 23 64 65 66 69 6e 65 20 4d 49 4e 28   0..#define MIN(
0300: 78 2c 79 29 20 28 28 28 78 29 20 3c 20 28 79 29  x,y) (((x) < (y)
0310: 29 20 3f 20 28 78 29 20 3a 20 28 79 29 29 0a 0a  ) ? (x) : (y))..
0320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  #endif.../*.** M
0330: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
0340: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   prefix indexes 
0350: 6f 6e 20 73 69 6e 67 6c 65 20 46 54 53 35 20 74  on single FTS5 t
0360: 61 62 6c 65 2e 20 54 68 69 73 20 6d 75 73 74 20  able. This must 
0370: 62 65 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20  be.** less than 
0380: 33 32 2e 20 49 66 20 69 74 20 69 73 20 73 65 74  32. If it is set
0390: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 6c 61 72   to anything lar
03a0: 67 65 20 74 68 61 6e 20 74 68 61 74 2c 20 61 6e  ge than that, an
03b0: 20 23 65 72 72 6f 72 0a 2a 2a 20 64 69 72 65 63   #error.** direc
03c0: 74 69 76 65 20 69 6e 20 66 74 73 35 5f 69 6e 64  tive in fts5_ind
03d0: 65 78 2e 63 20 77 69 6c 6c 20 63 61 75 73 65 20  ex.c will cause 
03e0: 74 68 65 20 62 75 69 6c 64 20 74 6f 20 66 61 69  the build to fai
03f0: 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  l..*/.#define FT
0400: 53 35 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e  S5_MAX_PREFIX_IN
0410: 44 45 58 45 53 20 33 31 0a 0a 23 64 65 66 69 6e  DEXES 31..#defin
0420: 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 4e  e FTS5_DEFAULT_N
0430: 45 41 52 44 49 53 54 20 31 30 0a 23 64 65 66 69  EARDIST 10.#defi
0440: 6e 65 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f  ne FTS5_DEFAULT_
0450: 52 41 4e 4b 20 20 20 20 20 22 62 6d 32 35 22 0a  RANK     "bm25".
0460: 0a 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 61 6e 6b  ./* Name of rank
0470: 20 61 6e 64 20 72 6f 77 69 64 20 63 6f 6c 75 6d   and rowid colum
0480: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  ns */.#define FT
0490: 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45 20 22 72 61  S5_RANK_NAME "ra
04a0: 6e 6b 22 0a 23 64 65 66 69 6e 65 20 46 54 53 35  nk".#define FTS5
04b0: 5f 52 4f 57 49 44 5f 4e 41 4d 45 20 22 72 6f 77  _ROWID_NAME "row
04c0: 69 64 22 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  id"..#ifdef SQLI
04d0: 54 45 5f 44 45 42 55 47 0a 23 20 64 65 66 69 6e  TE_DEBUG.# defin
04e0: 65 20 46 54 53 35 5f 43 4f 52 52 55 50 54 20 73  e FTS5_CORRUPT s
04f0: 71 6c 69 74 65 33 46 74 73 35 43 6f 72 72 75 70  qlite3Fts5Corrup
0500: 74 28 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  t().int sqlite3F
0510: 74 73 35 43 6f 72 72 75 70 74 28 76 6f 69 64 29  ts5Corrupt(void)
0520: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
0530: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 20 53 51   FTS5_CORRUPT SQ
0540: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
0550: 42 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  B.#endif../*.** 
0560: 54 68 65 20 61 73 73 65 72 74 5f 6e 63 28 29 20  The assert_nc() 
0570: 6d 61 63 72 6f 20 69 73 20 73 69 6d 69 6c 61 72  macro is similar
0580: 20 74 6f 20 74 68 65 20 61 73 73 65 72 74 28 29   to the assert()
0590: 20 6d 61 63 72 6f 2c 20 65 78 63 65 70 74 20 74   macro, except t
05a0: 68 61 74 20 69 74 0a 2a 2a 20 69 73 20 75 73 65  hat it.** is use
05b0: 64 20 66 6f 72 20 61 73 73 65 72 74 28 29 20 63  d for assert() c
05c0: 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61  onditions that a
05d0: 72 65 20 74 72 75 65 20 6f 6e 6c 79 20 69 66 20  re true only if 
05e0: 69 74 20 63 61 6e 20 62 65 20 0a 2a 2a 20 67 75  it can be .** gu
05f0: 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
0600: 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
0610: 20 63 6f 72 72 75 70 74 2e 0a 2a 2f 0a 23 69 66   corrupt..*/.#if
0620: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0630: 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
0640: 74 65 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f  te3_fts5_may_be_
0650: 63 6f 72 72 75 70 74 3b 0a 23 20 64 65 66 69 6e  corrupt;.# defin
0660: 65 20 61 73 73 65 72 74 5f 6e 63 28 78 29 20 61  e assert_nc(x) a
0670: 73 73 65 72 74 28 73 71 6c 69 74 65 33 5f 66 74  ssert(sqlite3_ft
0680: 73 35 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70  s5_may_be_corrup
0690: 74 20 7c 7c 20 28 78 29 29 0a 23 65 6c 73 65 0a  t || (x)).#else.
06a0: 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 5f  # define assert_
06b0: 6e 63 28 78 29 20 61 73 73 65 72 74 28 78 29 0a  nc(x) assert(x).
06c0: 23 65 6e 64 69 66 0a 0a 74 79 70 65 64 65 66 20  #endif..typedef 
06d0: 73 74 72 75 63 74 20 46 74 73 35 47 6c 6f 62 61  struct Fts5Globa
06e0: 6c 20 46 74 73 35 47 6c 6f 62 61 6c 3b 0a 0a 2f  l Fts5Global;../
06f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e  **********.** In
0740: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
0750: 69 6e 20 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63  in fts5_config.c
0760: 2e 20 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63 20  . fts5_config.c 
0770: 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e  contains contain
0780: 73 20 63 6f 64 65 0a 2a 2a 20 74 6f 20 70 61 72  s code.** to par
0790: 73 65 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  se the arguments
07a0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 43   passed to the C
07b0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
07c0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
07d0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
07e0: 74 20 46 74 73 35 43 6f 6e 66 69 67 20 46 74 73  t Fts5Config Fts
07f0: 35 43 6f 6e 66 69 67 3b 0a 0a 2f 2a 0a 2a 2a 20  5Config;../*.** 
0800: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0810: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0820: 75 63 74 75 72 65 20 65 6e 63 6f 64 65 73 20 61  ucture encodes a
0830: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ll information t
0840: 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 67 6c  hat can.** be gl
0850: 65 61 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 43  eaned from the C
0860: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0870: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
0880: 2a 0a 2a 2a 20 41 6e 64 20 61 6c 6c 20 69 6e 66  *.** And all inf
0890: 6f 72 6d 61 74 69 6f 6e 20 6c 6f 61 64 65 64 20  ormation loaded 
08a0: 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 66 69  from the %_confi
08b0: 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e  g table..**.** n
08c0: 41 75 74 6f 6d 65 72 67 65 3a 0a 2a 2a 20 20 20  Automerge:.**   
08d0: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62  The minimum numb
08e0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
08f0: 68 61 74 20 61 6e 20 61 75 74 6f 2d 6d 65 72 67  hat an auto-merg
0900: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 68 6f 75  e operation shou
0910: 6c 64 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20  ld.**   attempt 
0920: 74 6f 20 6d 65 72 67 65 20 74 6f 67 65 74 68 65  to merge togethe
0930: 72 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 31 20  r. A value of 1 
0940: 73 65 74 73 20 74 68 65 20 6f 62 6a 65 63 74 20  sets the object 
0950: 74 6f 20 75 73 65 20 74 68 65 20 0a 2a 2a 20 20  to use the .**  
0960: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 64 65   compile time de
0970: 66 61 75 6c 74 2e 20 5a 65 72 6f 20 64 69 73 61  fault. Zero disa
0980: 62 6c 65 73 20 61 75 74 6f 2d 6d 65 72 67 65 20  bles auto-merge 
0990: 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a  altogether..**.*
09a0: 2a 20 7a 43 6f 6e 74 65 6e 74 3a 0a 2a 2a 0a 2a  * zContent:.**.*
09b0: 2a 20 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3a  * zContentRowid:
09c0: 0a 2a 2a 20 20 20 54 68 65 20 76 61 6c 75 65 20  .**   The value 
09d0: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 5f 72  of the content_r
09e0: 6f 77 69 64 3d 20 6f 70 74 69 6f 6e 2c 20 69 66  owid= option, if
09f0: 20 6f 6e 65 20 77 61 73 20 73 70 65 63 69 66 69   one was specifi
0a00: 65 64 2e 20 4f 72 20 0a 2a 2a 20 20 20 74 68 65  ed. Or .**   the
0a10: 20 73 74 72 69 6e 67 20 22 72 6f 77 69 64 22 20   string "rowid" 
0a20: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
0a30: 74 65 78 74 20 69 73 20 6e 6f 74 20 71 75 6f 74  text is not quot
0a40: 65 64 20 2d 20 69 66 20 69 74 20 69 73 0a 2a 2a  ed - if it is.**
0a50: 20 20 20 75 73 65 64 20 61 73 20 70 61 72 74 20     used as part 
0a60: 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  of an SQL statem
0a70: 65 6e 74 20 69 74 20 6e 65 65 64 73 20 74 6f 20  ent it needs to 
0a80: 62 65 20 71 75 6f 74 65 64 20 61 70 70 72 6f 70  be quoted approp
0a90: 72 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 7a  riately..**.** z
0aa0: 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74 3a  ContentExprlist:
0ab0: 0a 2a 2a 0a 2a 2a 20 70 7a 45 72 72 6d 73 67 3a  .**.** pzErrmsg:
0ac0: 0a 2a 2a 20 20 20 54 68 69 73 20 65 78 69 73 74  .**   This exist
0ad0: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c  s in order to al
0ae0: 6c 6f 77 20 74 68 65 20 66 74 73 35 5f 69 6e 64  low the fts5_ind
0af0: 65 78 2e 63 20 6d 6f 64 75 6c 65 20 74 6f 20 72  ex.c module to r
0b00: 65 74 75 72 6e 20 61 20 0a 2a 2a 20 20 20 64 65  eturn a .**   de
0b10: 63 65 6e 74 20 65 72 72 6f 72 20 6d 65 73 73 61  cent error messa
0b20: 67 65 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  ge if it encount
0b30: 65 72 73 20 61 20 66 69 6c 65 2d 66 6f 72 6d 61  ers a file-forma
0b40: 74 20 76 65 72 73 69 6f 6e 20 69 74 20 64 6f 65  t version it doe
0b50: 73 0a 2a 2a 20 20 20 6e 6f 74 20 75 6e 64 65 72  s.**   not under
0b60: 73 74 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 62 43 6f  stand..**.** bCo
0b70: 6c 75 6d 6e 73 69 7a 65 3a 0a 2a 2a 20 20 20 54  lumnsize:.**   T
0b80: 72 75 65 20 69 66 20 74 68 65 20 25 5f 64 6f 63  rue if the %_doc
0b90: 73 69 7a 65 20 74 61 62 6c 65 20 69 73 20 63 72  size table is cr
0ba0: 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  eated..**.*/.str
0bb0: 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67 20 7b  uct Fts5Config {
0bc0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
0bf0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  andle */.  char 
0c00: 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
0c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
0c20: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 46  tabase holding F
0c30: 54 53 20 69 6e 64 65 78 20 28 65 2e 67 2e 20 22  TS index (e.g. "
0c40: 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 63 68 61 72  main") */.  char
0c50: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0c70: 61 6d 65 20 6f 66 20 46 54 53 20 69 6e 64 65 78  ame of FTS index
0c80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0cb0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
0cc0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20  char **azCol;   
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
0cf0: 2a 2f 0a 20 20 75 38 20 2a 61 62 55 6e 69 6e 64  */.  u8 *abUnind
0d00: 65 78 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  exed;           
0d10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
0d20: 20 75 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d   unindexed colum
0d30: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  ns */.  int nPre
0d40: 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
0d50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0d60: 72 20 6f 66 20 70 72 65 66 69 78 20 69 6e 64 65  r of prefix inde
0d70: 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  xes */.  int *aP
0d80: 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
0d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
0da0: 73 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6e 50  s in bytes of nP
0db0: 72 65 66 69 78 20 70 72 65 66 69 78 20 69 6e 64  refix prefix ind
0dc0: 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 43  exes */.  int eC
0dd0: 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20  ontent;         
0de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
0df0: 46 54 53 35 5f 43 4f 4e 54 45 4e 54 20 76 61 6c  FTS5_CONTENT val
0e00: 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ue */.  char *zC
0e10: 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20  ontent;         
0e20: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
0e30: 6e 74 20 74 61 62 6c 65 20 2a 2f 20 0a 20 20 63  nt table */ .  c
0e40: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 52 6f 77  har *zContentRow
0e50: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  id;            /
0e60: 2a 20 22 63 6f 6e 74 65 6e 74 5f 72 6f 77 69 64  * "content_rowid
0e70: 3d 22 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20  =" option value 
0e80: 2a 2f 20 0a 20 20 69 6e 74 20 62 43 6f 6c 75 6d  */ .  int bColum
0e90: 6e 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nsize;          
0ea0: 20 20 20 20 20 20 2f 2a 20 22 63 6f 6c 75 6d 6e        /* "column
0eb0: 73 69 7a 65 3d 22 20 6f 70 74 69 6f 6e 20 76 61  size=" option va
0ec0: 6c 75 65 20 28 64 66 6c 74 3d 3d 31 29 20 2a 2f  lue (dflt==1) */
0ed0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e  .  char *zConten
0ee0: 74 45 78 70 72 6c 69 73 74 3b 0a 20 20 46 74 73  tExprlist;.  Fts
0ef0: 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b  5Tokenizer *pTok
0f00: 3b 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a  ;.  fts5_tokeniz
0f10: 65 72 20 2a 70 54 6f 6b 41 70 69 3b 0a 0a 20 20  er *pTokApi;..  
0f20: 2f 2a 20 56 61 6c 75 65 73 20 6c 6f 61 64 65 64  /* Values loaded
0f30: 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 66   from the %_conf
0f40: 69 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ig table */.  in
0f50: 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20  t iCookie;      
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f70: 20 49 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   Incremented whe
0f80: 6e 20 25 5f 63 6f 6e 66 69 67 20 69 73 20 6d 6f  n %_config is mo
0f90: 64 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  dified */.  int 
0fa0: 70 67 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  pgsz;           
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0fc0: 70 70 72 6f 78 69 6d 61 74 65 20 70 61 67 65 20  pproximate page 
0fd0: 73 69 7a 65 20 75 73 65 64 20 69 6e 20 25 5f 64  size used in %_d
0fe0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 75  ata */.  int nAu
0ff0: 74 6f 6d 65 72 67 65 3b 20 20 20 20 20 20 20 20  tomerge;        
1000: 20 20 20 20 20 20 20 20 20 2f 2a 20 27 61 75 74           /* 'aut
1010: 6f 6d 65 72 67 65 27 20 73 65 74 74 69 6e 67 20  omerge' setting 
1020: 2a 2f 0a 20 20 69 6e 74 20 6e 43 72 69 73 69 73  */.  int nCrisis
1030: 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20  Merge;          
1040: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
1050: 61 6c 6c 6f 77 65 64 20 73 65 67 6d 65 6e 74 73  allowed segments
1060: 20 70 65 72 20 6c 65 76 65 6c 20 2a 2f 0a 20 20   per level */.  
1070: 63 68 61 72 20 2a 7a 52 61 6e 6b 3b 20 20 20 20  char *zRank;    
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 61 6e 6b 20  /* Name of rank 
10a0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  function */.  ch
10b0: 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73 3b 20 20  ar *zRankArgs;  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d0: 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 72 61   Arguments to ra
10e0: 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  nk function */..
10f0: 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c    /* If non-NULL
1100: 2c 20 70 6f 69 6e 74 73 20 74 6f 20 73 71 6c 69  , points to sqli
1110: 74 65 33 5f 76 74 61 62 2e 62 61 73 65 2e 7a 45  te3_vtab.base.zE
1120: 72 72 6d 73 67 2e 20 4f 66 74 65 6e 20 4e 55 4c  rrmsg. Often NUL
1130: 4c 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  L. */.  char **p
1140: 7a 45 72 72 6d 73 67 3b 0a 7d 3b 0a 0a 2f 2a 20  zErrmsg;.};../* 
1150: 43 75 72 72 65 6e 74 20 65 78 70 65 63 74 65 64  Current expected
1160: 20 76 61 6c 75 65 20 6f 66 20 25 5f 63 6f 6e 66   value of %_conf
1170: 69 67 20 74 61 62 6c 65 20 27 76 65 72 73 69 6f  ig table 'versio
1180: 6e 27 20 66 69 65 6c 64 20 2a 2f 0a 23 64 65 66  n' field */.#def
1190: 69 6e 65 20 46 54 53 35 5f 43 55 52 52 45 4e 54  ine FTS5_CURRENT
11a0: 5f 56 45 52 53 49 4f 4e 20 32 0a 0a 23 64 65 66  _VERSION 2..#def
11b0: 69 6e 65 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54  ine FTS5_CONTENT
11c0: 5f 4e 4f 52 4d 41 4c 20 20 20 30 0a 23 64 65 66  _NORMAL   0.#def
11d0: 69 6e 65 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54  ine FTS5_CONTENT
11e0: 5f 4e 4f 4e 45 20 20 20 20 20 31 0a 23 64 65 66  _NONE     1.#def
11f0: 69 6e 65 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54  ine FTS5_CONTENT
1200: 5f 45 58 54 45 52 4e 41 4c 20 32 0a 0a 0a 0a 0a  _EXTERNAL 2.....
1210: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
1220: 6f 6e 66 69 67 50 61 72 73 65 28 0a 20 20 20 20  onfigParse(.    
1230: 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c  Fts5Global*, sql
1240: 69 74 65 33 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73  ite3*, int, cons
1250: 74 20 63 68 61 72 20 2a 2a 2c 20 46 74 73 35 43  t char **, Fts5C
1260: 6f 6e 66 69 67 2a 2a 2c 20 63 68 61 72 2a 2a 0a  onfig**, char**.
1270: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
1280: 74 73 35 43 6f 6e 66 69 67 46 72 65 65 28 46 74  ts5ConfigFree(Ft
1290: 73 35 43 6f 6e 66 69 67 2a 29 3b 0a 0a 69 6e 74  s5Config*);..int
12a0: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
12b0: 69 67 44 65 63 6c 61 72 65 56 74 61 62 28 46 74  igDeclareVtab(Ft
12c0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
12d0: 67 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  g);..int sqlite3
12e0: 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 0a 20 20  Fts5Tokenize(.  
12f0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1300: 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  fig,            
1310: 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69 67 75 72  /* FTS5 Configur
1320: 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ation object */.
1330: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
1340: 65 78 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20  ext, int nText, 
1350: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 74 6f 6b    /* Text to tok
1360: 65 6e 69 7a 65 20 2a 2f 0a 20 20 76 6f 69 64 20  enize */.  void 
1370: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
1380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1390: 6e 74 65 78 74 20 70 61 73 73 65 64 20 74 6f 20  ntext passed to 
13a0: 78 54 6f 6b 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  xToken() */.  in
13b0: 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64  t (*xToken)(void
13c0: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
13d0: 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 20 20  int, int, int)  
13e0: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f    /* Callback */
13f0: 0a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  .);..void sqlite
1400: 33 46 74 73 35 44 65 71 75 6f 74 65 28 63 68 61  3Fts5Dequote(cha
1410: 72 20 2a 7a 29 3b 0a 0a 2f 2a 20 4c 6f 61 64 20  r *z);../* Load 
1420: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1430: 74 68 65 20 25 5f 63 6f 6e 66 69 67 20 74 61 62  the %_config tab
1440: 6c 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  le */.int sqlite
1450: 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28  3Fts5ConfigLoad(
1460: 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 69 6e 74  Fts5Config*, int
1470: 29 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 76  );../* Set the v
1480: 61 6c 75 65 20 6f 66 20 61 20 73 69 6e 67 6c 65  alue of a single
1490: 20 63 6f 6e 66 69 67 20 61 74 74 72 69 62 75 74   config attribut
14a0: 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e */.int sqlite3
14b0: 46 74 73 35 43 6f 6e 66 69 67 53 65 74 56 61 6c  Fts5ConfigSetVal
14c0: 75 65 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20  ue(Fts5Config*, 
14d0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c  const char*, sql
14e0: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74  ite3_value*, int
14f0: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
1500: 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 52  Fts5ConfigParseR
1510: 61 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ank(const char*,
1520: 20 63 68 61 72 2a 2a 2c 20 63 68 61 72 2a 2a 29   char**, char**)
1530: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  ;../*.** End of 
1540: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  interface to cod
1550: 65 20 69 6e 20 66 74 73 35 5f 63 6f 6e 66 69 67  e in fts5_config
1560: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
1570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15b0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
15c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
1600: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
1610: 65 20 69 6e 20 66 74 73 35 5f 62 75 66 66 65 72  e in fts5_buffer
1620: 2e 63 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 75  .c..*/../*.** Bu
1630: 66 66 65 72 20 6f 62 6a 65 63 74 20 66 6f 72 20  ffer object for 
1640: 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
1650: 62 75 69 6c 64 69 6e 67 20 6f 66 20 73 74 72 69  building of stri
1660: 6e 67 20 64 61 74 61 2e 0a 2a 2f 0a 74 79 70 65  ng data..*/.type
1670: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 42  def struct Fts5B
1680: 75 66 66 65 72 20 46 74 73 35 42 75 66 66 65 72  uffer Fts5Buffer
1690: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 42 75 66  ;.struct Fts5Buf
16a0: 66 65 72 20 7b 0a 20 20 75 38 20 2a 70 3b 0a 20  fer {.  u8 *p;. 
16b0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 53   int n;.  int nS
16c0: 70 61 63 65 3b 0a 7d 3b 0a 0a 69 6e 74 20 73 71  pace;.};..int sq
16d0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 47  lite3Fts5BufferG
16e0: 72 6f 77 28 69 6e 74 2a 2c 20 46 74 73 35 42 75  row(int*, Fts5Bu
16f0: 66 66 65 72 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69  ffer*, int);.voi
1700: 64 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  d sqlite3Fts5Buf
1710: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1720: 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72  int*, Fts5Buffer
1730: 2a 2c 20 69 36 34 29 3b 0a 76 6f 69 64 20 73 71  *, i64);.void sq
1740: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1750: 70 70 65 6e 64 42 6c 6f 62 28 69 6e 74 2a 2c 20  ppendBlob(int*, 
1760: 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69 6e 74  Fts5Buffer*, int
1770: 2c 20 63 6f 6e 73 74 20 75 38 2a 29 3b 0a 76 6f  , const u8*);.vo
1780: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  id sqlite3Fts5Bu
1790: 66 66 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67  fferAppendString
17a0: 28 69 6e 74 20 2a 2c 20 46 74 73 35 42 75 66 66  (int *, Fts5Buff
17b0: 65 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  er*, const char*
17c0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
17d0: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 46 74  ts5BufferFree(Ft
17e0: 73 35 42 75 66 66 65 72 2a 29 3b 0a 76 6f 69 64  s5Buffer*);.void
17f0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1800: 65 72 5a 65 72 6f 28 46 74 73 35 42 75 66 66 65  erZero(Fts5Buffe
1810: 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  r*);.void sqlite
1820: 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 69  3Fts5BufferSet(i
1830: 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  nt*, Fts5Buffer*
1840: 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38 2a  , int, const u8*
1850: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
1860: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
1870: 72 69 6e 74 66 28 69 6e 74 20 2a 2c 20 46 74 73  rintf(int *, Fts
1880: 35 42 75 66 66 65 72 2a 2c 20 63 68 61 72 20 2a  5Buffer*, char *
1890: 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0a 76 6f 69 64  zFmt, ...);.void
18a0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
18b0: 65 72 41 70 70 65 6e 64 33 32 28 69 6e 74 2a 2c  erAppend32(int*,
18c0: 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69 6e   Fts5Buffer*, in
18d0: 74 29 3b 0a 0a 63 68 61 72 20 2a 73 71 6c 69 74  t);..char *sqlit
18e0: 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 69 6e  e3Fts5Mprintf(in
18f0: 74 20 2a 70 52 63 2c 20 63 68 61 72 20 2a 7a 46  t *pRc, char *zF
1900: 6d 74 2c 20 2e 2e 2e 29 3b 0a 0a 23 64 65 66 69  mt, ...);..#defi
1910: 6e 65 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  ne fts5BufferZer
1920: 6f 28 78 29 20 20 20 20 20 20 20 20 20 20 20 20  o(x)            
1930: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1940: 65 72 5a 65 72 6f 28 78 29 0a 23 64 65 66 69 6e  erZero(x).#defin
1950: 65 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77  e fts5BufferGrow
1960: 28 61 2c 62 2c 63 29 20 20 20 20 20 20 20 20 20  (a,b,c)         
1970: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1980: 72 47 72 6f 77 28 61 2c 62 2c 63 29 0a 23 64 65  rGrow(a,b,c).#de
1990: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 41  fine fts5BufferA
19a0: 70 70 65 6e 64 56 61 72 69 6e 74 28 61 2c 62 2c  ppendVarint(a,b,
19b0: 63 29 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  c) sqlite3Fts5Bu
19c0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
19d0: 28 61 2c 62 2c 63 29 0a 23 64 65 66 69 6e 65 20  (a,b,c).#define 
19e0: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 61  fts5BufferFree(a
19f0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  )             sq
1a00: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
1a10: 72 65 65 28 61 29 0a 23 64 65 66 69 6e 65 20 66  ree(a).#define f
1a20: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1a30: 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20 73 71 6c  lob(a,b,c,d) sql
1a40: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1a50: 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c 64  pendBlob(a,b,c,d
1a60: 29 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ).#define fts5Bu
1a70: 66 66 65 72 53 65 74 28 61 2c 62 2c 63 2c 64 29  fferSet(a,b,c,d)
1a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1a90: 74 73 35 42 75 66 66 65 72 53 65 74 28 61 2c 62  ts5BufferSet(a,b
1aa0: 2c 63 2c 64 29 0a 23 64 65 66 69 6e 65 20 66 74  ,c,d).#define ft
1ab0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 33 32  s5BufferAppend32
1ac0: 28 61 2c 62 2c 63 29 20 20 20 20 20 73 71 6c 69  (a,b,c)     sqli
1ad0: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1ae0: 65 6e 64 33 32 28 61 2c 62 2c 63 29 0a 0a 2f 2a  end32(a,b,c)../*
1af0: 20 57 72 69 74 65 20 61 6e 64 20 64 65 63 6f 64   Write and decod
1b00: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d  e big-endian 32-
1b10: 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
1b20: 65 73 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  es */.void sqlit
1b30: 65 33 46 74 73 35 50 75 74 33 32 28 75 38 2a 2c  e3Fts5Put32(u8*,
1b40: 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74   int);.int sqlit
1b50: 65 33 46 74 73 35 47 65 74 33 32 28 63 6f 6e 73  e3Fts5Get32(cons
1b60: 74 20 75 38 2a 29 3b 0a 0a 23 64 65 66 69 6e 65  t u8*);..#define
1b70: 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
1b80: 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69 50 6f  (iPos) (int)(iPo
1b90: 73 20 3e 3e 20 33 32 29 0a 23 64 65 66 69 6e 65  s >> 32).#define
1ba0: 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
1bb0: 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69 50 6f  (iPos) (int)(iPo
1bc0: 73 20 26 20 30 78 46 46 46 46 46 46 46 46 29 0a  s & 0xFFFFFFFF).
1bd0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1be0: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1bf0: 72 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  r Fts5PoslistRea
1c00: 64 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35  der;.struct Fts5
1c10: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 7b 0a  PoslistReader {.
1c20: 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 75    /* Variables u
1c30: 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 71 6c 69  sed only by sqli
1c40: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 49 74  te3Fts5PoslistIt
1c50: 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  erXXX() function
1c60: 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  s. */.  int iCol
1c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c80: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 28 69          /* If (i
1c90: 43 6f 6c 3e 3d 30 29 2c 20 74 68 69 73 20 63 6f  Col>=0), this co
1ca0: 6c 75 6d 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63  lumn only */.  c
1cb0: 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20 20 20 20  onst u8 *a;     
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cd0: 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  * Position list 
1ce0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1cf0: 67 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  gh */.  int n;  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1d20: 6f 66 20 62 75 66 66 65 72 20 61 74 20 61 5b 5d  of buffer at a[]
1d30: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1d40: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d60: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
1d70: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a   in a[] */..  /*
1d80: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
1d90: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b  s */.  int bEof;
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
1dc0: 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a   true at EOF */.
1dd0: 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20 20 20    i64 iPos;     
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33 32 29 20    /* (iCol<<32) 
1e00: 2b 20 69 50 6f 73 20 2a 2f 0a 7d 3b 0a 69 6e 74  + iPos */.};.int
1e10: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1e20: 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 0a 20  istReaderInit(. 
1e30: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 2f 2a 20 49 66 20 28 69 43 6f 6c 3e 3d 30 29   /* If (iCol>=0)
1e60: 2c 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 6e  , this column on
1e70: 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ly */.  const u8
1e80: 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20   *a, int n,     
1e90: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69          /* Posli
1ea0: 73 74 20 62 75 66 66 65 72 20 74 6f 20 69 74 65  st buffer to ite
1eb0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a  rate through */.
1ec0: 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61    Fts5PoslistRea
1ed0: 64 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  der *pIter      
1ee0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62    /* Iterator ob
1ef0: 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  ject to initiali
1f00: 7a 65 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c  ze */.);.int sql
1f10: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
1f20: 65 61 64 65 72 4e 65 78 74 28 46 74 73 35 50 6f  eaderNext(Fts5Po
1f30: 73 6c 69 73 74 52 65 61 64 65 72 2a 29 3b 0a 0a  slistReader*);..
1f40: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
1f50: 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
1f60: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
1f70: 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35 50  er;.struct Fts5P
1f80: 6f 73 6c 69 73 74 57 72 69 74 65 72 20 7b 0a 20  oslistWriter {. 
1f90: 20 69 36 34 20 69 50 72 65 76 3b 0a 7d 3b 0a 69   i64 iPrev;.};.i
1fa0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  nt sqlite3Fts5Po
1fb0: 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e  slistWriterAppen
1fc0: 64 28 46 74 73 35 42 75 66 66 65 72 2a 2c 20 46  d(Fts5Buffer*, F
1fd0: 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
1fe0: 2a 2c 20 69 36 34 29 3b 0a 0a 69 6e 74 20 73 71  *, i64);..int sq
1ff0: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
2000: 4e 65 78 74 36 34 28 0a 20 20 63 6f 6e 73 74 20  Next64(.  const 
2010: 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20  u8 *a, int n,   
2020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
2030: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
2040: 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oslist */.  int 
2050: 2a 70 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pi,            
2060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2070: 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20 77 69  N/OUT: Offset wi
2080: 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 36  thin a[] */.  i6
2090: 34 20 2a 70 69 4f 66 66 20 20 20 20 20 20 20 20  4 *piOff        
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20b0: 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
20c0: 20 6f 66 66 73 65 74 20 2a 2f 0a 29 3b 0a 0a 2f   offset */.);../
20d0: 2a 20 4d 61 6c 6c 6f 63 20 75 74 69 6c 69 74 79  * Malloc utility
20e0: 20 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65   */.void *sqlite
20f0: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
2100: 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74 20 6e 42  int *pRc, int nB
2110: 79 74 65 29 3b 0a 63 68 61 72 20 2a 73 71 6c 69  yte);.char *sqli
2120: 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 69  te3Fts5Strndup(i
2130: 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63  nt *pRc, const c
2140: 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49  har *pIn, int nI
2150: 6e 29 3b 0a 0a 2f 2a 20 43 68 61 72 61 63 74 65  n);../* Characte
2160: 72 20 73 65 74 20 74 65 73 74 73 20 28 6c 69 6b  r set tests (lik
2170: 65 20 69 73 73 70 61 63 65 28 29 2c 20 69 73 61  e isspace(), isa
2180: 6c 70 68 61 28 29 20 65 74 63 2e 29 20 2a 2f 0a  lpha() etc.) */.
2190: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
21a0: 73 42 61 72 65 77 6f 72 64 28 63 68 61 72 20 74  sBareword(char t
21b0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  );../*.** End of
21c0: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   interface to co
21d0: 64 65 20 69 6e 20 66 74 73 35 5f 62 75 66 66 65  de in fts5_buffe
21e0: 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  r.c..***********
21f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2230: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2280: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
2290: 64 65 20 69 6e 20 66 74 73 35 5f 69 6e 64 65 78  de in fts5_index
22a0: 2e 63 2e 20 66 74 73 35 5f 69 6e 64 65 78 2e 63  .c. fts5_index.c
22b0: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69   contains contai
22c0: 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f 20 61 63  ns code.** to ac
22d0: 63 65 73 73 20 74 68 65 20 64 61 74 61 20 73 74  cess the data st
22e0: 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61  ored in the %_da
22f0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 74 79  ta table..*/..ty
2300: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2310: 35 49 6e 64 65 78 20 46 74 73 35 49 6e 64 65 78  5Index Fts5Index
2320: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2330: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 46   Fts5IndexIter F
2340: 74 73 35 49 6e 64 65 78 49 74 65 72 3b 0a 0a 2f  ts5IndexIter;../
2350: 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 75 73 65 64  *.** Values used
2360: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
2370: 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 70  flags argument p
2380: 61 73 73 65 64 20 74 6f 20 49 6e 64 65 78 51 75  assed to IndexQu
2390: 65 72 79 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ery()..*/.#defin
23a0: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
23b0: 59 5f 50 52 45 46 49 58 20 20 20 20 20 30 78 30  Y_PREFIX     0x0
23c0: 30 30 31 20 20 20 2f 2a 20 50 72 65 66 69 78 20  001   /* Prefix 
23d0: 71 75 65 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  query */.#define
23e0: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
23f0: 5f 44 45 53 43 20 20 20 20 20 20 20 30 78 30 30  _DESC       0x00
2400: 30 32 20 20 20 2f 2a 20 44 6f 63 73 20 69 6e 20  02   /* Docs in 
2410: 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64  descending rowid
2420: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2430: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
2440: 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 30 78 30  Y_TEST_NOIDX 0x0
2450: 30 30 34 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  004   /* Do not 
2460: 75 73 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  use prefix index
2470: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
2480: 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
2490: 20 20 20 20 20 20 20 30 78 30 30 30 38 20 20 20         0x0008   
24a0: 2f 2a 20 53 63 61 6e 20 71 75 65 72 79 20 28 66  /* Scan query (f
24b0: 74 73 35 76 6f 63 61 62 29 20 2a 2f 0a 0a 2f 2a  ts5vocab) */../*
24c0: 0a 2a 2a 20 43 72 65 61 74 65 2f 64 65 73 74 72  .** Create/destr
24d0: 6f 79 20 61 6e 20 46 74 73 35 49 6e 64 65 78 20  oy an Fts5Index 
24e0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73  object..*/.int s
24f0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
2500: 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67 20 2a  pen(Fts5Config *
2510: 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20 62 43 72  pConfig, int bCr
2520: 65 61 74 65 2c 20 46 74 73 35 49 6e 64 65 78 2a  eate, Fts5Index*
2530: 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69 6e 74 20  *, char**);.int 
2540: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2550: 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20  Close(Fts5Index 
2560: 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28  *p);../*.** for(
2570: 0a 2a 2a 20 20 20 70 49 74 65 72 20 3d 20 73 71  .**   pIter = sq
2580: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
2590: 65 72 79 28 70 2c 20 22 74 6f 6b 65 6e 22 2c 20  ery(p, "token", 
25a0: 35 2c 20 30 29 3b 0a 2a 2a 20 20 20 30 3d 3d 73  5, 0);.**   0==s
25b0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
25c0: 66 28 70 49 74 65 72 29 3b 0a 2a 2a 20 20 20 73  f(pIter);.**   s
25d0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
25e0: 78 74 28 70 49 74 65 72 29 0a 2a 2a 20 29 7b 0a  xt(pIter).** ){.
25f0: 2a 2a 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  **   i64 iRowid 
2600: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
2610: 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 2a  rRowid(pIter);.*
2620: 2a 20 7d 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4f 70  * }.*/../*.** Op
2630: 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f  en a new iterato
2640: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f  r to iterate tho
2650: 75 67 68 20 61 6c 6c 20 64 6f 63 69 64 73 20 74  ugh all docids t
2660: 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a  hat match the .*
2670: 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65  * specified toke
2680: 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69  n or token prefi
2690: 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
26a0: 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
26b0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
26e0: 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f  to query */.  co
26f0: 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
2700: 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a  , int nToken, /*
2710: 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69   Token (or prefi
2720: 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  x) to query for 
2730: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2760: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2770: 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
2780: 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49  5IndexIter **ppI
2790: 74 65 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ter.);../*.** Th
27a0: 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61 74  e various operat
27b0: 69 6f 6e 73 20 6f 6e 20 6f 70 65 6e 20 74 6f 6b  ions on open tok
27c0: 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
27d0: 69 78 20 69 74 65 72 61 74 6f 72 73 20 6f 70 65  ix iterators ope
27e0: 6e 65 64 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  ned.** using sql
27f0: 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
2800: 72 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ry()..*/.int sql
2810: 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
2820: 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b  Fts5IndexIter*);
2830: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2840: 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
2850: 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20 73 71  exIter*);.int sq
2860: 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
2870: 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
2880: 74 65 72 2a 2c 20 69 36 34 20 69 4d 61 74 63 68  ter*, i64 iMatch
2890: 29 3b 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74  );.i64 sqlite3Ft
28a0: 73 35 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  s5IterRowid(Fts5
28b0: 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74  IndexIter*);.int
28c0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
28d0: 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e 64 65  Poslist(Fts5Inde
28e0: 78 49 74 65 72 2a 2c 20 63 6f 6e 73 74 20 75 38  xIter*, const u8
28f0: 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 6e 2c 20   **pp, int *pn, 
2900: 69 36 34 20 2a 70 69 29 3b 0a 69 6e 74 20 73 71  i64 *pi);.int sq
2910: 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
2920: 6c 69 73 74 42 75 66 66 65 72 28 46 74 73 35 49  listBuffer(Fts5I
2930: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
2940: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2950: 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f);../*.** Close
2960: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65   an iterator ope
2970: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 74  ned by sqlite3Ft
2980: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  s5IndexQuery()..
2990: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
29a0: 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73  ts5IterClose(Fts
29b0: 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 2f  5IndexIter*);../
29c0: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
29d0: 61 63 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ace is used by t
29e0: 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64  he fts5vocab mod
29f0: 75 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ule..*/.const ch
2a00: 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49  ar *sqlite3Fts5I
2a10: 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65  terTerm(Fts5Inde
2a20: 78 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 69  xIter*, int*);.i
2a30: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
2a40: 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49  erNextScan(Fts5I
2a50: 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 0a 2f 2a  ndexIter*);.../*
2a60: 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
2a70: 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
2a80: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
2a90: 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
2aa0: 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
2ab0: 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
2ac0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
2ad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2ae0: 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
2af0: 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
2b00: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
2b10: 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
2b20: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
2b30: 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
2b40: 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
2b50: 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
2b60: 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
2b70: 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
2b80: 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
2b90: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
2ba0: 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
2bb0: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
2bc0: 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
2bd0: 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
2be0: 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
2bf0: 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
2c00: 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e   a delete..*/.in
2c10: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2c20: 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
2c30: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
2c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2c50: 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
2c60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
2c90: 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
2ca0: 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
2cb0: 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2ce0: 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
2cf0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
2d00: 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
2d10: 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
2d20: 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
2d30: 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
2d40: 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a 0a 2f  m index */.);../
2d50: 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
2d60: 61 74 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  at subsequent ca
2d70: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
2d80: 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
2d90: 65 72 74 61 69 6e 20 74 6f 0a 2a 2a 20 64 6f 63  ertain to.** doc
2da0: 75 6d 65 6e 74 20 69 44 6f 63 69 64 2e 0a 2a 2f  ument iDocid..*/
2db0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2dc0: 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28  IndexBeginWrite(
2dd0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
2e00: 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
2e10: 20 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20   iDocid         
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e30: 44 6f 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20  Docid to add or 
2e40: 72 65 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d  remove data from
2e50: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c   */.);../*.** Fl
2e60: 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
2e70: 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
2e80: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
2e90: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2ea0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  ..** If the bCom
2eb0: 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
2ec0: 2c 20 61 6c 73 6f 20 63 6c 6f 73 65 20 61 6e 79  , also close any
2ed0: 20 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c   open blob handl
2ee0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
2ef0: 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28  e3Fts5IndexSync(
2f00: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
2f10: 74 20 62 43 6f 6d 6d 69 74 29 3b 0a 0a 2f 2a 0a  t bCommit);../*.
2f20: 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64  ** Discard any d
2f30: 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
2f40: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
2f50: 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20   tables. Do not 
2f60: 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74  write it.** to t
2f70: 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
2f80: 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  itionally, assum
2f90: 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  e that the conte
2fa0: 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
2fb0: 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68  a.** table may h
2fc0: 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64  ave changed on d
2fd0: 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d  isk. So any in-m
2fe0: 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20  emory caches of 
2ff0: 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72  %_data .** recor
3000: 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
3010: 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  idated..*/.int s
3020: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
3030: 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65  ollback(Fts5Inde
3040: 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  x *p);../*.** Re
3050: 74 72 69 65 76 65 20 61 6e 64 20 63 6c 65 61 72  trieve and clear
3060: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 72 72   the current err
3070: 6f 72 20 63 6f 64 65 2c 20 72 65 73 70 65 63 74  or code, respect
3080: 69 76 65 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ively..*/.int sq
3090: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 72  lite3Fts5IndexEr
30a0: 72 63 6f 64 65 28 46 74 73 35 49 6e 64 65 78 2a  rcode(Fts5Index*
30b0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
30c0: 74 73 35 49 6e 64 65 78 52 65 73 65 74 28 46 74  ts5IndexReset(Ft
30d0: 73 35 49 6e 64 65 78 2a 29 3b 0a 0a 2f 2a 0a 2a  s5Index*);../*.*
30e0: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
30f0: 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
3100: 72 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rd..*/.int sqlit
3110: 65 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76  e3Fts5IndexGetAv
3120: 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
3130: 20 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20   *p, Fts5Buffer 
3140: 2a 70 42 75 66 29 3b 0a 69 6e 74 20 73 71 6c 69  *pBuf);.int sqli
3150: 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
3160: 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
3170: 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 2a 2c  x *p, const u8*,
3180: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 75   int);../*.** Fu
3190: 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 65 64 20 62  nctions called b
31a0: 79 20 74 68 65 20 73 74 6f 72 61 67 65 20 6d 6f  y the storage mo
31b0: 64 75 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  dule as part of 
31c0: 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e  integrity-check.
31d0: 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46  .*/.u64 sqlite3F
31e0: 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 46 74  ts5IndexCksum(Ft
31f0: 73 35 43 6f 6e 66 69 67 2a 2c 69 36 34 2c 69 6e  s5Config*,i64,in
3200: 74 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  t,int,const char
3210: 2a 2c 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69  *,int);.int sqli
3220: 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65  te3Fts5IndexInte
3230: 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49  grityCheck(Fts5I
3240: 6e 64 65 78 2a 2c 20 75 36 34 20 63 6b 73 75 6d  ndex*, u64 cksum
3250: 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 65  );../* .** Calle
3260: 64 20 64 75 72 69 6e 67 20 76 69 72 74 75 61 6c  d during virtual
3270: 20 6d 6f 64 75 6c 65 20 69 6e 69 74 69 61 6c 69   module initiali
3280: 7a 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74  zation to regist
3290: 65 72 20 55 44 46 20 0a 2a 2a 20 66 74 73 35 5f  er UDF .** fts5_
32a0: 64 65 63 6f 64 65 28 29 20 77 69 74 68 20 53 51  decode() with SQ
32b0: 4c 69 74 65 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  Lite .*/.int sql
32c0: 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69  ite3Fts5IndexIni
32d0: 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e  t(sqlite3*);..in
32e0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
32f0: 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35  exSetCookie(Fts5
3300: 49 6e 64 65 78 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  Index*, int);../
3310: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3320: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
3330: 65 6e 74 72 69 65 73 20 72 65 61 64 20 66 72 6f  entries read fro
3340: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
3350: 6c 65 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 63  le by .** this c
3360: 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
3370: 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  it was created..
3380: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
3390: 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73  s5IndexReads(Fts
33a0: 35 49 6e 64 65 78 20 2a 70 29 3b 0a 0a 69 6e 74  5Index *p);..int
33b0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
33c0: 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65  xReinit(Fts5Inde
33d0: 78 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74  x *p);.int sqlit
33e0: 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d  e3Fts5IndexOptim
33f0: 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ize(Fts5Index *p
3400: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
3410: 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73  s5IndexMerge(Fts
3420: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e  5Index *p, int n
3430: 4d 65 72 67 65 29 3b 0a 0a 69 6e 74 20 73 71 6c  Merge);..int sql
3440: 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61  ite3Fts5IndexLoa
3450: 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65  dConfig(Fts5Inde
3460: 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e  x *p);../*.** En
3470: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
3480: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 69  o code in fts5_i
3490: 6e 64 65 78 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  ndex.c..********
34a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34e0: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
34f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3530: 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
3540: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 76 61   code in fts5_va
3550: 72 69 6e 74 2e 63 2e 20 0a 2a 2f 0a 69 6e 74 20  rint.c. .*/.int 
3560: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
3570: 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73  rint32(const uns
3580: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75  igned char *p, u
3590: 33 32 20 2a 76 29 3b 0a 69 6e 74 20 73 71 6c 69  32 *v);.int sqli
35a0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
35b0: 4c 65 6e 28 75 33 32 20 69 56 61 6c 29 3b 0a 75  Len(u32 iVal);.u
35c0: 38 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  8 sqlite3Fts5Get
35d0: 56 61 72 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73  Varint(const uns
35e0: 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 75 36 34  igned char*, u64
35f0: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  *);.int sqlite3F
3600: 74 73 35 50 75 74 56 61 72 69 6e 74 28 75 6e 73  ts5PutVarint(uns
3610: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75  igned char *p, u
3620: 36 34 20 76 29 3b 0a 0a 23 64 65 66 69 6e 65 20  64 v);..#define 
3630: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
3640: 61 2c 62 29 20 73 71 6c 69 74 65 33 46 74 73 35  a,b) sqlite3Fts5
3650: 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 28 75  GetVarint32(a,(u
3660: 33 32 2a 29 26 62 29 0a 23 64 65 66 69 6e 65 20  32*)&b).#define 
3670: 66 74 73 35 47 65 74 56 61 72 69 6e 74 20 20 20  fts5GetVarint   
3680: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
3690: 61 72 69 6e 74 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64  arint../*.** End
36a0: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
36b0: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 76 61   code in fts5_va
36c0: 72 69 6e 74 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  rint.c..********
36d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3710: 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
3720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3760: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
3770: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 2e 63  o code in fts5.c
3780: 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74  . .*/..int sqlit
3790: 65 33 46 74 73 35 47 65 74 54 6f 6b 65 6e 69 7a  e3Fts5GetTokeniz
37a0: 65 72 28 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c  er(.  Fts5Global
37b0: 2a 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *, .  const char
37c0: 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69 6e 74 20   **azArg,.  int 
37d0: 6e 41 72 67 2c 0a 20 20 46 74 73 35 54 6f 6b 65  nArg,.  Fts5Toke
37e0: 6e 69 7a 65 72 2a 2a 2c 0a 20 20 66 74 73 35 5f  nizer**,.  fts5_
37f0: 74 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a 20 20 63  tokenizer**,.  c
3800: 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 3b 0a 0a  har **pzErr.);..
3810: 46 74 73 35 49 6e 64 65 78 20 2a 73 71 6c 69 74  Fts5Index *sqlit
3820: 65 33 46 74 73 35 49 6e 64 65 78 46 72 6f 6d 43  e3Fts5IndexFromC
3830: 73 72 69 64 28 46 74 73 35 47 6c 6f 62 61 6c 2a  srid(Fts5Global*
3840: 2c 20 69 36 34 2c 20 69 6e 74 2a 29 3b 0a 0a 2f  , i64, int*);../
3850: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
3860: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
3870: 20 66 74 73 35 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a   fts5.c..*******
3880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38c0: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
38d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3910: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
3920: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 68  o code in fts5_h
3930: 61 73 68 2e 63 2e 20 0a 2a 2f 0a 74 79 70 65 64  ash.c. .*/.typed
3940: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 48 61  ef struct Fts5Ha
3950: 73 68 20 46 74 73 35 48 61 73 68 3b 0a 0a 2f 2a  sh Fts5Hash;../*
3960: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 68 61 73  .** Create a has
3970: 68 20 74 61 62 6c 65 2c 20 66 72 65 65 20 61 20  h table, free a 
3980: 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69  hash table..*/.i
3990: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  nt sqlite3Fts5Ha
39a0: 73 68 4e 65 77 28 46 74 73 35 48 61 73 68 2a 2a  shNew(Fts5Hash**
39b0: 2c 20 69 6e 74 20 2a 70 6e 53 69 7a 65 29 3b 0a  , int *pnSize);.
39c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
39d0: 48 61 73 68 46 72 65 65 28 46 74 73 35 48 61 73  HashFree(Fts5Has
39e0: 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  h*);..int sqlite
39f0: 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a  3Fts5HashWrite(.
3a00: 20 20 46 74 73 35 48 61 73 68 2a 2c 0a 20 20 69    Fts5Hash*,.  i
3a10: 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a30: 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73  * Rowid for this
3a40: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
3a50: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3a70: 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65  olumn token appe
3a80: 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64  ars in (-ve -> d
3a90: 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20  elete) */.  int 
3aa0: 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3ac0: 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
3ad0: 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a   within column *
3ae0: 2f 0a 20 20 63 68 61 72 20 62 42 79 74 65 2c 0a  /.  char bByte,.
3af0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
3b00: 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
3b10: 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64    /* Token to ad
3b20: 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f  d or remove to o
3b30: 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a  r from index */.
3b40: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70 74 79 20  );../*.** Empty 
3b50: 28 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65  (but do not dele
3b60: 74 65 29 20 61 20 68 61 73 68 20 74 61 62 6c 65  te) a hash table
3b70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3b80: 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 46  3Fts5HashClear(F
3b90: 74 73 35 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20  ts5Hash*);..int 
3ba0: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51  sqlite3Fts5HashQ
3bb0: 75 65 72 79 28 0a 20 20 46 74 73 35 48 61 73 68  uery(.  Fts5Hash
3bc0: 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *,              
3bd0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
3be0: 74 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 2a  table to query *
3bf0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3c00: 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
3c10: 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 74 65 72  ,   /* Query ter
3c20: 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  m */.  const u8 
3c30: 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20 20 20 20  **ppDoclist,    
3c40: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
3c50: 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
3c60: 74 20 66 6f 72 20 70 54 65 72 6d 20 2a 2f 0a 20  t for pTerm */. 
3c70: 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69 73 74 20   int *pnDoclist 
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
3ca0: 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65   doclist in byte
3cb0: 73 20 2a 2f 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c  s */.);..int sql
3cc0: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
3cd0: 49 6e 69 74 28 0a 20 20 46 74 73 35 48 61 73 68  Init(.  Fts5Hash
3ce0: 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *,              
3cf0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
3d00: 74 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 2a  table to query *
3d10: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3d20: 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
3d30: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 70 72 65      /* Query pre
3d40: 66 69 78 20 2a 2f 0a 29 3b 0a 76 6f 69 64 20 73  fix */.);.void s
3d50: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
3d60: 61 6e 4e 65 78 74 28 46 74 73 35 48 61 73 68 2a  anNext(Fts5Hash*
3d70: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
3d80: 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 46 74  s5HashScanEof(Ft
3d90: 73 35 48 61 73 68 2a 29 3b 0a 76 6f 69 64 20 73  s5Hash*);.void s
3da0: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
3db0: 61 6e 45 6e 74 72 79 28 46 74 73 35 48 61 73 68  anEntry(Fts5Hash
3dc0: 20 2a 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   *,.  const char
3dd0: 20 2a 2a 70 7a 54 65 72 6d 2c 20 20 20 20 20 20   **pzTerm,      
3de0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 74 65        /* OUT: te
3df0: 72 6d 20 28 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  rm (nul-terminat
3e00: 65 64 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ed) */.  const u
3e10: 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20 20  8 **ppDoclist,  
3e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
3e30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   pointer to docl
3e40: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ist */.  int *pn
3e50: 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20  Doclist         
3e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
3e70: 20 73 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   size of doclist
3e80: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 3b 0a   in bytes */.);.
3e90: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
3ea0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
3eb0: 20 69 6e 20 66 74 73 35 5f 68 61 73 68 2e 63 2e   in fts5_hash.c.
3ec0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
3ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
3f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
3f60: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
3f70: 6e 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63  n fts5_storage.c
3f80: 2e 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63  . fts5_storage.c
3f90: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69   contains contai
3fa0: 6e 73 20 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 61  ns .** code to a
3fb0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 20 73  ccess the data s
3fc0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f 63  tored in the %_c
3fd0: 6f 6e 74 65 6e 74 20 61 6e 64 20 25 5f 64 6f 63  ontent and %_doc
3fe0: 73 69 7a 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  size tables..*/.
3ff0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
4000: 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20 30 20 20  MT_SCAN_ASC  0  
4010: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77     /* SELECT row
4020: 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  id, * FROM ... O
4030: 52 44 45 52 20 42 59 20 31 20 41 53 43 20 2a 2f  RDER BY 1 ASC */
4040: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
4050: 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20 31 20 20  MT_SCAN_DESC 1  
4060: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77     /* SELECT row
4070: 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  id, * FROM ... O
4080: 52 44 45 52 20 42 59 20 31 20 44 45 53 43 20 2a  RDER BY 1 DESC *
4090: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  /.#define FTS5_S
40a0: 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20 20 32 20  TMT_LOOKUP    2 
40b0: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f      /* SELECT ro
40c0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20  wid, * FROM ... 
40d0: 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 20 2a 2f  WHERE rowid=? */
40e0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
40f0: 20 46 74 73 35 53 74 6f 72 61 67 65 20 46 74 73   Fts5Storage Fts
4100: 35 53 74 6f 72 61 67 65 3b 0a 0a 69 6e 74 20 73  5Storage;..int s
4110: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
4120: 65 4f 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67  eOpen(Fts5Config
4130: 2a 2c 20 46 74 73 35 49 6e 64 65 78 2a 2c 20 69  *, Fts5Index*, i
4140: 6e 74 2c 20 46 74 73 35 53 74 6f 72 61 67 65 2a  nt, Fts5Storage*
4150: 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69 6e 74 20  *, char**);.int 
4160: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4170: 67 65 43 6c 6f 73 65 28 46 74 73 35 53 74 6f 72  geClose(Fts5Stor
4180: 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71  age *p);..int sq
4190: 6c 69 74 65 33 46 74 73 35 44 72 6f 70 41 6c 6c  lite3Fts5DropAll
41a0: 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b 0a 69  (Fts5Config*);.i
41b0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 72  nt sqlite3Fts5Cr
41c0: 65 61 74 65 54 61 62 6c 65 28 46 74 73 35 43 6f  eateTable(Fts5Co
41d0: 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61  nfig*, const cha
41e0: 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  r*, const char*,
41f0: 20 69 6e 74 2c 20 63 68 61 72 20 2a 2a 29 3b 0a   int, char **);.
4200: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4210: 53 74 6f 72 61 67 65 44 65 6c 65 74 65 28 46 74  StorageDelete(Ft
4220: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36  s5Storage *p, i6
4230: 34 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  4);.int sqlite3F
4240: 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65 72 74  ts5StorageInsert
4250: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
4260: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4270: 2a 61 70 56 61 6c 2c 20 69 6e 74 2c 20 69 36 34  *apVal, int, i64
4280: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
4290: 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74 65 67  Fts5StorageInteg
42a0: 72 69 74 79 28 46 74 73 35 53 74 6f 72 61 67 65  rity(Fts5Storage
42b0: 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74   *p);..int sqlit
42c0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 53 74 6d  e3Fts5StorageStm
42d0: 74 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  t(Fts5Storage *p
42e0: 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20 73 71 6c  , int eStmt, sql
42f0: 69 74 65 33 5f 73 74 6d 74 2a 2a 2c 20 63 68 61  ite3_stmt**, cha
4300: 72 2a 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  r**);.void sqlit
4310: 65 33 46 74 73 35 53 74 6f 72 61 67 65 53 74 6d  e3Fts5StorageStm
4320: 74 52 65 6c 65 61 73 65 28 46 74 73 35 53 74 6f  tRelease(Fts5Sto
4330: 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 65 53 74  rage *p, int eSt
4340: 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  mt, sqlite3_stmt
4350: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
4360: 46 74 73 35 53 74 6f 72 61 67 65 44 6f 63 73 69  Fts5StorageDocsi
4370: 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ze(Fts5Storage *
4380: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 69  p, i64 iRowid, i
4390: 6e 74 20 2a 61 43 6f 6c 29 3b 0a 69 6e 74 20 73  nt *aCol);.int s
43a0: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
43b0: 65 53 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67  eSize(Fts5Storag
43c0: 65 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  e *p, int iCol, 
43d0: 69 36 34 20 2a 70 6e 41 76 67 29 3b 0a 69 6e 74  i64 *pnAvg);.int
43e0: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
43f0: 61 67 65 52 6f 77 43 6f 75 6e 74 28 46 74 73 35  ageRowCount(Fts5
4400: 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 20  Storage *p, i64 
4410: 2a 70 6e 52 6f 77 29 3b 0a 0a 69 6e 74 20 73 71  *pnRow);..int sq
4420: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
4430: 53 79 6e 63 28 46 74 73 35 53 74 6f 72 61 67 65  Sync(Fts5Storage
4440: 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74   *p, int bCommit
4450: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4460: 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c 62 61 63  s5StorageRollbac
4470: 6b 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  k(Fts5Storage *p
4480: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
4490: 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 66 69 67  ts5StorageConfig
44a0: 56 61 6c 75 65 28 0a 20 20 20 20 46 74 73 35 53  Value(.    Fts5S
44b0: 74 6f 72 61 67 65 20 2a 70 2c 20 63 6f 6e 73 74  torage *p, const
44c0: 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 5f   char*, sqlite3_
44d0: 76 61 6c 75 65 2a 2c 20 69 6e 74 0a 29 3b 0a 0a  value*, int.);..
44e0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
44f0: 74 6f 72 61 67 65 53 70 65 63 69 61 6c 44 65 6c  torageSpecialDel
4500: 65 74 65 28 46 74 73 35 53 74 6f 72 61 67 65 20  ete(Fts5Storage 
4510: 2a 70 2c 20 69 36 34 20 69 44 65 6c 2c 20 73 71  *p, i64 iDel, sq
4520: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a  lite3_value**);.
4530: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4540: 53 74 6f 72 61 67 65 44 65 6c 65 74 65 41 6c 6c  StorageDeleteAll
4550: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29  (Fts5Storage *p)
4560: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4570: 35 53 74 6f 72 61 67 65 52 65 62 75 69 6c 64 28  5StorageRebuild(
4580: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b  Fts5Storage *p);
4590: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
45a0: 53 74 6f 72 61 67 65 4f 70 74 69 6d 69 7a 65 28  StorageOptimize(
45b0: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b  Fts5Storage *p);
45c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
45d0: 53 74 6f 72 61 67 65 4d 65 72 67 65 28 46 74 73  StorageMerge(Fts
45e0: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74  5Storage *p, int
45f0: 20 6e 4d 65 72 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a   nMerge);../*.**
4600: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
4610: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
4620: 35 5f 73 74 6f 72 61 67 65 2e 63 2e 0a 2a 2a 2a  5_storage.c..***
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4670: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
4680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46c0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
46d0: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
46e0: 74 73 35 5f 65 78 70 72 2e 63 2e 20 0a 2a 2f 0a  ts5_expr.c. .*/.
46f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
4700: 74 73 35 45 78 70 72 20 46 74 73 35 45 78 70 72  ts5Expr Fts5Expr
4710: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
4720: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 46 74   Fts5ExprNode Ft
4730: 73 35 45 78 70 72 4e 6f 64 65 3b 0a 74 79 70 65  s5ExprNode;.type
4740: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50  def struct Fts5P
4750: 61 72 73 65 20 46 74 73 35 50 61 72 73 65 3b 0a  arse Fts5Parse;.
4760: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
4770: 74 73 35 54 6f 6b 65 6e 20 46 74 73 35 54 6f 6b  ts5Token Fts5Tok
4780: 65 6e 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  en;.typedef stru
4790: 63 74 20 46 74 73 35 45 78 70 72 50 68 72 61 73  ct Fts5ExprPhras
47a0: 65 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65  e Fts5ExprPhrase
47b0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
47c0: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
47d0: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
47e0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
47f0: 20 46 74 73 35 45 78 70 72 43 6f 6c 73 65 74 20   Fts5ExprColset 
4800: 46 74 73 35 45 78 70 72 43 6f 6c 73 65 74 3b 0a  Fts5ExprColset;.
4810: 0a 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65  .struct Fts5Toke
4820: 6e 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  n {.  const char
4830: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
4840: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74        /* Token t
4850: 65 78 74 20 28 6e 6f 74 20 4e 55 4c 4c 20 74 65  ext (not NULL te
4860: 72 6d 69 6e 61 74 65 64 29 20 2a 2f 0a 20 20 69  rminated) */.  i
4870: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4890: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
48a0: 20 70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d   p in bytes */.}
48b0: 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 4d 41  ;../* Parse a MA
48c0: 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  TCH expression. 
48d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
48e0: 73 35 45 78 70 72 4e 65 77 28 0a 20 20 46 74 73  s5ExprNew(.  Fts
48f0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
4900: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
4910: 2a 7a 45 78 70 72 2c 0a 20 20 46 74 73 35 45 78  *zExpr,.  Fts5Ex
4920: 70 72 20 2a 2a 70 70 4e 65 77 2c 20 0a 20 20 63  pr **ppNew, .  c
4930: 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 3b 0a 0a  har **pzErr.);..
4940: 2f 2a 0a 2a 2a 20 66 6f 72 28 72 63 20 3d 20 73  /*.** for(rc = s
4950: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 69  qlite3Fts5ExprFi
4960: 72 73 74 28 70 45 78 70 72 2c 20 70 49 64 78 2c  rst(pExpr, pIdx,
4970: 20 62 44 65 73 63 29 3b 0a 2a 2a 20 20 20 20 20   bDesc);.**     
4980: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
4990: 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 45   0==sqlite3Fts5E
49a0: 78 70 72 45 6f 66 28 70 45 78 70 72 29 3b 0a 2a  xprEof(pExpr);.*
49b0: 2a 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  *     rc = sqlit
49c0: 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 70  e3Fts5ExprNext(p
49d0: 45 78 70 72 29 0a 2a 2a 20 29 7b 0a 2a 2a 20 20  Expr).** ){.**  
49e0: 20 2f 2f 20 54 68 65 20 64 6f 63 75 6d 65 6e 74   // The document
49f0: 20 77 69 74 68 20 72 6f 77 69 64 20 69 52 6f 77   with rowid iRow
4a00: 69 64 20 6d 61 74 63 68 65 73 20 74 68 65 20 65  id matches the e
4a10: 78 70 72 65 73 73 69 6f 6e 21 0a 2a 2a 20 20 20  xpression!.**   
4a20: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  i64 iRowid = sql
4a30: 69 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69  ite3Fts5ExprRowi
4a40: 64 28 70 45 78 70 72 29 3b 0a 2a 2a 20 7d 0a 2a  d(pExpr);.** }.*
4a50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
4a60: 35 45 78 70 72 46 69 72 73 74 28 46 74 73 35 45  5ExprFirst(Fts5E
4a70: 78 70 72 2a 2c 20 46 74 73 35 49 6e 64 65 78 20  xpr*, Fts5Index 
4a80: 2a 70 49 64 78 2c 20 69 36 34 20 69 4d 69 6e 2c  *pIdx, i64 iMin,
4a90: 20 69 6e 74 20 62 44 65 73 63 29 3b 0a 69 6e 74   int bDesc);.int
4aa0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
4ab0: 4e 65 78 74 28 46 74 73 35 45 78 70 72 2a 2c 20  Next(Fts5Expr*, 
4ac0: 69 36 34 20 69 4d 61 78 29 3b 0a 69 6e 74 20 73  i64 iMax);.int s
4ad0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 45 6f  qlite3Fts5ExprEo
4ae0: 66 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 69 36  f(Fts5Expr*);.i6
4af0: 34 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  4 sqlite3Fts5Exp
4b00: 72 52 6f 77 69 64 28 46 74 73 35 45 78 70 72 2a  rRowid(Fts5Expr*
4b10: 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  );..void sqlite3
4b20: 46 74 73 35 45 78 70 72 46 72 65 65 28 46 74 73  Fts5ExprFree(Fts
4b30: 35 45 78 70 72 2a 29 3b 0a 0a 2f 2a 20 43 61 6c  5Expr*);../* Cal
4b40: 6c 65 64 20 64 75 72 69 6e 67 20 73 74 61 72 74  led during start
4b50: 75 70 20 74 6f 20 72 65 67 69 73 74 65 72 20 61  up to register a
4b60: 20 55 44 46 20 77 69 74 68 20 53 51 4c 69 74 65   UDF with SQLite
4b70: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46   */.int sqlite3F
4b80: 74 73 35 45 78 70 72 49 6e 69 74 28 46 74 73 35  ts5ExprInit(Fts5
4b90: 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65 33  Global*, sqlite3
4ba0: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
4bb0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43 6f  Fts5ExprPhraseCo
4bc0: 75 6e 74 28 46 74 73 35 45 78 70 72 2a 29 3b 0a  unt(Fts5Expr*);.
4bd0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
4be0: 78 70 72 50 68 72 61 73 65 53 69 7a 65 28 46 74  xprPhraseSize(Ft
4bf0: 73 35 45 78 70 72 2a 2c 20 69 6e 74 20 69 50 68  s5Expr*, int iPh
4c00: 72 61 73 65 29 3b 0a 69 6e 74 20 73 71 6c 69 74  rase);.int sqlit
4c10: 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73  e3Fts5ExprPoslis
4c20: 74 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74  t(Fts5Expr*, int
4c30: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 29 3b 0a  , const u8 **);.
4c40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4c50: 45 78 70 72 50 68 72 61 73 65 45 78 70 72 28 46  ExprPhraseExpr(F
4c60: 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46 74 73 35  ts5Config*, Fts5
4c70: 45 78 70 72 2a 2c 20 69 6e 74 2c 20 46 74 73 35  Expr*, int, Fts5
4c80: 45 78 70 72 2a 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  Expr**);../*****
4c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cb0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 74  ******.** The ft
4cc0: 73 35 5f 65 78 70 72 2e 63 20 41 50 49 20 61 62  s5_expr.c API ab
4cd0: 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ove this point i
4ce0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 74  s used by the ot
4cf0: 68 65 72 20 68 61 6e 64 2d 77 72 69 74 74 65 6e  her hand-written
4d00: 0a 2a 2a 20 43 20 63 6f 64 65 20 69 6e 20 74 68  .** C code in th
4d10: 69 73 20 6d 6f 64 75 6c 65 2e 20 54 68 65 20 69  is module. The i
4d20: 6e 74 65 72 66 61 63 65 73 20 62 65 6c 6f 77 20  nterfaces below 
4d30: 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 63  this point are c
4d40: 61 6c 6c 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  alled by.** the 
4d50: 70 61 72 73 65 72 20 63 6f 64 65 20 69 6e 20 66  parser code in f
4d60: 74 73 35 70 61 72 73 65 2e 79 2e 20 20 2a 2f 0a  ts5parse.y.  */.
4d70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
4d80: 35 50 61 72 73 65 45 72 72 6f 72 28 46 74 73 35  5ParseError(Fts5
4d90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
4da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
4db0: 20 2e 2e 2e 29 3b 0a 0a 46 74 73 35 45 78 70 72   ...);..Fts5Expr
4dc0: 4e 6f 64 65 20 2a 73 71 6c 69 74 65 33 46 74 73  Node *sqlite3Fts
4dd0: 35 50 61 72 73 65 4e 6f 64 65 28 0a 20 20 46 74  5ParseNode(.  Ft
4de0: 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s5Parse *pParse,
4df0: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 0a 20 20  .  int eType,.  
4e00: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4c  Fts5ExprNode *pL
4e10: 65 66 74 2c 0a 20 20 46 74 73 35 45 78 70 72 4e  eft,.  Fts5ExprN
4e20: 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a 20 20 46  ode *pRight,.  F
4e30: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a  ts5ExprNearset *
4e40: 70 4e 65 61 72 0a 29 3b 0a 0a 46 74 73 35 45 78  pNear.);..Fts5Ex
4e50: 70 72 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65  prPhrase *sqlite
4e60: 33 46 74 73 35 50 61 72 73 65 54 65 72 6d 28 0a  3Fts5ParseTerm(.
4e70: 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61    Fts5Parse *pPa
4e80: 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78 70 72  rse, .  Fts5Expr
4e90: 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 2c  Phrase *pPhrase,
4ea0: 20 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70   .  Fts5Token *p
4eb0: 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 62 50 72  Token,.  int bPr
4ec0: 65 66 69 78 0a 29 3b 0a 0a 46 74 73 35 45 78 70  efix.);..Fts5Exp
4ed0: 72 4e 65 61 72 73 65 74 20 2a 73 71 6c 69 74 65  rNearset *sqlite
4ee0: 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65  3Fts5ParseNearse
4ef0: 74 28 0a 20 20 46 74 73 35 50 61 72 73 65 2a 2c  t(.  Fts5Parse*,
4f00: 20 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72   .  Fts5ExprNear
4f10: 73 65 74 2a 2c 0a 20 20 46 74 73 35 45 78 70 72  set*,.  Fts5Expr
4f20: 50 68 72 61 73 65 2a 20 0a 29 3b 0a 0a 46 74 73  Phrase* .);..Fts
4f30: 35 45 78 70 72 43 6f 6c 73 65 74 20 2a 73 71 6c  5ExprColset *sql
4f40: 69 74 65 33 46 74 73 35 50 61 72 73 65 43 6f 6c  ite3Fts5ParseCol
4f50: 73 65 74 28 0a 20 20 46 74 73 35 50 61 72 73 65  set(.  Fts5Parse
4f60: 2a 2c 20 0a 20 20 46 74 73 35 45 78 70 72 43 6f  *, .  Fts5ExprCo
4f70: 6c 73 65 74 2a 2c 20 0a 20 20 46 74 73 35 54 6f  lset*, .  Fts5To
4f80: 6b 65 6e 20 2a 0a 29 3b 0a 0a 76 6f 69 64 20 73  ken *.);..void s
4f90: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 50  qlite3Fts5ParseP
4fa0: 68 72 61 73 65 46 72 65 65 28 46 74 73 35 45 78  hraseFree(Fts5Ex
4fb0: 70 72 50 68 72 61 73 65 2a 29 3b 0a 76 6f 69 64  prPhrase*);.void
4fc0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
4fd0: 65 4e 65 61 72 73 65 74 46 72 65 65 28 46 74 73  eNearsetFree(Fts
4fe0: 35 45 78 70 72 4e 65 61 72 73 65 74 2a 29 3b 0a  5ExprNearset*);.
4ff0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
5000: 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28 46 74  ParseNodeFree(Ft
5010: 73 35 45 78 70 72 4e 6f 64 65 2a 29 3b 0a 0a 76  s5ExprNode*);..v
5020: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
5030: 61 72 73 65 53 65 74 44 69 73 74 61 6e 63 65 28  arseSetDistance(
5040: 46 74 73 35 50 61 72 73 65 2a 2c 20 46 74 73 35  Fts5Parse*, Fts5
5050: 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 20 46 74  ExprNearset*, Ft
5060: 73 35 54 6f 6b 65 6e 2a 29 3b 0a 76 6f 69 64 20  s5Token*);.void 
5070: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
5080: 53 65 74 43 6f 6c 73 65 74 28 46 74 73 35 50 61  SetColset(Fts5Pa
5090: 72 73 65 2a 2c 20 46 74 73 35 45 78 70 72 4e 65  rse*, Fts5ExprNe
50a0: 61 72 73 65 74 2a 2c 20 46 74 73 35 45 78 70 72  arset*, Fts5Expr
50b0: 43 6f 6c 73 65 74 2a 29 3b 0a 76 6f 69 64 20 73  Colset*);.void s
50c0: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46  qlite3Fts5ParseF
50d0: 69 6e 69 73 68 65 64 28 46 74 73 35 50 61 72 73  inished(Fts5Pars
50e0: 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45  e *pParse, Fts5E
50f0: 78 70 72 4e 6f 64 65 20 2a 70 29 3b 0a 76 6f 69  xprNode *p);.voi
5100: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
5110: 73 65 4e 65 61 72 28 46 74 73 35 50 61 72 73 65  seNear(Fts5Parse
5120: 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 54 6f   *pParse, Fts5To
5130: 6b 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e  ken*);../*.** En
5140: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
5150: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 65  o code in fts5_e
5160: 78 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  xpr.c..*********
5170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51b0: 2a 2f 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  */..../*********
51c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5200: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
5210: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 61  o code in fts5_a
5220: 75 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73  ux.c. .*/..int s
5230: 71 6c 69 74 65 33 46 74 73 35 41 75 78 49 6e 69  qlite3Fts5AuxIni
5240: 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a  t(fts5_api*);./*
5250: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
5260: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
5270: 66 74 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a 2a 2a  fts5_aux.c..****
5280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52c0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
52d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5310: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
5320: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
5330: 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 20 0a  5_tokenizer.c. .
5340: 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  */..int sqlite3F
5350: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e 69 74  ts5TokenizerInit
5360: 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a  (fts5_api*);./*.
5370: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
5380: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
5390: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e  ts5_tokenizer.c.
53a0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
53b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
53f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
5440: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
5450: 6e 20 66 74 73 35 5f 73 6f 72 74 65 72 2e 63 2e  n fts5_sorter.c.
5460: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
5470: 75 63 74 20 46 74 73 35 53 6f 72 74 65 72 20 46  uct Fts5Sorter F
5480: 74 73 35 53 6f 72 74 65 72 3b 0a 0a 69 6e 74 20  ts5Sorter;..int 
5490: 73 71 6c 69 74 65 33 46 74 73 35 53 6f 72 74 65  sqlite3Fts5Sorte
54a0: 72 4e 65 77 28 46 74 73 35 45 78 70 72 20 2a 70  rNew(Fts5Expr *p
54b0: 45 78 70 72 2c 20 46 74 73 35 53 6f 72 74 65 72  Expr, Fts5Sorter
54c0: 20 2a 2a 70 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45   **pp);../*.** E
54d0: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
54e0: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
54f0: 73 6f 72 74 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  sorter.c..******
5500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5540: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
5550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5590: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
55a0: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
55b0: 76 6f 63 61 62 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e  vocab.c. .*/..in
55c0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 56 6f 63  t sqlite3Fts5Voc
55d0: 61 62 49 6e 69 74 28 46 74 73 35 47 6c 6f 62 61  abInit(Fts5Globa
55e0: 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 0a  l*, sqlite3*);..
55f0: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
5600: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
5610: 6e 20 66 74 73 35 5f 76 6f 63 61 62 2e 63 2e 0a  n fts5_vocab.c..
5620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
5670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
56c0: 65 72 66 61 63 65 20 74 6f 20 61 75 74 6f 6d 61  erface to automa
56d0: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
56e0: 64 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 75  d code in fts5_u
56f0: 6e 69 63 6f 64 65 32 2e 63 2e 20 0a 2a 2f 0a 69  nicode2.c. .*/.i
5700: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e  nt sqlite3Fts5Un
5710: 69 63 6f 64 65 49 73 61 6c 6e 75 6d 28 69 6e 74  icodeIsalnum(int
5720: 20 63 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33   c);.int sqlite3
5730: 46 74 73 35 55 6e 69 63 6f 64 65 49 73 64 69 61  Fts5UnicodeIsdia
5740: 63 72 69 74 69 63 28 69 6e 74 20 63 29 3b 0a 69  critic(int c);.i
5750: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e  nt sqlite3Fts5Un
5760: 69 63 6f 64 65 46 6f 6c 64 28 69 6e 74 20 63 2c  icodeFold(int c,
5770: 20 69 6e 74 20 62 52 65 6d 6f 76 65 44 69 61 63   int bRemoveDiac
5780: 72 69 74 69 63 29 3b 0a 2f 2a 0a 2a 2a 20 45 6e  ritic);./*.** En
5790: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
57a0: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 75  o code in fts5_u
57b0: 6e 69 63 6f 64 65 32 2e 63 2e 0a 2a 2a 2a 2a 2a  nicode2.c..*****
57c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5800: 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 0a     *****/..#endif.