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

Artifact 313e3276ac9e0245ee722ef803253857a68722b9:


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 74 79 70 65 64  ts5Global;.typed
0810: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43 6f  ef struct Fts5Co
0820: 6c 73 65 74 20 46 74 73 35 43 6f 6c 73 65 74 3b  lset Fts5Colset;
0830: 0a 0a 2f 2a 20 49 66 20 61 20 4e 45 41 52 28 29  ../* If a NEAR()
0840: 20 63 6c 75 6d 70 20 6f 72 20 70 68 72 61 73 65   clump or phrase
0850: 20 6d 61 79 20 6f 6e 6c 79 20 6d 61 74 63 68 20   may only match 
0860: 61 20 73 70 65 63 69 66 69 63 20 73 65 74 20 6f  a specific set o
0870: 66 20 63 6f 6c 75 6d 6e 73 2c 20 0a 2a 2a 20 74  f columns, .** t
0880: 68 65 6e 20 61 6e 20 6f 62 6a 65 63 74 20 6f 66  hen an object of
0890: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
08a0: 79 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 72  ype is used to r
08b0: 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66  ecord the set of
08c0: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20 45 61 63   columns..** Eac
08d0: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 61  h entry in the a
08e0: 69 43 6f 6c 5b 5d 20 61 72 72 61 79 20 69 73 20  iCol[] array is 
08f0: 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61  a column that ma
0900: 79 20 62 65 20 6d 61 74 63 68 65 64 2e 0a 2a 2a  y be matched..**
0910: 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20  .** This object 
0920: 69 73 20 75 73 65 64 20 62 79 20 66 74 73 35 5f  is used by fts5_
0930: 65 78 70 72 2e 63 20 61 6e 64 20 66 74 73 35 5f  expr.c and fts5_
0940: 69 6e 64 65 78 2e 63 2e 0a 2a 2f 0a 73 74 72 75  index.c..*/.stru
0950: 63 74 20 46 74 73 35 43 6f 6c 73 65 74 20 7b 0a  ct Fts5Colset {.
0960: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e    int nCol;.  in
0970: 74 20 61 69 43 6f 6c 5b 31 5d 3b 0a 7d 3b 0a 0a  t aiCol[1];.};..
0980: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
09d0: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
09e0: 64 65 20 69 6e 20 66 74 73 35 5f 63 6f 6e 66 69  de in fts5_confi
09f0: 67 2e 63 2e 20 66 74 73 35 5f 63 6f 6e 66 69 67  g.c. fts5_config
0a00: 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74  .c contains cont
0a10: 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f 20  ains code.** to 
0a20: 70 61 72 73 65 20 74 68 65 20 61 72 67 75 6d 65  parse the argume
0a30: 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  nts passed to th
0a40: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
0a50: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
0a60: 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74  ..*/..typedef st
0a70: 72 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67 20  ruct Fts5Config 
0a80: 46 74 73 35 43 6f 6e 66 69 67 3b 0a 0a 2f 2a 0a  Fts5Config;../*.
0a90: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
0aa0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0ab0: 73 74 72 75 63 74 75 72 65 20 65 6e 63 6f 64 65  structure encode
0ac0: 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  s all informatio
0ad0: 6e 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65  n that can.** be
0ae0: 20 67 6c 65 61 6e 65 64 20 66 72 6f 6d 20 74 68   gleaned from th
0af0: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
0b00: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
0b10: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 64 20 61 6c 6c 20  ..**.** And all 
0b20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 6f 61 64  information load
0b30: 65 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f  ed from the %_co
0b40: 6e 66 69 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  nfig table..**.*
0b50: 2a 20 6e 41 75 74 6f 6d 65 72 67 65 3a 0a 2a 2a  * nAutomerge:.**
0b60: 20 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 6e     The minimum n
0b70: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
0b80: 73 20 74 68 61 74 20 61 6e 20 61 75 74 6f 2d 6d  s that an auto-m
0b90: 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 73  erge operation s
0ba0: 68 6f 75 6c 64 0a 2a 2a 20 20 20 61 74 74 65 6d  hould.**   attem
0bb0: 70 74 20 74 6f 20 6d 65 72 67 65 20 74 6f 67 65  pt to merge toge
0bc0: 74 68 65 72 2e 20 41 20 76 61 6c 75 65 20 6f 66  ther. A value of
0bd0: 20 31 20 73 65 74 73 20 74 68 65 20 6f 62 6a 65   1 sets the obje
0be0: 63 74 20 74 6f 20 75 73 65 20 74 68 65 20 0a 2a  ct to use the .*
0bf0: 2a 20 20 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  *   compile time
0c00: 20 64 65 66 61 75 6c 74 2e 20 5a 65 72 6f 20 64   default. Zero d
0c10: 69 73 61 62 6c 65 73 20 61 75 74 6f 2d 6d 65 72  isables auto-mer
0c20: 67 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a  ge altogether..*
0c30: 2a 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 3a 0a 2a  *.** zContent:.*
0c40: 2a 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 52 6f 77  *.** zContentRow
0c50: 69 64 3a 0a 2a 2a 20 20 20 54 68 65 20 76 61 6c  id:.**   The val
0c60: 75 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  ue of the conten
0c70: 74 5f 72 6f 77 69 64 3d 20 6f 70 74 69 6f 6e 2c  t_rowid= option,
0c80: 20 69 66 20 6f 6e 65 20 77 61 73 20 73 70 65 63   if one was spec
0c90: 69 66 69 65 64 2e 20 4f 72 20 0a 2a 2a 20 20 20  ified. Or .**   
0ca0: 74 68 65 20 73 74 72 69 6e 67 20 22 72 6f 77 69  the string "rowi
0cb0: 64 22 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  d" otherwise. Th
0cc0: 69 73 20 74 65 78 74 20 69 73 20 6e 6f 74 20 71  is text is not q
0cd0: 75 6f 74 65 64 20 2d 20 69 66 20 69 74 20 69 73  uoted - if it is
0ce0: 0a 2a 2a 20 20 20 75 73 65 64 20 61 73 20 70 61  .**   used as pa
0cf0: 72 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61  rt of an SQL sta
0d00: 74 65 6d 65 6e 74 20 69 74 20 6e 65 65 64 73 20  tement it needs 
0d10: 74 6f 20 62 65 20 71 75 6f 74 65 64 20 61 70 70  to be quoted app
0d20: 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  ropriately..**.*
0d30: 2a 20 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69  * zContentExprli
0d40: 73 74 3a 0a 2a 2a 0a 2a 2a 20 70 7a 45 72 72 6d  st:.**.** pzErrm
0d50: 73 67 3a 0a 2a 2a 20 20 20 54 68 69 73 20 65 78  sg:.**   This ex
0d60: 69 73 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ists in order to
0d70: 20 61 6c 6c 6f 77 20 74 68 65 20 66 74 73 35 5f   allow the fts5_
0d80: 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c 65 20 74  index.c module t
0d90: 6f 20 72 65 74 75 72 6e 20 61 20 0a 2a 2a 20 20  o return a .**  
0da0: 20 64 65 63 65 6e 74 20 65 72 72 6f 72 20 6d 65   decent error me
0db0: 73 73 61 67 65 20 69 66 20 69 74 20 65 6e 63 6f  ssage if it enco
0dc0: 75 6e 74 65 72 73 20 61 20 66 69 6c 65 2d 66 6f  unters a file-fo
0dd0: 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 69 74 20  rmat version it 
0de0: 64 6f 65 73 0a 2a 2a 20 20 20 6e 6f 74 20 75 6e  does.**   not un
0df0: 64 65 72 73 74 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20  derstand..**.** 
0e00: 62 43 6f 6c 75 6d 6e 73 69 7a 65 3a 0a 2a 2a 20  bColumnsize:.** 
0e10: 20 20 54 72 75 65 20 69 66 20 74 68 65 20 25 5f    True if the %_
0e20: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 69 73  docsize table is
0e30: 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
0e40: 62 50 72 65 66 69 78 49 6e 64 65 78 3a 0a 2a 2a  bPrefixIndex:.**
0e50: 20 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20     This is only 
0e60: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
0e70: 6e 67 2e 20 49 66 20 73 65 74 20 74 6f 20 66 61  ng. If set to fa
0e80: 6c 73 65 2c 20 61 6e 79 20 70 72 65 66 69 78 20  lse, any prefix 
0e90: 69 6e 64 65 78 65 73 0a 2a 2a 20 20 20 61 72 65  indexes.**   are
0ea0: 20 69 67 6e 6f 72 65 64 2e 20 54 68 69 73 20 76   ignored. This v
0eb0: 61 6c 75 65 20 69 73 20 63 6f 6e 66 69 67 75 72  alue is configur
0ec0: 65 64 20 75 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ed using:.**.** 
0ed0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0ee0: 4f 20 74 62 6c 28 74 62 6c 2c 20 72 61 6e 6b 29  O tbl(tbl, rank)
0ef0: 20 56 41 4c 55 45 53 28 27 70 72 65 66 69 78 2d   VALUES('prefix-
0f00: 69 6e 64 65 78 27 2c 20 24 62 50 72 65 66 69 78  index', $bPrefix
0f10: 49 6e 64 65 78 29 3b 0a 2a 2a 0a 2a 2f 0a 73 74  Index);.**.*/.st
0f20: 72 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67 20  ruct Fts5Config 
0f30: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
0f60: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72  handle */.  char
0f70: 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0f90: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
0fa0: 46 54 53 20 69 6e 64 65 78 20 28 65 2e 67 2e 20  FTS index (e.g. 
0fb0: 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 63 68 61  "main") */.  cha
0fc0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fe0: 4e 61 6d 65 20 6f 66 20 46 54 53 20 69 6e 64 65  Name of FTS inde
0ff0: 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  x */.  int nCol;
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1020: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
1030: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20   char **azCol;  
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1050: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73   /* Column names
1060: 20 2a 2f 0a 20 20 75 38 20 2a 61 62 55 6e 69 6e   */.  u8 *abUnin
1070: 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20 20  dexed;          
1080: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1090: 72 20 75 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75  r unindexed colu
10a0: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  mns */.  int nPr
10b0: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
10c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10d0: 65 72 20 6f 66 20 70 72 65 66 69 78 20 69 6e 64  er of prefix ind
10e0: 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  exes */.  int *a
10f0: 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
1100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1110: 65 73 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6e  es in bytes of n
1120: 50 72 65 66 69 78 20 70 72 65 66 69 78 20 69 6e  Prefix prefix in
1130: 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65  dexes */.  int e
1140: 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20  Content;        
1150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1160: 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 20 76 61   FTS5_CONTENT va
1170: 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  lue */.  char *z
1180: 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20  Content;        
1190: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
11a0: 65 6e 74 20 74 61 62 6c 65 20 2a 2f 20 0a 20 20  ent table */ .  
11b0: 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 52 6f  char *zContentRo
11c0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
11d0: 2f 2a 20 22 63 6f 6e 74 65 6e 74 5f 72 6f 77 69  /* "content_rowi
11e0: 64 3d 22 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65  d=" option value
11f0: 20 2a 2f 20 0a 20 20 69 6e 74 20 62 43 6f 6c 75   */ .  int bColu
1200: 6d 6e 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mnsize;         
1210: 20 20 20 20 20 20 20 2f 2a 20 22 63 6f 6c 75 6d         /* "colum
1220: 6e 73 69 7a 65 3d 22 20 6f 70 74 69 6f 6e 20 76  nsize=" option v
1230: 61 6c 75 65 20 28 64 66 6c 74 3d 3d 31 29 20 2a  alue (dflt==1) *
1240: 2f 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 3b  /.  int eDetail;
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 20 20 20 20 2f 2a 20 46 54 53 35 5f 44 45 54 41      /* FTS5_DETA
1270: 49 4c 5f 58 58 58 20 76 61 6c 75 65 20 2a 2f 0a  IL_XXX value */.
1280: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74    char *zContent
1290: 45 78 70 72 6c 69 73 74 3b 0a 20 20 46 74 73 35  Exprlist;.  Fts5
12a0: 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 3b  Tokenizer *pTok;
12b0: 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  .  fts5_tokenize
12c0: 72 20 2a 70 54 6f 6b 41 70 69 3b 0a 0a 20 20 2f  r *pTokApi;..  /
12d0: 2a 20 56 61 6c 75 65 73 20 6c 6f 61 64 65 64 20  * Values loaded 
12e0: 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 66 69  from the %_confi
12f0: 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  g table */.  int
1300: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1320: 49 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  Incremented when
1330: 20 25 5f 63 6f 6e 66 69 67 20 69 73 20 6d 6f 64   %_config is mod
1340: 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 70  ified */.  int p
1350: 67 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20  gsz;            
1360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
1370: 70 72 6f 78 69 6d 61 74 65 20 70 61 67 65 20 73  proximate page s
1380: 69 7a 65 20 75 73 65 64 20 69 6e 20 25 5f 64 61  ize used in %_da
1390: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 75 74  ta */.  int nAut
13a0: 6f 6d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20  omerge;         
13b0: 20 20 20 20 20 20 20 20 2f 2a 20 27 61 75 74 6f          /* 'auto
13c0: 6d 65 72 67 65 27 20 73 65 74 74 69 6e 67 20 2a  merge' setting *
13d0: 2f 0a 20 20 69 6e 74 20 6e 43 72 69 73 69 73 4d  /.  int nCrisisM
13e0: 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  erge;           
13f0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
1400: 6c 6c 6f 77 65 64 20 73 65 67 6d 65 6e 74 73 20  llowed segments 
1410: 70 65 72 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69  per level */.  i
1420: 6e 74 20 6e 48 61 73 68 53 69 7a 65 3b 20 20 20  nt nHashSize;   
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1440: 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  * Bytes of memor
1450: 79 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  y for in-memory 
1460: 68 61 73 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a  hash */.  char *
1470: 7a 52 61 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  zRank;          
1480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1490: 65 20 6f 66 20 72 61 6e 6b 20 66 75 6e 63 74 69  e of rank functi
14a0: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52  on */.  char *zR
14b0: 61 6e 6b 41 72 67 73 3b 20 20 20 20 20 20 20 20  ankArgs;        
14c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
14d0: 65 6e 74 73 20 74 6f 20 72 61 6e 6b 20 66 75 6e  ents to rank fun
14e0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49  ction */..  /* I
14f0: 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 70 6f 69 6e  f non-NULL, poin
1500: 74 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 74  ts to sqlite3_vt
1510: 61 62 2e 62 61 73 65 2e 7a 45 72 72 6d 73 67 2e  ab.base.zErrmsg.
1520: 20 4f 66 74 65 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a   Often NULL. */.
1530: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73    char **pzErrms
1540: 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g;..#ifdef SQLIT
1550: 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 62 50  E_DEBUG.  int bP
1560: 72 65 66 69 78 49 6e 64 65 78 3b 20 20 20 20 20  refixIndex;     
1570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1580: 65 20 74 6f 20 75 73 65 20 70 72 65 66 69 78 2d  e to use prefix-
1590: 69 6e 64 65 78 65 73 20 2a 2f 0a 23 65 6e 64 69  indexes */.#endi
15a0: 66 0a 7d 3b 0a 0a 2f 2a 20 43 75 72 72 65 6e 74  f.};../* Current
15b0: 20 65 78 70 65 63 74 65 64 20 76 61 6c 75 65 20   expected value 
15c0: 6f 66 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c  of %_config tabl
15d0: 65 20 27 76 65 72 73 69 6f 6e 27 20 66 69 65 6c  e 'version' fiel
15e0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  d */.#define FTS
15f0: 35 5f 43 55 52 52 45 4e 54 5f 56 45 52 53 49 4f  5_CURRENT_VERSIO
1600: 4e 20 34 0a 0a 23 64 65 66 69 6e 65 20 46 54 53  N 4..#define FTS
1610: 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c  5_CONTENT_NORMAL
1620: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 46 54 53     0.#define FTS
1630: 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20 20  5_CONTENT_NONE  
1640: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 46 54 53     1.#define FTS
1650: 35 5f 43 4f 4e 54 45 4e 54 5f 45 58 54 45 52 4e  5_CONTENT_EXTERN
1660: 41 4c 20 32 0a 0a 23 64 65 66 69 6e 65 20 46 54  AL 2..#define FT
1670: 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 20  S5_DETAIL_FULL  
1680: 20 20 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35    0.#define FTS5
1690: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 20 20 20  _DETAIL_NONE    
16a0: 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  1.#define FTS5_D
16b0: 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 32 0a  ETAIL_COLUMNS 2.
16c0: 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
16d0: 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28 0a 20  s5ConfigParse(. 
16e0: 20 20 20 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20     Fts5Global*, 
16f0: 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74 2c 20 63  sqlite3*, int, c
1700: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 2c 20 46 74  onst char **, Ft
1710: 73 35 43 6f 6e 66 69 67 2a 2a 2c 20 63 68 61 72  s5Config**, char
1720: 2a 2a 0a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  **.);.void sqlit
1730: 65 33 46 74 73 35 43 6f 6e 66 69 67 46 72 65 65  e3Fts5ConfigFree
1740: 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b 0a 0a  (Fts5Config*);..
1750: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
1760: 6f 6e 66 69 67 44 65 63 6c 61 72 65 56 74 61 62  onfigDeclareVtab
1770: 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f  (Fts5Config *pCo
1780: 6e 66 69 67 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  nfig);..int sqli
1790: 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28  te3Fts5Tokenize(
17a0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
17b0: 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20  Config,         
17c0: 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69     /* FTS5 Confi
17d0: 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20  guration object 
17e0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 54 4f 4b       /* FTS5_TOK
1810: 45 4e 49 5a 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  ENIZE_* flags */
1820: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
1830: 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c  Text, int nText,
1840: 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 74 6f     /* Text to to
1850: 6b 65 6e 69 7a 65 20 2a 2f 0a 20 20 76 6f 69 64  kenize */.  void
1860: 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
1870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1880: 6f 6e 74 65 78 74 20 70 61 73 73 65 64 20 74 6f  ontext passed to
1890: 20 78 54 6f 6b 65 6e 28 29 20 2a 2f 0a 20 20 69   xToken() */.  i
18a0: 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69  nt (*xToken)(voi
18b0: 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63  d*, int, const c
18c0: 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  har*, int, int, 
18d0: 69 6e 74 29 20 20 20 20 2f 2a 20 43 61 6c 6c 62  int)    /* Callb
18e0: 61 63 6b 20 2a 2f 0a 29 3b 0a 0a 76 6f 69 64 20  ack */.);..void 
18f0: 73 71 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f  sqlite3Fts5Dequo
1900: 74 65 28 63 68 61 72 20 2a 7a 29 3b 0a 0a 2f 2a  te(char *z);../*
1910: 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Load the conten
1920: 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 66  ts of the %_conf
1930: 69 67 20 74 61 62 6c 65 20 2a 2f 0a 69 6e 74 20  ig table */.int 
1940: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
1950: 67 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66 69 67  gLoad(Fts5Config
1960: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 53 65 74  *, int);../* Set
1970: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
1980: 73 69 6e 67 6c 65 20 63 6f 6e 66 69 67 20 61 74  single config at
1990: 74 72 69 62 75 74 65 20 2a 2f 0a 69 6e 74 20 73  tribute */.int s
19a0: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
19b0: 53 65 74 56 61 6c 75 65 28 46 74 73 35 43 6f 6e  SetValue(Fts5Con
19c0: 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  fig*, const char
19d0: 2a 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *, sqlite3_value
19e0: 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 69 6e 74 20 73  *, int*);..int s
19f0: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
1a00: 50 61 72 73 65 52 61 6e 6b 28 63 6f 6e 73 74 20  ParseRank(const 
1a10: 63 68 61 72 2a 2c 20 63 68 61 72 2a 2a 2c 20 63  char*, char**, c
1a20: 68 61 72 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45  har**);../*.** E
1a30: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
1a40: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
1a50: 63 6f 6e 66 69 67 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  config.c..******
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af0: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
1b00: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
1b10: 62 75 66 66 65 72 2e 63 2e 0a 2a 2f 0a 0a 2f 2a  buffer.c..*/../*
1b20: 0a 2a 2a 20 42 75 66 66 65 72 20 6f 62 6a 65 63  .** Buffer objec
1b30: 74 20 66 6f 72 20 74 68 65 20 69 6e 63 72 65 6d  t for the increm
1b40: 65 6e 74 61 6c 20 62 75 69 6c 64 69 6e 67 20 6f  ental building o
1b50: 66 20 73 74 72 69 6e 67 20 64 61 74 61 2e 0a 2a  f string data..*
1b60: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1b70: 20 46 74 73 35 42 75 66 66 65 72 20 46 74 73 35   Fts5Buffer Fts5
1b80: 42 75 66 66 65 72 3b 0a 73 74 72 75 63 74 20 46  Buffer;.struct F
1b90: 74 73 35 42 75 66 66 65 72 20 7b 0a 20 20 75 38  ts5Buffer {.  u8
1ba0: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
1bb0: 69 6e 74 20 6e 53 70 61 63 65 3b 0a 7d 3b 0a 0a  int nSpace;.};..
1bc0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 42  int sqlite3Fts5B
1bd0: 75 66 66 65 72 53 69 7a 65 28 69 6e 74 2a 2c 20  ufferSize(int*, 
1be0: 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69 6e 74  Fts5Buffer*, int
1bf0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
1c00: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1c10: 61 72 69 6e 74 28 69 6e 74 2a 2c 20 46 74 73 35  arint(int*, Fts5
1c20: 42 75 66 66 65 72 2a 2c 20 69 36 34 29 3b 0a 76  Buffer*, i64);.v
1c30: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
1c40: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1c50: 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72  int*, Fts5Buffer
1c60: 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38  *, int, const u8
1c70: 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  *);.void sqlite3
1c80: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1c90: 53 74 72 69 6e 67 28 69 6e 74 20 2a 2c 20 46 74  String(int *, Ft
1ca0: 73 35 42 75 66 66 65 72 2a 2c 20 63 6f 6e 73 74  s5Buffer*, const
1cb0: 20 63 68 61 72 2a 29 3b 0a 76 6f 69 64 20 73 71   char*);.void sq
1cc0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
1cd0: 72 65 65 28 46 74 73 35 42 75 66 66 65 72 2a 29  ree(Fts5Buffer*)
1ce0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
1cf0: 73 35 42 75 66 66 65 72 5a 65 72 6f 28 46 74 73  s5BufferZero(Fts
1d00: 35 42 75 66 66 65 72 2a 29 3b 0a 76 6f 69 64 20  5Buffer*);.void 
1d10: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d20: 72 53 65 74 28 69 6e 74 2a 2c 20 46 74 73 35 42  rSet(int*, Fts5B
1d30: 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e  uffer*, int, con
1d40: 73 74 20 75 38 2a 29 3b 0a 76 6f 69 64 20 73 71  st u8*);.void sq
1d50: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1d60: 70 70 65 6e 64 50 72 69 6e 74 66 28 69 6e 74 20  ppendPrintf(int 
1d70: 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
1d80: 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29  char *zFmt, ...)
1d90: 3b 0a 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  ;..char *sqlite3
1da0: 46 74 73 35 4d 70 72 69 6e 74 66 28 69 6e 74 20  Fts5Mprintf(int 
1db0: 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pRc, const char
1dc0: 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0a 0a 23   *zFmt, ...);..#
1dd0: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
1de0: 72 5a 65 72 6f 28 78 29 20 20 20 20 20 20 20 20  rZero(x)        
1df0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1e00: 42 75 66 66 65 72 5a 65 72 6f 28 78 29 0a 23 64  BufferZero(x).#d
1e10: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
1e20: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 61 2c 62  AppendVarint(a,b
1e30: 2c 63 29 20 73 71 6c 69 74 65 33 46 74 73 35 42  ,c) sqlite3Fts5B
1e40: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1e50: 74 28 61 2c 62 2c 63 29 0a 23 64 65 66 69 6e 65  t(a,b,c).#define
1e60: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1e70: 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20 73  a)             s
1e80: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1e90: 46 72 65 65 28 61 29 0a 23 64 65 66 69 6e 65 20  Free(a).#define 
1ea0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1eb0: 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20 73 71  Blob(a,b,c,d) sq
1ec0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1ed0: 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c  ppendBlob(a,b,c,
1ee0: 64 29 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42  d).#define fts5B
1ef0: 75 66 66 65 72 53 65 74 28 61 2c 62 2c 63 2c 64  ufferSet(a,b,c,d
1f00: 29 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  )        sqlite3
1f10: 46 74 73 35 42 75 66 66 65 72 53 65 74 28 61 2c  Fts5BufferSet(a,
1f20: 62 2c 63 2c 64 29 0a 0a 23 64 65 66 69 6e 65 20  b,c,d)..#define 
1f30: 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 70  fts5BufferGrow(p
1f40: 52 63 2c 70 42 75 66 2c 6e 6e 29 20 28 20 5c 0a  Rc,pBuf,nn) ( \.
1f50: 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 20 28 6e    (pBuf)->n + (n
1f60: 6e 29 20 3c 3d 20 28 70 42 75 66 29 2d 3e 6e 53  n) <= (pBuf)->nS
1f70: 70 61 63 65 20 3f 20 30 20 3a 20 5c 0a 20 20 20  pace ? 0 : \.   
1f80: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1f90: 65 72 53 69 7a 65 28 28 70 52 63 29 2c 28 70 42  erSize((pRc),(pB
1fa0: 75 66 29 2c 28 6e 6e 29 2b 28 70 42 75 66 29 2d  uf),(nn)+(pBuf)-
1fb0: 3e 6e 29 20 5c 0a 29 0a 0a 2f 2a 20 57 72 69 74  >n) \.)../* Writ
1fc0: 65 20 61 6e 64 20 64 65 63 6f 64 65 20 62 69 67  e and decode big
1fd0: 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 20 69  -endian 32-bit i
1fe0: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 2a 2f  nteger values */
1ff0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
2000: 35 50 75 74 33 32 28 75 38 2a 2c 20 69 6e 74 29  5Put32(u8*, int)
2010: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
2020: 35 47 65 74 33 32 28 63 6f 6e 73 74 20 75 38 2a  5Get32(const u8*
2030: 29 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  );..#define FTS5
2040: 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73  _POS2COLUMN(iPos
2050: 29 20 28 69 6e 74 29 28 69 50 6f 73 20 3e 3e 20  ) (int)(iPos >> 
2060: 33 32 29 0a 23 64 65 66 69 6e 65 20 46 54 53 35  32).#define FTS5
2070: 5f 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73  _POS2OFFSET(iPos
2080: 29 20 28 69 6e 74 29 28 69 50 6f 73 20 26 20 30  ) (int)(iPos & 0
2090: 78 46 46 46 46 46 46 46 46 29 0a 0a 74 79 70 65  xFFFFFFFF)..type
20a0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50  def struct Fts5P
20b0: 6f 73 6c 69 73 74 52 65 61 64 65 72 20 46 74 73  oslistReader Fts
20c0: 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 3b 0a  5PoslistReader;.
20d0: 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69  struct Fts5Posli
20e0: 73 74 52 65 61 64 65 72 20 7b 0a 20 20 2f 2a 20  stReader {.  /* 
20f0: 56 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 6f  Variables used o
2100: 6e 6c 79 20 62 79 20 73 71 6c 69 74 65 33 46 74  nly by sqlite3Ft
2110: 73 35 50 6f 73 6c 69 73 74 49 74 65 72 58 58 58  s5PoslistIterXXX
2120: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f  () functions. */
2130: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20  .  const u8 *a; 
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c     /* Position l
2160: 69 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ist to iterate t
2170: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
2180: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
21a0: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74  ize of buffer at
21b0: 20 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f   a[] in bytes */
21c0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66     /* Current of
21f0: 66 73 65 74 20 69 6e 20 61 5b 5d 20 2a 2f 0a 0a  fset in a[] */..
2200: 20 20 75 38 20 62 46 6c 61 67 3b 20 20 20 20 20    u8 bFlag;     
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 2f 2a 20 46 6f 72 20 63 6c 69 65 6e 74 20    /* For client 
2230: 75 73 65 20 28 61 6e 79 20 63 75 73 74 6f 6d 20  use (any custom 
2240: 70 75 72 70 6f 73 65 29 20 2a 2f 0a 0a 20 20 2f  purpose) */..  /
2250: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
2260: 65 73 20 2a 2f 0a 20 20 75 38 20 62 45 6f 66 3b  es */.  u8 bEof;
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
2290: 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  o true at EOF */
22a0: 0a 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20 20  .  i64 iPos;    
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33 32 29     /* (iCol<<32)
22d0: 20 2b 20 69 50 6f 73 20 2a 2f 0a 7d 3b 0a 69 6e   + iPos */.};.in
22e0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  t sqlite3Fts5Pos
22f0: 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 0a  listReaderInit(.
2300: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69    const u8 *a, i
2310: 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
2320: 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 62 75 66    /* Poslist buf
2330: 66 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  fer to iterate t
2340: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 46 74 73 35  hrough */.  Fts5
2350: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 70  PoslistReader *p
2360: 49 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20 49  Iter        /* I
2370: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 74  terator object t
2380: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a  o initialize */.
2390: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
23a0: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e  s5PoslistReaderN
23b0: 65 78 74 28 46 74 73 35 50 6f 73 6c 69 73 74 52  ext(Fts5PoslistR
23c0: 65 61 64 65 72 2a 29 3b 0a 0a 74 79 70 65 64 65  eader*);..typede
23d0: 66 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73  f struct Fts5Pos
23e0: 6c 69 73 74 57 72 69 74 65 72 20 46 74 73 35 50  listWriter Fts5P
23f0: 6f 73 6c 69 73 74 57 72 69 74 65 72 3b 0a 73 74  oslistWriter;.st
2400: 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74  ruct Fts5Poslist
2410: 57 72 69 74 65 72 20 7b 0a 20 20 69 36 34 20 69  Writer {.  i64 i
2420: 50 72 65 76 3b 0a 7d 3b 0a 69 6e 74 20 73 71 6c  Prev;.};.int sql
2430: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57  ite3Fts5PoslistW
2440: 72 69 74 65 72 41 70 70 65 6e 64 28 46 74 73 35  riterAppend(Fts5
2450: 42 75 66 66 65 72 2a 2c 20 46 74 73 35 50 6f 73  Buffer*, Fts5Pos
2460: 6c 69 73 74 57 72 69 74 65 72 2a 2c 20 69 36 34  listWriter*, i64
2470: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
2480: 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
2490: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c  (.  const u8 *a,
24a0: 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
24b0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
24c0: 6e 74 61 69 6e 69 6e 67 20 70 6f 73 6c 69 73 74  ntaining poslist
24d0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 2c 20 20   */.  int *pi,  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2500: 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 61   Offset within a
2510: 5b 5d 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4f  [] */.  i64 *piO
2520: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
2530: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2540: 54 3a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  T: Current offse
2550: 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 20 4d 61 6c 6c  t */.);../* Mall
2560: 6f 63 20 75 74 69 6c 69 74 79 20 2a 2f 0a 76 6f  oc utility */.vo
2570: 69 64 20 2a 73 71 6c 69 74 65 33 46 74 73 35 4d  id *sqlite3Fts5M
2580: 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74 20 2a 70  allocZero(int *p
2590: 52 63 2c 20 69 6e 74 20 6e 42 79 74 65 29 3b 0a  Rc, int nByte);.
25a0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73  char *sqlite3Fts
25b0: 35 53 74 72 6e 64 75 70 28 69 6e 74 20 2a 70 52  5Strndup(int *pR
25c0: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  c, const char *p
25d0: 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 3b 0a 0a 2f  In, int nIn);../
25e0: 2a 20 43 68 61 72 61 63 74 65 72 20 73 65 74 20  * Character set 
25f0: 74 65 73 74 73 20 28 6c 69 6b 65 20 69 73 73 70  tests (like issp
2600: 61 63 65 28 29 2c 20 69 73 61 6c 70 68 61 28 29  ace(), isalpha()
2610: 20 65 74 63 2e 29 20 2a 2f 0a 69 6e 74 20 73 71   etc.) */.int sq
2620: 6c 69 74 65 33 46 74 73 35 49 73 42 61 72 65 77  lite3Fts5IsBarew
2630: 6f 72 64 28 63 68 61 72 20 74 29 3b 0a 0a 0a 2f  ord(char t);.../
2640: 2a 20 42 75 63 6b 65 74 20 6f 66 20 74 65 72 6d  * Bucket of term
2650: 73 20 6f 62 6a 65 63 74 20 75 73 65 64 20 62 79  s object used by
2660: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
2670: 68 65 63 6b 20 69 6e 20 6f 66 66 73 65 74 73 3d  heck in offsets=
2680: 30 20 6d 6f 64 65 2e 20 2a 2f 0a 74 79 70 65 64  0 mode. */.typed
2690: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 54 65  ef struct Fts5Te
26a0: 72 6d 73 65 74 20 46 74 73 35 54 65 72 6d 73 65  rmset Fts5Termse
26b0: 74 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  t;.int sqlite3Ft
26c0: 73 35 54 65 72 6d 73 65 74 4e 65 77 28 46 74 73  s5TermsetNew(Fts
26d0: 35 54 65 72 6d 73 65 74 2a 2a 29 3b 0a 69 6e 74  5Termset**);.int
26e0: 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d   sqlite3Fts5Term
26f0: 73 65 74 41 64 64 28 46 74 73 35 54 65 72 6d 73  setAdd(Fts5Terms
2700: 65 74 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20  et*, int, const 
2710: 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 20  char*, int, int 
2720: 2a 70 62 50 72 65 73 65 6e 74 29 3b 0a 76 6f 69  *pbPresent);.voi
2730: 64 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72  d sqlite3Fts5Ter
2740: 6d 73 65 74 46 72 65 65 28 46 74 73 35 54 65 72  msetFree(Fts5Ter
2750: 6d 73 65 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45  mset*);../*.** E
2760: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
2770: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
2780: 62 75 66 66 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  buffer.c..******
2790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
27e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2820: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
2830: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
2840: 69 6e 64 65 78 2e 63 2e 20 66 74 73 35 5f 69 6e  index.c. fts5_in
2850: 64 65 78 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63  dex.c contains c
2860: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20  ontains code.** 
2870: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
2880: 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
2890: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
28a0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
28b0: 74 20 46 74 73 35 49 6e 64 65 78 20 46 74 73 35  t Fts5Index Fts5
28c0: 49 6e 64 65 78 3b 0a 74 79 70 65 64 65 66 20 73  Index;.typedef s
28d0: 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 49  truct Fts5IndexI
28e0: 74 65 72 20 46 74 73 35 49 6e 64 65 78 49 74 65  ter Fts5IndexIte
28f0: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73  r;../*.** Values
2900: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
2910: 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   the flags argum
2920: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 49 6e  ent passed to In
2930: 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 23  dexQuery()..*/.#
2940: 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58  define FTS5INDEX
2950: 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 20 20  _QUERY_PREFIX   
2960: 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20 50 72    0x0001   /* Pr
2970: 65 66 69 78 20 71 75 65 72 79 20 2a 2f 0a 23 64  efix query */.#d
2980: 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f  efine FTS5INDEX_
2990: 51 55 45 52 59 5f 44 45 53 43 20 20 20 20 20 20  QUERY_DESC      
29a0: 20 30 78 30 30 30 32 20 20 20 2f 2a 20 44 6f 63   0x0002   /* Doc
29b0: 73 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20  s in descending 
29c0: 72 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 23  rowid order */.#
29d0: 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58  define FTS5INDEX
29e0: 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44  _QUERY_TEST_NOID
29f0: 58 20 30 78 30 30 30 34 20 20 20 2f 2a 20 44 6f  X 0x0004   /* Do
2a00: 20 6e 6f 74 20 75 73 65 20 70 72 65 66 69 78 20   not use prefix 
2a10: 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65  index */.#define
2a20: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
2a30: 5f 53 43 41 4e 20 20 20 20 20 20 20 30 78 30 30  _SCAN       0x00
2a40: 30 38 20 20 20 2f 2a 20 53 63 61 6e 20 71 75 65  08   /* Scan que
2a50: 72 79 20 28 66 74 73 35 76 6f 63 61 62 29 20 2a  ry (fts5vocab) *
2a60: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 2f  /../*.** Create/
2a70: 64 65 73 74 72 6f 79 20 61 6e 20 46 74 73 35 49  destroy an Fts5I
2a80: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ndex object..*/.
2a90: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2aa0: 6e 64 65 78 4f 70 65 6e 28 46 74 73 35 43 6f 6e  ndexOpen(Fts5Con
2ab0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 69 6e  fig *pConfig, in
2ac0: 74 20 62 43 72 65 61 74 65 2c 20 46 74 73 35 49  t bCreate, Fts5I
2ad0: 6e 64 65 78 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b  ndex**, char**);
2ae0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2af0: 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49  IndexClose(Fts5I
2b00: 6e 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a  ndex *p);../*.**
2b10: 20 66 6f 72 28 0a 2a 2a 20 20 20 73 71 6c 69 74   for(.**   sqlit
2b20: 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
2b30: 28 70 2c 20 22 74 6f 6b 65 6e 22 2c 20 35 2c 20  (p, "token", 5, 
2b40: 30 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 2a  0, 0, &pIter);.*
2b50: 2a 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 46 74  *   0==sqlite3Ft
2b60: 73 35 49 74 65 72 45 6f 66 28 70 49 74 65 72 29  s5IterEof(pIter)
2b70: 3b 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 46 74  ;.**   sqlite3Ft
2b80: 73 35 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  s5IterNext(pIter
2b90: 29 0a 2a 2a 20 29 7b 0a 2a 2a 20 20 20 69 36 34  ).** ){.**   i64
2ba0: 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65   iRowid = sqlite
2bb0: 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 70  3Fts5IterRowid(p
2bc0: 49 74 65 72 29 3b 0a 2a 2a 20 7d 0a 2a 2f 0a 0a  Iter);.** }.*/..
2bd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
2be0: 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76  imple checksum v
2bf0: 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68  alue based on th
2c00: 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  e arguments..*/.
2c10: 75 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49  u64 sqlite3Fts5I
2c20: 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a  ndexEntryCksum(.
2c30: 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20    i64 iRowid, . 
2c40: 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e   int iCol, .  in
2c50: 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69  t iPos, .  int i
2c60: 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Idx,.  const cha
2c70: 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20  r *pTerm,.  int 
2c80: 6e 54 65 72 6d 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  nTerm.);../*.** 
2c90: 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
2ca0: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
2cb0: 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
2cc0: 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
2cd0: 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
2ce0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
2cf0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
2d00: 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
2d10: 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
2d20: 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
2d30: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
2d40: 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
2d50: 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
2d60: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
2d70: 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65  3Fts5IndexCharle
2d80: 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f  nToBytelen(.  co
2d90: 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 0a 20 20  nst char *p, .  
2da0: 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e  int nByte, .  in
2db0: 74 20 6e 43 68 61 72 0a 29 3b 0a 0a 2f 2a 0a 2a  t nChar.);../*.*
2dc0: 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65  * Open a new ite
2dd0: 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65  rator to iterate
2de0: 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69   though all rowi
2df0: 64 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  ds that match th
2e00: 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  e .** specified 
2e10: 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
2e20: 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  refix..*/.int sq
2e30: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
2e40: 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ery(.  Fts5Index
2e50: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2e60: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e         /* FTS in
2e70: 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  dex to query */.
2e80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
2e90: 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
2ea0: 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70  , /* Token (or p
2eb0: 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20  refix) to query 
2ec0: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  for */.  int fla
2ed0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2ef0: 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55   of FTS5INDEX_QU
2f00: 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20  ERY_X flags */. 
2f10: 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
2f20: 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
2f30: 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20   /* Match these 
2f40: 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a  columns only */.
2f50: 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
2f60: 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20  **ppIter        
2f70: 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74    /* OUT: New it
2f80: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  erator object */
2f90: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76  .);../*.** The v
2fa0: 61 72 69 6f 75 73 20 6f 70 65 72 61 74 69 6f 6e  arious operation
2fb0: 73 20 6f 6e 20 6f 70 65 6e 20 74 6f 6b 65 6e 20  s on open token 
2fc0: 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 20  or token prefix 
2fd0: 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64  iterators opened
2fe0: 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65  .** using sqlite
2ff0: 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
3000: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
3010: 33 46 74 73 35 49 74 65 72 45 6f 66 28 46 74 73  3Fts5IterEof(Fts
3020: 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e  5IndexIter*);.in
3030: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
3040: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 49  rNext(Fts5IndexI
3050: 74 65 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  ter*);.int sqlit
3060: 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
3070: 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  om(Fts5IndexIter
3080: 2a 2c 20 69 36 34 20 69 4d 61 74 63 68 29 3b 0a  *, i64 iMatch);.
3090: 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49  i64 sqlite3Fts5I
30a0: 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64  terRowid(Fts5Ind
30b0: 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20 73 71  exIter*);.int sq
30c0: 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
30d0: 6c 69 73 74 28 46 74 73 35 49 6e 64 65 78 49 74  list(Fts5IndexIt
30e0: 65 72 2a 2c 46 74 73 35 43 6f 6c 73 65 74 2a 2c  er*,Fts5Colset*,
30f0: 20 63 6f 6e 73 74 20 75 38 2a 2a 2c 20 69 6e 74   const u8**, int
3100: 2a 2c 20 69 36 34 2a 29 3b 0a 69 6e 74 20 73 71  *, i64*);.int sq
3110: 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
3120: 6c 69 73 74 42 75 66 66 65 72 28 46 74 73 35 49  listBuffer(Fts5I
3130: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
3140: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
3150: 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f);../*.** Close
3160: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65   an iterator ope
3170: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 74  ned by sqlite3Ft
3180: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  s5IndexQuery()..
3190: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
31a0: 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73  ts5IterClose(Fts
31b0: 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 2f  5IndexIter*);../
31c0: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
31d0: 61 63 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ace is used by t
31e0: 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64  he fts5vocab mod
31f0: 75 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ule..*/.const ch
3200: 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49  ar *sqlite3Fts5I
3210: 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65  terTerm(Fts5Inde
3220: 78 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 69  xIter*, int*);.i
3230: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
3240: 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49  erNextScan(Fts5I
3250: 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 0a 2f 2a  ndexIter*);.../*
3260: 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
3270: 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
3280: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
3290: 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
32a0: 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
32b0: 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
32c0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
32d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
32e0: 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
32f0: 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
3300: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
3310: 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
3320: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
3330: 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
3340: 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
3350: 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
3360: 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
3370: 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
3380: 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
3390: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
33a0: 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
33b0: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
33c0: 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
33d0: 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
33e0: 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
33f0: 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
3400: 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e   a delete..*/.in
3410: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
3420: 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
3430: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
3450: 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
3460: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
3490: 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
34a0: 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
34b0: 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
34e0: 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
34f0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
3500: 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
3510: 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
3520: 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
3530: 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
3540: 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a 0a 2f  m index */.);../
3550: 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
3560: 61 74 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  at subsequent ca
3570: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
3580: 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
3590: 65 72 74 61 69 6e 20 74 6f 0a 2a 2a 20 64 6f 63  ertain to.** doc
35a0: 75 6d 65 6e 74 20 69 44 6f 63 69 64 2e 0a 2a 2f  ument iDocid..*/
35b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
35c0: 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28  IndexBeginWrite(
35d0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
3600: 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
3610: 20 62 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20   bDelete,       
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3630: 54 72 75 65 20 69 66 20 63 75 72 72 65 6e 74 20  True if current 
3640: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64  operation is a d
3650: 65 6c 65 74 65 20 2a 2f 0a 20 20 69 36 34 20 69  elete */.  i64 i
3660: 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20 20  Docid           
3670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3680: 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20 72 65  cid to add or re
3690: 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d 20 2a  move data from *
36a0: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  /.);../*.** Flus
36b0: 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  h any data store
36c0: 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
36d0: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74  ry hash tables t
36e0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
36f0: 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
3700: 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
3710: 61 6c 73 6f 20 63 6c 6f 73 65 20 61 6e 79 20 6f  also close any o
3720: 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c 65 73  pen blob handles
3730: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3740: 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74  Fts5IndexSync(Ft
3750: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
3760: 62 43 6f 6d 6d 69 74 29 3b 0a 0a 2f 2a 0a 2a 2a  bCommit);../*.**
3770: 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74   Discard any dat
3780: 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
3790: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
37a0: 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72  ables. Do not wr
37b0: 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65  ite it.** to the
37c0: 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
37d0: 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20  ionally, assume 
37e0: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
37f0: 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a  s of the %_data.
3800: 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76  ** table may hav
3810: 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73  e changed on dis
3820: 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d  k. So any in-mem
3830: 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f  ory caches of %_
3840: 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73  data .** records
3850: 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64   must be invalid
3860: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
3870: 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c  ite3Fts5IndexRol
3880: 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20  lback(Fts5Index 
3890: 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  *p);../*.** Get 
38a0: 6f 72 20 73 65 74 20 74 68 65 20 22 61 76 65 72  or set the "aver
38b0: 61 67 65 73 22 20 76 61 6c 75 65 73 2e 0a 2a 2f  ages" values..*/
38c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
38d0: 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73  IndexGetAverages
38e0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
38f0: 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a  64 *pnRow, i64 *
3900: 61 6e 53 69 7a 65 29 3b 0a 69 6e 74 20 73 71 6c  anSize);.int sql
3910: 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
3920: 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
3930: 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 2a  ex *p, const u8*
3940: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46  , int);../*.** F
3950: 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 65 64 20  unctions called 
3960: 62 79 20 74 68 65 20 73 74 6f 72 61 67 65 20 6d  by the storage m
3970: 6f 64 75 6c 65 20 61 73 20 70 61 72 74 20 6f 66  odule as part of
3980: 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
3990: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
39a0: 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
39b0: 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
39c0: 78 2a 2c 20 75 36 34 20 63 6b 73 75 6d 29 3b 0a  x*, u64 cksum);.
39d0: 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 65 64 20 64  ./* .** Called d
39e0: 75 72 69 6e 67 20 76 69 72 74 75 61 6c 20 6d 6f  uring virtual mo
39f0: 64 75 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  dule initializat
3a00: 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20  ion to register 
3a10: 55 44 46 20 0a 2a 2a 20 66 74 73 35 5f 64 65 63  UDF .** fts5_dec
3a20: 6f 64 65 28 29 20 77 69 74 68 20 53 51 4c 69 74  ode() with SQLit
3a30: 65 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e .*/.int sqlite
3a40: 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73  3Fts5IndexInit(s
3a50: 71 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e 74 20 73  qlite3*);..int s
3a60: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
3a70: 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64  etCookie(Fts5Ind
3a80: 65 78 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  ex*, int);../*.*
3a90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
3aa0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  al number of ent
3ab0: 72 69 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ries read from t
3ac0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
3ad0: 62 79 20 0a 2a 2a 20 74 68 69 73 20 63 6f 6e 6e  by .** this conn
3ae0: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 69 74 20  ection since it 
3af0: 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  was created..*/.
3b00: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
3b10: 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e  ndexReads(Fts5In
3b20: 64 65 78 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71  dex *p);..int sq
3b30: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
3b40: 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a  init(Fts5Index *
3b50: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
3b60: 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
3b70: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a  (Fts5Index *p);.
3b80: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
3b90: 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e  ndexMerge(Fts5In
3ba0: 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  dex *p, int nMer
3bb0: 67 65 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ge);..int sqlite
3bc0: 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f  3Fts5IndexLoadCo
3bd0: 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a  nfig(Fts5Index *
3be0: 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  p);..int sqlite3
3bf0: 46 74 73 35 49 74 65 72 43 6f 6c 6c 69 73 74 28  Fts5IterCollist(
3c00: 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 2c 20  Fts5IndexIter*, 
3c10: 63 6f 6e 73 74 20 75 38 20 2a 2a 2c 20 69 6e 74  const u8 **, int
3c20: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  *);../*.** End o
3c30: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
3c40: 6f 64 65 20 69 6e 20 66 74 73 35 5f 69 6e 64 65  ode in fts5_inde
3c50: 78 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  x.c..***********
3c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
3ca0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
3cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
3cf0: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
3d00: 64 65 20 69 6e 20 66 74 73 35 5f 76 61 72 69 6e  de in fts5_varin
3d10: 74 2e 63 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  t.c. .*/.int sql
3d20: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
3d30: 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  t32(const unsign
3d40: 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32 20  ed char *p, u32 
3d50: 2a 76 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  *v);.int sqlite3
3d60: 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e  Fts5GetVarintLen
3d70: 28 75 33 32 20 69 56 61 6c 29 3b 0a 75 38 20 73  (u32 iVal);.u8 s
3d80: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
3d90: 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  int(const unsign
3da0: 65 64 20 63 68 61 72 2a 2c 20 75 36 34 2a 29 3b  ed char*, u64*);
3db0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3dc0: 50 75 74 56 61 72 69 6e 74 28 75 6e 73 69 67 6e  PutVarint(unsign
3dd0: 65 64 20 63 68 61 72 20 2a 70 2c 20 75 36 34 20  ed char *p, u64 
3de0: 76 29 3b 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  v);..#define fts
3df0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 62  5GetVarint32(a,b
3e00: 29 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  ) sqlite3Fts5Get
3e10: 56 61 72 69 6e 74 33 32 28 61 2c 28 75 33 32 2a  Varint32(a,(u32*
3e20: 29 26 62 29 0a 23 64 65 66 69 6e 65 20 66 74 73  )&b).#define fts
3e30: 35 47 65 74 56 61 72 69 6e 74 20 20 20 20 73 71  5GetVarint    sq
3e40: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
3e50: 6e 74 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  nt..#define fts5
3e60: 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
3e70: 61 2c 20 69 4f 66 66 2c 20 6e 56 61 6c 29 20 7b  a, iOff, nVal) {
3e80: 20 20 20 20 20 20 5c 0a 20 20 6e 56 61 6c 20 3d        \.  nVal =
3e90: 20 28 61 29 5b 69 4f 66 66 2b 2b 5d 3b 20 20 20   (a)[iOff++];   
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
3ec0: 28 20 6e 56 61 6c 20 26 20 30 78 38 30 20 29 7b  ( nVal & 0x80 ){
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
3ef0: 20 20 20 20 69 4f 66 66 2d 2d 3b 20 20 20 20 20      iOff--;     
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 5c 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20    \.    iOff += 
3f30: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
3f40: 26 28 61 29 5b 69 4f 66 66 5d 2c 20 6e 56 61 6c  &(a)[iOff], nVal
3f50: 29 3b 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20  );    \.  }     
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a            \.}...
3f90: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
3fa0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
3fb0: 6e 20 66 74 73 35 5f 76 61 72 69 6e 74 2e 63 2e  n fts5_varint.c.
3fc0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
3fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 0a 2f  ***********/.../
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 2a 2a  ****************
4030: 2a 2a 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 0a 2a 2a 20 49 6e  **********.** In
4060: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
4070: 69 6e 20 66 74 73 35 2e 63 2e 20 0a 2a 2f 0a 0a  in fts5.c. .*/..
4080: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 47  int sqlite3Fts5G
4090: 65 74 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 46  etTokenizer(.  F
40a0: 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 0a 20 20 63  ts5Global*, .  c
40b0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
40c0: 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  g,.  int nArg,. 
40d0: 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 2a   Fts5Tokenizer**
40e0: 2c 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a  ,.  fts5_tokeniz
40f0: 65 72 2a 2a 2c 0a 20 20 63 68 61 72 20 2a 2a 70  er**,.  char **p
4100: 7a 45 72 72 0a 29 3b 0a 0a 46 74 73 35 49 6e 64  zErr.);..Fts5Ind
4110: 65 78 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49  ex *sqlite3Fts5I
4120: 6e 64 65 78 46 72 6f 6d 43 73 72 69 64 28 46 74  ndexFromCsrid(Ft
4130: 73 35 47 6c 6f 62 61 6c 2a 2c 20 69 36 34 2c 20  s5Global*, i64, 
4140: 46 74 73 35 43 6f 6e 66 69 67 20 2a 2a 29 3b 0a  Fts5Config **);.
4150: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
4160: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
4170: 69 6e 20 66 74 73 35 2e 63 2e 0a 2a 2a 2a 2a 2a  in fts5.c..*****
4180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41c0: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
41d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4210: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
4220: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
4230: 5f 68 61 73 68 2e 63 2e 20 0a 2a 2f 0a 74 79 70  _hash.c. .*/.typ
4240: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
4250: 48 61 73 68 20 46 74 73 35 48 61 73 68 3b 0a 0a  Hash Fts5Hash;..
4260: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 68  /*.** Create a h
4270: 61 73 68 20 74 61 62 6c 65 2c 20 66 72 65 65 20  ash table, free 
4280: 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f  a hash table..*/
4290: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
42a0: 48 61 73 68 4e 65 77 28 46 74 73 35 43 6f 6e 66  HashNew(Fts5Conf
42b0: 69 67 2a 2c 20 46 74 73 35 48 61 73 68 2a 2a 2c  ig*, Fts5Hash**,
42c0: 20 69 6e 74 20 2a 70 6e 53 69 7a 65 29 3b 0a 76   int *pnSize);.v
42d0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 48  oid sqlite3Fts5H
42e0: 61 73 68 46 72 65 65 28 46 74 73 35 48 61 73 68  ashFree(Fts5Hash
42f0: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
4300: 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a 20  Fts5HashWrite(. 
4310: 20 46 74 73 35 48 61 73 68 2a 2c 0a 20 20 69 36   Fts5Hash*,.  i6
4320: 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4340: 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   Rowid for this 
4350: 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
4360: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4380: 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61  lumn token appea
4390: 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65  rs in (-ve -> de
43a0: 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69  lete) */.  int i
43b0: 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Pos,            
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
43d0: 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20  sition of token 
43e0: 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f  within column */
43f0: 0a 20 20 63 68 61 72 20 62 42 79 74 65 2c 0a 20  .  char bByte,. 
4400: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
4410: 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20  ken, int nToken 
4420: 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64   /* Token to add
4430: 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72   or remove to or
4440: 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29   from index */.)
4450: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70 74 79 20 28  ;../*.** Empty (
4460: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
4470: 65 29 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e  e) a hash table.
4480: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4490: 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 46 74  Fts5HashClear(Ft
44a0: 73 35 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73  s5Hash*);..int s
44b0: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75  qlite3Fts5HashQu
44c0: 65 72 79 28 0a 20 20 46 74 73 35 48 61 73 68 2a  ery(.  Fts5Hash*
44d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
44e0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
44f0: 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  able to query */
4500: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
4510: 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
4520: 20 20 20 2f 2a 20 51 75 65 72 79 20 74 65 72 6d     /* Query term
4530: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
4540: 2a 70 70 44 6f 63 6c 69 73 74 2c 20 20 20 20 20  *ppDoclist,     
4550: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
4560: 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
4570: 20 66 6f 72 20 70 54 65 72 6d 20 2a 2f 0a 20 20   for pTerm */.  
4580: 69 6e 74 20 2a 70 6e 44 6f 63 6c 69 73 74 20 20  int *pnDoclist  
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
45b0: 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73  doclist in bytes
45c0: 20 2a 2f 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69   */.);..int sqli
45d0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49  te3Fts5HashScanI
45e0: 6e 69 74 28 0a 20 20 46 74 73 35 48 61 73 68 2a  nit(.  Fts5Hash*
45f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4600: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
4610: 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  able to query */
4620: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
4630: 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20  Term, int nTerm 
4640: 20 20 20 2f 2a 20 51 75 65 72 79 20 70 72 65 66     /* Query pref
4650: 69 78 20 2a 2f 0a 29 3b 0a 76 6f 69 64 20 73 71  ix */.);.void sq
4660: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
4670: 6e 4e 65 78 74 28 46 74 73 35 48 61 73 68 2a 29  nNext(Fts5Hash*)
4680: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4690: 35 48 61 73 68 53 63 61 6e 45 6f 66 28 46 74 73  5HashScanEof(Fts
46a0: 35 48 61 73 68 2a 29 3b 0a 76 6f 69 64 20 73 71  5Hash*);.void sq
46b0: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
46c0: 6e 45 6e 74 72 79 28 46 74 73 35 48 61 73 68 20  nEntry(Fts5Hash 
46d0: 2a 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  *,.  const char 
46e0: 2a 2a 70 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  **pzTerm,       
46f0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 74 65 72       /* OUT: ter
4700: 6d 20 28 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  m (nul-terminate
4710: 64 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  d) */.  const u8
4720: 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20 20 20   **ppDoclist,   
4730: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4740: 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  pointer to docli
4750: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 44  st */.  int *pnD
4760: 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20 20  oclist          
4770: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4780: 73 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  size of doclist 
4790: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a  in bytes */.);..
47a0: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
47b0: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
47c0: 69 6e 20 66 74 73 35 5f 68 61 73 68 2e 63 2e 0a  in fts5_hash.c..
47d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a  **********/../**
4820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4860: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
4870: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
4880: 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e   fts5_storage.c.
4890: 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 20   fts5_storage.c 
48a0: 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e  contains contain
48b0: 73 20 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 61 63  s .** code to ac
48c0: 63 65 73 73 20 74 68 65 20 64 61 74 61 20 73 74  cess the data st
48d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f 63 6f  ored in the %_co
48e0: 6e 74 65 6e 74 20 61 6e 64 20 25 5f 64 6f 63 73  ntent and %_docs
48f0: 69 7a 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 0a  ize tables..*/..
4900: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d  #define FTS5_STM
4910: 54 5f 53 43 41 4e 5f 41 53 43 20 20 30 20 20 20  T_SCAN_ASC  0   
4920: 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69    /* SELECT rowi
4930: 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52  d, * FROM ... OR
4940: 44 45 52 20 42 59 20 31 20 41 53 43 20 2a 2f 0a  DER BY 1 ASC */.
4950: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d  #define FTS5_STM
4960: 54 5f 53 43 41 4e 5f 44 45 53 43 20 31 20 20 20  T_SCAN_DESC 1   
4970: 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69    /* SELECT rowi
4980: 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52  d, * FROM ... OR
4990: 44 45 52 20 42 59 20 31 20 44 45 53 43 20 2a 2f  DER BY 1 DESC */
49a0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
49b0: 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20 20 32 20 20  MT_LOOKUP    2  
49c0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77     /* SELECT row
49d0: 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 57  id, * FROM ... W
49e0: 48 45 52 45 20 72 6f 77 69 64 3d 3f 20 2a 2f 0a  HERE rowid=? */.
49f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
4a00: 46 74 73 35 53 74 6f 72 61 67 65 20 46 74 73 35  Fts5Storage Fts5
4a10: 53 74 6f 72 61 67 65 3b 0a 0a 69 6e 74 20 73 71  Storage;..int sq
4a20: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
4a30: 4f 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67 2a  Open(Fts5Config*
4a40: 2c 20 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 6e  , Fts5Index*, in
4a50: 74 2c 20 46 74 73 35 53 74 6f 72 61 67 65 2a 2a  t, Fts5Storage**
4a60: 2c 20 63 68 61 72 2a 2a 29 3b 0a 69 6e 74 20 73  , char**);.int s
4a70: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
4a80: 65 43 6c 6f 73 65 28 46 74 73 35 53 74 6f 72 61  eClose(Fts5Stora
4a90: 67 65 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69  ge *p);.int sqli
4aa0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52 65  te3Fts5StorageRe
4ab0: 6e 61 6d 65 28 46 74 73 35 53 74 6f 72 61 67 65  name(Fts5Storage
4ac0: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  *, const char *z
4ad0: 4e 61 6d 65 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  Name);..int sqli
4ae0: 74 65 33 46 74 73 35 44 72 6f 70 41 6c 6c 28 46  te3Fts5DropAll(F
4af0: 74 73 35 43 6f 6e 66 69 67 2a 29 3b 0a 69 6e 74  ts5Config*);.int
4b00: 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61   sqlite3Fts5Crea
4b10: 74 65 54 61 62 6c 65 28 46 74 73 35 43 6f 6e 66  teTable(Fts5Conf
4b20: 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  ig*, const char*
4b30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
4b40: 6e 74 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 0a 69  nt, char **);..i
4b50: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4b60: 6f 72 61 67 65 44 65 6c 65 74 65 28 46 74 73 35  orageDelete(Fts5
4b70: 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 2c  Storage *p, i64,
4b80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a   sqlite3_value**
4b90: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4ba0: 73 35 53 74 6f 72 61 67 65 43 6f 6e 74 65 6e 74  s5StorageContent
4bb0: 49 6e 73 65 72 74 28 46 74 73 35 53 74 6f 72 61  Insert(Fts5Stora
4bc0: 67 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  ge *p, sqlite3_v
4bd0: 61 6c 75 65 2a 2a 2c 20 69 36 34 2a 29 3b 0a 69  alue**, i64*);.i
4be0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4bf0: 6f 72 61 67 65 49 6e 64 65 78 49 6e 73 65 72 74  orageIndexInsert
4c00: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
4c10: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a   sqlite3_value**
4c20: 2c 20 69 36 34 29 3b 0a 0a 69 6e 74 20 73 71 6c  , i64);..int sql
4c30: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 49  ite3Fts5StorageI
4c40: 6e 74 65 67 72 69 74 79 28 46 74 73 35 53 74 6f  ntegrity(Fts5Sto
4c50: 72 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73  rage *p);..int s
4c60: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
4c70: 65 53 74 6d 74 28 46 74 73 35 53 74 6f 72 61 67  eStmt(Fts5Storag
4c80: 65 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c  e *p, int eStmt,
4c90: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2a 2c   sqlite3_stmt**,
4ca0: 20 63 68 61 72 2a 2a 29 3b 0a 76 6f 69 64 20 73   char**);.void s
4cb0: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
4cc0: 65 53 74 6d 74 52 65 6c 65 61 73 65 28 46 74 73  eStmtRelease(Fts
4cd0: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74  5Storage *p, int
4ce0: 20 65 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f   eStmt, sqlite3_
4cf0: 73 74 6d 74 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  stmt*);..int sql
4d00: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44  ite3Fts5StorageD
4d10: 6f 63 73 69 7a 65 28 46 74 73 35 53 74 6f 72 61  ocsize(Fts5Stora
4d20: 67 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ge *p, i64 iRowi
4d30: 64 2c 20 69 6e 74 20 2a 61 43 6f 6c 29 3b 0a 69  d, int *aCol);.i
4d40: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4d50: 6f 72 61 67 65 53 69 7a 65 28 46 74 73 35 53 74  orageSize(Fts5St
4d60: 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 69 43  orage *p, int iC
4d70: 6f 6c 2c 20 69 36 34 20 2a 70 6e 41 76 67 29 3b  ol, i64 *pnAvg);
4d80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4d90: 53 74 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28  StorageRowCount(
4da0: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4db0: 69 36 34 20 2a 70 6e 52 6f 77 29 3b 0a 0a 69 6e  i64 *pnRow);..in
4dc0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
4dd0: 72 61 67 65 53 79 6e 63 28 46 74 73 35 53 74 6f  rageSync(Fts5Sto
4de0: 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f  rage *p, int bCo
4df0: 6d 6d 69 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74  mmit);.int sqlit
4e00: 65 33 46 74 73 35 53 74 6f 72 61 67 65 52 6f 6c  e3Fts5StorageRol
4e10: 6c 62 61 63 6b 28 46 74 73 35 53 74 6f 72 61 67  lback(Fts5Storag
4e20: 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  e *p);..int sqli
4e30: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f  te3Fts5StorageCo
4e40: 6e 66 69 67 56 61 6c 75 65 28 0a 20 20 20 20 46  nfigValue(.    F
4e50: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 63  ts5Storage *p, c
4e60: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69  onst char*, sqli
4e70: 74 65 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 0a  te3_value*, int.
4e80: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
4e90: 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65  ts5StorageDelete
4ea0: 41 6c 6c 28 46 74 73 35 53 74 6f 72 61 67 65 20  All(Fts5Storage 
4eb0: 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  *p);.int sqlite3
4ec0: 46 74 73 35 53 74 6f 72 61 67 65 52 65 62 75 69  Fts5StorageRebui
4ed0: 6c 64 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ld(Fts5Storage *
4ee0: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
4ef0: 74 73 35 53 74 6f 72 61 67 65 4f 70 74 69 6d 69  ts5StorageOptimi
4f00: 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ze(Fts5Storage *
4f10: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
4f20: 74 73 35 53 74 6f 72 61 67 65 4d 65 72 67 65 28  ts5StorageMerge(
4f30: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4f40: 69 6e 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 2f 2a  int nMerge);../*
4f50: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
4f60: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
4f70: 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 0a  fts5_storage.c..
4f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
4fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
5020: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
5030: 6e 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 20 0a  n fts5_expr.c. .
5040: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
5050: 74 20 46 74 73 35 45 78 70 72 20 46 74 73 35 45  t Fts5Expr Fts5E
5060: 78 70 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  xpr;.typedef str
5070: 75 63 74 20 46 74 73 35 45 78 70 72 4e 6f 64 65  uct Fts5ExprNode
5080: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 3b 0a 74   Fts5ExprNode;.t
5090: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
50a0: 73 35 50 61 72 73 65 20 46 74 73 35 50 61 72 73  s5Parse Fts5Pars
50b0: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
50c0: 74 20 46 74 73 35 54 6f 6b 65 6e 20 46 74 73 35  t Fts5Token Fts5
50d0: 54 6f 6b 65 6e 3b 0a 74 79 70 65 64 65 66 20 73  Token;.typedef s
50e0: 74 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68  truct Fts5ExprPh
50f0: 72 61 73 65 20 46 74 73 35 45 78 70 72 50 68 72  rase Fts5ExprPhr
5100: 61 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ase;.typedef str
5110: 75 63 74 20 46 74 73 35 45 78 70 72 4e 65 61 72  uct Fts5ExprNear
5120: 73 65 74 20 46 74 73 35 45 78 70 72 4e 65 61 72  set Fts5ExprNear
5130: 73 65 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73  set;..struct Fts
5140: 35 54 6f 6b 65 6e 20 7b 0a 20 20 63 6f 6e 73 74  5Token {.  const
5150: 20 63 68 61 72 20 2a 70 3b 20 20 20 20 20 20 20   char *p;       
5160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
5170: 6b 65 6e 20 74 65 78 74 20 28 6e 6f 74 20 4e 55  ken text (not NU
5180: 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 29 20 2a  LL terminated) *
5190: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
51c0: 75 66 66 65 72 20 70 20 69 6e 20 62 79 74 65 73  uffer p in bytes
51d0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65   */.};../* Parse
51e0: 20 61 20 4d 41 54 43 48 20 65 78 70 72 65 73 73   a MATCH express
51f0: 69 6f 6e 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion. */.int sqli
5200: 74 65 33 46 74 73 35 45 78 70 72 4e 65 77 28 0a  te3Fts5ExprNew(.
5210: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
5220: 6f 6e 66 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20  onfig, .  const 
5230: 63 68 61 72 20 2a 7a 45 78 70 72 2c 0a 20 20 46  char *zExpr,.  F
5240: 74 73 35 45 78 70 72 20 2a 2a 70 70 4e 65 77 2c  ts5Expr **ppNew,
5250: 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
5260: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28 72  .);../*.** for(r
5270: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  c = sqlite3Fts5E
5280: 78 70 72 46 69 72 73 74 28 70 45 78 70 72 2c 20  xprFirst(pExpr, 
5290: 70 49 64 78 2c 20 62 44 65 73 63 29 3b 0a 2a 2a  pIdx, bDesc);.**
52a0: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
52b0: 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  OK && 0==sqlite3
52c0: 46 74 73 35 45 78 70 72 45 6f 66 28 70 45 78 70  Fts5ExprEof(pExp
52d0: 72 29 3b 0a 2a 2a 20 20 20 20 20 72 63 20 3d 20  r);.**     rc = 
52e0: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e  sqlite3Fts5ExprN
52f0: 65 78 74 28 70 45 78 70 72 29 0a 2a 2a 20 29 7b  ext(pExpr).** ){
5300: 0a 2a 2a 20 20 20 2f 2f 20 54 68 65 20 64 6f 63  .**   // The doc
5310: 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64  ument with rowid
5320: 20 69 52 6f 77 69 64 20 6d 61 74 63 68 65 73 20   iRowid matches 
5330: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 21 0a  the expression!.
5340: 2a 2a 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  **   i64 iRowid 
5350: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  = sqlite3Fts5Exp
5360: 72 52 6f 77 69 64 28 70 45 78 70 72 29 3b 0a 2a  rRowid(pExpr);.*
5370: 2a 20 7d 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  * }.*/.int sqlit
5380: 65 33 46 74 73 35 45 78 70 72 46 69 72 73 74 28  e3Fts5ExprFirst(
5390: 46 74 73 35 45 78 70 72 2a 2c 20 46 74 73 35 49  Fts5Expr*, Fts5I
53a0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 36 34 20  ndex *pIdx, i64 
53b0: 69 4d 69 6e 2c 20 69 6e 74 20 62 44 65 73 63 29  iMin, int bDesc)
53c0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
53d0: 35 45 78 70 72 4e 65 78 74 28 46 74 73 35 45 78  5ExprNext(Fts5Ex
53e0: 70 72 2a 2c 20 69 36 34 20 69 4d 61 78 29 3b 0a  pr*, i64 iMax);.
53f0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
5400: 78 70 72 45 6f 66 28 46 74 73 35 45 78 70 72 2a  xprEof(Fts5Expr*
5410: 29 3b 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74  );.i64 sqlite3Ft
5420: 73 35 45 78 70 72 52 6f 77 69 64 28 46 74 73 35  s5ExprRowid(Fts5
5430: 45 78 70 72 2a 29 3b 0a 0a 76 6f 69 64 20 73 71  Expr*);..void sq
5440: 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 72 65  lite3Fts5ExprFre
5450: 65 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 0a 2f  e(Fts5Expr*);../
5460: 2a 20 43 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  * Called during 
5470: 73 74 61 72 74 75 70 20 74 6f 20 72 65 67 69 73  startup to regis
5480: 74 65 72 20 61 20 55 44 46 20 77 69 74 68 20 53  ter a UDF with S
5490: 51 4c 69 74 65 20 2a 2f 0a 69 6e 74 20 73 71 6c  QLite */.int sql
54a0: 69 74 65 33 46 74 73 35 45 78 70 72 49 6e 69 74  ite3Fts5ExprInit
54b0: 28 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71  (Fts5Global*, sq
54c0: 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71  lite3*);..int sq
54d0: 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72  lite3Fts5ExprPhr
54e0: 61 73 65 43 6f 75 6e 74 28 46 74 73 35 45 78 70  aseCount(Fts5Exp
54f0: 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  r*);.int sqlite3
5500: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 53 69  Fts5ExprPhraseSi
5510: 7a 65 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e  ze(Fts5Expr*, in
5520: 74 20 69 50 68 72 61 73 65 29 3b 0a 69 6e 74 20  t iPhrase);.int 
5530: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50  sqlite3Fts5ExprP
5540: 6f 73 6c 69 73 74 28 46 74 73 35 45 78 70 72 2a  oslist(Fts5Expr*
5550: 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38 20  , int, const u8 
5560: 2a 2a 29 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  **);..typedef st
5570: 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74  ruct Fts5Poslist
5580: 50 6f 70 75 6c 61 74 6f 72 20 46 74 73 35 50 6f  Populator Fts5Po
5590: 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 3b 0a  slistPopulator;.
55a0: 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
55b0: 61 74 6f 72 20 2a 73 71 6c 69 74 65 33 46 74 73  ator *sqlite3Fts
55c0: 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73  5ExprClearPoslis
55d0: 74 73 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e  ts(Fts5Expr*, in
55e0: 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  t);.int sqlite3F
55f0: 74 73 35 45 78 70 72 50 6f 70 75 6c 61 74 65 50  ts5ExprPopulateP
5600: 6f 73 6c 69 73 74 73 28 0a 20 20 20 20 46 74 73  oslists(.    Fts
5610: 35 43 6f 6e 66 69 67 2a 2c 20 46 74 73 35 45 78  5Config*, Fts5Ex
5620: 70 72 2a 2c 20 46 74 73 35 50 6f 73 6c 69 73 74  pr*, Fts5Poslist
5630: 50 6f 70 75 6c 61 74 6f 72 2a 2c 20 69 6e 74 2c  Populator*, int,
5640: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
5650: 74 0a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.);.void sqlite
5660: 33 46 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f  3Fts5ExprCheckPo
5670: 73 6c 69 73 74 73 28 46 74 73 35 45 78 70 72 2a  slists(Fts5Expr*
5680: 2c 20 69 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c  , i64);.void sql
5690: 69 74 65 33 46 74 73 35 45 78 70 72 43 6c 65 61  ite3Fts5ExprClea
56a0: 72 45 6f 66 28 46 74 73 35 45 78 70 72 2a 29 3b  rEof(Fts5Expr*);
56b0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
56c0: 35 45 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65  5ExprClonePhrase
56d0: 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46 74  (Fts5Config*, Ft
56e0: 73 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20 46 74  s5Expr*, int, Ft
56f0: 73 35 45 78 70 72 2a 2a 29 3b 0a 0a 69 6e 74 20  s5Expr**);..int 
5700: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50  sqlite3Fts5ExprP
5710: 68 72 61 73 65 43 6f 6c 6c 69 73 74 28 46 74 73  hraseCollist(Fts
5720: 35 45 78 70 72 20 2a 2c 20 69 6e 74 2c 20 63 6f  5Expr *, int, co
5730: 6e 73 74 20 75 38 20 2a 2a 2c 20 69 6e 74 20 2a  nst u8 **, int *
5740: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );../***********
5750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5770: 0a 2a 2a 20 54 68 65 20 66 74 73 35 5f 65 78 70  .** The fts5_exp
5780: 72 2e 63 20 41 50 49 20 61 62 6f 76 65 20 74 68  r.c API above th
5790: 69 73 20 70 6f 69 6e 74 20 69 73 20 75 73 65 64  is point is used
57a0: 20 62 79 20 74 68 65 20 6f 74 68 65 72 20 68 61   by the other ha
57b0: 6e 64 2d 77 72 69 74 74 65 6e 0a 2a 2a 20 43 20  nd-written.** C 
57c0: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 6d 6f 64  code in this mod
57d0: 75 6c 65 2e 20 54 68 65 20 69 6e 74 65 72 66 61  ule. The interfa
57e0: 63 65 73 20 62 65 6c 6f 77 20 74 68 69 73 20 70  ces below this p
57f0: 6f 69 6e 74 20 61 72 65 20 63 61 6c 6c 65 64 20  oint are called 
5800: 62 79 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 72  by.** the parser
5810: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 70 61 72   code in fts5par
5820: 73 65 2e 79 2e 20 20 2a 2f 0a 0a 76 6f 69 64 20  se.y.  */..void 
5830: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
5840: 45 72 72 6f 72 28 46 74 73 35 50 61 72 73 65 20  Error(Fts5Parse 
5850: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
5860: 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b  har *zFmt, ...);
5870: 0a 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  ..Fts5ExprNode *
5880: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
5890: 4e 6f 64 65 28 0a 20 20 46 74 73 35 50 61 72 73  Node(.  Fts5Pars
58a0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 69 6e 74  e *pParse,.  int
58b0: 20 65 54 79 70 65 2c 0a 20 20 46 74 73 35 45 78   eType,.  Fts5Ex
58c0: 70 72 4e 6f 64 65 20 2a 70 4c 65 66 74 2c 0a 20  prNode *pLeft,. 
58d0: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
58e0: 52 69 67 68 74 2c 0a 20 20 46 74 73 35 45 78 70  Right,.  Fts5Exp
58f0: 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 0a  rNearset *pNear.
5900: 29 3b 0a 0a 46 74 73 35 45 78 70 72 50 68 72 61  );..Fts5ExprPhra
5910: 73 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  se *sqlite3Fts5P
5920: 61 72 73 65 54 65 72 6d 28 0a 20 20 46 74 73 35  arseTerm(.  Fts5
5930: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
5940: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
5950: 20 2a 70 50 68 72 61 73 65 2c 20 0a 20 20 46 74   *pPhrase, .  Ft
5960: 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  s5Token *pToken,
5970: 0a 20 20 69 6e 74 20 62 50 72 65 66 69 78 0a 29  .  int bPrefix.)
5980: 3b 0a 0a 46 74 73 35 45 78 70 72 4e 65 61 72 73  ;..Fts5ExprNears
5990: 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  et *sqlite3Fts5P
59a0: 61 72 73 65 4e 65 61 72 73 65 74 28 0a 20 20 46  arseNearset(.  F
59b0: 74 73 35 50 61 72 73 65 2a 2c 20 0a 20 20 46 74  ts5Parse*, .  Ft
59c0: 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 0a  s5ExprNearset*,.
59d0: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
59e0: 2a 20 0a 29 3b 0a 0a 46 74 73 35 43 6f 6c 73 65  * .);..Fts5Colse
59f0: 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61  t *sqlite3Fts5Pa
5a00: 72 73 65 43 6f 6c 73 65 74 28 0a 20 20 46 74 73  rseColset(.  Fts
5a10: 35 50 61 72 73 65 2a 2c 20 0a 20 20 46 74 73 35  5Parse*, .  Fts5
5a20: 43 6f 6c 73 65 74 2a 2c 20 0a 20 20 46 74 73 35  Colset*, .  Fts5
5a30: 54 6f 6b 65 6e 20 2a 0a 29 3b 0a 0a 76 6f 69 64  Token *.);..void
5a40: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
5a50: 65 50 68 72 61 73 65 46 72 65 65 28 46 74 73 35  ePhraseFree(Fts5
5a60: 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0a 76 6f  ExprPhrase*);.vo
5a70: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
5a80: 72 73 65 4e 65 61 72 73 65 74 46 72 65 65 28 46  rseNearsetFree(F
5a90: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 29  ts5ExprNearset*)
5aa0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
5ab0: 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
5ac0: 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 3b 0a  Fts5ExprNode*);.
5ad0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
5ae0: 35 50 61 72 73 65 53 65 74 44 69 73 74 61 6e 63  5ParseSetDistanc
5af0: 65 28 46 74 73 35 50 61 72 73 65 2a 2c 20 46 74  e(Fts5Parse*, Ft
5b00: 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 20  s5ExprNearset*, 
5b10: 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a 76 6f 69  Fts5Token*);.voi
5b20: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
5b30: 73 65 53 65 74 43 6f 6c 73 65 74 28 46 74 73 35  seSetColset(Fts5
5b40: 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78 70 72  Parse*, Fts5Expr
5b50: 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35 43 6f  Nearset*, Fts5Co
5b60: 6c 73 65 74 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  lset*);.void sql
5b70: 69 74 65 33 46 74 73 35 50 61 72 73 65 46 69 6e  ite3Fts5ParseFin
5b80: 69 73 68 65 64 28 46 74 73 35 50 61 72 73 65 20  ished(Fts5Parse 
5b90: 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45 78 70  *pParse, Fts5Exp
5ba0: 72 4e 6f 64 65 20 2a 70 29 3b 0a 76 6f 69 64 20  rNode *p);.void 
5bb0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
5bc0: 4e 65 61 72 28 46 74 73 35 50 61 72 73 65 20 2a  Near(Fts5Parse *
5bd0: 70 50 61 72 73 65 2c 20 46 74 73 35 54 6f 6b 65  pParse, Fts5Toke
5be0: 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  n*);../*.** End 
5bf0: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
5c00: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 65 78 70  code in fts5_exp
5c10: 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  r.c..***********
5c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
5c60: 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..../***********
5c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
5cb0: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
5cc0: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 61 75 78  code in fts5_aux
5cd0: 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c  .c. .*/..int sql
5ce0: 69 74 65 33 46 74 73 35 41 75 78 49 6e 69 74 28  ite3Fts5AuxInit(
5cf0: 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a 2a  fts5_api*);./*.*
5d00: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
5d10: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
5d20: 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  s5_aux.c..******
5d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d70: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
5d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5dc0: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
5dd0: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
5de0: 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 20 0a 2a 2f  tokenizer.c. .*/
5df0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
5e00: 35 54 6f 6b 65 6e 69 7a 65 72 49 6e 69 74 28 66  5TokenizerInit(f
5e10: 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a 2a 2a  ts5_api*);./*.**
5e20: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
5e30: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
5e40: 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 0a 2a  5_tokenizer.c..*
5e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
5ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ee0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  *******.** Inter
5ef0: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
5f00: 66 74 73 35 5f 76 6f 63 61 62 2e 63 2e 20 0a 2a  fts5_vocab.c. .*
5f10: 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  /..int sqlite3Ft
5f20: 73 35 56 6f 63 61 62 49 6e 69 74 28 46 74 73 35  s5VocabInit(Fts5
5f30: 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65 33  Global*, sqlite3
5f40: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  *);../*.** End o
5f50: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
5f60: 6f 64 65 20 69 6e 20 66 74 73 35 5f 76 6f 63 61  ode in fts5_voca
5f70: 62 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  b.c..***********
5f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
5fc0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
5fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6010: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 61  * Interface to a
6020: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
6030: 65 72 61 74 65 64 20 63 6f 64 65 20 69 6e 20 66  erated code in f
6040: 74 73 35 5f 75 6e 69 63 6f 64 65 32 2e 63 2e 20  ts5_unicode2.c. 
6050: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
6060: 74 73 35 55 6e 69 63 6f 64 65 49 73 61 6c 6e 75  ts5UnicodeIsalnu
6070: 6d 28 69 6e 74 20 63 29 3b 0a 69 6e 74 20 73 71  m(int c);.int sq
6080: 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
6090: 49 73 64 69 61 63 72 69 74 69 63 28 69 6e 74 20  Isdiacritic(int 
60a0: 63 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  c);.int sqlite3F
60b0: 74 73 35 55 6e 69 63 6f 64 65 46 6f 6c 64 28 69  ts5UnicodeFold(i
60c0: 6e 74 20 63 2c 20 69 6e 74 20 62 52 65 6d 6f 76  nt c, int bRemov
60d0: 65 44 69 61 63 72 69 74 69 63 29 3b 0a 2f 2a 0a  eDiacritic);./*.
60e0: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
60f0: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
6100: 74 73 35 5f 75 6e 69 63 6f 64 65 32 2e 63 2e 0a  ts5_unicode2.c..
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e  **********/..#en
6160: 64 69 66 0a                                      dif.