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

Artifact db1d5a18bae953c749198fe6d87862055ef55a1d:


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 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
1250: 6e 74 45 78 70 72 6c 69 73 74 3b 0a 20 20 46 74  ntExprlist;.  Ft
1260: 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  s5Tokenizer *pTo
1270: 6b 3b 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69  k;.  fts5_tokeni
1280: 7a 65 72 20 2a 70 54 6f 6b 41 70 69 3b 0a 0a 20  zer *pTokApi;.. 
1290: 20 2f 2a 20 56 61 6c 75 65 73 20 6c 6f 61 64 65   /* Values loade
12a0: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e  d from the %_con
12b0: 66 69 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  fig table */.  i
12c0: 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20  nt iCookie;     
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e0: 2a 20 49 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  * Incremented wh
12f0: 65 6e 20 25 5f 63 6f 6e 66 69 67 20 69 73 20 6d  en %_config is m
1300: 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74  odified */.  int
1310: 20 70 67 73 7a 3b 20 20 20 20 20 20 20 20 20 20   pgsz;          
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1330: 41 70 70 72 6f 78 69 6d 61 74 65 20 70 61 67 65  Approximate page
1340: 20 73 69 7a 65 20 75 73 65 64 20 69 6e 20 25 5f   size used in %_
1350: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  data */.  int nA
1360: 75 74 6f 6d 65 72 67 65 3b 20 20 20 20 20 20 20  utomerge;       
1370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 27 61 75            /* 'au
1380: 74 6f 6d 65 72 67 65 27 20 73 65 74 74 69 6e 67  tomerge' setting
1390: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 72 69 73 69   */.  int nCrisi
13a0: 73 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20  sMerge;         
13b0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
13c0: 20 61 6c 6c 6f 77 65 64 20 73 65 67 6d 65 6e 74   allowed segment
13d0: 73 20 70 65 72 20 6c 65 76 65 6c 20 2a 2f 0a 20  s per level */. 
13e0: 20 63 68 61 72 20 2a 7a 52 61 6e 6b 3b 20 20 20   char *zRank;   
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 61 6e 6b   /* Name of rank
1410: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
1420: 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73 3b 20  har *zRankArgs; 
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1440: 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 72  * Arguments to r
1450: 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ank function */.
1460: 0a 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c  .  /* If non-NUL
1470: 4c 2c 20 70 6f 69 6e 74 73 20 74 6f 20 73 71 6c  L, points to sql
1480: 69 74 65 33 5f 76 74 61 62 2e 62 61 73 65 2e 7a  ite3_vtab.base.z
1490: 45 72 72 6d 73 67 2e 20 4f 66 74 65 6e 20 4e 55  Errmsg. Often NU
14a0: 4c 4c 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  LL. */.  char **
14b0: 70 7a 45 72 72 6d 73 67 3b 0a 0a 23 69 66 64 65  pzErrmsg;..#ifde
14c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
14d0: 20 69 6e 74 20 62 50 72 65 66 69 78 49 6e 64 65   int bPrefixInde
14e0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
14f0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
1500: 70 72 65 66 69 78 2d 69 6e 64 65 78 65 73 20 2a  prefix-indexes *
1510: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20  /.#endif.};../* 
1520: 43 75 72 72 65 6e 74 20 65 78 70 65 63 74 65 64  Current expected
1530: 20 76 61 6c 75 65 20 6f 66 20 25 5f 63 6f 6e 66   value of %_conf
1540: 69 67 20 74 61 62 6c 65 20 27 76 65 72 73 69 6f  ig table 'versio
1550: 6e 27 20 66 69 65 6c 64 20 2a 2f 0a 23 64 65 66  n' field */.#def
1560: 69 6e 65 20 46 54 53 35 5f 43 55 52 52 45 4e 54  ine FTS5_CURRENT
1570: 5f 56 45 52 53 49 4f 4e 20 34 0a 0a 23 64 65 66  _VERSION 4..#def
1580: 69 6e 65 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54  ine FTS5_CONTENT
1590: 5f 4e 4f 52 4d 41 4c 20 20 20 30 0a 23 64 65 66  _NORMAL   0.#def
15a0: 69 6e 65 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54  ine FTS5_CONTENT
15b0: 5f 4e 4f 4e 45 20 20 20 20 20 31 0a 23 64 65 66  _NONE     1.#def
15c0: 69 6e 65 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54  ine FTS5_CONTENT
15d0: 5f 45 58 54 45 52 4e 41 4c 20 32 0a 0a 0a 0a 0a  _EXTERNAL 2.....
15e0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43  int sqlite3Fts5C
15f0: 6f 6e 66 69 67 50 61 72 73 65 28 0a 20 20 20 20  onfigParse(.    
1600: 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c  Fts5Global*, sql
1610: 69 74 65 33 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73  ite3*, int, cons
1620: 74 20 63 68 61 72 20 2a 2a 2c 20 46 74 73 35 43  t char **, Fts5C
1630: 6f 6e 66 69 67 2a 2a 2c 20 63 68 61 72 2a 2a 0a  onfig**, char**.
1640: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
1650: 74 73 35 43 6f 6e 66 69 67 46 72 65 65 28 46 74  ts5ConfigFree(Ft
1660: 73 35 43 6f 6e 66 69 67 2a 29 3b 0a 0a 69 6e 74  s5Config*);..int
1670: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
1680: 69 67 44 65 63 6c 61 72 65 56 74 61 62 28 46 74  igDeclareVtab(Ft
1690: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
16a0: 67 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  g);..int sqlite3
16b0: 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 0a 20 20  Fts5Tokenize(.  
16c0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
16d0: 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  fig,            
16e0: 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69 67 75 72  /* FTS5 Configur
16f0: 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ation object */.
1700: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 2f 2a 20 46 54 53 35 5f 54 4f 4b 45 4e 49    /* FTS5_TOKENI
1730: 5a 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  ZE_* flags */.  
1740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 78  const char *pTex
1750: 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20 20 20  t, int nText,   
1760: 2f 2a 20 54 65 78 74 20 74 6f 20 74 6f 6b 65 6e  /* Text to token
1770: 69 7a 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ize */.  void *p
1780: 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
17a0: 65 78 74 20 70 61 73 73 65 64 20 74 6f 20 78 54  ext passed to xT
17b0: 6f 6b 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  oken() */.  int 
17c0: 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c  (*xToken)(void*,
17d0: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72   int, const char
17e0: 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74  *, int, int, int
17f0: 29 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  )    /* Callback
1800: 20 2a 2f 0a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c   */.);..void sql
1810: 69 74 65 33 46 74 73 35 44 65 71 75 6f 74 65 28  ite3Fts5Dequote(
1820: 63 68 61 72 20 2a 7a 29 3b 0a 0a 2f 2a 20 4c 6f  char *z);../* Lo
1830: 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ad the contents 
1840: 6f 66 20 74 68 65 20 25 5f 63 6f 6e 66 69 67 20  of the %_config 
1850: 74 61 62 6c 65 20 2a 2f 0a 69 6e 74 20 73 71 6c  table */.int sql
1860: 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f  ite3Fts5ConfigLo
1870: 61 64 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20  ad(Fts5Config*, 
1880: 69 6e 74 29 3b 0a 0a 2f 2a 20 53 65 74 20 74 68  int);../* Set th
1890: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 69 6e  e value of a sin
18a0: 67 6c 65 20 63 6f 6e 66 69 67 20 61 74 74 72 69  gle config attri
18b0: 62 75 74 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  bute */.int sqli
18c0: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74  te3Fts5ConfigSet
18d0: 56 61 6c 75 65 28 46 74 73 35 43 6f 6e 66 69 67  Value(Fts5Config
18e0: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
18f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20  sqlite3_value*, 
1900: 69 6e 74 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  int*);..int sqli
1910: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72  te3Fts5ConfigPar
1920: 73 65 52 61 6e 6b 28 63 6f 6e 73 74 20 63 68 61  seRank(const cha
1930: 72 2a 2c 20 63 68 61 72 2a 2a 2c 20 63 68 61 72  r*, char**, char
1940: 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  **);../*.** End 
1950: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
1960: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 63 6f 6e  code in fts5_con
1970: 66 69 67 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  fig.c..*********
1980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19c0: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
19d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1a10: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
1a20: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 62 75 66  code in fts5_buf
1a30: 66 65 72 2e 63 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  fer.c..*/../*.**
1a40: 20 42 75 66 66 65 72 20 6f 62 6a 65 63 74 20 66   Buffer object f
1a50: 6f 72 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  or the increment
1a60: 61 6c 20 62 75 69 6c 64 69 6e 67 20 6f 66 20 73  al building of s
1a70: 74 72 69 6e 67 20 64 61 74 61 2e 0a 2a 2f 0a 74  tring data..*/.t
1a80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
1a90: 73 35 42 75 66 66 65 72 20 46 74 73 35 42 75 66  s5Buffer Fts5Buf
1aa0: 66 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35  fer;.struct Fts5
1ab0: 42 75 66 66 65 72 20 7b 0a 20 20 75 38 20 2a 70  Buffer {.  u8 *p
1ac0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
1ad0: 20 6e 53 70 61 63 65 3b 0a 7d 3b 0a 0a 69 6e 74   nSpace;.};..int
1ae0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1af0: 65 72 53 69 7a 65 28 69 6e 74 2a 2c 20 46 74 73  erSize(int*, Fts
1b00: 35 42 75 66 66 65 72 2a 2c 20 69 6e 74 29 3b 0a  5Buffer*, int);.
1b10: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 42  int sqlite3Fts5B
1b20: 75 66 66 65 72 47 72 6f 77 28 69 6e 74 2a 2c 20  ufferGrow(int*, 
1b30: 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69 6e 74  Fts5Buffer*, int
1b40: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
1b50: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1b60: 61 72 69 6e 74 28 69 6e 74 2a 2c 20 46 74 73 35  arint(int*, Fts5
1b70: 42 75 66 66 65 72 2a 2c 20 69 36 34 29 3b 0a 76  Buffer*, i64);.v
1b80: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
1b90: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1ba0: 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72  int*, Fts5Buffer
1bb0: 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38  *, int, const u8
1bc0: 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  *);.void sqlite3
1bd0: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1be0: 53 74 72 69 6e 67 28 69 6e 74 20 2a 2c 20 46 74  String(int *, Ft
1bf0: 73 35 42 75 66 66 65 72 2a 2c 20 63 6f 6e 73 74  s5Buffer*, const
1c00: 20 63 68 61 72 2a 29 3b 0a 76 6f 69 64 20 73 71   char*);.void sq
1c10: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
1c20: 72 65 65 28 46 74 73 35 42 75 66 66 65 72 2a 29  ree(Fts5Buffer*)
1c30: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
1c40: 73 35 42 75 66 66 65 72 5a 65 72 6f 28 46 74 73  s5BufferZero(Fts
1c50: 35 42 75 66 66 65 72 2a 29 3b 0a 76 6f 69 64 20  5Buffer*);.void 
1c60: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1c70: 72 53 65 74 28 69 6e 74 2a 2c 20 46 74 73 35 42  rSet(int*, Fts5B
1c80: 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e  uffer*, int, con
1c90: 73 74 20 75 38 2a 29 3b 0a 76 6f 69 64 20 73 71  st u8*);.void sq
1ca0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1cb0: 70 70 65 6e 64 50 72 69 6e 74 66 28 69 6e 74 20  ppendPrintf(int 
1cc0: 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
1cd0: 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29  char *zFmt, ...)
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 41 70 70 65 6e 64 33 32  s5BufferAppend32
1d00: 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65  (int*, Fts5Buffe
1d10: 72 2a 2c 20 69 6e 74 29 3b 0a 0a 63 68 61 72 20  r*, int);..char 
1d20: 2a 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69  *sqlite3Fts5Mpri
1d30: 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f  ntf(int *pRc, co
1d40: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
1d50: 2e 2e 2e 29 3b 0a 0a 23 64 65 66 69 6e 65 20 66  ...);..#define f
1d60: 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 78 29  ts5BufferZero(x)
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1d80: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
1d90: 72 6f 28 78 29 0a 23 64 65 66 69 6e 65 20 66 74  ro(x).#define ft
1da0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1db0: 72 69 6e 74 28 61 2c 62 2c 63 29 20 73 71 6c 69  rint(a,b,c) sqli
1dc0: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1dd0: 65 6e 64 56 61 72 69 6e 74 28 61 2c 62 2c 63 29  endVarint(a,b,c)
1de0: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66  .#define fts5Buf
1df0: 66 65 72 46 72 65 65 28 61 29 20 20 20 20 20 20  ferFree(a)      
1e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1e10: 73 35 42 75 66 66 65 72 46 72 65 65 28 61 29 0a  s5BufferFree(a).
1e20: 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66  #define fts5Buff
1e30: 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62  erAppendBlob(a,b
1e40: 2c 63 2c 64 29 20 73 71 6c 69 74 65 33 46 74 73  ,c,d) sqlite3Fts
1e50: 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1e60: 62 28 61 2c 62 2c 63 2c 64 29 0a 23 64 65 66 69  b(a,b,c,d).#defi
1e70: 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 65 74  ne fts5BufferSet
1e80: 28 61 2c 62 2c 63 2c 64 29 20 20 20 20 20 20 20  (a,b,c,d)       
1e90: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1ea0: 65 72 53 65 74 28 61 2c 62 2c 63 2c 64 29 0a 23  erSet(a,b,c,d).#
1eb0: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
1ec0: 72 41 70 70 65 6e 64 33 32 28 61 2c 62 2c 63 29  rAppend32(a,b,c)
1ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1ee0: 42 75 66 66 65 72 41 70 70 65 6e 64 33 32 28 61  BufferAppend32(a
1ef0: 2c 62 2c 63 29 0a 0a 23 64 65 66 69 6e 65 20 66  ,b,c)..#define f
1f00: 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 70 52  ts5BufferGrow(pR
1f10: 63 2c 70 42 75 66 2c 6e 6e 29 20 28 20 5c 0a 20  c,pBuf,nn) ( \. 
1f20: 20 28 70 42 75 66 29 2d 3e 6e 20 2b 20 28 6e 6e   (pBuf)->n + (nn
1f30: 29 20 3c 3d 20 28 70 42 75 66 29 2d 3e 6e 53 70  ) <= (pBuf)->nSp
1f40: 61 63 65 20 3f 20 30 20 3a 20 5c 0a 20 20 20 20  ace ? 0 : \.    
1f50: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1f60: 72 53 69 7a 65 28 28 70 52 63 29 2c 28 70 42 75  rSize((pRc),(pBu
1f70: 66 29 2c 28 6e 6e 29 2b 28 70 42 75 66 29 2d 3e  f),(nn)+(pBuf)->
1f80: 6e 29 20 5c 0a 29 0a 0a 2f 2a 20 57 72 69 74 65  n) \.)../* Write
1f90: 20 61 6e 64 20 64 65 63 6f 64 65 20 62 69 67 2d   and decode big-
1fa0: 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 20 69 6e  endian 32-bit in
1fb0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a  teger values */.
1fc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
1fd0: 50 75 74 33 32 28 75 38 2a 2c 20 69 6e 74 29 3b  Put32(u8*, int);
1fe0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1ff0: 47 65 74 33 32 28 63 6f 6e 73 74 20 75 38 2a 29  Get32(const u8*)
2000: 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  ;..#define FTS5_
2010: 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29  POS2COLUMN(iPos)
2020: 20 28 69 6e 74 29 28 69 50 6f 73 20 3e 3e 20 33   (int)(iPos >> 3
2030: 32 29 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  2).#define FTS5_
2040: 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29  POS2OFFSET(iPos)
2050: 20 28 69 6e 74 29 28 69 50 6f 73 20 26 20 30 78   (int)(iPos & 0x
2060: 46 46 46 46 46 46 46 46 29 0a 0a 74 79 70 65 64  FFFFFFFF)..typed
2070: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50 6f  ef struct Fts5Po
2080: 73 6c 69 73 74 52 65 61 64 65 72 20 46 74 73 35  slistReader Fts5
2090: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 3b 0a 73  PoslistReader;.s
20a0: 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73  truct Fts5Poslis
20b0: 74 52 65 61 64 65 72 20 7b 0a 20 20 2f 2a 20 56  tReader {.  /* V
20c0: 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 6f 6e  ariables used on
20d0: 6c 79 20 62 79 20 73 71 6c 69 74 65 33 46 74 73  ly by sqlite3Fts
20e0: 35 50 6f 73 6c 69 73 74 49 74 65 72 58 58 58 28  5PoslistIterXXX(
20f0: 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a  ) functions. */.
2100: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20    const u8 *a;  
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69    /* Position li
2130: 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  st to iterate th
2140: 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  rough */.  int n
2150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2170: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
2180: 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  a[] in bytes */.
2190: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
21c0: 73 65 74 20 69 6e 20 61 5b 5d 20 2a 2f 0a 0a 20  set in a[] */.. 
21d0: 20 75 38 20 62 46 6c 61 67 3b 20 20 20 20 20 20   u8 bFlag;      
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 2f 2a 20 46 6f 72 20 63 6c 69 65 6e 74 20 75   /* For client u
2200: 73 65 20 28 61 6e 79 20 63 75 73 74 6f 6d 20 70  se (any custom p
2210: 75 72 70 6f 73 65 29 20 2a 2f 0a 0a 20 20 2f 2a  urpose) */..  /*
2220: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2230: 73 20 2a 2f 0a 20 20 75 38 20 62 45 6f 66 3b 20  s */.  u8 bEof; 
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
2260: 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a   true at EOF */.
2270: 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20 20 20    i64 iPos;     
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33 32 29 20    /* (iCol<<32) 
22a0: 2b 20 69 50 6f 73 20 2a 2f 0a 7d 3b 0a 69 6e 74  + iPos */.};.int
22b0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
22c0: 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 0a 20  istReaderInit(. 
22d0: 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
22e0: 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
22f0: 20 2f 2a 20 50 6f 73 6c 69 73 74 20 62 75 66 66   /* Poslist buff
2300: 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  er to iterate th
2310: 72 6f 75 67 68 20 2a 2f 0a 20 20 46 74 73 35 50  rough */.  Fts5P
2320: 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 70 49  oslistReader *pI
2330: 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ter        /* It
2340: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 74 6f  erator object to
2350: 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 29   initialize */.)
2360: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
2370: 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
2380: 78 74 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  xt(Fts5PoslistRe
2390: 61 64 65 72 2a 29 3b 0a 0a 74 79 70 65 64 65 66  ader*);..typedef
23a0: 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c   struct Fts5Posl
23b0: 69 73 74 57 72 69 74 65 72 20 46 74 73 35 50 6f  istWriter Fts5Po
23c0: 73 6c 69 73 74 57 72 69 74 65 72 3b 0a 73 74 72  slistWriter;.str
23d0: 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74 57  uct Fts5PoslistW
23e0: 72 69 74 65 72 20 7b 0a 20 20 69 36 34 20 69 50  riter {.  i64 iP
23f0: 72 65 76 3b 0a 7d 3b 0a 69 6e 74 20 73 71 6c 69  rev;.};.int sqli
2400: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72  te3Fts5PoslistWr
2410: 69 74 65 72 41 70 70 65 6e 64 28 46 74 73 35 42  iterAppend(Fts5B
2420: 75 66 66 65 72 2a 2c 20 46 74 73 35 50 6f 73 6c  uffer*, Fts5Posl
2430: 69 73 74 57 72 69 74 65 72 2a 2c 20 69 36 34 29  istWriter*, i64)
2440: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
2450: 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
2460: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  .  const u8 *a, 
2470: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
2480: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
2490: 74 61 69 6e 69 6e 67 20 70 6f 73 6c 69 73 74 20  taining poslist 
24a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 2c 20 20 20  */.  int *pi,   
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
24d0: 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 61 5b  Offset within a[
24e0: 5d 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4f 66  ] */.  i64 *piOf
24f0: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
2500: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2510: 3a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  : Current offset
2520: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 20 4d 61 6c 6c 6f   */.);../* Mallo
2530: 63 20 75 74 69 6c 69 74 79 20 2a 2f 0a 76 6f 69  c utility */.voi
2540: 64 20 2a 73 71 6c 69 74 65 33 46 74 73 35 4d 61  d *sqlite3Fts5Ma
2550: 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74 20 2a 70 52  llocZero(int *pR
2560: 63 2c 20 69 6e 74 20 6e 42 79 74 65 29 3b 0a 63  c, int nByte);.c
2570: 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35  har *sqlite3Fts5
2580: 53 74 72 6e 64 75 70 28 69 6e 74 20 2a 70 52 63  Strndup(int *pRc
2590: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49  , const char *pI
25a0: 6e 2c 20 69 6e 74 20 6e 49 6e 29 3b 0a 0a 2f 2a  n, int nIn);../*
25b0: 20 43 68 61 72 61 63 74 65 72 20 73 65 74 20 74   Character set t
25c0: 65 73 74 73 20 28 6c 69 6b 65 20 69 73 73 70 61  ests (like isspa
25d0: 63 65 28 29 2c 20 69 73 61 6c 70 68 61 28 29 20  ce(), isalpha() 
25e0: 65 74 63 2e 29 20 2a 2f 0a 69 6e 74 20 73 71 6c  etc.) */.int sql
25f0: 69 74 65 33 46 74 73 35 49 73 42 61 72 65 77 6f  ite3Fts5IsBarewo
2600: 72 64 28 63 68 61 72 20 74 29 3b 0a 0a 2f 2a 0a  rd(char t);../*.
2610: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
2620: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
2630: 74 73 35 5f 62 75 66 66 65 72 2e 63 2e 0a 2a 2a  ts5_buffer.c..**
2640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2680: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
2690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
26e0: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
26f0: 74 73 35 5f 69 6e 64 65 78 2e 63 2e 20 66 74 73  ts5_index.c. fts
2700: 35 5f 69 6e 64 65 78 2e 63 20 63 6f 6e 74 61 69  5_index.c contai
2710: 6e 73 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  ns contains code
2720: 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
2730: 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  e data stored in
2740: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
2750: 65 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73  e..*/..typedef s
2760: 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20  truct Fts5Index 
2770: 46 74 73 35 49 6e 64 65 78 3b 0a 74 79 70 65 64  Fts5Index;.typed
2780: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 49 6e  ef struct Fts5In
2790: 64 65 78 49 74 65 72 20 46 74 73 35 49 6e 64 65  dexIter Fts5Inde
27a0: 78 49 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61  xIter;../*.** Va
27b0: 6c 75 65 73 20 75 73 65 64 20 61 73 20 70 61 72  lues used as par
27c0: 74 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 61  t of the flags a
27d0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
27e0: 6f 20 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  o IndexQuery()..
27f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 49  */.#define FTS5I
2800: 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
2810: 58 20 20 20 20 20 30 78 30 30 30 31 20 20 20 2f  X     0x0001   /
2820: 2a 20 50 72 65 66 69 78 20 71 75 65 72 79 20 2a  * Prefix query *
2830: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 49 4e  /.#define FTS5IN
2840: 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 20  DEX_QUERY_DESC  
2850: 20 20 20 20 20 30 78 30 30 30 32 20 20 20 2f 2a       0x0002   /*
2860: 20 44 6f 63 73 20 69 6e 20 64 65 73 63 65 6e 64   Docs in descend
2870: 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20  ing rowid order 
2880: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 49  */.#define FTS5I
2890: 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
28a0: 4e 4f 49 44 58 20 30 78 30 30 30 34 20 20 20 2f  NOIDX 0x0004   /
28b0: 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 70 72 65  * Do not use pre
28c0: 66 69 78 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65  fix index */.#de
28d0: 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51  fine FTS5INDEX_Q
28e0: 55 45 52 59 5f 53 43 41 4e 20 20 20 20 20 20 20  UERY_SCAN       
28f0: 30 78 30 30 30 38 20 20 20 2f 2a 20 53 63 61 6e  0x0008   /* Scan
2900: 20 71 75 65 72 79 20 28 66 74 73 35 76 6f 63 61   query (fts5voca
2910: 62 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  b) */../*.** Cre
2920: 61 74 65 2f 64 65 73 74 72 6f 79 20 61 6e 20 46  ate/destroy an F
2930: 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  ts5Index object.
2940: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2950: 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 46 74 73  ts5IndexOpen(Fts
2960: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
2970: 2c 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 46  , int bCreate, F
2980: 74 73 35 49 6e 64 65 78 2a 2a 2c 20 63 68 61 72  ts5Index**, char
2990: 2a 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  **);.int sqlite3
29a0: 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46  Fts5IndexClose(F
29b0: 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a 0a 2f  ts5Index *p);../
29c0: 2a 0a 2a 2a 20 66 6f 72 28 0a 2a 2a 20 20 20 73  *.** for(.**   s
29d0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
29e0: 75 65 72 79 28 70 2c 20 22 74 6f 6b 65 6e 22 2c  uery(p, "token",
29f0: 20 35 2c 20 30 2c 20 30 2c 20 26 70 49 74 65 72   5, 0, 0, &pIter
2a00: 29 3b 0a 2a 2a 20 20 20 30 3d 3d 73 71 6c 69 74  );.**   0==sqlit
2a10: 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
2a20: 74 65 72 29 3b 0a 2a 2a 20 20 20 73 71 6c 69 74  ter);.**   sqlit
2a30: 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70  e3Fts5IterNext(p
2a40: 49 74 65 72 29 0a 2a 2a 20 29 7b 0a 2a 2a 20 20  Iter).** ){.**  
2a50: 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71   i64 iRowid = sq
2a60: 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77  lite3Fts5IterRow
2a70: 69 64 28 70 49 74 65 72 29 3b 0a 2a 2a 20 7d 0a  id(pIter);.** }.
2a80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  */../*.** Open a
2a90: 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f   new iterator to
2aa0: 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20   iterate though 
2ab0: 61 6c 6c 20 72 6f 77 69 64 73 20 74 68 61 74 20  all rowids that 
2ac0: 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70  match the .** sp
2ad0: 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72  ecified token or
2ae0: 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a   token prefix..*
2af0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2b00: 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46  5IndexQuery(.  F
2b10: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b30: 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71  * FTS index to q
2b40: 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  uery */.  const 
2b50: 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
2b60: 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b  t nToken, /* Tok
2b70: 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74  en (or prefix) t
2b80: 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
2b90: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
2bc0: 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c  INDEX_QUERY_X fl
2bd0: 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  ags */.  Fts5Col
2be0: 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20  set *pColset,   
2bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
2c00: 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  h these columns 
2c10: 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49 6e  only */.  Fts5In
2c20: 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72  dexIter **ppIter
2c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2c40: 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f  : New iterator o
2c50: 62 6a 65 63 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  bject */.);../*.
2c60: 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 6f  ** The various o
2c70: 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 6f 70 65  perations on ope
2c80: 6e 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e  n token or token
2c90: 20 70 72 65 66 69 78 20 69 74 65 72 61 74 6f 72   prefix iterator
2ca0: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 75 73 69 6e  s opened.** usin
2cb0: 67 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  g sqlite3Fts5Ind
2cc0: 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 69 6e  exQuery()..*/.in
2cd0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
2ce0: 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74  rEof(Fts5IndexIt
2cf0: 65 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  er*);.int sqlite
2d00: 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74  3Fts5IterNext(Ft
2d10: 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69  s5IndexIter*);.i
2d20: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
2d30: 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49  erNextFrom(Fts5I
2d40: 6e 64 65 78 49 74 65 72 2a 2c 20 69 36 34 20 69  ndexIter*, i64 i
2d50: 4d 61 74 63 68 29 3b 0a 69 36 34 20 73 71 6c 69  Match);.i64 sqli
2d60: 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64  te3Fts5IterRowid
2d70: 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29  (Fts5IndexIter*)
2d80: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
2d90: 35 49 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73  5IterPoslist(Fts
2da0: 35 49 6e 64 65 78 49 74 65 72 2a 2c 46 74 73 35  5IndexIter*,Fts5
2db0: 43 6f 6c 73 65 74 2a 2c 20 63 6f 6e 73 74 20 75  Colset*, const u
2dc0: 38 2a 2a 2c 20 69 6e 74 2a 2c 20 69 36 34 2a 29  8**, int*, i64*)
2dd0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
2de0: 35 49 74 65 72 50 6f 73 6c 69 73 74 42 75 66 66  5IterPoslistBuff
2df0: 65 72 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  er(Fts5IndexIter
2e00: 20 2a 70 49 74 65 72 2c 20 46 74 73 35 42 75 66   *pIter, Fts5Buf
2e10: 66 65 72 20 2a 70 42 75 66 29 3b 0a 0a 2f 2a 0a  fer *pBuf);../*.
2e20: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72  ** Close an iter
2e30: 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 73  ator opened by s
2e40: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
2e50: 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  uery()..*/.void 
2e60: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
2e70: 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49 74  lose(Fts5IndexIt
2e80: 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  er*);../*.** Thi
2e90: 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75  s interface is u
2ea0: 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76  sed by the fts5v
2eb0: 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  ocab module..*/.
2ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
2ed0: 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28  te3Fts5IterTerm(
2ee0: 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 2c 20  Fts5IndexIter*, 
2ef0: 69 6e 74 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  int*);.int sqlit
2f00: 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63  e3Fts5IterNextSc
2f10: 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  an(Fts5IndexIter
2f20: 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  *);.../*.** Inse
2f30: 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74  rt or remove dat
2f40: 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  a to or from the
2f50: 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d   index. Each tim
2f60: 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20  e a document is 
2f70: 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20  .** added to or 
2f80: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
2f90: 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e   index, this fun
2fa0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2fb0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74  one or more.** t
2fc0: 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  imes..**.** For 
2fd0: 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75  an insert, it mu
2fe0: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  st be called onc
2ff0: 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e  e for each token
3000: 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75   in the new docu
3010: 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ment..** If the 
3020: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64  operation is a d
3030: 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62  elete, it must b
3040: 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61  e called (at lea
3050: 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  st) once for eac
3060: 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65  h.** unique toke
3070: 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  n in the documen
3080: 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76  t with an iCol v
3090: 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a  alue less than z
30a0: 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a  ero. The iPos.**
30b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e   argument is ign
30c0: 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74  ored for a delet
30d0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
30e0: 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
30f0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
3120: 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
3130: 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3150: 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
3160: 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
3170: 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
3180: 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31a0: 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
31b0: 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
31c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
31d0: 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
31e0: 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
31f0: 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
3200: 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
3210: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  */.);../*.** Ind
3220: 69 63 61 74 65 20 74 68 61 74 20 73 75 62 73 65  icate that subse
3230: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
3240: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57  qlite3Fts5IndexW
3250: 72 69 74 65 28 29 20 70 65 72 74 61 69 6e 20 74  rite() pertain t
3260: 6f 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 69 44  o.** document iD
3270: 6f 63 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ocid..*/.int sql
3280: 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65 67  ite3Fts5IndexBeg
3290: 69 6e 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  inWrite(.  Fts5I
32a0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
32b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
32c0: 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
32d0: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65  */.  int bDelete
32e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3300: 63 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f  current operatio
3310: 6e 20 69 73 20 61 20 64 65 6c 65 74 65 20 2a 2f  n is a delete */
3320: 0a 20 20 69 36 34 20 69 44 6f 63 69 64 20 20 20  .  i64 iDocid   
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20 61     /* Docid to a
3350: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74  dd or remove dat
3360: 61 20 66 72 6f 6d 20 2a 2f 0a 29 3b 0a 0a 2f 2a  a from */.);../*
3370: 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61  .** Flush any da
3380: 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
3390: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
33a0: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64 61  tables to the da
33b0: 74 61 62 61 73 65 2e 0a 2a 2a 20 49 66 20 74 68  tabase..** If th
33c0: 65 20 62 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69  e bCommit flag i
33d0: 73 20 74 72 75 65 2c 20 61 6c 73 6f 20 63 6c 6f  s true, also clo
33e0: 73 65 20 61 6e 79 20 6f 70 65 6e 20 62 6c 6f 62  se any open blob
33f0: 20 68 61 6e 64 6c 65 73 2e 0a 2a 2f 0a 69 6e 74   handles..*/.int
3400: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
3410: 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20  xSync(Fts5Index 
3420: 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  *p, int bCommit)
3430: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  ;../*.** Discard
3440: 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
3450: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
3460: 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44  y hash tables. D
3470: 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a  o not write it.*
3480: 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
3490: 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
34a0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
34b0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
34c0: 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65   %_data.** table
34d0: 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
34e0: 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e  d on disk. So an
34f0: 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  y in-memory cach
3500: 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a  es of %_data .**
3510: 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65   records must be
3520: 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
3530: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3540: 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74  IndexRollback(Ft
3550: 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a  s5Index *p);../*
3560: 0a 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74  .** Get or set t
3570: 68 65 20 22 61 76 65 72 61 67 65 73 22 20 76 61  he "averages" va
3580: 6c 75 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lues..*/.int sql
3590: 69 74 65 33 46 74 73 35 49 6e 64 65 78 47 65 74  ite3Fts5IndexGet
35a0: 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
35b0: 65 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f  ex *p, i64 *pnRo
35c0: 77 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65 29 3b  w, i64 *anSize);
35d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
35e0: 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
35f0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63  (Fts5Index *p, c
3600: 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 3b 0a  onst u8*, int);.
3610: 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 73  ./*.** Functions
3620: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 73   called by the s
3630: 74 6f 72 61 67 65 20 6d 6f 64 75 6c 65 20 61 73  torage module as
3640: 20 70 61 72 74 20 6f 66 20 69 6e 74 65 67 72 69   part of integri
3650: 74 79 2d 63 68 65 63 6b 2e 0a 2a 2f 0a 75 36 34  ty-check..*/.u64
3660: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
3670: 78 43 6b 73 75 6d 28 46 74 73 35 43 6f 6e 66 69  xCksum(Fts5Confi
3680: 67 2a 2c 69 36 34 2c 69 6e 74 2c 69 6e 74 2c 63  g*,i64,int,int,c
3690: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b  onst char*,int);
36a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
36b0: 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
36c0: 65 63 6b 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  eck(Fts5Index*, 
36d0: 75 36 34 20 63 6b 73 75 6d 29 3b 0a 0a 2f 2a 20  u64 cksum);../* 
36e0: 0a 2a 2a 20 43 61 6c 6c 65 64 20 64 75 72 69 6e  .** Called durin
36f0: 67 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  g virtual module
3700: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
3710: 74 6f 20 72 65 67 69 73 74 65 72 20 55 44 46 20  to register UDF 
3720: 0a 2a 2a 20 66 74 73 35 5f 64 65 63 6f 64 65 28  .** fts5_decode(
3730: 29 20 77 69 74 68 20 53 51 4c 69 74 65 20 0a 2a  ) with SQLite .*
3740: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3750: 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74  5IndexInit(sqlit
3760: 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  e3*);..int sqlit
3770: 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f  e3Fts5IndexSetCo
3780: 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  okie(Fts5Index*,
3790: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   int);../*.** Re
37a0: 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
37b0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
37c0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
37d0: 5f 64 61 74 61 20 74 61 62 6c 65 20 62 79 20 0a  _data table by .
37e0: 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
37f0: 6f 6e 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  on since it was 
3800: 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  created..*/.int 
3810: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
3820: 52 65 61 64 73 28 46 74 73 35 49 6e 64 65 78 20  Reads(Fts5Index 
3830: 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  *p);..int sqlite
3840: 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74  3Fts5IndexReinit
3850: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a  (Fts5Index *p);.
3860: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
3870: 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
3880: 35 49 6e 64 65 78 20 2a 70 29 3b 0a 69 6e 74 20  5Index *p);.int 
3890: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
38a0: 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65 78 20  Merge(Fts5Index 
38b0: 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 3b  *p, int nMerge);
38c0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
38d0: 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67  5IndexLoadConfig
38e0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a  (Fts5Index *p);.
38f0: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
3900: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
3910: 69 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e 63 2e  in fts5_index.c.
3920: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
3930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
3970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
39c0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
39d0: 6e 20 66 74 73 35 5f 76 61 72 69 6e 74 2e 63 2e  n fts5_varint.c.
39e0: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
39f0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  Fts5GetVarint32(
3a00: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3a10: 68 61 72 20 2a 70 2c 20 75 33 32 20 2a 76 29 3b  har *p, u32 *v);
3a20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3a30: 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 75 33 32  GetVarintLen(u32
3a40: 20 69 56 61 6c 29 3b 0a 75 38 20 73 71 6c 69 74   iVal);.u8 sqlit
3a50: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
3a60: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3a70: 68 61 72 2a 2c 20 75 36 34 2a 29 3b 0a 69 6e 74  har*, u64*);.int
3a80: 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
3a90: 61 72 69 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  arint(unsigned c
3aa0: 68 61 72 20 2a 70 2c 20 75 36 34 20 76 29 3b 0a  har *p, u64 v);.
3ab0: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 47 65 74  .#define fts5Get
3ac0: 56 61 72 69 6e 74 33 32 28 61 2c 62 29 20 73 71  Varint32(a,b) sq
3ad0: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
3ae0: 6e 74 33 32 28 61 2c 28 75 33 32 2a 29 26 62 29  nt32(a,(u32*)&b)
3af0: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 47 65 74  .#define fts5Get
3b00: 56 61 72 69 6e 74 20 20 20 20 73 71 6c 69 74 65  Varint    sqlite
3b10: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 0a 0a  3Fts5GetVarint..
3b20: 23 64 65 66 69 6e 65 20 66 74 73 35 46 61 73 74  #define fts5Fast
3b30: 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
3b40: 4f 66 66 2c 20 6e 56 61 6c 29 20 7b 20 20 20 20  Off, nVal) {    
3b50: 20 20 5c 0a 20 20 6e 56 61 6c 20 3d 20 28 61 29    \.  nVal = (a)
3b60: 5b 69 4f 66 66 2b 2b 5d 3b 20 20 20 20 20 20 20  [iOff++];       
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 6e 56        \.  if( nV
3b90: 61 6c 20 26 20 30 78 38 30 20 29 7b 20 20 20 20  al & 0x80 ){    
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
3bc0: 69 4f 66 66 2d 2d 3b 20 20 20 20 20 20 20 20 20  iOff--;         
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
3bf0: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
3c00: 47 65 74 56 61 72 69 6e 74 33 32 28 26 28 61 29  GetVarint32(&(a)
3c10: 5b 69 4f 66 66 5d 2c 20 6e 56 61 6c 29 3b 20 20  [iOff], nVal);  
3c20: 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20    \.  }         
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a        \.}.../*.*
3c60: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
3c70: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
3c80: 73 35 5f 76 61 72 69 6e 74 2e 63 2e 0a 2a 2a 2a  s5_varint.c..***
3c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cd0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
3ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d20: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
3d30: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
3d40: 74 73 35 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20  ts5.c. .*/..int 
3d50: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 54 6f  sqlite3Fts5GetTo
3d60: 6b 65 6e 69 7a 65 72 28 0a 20 20 46 74 73 35 47  kenizer(.  Fts5G
3d70: 6c 6f 62 61 6c 2a 2c 20 0a 20 20 63 6f 6e 73 74  lobal*, .  const
3d80: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20   char **azArg,. 
3d90: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74 73   int nArg,.  Fts
3da0: 35 54 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a 20 20  5Tokenizer**,.  
3db0: 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2a 2a  fts5_tokenizer**
3dc0: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
3dd0: 0a 29 3b 0a 0a 46 74 73 35 49 6e 64 65 78 20 2a  .);..Fts5Index *
3de0: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
3df0: 46 72 6f 6d 43 73 72 69 64 28 46 74 73 35 47 6c  FromCsrid(Fts5Gl
3e00: 6f 62 61 6c 2a 2c 20 69 36 34 2c 20 46 74 73 35  obal*, i64, Fts5
3e10: 43 6f 6e 66 69 67 20 2a 2a 29 3b 0a 0a 2f 2a 0a  Config **);../*.
3e20: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
3e30: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
3e40: 74 73 35 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts5.c..*********
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 2a 2a  ****************
3e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e90: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
3ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
3ee0: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
3ef0: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61 73  code in fts5_has
3f00: 68 2e 63 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66  h.c. .*/.typedef
3f10: 20 73 74 72 75 63 74 20 46 74 73 35 48 61 73 68   struct Fts5Hash
3f20: 20 46 74 73 35 48 61 73 68 3b 0a 0a 2f 2a 0a 2a   Fts5Hash;../*.*
3f30: 2a 20 43 72 65 61 74 65 20 61 20 68 61 73 68 20  * Create a hash 
3f40: 74 61 62 6c 65 2c 20 66 72 65 65 20 61 20 68 61  table, free a ha
3f50: 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  sh table..*/.int
3f60: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
3f70: 4e 65 77 28 46 74 73 35 48 61 73 68 2a 2a 2c 20  New(Fts5Hash**, 
3f80: 69 6e 74 20 2a 70 6e 53 69 7a 65 29 3b 0a 76 6f  int *pnSize);.vo
3f90: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  id sqlite3Fts5Ha
3fa0: 73 68 46 72 65 65 28 46 74 73 35 48 61 73 68 2a  shFree(Fts5Hash*
3fb0: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
3fc0: 74 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20  ts5HashWrite(.  
3fd0: 46 74 73 35 48 61 73 68 2a 2c 0a 20 20 69 36 34  Fts5Hash*,.  i64
3fe0: 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4000: 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 65  Rowid for this e
4010: 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ntry */.  int iC
4020: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
4030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
4040: 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  umn token appear
4050: 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c  s in (-ve -> del
4060: 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ete) */.  int iP
4070: 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  os,             
4080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
4090: 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77  ition of token w
40a0: 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ithin column */.
40b0: 20 20 63 68 61 72 20 62 42 79 74 65 2c 0a 20 20    char bByte,.  
40c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
40d0: 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20  en, int nToken  
40e0: 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20  /* Token to add 
40f0: 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20  or remove to or 
4100: 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b  from index */.);
4110: 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70 74 79 20 28 62  ../*.** Empty (b
4120: 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
4130: 29 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  ) a hash table..
4140: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
4150: 74 73 35 48 61 73 68 43 6c 65 61 72 28 46 74 73  ts5HashClear(Fts
4160: 35 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73 71  5Hash*);..int sq
4170: 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75 65  lite3Fts5HashQue
4180: 72 79 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c  ry(.  Fts5Hash*,
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
41b0: 62 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ble to query */.
41c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
41d0: 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
41e0: 20 20 2f 2a 20 51 75 65 72 79 20 74 65 72 6d 20    /* Query term 
41f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a  */.  const u8 **
4200: 70 70 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20  ppDoclist,      
4210: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
4220: 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20  nter to doclist 
4230: 66 6f 72 20 70 54 65 72 6d 20 2a 2f 0a 20 20 69  for pTerm */.  i
4240: 6e 74 20 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20  nt *pnDoclist   
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4260: 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 64  * OUT: Size of d
4270: 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  oclist in bytes 
4280: 2a 2f 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  */.);..int sqlit
4290: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
42a0: 69 74 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c  it(.  Fts5Hash*,
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
42d0: 62 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ble to query */.
42e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
42f0: 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
4300: 20 20 2f 2a 20 51 75 65 72 79 20 70 72 65 66 69    /* Query prefi
4310: 78 20 2a 2f 0a 29 3b 0a 76 6f 69 64 20 73 71 6c  x */.);.void sql
4320: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
4330: 4e 65 78 74 28 46 74 73 35 48 61 73 68 2a 29 3b  Next(Fts5Hash*);
4340: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4350: 48 61 73 68 53 63 61 6e 45 6f 66 28 46 74 73 35  HashScanEof(Fts5
4360: 48 61 73 68 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  Hash*);.void sql
4370: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
4380: 45 6e 74 72 79 28 46 74 73 35 48 61 73 68 20 2a  Entry(Fts5Hash *
4390: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
43a0: 2a 70 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20  *pzTerm,        
43b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 74 65 72 6d      /* OUT: term
43c0: 20 28 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64   (nul-terminated
43d0: 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  ) */.  const u8 
43e0: 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20 20 20 20  **ppDoclist,    
43f0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 70         /* OUT: p
4400: 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
4410: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f  t */.  int *pnDo
4420: 63 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  clist           
4430: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
4440: 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69  ize of doclist i
4450: 6e 20 62 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a 0a  n bytes */.);...
4460: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
4470: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
4480: 6e 20 66 74 73 35 5f 68 61 73 68 2e 63 2e 0a 2a  n fts5_hash.c..*
4490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
44a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
44b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
44c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
44d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
44e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
44f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4520: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  *******.** Inter
4530: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
4540: 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 20  fts5_storage.c. 
4550: 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 20 63  fts5_storage.c c
4560: 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e 73  ontains contains
4570: 20 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 61 63 63   .** code to acc
4580: 65 73 73 20 74 68 65 20 64 61 74 61 20 73 74 6f  ess the data sto
4590: 72 65 64 20 69 6e 20 74 68 65 20 25 5f 63 6f 6e  red in the %_con
45a0: 74 65 6e 74 20 61 6e 64 20 25 5f 64 6f 63 73 69  tent and %_docsi
45b0: 7a 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 0a 23  ze tables..*/..#
45c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54  define FTS5_STMT
45d0: 5f 53 43 41 4e 5f 41 53 43 20 20 30 20 20 20 20  _SCAN_ASC  0    
45e0: 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64   /* SELECT rowid
45f0: 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  , * FROM ... ORD
4600: 45 52 20 42 59 20 31 20 41 53 43 20 2a 2f 0a 23  ER BY 1 ASC */.#
4610: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54  define FTS5_STMT
4620: 5f 53 43 41 4e 5f 44 45 53 43 20 31 20 20 20 20  _SCAN_DESC 1    
4630: 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64   /* SELECT rowid
4640: 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  , * FROM ... ORD
4650: 45 52 20 42 59 20 31 20 44 45 53 43 20 2a 2f 0a  ER BY 1 DESC */.
4660: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d  #define FTS5_STM
4670: 54 5f 4c 4f 4f 4b 55 50 20 20 20 20 32 20 20 20  T_LOOKUP    2   
4680: 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69    /* SELECT rowi
4690: 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 57 48  d, * FROM ... WH
46a0: 45 52 45 20 72 6f 77 69 64 3d 3f 20 2a 2f 0a 0a  ERE rowid=? */..
46b0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
46c0: 74 73 35 53 74 6f 72 61 67 65 20 46 74 73 35 53  ts5Storage Fts5S
46d0: 74 6f 72 61 67 65 3b 0a 0a 69 6e 74 20 73 71 6c  torage;..int sql
46e0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4f  ite3Fts5StorageO
46f0: 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c  pen(Fts5Config*,
4700: 20 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 6e 74   Fts5Index*, int
4710: 2c 20 46 74 73 35 53 74 6f 72 61 67 65 2a 2a 2c  , Fts5Storage**,
4720: 20 63 68 61 72 2a 2a 29 3b 0a 69 6e 74 20 73 71   char**);.int sq
4730: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
4740: 43 6c 6f 73 65 28 46 74 73 35 53 74 6f 72 61 67  Close(Fts5Storag
4750: 65 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74  e *p);.int sqlit
4760: 65 33 46 74 73 35 53 74 6f 72 61 67 65 52 65 6e  e3Fts5StorageRen
4770: 61 6d 65 28 46 74 73 35 53 74 6f 72 61 67 65 2a  ame(Fts5Storage*
4780: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
4790: 61 6d 65 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  ame);..int sqlit
47a0: 65 33 46 74 73 35 44 72 6f 70 41 6c 6c 28 46 74  e3Fts5DropAll(Ft
47b0: 73 35 43 6f 6e 66 69 67 2a 29 3b 0a 69 6e 74 20  s5Config*);.int 
47c0: 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
47d0: 65 54 61 62 6c 65 28 46 74 73 35 43 6f 6e 66 69  eTable(Fts5Confi
47e0: 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  g*, const char*,
47f0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
4800: 74 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 0a 69 6e  t, char **);..in
4810: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
4820: 72 61 67 65 44 65 6c 65 74 65 28 46 74 73 35 53  rageDelete(Fts5S
4830: 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 29 3b  torage *p, i64);
4840: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4850: 53 74 6f 72 61 67 65 43 6f 6e 74 65 6e 74 49 6e  StorageContentIn
4860: 73 65 72 74 28 46 74 73 35 53 74 6f 72 61 67 65  sert(Fts5Storage
4870: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c   *p, sqlite3_val
4880: 75 65 2a 2a 2c 20 69 36 34 2a 29 3b 0a 69 6e 74  ue**, i64*);.int
4890: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
48a0: 61 67 65 49 6e 64 65 78 49 6e 73 65 72 74 28 46  ageIndexInsert(F
48b0: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 73  ts5Storage *p, s
48c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 2c 20  qlite3_value**, 
48d0: 69 36 34 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  i64);..int sqlit
48e0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74  e3Fts5StorageInt
48f0: 65 67 72 69 74 79 28 46 74 73 35 53 74 6f 72 61  egrity(Fts5Stora
4900: 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c  ge *p);..int sql
4910: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
4920: 74 6d 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  tmt(Fts5Storage 
4930: 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20 73  *p, int eStmt, s
4940: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2a 2c 20 63  qlite3_stmt**, c
4950: 68 61 72 2a 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  har**);.void sql
4960: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
4970: 74 6d 74 52 65 6c 65 61 73 65 28 46 74 73 35 53  tmtRelease(Fts5S
4980: 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 65  torage *p, int e
4990: 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73 74  Stmt, sqlite3_st
49a0: 6d 74 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  mt*);..int sqlit
49b0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 6f 63  e3Fts5StorageDoc
49c0: 73 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65  size(Fts5Storage
49d0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
49e0: 20 69 6e 74 20 2a 61 43 6f 6c 29 3b 0a 69 6e 74   int *aCol);.int
49f0: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
4a00: 61 67 65 53 69 7a 65 28 46 74 73 35 53 74 6f 72  ageSize(Fts5Stor
4a10: 61 67 65 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  age *p, int iCol
4a20: 2c 20 69 36 34 20 2a 70 6e 41 76 67 29 3b 0a 69  , i64 *pnAvg);.i
4a30: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4a40: 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28 46 74  orageRowCount(Ft
4a50: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36  s5Storage *p, i6
4a60: 34 20 2a 70 6e 52 6f 77 29 3b 0a 0a 69 6e 74 20  4 *pnRow);..int 
4a70: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4a80: 67 65 53 79 6e 63 28 46 74 73 35 53 74 6f 72 61  geSync(Fts5Stora
4a90: 67 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d  ge *p, int bComm
4aa0: 69 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  it);.int sqlite3
4ab0: 46 74 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c 62  Fts5StorageRollb
4ac0: 61 63 6b 28 46 74 73 35 53 74 6f 72 61 67 65 20  ack(Fts5Storage 
4ad0: 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  *p);..int sqlite
4ae0: 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 66  3Fts5StorageConf
4af0: 69 67 56 61 6c 75 65 28 0a 20 20 20 20 46 74 73  igValue(.    Fts
4b00: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 63 6f 6e  5Storage *p, con
4b10: 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65  st char*, sqlite
4b20: 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 0a 29 3b  3_value*, int.);
4b30: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
4b40: 35 53 74 6f 72 61 67 65 53 70 65 63 69 61 6c 44  5StorageSpecialD
4b50: 65 6c 65 74 65 28 46 74 73 35 53 74 6f 72 61 67  elete(Fts5Storag
4b60: 65 20 2a 70 2c 20 69 36 34 20 69 44 65 6c 2c 20  e *p, i64 iDel, 
4b70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
4b80: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
4b90: 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 41  s5StorageDeleteA
4ba0: 6c 6c 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ll(Fts5Storage *
4bb0: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
4bc0: 74 73 35 53 74 6f 72 61 67 65 52 65 62 75 69 6c  ts5StorageRebuil
4bd0: 64 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  d(Fts5Storage *p
4be0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4bf0: 73 35 53 74 6f 72 61 67 65 4f 70 74 69 6d 69 7a  s5StorageOptimiz
4c00: 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  e(Fts5Storage *p
4c10: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4c20: 73 35 53 74 6f 72 61 67 65 4d 65 72 67 65 28 46  s5StorageMerge(F
4c30: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
4c40: 6e 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 2f 2a 0a  nt nMerge);../*.
4c50: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
4c60: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
4c70: 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 0a 2a  ts5_storage.c..*
4c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
4cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d10: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
4d20: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
4d30: 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 20 0a 2a   fts5_expr.c. .*
4d40: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
4d50: 20 46 74 73 35 45 78 70 72 20 46 74 73 35 45 78   Fts5Expr Fts5Ex
4d60: 70 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  pr;.typedef stru
4d70: 63 74 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  ct Fts5ExprNode 
4d80: 46 74 73 35 45 78 70 72 4e 6f 64 65 3b 0a 74 79  Fts5ExprNode;.ty
4d90: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
4da0: 35 50 61 72 73 65 20 46 74 73 35 50 61 72 73 65  5Parse Fts5Parse
4db0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
4dc0: 20 46 74 73 35 54 6f 6b 65 6e 20 46 74 73 35 54   Fts5Token Fts5T
4dd0: 6f 6b 65 6e 3b 0a 74 79 70 65 64 65 66 20 73 74  oken;.typedef st
4de0: 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68 72  ruct Fts5ExprPhr
4df0: 61 73 65 20 46 74 73 35 45 78 70 72 50 68 72 61  ase Fts5ExprPhra
4e00: 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  se;.typedef stru
4e10: 63 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  ct Fts5ExprNears
4e20: 65 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  et Fts5ExprNears
4e30: 65 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  et;..struct Fts5
4e40: 54 6f 6b 65 6e 20 7b 0a 20 20 63 6f 6e 73 74 20  Token {.  const 
4e50: 63 68 61 72 20 2a 70 3b 20 20 20 20 20 20 20 20  char *p;        
4e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b            /* Tok
4e70: 65 6e 20 74 65 78 74 20 28 6e 6f 74 20 4e 55 4c  en text (not NUL
4e80: 4c 20 74 65 72 6d 69 6e 61 74 65 64 29 20 2a 2f  L terminated) */
4e90: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
4ec0: 66 66 65 72 20 70 20 69 6e 20 62 79 74 65 73 20  ffer p in bytes 
4ed0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20  */.};../* Parse 
4ee0: 61 20 4d 41 54 43 48 20 65 78 70 72 65 73 73 69  a MATCH expressi
4ef0: 6f 6e 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on. */.int sqlit
4f00: 65 33 46 74 73 35 45 78 70 72 4e 65 77 28 0a 20  e3Fts5ExprNew(. 
4f10: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
4f20: 6e 66 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63  nfig, .  const c
4f30: 68 61 72 20 2a 7a 45 78 70 72 2c 0a 20 20 46 74  har *zExpr,.  Ft
4f40: 73 35 45 78 70 72 20 2a 2a 70 70 4e 65 77 2c 20  s5Expr **ppNew, 
4f50: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
4f60: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28 72 63  );../*.** for(rc
4f70: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78   = sqlite3Fts5Ex
4f80: 70 72 46 69 72 73 74 28 70 45 78 70 72 2c 20 70  prFirst(pExpr, p
4f90: 49 64 78 2c 20 62 44 65 73 63 29 3b 0a 2a 2a 20  Idx, bDesc);.** 
4fa0: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
4fb0: 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  K && 0==sqlite3F
4fc0: 74 73 35 45 78 70 72 45 6f 66 28 70 45 78 70 72  ts5ExprEof(pExpr
4fd0: 29 3b 0a 2a 2a 20 20 20 20 20 72 63 20 3d 20 73  );.**     rc = s
4fe0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e 65  qlite3Fts5ExprNe
4ff0: 78 74 28 70 45 78 70 72 29 0a 2a 2a 20 29 7b 0a  xt(pExpr).** ){.
5000: 2a 2a 20 20 20 2f 2f 20 54 68 65 20 64 6f 63 75  **   // The docu
5010: 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20  ment with rowid 
5020: 69 52 6f 77 69 64 20 6d 61 74 63 68 65 73 20 74  iRowid matches t
5030: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 21 0a 2a  he expression!.*
5040: 2a 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d  *   i64 iRowid =
5050: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
5060: 52 6f 77 69 64 28 70 45 78 70 72 29 3b 0a 2a 2a  Rowid(pExpr);.**
5070: 20 7d 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65   }.*/.int sqlite
5080: 33 46 74 73 35 45 78 70 72 46 69 72 73 74 28 46  3Fts5ExprFirst(F
5090: 74 73 35 45 78 70 72 2a 2c 20 46 74 73 35 49 6e  ts5Expr*, Fts5In
50a0: 64 65 78 20 2a 70 49 64 78 2c 20 69 36 34 20 69  dex *pIdx, i64 i
50b0: 4d 69 6e 2c 20 69 6e 74 20 62 44 65 73 63 29 3b  Min, int bDesc);
50c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
50d0: 45 78 70 72 4e 65 78 74 28 46 74 73 35 45 78 70  ExprNext(Fts5Exp
50e0: 72 2a 2c 20 69 36 34 20 69 4d 61 78 29 3b 0a 69  r*, i64 iMax);.i
50f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
5100: 70 72 45 6f 66 28 46 74 73 35 45 78 70 72 2a 29  prEof(Fts5Expr*)
5110: 3b 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74 73  ;.i64 sqlite3Fts
5120: 35 45 78 70 72 52 6f 77 69 64 28 46 74 73 35 45  5ExprRowid(Fts5E
5130: 78 70 72 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c  xpr*);..void sql
5140: 69 74 65 33 46 74 73 35 45 78 70 72 46 72 65 65  ite3Fts5ExprFree
5150: 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 0a 2f 2a  (Fts5Expr*);../*
5160: 20 43 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 73   Called during s
5170: 74 61 72 74 75 70 20 74 6f 20 72 65 67 69 73 74  tartup to regist
5180: 65 72 20 61 20 55 44 46 20 77 69 74 68 20 53 51  er a UDF with SQ
5190: 4c 69 74 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  Lite */.int sqli
51a0: 74 65 33 46 74 73 35 45 78 70 72 49 6e 69 74 28  te3Fts5ExprInit(
51b0: 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c  Fts5Global*, sql
51c0: 69 74 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  ite3*);..int sql
51d0: 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61  ite3Fts5ExprPhra
51e0: 73 65 43 6f 75 6e 74 28 46 74 73 35 45 78 70 72  seCount(Fts5Expr
51f0: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  *);.int sqlite3F
5200: 74 73 35 45 78 70 72 50 68 72 61 73 65 53 69 7a  ts5ExprPhraseSiz
5210: 65 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74  e(Fts5Expr*, int
5220: 20 69 50 68 72 61 73 65 29 3b 0a 69 6e 74 20 73   iPhrase);.int s
5230: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 6f  qlite3Fts5ExprPo
5240: 73 6c 69 73 74 28 46 74 73 35 45 78 70 72 2a 2c  slist(Fts5Expr*,
5250: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38 20 2a   int, const u8 *
5260: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
5270: 46 74 73 35 45 78 70 72 43 6c 6f 6e 65 50 68 72  Fts5ExprClonePhr
5280: 61 73 65 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c  ase(Fts5Config*,
5290: 20 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 2c   Fts5Expr*, int,
52a0: 20 46 74 73 35 45 78 70 72 2a 2a 29 3b 0a 0a 2f   Fts5Expr**);../
52b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
52e0: 68 65 20 66 74 73 35 5f 65 78 70 72 2e 63 20 41  he fts5_expr.c A
52f0: 50 49 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f  PI above this po
5300: 69 6e 74 20 69 73 20 75 73 65 64 20 62 79 20 74  int is used by t
5310: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2d 77 72  he other hand-wr
5320: 69 74 74 65 6e 0a 2a 2a 20 43 20 63 6f 64 65 20  itten.** C code 
5330: 69 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 20  in this module. 
5340: 54 68 65 20 69 6e 74 65 72 66 61 63 65 73 20 62  The interfaces b
5350: 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20  elow this point 
5360: 61 72 65 20 63 61 6c 6c 65 64 20 62 79 0a 2a 2a  are called by.**
5370: 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 64 65   the parser code
5380: 20 69 6e 20 66 74 73 35 70 61 72 73 65 2e 79 2e   in fts5parse.y.
5390: 20 20 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74    */..void sqlit
53a0: 65 33 46 74 73 35 50 61 72 73 65 45 72 72 6f 72  e3Fts5ParseError
53b0: 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72  (Fts5Parse *pPar
53c0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
53d0: 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0a 0a 46 74 73  zFmt, ...);..Fts
53e0: 35 45 78 70 72 4e 6f 64 65 20 2a 73 71 6c 69 74  5ExprNode *sqlit
53f0: 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28  e3Fts5ParseNode(
5400: 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
5410: 61 72 73 65 2c 0a 20 20 69 6e 74 20 65 54 79 70  arse,.  int eTyp
5420: 65 2c 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  e,.  Fts5ExprNod
5430: 65 20 2a 70 4c 65 66 74 2c 0a 20 20 46 74 73 35  e *pLeft,.  Fts5
5440: 45 78 70 72 4e 6f 64 65 20 2a 70 52 69 67 68 74  ExprNode *pRight
5450: 2c 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72  ,.  Fts5ExprNear
5460: 73 65 74 20 2a 70 4e 65 61 72 0a 29 3b 0a 0a 46  set *pNear.);..F
5470: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 73  ts5ExprPhrase *s
5480: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 54  qlite3Fts5ParseT
5490: 65 72 6d 28 0a 20 20 46 74 73 35 50 61 72 73 65  erm(.  Fts5Parse
54a0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 46 74 73   *pParse, .  Fts
54b0: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
54c0: 72 61 73 65 2c 20 0a 20 20 46 74 73 35 54 6f 6b  rase, .  Fts5Tok
54d0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 0a 20 20 69 6e  en *pToken,.  in
54e0: 74 20 62 50 72 65 66 69 78 0a 29 3b 0a 0a 46 74  t bPrefix.);..Ft
54f0: 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 73  s5ExprNearset *s
5500: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
5510: 65 61 72 73 65 74 28 0a 20 20 46 74 73 35 50 61  earset(.  Fts5Pa
5520: 72 73 65 2a 2c 20 0a 20 20 46 74 73 35 45 78 70  rse*, .  Fts5Exp
5530: 72 4e 65 61 72 73 65 74 2a 2c 0a 20 20 46 74 73  rNearset*,.  Fts
5540: 35 45 78 70 72 50 68 72 61 73 65 2a 20 0a 29 3b  5ExprPhrase* .);
5550: 0a 0a 46 74 73 35 43 6f 6c 73 65 74 20 2a 73 71  ..Fts5Colset *sq
5560: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43 6f  lite3Fts5ParseCo
5570: 6c 73 65 74 28 0a 20 20 46 74 73 35 50 61 72 73  lset(.  Fts5Pars
5580: 65 2a 2c 20 0a 20 20 46 74 73 35 43 6f 6c 73 65  e*, .  Fts5Colse
5590: 74 2a 2c 20 0a 20 20 46 74 73 35 54 6f 6b 65 6e  t*, .  Fts5Token
55a0: 20 2a 0a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69   *.);..void sqli
55b0: 74 65 33 46 74 73 35 50 61 72 73 65 50 68 72 61  te3Fts5ParsePhra
55c0: 73 65 46 72 65 65 28 46 74 73 35 45 78 70 72 50  seFree(Fts5ExprP
55d0: 68 72 61 73 65 2a 29 3b 0a 76 6f 69 64 20 73 71  hrase*);.void sq
55e0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
55f0: 61 72 73 65 74 46 72 65 65 28 46 74 73 35 45 78  arsetFree(Fts5Ex
5600: 70 72 4e 65 61 72 73 65 74 2a 29 3b 0a 76 6f 69  prNearset*);.voi
5610: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
5620: 73 65 4e 6f 64 65 46 72 65 65 28 46 74 73 35 45  seNodeFree(Fts5E
5630: 78 70 72 4e 6f 64 65 2a 29 3b 0a 0a 76 6f 69 64  xprNode*);..void
5640: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
5650: 65 53 65 74 44 69 73 74 61 6e 63 65 28 46 74 73  eSetDistance(Fts
5660: 35 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78 70  5Parse*, Fts5Exp
5670: 72 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35 54  rNearset*, Fts5T
5680: 6f 6b 65 6e 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  oken*);.void sql
5690: 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74  ite3Fts5ParseSet
56a0: 43 6f 6c 73 65 74 28 46 74 73 35 50 61 72 73 65  Colset(Fts5Parse
56b0: 2a 2c 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  *, Fts5ExprNears
56c0: 65 74 2a 2c 20 46 74 73 35 43 6f 6c 73 65 74 2a  et*, Fts5Colset*
56d0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
56e0: 74 73 35 50 61 72 73 65 46 69 6e 69 73 68 65 64  ts5ParseFinished
56f0: 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72  (Fts5Parse *pPar
5700: 73 65 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65  se, Fts5ExprNode
5710: 20 2a 70 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74   *p);.void sqlit
5720: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 28  e3Fts5ParseNear(
5730: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
5740: 65 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a  e, Fts5Token*);.
5750: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
5760: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
5770: 69 6e 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 0a  in fts5_expr.c..
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 0a 2f  **********/..../
57d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e  **********.** In
5820: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
5830: 69 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 20 0a  in fts5_aux.c. .
5840: 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  */..int sqlite3F
5850: 74 73 35 41 75 78 49 6e 69 74 28 66 74 73 35 5f  ts5AuxInit(fts5_
5860: 61 70 69 2a 29 3b 0a 2f 2a 0a 2a 2a 20 45 6e 64  api*);./*.** End
5870: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
5880: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 61 75   code in fts5_au
5890: 78 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  x.c..***********
58a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
58e0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
58f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
5930: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
5940: 64 65 20 69 6e 20 66 74 73 35 5f 74 6f 6b 65 6e  de in fts5_token
5950: 69 7a 65 72 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74  izer.c. .*/..int
5960: 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65   sqlite3Fts5Toke
5970: 6e 69 7a 65 72 49 6e 69 74 28 66 74 73 35 5f 61  nizerInit(fts5_a
5980: 70 69 2a 29 3b 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  pi*);./*.** End 
5990: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
59a0: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 74 6f 6b  code in fts5_tok
59b0: 65 6e 69 7a 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  enizer.c..******
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a00: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a50: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
5a60: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
5a70: 76 6f 63 61 62 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e  vocab.c. .*/..in
5a80: 74 20 73 71 6c 69 74 65 33 46 74 73 35 56 6f 63  t sqlite3Fts5Voc
5a90: 61 62 49 6e 69 74 28 46 74 73 35 47 6c 6f 62 61  abInit(Fts5Globa
5aa0: 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 0a  l*, sqlite3*);..
5ab0: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
5ac0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
5ad0: 6e 20 66 74 73 35 5f 76 6f 63 61 62 2e 63 2e 0a  n fts5_vocab.c..
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
5b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
5b80: 65 72 66 61 63 65 20 74 6f 20 61 75 74 6f 6d 61  erface to automa
5b90: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
5ba0: 64 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 75  d code in fts5_u
5bb0: 6e 69 63 6f 64 65 32 2e 63 2e 20 0a 2a 2f 0a 69  nicode2.c. .*/.i
5bc0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e  nt sqlite3Fts5Un
5bd0: 69 63 6f 64 65 49 73 61 6c 6e 75 6d 28 69 6e 74  icodeIsalnum(int
5be0: 20 63 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33   c);.int sqlite3
5bf0: 46 74 73 35 55 6e 69 63 6f 64 65 49 73 64 69 61  Fts5UnicodeIsdia
5c00: 63 72 69 74 69 63 28 69 6e 74 20 63 29 3b 0a 69  critic(int c);.i
5c10: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e  nt sqlite3Fts5Un
5c20: 69 63 6f 64 65 46 6f 6c 64 28 69 6e 74 20 63 2c  icodeFold(int c,
5c30: 20 69 6e 74 20 62 52 65 6d 6f 76 65 44 69 61 63   int bRemoveDiac
5c40: 72 69 74 69 63 29 3b 0a 2f 2a 0a 2a 2a 20 45 6e  ritic);./*.** En
5c50: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
5c60: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 75  o code in fts5_u
5c70: 6e 69 63 6f 64 65 32 2e 63 2e 0a 2a 2a 2a 2a 2a  nicode2.c..*****
5c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cc0: 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 0a     *****/..#endif.