/ Hex Artifact Content
Login

Artifact 45f2ceb3c030f70e2cc4c199e9f700c2f2367f77:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2f 0a 23 69 66 6e  *****.**.*/.#ifn
0180: 64 65 66 20 5f 46 54 53 35 49 4e 54 5f 48 0a 23  def _FTS5INT_H.#
0190: 64 65 66 69 6e 65 20 5f 46 54 53 35 49 4e 54 5f  define _FTS5INT_
01a0: 48 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 74 73  H..#include "fts
01b0: 35 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73  5.h".#include "s
01c0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 53 51 4c  qlite3ext.h".SQL
01d0: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
01e0: 49 54 31 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73  IT1..#include <s
01f0: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
0200: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69  e <assert.h>..#i
0210: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  fndef SQLITE_AMA
0220: 4c 47 41 4d 41 54 49 4f 4e 0a 0a 74 79 70 65 64  LGAMATION..typed
0230: 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ef unsigned char
0240: 20 20 75 38 3b 0a 74 79 70 65 64 65 66 20 75 6e    u8;.typedef un
0250: 73 69 67 6e 65 64 20 69 6e 74 20 20 20 75 33 32  signed int   u32
0260: 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ;.typedef unsign
0270: 65 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74 79  ed short u16;.ty
0280: 70 65 64 65 66 20 73 71 6c 69 74 65 33 5f 69 6e  pedef sqlite3_in
0290: 74 36 34 20 69 36 34 3b 0a 74 79 70 65 64 65 66  t64 i64;.typedef
02a0: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
02b0: 75 36 34 3b 0a 0a 23 64 65 66 69 6e 65 20 41 72  u64;..#define Ar
02c0: 72 61 79 53 69 7a 65 28 78 29 20 28 73 69 7a 65  raySize(x) (size
02d0: 6f 66 28 78 29 20 2f 20 73 69 7a 65 6f 66 28 78  of(x) / sizeof(x
02e0: 5b 30 5d 29 29 0a 0a 23 64 65 66 69 6e 65 20 74  [0]))..#define t
02f0: 65 73 74 63 61 73 65 28 78 29 0a 23 64 65 66 69  estcase(x).#defi
0300: 6e 65 20 41 4c 57 41 59 53 28 78 29 20 31 0a 23  ne ALWAYS(x) 1.#
0310: 64 65 66 69 6e 65 20 4e 45 56 45 52 28 78 29 20  define NEVER(x) 
0320: 30 0a 0a 23 64 65 66 69 6e 65 20 4d 49 4e 28 78  0..#define MIN(x
0330: 2c 79 29 20 28 28 28 78 29 20 3c 20 28 79 29 29  ,y) (((x) < (y))
0340: 20 3f 20 28 78 29 20 3a 20 28 79 29 29 0a 23 64   ? (x) : (y)).#d
0350: 65 66 69 6e 65 20 4d 41 58 28 78 2c 79 29 20 28  efine MAX(x,y) (
0360: 28 28 78 29 20 3e 20 28 79 29 29 20 3f 20 28 78  ((x) > (y)) ? (x
0370: 29 20 3a 20 28 79 29 29 0a 0a 2f 2a 0a 2a 2a 20  ) : (y))../*.** 
0380: 43 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 74 68  Constants for th
0390: 65 20 6c 61 72 67 65 73 74 20 61 6e 64 20 73 6d  e largest and sm
03a0: 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
03b0: 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
03c0: 74 65 67 65 72 73 2e 0a 2a 2f 0a 23 20 64 65 66  tegers..*/.# def
03d0: 69 6e 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ine LARGEST_INT6
03e0: 34 20 20 28 30 78 66 66 66 66 66 66 66 66 7c 28  4  (0xffffffff|(
03f0: 28 28 69 36 34 29 30 78 37 66 66 66 66 66 66 66  ((i64)0x7fffffff
0400: 29 3c 3c 33 32 29 29 0a 23 20 64 65 66 69 6e 65  )<<32)).# define
0410: 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
0420: 28 28 28 69 36 34 29 2d 31 29 20 2d 20 4c 41 52  (((i64)-1) - LAR
0430: 47 45 53 54 5f 49 4e 54 36 34 29 0a 0a 23 65 6e  GEST_INT64)..#en
0440: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  dif.../*.** Maxi
0450: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72  mum number of pr
0460: 65 66 69 78 20 69 6e 64 65 78 65 73 20 6f 6e 20  efix indexes on 
0470: 73 69 6e 67 6c 65 20 46 54 53 35 20 74 61 62 6c  single FTS5 tabl
0480: 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 0a  e. This must be.
0490: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2e  ** less than 32.
04a0: 20 49 66 20 69 74 20 69 73 20 73 65 74 20 74 6f   If it is set to
04b0: 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
04c0: 74 68 61 6e 20 74 68 61 74 2c 20 61 6e 20 23 65  than that, an #e
04d0: 72 72 6f 72 0a 2a 2a 20 64 69 72 65 63 74 69 76  rror.** directiv
04e0: 65 20 69 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e  e in fts5_index.
04f0: 63 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  c will cause the
0500: 20 62 75 69 6c 64 20 74 6f 20 66 61 69 6c 2e 0a   build to fail..
0510: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
0520: 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58  MAX_PREFIX_INDEX
0530: 45 53 20 33 31 0a 0a 23 64 65 66 69 6e 65 20 46  ES 31..#define F
0540: 54 53 35 5f 44 45 46 41 55 4c 54 5f 4e 45 41 52  TS5_DEFAULT_NEAR
0550: 44 49 53 54 20 31 30 0a 23 64 65 66 69 6e 65 20  DIST 10.#define 
0560: 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 52 41 4e  FTS5_DEFAULT_RAN
0570: 4b 20 20 20 20 20 22 62 6d 32 35 22 0a 0a 2f 2a  K     "bm25"../*
0580: 20 4e 61 6d 65 20 6f 66 20 72 61 6e 6b 20 61 6e   Name of rank an
0590: 64 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 73 20  d rowid columns 
05a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
05b0: 52 41 4e 4b 5f 4e 41 4d 45 20 22 72 61 6e 6b 22  RANK_NAME "rank"
05c0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 52 4f  .#define FTS5_RO
05d0: 57 49 44 5f 4e 41 4d 45 20 22 72 6f 77 69 64 22  WID_NAME "rowid"
05e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
05f0: 44 45 42 55 47 0a 23 20 64 65 66 69 6e 65 20 46  DEBUG.# define F
0600: 54 53 35 5f 43 4f 52 52 55 50 54 20 73 71 6c 69  TS5_CORRUPT sqli
0610: 74 65 33 46 74 73 35 43 6f 72 72 75 70 74 28 29  te3Fts5Corrupt()
0620: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
0630: 43 6f 72 72 75 70 74 28 76 6f 69 64 29 3b 0a 23  Corrupt(void);.#
0640: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 46 54  else.# define FT
0650: 53 35 5f 43 4f 52 52 55 50 54 20 53 51 4c 49 54  S5_CORRUPT SQLIT
0660: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 0a 23  E_CORRUPT_VTAB.#
0670: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0680: 20 61 73 73 65 72 74 5f 6e 63 28 29 20 6d 61 63   assert_nc() mac
0690: 72 6f 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ro is similar to
06a0: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 6d 61   the assert() ma
06b0: 63 72 6f 2c 20 65 78 63 65 70 74 20 74 68 61 74  cro, except that
06c0: 20 69 74 0a 2a 2a 20 69 73 20 75 73 65 64 20 66   it.** is used f
06d0: 6f 72 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64  or assert() cond
06e0: 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  itions that are 
06f0: 74 72 75 65 20 6f 6e 6c 79 20 69 66 20 69 74 20  true only if it 
0700: 63 61 6e 20 62 65 20 0a 2a 2a 20 67 75 72 61 6e  can be .** guran
0710: 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
0720: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 63 6f  tabase is not co
0730: 72 72 75 70 74 2e 0a 2a 2f 0a 23 69 66 64 65 66  rrupt..*/.#ifdef
0740: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 65 78   SQLITE_DEBUG.ex
0750: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0760: 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f 72  _fts5_may_be_cor
0770: 72 75 70 74 3b 0a 23 20 64 65 66 69 6e 65 20 61  rupt;.# define a
0780: 73 73 65 72 74 5f 6e 63 28 78 29 20 61 73 73 65  ssert_nc(x) asse
0790: 72 74 28 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  rt(sqlite3_fts5_
07a0: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 20 7c  may_be_corrupt |
07b0: 7c 20 28 78 29 29 0a 23 65 6c 73 65 0a 23 20 64  | (x)).#else.# d
07c0: 65 66 69 6e 65 20 61 73 73 65 72 74 5f 6e 63 28  efine assert_nc(
07d0: 78 29 20 61 73 73 65 72 74 28 78 29 0a 23 65 6e  x) assert(x).#en
07e0: 64 69 66 0a 0a 74 79 70 65 64 65 66 20 73 74 72  dif..typedef str
07f0: 75 63 74 20 46 74 73 35 47 6c 6f 62 61 6c 20 46  uct Fts5Global F
0800: 74 73 35 47 6c 6f 62 61 6c 3b 0a 0a 2f 2a 2a 2a  ts5Global;../***
0810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0850: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  *******.** Inter
0860: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
0870: 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63 2e 20 66  fts5_config.c. f
0880: 74 73 35 5f 63 6f 6e 66 69 67 2e 63 20 63 6f 6e  ts5_config.c con
0890: 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e 73 20 63  tains contains c
08a0: 6f 64 65 0a 2a 2a 20 74 6f 20 70 61 72 73 65 20  ode.** to parse 
08b0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61  the arguments pa
08c0: 73 73 65 64 20 74 6f 20 74 68 65 20 43 52 45 41  ssed to the CREA
08d0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
08e0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 0a   statement..*/..
08f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
0900: 74 73 35 43 6f 6e 66 69 67 20 46 74 73 35 43 6f  ts5Config Fts5Co
0910: 6e 66 69 67 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nfig;../*.** An 
0920: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0930: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0940: 75 72 65 20 65 6e 63 6f 64 65 73 20 61 6c 6c 20  ure encodes all 
0950: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
0960: 20 63 61 6e 0a 2a 2a 20 62 65 20 67 6c 65 61 6e   can.** be glean
0970: 65 64 20 66 72 6f 6d 20 74 68 65 20 43 52 45 41  ed from the CREA
0980: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0990: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
09a0: 2a 20 41 6e 64 20 61 6c 6c 20 69 6e 66 6f 72 6d  * And all inform
09b0: 61 74 69 6f 6e 20 6c 6f 61 64 65 64 20 66 72 6f  ation loaded fro
09c0: 6d 20 74 68 65 20 25 5f 63 6f 6e 66 69 67 20 74  m the %_config t
09d0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e 41 75 74  able..**.** nAut
09e0: 6f 6d 65 72 67 65 3a 0a 2a 2a 20 20 20 54 68 65  omerge:.**   The
09f0: 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   minimum number 
0a00: 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  of segments that
0a10: 20 61 6e 20 61 75 74 6f 2d 6d 65 72 67 65 20 6f   an auto-merge o
0a20: 70 65 72 61 74 69 6f 6e 20 73 68 6f 75 6c 64 0a  peration should.
0a30: 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20  **   attempt to 
0a40: 6d 65 72 67 65 20 74 6f 67 65 74 68 65 72 2e 20  merge together. 
0a50: 41 20 76 61 6c 75 65 20 6f 66 20 31 20 73 65 74  A value of 1 set
0a60: 73 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  s the object to 
0a70: 75 73 65 20 74 68 65 20 0a 2a 2a 20 20 20 63 6f  use the .**   co
0a80: 6d 70 69 6c 65 20 74 69 6d 65 20 64 65 66 61 75  mpile time defau
0a90: 6c 74 2e 20 5a 65 72 6f 20 64 69 73 61 62 6c 65  lt. Zero disable
0aa0: 73 20 61 75 74 6f 2d 6d 65 72 67 65 20 61 6c 74  s auto-merge alt
0ab0: 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 7a  ogether..**.** z
0ac0: 43 6f 6e 74 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 7a  Content:.**.** z
0ad0: 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3a 0a 2a 2a  ContentRowid:.**
0ae0: 20 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20     The value of 
0af0: 74 68 65 20 63 6f 6e 74 65 6e 74 5f 72 6f 77 69  the content_rowi
0b00: 64 3d 20 6f 70 74 69 6f 6e 2c 20 69 66 20 6f 6e  d= option, if on
0b10: 65 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2e  e was specified.
0b20: 20 4f 72 20 0a 2a 2a 20 20 20 74 68 65 20 73 74   Or .**   the st
0b30: 72 69 6e 67 20 22 72 6f 77 69 64 22 20 6f 74 68  ring "rowid" oth
0b40: 65 72 77 69 73 65 2e 20 54 68 69 73 20 74 65 78  erwise. This tex
0b50: 74 20 69 73 20 6e 6f 74 20 71 75 6f 74 65 64 20  t is not quoted 
0b60: 2d 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 20 20  - if it is.**   
0b70: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
0b80: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
0b90: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
0ba0: 71 75 6f 74 65 64 20 61 70 70 72 6f 70 72 69 61  quoted appropria
0bb0: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 7a 43 6f 6e  tely..**.** zCon
0bc0: 74 65 6e 74 45 78 70 72 6c 69 73 74 3a 0a 2a 2a  tentExprlist:.**
0bd0: 0a 2a 2a 20 70 7a 45 72 72 6d 73 67 3a 0a 2a 2a  .** pzErrmsg:.**
0be0: 20 20 20 54 68 69 73 20 65 78 69 73 74 73 20 69     This exists i
0bf0: 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77  n order to allow
0c00: 20 74 68 65 20 66 74 73 35 5f 69 6e 64 65 78 2e   the fts5_index.
0c10: 63 20 6d 6f 64 75 6c 65 20 74 6f 20 72 65 74 75  c module to retu
0c20: 72 6e 20 61 20 0a 2a 2a 20 20 20 64 65 63 65 6e  rn a .**   decen
0c30: 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  t error message 
0c40: 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 73  if it encounters
0c50: 20 61 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 76   a file-format v
0c60: 65 72 73 69 6f 6e 20 69 74 20 64 6f 65 73 0a 2a  ersion it does.*
0c70: 2a 20 20 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  *   not understa
0c80: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 62 43 6f 6c 75 6d  nd..**.** bColum
0c90: 6e 73 69 7a 65 3a 0a 2a 2a 20 20 20 54 72 75 65  nsize:.**   True
0ca0: 20 69 66 20 74 68 65 20 25 5f 64 6f 63 73 69 7a   if the %_docsiz
0cb0: 65 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74  e table is creat
0cc0: 65 64 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  ed..**.*/.struct
0cd0: 20 46 74 73 35 43 6f 6e 66 69 67 20 7b 0a 20 20   Fts5Config {.  
0ce0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
0d10: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
0d20: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0d30: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0d40: 61 73 65 20 68 6f 6c 64 69 6e 67 20 46 54 53 20  ase holding FTS 
0d50: 69 6e 64 65 78 20 28 65 2e 67 2e 20 22 6d 61 69  index (e.g. "mai
0d60: 6e 22 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  n") */.  char *z
0d70: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
0d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0d90: 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f   of FTS index */
0da0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0dd0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61  columns */.  cha
0de0: 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20  r **azCol;      
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e00: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  Column names */.
0e10: 20 20 75 38 20 2a 61 62 55 6e 69 6e 64 65 78 65    u8 *abUnindexe
0e20: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
0e30: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 75 6e    /* True for un
0e40: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
0e50: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
0e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0e70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0e80: 66 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  f prefix indexes
0e90: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 72 65 66   */.  int *aPref
0ea0: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
0eb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 69        /* Sizes i
0ec0: 6e 20 62 79 74 65 73 20 6f 66 20 6e 50 72 65 66  n bytes of nPref
0ed0: 69 78 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ix prefix indexe
0ee0: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 43 6f 6e 74  s */.  int eCont
0ef0: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
0f00: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 46 54 53         /* An FTS
0f10: 35 5f 43 4f 4e 54 45 4e 54 20 76 61 6c 75 65 20  5_CONTENT value 
0f20: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
0f30: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
0f40: 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 6e 74 20       /* content 
0f50: 74 61 62 6c 65 20 2a 2f 20 0a 20 20 63 68 61 72  table */ .  char
0f60: 20 2a 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3b   *zContentRowid;
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22              /* "
0f80: 63 6f 6e 74 65 6e 74 5f 72 6f 77 69 64 3d 22 20  content_rowid=" 
0f90: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 20  option value */ 
0fa0: 0a 20 20 69 6e 74 20 62 43 6f 6c 75 6d 6e 73 69  .  int bColumnsi
0fb0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
0fc0: 20 20 20 2f 2a 20 22 63 6f 6c 75 6d 6e 73 69 7a     /* "columnsiz
0fd0: 65 3d 22 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65  e=" option value
0fe0: 20 28 64 66 6c 74 3d 3d 31 29 20 2a 2f 0a 20 20   (dflt==1) */.  
0ff0: 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 45 78  char *zContentEx
1000: 70 72 6c 69 73 74 3b 0a 20 20 46 74 73 35 54 6f  prlist;.  Fts5To
1010: 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 3b 0a 20  kenizer *pTok;. 
1020: 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 20   fts5_tokenizer 
1030: 2a 70 54 6f 6b 41 70 69 3b 0a 0a 20 20 2f 2a 20  *pTokApi;..  /* 
1040: 56 61 6c 75 65 73 20 6c 6f 61 64 65 64 20 66 72  Values loaded fr
1050: 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 66 69 67 20  om the %_config 
1060: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1070: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
1080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1090: 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20 25  cremented when %
10a0: 5f 63 6f 6e 66 69 67 20 69 73 20 6d 6f 64 69 66  _config is modif
10b0: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ied */.  int pgs
10c0: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
10d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 72           /* Appr
10e0: 6f 78 69 6d 61 74 65 20 70 61 67 65 20 73 69 7a  oximate page siz
10f0: 65 20 75 73 65 64 20 69 6e 20 25 5f 64 61 74 61  e used in %_data
1100: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 75 74 6f 6d   */.  int nAutom
1110: 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  erge;           
1120: 20 20 20 20 20 20 2f 2a 20 27 61 75 74 6f 6d 65        /* 'autome
1130: 72 67 65 27 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rge' setting */.
1140: 20 20 69 6e 74 20 6e 43 72 69 73 69 73 4d 65 72    int nCrisisMer
1150: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1160: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
1170: 6f 77 65 64 20 73 65 67 6d 65 6e 74 73 20 70 65  owed segments pe
1180: 72 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 63 68 61  r level */.  cha
1190: 72 20 2a 7a 52 61 6e 6b 3b 20 20 20 20 20 20 20  r *zRank;       
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b0: 4e 61 6d 65 20 6f 66 20 72 61 6e 6b 20 66 75 6e  Name of rank fun
11c0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ction */.  char 
11d0: 2a 7a 52 61 6e 6b 41 72 67 73 3b 20 20 20 20 20  *zRankArgs;     
11e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
11f0: 67 75 6d 65 6e 74 73 20 74 6f 20 72 61 6e 6b 20  guments to rank 
1200: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
1210: 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 70  * If non-NULL, p
1220: 6f 69 6e 74 73 20 74 6f 20 73 71 6c 69 74 65 33  oints to sqlite3
1230: 5f 76 74 61 62 2e 62 61 73 65 2e 7a 45 72 72 6d  _vtab.base.zErrm
1240: 73 67 2e 20 4f 66 74 65 6e 20 4e 55 4c 4c 2e 20  sg. Often NULL. 
1250: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
1260: 72 6d 73 67 3b 0a 7d 3b 0a 0a 2f 2a 20 43 75 72  rmsg;.};../* Cur
1270: 72 65 6e 74 20 65 78 70 65 63 74 65 64 20 76 61  rent expected va
1280: 6c 75 65 20 6f 66 20 25 5f 63 6f 6e 66 69 67 20  lue of %_config 
1290: 74 61 62 6c 65 20 27 76 65 72 73 69 6f 6e 27 20  table 'version' 
12a0: 66 69 65 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65  field */.#define
12b0: 20 46 54 53 35 5f 43 55 52 52 45 4e 54 5f 56 45   FTS5_CURRENT_VE
12c0: 52 53 49 4f 4e 20 33 0a 0a 23 64 65 66 69 6e 65  RSION 3..#define
12d0: 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f   FTS5_CONTENT_NO
12e0: 52 4d 41 4c 20 20 20 30 0a 23 64 65 66 69 6e 65  RMAL   0.#define
12f0: 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f   FTS5_CONTENT_NO
1300: 4e 45 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65  NE     1.#define
1310: 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 45 58   FTS5_CONTENT_EX
1320: 54 45 52 4e 41 4c 20 32 0a 0a 0a 0a 0a 69 6e 74  TERNAL 2.....int
1330: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
1340: 69 67 50 61 72 73 65 28 0a 20 20 20 20 46 74 73  igParse(.    Fts
1350: 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65  5Global*, sqlite
1360: 33 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63  3*, int, const c
1370: 68 61 72 20 2a 2a 2c 20 46 74 73 35 43 6f 6e 66  har **, Fts5Conf
1380: 69 67 2a 2a 2c 20 63 68 61 72 2a 2a 0a 29 3b 0a  ig**, char**.);.
1390: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
13a0: 43 6f 6e 66 69 67 46 72 65 65 28 46 74 73 35 43  ConfigFree(Fts5C
13b0: 6f 6e 66 69 67 2a 29 3b 0a 0a 69 6e 74 20 73 71  onfig*);..int sq
13c0: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 44  lite3Fts5ConfigD
13d0: 65 63 6c 61 72 65 56 74 61 62 28 46 74 73 35 43  eclareVtab(Fts5C
13e0: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 29 3b  onfig *pConfig);
13f0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
1400: 35 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73  5Tokenize(.  Fts
1410: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1430: 46 54 53 35 20 43 6f 6e 66 69 67 75 72 61 74 69  FTS5 Configurati
1440: 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  on object */.  c
1450: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 78 74  onst char *pText
1460: 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20 20 20 2f  , int nText,   /
1470: 2a 20 54 65 78 74 20 74 6f 20 74 6f 6b 65 6e 69  * Text to tokeni
1480: 7a 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ze */.  void *pC
1490: 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
14a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
14b0: 78 74 20 70 61 73 73 65 64 20 74 6f 20 78 54 6f  xt passed to xTo
14c0: 6b 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 28  ken() */.  int (
14d0: 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20  *xToken)(void*, 
14e0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
14f0: 2c 20 69 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f  , int, int)    /
1500: 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 3b  * Callback */.);
1510: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
1520: 73 35 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a  s5Dequote(char *
1530: 7a 29 3b 0a 0a 2f 2a 20 4c 6f 61 64 20 74 68 65  z);../* Load the
1540: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1550: 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65 20   %_config table 
1560: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
1570: 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 46 74 73  s5ConfigLoad(Fts
1580: 35 43 6f 6e 66 69 67 2a 2c 20 69 6e 74 29 3b 0a  5Config*, int);.
1590: 0a 2f 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  ./* Set the valu
15a0: 65 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f  e of a single co
15b0: 6e 66 69 67 20 61 74 74 72 69 62 75 74 65 20 2a  nfig attribute *
15c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
15d0: 35 43 6f 6e 66 69 67 53 65 74 56 61 6c 75 65 28  5ConfigSetValue(
15e0: 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e  Fts5Config*, con
15f0: 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65  st char*, sqlite
1600: 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 2a 29 3b  3_value*, int*);
1610: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
1620: 35 43 6f 6e 66 69 67 50 61 72 73 65 52 61 6e 6b  5ConfigParseRank
1630: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 63 68  (const char*, ch
1640: 61 72 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 0a  ar**, char**);..
1650: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
1660: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
1670: 6e 20 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63 2e  n fts5_config.c.
1680: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
16d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
1720: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
1730: 6e 20 66 74 73 35 5f 62 75 66 66 65 72 2e 63 2e  n fts5_buffer.c.
1740: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  .*/../*.** Buffe
1750: 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  r object for the
1760: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 75 69   incremental bui
1770: 6c 64 69 6e 67 20 6f 66 20 73 74 72 69 6e 67 20  lding of string 
1780: 64 61 74 61 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  data..*/.typedef
1790: 20 73 74 72 75 63 74 20 46 74 73 35 42 75 66 66   struct Fts5Buff
17a0: 65 72 20 46 74 73 35 42 75 66 66 65 72 3b 0a 73  er Fts5Buffer;.s
17b0: 74 72 75 63 74 20 46 74 73 35 42 75 66 66 65 72  truct Fts5Buffer
17c0: 20 7b 0a 20 20 75 38 20 2a 70 3b 0a 20 20 69 6e   {.  u8 *p;.  in
17d0: 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 53 70 61 63  t n;.  int nSpac
17e0: 65 3b 0a 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  e;.};..int sqlit
17f0: 65 33 46 74 73 35 42 75 66 66 65 72 47 72 6f 77  e3Fts5BufferGrow
1800: 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65  (int*, Fts5Buffe
1810: 72 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 73  r*, int);.void s
1820: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1830: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 69 6e 74  AppendVarint(int
1840: 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
1850: 69 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  i64);.void sqlit
1860: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1870: 6e 64 42 6c 6f 62 28 69 6e 74 2a 2c 20 46 74 73  ndBlob(int*, Fts
1880: 35 42 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63  5Buffer*, int, c
1890: 6f 6e 73 74 20 75 38 2a 29 3b 0a 76 6f 69 64 20  onst u8*);.void 
18a0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
18b0: 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28 69 6e  rAppendString(in
18c0: 74 20 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  t *, Fts5Buffer*
18d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
18e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
18f0: 42 75 66 66 65 72 46 72 65 65 28 46 74 73 35 42  BufferFree(Fts5B
1900: 75 66 66 65 72 2a 29 3b 0a 76 6f 69 64 20 73 71  uffer*);.void sq
1910: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
1920: 65 72 6f 28 46 74 73 35 42 75 66 66 65 72 2a 29  ero(Fts5Buffer*)
1930: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
1940: 73 35 42 75 66 66 65 72 53 65 74 28 69 6e 74 2a  s5BufferSet(int*
1950: 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69  , Fts5Buffer*, i
1960: 6e 74 2c 20 63 6f 6e 73 74 20 75 38 2a 29 3b 0a  nt, const u8*);.
1970: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
1980: 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
1990: 74 66 28 69 6e 74 20 2a 2c 20 46 74 73 35 42 75  tf(int *, Fts5Bu
19a0: 66 66 65 72 2a 2c 20 63 68 61 72 20 2a 7a 46 6d  ffer*, char *zFm
19b0: 74 2c 20 2e 2e 2e 29 3b 0a 76 6f 69 64 20 73 71  t, ...);.void sq
19c0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
19d0: 70 70 65 6e 64 33 32 28 69 6e 74 2a 2c 20 46 74  ppend32(int*, Ft
19e0: 73 35 42 75 66 66 65 72 2a 2c 20 69 6e 74 29 3b  s5Buffer*, int);
19f0: 0a 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  ..char *sqlite3F
1a00: 74 73 35 4d 70 72 69 6e 74 66 28 69 6e 74 20 2a  ts5Mprintf(int *
1a10: 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  pRc, const char 
1a20: 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0a 0a 23 64  *zFmt, ...);..#d
1a30: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
1a40: 5a 65 72 6f 28 78 29 20 20 20 20 20 20 20 20 20  Zero(x)         
1a50: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1a60: 75 66 66 65 72 5a 65 72 6f 28 78 29 0a 23 64 65  ufferZero(x).#de
1a70: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 47  fine fts5BufferG
1a80: 72 6f 77 28 61 2c 62 2c 63 29 20 20 20 20 20 20  row(a,b,c)      
1a90: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1aa0: 66 66 65 72 47 72 6f 77 28 61 2c 62 2c 63 29 0a  fferGrow(a,b,c).
1ab0: 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66  #define fts5Buff
1ac0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 61  erAppendVarint(a
1ad0: 2c 62 2c 63 29 20 73 71 6c 69 74 65 33 46 74 73  ,b,c) sqlite3Fts
1ae0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1af0: 69 6e 74 28 61 2c 62 2c 63 29 0a 23 64 65 66 69  int(a,b,c).#defi
1b00: 6e 65 20 66 74 73 35 42 75 66 66 65 72 46 72 65  ne fts5BufferFre
1b10: 65 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  e(a)            
1b20: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1b30: 65 72 46 72 65 65 28 61 29 0a 23 64 65 66 69 6e  erFree(a).#defin
1b40: 65 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65  e fts5BufferAppe
1b50: 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20  ndBlob(a,b,c,d) 
1b60: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1b70: 72 41 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c  rAppendBlob(a,b,
1b80: 63 2c 64 29 0a 23 64 65 66 69 6e 65 20 66 74 73  c,d).#define fts
1b90: 35 42 75 66 66 65 72 53 65 74 28 61 2c 62 2c 63  5BufferSet(a,b,c
1ba0: 2c 64 29 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,d)        sqlit
1bb0: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
1bc0: 61 2c 62 2c 63 2c 64 29 0a 23 64 65 66 69 6e 65  a,b,c,d).#define
1bd0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1be0: 64 33 32 28 61 2c 62 2c 63 29 20 20 20 20 20 73  d32(a,b,c)     s
1bf0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1c00: 41 70 70 65 6e 64 33 32 28 61 2c 62 2c 63 29 0a  Append32(a,b,c).
1c10: 0a 2f 2a 20 57 72 69 74 65 20 61 6e 64 20 64 65  ./* Write and de
1c20: 63 6f 64 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  code big-endian 
1c30: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  32-bit integer v
1c40: 61 6c 75 65 73 20 2a 2f 0a 76 6f 69 64 20 73 71  alues */.void sq
1c50: 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 75  lite3Fts5Put32(u
1c60: 38 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71  8*, int);.int sq
1c70: 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28 63  lite3Fts5Get32(c
1c80: 6f 6e 73 74 20 75 38 2a 29 3b 0a 0a 23 64 65 66  onst u8*);..#def
1c90: 69 6e 65 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c  ine FTS5_POS2COL
1ca0: 55 4d 4e 28 69 50 6f 73 29 20 28 69 6e 74 29 28  UMN(iPos) (int)(
1cb0: 69 50 6f 73 20 3e 3e 20 33 32 29 0a 23 64 65 66  iPos >> 32).#def
1cc0: 69 6e 65 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  ine FTS5_POS2OFF
1cd0: 53 45 54 28 69 50 6f 73 29 20 28 69 6e 74 29 28  SET(iPos) (int)(
1ce0: 69 50 6f 73 20 26 20 30 78 46 46 46 46 46 46 46  iPos & 0xFFFFFFF
1cf0: 46 29 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  F)..typedef stru
1d00: 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65  ct Fts5PoslistRe
1d10: 61 64 65 72 20 46 74 73 35 50 6f 73 6c 69 73 74  ader Fts5Poslist
1d20: 52 65 61 64 65 72 3b 0a 73 74 72 75 63 74 20 46  Reader;.struct F
1d30: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
1d40: 20 7b 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65   {.  /* Variable
1d50: 73 20 75 73 65 64 20 6f 6e 6c 79 20 62 79 20 73  s used only by s
1d60: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1d70: 74 49 74 65 72 58 58 58 28 29 20 66 75 6e 63 74  tIterXXX() funct
1d80: 69 6f 6e 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  ions. */.  int i
1d90: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
1da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1db0: 20 28 69 43 6f 6c 3e 3d 30 29 2c 20 74 68 69 73   (iCol>=0), this
1dc0: 20 63 6f 6c 75 6d 6e 20 6f 6e 6c 79 20 2a 2f 0a   column only */.
1dd0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20    const u8 *a;  
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69    /* Position li
1e00: 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  st to iterate th
1e10: 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  rough */.  int n
1e20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1e40: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
1e50: 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  a[] in bytes */.
1e60: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
1e90: 73 65 74 20 69 6e 20 61 5b 5d 20 2a 2f 0a 0a 20  set in a[] */.. 
1ea0: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
1eb0: 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45  bles */.  int bE
1ec0: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
1ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
1ee0: 20 74 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20   to true at EOF 
1ef0: 2a 2f 0a 20 20 69 36 34 20 69 50 6f 73 3b 20 20  */.  i64 iPos;  
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33       /* (iCol<<3
1f20: 32 29 20 2b 20 69 50 6f 73 20 2a 2f 0a 7d 3b 0a  2) + iPos */.};.
1f30: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
1f40: 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
1f50: 28 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  (.  int iCol,   
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 20 2f 2a 20 49 66 20 28 69 43 6f 6c 3e      /* If (iCol>
1f80: 3d 30 29 2c 20 74 68 69 73 20 63 6f 6c 75 6d 6e  =0), this column
1f90: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74   only */.  const
1fa0: 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20   u8 *a, int n,  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1fc0: 73 6c 69 73 74 20 62 75 66 66 65 72 20 74 6f 20  slist buffer to 
1fd0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1fe0: 2a 2f 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74  */.  Fts5Poslist
1ff0: 52 65 61 64 65 72 20 2a 70 49 74 65 72 20 20 20  Reader *pIter   
2000: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2010: 20 6f 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69   object to initi
2020: 61 6c 69 7a 65 20 2a 2f 0a 29 3b 0a 69 6e 74 20  alize */.);.int 
2030: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
2040: 73 74 52 65 61 64 65 72 4e 65 78 74 28 46 74 73  stReaderNext(Fts
2050: 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 2a 29  5PoslistReader*)
2060: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
2070: 74 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69  t Fts5PoslistWri
2080: 74 65 72 20 46 74 73 35 50 6f 73 6c 69 73 74 57  ter Fts5PoslistW
2090: 72 69 74 65 72 3b 0a 73 74 72 75 63 74 20 46 74  riter;.struct Ft
20a0: 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20  s5PoslistWriter 
20b0: 7b 0a 20 20 69 36 34 20 69 50 72 65 76 3b 0a 7d  {.  i64 iPrev;.}
20c0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
20d0: 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70  5PoslistWriterAp
20e0: 70 65 6e 64 28 46 74 73 35 42 75 66 66 65 72 2a  pend(Fts5Buffer*
20f0: 2c 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69  , Fts5PoslistWri
2100: 74 65 72 2a 2c 20 69 36 34 29 3b 0a 0a 69 6e 74  ter*, i64);..int
2110: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2120: 69 73 74 4e 65 78 74 36 34 28 0a 20 20 63 6f 6e  istNext64(.  con
2130: 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c  st u8 *a, int n,
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2150: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
2160: 67 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69  g poslist */.  i
2170: 6e 74 20 2a 70 69 2c 20 20 20 20 20 20 20 20 20  nt *pi,         
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2190: 2a 20 49 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74  * IN/OUT: Offset
21a0: 20 77 69 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20   within a[] */. 
21b0: 20 69 36 34 20 2a 70 69 4f 66 66 20 20 20 20 20   i64 *piOff     
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
21e0: 65 6e 74 20 6f 66 66 73 65 74 20 2a 2f 0a 29 3b  ent offset */.);
21f0: 0a 0a 2f 2a 20 4d 61 6c 6c 6f 63 20 75 74 69 6c  ../* Malloc util
2200: 69 74 79 20 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ity */.void *sql
2210: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
2220: 72 6f 28 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74  ro(int *pRc, int
2230: 20 6e 42 79 74 65 29 3b 0a 63 68 61 72 20 2a 73   nByte);.char *s
2240: 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75  qlite3Fts5Strndu
2250: 70 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73  p(int *pRc, cons
2260: 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74  t char *pIn, int
2270: 20 6e 49 6e 29 3b 0a 0a 2f 2a 20 43 68 61 72 61   nIn);../* Chara
2280: 63 74 65 72 20 73 65 74 20 74 65 73 74 73 20 28  cter set tests (
2290: 6c 69 6b 65 20 69 73 73 70 61 63 65 28 29 2c 20  like isspace(), 
22a0: 69 73 61 6c 70 68 61 28 29 20 65 74 63 2e 29 20  isalpha() etc.) 
22b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22c0: 73 35 49 73 42 61 72 65 77 6f 72 64 28 63 68 61  s5IsBareword(cha
22d0: 72 20 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64  r t);../*.** End
22e0: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
22f0: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 62 75   code in fts5_bu
2300: 66 66 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  ffer.c..********
2310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2350: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a0: 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
23b0: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 69 6e   code in fts5_in
23c0: 64 65 78 2e 63 2e 20 66 74 73 35 5f 69 6e 64 65  dex.c. fts5_inde
23d0: 78 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e  x.c contains con
23e0: 74 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f  tains code.** to
23f0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
2400: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25   stored in the %
2410: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  _data table..*/.
2420: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2430: 46 74 73 35 49 6e 64 65 78 20 46 74 73 35 49 6e  Fts5Index Fts5In
2440: 64 65 78 3b 0a 74 79 70 65 64 65 66 20 73 74 72  dex;.typedef str
2450: 75 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65  uct Fts5IndexIte
2460: 72 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 3b  r Fts5IndexIter;
2470: 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 75  ../*.** Values u
2480: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
2490: 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
24a0: 74 20 70 61 73 73 65 64 20 74 6f 20 49 6e 64 65  t passed to Inde
24b0: 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 23 64 65  xQuery()..*/.#de
24c0: 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51  fine FTS5INDEX_Q
24d0: 55 45 52 59 5f 50 52 45 46 49 58 20 20 20 20 20  UERY_PREFIX     
24e0: 30 78 30 30 30 31 20 20 20 2f 2a 20 50 72 65 66  0x0001   /* Pref
24f0: 69 78 20 71 75 65 72 79 20 2a 2f 0a 23 64 65 66  ix query */.#def
2500: 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  ine FTS5INDEX_QU
2510: 45 52 59 5f 44 45 53 43 20 20 20 20 20 20 20 30  ERY_DESC       0
2520: 78 30 30 30 32 20 20 20 2f 2a 20 44 6f 63 73 20  x0002   /* Docs 
2530: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  in descending ro
2540: 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  wid order */.#de
2550: 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51  fine FTS5INDEX_Q
2560: 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20  UERY_TEST_NOIDX 
2570: 30 78 30 30 30 34 20 20 20 2f 2a 20 44 6f 20 6e  0x0004   /* Do n
2580: 6f 74 20 75 73 65 20 70 72 65 66 69 78 20 69 6e  ot use prefix in
2590: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  dex */.#define F
25a0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
25b0: 43 41 4e 20 20 20 20 20 20 20 30 78 30 30 30 38  CAN       0x0008
25c0: 20 20 20 2f 2a 20 53 63 61 6e 20 71 75 65 72 79     /* Scan query
25d0: 20 28 66 74 73 35 76 6f 63 61 62 29 20 2a 2f 0a   (fts5vocab) */.
25e0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 2f 64 65  ./*.** Create/de
25f0: 73 74 72 6f 79 20 61 6e 20 46 74 73 35 49 6e 64  stroy an Fts5Ind
2600: 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e  ex object..*/.in
2610: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2620: 65 78 4f 70 65 6e 28 46 74 73 35 43 6f 6e 66 69  exOpen(Fts5Confi
2630: 67 20 2a 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20  g *pConfig, int 
2640: 62 43 72 65 61 74 65 2c 20 46 74 73 35 49 6e 64  bCreate, Fts5Ind
2650: 65 78 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69  ex**, char**);.i
2660: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2670: 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64  dexClose(Fts5Ind
2680: 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66  ex *p);../*.** f
2690: 6f 72 28 0a 2a 2a 20 20 20 70 49 74 65 72 20 3d  or(.**   pIter =
26a0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
26b0: 78 51 75 65 72 79 28 70 2c 20 22 74 6f 6b 65 6e  xQuery(p, "token
26c0: 22 2c 20 35 2c 20 30 29 3b 0a 2a 2a 20 20 20 30  ", 5, 0);.**   0
26d0: 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ==sqlite3Fts5Ite
26e0: 72 45 6f 66 28 70 49 74 65 72 29 3b 0a 2a 2a 20  rEof(pIter);.** 
26f0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
2700: 72 4e 65 78 74 28 70 49 74 65 72 29 0a 2a 2a 20  rNext(pIter).** 
2710: 29 7b 0a 2a 2a 20 20 20 69 36 34 20 69 52 6f 77  ){.**   i64 iRow
2720: 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  id = sqlite3Fts5
2730: 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
2740: 3b 0a 2a 2a 20 7d 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ;.** }.*/../*.**
2750: 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72   Open a new iter
2760: 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  ator to iterate 
2770: 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69 64  though all rowid
2780: 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  s that match the
2790: 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74   .** specified t
27a0: 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
27b0: 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  efix..*/.int sql
27c0: 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
27d0: 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ry(.  Fts5Index 
27e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
27f0: 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
2800: 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  ex to query */. 
2810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
2820: 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  ken, int nToken,
2830: 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72   /* Token (or pr
2840: 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66  efix) to query f
2850: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  or */.  int flag
2860: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2870: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2880: 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  of FTS5INDEX_QUE
2890: 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RY_X flags */.  
28a0: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a  Fts5IndexIter **
28b0: 70 70 49 74 65 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  ppIter.);../*.**
28c0: 20 54 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65   The various ope
28d0: 72 61 74 69 6f 6e 73 20 6f 6e 20 6f 70 65 6e 20  rations on open 
28e0: 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
28f0: 72 65 66 69 78 20 69 74 65 72 61 74 6f 72 73 20  refix iterators 
2900: 6f 70 65 6e 65 64 0a 2a 2a 20 75 73 69 6e 67 20  opened.** using 
2910: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2920: 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20  Query()..*/.int 
2930: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
2940: 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  of(Fts5IndexIter
2950: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  *);.int sqlite3F
2960: 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
2970: 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74  IndexIter*);.int
2980: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2990: 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64  NextFrom(Fts5Ind
29a0: 65 78 49 74 65 72 2a 2c 20 69 36 34 20 69 4d 61  exIter*, i64 iMa
29b0: 74 63 68 29 3b 0a 69 36 34 20 73 71 6c 69 74 65  tch);.i64 sqlite
29c0: 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 46  3Fts5IterRowid(F
29d0: 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a  ts5IndexIter*);.
29e0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
29f0: 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49  terPoslist(Fts5I
2a00: 6e 64 65 78 49 74 65 72 2a 2c 20 63 6f 6e 73 74  ndexIter*, const
2a10: 20 75 38 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70   u8 **pp, int *p
2a20: 6e 2c 20 69 36 34 20 2a 70 69 29 3b 0a 69 6e 74  n, i64 *pi);.int
2a30: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2a40: 50 6f 73 6c 69 73 74 42 75 66 66 65 72 28 46 74  PoslistBuffer(Ft
2a50: 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
2a60: 65 72 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  er, Fts5Buffer *
2a70: 70 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c  pBuf);../*.** Cl
2a80: 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ose an iterator 
2a90: 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65  opened by sqlite
2aa0: 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
2ab0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
2ac0: 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
2ad0: 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b  Fts5IndexIter*);
2ae0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ../*.** This int
2af0: 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20 62  erface is used b
2b00: 79 20 74 68 65 20 66 74 73 35 76 6f 63 61 62 20  y the fts5vocab 
2b10: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  module..*/.const
2b20: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74   char *sqlite3Ft
2b30: 73 35 49 74 65 72 54 65 72 6d 28 46 74 73 35 49  s5IterTerm(Fts5I
2b40: 6e 64 65 78 49 74 65 72 2a 2c 20 69 6e 74 2a 29  ndexIter*, int*)
2b50: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
2b60: 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74  5IterNextScan(Ft
2b70: 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a  s5IndexIter*);..
2b80: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
2b90: 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20   remove data to 
2ba0: 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  or from the inde
2bb0: 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 64  x. Each time a d
2bc0: 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61  ocument is .** a
2bd0: 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76  dded to or remov
2be0: 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ed from the inde
2bf0: 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  x, this function
2c00: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f   is called one o
2c10: 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e  r more.** times.
2c20: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
2c30: 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sert, it must be
2c40: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
2c50: 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
2c60: 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e  he new document.
2c70: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61  .** If the opera
2c80: 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65  tion is a delete
2c90: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
2ca0: 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f  led (at least) o
2cb0: 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  nce for each.** 
2cc0: 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20  unique token in 
2cd0: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
2ce0: 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20  h an iCol value 
2cf0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20  less than zero. 
2d00: 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75  The iPos.** argu
2d10: 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20  ment is ignored 
2d20: 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f  for a delete..*/
2d30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2d40: 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74  IndexWrite(.  Ft
2d50: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d70: 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20   Index to write 
2d80: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  to */.  int iCol
2d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2da0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
2db0: 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20  n token appears 
2dc0: 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74  in (-ve -> delet
2dd0: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73  e) */.  int iPos
2de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2df0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
2e00: 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  ion of token wit
2e10: 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  hin column */.  
2e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
2e30: 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20  en, int nToken  
2e40: 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20  /* Token to add 
2e50: 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20  or remove to or 
2e60: 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b  from index */.);
2e70: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
2e80: 20 74 68 61 74 20 73 75 62 73 65 71 75 65 6e 74   that subsequent
2e90: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2ea0: 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
2eb0: 29 20 70 65 72 74 61 69 6e 20 74 6f 0a 2a 2a 20  ) pertain to.** 
2ec0: 64 6f 63 75 6d 65 6e 74 20 69 44 6f 63 69 64 2e  document iDocid.
2ed0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2ee0: 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69  ts5IndexBeginWri
2ef0: 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  te(.  Fts5Index 
2f00: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2f10: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
2f20: 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
2f30: 69 36 34 20 69 44 6f 63 69 64 20 20 20 20 20 20  i64 iDocid      
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 2f 2a 20 44 6f 63 69 64 20 74 6f 20 61 64 64 20  /* Docid to add 
2f60: 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20 66  or remove data f
2f70: 72 6f 6d 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  rom */.);../*.**
2f80: 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
2f90: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
2fa0: 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
2fb0: 6c 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  les to the datab
2fc0: 61 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62  ase..** If the b
2fd0: 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  Commit flag is t
2fe0: 72 75 65 2c 20 61 6c 73 6f 20 63 6c 6f 73 65 20  rue, also close 
2ff0: 61 6e 79 20 6f 70 65 6e 20 62 6c 6f 62 20 68 61  any open blob ha
3000: 6e 64 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ndles..*/.int sq
3010: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79  lite3Fts5IndexSy
3020: 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  nc(Fts5Index *p,
3030: 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 3b 0a 0a   int bCommit);..
3040: 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e  /*.** Discard an
3050: 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
3060: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
3070: 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e  ash tables. Do n
3080: 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74  ot write it.** t
3090: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
30a0: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73  Additionally, as
30b0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f  sume that the co
30c0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f  ntents of the %_
30d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61  data.** table ma
30e0: 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f  y have changed o
30f0: 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69  n disk. So any i
3100: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20  n-memory caches 
3110: 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65  of %_data .** re
3120: 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e  cords must be in
3130: 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e  validated..*/.in
3140: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
3150: 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49  exRollback(Fts5I
3160: 6e 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a  ndex *p);../*.**
3170: 20 52 65 74 72 69 65 76 65 20 61 6e 64 20 63 6c   Retrieve and cl
3180: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
3190: 65 72 72 6f 72 20 63 6f 64 65 2c 20 72 65 73 70  error code, resp
31a0: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 69 6e 74  ectively..*/.int
31b0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
31c0: 78 45 72 72 63 6f 64 65 28 46 74 73 35 49 6e 64  xErrcode(Fts5Ind
31d0: 65 78 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  ex*);.void sqlit
31e0: 65 33 46 74 73 35 49 6e 64 65 78 52 65 73 65 74  e3Fts5IndexReset
31f0: 28 46 74 73 35 49 6e 64 65 78 2a 29 3b 0a 0a 2f  (Fts5Index*);../
3200: 2a 0a 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20  *.** Get or set 
3210: 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
3220: 65 63 6f 72 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ecord..*/.int sq
3230: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 47 65  lite3Fts5IndexGe
3240: 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e  tAverages(Fts5In
3250: 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66 66  dex *p, Fts5Buff
3260: 65 72 20 2a 70 42 75 66 29 3b 0a 69 6e 74 20 73  er *pBuf);.int s
3270: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
3280: 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
3290: 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75  ndex *p, const u
32a0: 38 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  8*, int);../*.**
32b0: 20 46 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 65   Functions calle
32c0: 64 20 62 79 20 74 68 65 20 73 74 6f 72 61 67 65  d by the storage
32d0: 20 6d 6f 64 75 6c 65 20 61 73 20 70 61 72 74 20   module as part 
32e0: 6f 66 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  of integrity-che
32f0: 63 6b 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  ck..*/.u64 sqlit
3300: 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d  e3Fts5IndexCksum
3310: 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 69 36 34  (Fts5Config*,i64
3320: 2c 69 6e 74 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  ,int,int,const c
3330: 68 61 72 2a 2c 69 6e 74 29 3b 0a 69 6e 74 20 73  har*,int);.int s
3340: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
3350: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74  ntegrityCheck(Ft
3360: 73 35 49 6e 64 65 78 2a 2c 20 75 36 34 20 63 6b  s5Index*, u64 ck
3370: 73 75 6d 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 61  sum);../* .** Ca
3380: 6c 6c 65 64 20 64 75 72 69 6e 67 20 76 69 72 74  lled during virt
3390: 75 61 6c 20 6d 6f 64 75 6c 65 20 69 6e 69 74 69  ual module initi
33a0: 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 20 72 65 67  alization to reg
33b0: 69 73 74 65 72 20 55 44 46 20 0a 2a 2a 20 66 74  ister UDF .** ft
33c0: 73 35 5f 64 65 63 6f 64 65 28 29 20 77 69 74 68  s5_decode() with
33d0: 20 53 51 4c 69 74 65 20 0a 2a 2f 0a 69 6e 74 20   SQLite .*/.int 
33e0: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
33f0: 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
3400: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3410: 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46  IndexSetCookie(F
3420: 74 73 35 49 6e 64 65 78 2a 2c 20 69 6e 74 29 3b  ts5Index*, int);
3430: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3440: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
3450: 6f 66 20 65 6e 74 72 69 65 73 20 72 65 61 64 20  of entries read 
3460: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
3470: 74 61 62 6c 65 20 62 79 20 0a 2a 2a 20 74 68 69  table by .** thi
3480: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  s connection sin
3490: 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65  ce it was create
34a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
34b0: 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28  3Fts5IndexReads(
34c0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a 0a  Fts5Index *p);..
34d0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
34e0: 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49  ndexReinit(Fts5I
34f0: 6e 64 65 78 20 2a 70 29 3b 0a 69 6e 74 20 73 71  ndex *p);.int sq
3500: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
3510: 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78  timize(Fts5Index
3520: 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *p);.int sqlite
3530: 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28  3Fts5IndexMerge(
3540: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
3550: 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 69 6e 74 20  t nMerge);..int 
3560: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
3570: 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
3580: 6e 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a  ndex *p);../*.**
3590: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
35a0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
35b0: 35 5f 69 6e 64 65 78 2e 63 2e 0a 2a 2a 2a 2a 2a  5_index.c..*****
35c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3600: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
3610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3650: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
3660: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
3670: 5f 76 61 72 69 6e 74 2e 63 2e 20 0a 2a 2f 0a 69  _varint.c. .*/.i
3680: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  nt sqlite3Fts5Ge
3690: 74 56 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20  tVarint32(const 
36a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
36b0: 2c 20 75 33 32 20 2a 76 29 3b 0a 69 6e 74 20 73  , u32 *v);.int s
36c0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
36d0: 69 6e 74 4c 65 6e 28 75 33 32 20 69 56 61 6c 29  intLen(u32 iVal)
36e0: 3b 0a 75 38 20 73 71 6c 69 74 65 33 46 74 73 35  ;.u8 sqlite3Fts5
36f0: 47 65 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 20  GetVarint(const 
3700: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20  unsigned char*, 
3710: 75 36 34 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  u64*);.int sqlit
3720: 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
3730: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
3740: 2c 20 75 36 34 20 76 29 3b 0a 0a 23 64 65 66 69  , u64 v);..#defi
3750: 6e 65 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  ne fts5GetVarint
3760: 33 32 28 61 2c 62 29 20 73 71 6c 69 74 65 33 46  32(a,b) sqlite3F
3770: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61  ts5GetVarint32(a
3780: 2c 28 75 33 32 2a 29 26 62 29 0a 23 64 65 66 69  ,(u32*)&b).#defi
3790: 6e 65 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  ne fts5GetVarint
37a0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 47      sqlite3Fts5G
37b0: 65 74 56 61 72 69 6e 74 0a 0a 2f 2a 0a 2a 2a 20  etVarint../*.** 
37c0: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
37d0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
37e0: 5f 76 61 72 69 6e 74 2e 63 2e 0a 2a 2a 2a 2a 2a  _varint.c..*****
37f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3830: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
3840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3880: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
3890: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
38a0: 35 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71  5.c. .*/..int sq
38b0: 6c 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b 65  lite3Fts5GetToke
38c0: 6e 69 7a 65 72 28 0a 20 20 46 74 73 35 47 6c 6f  nizer(.  Fts5Glo
38d0: 62 61 6c 2a 2c 20 0a 20 20 63 6f 6e 73 74 20 63  bal*, .  const c
38e0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69  har **azArg,.  i
38f0: 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74 73 35 54  nt nArg,.  Fts5T
3900: 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a 20 20 66 74  okenizer**,.  ft
3910: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a  s5_tokenizer**,.
3920: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
3930: 3b 0a 0a 46 74 73 35 49 6e 64 65 78 20 2a 73 71  ;..Fts5Index *sq
3940: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 46 72  lite3Fts5IndexFr
3950: 6f 6d 43 73 72 69 64 28 46 74 73 35 47 6c 6f 62  omCsrid(Fts5Glob
3960: 61 6c 2a 2c 20 69 36 34 2c 20 69 6e 74 2a 29 3b  al*, i64, int*);
3970: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
3980: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
3990: 20 69 6e 20 66 74 73 35 2e 63 2e 0a 2a 2a 2a 2a   in fts5.c..****
39a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39e0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
39f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a30: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
3a40: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
3a50: 35 5f 68 61 73 68 2e 63 2e 20 0a 2a 2f 0a 74 79  5_hash.c. .*/.ty
3a60: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
3a70: 35 48 61 73 68 20 46 74 73 35 48 61 73 68 3b 0a  5Hash Fts5Hash;.
3a80: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3a90: 68 61 73 68 20 74 61 62 6c 65 2c 20 66 72 65 65  hash table, free
3aa0: 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a   a hash table..*
3ab0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3ac0: 35 48 61 73 68 4e 65 77 28 46 74 73 35 48 61 73  5HashNew(Fts5Has
3ad0: 68 2a 2a 2c 20 69 6e 74 20 2a 70 6e 53 69 7a 65  h**, int *pnSize
3ae0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
3af0: 74 73 35 48 61 73 68 46 72 65 65 28 46 74 73 35  ts5HashFree(Fts5
3b00: 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  Hash*);..int sql
3b10: 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
3b20: 65 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 0a  e(.  Fts5Hash*,.
3b30: 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
3b60: 68 69 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  his entry */.  i
3b70: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b90: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
3ba0: 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
3bb0: 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
3bc0: 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3be0: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
3bf0: 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
3c00: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 62 42 79 74  n */.  char bByt
3c10: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
3c20: 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
3c30: 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
3c40: 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
3c50: 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
3c60: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70  */.);../*.** Emp
3c70: 74 79 20 28 62 75 74 20 64 6f 20 6e 6f 74 20 64  ty (but do not d
3c80: 65 6c 65 74 65 29 20 61 20 68 61 73 68 20 74 61  elete) a hash ta
3c90: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
3ca0: 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
3cb0: 72 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 0a 69  r(Fts5Hash*);..i
3cc0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  nt sqlite3Fts5Ha
3cd0: 73 68 51 75 65 72 79 28 0a 20 20 46 74 73 35 48  shQuery(.  Fts5H
3ce0: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
3cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3d00: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
3d10: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
3d20: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
3d30: 65 72 6d 2c 20 20 20 2f 2a 20 51 75 65 72 79 20  erm,   /* Query 
3d40: 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
3d50: 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20  u8 **ppDoclist, 
3d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3d70: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  : Pointer to doc
3d80: 6c 69 73 74 20 66 6f 72 20 70 54 65 72 6d 20 2a  list for pTerm *
3d90: 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69  /.  int *pnDocli
3da0: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
3db0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
3dc0: 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
3dd0: 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a 69 6e 74 20  ytes */.);..int 
3de0: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
3df0: 63 61 6e 49 6e 69 74 28 0a 20 20 46 74 73 35 48  canInit(.  Fts5H
3e00: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
3e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3e20: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
3e30: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
3e40: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
3e50: 65 72 6d 20 20 20 20 2f 2a 20 51 75 65 72 79 20  erm    /* Query 
3e60: 70 72 65 66 69 78 20 2a 2f 0a 29 3b 0a 76 6f 69  prefix */.);.voi
3e70: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
3e80: 68 53 63 61 6e 4e 65 78 74 28 46 74 73 35 48 61  hScanNext(Fts5Ha
3e90: 73 68 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  sh*);.int sqlite
3ea0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
3eb0: 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 76 6f 69  (Fts5Hash*);.voi
3ec0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
3ed0: 68 53 63 61 6e 45 6e 74 72 79 28 46 74 73 35 48  hScanEntry(Fts5H
3ee0: 61 73 68 20 2a 2c 0a 20 20 63 6f 6e 73 74 20 63  ash *,.  const c
3ef0: 68 61 72 20 2a 2a 70 7a 54 65 72 6d 2c 20 20 20  har **pzTerm,   
3f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
3f10: 20 74 65 72 6d 20 28 6e 75 6c 2d 74 65 72 6d 69   term (nul-termi
3f20: 6e 61 74 65 64 29 20 2a 2f 0a 20 20 63 6f 6e 73  nated) */.  cons
3f30: 74 20 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74  t u8 **ppDoclist
3f40: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
3f50: 55 54 3a 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  UT: pointer to d
3f60: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
3f70: 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20  *pnDoclist      
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3f90: 55 54 3a 20 73 69 7a 65 20 6f 66 20 64 6f 63 6c  UT: size of docl
3fa0: 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
3fb0: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  );.../*.** End o
3fc0: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
3fd0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61 73 68  ode in fts5_hash
3fe0: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
3ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4030: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
4080: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
4090: 65 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67  e in fts5_storag
40a0: 65 2e 63 2e 20 66 74 73 35 5f 73 74 6f 72 61 67  e.c. fts5_storag
40b0: 65 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e  e.c contains con
40c0: 74 61 69 6e 73 20 0a 2a 2a 20 63 6f 64 65 20 74  tains .** code t
40d0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
40e0: 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
40f0: 25 5f 63 6f 6e 74 65 6e 74 20 61 6e 64 20 25 5f  %_content and %_
4100: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 73 2e 0a  docsize tables..
4110: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
4120: 5f 53 54 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20  _STMT_SCAN_ASC  
4130: 30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  0     /* SELECT 
4140: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
4150: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 41 53 43  . ORDER BY 1 ASC
4160: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
4170: 5f 53 54 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20  _STMT_SCAN_DESC 
4180: 31 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  1     /* SELECT 
4190: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
41a0: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 44 45 53  . ORDER BY 1 DES
41b0: 43 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  C */.#define FTS
41c0: 35 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20  5_STMT_LOOKUP   
41d0: 20 32 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54   2     /* SELECT
41e0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e   rowid, * FROM .
41f0: 2e 2e 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f  .. WHERE rowid=?
4200: 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
4210: 75 63 74 20 46 74 73 35 53 74 6f 72 61 67 65 20  uct Fts5Storage 
4220: 46 74 73 35 53 74 6f 72 61 67 65 3b 0a 0a 69 6e  Fts5Storage;..in
4230: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
4240: 72 61 67 65 4f 70 65 6e 28 46 74 73 35 43 6f 6e  rageOpen(Fts5Con
4250: 66 69 67 2a 2c 20 46 74 73 35 49 6e 64 65 78 2a  fig*, Fts5Index*
4260: 2c 20 69 6e 74 2c 20 46 74 73 35 53 74 6f 72 61  , int, Fts5Stora
4270: 67 65 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69  ge**, char**);.i
4280: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4290: 6f 72 61 67 65 43 6c 6f 73 65 28 46 74 73 35 53  orageClose(Fts5S
42a0: 74 6f 72 61 67 65 20 2a 70 29 3b 0a 69 6e 74 20  torage *p);.int 
42b0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
42c0: 67 65 52 65 6e 61 6d 65 28 46 74 73 35 53 74 6f  geRename(Fts5Sto
42d0: 72 61 67 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  rage*, const cha
42e0: 72 20 2a 7a 4e 61 6d 65 29 3b 0a 0a 69 6e 74 20  r *zName);..int 
42f0: 73 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70 41  sqlite3Fts5DropA
4300: 6c 6c 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b  ll(Fts5Config*);
4310: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4320: 43 72 65 61 74 65 54 61 62 6c 65 28 46 74 73 35  CreateTable(Fts5
4330: 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63  Config*, const c
4340: 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  har*, const char
4350: 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2a 29  *, int, char **)
4360: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
4370: 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 28  s5StorageDelete(
4380: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4390: 69 36 34 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  i64);.int sqlite
43a0: 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65  3Fts5StorageInse
43b0: 72 74 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  rt(Fts5Storage *
43c0: 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  p, sqlite3_value
43d0: 20 2a 2a 61 70 56 61 6c 2c 20 69 6e 74 2c 20 69   **apVal, int, i
43e0: 36 34 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  64*);..int sqlit
43f0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74  e3Fts5StorageInt
4400: 65 67 72 69 74 79 28 46 74 73 35 53 74 6f 72 61  egrity(Fts5Stora
4410: 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c  ge *p);..int sql
4420: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
4430: 74 6d 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  tmt(Fts5Storage 
4440: 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20 73  *p, int eStmt, s
4450: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2a 2c 20 63  qlite3_stmt**, c
4460: 68 61 72 2a 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  har**);.void sql
4470: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
4480: 74 6d 74 52 65 6c 65 61 73 65 28 46 74 73 35 53  tmtRelease(Fts5S
4490: 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 65  torage *p, int e
44a0: 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73 74  Stmt, sqlite3_st
44b0: 6d 74 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  mt*);..int sqlit
44c0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 6f 63  e3Fts5StorageDoc
44d0: 73 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65  size(Fts5Storage
44e0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
44f0: 20 69 6e 74 20 2a 61 43 6f 6c 29 3b 0a 69 6e 74   int *aCol);.int
4500: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
4510: 61 67 65 53 69 7a 65 28 46 74 73 35 53 74 6f 72  ageSize(Fts5Stor
4520: 61 67 65 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  age *p, int iCol
4530: 2c 20 69 36 34 20 2a 70 6e 41 76 67 29 3b 0a 69  , i64 *pnAvg);.i
4540: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4550: 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28 46 74  orageRowCount(Ft
4560: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36  s5Storage *p, i6
4570: 34 20 2a 70 6e 52 6f 77 29 3b 0a 0a 69 6e 74 20  4 *pnRow);..int 
4580: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4590: 67 65 53 79 6e 63 28 46 74 73 35 53 74 6f 72 61  geSync(Fts5Stora
45a0: 67 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d  ge *p, int bComm
45b0: 69 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  it);.int sqlite3
45c0: 46 74 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c 62  Fts5StorageRollb
45d0: 61 63 6b 28 46 74 73 35 53 74 6f 72 61 67 65 20  ack(Fts5Storage 
45e0: 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  *p);..int sqlite
45f0: 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 66  3Fts5StorageConf
4600: 69 67 56 61 6c 75 65 28 0a 20 20 20 20 46 74 73  igValue(.    Fts
4610: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 63 6f 6e  5Storage *p, con
4620: 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65  st char*, sqlite
4630: 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 0a 29 3b  3_value*, int.);
4640: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
4650: 35 53 74 6f 72 61 67 65 53 70 65 63 69 61 6c 44  5StorageSpecialD
4660: 65 6c 65 74 65 28 46 74 73 35 53 74 6f 72 61 67  elete(Fts5Storag
4670: 65 20 2a 70 2c 20 69 36 34 20 69 44 65 6c 2c 20  e *p, i64 iDel, 
4680: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
4690: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
46a0: 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 41  s5StorageDeleteA
46b0: 6c 6c 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ll(Fts5Storage *
46c0: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
46d0: 74 73 35 53 74 6f 72 61 67 65 52 65 62 75 69 6c  ts5StorageRebuil
46e0: 64 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  d(Fts5Storage *p
46f0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4700: 73 35 53 74 6f 72 61 67 65 4f 70 74 69 6d 69 7a  s5StorageOptimiz
4710: 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  e(Fts5Storage *p
4720: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4730: 73 35 53 74 6f 72 61 67 65 4d 65 72 67 65 28 46  s5StorageMerge(F
4740: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
4750: 6e 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 2f 2a 0a  nt nMerge);../*.
4760: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
4770: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
4780: 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 0a 2a  ts5_storage.c..*
4790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
47e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
47f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4820: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
4830: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
4840: 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 20 0a 2a   fts5_expr.c. .*
4850: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
4860: 20 46 74 73 35 45 78 70 72 20 46 74 73 35 45 78   Fts5Expr Fts5Ex
4870: 70 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  pr;.typedef stru
4880: 63 74 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  ct Fts5ExprNode 
4890: 46 74 73 35 45 78 70 72 4e 6f 64 65 3b 0a 74 79  Fts5ExprNode;.ty
48a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
48b0: 35 50 61 72 73 65 20 46 74 73 35 50 61 72 73 65  5Parse Fts5Parse
48c0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
48d0: 20 46 74 73 35 54 6f 6b 65 6e 20 46 74 73 35 54   Fts5Token Fts5T
48e0: 6f 6b 65 6e 3b 0a 74 79 70 65 64 65 66 20 73 74  oken;.typedef st
48f0: 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68 72  ruct Fts5ExprPhr
4900: 61 73 65 20 46 74 73 35 45 78 70 72 50 68 72 61  ase Fts5ExprPhra
4910: 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  se;.typedef stru
4920: 63 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  ct Fts5ExprNears
4930: 65 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  et Fts5ExprNears
4940: 65 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  et;.typedef stru
4950: 63 74 20 46 74 73 35 45 78 70 72 43 6f 6c 73 65  ct Fts5ExprColse
4960: 74 20 46 74 73 35 45 78 70 72 43 6f 6c 73 65 74  t Fts5ExprColset
4970: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 54 6f  ;..struct Fts5To
4980: 6b 65 6e 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ken {.  const ch
4990: 61 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ar *p;          
49a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e          /* Token
49b0: 20 74 65 78 74 20 28 6e 6f 74 20 4e 55 4c 4c 20   text (not NULL 
49c0: 74 65 72 6d 69 6e 61 74 65 64 29 20 2a 2f 0a 20  terminated) */. 
49d0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49f0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
4a00: 65 72 20 70 20 69 6e 20 62 79 74 65 73 20 2a 2f  er p in bytes */
4a10: 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20  .};../* Parse a 
4a20: 4d 41 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e  MATCH expression
4a30: 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  . */.int sqlite3
4a40: 46 74 73 35 45 78 70 72 4e 65 77 28 0a 20 20 46  Fts5ExprNew(.  F
4a50: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
4a60: 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  ig, .  const cha
4a70: 72 20 2a 7a 45 78 70 72 2c 0a 20 20 46 74 73 35  r *zExpr,.  Fts5
4a80: 45 78 70 72 20 2a 2a 70 70 4e 65 77 2c 20 0a 20  Expr **ppNew, . 
4a90: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 3b   char **pzErr.);
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28 72 63 20 3d  ../*.** for(rc =
4ab0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
4ac0: 46 69 72 73 74 28 70 45 78 70 72 2c 20 70 49 64  First(pExpr, pId
4ad0: 78 2c 20 62 44 65 73 63 29 3b 0a 2a 2a 20 20 20  x, bDesc);.**   
4ae0: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
4af0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
4b00: 35 45 78 70 72 45 6f 66 28 70 45 78 70 72 29 3b  5ExprEof(pExpr);
4b10: 0a 2a 2a 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .**     rc = sql
4b20: 69 74 65 33 46 74 73 35 45 78 70 72 4e 65 78 74  ite3Fts5ExprNext
4b30: 28 70 45 78 70 72 29 0a 2a 2a 20 29 7b 0a 2a 2a  (pExpr).** ){.**
4b40: 20 20 20 2f 2f 20 54 68 65 20 64 6f 63 75 6d 65     // The docume
4b50: 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69 52  nt with rowid iR
4b60: 6f 77 69 64 20 6d 61 74 63 68 65 73 20 74 68 65  owid matches the
4b70: 20 65 78 70 72 65 73 73 69 6f 6e 21 0a 2a 2a 20   expression!.** 
4b80: 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73    i64 iRowid = s
4b90: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 52 6f  qlite3Fts5ExprRo
4ba0: 77 69 64 28 70 45 78 70 72 29 3b 0a 2a 2a 20 7d  wid(pExpr);.** }
4bb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
4bc0: 74 73 35 45 78 70 72 46 69 72 73 74 28 46 74 73  ts5ExprFirst(Fts
4bd0: 35 45 78 70 72 2a 2c 20 46 74 73 35 49 6e 64 65  5Expr*, Fts5Inde
4be0: 78 20 2a 70 49 64 78 2c 20 69 36 34 20 69 4d 69  x *pIdx, i64 iMi
4bf0: 6e 2c 20 69 6e 74 20 62 44 65 73 63 29 3b 0a 69  n, int bDesc);.i
4c00: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
4c10: 70 72 4e 65 78 74 28 46 74 73 35 45 78 70 72 2a  prNext(Fts5Expr*
4c20: 2c 20 69 36 34 20 69 4d 61 78 29 3b 0a 69 6e 74  , i64 iMax);.int
4c30: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
4c40: 45 6f 66 28 46 74 73 35 45 78 70 72 2a 29 3b 0a  Eof(Fts5Expr*);.
4c50: 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 45  i64 sqlite3Fts5E
4c60: 78 70 72 52 6f 77 69 64 28 46 74 73 35 45 78 70  xprRowid(Fts5Exp
4c70: 72 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74  r*);..void sqlit
4c80: 65 33 46 74 73 35 45 78 70 72 46 72 65 65 28 46  e3Fts5ExprFree(F
4c90: 74 73 35 45 78 70 72 2a 29 3b 0a 0a 2f 2a 20 43  ts5Expr*);../* C
4ca0: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 73 74 61  alled during sta
4cb0: 72 74 75 70 20 74 6f 20 72 65 67 69 73 74 65 72  rtup to register
4cc0: 20 61 20 55 44 46 20 77 69 74 68 20 53 51 4c 69   a UDF with SQLi
4cd0: 74 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  te */.int sqlite
4ce0: 33 46 74 73 35 45 78 70 72 49 6e 69 74 28 46 74  3Fts5ExprInit(Ft
4cf0: 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74  s5Global*, sqlit
4d00: 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  e3*);..int sqlit
4d10: 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65  e3Fts5ExprPhrase
4d20: 43 6f 75 6e 74 28 46 74 73 35 45 78 70 72 2a 29  Count(Fts5Expr*)
4d30: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4d40: 35 45 78 70 72 50 68 72 61 73 65 53 69 7a 65 28  5ExprPhraseSize(
4d50: 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 20 69  Fts5Expr*, int i
4d60: 50 68 72 61 73 65 29 3b 0a 69 6e 74 20 73 71 6c  Phrase);.int sql
4d70: 69 74 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c  ite3Fts5ExprPosl
4d80: 69 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20 69  ist(Fts5Expr*, i
4d90: 6e 74 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 29  nt, const u8 **)
4da0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
4db0: 73 35 45 78 70 72 50 68 72 61 73 65 45 78 70 72  s5ExprPhraseExpr
4dc0: 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46 74  (Fts5Config*, Ft
4dd0: 73 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20 46 74  s5Expr*, int, Ft
4de0: 73 35 45 78 70 72 2a 2a 29 3b 0a 0a 2f 2a 2a 2a  s5Expr**);../***
4df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e10: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
4e20: 66 74 73 35 5f 65 78 70 72 2e 63 20 41 50 49 20  fts5_expr.c API 
4e30: 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74  above this point
4e40: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
4e50: 6f 74 68 65 72 20 68 61 6e 64 2d 77 72 69 74 74  other hand-writt
4e60: 65 6e 0a 2a 2a 20 43 20 63 6f 64 65 20 69 6e 20  en.** C code in 
4e70: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 20 54 68 65  this module. The
4e80: 20 69 6e 74 65 72 66 61 63 65 73 20 62 65 6c 6f   interfaces belo
4e90: 77 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65  w this point are
4ea0: 20 63 61 6c 6c 65 64 20 62 79 0a 2a 2a 20 74 68   called by.** th
4eb0: 65 20 70 61 72 73 65 72 20 63 6f 64 65 20 69 6e  e parser code in
4ec0: 20 66 74 73 35 70 61 72 73 65 2e 79 2e 20 20 2a   fts5parse.y.  *
4ed0: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  /..void sqlite3F
4ee0: 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 46 74  ts5ParseError(Ft
4ef0: 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s5Parse *pParse,
4f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
4f10: 74 2c 20 2e 2e 2e 29 3b 0a 0a 46 74 73 35 45 78  t, ...);..Fts5Ex
4f20: 70 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65 33 46  prNode *sqlite3F
4f30: 74 73 35 50 61 72 73 65 4e 6f 64 65 28 0a 20 20  ts5ParseNode(.  
4f40: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
4f50: 65 2c 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 0a  e,.  int eType,.
4f60: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
4f70: 70 4c 65 66 74 2c 0a 20 20 46 74 73 35 45 78 70  pLeft,.  Fts5Exp
4f80: 72 4e 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a 20  rNode *pRight,. 
4f90: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
4fa0: 20 2a 70 4e 65 61 72 0a 29 3b 0a 0a 46 74 73 35   *pNear.);..Fts5
4fb0: 45 78 70 72 50 68 72 61 73 65 20 2a 73 71 6c 69  ExprPhrase *sqli
4fc0: 74 65 33 46 74 73 35 50 61 72 73 65 54 65 72 6d  te3Fts5ParseTerm
4fd0: 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70  (.  Fts5Parse *p
4fe0: 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78  Parse, .  Fts5Ex
4ff0: 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
5000: 65 2c 20 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20  e, .  Fts5Token 
5010: 2a 70 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 62  *pToken,.  int b
5020: 50 72 65 66 69 78 0a 29 3b 0a 0a 46 74 73 35 45  Prefix.);..Fts5E
5030: 78 70 72 4e 65 61 72 73 65 74 20 2a 73 71 6c 69  xprNearset *sqli
5040: 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72  te3Fts5ParseNear
5050: 73 65 74 28 0a 20 20 46 74 73 35 50 61 72 73 65  set(.  Fts5Parse
5060: 2a 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e 65  *, .  Fts5ExprNe
5070: 61 72 73 65 74 2a 2c 0a 20 20 46 74 73 35 45 78  arset*,.  Fts5Ex
5080: 70 72 50 68 72 61 73 65 2a 20 0a 29 3b 0a 0a 46  prPhrase* .);..F
5090: 74 73 35 45 78 70 72 43 6f 6c 73 65 74 20 2a 73  ts5ExprColset *s
50a0: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43  qlite3Fts5ParseC
50b0: 6f 6c 73 65 74 28 0a 20 20 46 74 73 35 50 61 72  olset(.  Fts5Par
50c0: 73 65 2a 2c 20 0a 20 20 46 74 73 35 45 78 70 72  se*, .  Fts5Expr
50d0: 43 6f 6c 73 65 74 2a 2c 20 0a 20 20 46 74 73 35  Colset*, .  Fts5
50e0: 54 6f 6b 65 6e 20 2a 0a 29 3b 0a 0a 76 6f 69 64  Token *.);..void
50f0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
5100: 65 50 68 72 61 73 65 46 72 65 65 28 46 74 73 35  ePhraseFree(Fts5
5110: 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0a 76 6f  ExprPhrase*);.vo
5120: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
5130: 72 73 65 4e 65 61 72 73 65 74 46 72 65 65 28 46  rseNearsetFree(F
5140: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 29  ts5ExprNearset*)
5150: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
5160: 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
5170: 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 3b 0a  Fts5ExprNode*);.
5180: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
5190: 35 50 61 72 73 65 53 65 74 44 69 73 74 61 6e 63  5ParseSetDistanc
51a0: 65 28 46 74 73 35 50 61 72 73 65 2a 2c 20 46 74  e(Fts5Parse*, Ft
51b0: 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 20  s5ExprNearset*, 
51c0: 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a 76 6f 69  Fts5Token*);.voi
51d0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
51e0: 73 65 53 65 74 43 6f 6c 73 65 74 28 46 74 73 35  seSetColset(Fts5
51f0: 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78 70 72  Parse*, Fts5Expr
5200: 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35 45 78  Nearset*, Fts5Ex
5210: 70 72 43 6f 6c 73 65 74 2a 29 3b 0a 76 6f 69 64  prColset*);.void
5220: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
5230: 65 46 69 6e 69 73 68 65 64 28 46 74 73 35 50 61  eFinished(Fts5Pa
5240: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73  rse *pParse, Fts
5250: 35 45 78 70 72 4e 6f 64 65 20 2a 70 29 3b 0a 76  5ExprNode *p);.v
5260: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
5270: 61 72 73 65 4e 65 61 72 28 46 74 73 35 50 61 72  arseNear(Fts5Par
5280: 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35  se *pParse, Fts5
5290: 54 6f 6b 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  Token*);../*.** 
52a0: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
52b0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
52c0: 5f 65 78 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  _expr.c..*******
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 2f 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ***/..../*******
5320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5360: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
5370: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
5380: 5f 61 75 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74  _aux.c. .*/..int
5390: 20 73 71 6c 69 74 65 33 46 74 73 35 41 75 78 49   sqlite3Fts5AuxI
53a0: 6e 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a  nit(fts5_api*);.
53b0: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
53c0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
53d0: 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a  n fts5_aux.c..**
53e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
5430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5470: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
5480: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
5490: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e  ts5_tokenizer.c.
54a0: 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65   .*/..int sqlite
54b0: 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e  3Fts5TokenizerIn
54c0: 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f  it(fts5_api*);./
54d0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
54e0: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
54f0: 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e   fts5_tokenizer.
5500: 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c..*************
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
5550: 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49  ***********.** I
55a0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
55b0: 20 69 6e 20 66 74 73 35 5f 73 6f 72 74 65 72 2e   in fts5_sorter.
55c0: 63 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  c. .*/.typedef s
55d0: 74 72 75 63 74 20 46 74 73 35 53 6f 72 74 65 72  truct Fts5Sorter
55e0: 20 46 74 73 35 53 6f 72 74 65 72 3b 0a 0a 69 6e   Fts5Sorter;..in
55f0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 6f 72  t sqlite3Fts5Sor
5600: 74 65 72 4e 65 77 28 46 74 73 35 45 78 70 72 20  terNew(Fts5Expr 
5610: 2a 70 45 78 70 72 2c 20 46 74 73 35 53 6f 72 74  *pExpr, Fts5Sort
5620: 65 72 20 2a 2a 70 70 29 3b 0a 0a 2f 2a 0a 2a 2a  er **pp);../*.**
5630: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
5640: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
5650: 35 5f 73 6f 72 74 65 72 2e 63 2e 0a 2a 2a 2a 2a  5_sorter.c..****
5660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
56b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56f0: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
5700: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
5710: 35 5f 76 6f 63 61 62 2e 63 2e 20 0a 2a 2f 0a 0a  5_vocab.c. .*/..
5720: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 56  int sqlite3Fts5V
5730: 6f 63 61 62 49 6e 69 74 28 46 74 73 35 47 6c 6f  ocabInit(Fts5Glo
5740: 62 61 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 29 3b  bal*, sqlite3*);
5750: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
5760: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
5770: 20 69 6e 20 66 74 73 35 5f 76 6f 63 61 62 2e 63   in fts5_vocab.c
5780: 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
57d0: 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49  ***********.** I
5820: 6e 74 65 72 66 61 63 65 20 74 6f 20 61 75 74 6f  nterface to auto
5830: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
5840: 74 65 64 20 63 6f 64 65 20 69 6e 20 66 74 73 35  ted code in fts5
5850: 5f 75 6e 69 63 6f 64 65 32 2e 63 2e 20 0a 2a 2f  _unicode2.c. .*/
5860: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
5870: 55 6e 69 63 6f 64 65 49 73 61 6c 6e 75 6d 28 69  UnicodeIsalnum(i
5880: 6e 74 20 63 29 3b 0a 69 6e 74 20 73 71 6c 69 74  nt c);.int sqlit
5890: 65 33 46 74 73 35 55 6e 69 63 6f 64 65 49 73 64  e3Fts5UnicodeIsd
58a0: 69 61 63 72 69 74 69 63 28 69 6e 74 20 63 29 3b  iacritic(int c);
58b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
58c0: 55 6e 69 63 6f 64 65 46 6f 6c 64 28 69 6e 74 20  UnicodeFold(int 
58d0: 63 2c 20 69 6e 74 20 62 52 65 6d 6f 76 65 44 69  c, int bRemoveDi
58e0: 61 63 72 69 74 69 63 29 3b 0a 2f 2a 0a 2a 2a 20  acritic);./*.** 
58f0: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
5900: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
5910: 5f 75 6e 69 63 6f 64 65 32 2e 63 2e 0a 2a 2a 2a  _unicode2.c..***
5920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5960: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66  *******/..#endif
5970: 0a                                               .