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

Artifact 3a09b2eaeac2860d7afc59843796a9410f818ebf:


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 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
2be0: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65   iterator to ite
2bf0: 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20  rate though all 
2c00: 72 6f 77 69 64 73 20 74 68 61 74 20 6d 61 74 63  rowids that matc
2c10: 68 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66  h the .** specif
2c20: 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b  ied token or tok
2c30: 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e  en prefix..*/.in
2c40: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2c50: 65 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49  exQuery(.  Fts5I
2c60: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
2c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
2c80: 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79  S index to query
2c90: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2ca0: 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
2cb0: 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28  oken, /* Token (
2cc0: 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75  or prefix) to qu
2cd0: 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ery for */.  int
2ce0: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d00: 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
2d10: 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20  X_QUERY_X flags 
2d20: 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
2d30: 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
2d40: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68       /* Match th
2d50: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79  ese columns only
2d60: 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
2d70: 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20  ter **ppIter    
2d80: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
2d90: 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  w iterator objec
2da0: 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  t */.);../*.** T
2db0: 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61  he various opera
2dc0: 74 69 6f 6e 73 20 6f 6e 20 6f 70 65 6e 20 74 6f  tions on open to
2dd0: 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65  ken or token pre
2de0: 66 69 78 20 69 74 65 72 61 74 6f 72 73 20 6f 70  fix iterators op
2df0: 65 6e 65 64 0a 2a 2a 20 75 73 69 6e 67 20 73 71  ened.** using sq
2e00: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
2e10: 65 72 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ery()..*/.int sq
2e20: 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
2e30: 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29  (Fts5IndexIter*)
2e40: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
2e50: 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  5IterNext(Fts5In
2e60: 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20 73  dexIter*);.int s
2e70: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
2e80: 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78  xtFrom(Fts5Index
2e90: 49 74 65 72 2a 2c 20 69 36 34 20 69 4d 61 74 63  Iter*, i64 iMatc
2ea0: 68 29 3b 0a 69 36 34 20 73 71 6c 69 74 65 33 46  h);.i64 sqlite3F
2eb0: 74 73 35 49 74 65 72 52 6f 77 69 64 28 46 74 73  ts5IterRowid(Fts
2ec0: 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e  5IndexIter*);.in
2ed0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
2ee0: 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e 64  rPoslist(Fts5Ind
2ef0: 65 78 49 74 65 72 2a 2c 46 74 73 35 43 6f 6c 73  exIter*,Fts5Cols
2f00: 65 74 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2a 2c  et*, const u8**,
2f10: 20 69 6e 74 2a 2c 20 69 36 34 2a 29 3b 0a 69 6e   int*, i64*);.in
2f20: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
2f30: 72 50 6f 73 6c 69 73 74 42 75 66 66 65 72 28 46  rPoslistBuffer(F
2f40: 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
2f50: 74 65 72 2c 20 46 74 73 35 42 75 66 66 65 72 20  ter, Fts5Buffer 
2f60: 2a 70 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *pBuf);../*.** C
2f70: 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lose an iterator
2f80: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
2f90: 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
2fa0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2fb0: 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
2fc0: 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29  (Fts5IndexIter*)
2fd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  ;../*.** This in
2fe0: 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20  terface is used 
2ff0: 62 79 20 74 68 65 20 66 74 73 35 76 6f 63 61 62  by the fts5vocab
3000: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73   module..*/.cons
3010: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  t char *sqlite3F
3020: 74 73 35 49 74 65 72 54 65 72 6d 28 46 74 73 35  ts5IterTerm(Fts5
3030: 49 6e 64 65 78 49 74 65 72 2a 2c 20 69 6e 74 2a  IndexIter*, int*
3040: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
3050: 73 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46  s5IterNextScan(F
3060: 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a  ts5IndexIter*);.
3070: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f  ../*.** Insert o
3080: 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f  r remove data to
3090: 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   or from the ind
30a0: 65 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  ex. Each time a 
30b0: 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20  document is .** 
30c0: 61 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f  added to or remo
30d0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  ved from the ind
30e0: 65 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ex, this functio
30f0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20  n is called one 
3100: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73  or more.** times
3110: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ..**.** For an i
3120: 6e 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62  nsert, it must b
3130: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
3140: 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20  r each token in 
3150: 74 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74  the new document
3160: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72  ..** If the oper
3170: 61 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74  ation is a delet
3180: 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  e, it must be ca
3190: 6c 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29 20  lled (at least) 
31a0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  once for each.**
31b0: 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e   unique token in
31c0: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
31d0: 74 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65  th an iCol value
31e0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e   less than zero.
31f0: 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67   The iPos.** arg
3200: 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64  ument is ignored
3210: 20 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a   for a delete..*
3220: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3230: 35 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46  5IndexWrite(.  F
3240: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3260: 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65  * Index to write
3270: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   to */.  int iCo
3280: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
3290: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
32a0: 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73  mn token appears
32b0: 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65   in (-ve -> dele
32c0: 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f  te) */.  int iPo
32d0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
32e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
32f0: 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69  tion of token wi
3300: 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  thin column */. 
3310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
3320: 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20  ken, int nToken 
3330: 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64   /* Token to add
3340: 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72   or remove to or
3350: 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29   from index */.)
3360: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  ;../*.** Indicat
3370: 65 20 74 68 61 74 20 73 75 62 73 65 71 75 65 6e  e that subsequen
3380: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
3390: 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
33a0: 28 29 20 70 65 72 74 61 69 6e 20 74 6f 0a 2a 2a  () pertain to.**
33b0: 20 64 6f 63 75 6d 65 6e 74 20 69 44 6f 63 69 64   document iDocid
33c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33d0: 46 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72  Fts5IndexBeginWr
33e0: 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ite(.  Fts5Index
33f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
3400: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3410: 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
3420: 20 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 20 20   int bDelete,   
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 2f 2a 20 54 72 75 65 20 69 66 20 63 75 72 72   /* True if curr
3450: 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  ent operation is
3460: 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69   a delete */.  i
3470: 36 34 20 69 44 6f 63 69 64 20 20 20 20 20 20 20  64 iDocid       
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3490: 2a 20 44 6f 63 69 64 20 74 6f 20 61 64 64 20 6f  * Docid to add o
34a0: 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20 66 72  r remove data fr
34b0: 6f 6d 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  om */.);../*.** 
34c0: 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73  Flush any data s
34d0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
34e0: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
34f0: 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
3500: 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  se..** If the bC
3510: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
3520: 75 65 2c 20 61 6c 73 6f 20 63 6c 6f 73 65 20 61  ue, also close a
3530: 6e 79 20 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e  ny open blob han
3540: 64 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dles..*/.int sql
3550: 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e  ite3Fts5IndexSyn
3560: 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  c(Fts5Index *p, 
3570: 69 6e 74 20 62 43 6f 6d 6d 69 74 29 3b 0a 0a 2f  int bCommit);../
3580: 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79  *.** Discard any
3590: 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
35a0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
35b0: 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f  sh tables. Do no
35c0: 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f  t write it.** to
35d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
35e0: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73  dditionally, ass
35f0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ume that the con
3600: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64  tents of the %_d
3610: 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79  ata.** table may
3620: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e   have changed on
3630: 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e   disk. So any in
3640: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f  -memory caches o
3650: 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63  f %_data .** rec
3660: 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76  ords must be inv
3670: 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  alidated..*/.int
3680: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
3690: 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e  xRollback(Fts5In
36a0: 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20  dex *p);../*.** 
36b0: 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20 22  Get or set the "
36c0: 61 76 65 72 61 67 65 73 22 20 76 61 6c 75 65 73  averages" values
36d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36e0: 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65 72  Fts5IndexGetAver
36f0: 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ages(Fts5Index *
3700: 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69  p, i64 *pnRow, i
3710: 36 34 20 2a 61 6e 53 69 7a 65 29 3b 0a 69 6e 74  64 *anSize);.int
3720: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
3730: 78 53 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xSetAverages(Fts
3740: 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74  5Index *p, const
3750: 20 75 38 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a   u8*, int);../*.
3760: 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63 61 6c  ** Functions cal
3770: 6c 65 64 20 62 79 20 74 68 65 20 73 74 6f 72 61  led by the stora
3780: 67 65 20 6d 6f 64 75 6c 65 20 61 73 20 70 61 72  ge module as par
3790: 74 20 6f 66 20 69 6e 74 65 67 72 69 74 79 2d 63  t of integrity-c
37a0: 68 65 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  heck..*/.int sql
37b0: 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74  ite3Fts5IndexInt
37c0: 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35  egrityCheck(Fts5
37d0: 49 6e 64 65 78 2a 2c 20 75 36 34 20 63 6b 73 75  Index*, u64 cksu
37e0: 6d 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c  m);../* .** Call
37f0: 65 64 20 64 75 72 69 6e 67 20 76 69 72 74 75 61  ed during virtua
3800: 6c 20 6d 6f 64 75 6c 65 20 69 6e 69 74 69 61 6c  l module initial
3810: 69 7a 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73  ization to regis
3820: 74 65 72 20 55 44 46 20 0a 2a 2a 20 66 74 73 35  ter UDF .** fts5
3830: 5f 64 65 63 6f 64 65 28 29 20 77 69 74 68 20 53  _decode() with S
3840: 51 4c 69 74 65 20 0a 2a 2f 0a 69 6e 74 20 73 71  QLite .*/.int sq
3850: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
3860: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 69  it(sqlite3*);..i
3870: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
3880: 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73  dexSetCookie(Fts
3890: 35 49 6e 64 65 78 2a 2c 20 69 6e 74 29 3b 0a 0a  5Index*, int);..
38a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
38b0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
38c0: 20 65 6e 74 72 69 65 73 20 72 65 61 64 20 66 72   entries read fr
38d0: 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
38e0: 62 6c 65 20 62 79 20 0a 2a 2a 20 74 68 69 73 20  ble by .** this 
38f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
3900: 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e   it was created.
3910: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
3920: 74 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74  ts5IndexReads(Ft
3930: 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a 0a 69 6e  s5Index *p);..in
3940: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
3950: 65 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64  exReinit(Fts5Ind
3960: 65 78 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69  ex *p);.int sqli
3970: 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69  te3Fts5IndexOpti
3980: 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a  mize(Fts5Index *
3990: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
39a0: 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74  ts5IndexMerge(Ft
39b0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
39c0: 6e 4d 65 72 67 65 29 3b 0a 0a 69 6e 74 20 73 71  nMerge);..int sq
39d0: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f  lite3Fts5IndexLo
39e0: 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64  adConfig(Fts5Ind
39f0: 65 78 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c  ex *p);..int sql
3a00: 69 74 65 33 46 74 73 35 49 74 65 72 43 6f 6c 6c  ite3Fts5IterColl
3a10: 69 73 74 28 46 74 73 35 49 6e 64 65 78 49 74 65  ist(Fts5IndexIte
3a20: 72 2a 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 2c  r*, const u8 **,
3a30: 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45   int*);../*.** E
3a40: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
3a50: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
3a60: 69 6e 64 65 78 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  index.c..*******
3a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ab0: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
3ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b00: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
3b10: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 76  o code in fts5_v
3b20: 61 72 69 6e 74 2e 63 2e 20 0a 2a 2f 0a 69 6e 74  arint.c. .*/.int
3b30: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
3b40: 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e  arint32(const un
3b50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20  signed char *p, 
3b60: 75 33 32 20 2a 76 29 3b 0a 69 6e 74 20 73 71 6c  u32 *v);.int sql
3b70: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
3b80: 74 4c 65 6e 28 75 33 32 20 69 56 61 6c 29 3b 0a  tLen(u32 iVal);.
3b90: 75 38 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  u8 sqlite3Fts5Ge
3ba0: 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 20 75 6e  tVarint(const un
3bb0: 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 75 36  signed char*, u6
3bc0: 34 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  4*);.int sqlite3
3bd0: 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 75 6e  Fts5PutVarint(un
3be0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20  signed char *p, 
3bf0: 75 36 34 20 76 29 3b 0a 0a 23 64 65 66 69 6e 65  u64 v);..#define
3c00: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
3c10: 28 61 2c 62 29 20 73 71 6c 69 74 65 33 46 74 73  (a,b) sqlite3Fts
3c20: 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 28  5GetVarint32(a,(
3c30: 75 33 32 2a 29 26 62 29 0a 23 64 65 66 69 6e 65  u32*)&b).#define
3c40: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 20 20   fts5GetVarint  
3c50: 20 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74    sqlite3Fts5Get
3c60: 56 61 72 69 6e 74 0a 0a 23 64 65 66 69 6e 65 20  Varint..#define 
3c70: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
3c80: 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 56 61  t32(a, iOff, nVa
3c90: 6c 29 20 7b 20 20 20 20 20 20 5c 0a 20 20 6e 56  l) {      \.  nV
3ca0: 61 6c 20 3d 20 28 61 29 5b 69 4f 66 66 2b 2b 5d  al = (a)[iOff++]
3cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
3cd0: 20 20 69 66 28 20 6e 56 61 6c 20 26 20 30 78 38    if( nVal & 0x8
3ce0: 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 5c 0a 20 20 20 20 69 4f 66 66 2d 2d 3b 20    \.    iOff--; 
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 20 20 20 20 20 5c 0a 20 20 20 20 69 4f 66 66        \.    iOff
3d40: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
3d50: 74 33 32 28 26 28 61 29 5b 69 4f 66 66 5d 2c 20  t32(&(a)[iOff], 
3d60: 6e 56 61 6c 29 3b 20 20 20 20 5c 0a 20 20 7d 20  nVal);    \.  } 
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
3da0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  }.../*.** End of
3db0: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   interface to co
3dc0: 64 65 20 69 6e 20 66 74 73 35 5f 76 61 72 69 6e  de in fts5_varin
3dd0: 74 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.c..***********
3de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
3e20: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
3e70: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63  * Interface to c
3e80: 6f 64 65 20 69 6e 20 66 74 73 35 2e 63 2e 20 0a  ode in fts5.c. .
3e90: 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  */..int sqlite3F
3ea0: 74 73 35 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28  ts5GetTokenizer(
3eb0: 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20  .  Fts5Global*, 
3ec0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
3ed0: 61 7a 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72  azArg,.  int nAr
3ee0: 67 2c 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  g,.  Fts5Tokeniz
3ef0: 65 72 2a 2a 2c 0a 20 20 66 74 73 35 5f 74 6f 6b  er**,.  fts5_tok
3f00: 65 6e 69 7a 65 72 2a 2a 2c 0a 20 20 63 68 61 72  enizer**,.  char
3f10: 20 2a 2a 70 7a 45 72 72 0a 29 3b 0a 0a 46 74 73   **pzErr.);..Fts
3f20: 35 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  5Index *sqlite3F
3f30: 74 73 35 49 6e 64 65 78 46 72 6f 6d 43 73 72 69  ts5IndexFromCsri
3f40: 64 28 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 69  d(Fts5Global*, i
3f50: 36 34 2c 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  64, Fts5Config *
3f60: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  *);../*.** End o
3f70: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
3f80: 6f 64 65 20 69 6e 20 66 74 73 35 2e 63 2e 0a 2a  ode in fts5.c..*
3f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fc0: 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 2a  ****************
4010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4020: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  *******.** Inter
4030: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
4040: 66 74 73 35 5f 68 61 73 68 2e 63 2e 20 0a 2a 2f  fts5_hash.c. .*/
4050: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
4060: 46 74 73 35 48 61 73 68 20 46 74 73 35 48 61 73  Fts5Hash Fts5Has
4070: 68 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h;../*.** Create
4080: 20 61 20 68 61 73 68 20 74 61 62 6c 65 2c 20 66   a hash table, f
4090: 72 65 65 20 61 20 68 61 73 68 20 74 61 62 6c 65  ree a hash table
40a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
40b0: 46 74 73 35 48 61 73 68 4e 65 77 28 46 74 73 35  Fts5HashNew(Fts5
40c0: 43 6f 6e 66 69 67 2a 2c 20 46 74 73 35 48 61 73  Config*, Fts5Has
40d0: 68 2a 2a 2c 20 69 6e 74 20 2a 70 6e 53 69 7a 65  h**, int *pnSize
40e0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
40f0: 74 73 35 48 61 73 68 46 72 65 65 28 46 74 73 35  ts5HashFree(Fts5
4100: 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  Hash*);..int sql
4110: 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
4120: 65 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 0a  e(.  Fts5Hash*,.
4130: 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
4160: 68 69 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  his entry */.  i
4170: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4190: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
41a0: 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
41b0: 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
41c0: 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41e0: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
41f0: 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
4200: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 62 42 79 74  n */.  char bByt
4210: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
4220: 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
4230: 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
4240: 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
4250: 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
4260: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70  */.);../*.** Emp
4270: 74 79 20 28 62 75 74 20 64 6f 20 6e 6f 74 20 64  ty (but do not d
4280: 65 6c 65 74 65 29 20 61 20 68 61 73 68 20 74 61  elete) a hash ta
4290: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
42a0: 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
42b0: 72 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 0a 69  r(Fts5Hash*);..i
42c0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  nt sqlite3Fts5Ha
42d0: 73 68 51 75 65 72 79 28 0a 20 20 46 74 73 35 48  shQuery(.  Fts5H
42e0: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
42f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
4300: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
4310: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
4320: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
4330: 65 72 6d 2c 20 20 20 2f 2a 20 51 75 65 72 79 20  erm,   /* Query 
4340: 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
4350: 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20  u8 **ppDoclist, 
4360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
4370: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  : Pointer to doc
4380: 6c 69 73 74 20 66 6f 72 20 70 54 65 72 6d 20 2a  list for pTerm *
4390: 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69  /.  int *pnDocli
43a0: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
43b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
43c0: 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
43d0: 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a 69 6e 74 20  ytes */.);..int 
43e0: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
43f0: 63 61 6e 49 6e 69 74 28 0a 20 20 46 74 73 35 48  canInit(.  Fts5H
4400: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
4410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
4420: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
4430: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
4440: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
4450: 65 72 6d 20 20 20 20 2f 2a 20 51 75 65 72 79 20  erm    /* Query 
4460: 70 72 65 66 69 78 20 2a 2f 0a 29 3b 0a 76 6f 69  prefix */.);.voi
4470: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
4480: 68 53 63 61 6e 4e 65 78 74 28 46 74 73 35 48 61  hScanNext(Fts5Ha
4490: 73 68 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  sh*);.int sqlite
44a0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
44b0: 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 76 6f 69  (Fts5Hash*);.voi
44c0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
44d0: 68 53 63 61 6e 45 6e 74 72 79 28 46 74 73 35 48  hScanEntry(Fts5H
44e0: 61 73 68 20 2a 2c 0a 20 20 63 6f 6e 73 74 20 63  ash *,.  const c
44f0: 68 61 72 20 2a 2a 70 7a 54 65 72 6d 2c 20 20 20  har **pzTerm,   
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4510: 20 74 65 72 6d 20 28 6e 75 6c 2d 74 65 72 6d 69   term (nul-termi
4520: 6e 61 74 65 64 29 20 2a 2f 0a 20 20 63 6f 6e 73  nated) */.  cons
4530: 74 20 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74  t u8 **ppDoclist
4540: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
4550: 55 54 3a 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  UT: pointer to d
4560: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
4570: 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20  *pnDoclist      
4580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4590: 55 54 3a 20 73 69 7a 65 20 6f 66 20 64 6f 63 6c  UT: size of docl
45a0: 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
45b0: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  );.../*.** End o
45c0: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
45d0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61 73 68  ode in fts5_hash
45e0: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
45f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4630: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
4680: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
4690: 65 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67  e in fts5_storag
46a0: 65 2e 63 2e 20 66 74 73 35 5f 73 74 6f 72 61 67  e.c. fts5_storag
46b0: 65 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e  e.c contains con
46c0: 74 61 69 6e 73 20 0a 2a 2a 20 63 6f 64 65 20 74  tains .** code t
46d0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
46e0: 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
46f0: 25 5f 63 6f 6e 74 65 6e 74 20 61 6e 64 20 25 5f  %_content and %_
4700: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 73 2e 0a  docsize tables..
4710: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
4720: 5f 53 54 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20  _STMT_SCAN_ASC  
4730: 30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  0     /* SELECT 
4740: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
4750: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 41 53 43  . ORDER BY 1 ASC
4760: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
4770: 5f 53 54 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20  _STMT_SCAN_DESC 
4780: 31 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  1     /* SELECT 
4790: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
47a0: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 44 45 53  . ORDER BY 1 DES
47b0: 43 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  C */.#define FTS
47c0: 35 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20  5_STMT_LOOKUP   
47d0: 20 32 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54   2     /* SELECT
47e0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e   rowid, * FROM .
47f0: 2e 2e 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f  .. WHERE rowid=?
4800: 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
4810: 75 63 74 20 46 74 73 35 53 74 6f 72 61 67 65 20  uct Fts5Storage 
4820: 46 74 73 35 53 74 6f 72 61 67 65 3b 0a 0a 69 6e  Fts5Storage;..in
4830: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
4840: 72 61 67 65 4f 70 65 6e 28 46 74 73 35 43 6f 6e  rageOpen(Fts5Con
4850: 66 69 67 2a 2c 20 46 74 73 35 49 6e 64 65 78 2a  fig*, Fts5Index*
4860: 2c 20 69 6e 74 2c 20 46 74 73 35 53 74 6f 72 61  , int, Fts5Stora
4870: 67 65 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69  ge**, char**);.i
4880: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4890: 6f 72 61 67 65 43 6c 6f 73 65 28 46 74 73 35 53  orageClose(Fts5S
48a0: 74 6f 72 61 67 65 20 2a 70 29 3b 0a 69 6e 74 20  torage *p);.int 
48b0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
48c0: 67 65 52 65 6e 61 6d 65 28 46 74 73 35 53 74 6f  geRename(Fts5Sto
48d0: 72 61 67 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  rage*, const cha
48e0: 72 20 2a 7a 4e 61 6d 65 29 3b 0a 0a 69 6e 74 20  r *zName);..int 
48f0: 73 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70 41  sqlite3Fts5DropA
4900: 6c 6c 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b  ll(Fts5Config*);
4910: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4920: 43 72 65 61 74 65 54 61 62 6c 65 28 46 74 73 35  CreateTable(Fts5
4930: 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63  Config*, const c
4940: 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  har*, const char
4950: 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2a 29  *, int, char **)
4960: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
4970: 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 28  s5StorageDelete(
4980: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4990: 69 36 34 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  i64);.int sqlite
49a0: 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 74  3Fts5StorageCont
49b0: 65 6e 74 49 6e 73 65 72 74 28 46 74 73 35 53 74  entInsert(Fts5St
49c0: 6f 72 61 67 65 20 2a 70 2c 20 73 71 6c 69 74 65  orage *p, sqlite
49d0: 33 5f 76 61 6c 75 65 2a 2a 2c 20 69 36 34 2a 29  3_value**, i64*)
49e0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
49f0: 35 53 74 6f 72 61 67 65 49 6e 64 65 78 49 6e 73  5StorageIndexIns
4a00: 65 72 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  ert(Fts5Storage 
4a10: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  *p, sqlite3_valu
4a20: 65 2a 2a 2c 20 69 36 34 29 3b 0a 0a 69 6e 74 20  e**, i64);..int 
4a30: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4a40: 67 65 49 6e 74 65 67 72 69 74 79 28 46 74 73 35  geIntegrity(Fts5
4a50: 53 74 6f 72 61 67 65 20 2a 70 29 3b 0a 0a 69 6e  Storage *p);..in
4a60: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
4a70: 72 61 67 65 53 74 6d 74 28 46 74 73 35 53 74 6f  rageStmt(Fts5Sto
4a80: 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 65 53 74  rage *p, int eSt
4a90: 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  mt, sqlite3_stmt
4aa0: 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 76 6f 69  **, char**);.voi
4ab0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  d sqlite3Fts5Sto
4ac0: 72 61 67 65 53 74 6d 74 52 65 6c 65 61 73 65 28  rageStmtRelease(
4ad0: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4ae0: 69 6e 74 20 65 53 74 6d 74 2c 20 73 71 6c 69 74  int eStmt, sqlit
4af0: 65 33 5f 73 74 6d 74 2a 29 3b 0a 0a 69 6e 74 20  e3_stmt*);..int 
4b00: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4b10: 67 65 44 6f 63 73 69 7a 65 28 46 74 73 35 53 74  geDocsize(Fts5St
4b20: 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 20 69 52  orage *p, i64 iR
4b30: 6f 77 69 64 2c 20 69 6e 74 20 2a 61 43 6f 6c 29  owid, int *aCol)
4b40: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4b50: 35 53 74 6f 72 61 67 65 53 69 7a 65 28 46 74 73  5StorageSize(Fts
4b60: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74  5Storage *p, int
4b70: 20 69 43 6f 6c 2c 20 69 36 34 20 2a 70 6e 41 76   iCol, i64 *pnAv
4b80: 67 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  g);.int sqlite3F
4b90: 74 73 35 53 74 6f 72 61 67 65 52 6f 77 43 6f 75  ts5StorageRowCou
4ba0: 6e 74 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  nt(Fts5Storage *
4bb0: 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 29 3b 0a  p, i64 *pnRow);.
4bc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4bd0: 53 74 6f 72 61 67 65 53 79 6e 63 28 46 74 73 35  StorageSync(Fts5
4be0: 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20  Storage *p, int 
4bf0: 62 43 6f 6d 6d 69 74 29 3b 0a 69 6e 74 20 73 71  bCommit);.int sq
4c00: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
4c10: 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 53 74 6f  Rollback(Fts5Sto
4c20: 72 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73  rage *p);..int s
4c30: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
4c40: 65 43 6f 6e 66 69 67 56 61 6c 75 65 28 0a 20 20  eConfigValue(.  
4c50: 20 20 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70    Fts5Storage *p
4c60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73  , const char*, s
4c70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 69  qlite3_value*, i
4c80: 6e 74 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  nt.);..int sqlit
4c90: 65 33 46 74 73 35 53 74 6f 72 61 67 65 53 70 65  e3Fts5StorageSpe
4ca0: 63 69 61 6c 44 65 6c 65 74 65 28 46 74 73 35 53  cialDelete(Fts5S
4cb0: 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 20 69  torage *p, i64 i
4cc0: 44 65 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Del, sqlite3_val
4cd0: 75 65 2a 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  ue**);..int sqli
4ce0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 65  te3Fts5StorageDe
4cf0: 6c 65 74 65 41 6c 6c 28 46 74 73 35 53 74 6f 72  leteAll(Fts5Stor
4d00: 61 67 65 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c  age *p);.int sql
4d10: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
4d20: 65 62 75 69 6c 64 28 46 74 73 35 53 74 6f 72 61  ebuild(Fts5Stora
4d30: 67 65 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69  ge *p);.int sqli
4d40: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4f 70  te3Fts5StorageOp
4d50: 74 69 6d 69 7a 65 28 46 74 73 35 53 74 6f 72 61  timize(Fts5Stora
4d60: 67 65 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69  ge *p);.int sqli
4d70: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4d 65  te3Fts5StorageMe
4d80: 72 67 65 28 46 74 73 35 53 74 6f 72 61 67 65 20  rge(Fts5Storage 
4d90: 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 3b  *p, int nMerge);
4da0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
4db0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
4dc0: 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67 65   in fts5_storage
4dd0: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
4de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4e20: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
4e70: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
4e80: 64 65 20 69 6e 20 66 74 73 35 5f 65 78 70 72 2e  de in fts5_expr.
4e90: 63 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  c. .*/.typedef s
4ea0: 74 72 75 63 74 20 46 74 73 35 45 78 70 72 20 46  truct Fts5Expr F
4eb0: 74 73 35 45 78 70 72 3b 0a 74 79 70 65 64 65 66  ts5Expr;.typedef
4ec0: 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72   struct Fts5Expr
4ed0: 4e 6f 64 65 20 46 74 73 35 45 78 70 72 4e 6f 64  Node Fts5ExprNod
4ee0: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
4ef0: 74 20 46 74 73 35 50 61 72 73 65 20 46 74 73 35  t Fts5Parse Fts5
4f00: 50 61 72 73 65 3b 0a 74 79 70 65 64 65 66 20 73  Parse;.typedef s
4f10: 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e 20  truct Fts5Token 
4f20: 46 74 73 35 54 6f 6b 65 6e 3b 0a 74 79 70 65 64  Fts5Token;.typed
4f30: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 45 78  ef struct Fts5Ex
4f40: 70 72 50 68 72 61 73 65 20 46 74 73 35 45 78 70  prPhrase Fts5Exp
4f50: 72 50 68 72 61 73 65 3b 0a 74 79 70 65 64 65 66  rPhrase;.typedef
4f60: 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72   struct Fts5Expr
4f70: 4e 65 61 72 73 65 74 20 46 74 73 35 45 78 70 72  Nearset Fts5Expr
4f80: 4e 65 61 72 73 65 74 3b 0a 0a 73 74 72 75 63 74  Nearset;..struct
4f90: 20 46 74 73 35 54 6f 6b 65 6e 20 7b 0a 20 20 63   Fts5Token {.  c
4fa0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 20 20 20  onst char *p;   
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4fc0: 2a 20 54 6f 6b 65 6e 20 74 65 78 74 20 28 6e 6f  * Token text (no
4fd0: 74 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65  t NULL terminate
4fe0: 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  d) */.  int n;  
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
5010: 6f 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62  of buffer p in b
5020: 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50  ytes */.};../* P
5030: 61 72 73 65 20 61 20 4d 41 54 43 48 20 65 78 70  arse a MATCH exp
5040: 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 69 6e 74 20  ression. */.int 
5050: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e  sqlite3Fts5ExprN
5060: 65 77 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  ew(.  Fts5Config
5070: 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 63 6f   *pConfig, .  co
5080: 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c  nst char *zExpr,
5090: 0a 20 20 46 74 73 35 45 78 70 72 20 2a 2a 70 70  .  Fts5Expr **pp
50a0: 4e 65 77 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  New, .  char **p
50b0: 7a 45 72 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66  zErr.);../*.** f
50c0: 6f 72 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46  or(rc = sqlite3F
50d0: 74 73 35 45 78 70 72 46 69 72 73 74 28 70 45 78  ts5ExprFirst(pEx
50e0: 70 72 2c 20 70 49 64 78 2c 20 62 44 65 73 63 29  pr, pIdx, bDesc)
50f0: 3b 0a 2a 2a 20 20 20 20 20 72 63 3d 3d 53 51 4c  ;.**     rc==SQL
5100: 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
5110: 69 74 65 33 46 74 73 35 45 78 70 72 45 6f 66 28  ite3Fts5ExprEof(
5120: 70 45 78 70 72 29 3b 0a 2a 2a 20 20 20 20 20 72  pExpr);.**     r
5130: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  c = sqlite3Fts5E
5140: 78 70 72 4e 65 78 74 28 70 45 78 70 72 29 0a 2a  xprNext(pExpr).*
5150: 2a 20 29 7b 0a 2a 2a 20 20 20 2f 2f 20 54 68 65  * ){.**   // The
5160: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72   document with r
5170: 6f 77 69 64 20 69 52 6f 77 69 64 20 6d 61 74 63  owid iRowid matc
5180: 68 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  hes the expressi
5190: 6f 6e 21 0a 2a 2a 20 20 20 69 36 34 20 69 52 6f  on!.**   i64 iRo
51a0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73  wid = sqlite3Fts
51b0: 35 45 78 70 72 52 6f 77 69 64 28 70 45 78 70 72  5ExprRowid(pExpr
51c0: 29 3b 0a 2a 2a 20 7d 0a 2a 2f 0a 69 6e 74 20 73  );.** }.*/.int s
51d0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 69  qlite3Fts5ExprFi
51e0: 72 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20 46  rst(Fts5Expr*, F
51f0: 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  ts5Index *pIdx, 
5200: 69 36 34 20 69 4d 69 6e 2c 20 69 6e 74 20 62 44  i64 iMin, int bD
5210: 65 73 63 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  esc);.int sqlite
5220: 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 46 74  3Fts5ExprNext(Ft
5230: 73 35 45 78 70 72 2a 2c 20 69 36 34 20 69 4d 61  s5Expr*, i64 iMa
5240: 78 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  x);.int sqlite3F
5250: 74 73 35 45 78 70 72 45 6f 66 28 46 74 73 35 45  ts5ExprEof(Fts5E
5260: 78 70 72 2a 29 3b 0a 69 36 34 20 73 71 6c 69 74  xpr*);.i64 sqlit
5270: 65 33 46 74 73 35 45 78 70 72 52 6f 77 69 64 28  e3Fts5ExprRowid(
5280: 46 74 73 35 45 78 70 72 2a 29 3b 0a 0a 76 6f 69  Fts5Expr*);..voi
5290: 64 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  d sqlite3Fts5Exp
52a0: 72 46 72 65 65 28 46 74 73 35 45 78 70 72 2a 29  rFree(Fts5Expr*)
52b0: 3b 0a 0a 2f 2a 20 43 61 6c 6c 65 64 20 64 75 72  ;../* Called dur
52c0: 69 6e 67 20 73 74 61 72 74 75 70 20 74 6f 20 72  ing startup to r
52d0: 65 67 69 73 74 65 72 20 61 20 55 44 46 20 77 69  egister a UDF wi
52e0: 74 68 20 53 51 4c 69 74 65 20 2a 2f 0a 69 6e 74  th SQLite */.int
52f0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
5300: 49 6e 69 74 28 46 74 73 35 47 6c 6f 62 61 6c 2a  Init(Fts5Global*
5310: 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e  , sqlite3*);..in
5320: 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
5330: 72 50 68 72 61 73 65 43 6f 75 6e 74 28 46 74 73  rPhraseCount(Fts
5340: 35 45 78 70 72 2a 29 3b 0a 69 6e 74 20 73 71 6c  5Expr*);.int sql
5350: 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61  ite3Fts5ExprPhra
5360: 73 65 53 69 7a 65 28 46 74 73 35 45 78 70 72 2a  seSize(Fts5Expr*
5370: 2c 20 69 6e 74 20 69 50 68 72 61 73 65 29 3b 0a  , int iPhrase);.
5380: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
5390: 78 70 72 50 6f 73 6c 69 73 74 28 46 74 73 35 45  xprPoslist(Fts5E
53a0: 78 70 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74  xpr*, int, const
53b0: 20 75 38 20 2a 2a 29 3b 0a 0a 74 79 70 65 64 65   u8 **);..typede
53c0: 66 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73  f struct Fts5Pos
53d0: 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 20 46 74  listPopulator Ft
53e0: 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74  s5PoslistPopulat
53f0: 6f 72 3b 0a 46 74 73 35 50 6f 73 6c 69 73 74 50  or;.Fts5PoslistP
5400: 6f 70 75 6c 61 74 6f 72 20 2a 73 71 6c 69 74 65  opulator *sqlite
5410: 33 46 74 73 35 45 78 70 72 43 6c 65 61 72 50 6f  3Fts5ExprClearPo
5420: 73 6c 69 73 74 73 28 46 74 73 35 45 78 70 72 2a  slists(Fts5Expr*
5430: 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69  , int);.int sqli
5440: 74 65 33 46 74 73 35 45 78 70 72 50 6f 70 75 6c  te3Fts5ExprPopul
5450: 61 74 65 50 6f 73 6c 69 73 74 73 28 0a 20 20 20  atePoslists(.   
5460: 20 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46 74   Fts5Config*, Ft
5470: 73 35 45 78 70 72 2a 2c 20 46 74 73 35 50 6f 73  s5Expr*, Fts5Pos
5480: 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 2a 2c 20  listPopulator*, 
5490: 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  int, const char*
54a0: 2c 20 69 6e 74 0a 29 3b 0a 76 6f 69 64 20 73 71  , int.);.void sq
54b0: 6c 69 74 65 33 46 74 73 35 45 78 70 72 43 68 65  lite3Fts5ExprChe
54c0: 63 6b 50 6f 73 6c 69 73 74 73 28 46 74 73 35 45  ckPoslists(Fts5E
54d0: 78 70 72 2a 2c 20 69 36 34 29 3b 0a 76 6f 69 64  xpr*, i64);.void
54e0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
54f0: 43 6c 65 61 72 45 6f 66 28 46 74 73 35 45 78 70  ClearEof(Fts5Exp
5500: 72 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  r*);..int sqlite
5510: 33 46 74 73 35 45 78 70 72 43 6c 6f 6e 65 50 68  3Fts5ExprClonePh
5520: 72 61 73 65 28 46 74 73 35 43 6f 6e 66 69 67 2a  rase(Fts5Config*
5530: 2c 20 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74  , Fts5Expr*, int
5540: 2c 20 46 74 73 35 45 78 70 72 2a 2a 29 3b 0a 0a  , Fts5Expr**);..
5550: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
5560: 78 70 72 50 68 72 61 73 65 43 6f 6c 6c 69 73 74  xprPhraseCollist
5570: 28 46 74 73 35 45 78 70 72 20 2a 2c 20 69 6e 74  (Fts5Expr *, int
5580: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 2c 20 69  , const u8 **, i
5590: 6e 74 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  nt *);../*******
55a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55c0: 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 74 73 35  ****.** The fts5
55d0: 5f 65 78 70 72 2e 63 20 41 50 49 20 61 62 6f 76  _expr.c API abov
55e0: 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  e this point is 
55f0: 75 73 65 64 20 62 79 20 74 68 65 20 6f 74 68 65  used by the othe
5600: 72 20 68 61 6e 64 2d 77 72 69 74 74 65 6e 0a 2a  r hand-written.*
5610: 2a 20 43 20 63 6f 64 65 20 69 6e 20 74 68 69 73  * C code in this
5620: 20 6d 6f 64 75 6c 65 2e 20 54 68 65 20 69 6e 74   module. The int
5630: 65 72 66 61 63 65 73 20 62 65 6c 6f 77 20 74 68  erfaces below th
5640: 69 73 20 70 6f 69 6e 74 20 61 72 65 20 63 61 6c  is point are cal
5650: 6c 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61  led by.** the pa
5660: 72 73 65 72 20 63 6f 64 65 20 69 6e 20 66 74 73  rser code in fts
5670: 35 70 61 72 73 65 2e 79 2e 20 20 2a 2f 0a 0a 76  5parse.y.  */..v
5680: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
5690: 61 72 73 65 45 72 72 6f 72 28 46 74 73 35 50 61  arseError(Fts5Pa
56a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
56b0: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
56c0: 2e 2e 29 3b 0a 0a 46 74 73 35 45 78 70 72 4e 6f  ..);..Fts5ExprNo
56d0: 64 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  de *sqlite3Fts5P
56e0: 61 72 73 65 4e 6f 64 65 28 0a 20 20 46 74 73 35  arseNode(.  Fts5
56f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
5700: 20 69 6e 74 20 65 54 79 70 65 2c 0a 20 20 46 74   int eType,.  Ft
5710: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4c 65 66  s5ExprNode *pLef
5720: 74 2c 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  t,.  Fts5ExprNod
5730: 65 20 2a 70 52 69 67 68 74 2c 0a 20 20 46 74 73  e *pRight,.  Fts
5740: 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e  5ExprNearset *pN
5750: 65 61 72 0a 29 3b 0a 0a 46 74 73 35 45 78 70 72  ear.);..Fts5Expr
5760: 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65 33 46  Phrase *sqlite3F
5770: 74 73 35 50 61 72 73 65 54 65 72 6d 28 0a 20 20  ts5ParseTerm(.  
5780: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
5790: 65 2c 20 0a 20 20 46 74 73 35 45 78 70 72 50 68  e, .  Fts5ExprPh
57a0: 72 61 73 65 20 2a 70 50 68 72 61 73 65 2c 20 0a  rase *pPhrase, .
57b0: 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f    Fts5Token *pTo
57c0: 6b 65 6e 2c 0a 20 20 69 6e 74 20 62 50 72 65 66  ken,.  int bPref
57d0: 69 78 0a 29 3b 0a 0a 46 74 73 35 45 78 70 72 4e  ix.);..Fts5ExprN
57e0: 65 61 72 73 65 74 20 2a 73 71 6c 69 74 65 33 46  earset *sqlite3F
57f0: 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 28  ts5ParseNearset(
5800: 0a 20 20 46 74 73 35 50 61 72 73 65 2a 2c 20 0a  .  Fts5Parse*, .
5810: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
5820: 74 2a 2c 0a 20 20 46 74 73 35 45 78 70 72 50 68  t*,.  Fts5ExprPh
5830: 72 61 73 65 2a 20 0a 29 3b 0a 0a 46 74 73 35 43  rase* .);..Fts5C
5840: 6f 6c 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74  olset *sqlite3Ft
5850: 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28 0a 20  s5ParseColset(. 
5860: 20 46 74 73 35 50 61 72 73 65 2a 2c 20 0a 20 20   Fts5Parse*, .  
5870: 46 74 73 35 43 6f 6c 73 65 74 2a 2c 20 0a 20 20  Fts5Colset*, .  
5880: 46 74 73 35 54 6f 6b 65 6e 20 2a 0a 29 3b 0a 0a  Fts5Token *.);..
5890: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
58a0: 50 61 72 73 65 50 68 72 61 73 65 46 72 65 65 28  ParsePhraseFree(
58b0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29  Fts5ExprPhrase*)
58c0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
58d0: 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72  s5ParseNearsetFr
58e0: 65 65 28 46 74 73 35 45 78 70 72 4e 65 61 72 73  ee(Fts5ExprNears
58f0: 65 74 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  et*);.void sqlit
5900: 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46  e3Fts5ParseNodeF
5910: 72 65 65 28 46 74 73 35 45 78 70 72 4e 6f 64 65  ree(Fts5ExprNode
5920: 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  *);..void sqlite
5930: 33 46 74 73 35 50 61 72 73 65 53 65 74 44 69 73  3Fts5ParseSetDis
5940: 74 61 6e 63 65 28 46 74 73 35 50 61 72 73 65 2a  tance(Fts5Parse*
5950: 2c 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  , Fts5ExprNearse
5960: 74 2a 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b  t*, Fts5Token*);
5970: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
5980: 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28  5ParseSetColset(
5990: 46 74 73 35 50 61 72 73 65 2a 2c 20 46 74 73 35  Fts5Parse*, Fts5
59a0: 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 20 46 74  ExprNearset*, Ft
59b0: 73 35 43 6f 6c 73 65 74 2a 29 3b 0a 76 6f 69 64  s5Colset*);.void
59c0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
59d0: 65 46 69 6e 69 73 68 65 64 28 46 74 73 35 50 61  eFinished(Fts5Pa
59e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73  rse *pParse, Fts
59f0: 35 45 78 70 72 4e 6f 64 65 20 2a 70 29 3b 0a 76  5ExprNode *p);.v
5a00: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
5a10: 61 72 73 65 4e 65 61 72 28 46 74 73 35 50 61 72  arseNear(Fts5Par
5a20: 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35  se *pParse, Fts5
5a30: 54 6f 6b 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  Token*);../*.** 
5a40: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
5a50: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
5a60: 5f 65 78 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  _expr.c..*******
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ab0: 2a 2a 2a 2f 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ***/..../*******
5ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b00: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
5b10: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
5b20: 5f 61 75 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74  _aux.c. .*/..int
5b30: 20 73 71 6c 69 74 65 33 46 74 73 35 41 75 78 49   sqlite3Fts5AuxI
5b40: 6e 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a  nit(fts5_api*);.
5b50: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
5b60: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
5b70: 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a  n fts5_aux.c..**
5b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
5c20: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
5c30: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e  ts5_tokenizer.c.
5c40: 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65   .*/..int sqlite
5c50: 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e  3Fts5TokenizerIn
5c60: 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f  it(fts5_api*);./
5c70: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
5c80: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
5c90: 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e   fts5_tokenizer.
5ca0: 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c..*************
5cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
5cf0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
5d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49  ***********.** I
5d40: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
5d50: 20 69 6e 20 66 74 73 35 5f 76 6f 63 61 62 2e 63   in fts5_vocab.c
5d60: 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74  . .*/..int sqlit
5d70: 65 33 46 74 73 35 56 6f 63 61 62 49 6e 69 74 28  e3Fts5VocabInit(
5d80: 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c  Fts5Global*, sql
5d90: 69 74 65 33 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45  ite3*);../*.** E
5da0: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
5db0: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
5dc0: 76 6f 63 61 62 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  vocab.c..*******
5dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e10: 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
5e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e60: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
5e70: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
5e80: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
5e90: 69 6e 20 66 74 73 35 5f 75 6e 69 63 6f 64 65 32  in fts5_unicode2
5ea0: 2e 63 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  .c. .*/.int sqli
5eb0: 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65 49 73  te3Fts5UnicodeIs
5ec0: 61 6c 6e 75 6d 28 69 6e 74 20 63 29 3b 0a 69 6e  alnum(int c);.in
5ed0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  t sqlite3Fts5Uni
5ee0: 63 6f 64 65 49 73 64 69 61 63 72 69 74 69 63 28  codeIsdiacritic(
5ef0: 69 6e 74 20 63 29 3b 0a 69 6e 74 20 73 71 6c 69  int c);.int sqli
5f00: 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65 46 6f  te3Fts5UnicodeFo
5f10: 6c 64 28 69 6e 74 20 63 2c 20 69 6e 74 20 62 52  ld(int c, int bR
5f20: 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 29 3b  emoveDiacritic);
5f30: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
5f40: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
5f50: 69 6e 20 66 74 73 35 5f 75 6e 69 63 6f 64 65 32  in fts5_unicode2
5f60: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
5f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a  **************/.
5fb0: 0a 23 65 6e 64 69 66 0a                          .#endif.