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

Artifact 93ff3f2ae0789abc10c6832c32273db30024ead8:


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 47 72 6f 77 28 69 6e 74 2a 2c 20 46 74 73  erGrow(int*, Fts
1b00: 35 42 75 66 66 65 72 2a 2c 20 69 6e 74 29 3b 0a  5Buffer*, int);.
1b10: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
1b20: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1b30: 6e 74 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66  nt(int*, Fts5Buf
1b40: 66 65 72 2a 2c 20 69 36 34 29 3b 0a 76 6f 69 64  fer*, i64);.void
1b50: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1b60: 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 69 6e 74  erAppendBlob(int
1b70: 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
1b80: 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38 2a 29 3b  int, const u8*);
1b90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
1ba0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 53 74 72  5BufferAppendStr
1bb0: 69 6e 67 28 69 6e 74 20 2a 2c 20 46 74 73 35 42  ing(int *, Fts5B
1bc0: 75 66 66 65 72 2a 2c 20 63 6f 6e 73 74 20 63 68  uffer*, const ch
1bd0: 61 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  ar*);.void sqlit
1be0: 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65  e3Fts5BufferFree
1bf0: 28 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 76  (Fts5Buffer*);.v
1c00: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
1c10: 75 66 66 65 72 5a 65 72 6f 28 46 74 73 35 42 75  ufferZero(Fts5Bu
1c20: 66 66 65 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  ffer*);.void sql
1c30: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
1c40: 74 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66  t(int*, Fts5Buff
1c50: 65 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20  er*, int, const 
1c60: 75 38 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  u8*);.void sqlit
1c70: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1c80: 6e 64 50 72 69 6e 74 66 28 69 6e 74 20 2a 2c 20  ndPrintf(int *, 
1c90: 46 74 73 35 42 75 66 66 65 72 2a 2c 20 63 68 61  Fts5Buffer*, cha
1ca0: 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0a 76  r *zFmt, ...);.v
1cb0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
1cc0: 75 66 66 65 72 41 70 70 65 6e 64 33 32 28 69 6e  ufferAppend32(in
1cd0: 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c  t*, Fts5Buffer*,
1ce0: 20 69 6e 74 29 3b 0a 0a 63 68 61 72 20 2a 73 71   int);..char *sq
1cf0: 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66  lite3Fts5Mprintf
1d00: 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74  (int *pRc, const
1d10: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
1d20: 29 3b 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  );..#define fts5
1d30: 42 75 66 66 65 72 5a 65 72 6f 28 78 29 20 20 20  BufferZero(x)   
1d40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d50: 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28  3Fts5BufferZero(
1d60: 78 29 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42  x).#define fts5B
1d70: 75 66 66 65 72 47 72 6f 77 28 61 2c 62 2c 63 29  ufferGrow(a,b,c)
1d80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d90: 46 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 61  Fts5BufferGrow(a
1da0: 2c 62 2c 63 29 0a 23 64 65 66 69 6e 65 20 66 74  ,b,c).#define ft
1db0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1dc0: 72 69 6e 74 28 61 2c 62 2c 63 29 20 73 71 6c 69  rint(a,b,c) sqli
1dd0: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1de0: 65 6e 64 56 61 72 69 6e 74 28 61 2c 62 2c 63 29  endVarint(a,b,c)
1df0: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66  .#define fts5Buf
1e00: 66 65 72 46 72 65 65 28 61 29 20 20 20 20 20 20  ferFree(a)      
1e10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1e20: 73 35 42 75 66 66 65 72 46 72 65 65 28 61 29 0a  s5BufferFree(a).
1e30: 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66  #define fts5Buff
1e40: 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62  erAppendBlob(a,b
1e50: 2c 63 2c 64 29 20 73 71 6c 69 74 65 33 46 74 73  ,c,d) sqlite3Fts
1e60: 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1e70: 62 28 61 2c 62 2c 63 2c 64 29 0a 23 64 65 66 69  b(a,b,c,d).#defi
1e80: 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 65 74  ne fts5BufferSet
1e90: 28 61 2c 62 2c 63 2c 64 29 20 20 20 20 20 20 20  (a,b,c,d)       
1ea0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1eb0: 65 72 53 65 74 28 61 2c 62 2c 63 2c 64 29 0a 23  erSet(a,b,c,d).#
1ec0: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
1ed0: 72 41 70 70 65 6e 64 33 32 28 61 2c 62 2c 63 29  rAppend32(a,b,c)
1ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1ef0: 42 75 66 66 65 72 41 70 70 65 6e 64 33 32 28 61  BufferAppend32(a
1f00: 2c 62 2c 63 29 0a 0a 2f 2a 20 57 72 69 74 65 20  ,b,c)../* Write 
1f10: 61 6e 64 20 64 65 63 6f 64 65 20 62 69 67 2d 65  and decode big-e
1f20: 6e 64 69 61 6e 20 33 32 2d 62 69 74 20 69 6e 74  ndian 32-bit int
1f30: 65 67 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 76  eger values */.v
1f40: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
1f50: 75 74 33 32 28 75 38 2a 2c 20 69 6e 74 29 3b 0a  ut32(u8*, int);.
1f60: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 47  int sqlite3Fts5G
1f70: 65 74 33 32 28 63 6f 6e 73 74 20 75 38 2a 29 3b  et32(const u8*);
1f80: 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50  ..#define FTS5_P
1f90: 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 20  OS2COLUMN(iPos) 
1fa0: 28 69 6e 74 29 28 69 50 6f 73 20 3e 3e 20 33 32  (int)(iPos >> 32
1fb0: 29 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50  ).#define FTS5_P
1fc0: 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 20  OS2OFFSET(iPos) 
1fd0: 28 69 6e 74 29 28 69 50 6f 73 20 26 20 30 78 46  (int)(iPos & 0xF
1fe0: 46 46 46 46 46 46 46 29 0a 0a 74 79 70 65 64 65  FFFFFFF)..typede
1ff0: 66 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73  f struct Fts5Pos
2000: 6c 69 73 74 52 65 61 64 65 72 20 46 74 73 35 50  listReader Fts5P
2010: 6f 73 6c 69 73 74 52 65 61 64 65 72 3b 0a 73 74  oslistReader;.st
2020: 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74  ruct Fts5Poslist
2030: 52 65 61 64 65 72 20 7b 0a 20 20 2f 2a 20 56 61  Reader {.  /* Va
2040: 72 69 61 62 6c 65 73 20 75 73 65 64 20 6f 6e 6c  riables used onl
2050: 79 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 35  y by sqlite3Fts5
2060: 50 6f 73 6c 69 73 74 49 74 65 72 58 58 58 28 29  PoslistIterXXX()
2070: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20   functions. */. 
2080: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 2f 2a 20 49 66 20 28 69 43 6f 6c 3e 3d 30 29   /* If (iCol>=0)
20b0: 2c 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 6e  , this column on
20c0: 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ly */.  const u8
20d0: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
20e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
20f0: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 69 74 65 72  ion list to iter
2100: 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  ate through */. 
2110: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
2140: 65 72 20 61 74 20 61 5b 5d 20 69 6e 20 62 79 74  er at a[] in byt
2150: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  es */.  int i;  
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2180: 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 61 5b 5d  nt offset in a[]
2190: 20 2a 2f 0a 0a 20 20 75 38 20 62 46 6c 61 67 3b   */..  u8 bFlag;
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6c         /* For cl
21c0: 69 65 6e 74 20 75 73 65 20 28 61 6e 79 20 63 75  ient use (any cu
21d0: 73 74 6f 6d 20 70 75 72 70 6f 73 65 29 20 2a 2f  stom purpose) */
21e0: 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
21f0: 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 75 38 20  riables */.  u8 
2200: 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20  bEof;           
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2220: 53 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 45  Set to true at E
2230: 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 50 6f 73  OF */.  i64 iPos
2240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2250: 20 20 20 20 20 20 20 20 2f 2a 20 28 69 43 6f 6c          /* (iCol
2260: 3c 3c 33 32 29 20 2b 20 69 50 6f 73 20 2a 2f 0a  <<32) + iPos */.
2270: 7d 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  };.int sqlite3Ft
2280: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49  s5PoslistReaderI
2290: 6e 69 74 28 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  nit(.  int iCol,
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 28 69 43         /* If (iC
22c0: 6f 6c 3e 3d 30 29 2c 20 74 68 69 73 20 63 6f 6c  ol>=0), this col
22d0: 75 6d 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f  umn only */.  co
22e0: 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
22f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2300: 20 50 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20   Poslist buffer 
2310: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2320: 67 68 20 2a 2f 0a 20 20 46 74 73 35 50 6f 73 6c  gh */.  Fts5Posl
2330: 69 73 74 52 65 61 64 65 72 20 2a 70 49 74 65 72  istReader *pIter
2340: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2350: 74 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 69 6e  tor object to in
2360: 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 29 3b 0a 69  itialize */.);.i
2370: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  nt sqlite3Fts5Po
2380: 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
2390: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
23a0: 72 2a 29 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  r*);..typedef st
23b0: 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74  ruct Fts5Poslist
23c0: 57 72 69 74 65 72 20 46 74 73 35 50 6f 73 6c 69  Writer Fts5Posli
23d0: 73 74 57 72 69 74 65 72 3b 0a 73 74 72 75 63 74  stWriter;.struct
23e0: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
23f0: 65 72 20 7b 0a 20 20 69 36 34 20 69 50 72 65 76  er {.  i64 iPrev
2400: 3b 0a 7d 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.};.int sqlite3
2410: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
2420: 72 41 70 70 65 6e 64 28 46 74 73 35 42 75 66 66  rAppend(Fts5Buff
2430: 65 72 2a 2c 20 46 74 73 35 50 6f 73 6c 69 73 74  er*, Fts5Poslist
2440: 57 72 69 74 65 72 2a 2c 20 69 36 34 29 3b 0a 0a  Writer*, i64);..
2450: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
2460: 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 0a 20 20  oslistNext64(.  
2470: 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2480: 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
2490: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
24a0: 6e 69 6e 67 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  ning poslist */.
24b0: 20 20 69 6e 74 20 2a 70 69 2c 20 20 20 20 20 20    int *pi,      
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4f 66 66    /* IN/OUT: Off
24e0: 73 65 74 20 77 69 74 68 69 6e 20 61 5b 5d 20 2a  set within a[] *
24f0: 2f 0a 20 20 69 36 34 20 2a 70 69 4f 66 66 20 20  /.  i64 *piOff  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
2520: 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 2a 2f  urrent offset */
2530: 0a 29 3b 0a 0a 2f 2a 20 4d 61 6c 6c 6f 63 20 75  .);../* Malloc u
2540: 74 69 6c 69 74 79 20 2a 2f 0a 76 6f 69 64 20 2a  tility */.void *
2550: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
2560: 63 5a 65 72 6f 28 69 6e 74 20 2a 70 52 63 2c 20  cZero(int *pRc, 
2570: 69 6e 74 20 6e 42 79 74 65 29 3b 0a 63 68 61 72  int nByte);.char
2580: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 53 74 72   *sqlite3Fts5Str
2590: 6e 64 75 70 28 69 6e 74 20 2a 70 52 63 2c 20 63  ndup(int *pRc, c
25a0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20  onst char *pIn, 
25b0: 69 6e 74 20 6e 49 6e 29 3b 0a 0a 2f 2a 20 43 68  int nIn);../* Ch
25c0: 61 72 61 63 74 65 72 20 73 65 74 20 74 65 73 74  aracter set test
25d0: 73 20 28 6c 69 6b 65 20 69 73 73 70 61 63 65 28  s (like isspace(
25e0: 29 2c 20 69 73 61 6c 70 68 61 28 29 20 65 74 63  ), isalpha() etc
25f0: 2e 29 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .) */.int sqlite
2600: 33 46 74 73 35 49 73 42 61 72 65 77 6f 72 64 28  3Fts5IsBareword(
2610: 63 68 61 72 20 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char t);../*.** 
2620: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
2630: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
2640: 5f 62 75 66 66 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a  _buffer.c..*****
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2690: 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e0: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
26f0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
2700: 5f 69 6e 64 65 78 2e 63 2e 20 66 74 73 35 5f 69  _index.c. fts5_i
2710: 6e 64 65 78 2e 63 20 63 6f 6e 74 61 69 6e 73 20  ndex.c contains 
2720: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 0a 2a 2a  contains code.**
2730: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
2740: 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
2750: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
2760: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  */..typedef stru
2770: 63 74 20 46 74 73 35 49 6e 64 65 78 20 46 74 73  ct Fts5Index Fts
2780: 35 49 6e 64 65 78 3b 0a 74 79 70 65 64 65 66 20  5Index;.typedef 
2790: 73 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78  struct Fts5Index
27a0: 49 74 65 72 20 46 74 73 35 49 6e 64 65 78 49 74  Iter Fts5IndexIt
27b0: 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65  er;../*.** Value
27c0: 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
27d0: 66 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75  f the flags argu
27e0: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 49  ment passed to I
27f0: 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a  ndexQuery()..*/.
2800: 23 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45  #define FTS5INDE
2810: 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 20  X_QUERY_PREFIX  
2820: 20 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20 50     0x0001   /* P
2830: 72 65 66 69 78 20 71 75 65 72 79 20 2a 2f 0a 23  refix query */.#
2840: 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58  define FTS5INDEX
2850: 5f 51 55 45 52 59 5f 44 45 53 43 20 20 20 20 20  _QUERY_DESC     
2860: 20 20 30 78 30 30 30 32 20 20 20 2f 2a 20 44 6f    0x0002   /* Do
2870: 63 73 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67  cs in descending
2880: 20 72 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a   rowid order */.
2890: 23 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45  #define FTS5INDE
28a0: 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  X_QUERY_TEST_NOI
28b0: 44 58 20 30 78 30 30 30 34 20 20 20 2f 2a 20 44  DX 0x0004   /* D
28c0: 6f 20 6e 6f 74 20 75 73 65 20 70 72 65 66 69 78  o not use prefix
28d0: 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e   index */.#defin
28e0: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
28f0: 59 5f 53 43 41 4e 20 20 20 20 20 20 20 30 78 30  Y_SCAN       0x0
2900: 30 30 38 20 20 20 2f 2a 20 53 63 61 6e 20 71 75  008   /* Scan qu
2910: 65 72 79 20 28 66 74 73 35 76 6f 63 61 62 29 20  ery (fts5vocab) 
2920: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  */../*.** Create
2930: 2f 64 65 73 74 72 6f 79 20 61 6e 20 46 74 73 35  /destroy an Fts5
2940: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Index object..*/
2950: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2960: 49 6e 64 65 78 4f 70 65 6e 28 46 74 73 35 43 6f  IndexOpen(Fts5Co
2970: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 69  nfig *pConfig, i
2980: 6e 74 20 62 43 72 65 61 74 65 2c 20 46 74 73 35  nt bCreate, Fts5
2990: 49 6e 64 65 78 2a 2a 2c 20 63 68 61 72 2a 2a 29  Index**, char**)
29a0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
29b0: 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35  5IndexClose(Fts5
29c0: 49 6e 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a  Index *p);../*.*
29d0: 2a 20 66 6f 72 28 0a 2a 2a 20 20 20 73 71 6c 69  * for(.**   sqli
29e0: 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
29f0: 79 28 70 2c 20 22 74 6f 6b 65 6e 22 2c 20 35 2c  y(p, "token", 5,
2a00: 20 30 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a   0, 0, &pIter);.
2a10: 2a 2a 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 46  **   0==sqlite3F
2a20: 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65 72  ts5IterEof(pIter
2a30: 29 3b 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 46  );.**   sqlite3F
2a40: 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 74 65  ts5IterNext(pIte
2a50: 72 29 0a 2a 2a 20 29 7b 0a 2a 2a 20 20 20 69 36  r).** ){.**   i6
2a60: 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  4 iRowid = sqlit
2a70: 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28  e3Fts5IterRowid(
2a80: 70 49 74 65 72 29 3b 0a 2a 2a 20 7d 0a 2a 2f 0a  pIter);.** }.*/.
2a90: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
2aa0: 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74  w iterator to it
2ab0: 65 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c  erate though all
2ac0: 20 72 6f 77 69 64 73 20 74 68 61 74 20 6d 61 74   rowids that mat
2ad0: 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69  ch the .** speci
2ae0: 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f  fied token or to
2af0: 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69  ken prefix..*/.i
2b00: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2b10: 64 65 78 51 75 65 72 79 28 0a 20 20 46 74 73 35  dexQuery(.  Fts5
2b20: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b40: 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72  TS index to quer
2b50: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
2b60: 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
2b70: 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20  Token, /* Token 
2b80: 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20 71  (or prefix) to q
2b90: 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  uery for */.  in
2ba0: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bc0: 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44   Mask of FTS5IND
2bd0: 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73  EX_QUERY_X flags
2be0: 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
2bf0: 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20   *pColset,      
2c00: 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74        /* Match t
2c10: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c  hese columns onl
2c20: 79 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  y */.  Fts5Index
2c30: 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
2c40: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
2c50: 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ew iterator obje
2c60: 63 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ct */.);../*.** 
2c70: 54 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72  The various oper
2c80: 61 74 69 6f 6e 73 20 6f 6e 20 6f 70 65 6e 20 74  ations on open t
2c90: 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
2ca0: 65 66 69 78 20 69 74 65 72 61 74 6f 72 73 20 6f  efix iterators o
2cb0: 70 65 6e 65 64 0a 2a 2a 20 75 73 69 6e 67 20 73  pened.** using s
2cc0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
2cd0: 75 65 72 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  uery()..*/.int s
2ce0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
2cf0: 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a  f(Fts5IndexIter*
2d00: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
2d10: 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  s5IterNext(Fts5I
2d20: 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20  ndexIter*);.int 
2d30: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
2d40: 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
2d50: 78 49 74 65 72 2a 2c 20 69 36 34 20 69 4d 61 74  xIter*, i64 iMat
2d60: 63 68 29 3b 0a 69 36 34 20 73 71 6c 69 74 65 33  ch);.i64 sqlite3
2d70: 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 46 74  Fts5IterRowid(Ft
2d80: 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69  s5IndexIter*);.i
2d90: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
2da0: 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e  erPoslist(Fts5In
2db0: 64 65 78 49 74 65 72 2a 2c 20 63 6f 6e 73 74 20  dexIter*, const 
2dc0: 75 38 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 6e  u8 **pp, int *pn
2dd0: 2c 20 69 36 34 20 2a 70 69 29 3b 0a 69 6e 74 20  , i64 *pi);.int 
2de0: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
2df0: 6f 73 6c 69 73 74 42 75 66 66 65 72 28 46 74 73  oslistBuffer(Fts
2e00: 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
2e10: 72 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  r, Fts5Buffer *p
2e20: 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  Buf);../*.** Clo
2e30: 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f  se an iterator o
2e40: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
2e50: 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
2e60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2e70: 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46  3Fts5IterClose(F
2e80: 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a  ts5IndexIter*);.
2e90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  ./*.** This inte
2ea0: 72 66 61 63 65 20 69 73 20 75 73 65 64 20 62 79  rface is used by
2eb0: 20 74 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d   the fts5vocab m
2ec0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  odule..*/.const 
2ed0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73  char *sqlite3Fts
2ee0: 35 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e  5IterTerm(Fts5In
2ef0: 64 65 78 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  dexIter*, int*);
2f00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2f10: 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73  IterNextScan(Fts
2f20: 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 0a  5IndexIter*);...
2f30: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
2f40: 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f  remove data to o
2f50: 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  r from the index
2f60: 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f  . Each time a do
2f70: 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64  cument is .** ad
2f80: 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65  ded to or remove
2f90: 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  d from the index
2fa0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2fb0: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72  is called one or
2fc0: 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a   more.** times..
2fd0: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73  **.** For an ins
2fe0: 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ert, it must be 
2ff0: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
3000: 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68  each token in th
3010: 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a  e new document..
3020: 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  ** If the operat
3030: 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c  ion is a delete,
3040: 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c   it must be call
3050: 65 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e  ed (at least) on
3060: 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75  ce for each.** u
3070: 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74  nique token in t
3080: 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
3090: 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c   an iCol value l
30a0: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54  ess than zero. T
30b0: 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d  he iPos.** argum
30c0: 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66  ent is ignored f
30d0: 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a  or a delete..*/.
30e0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
30f0: 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73  ndexWrite(.  Fts
3100: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3120: 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74  Index to write t
3130: 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  o */.  int iCol,
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
3160: 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69   token appears i
3170: 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65  n (-ve -> delete
3180: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c  ) */.  int iPos,
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
31b0: 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68  on of token with
31c0: 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  in column */.  c
31d0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
31e0: 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f  n, int nToken  /
31f0: 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f  * Token to add o
3200: 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66  r remove to or f
3210: 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a  rom index */.);.
3220: 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
3230: 74 68 61 74 20 73 75 62 73 65 71 75 65 6e 74 20  that subsequent 
3240: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
3250: 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29  Fts5IndexWrite()
3260: 20 70 65 72 74 61 69 6e 20 74 6f 0a 2a 2a 20 64   pertain to.** d
3270: 6f 63 75 6d 65 6e 74 20 69 44 6f 63 69 64 2e 0a  ocument iDocid..
3280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
3290: 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74  s5IndexBeginWrit
32a0: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
32b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
32c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
32d0: 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
32e0: 6e 74 20 62 44 65 6c 65 74 65 2c 20 20 20 20 20  nt bDelete,     
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3300: 2a 20 54 72 75 65 20 69 66 20 63 75 72 72 65 6e  * True if curren
3310: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  t operation is a
3320: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 36 34   delete */.  i64
3330: 20 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20   iDocid         
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3350: 44 6f 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20  Docid to add or 
3360: 72 65 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d  remove data from
3370: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c   */.);../*.** Fl
3380: 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
3390: 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
33a0: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
33b0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
33c0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  ..** If the bCom
33d0: 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
33e0: 2c 20 61 6c 73 6f 20 63 6c 6f 73 65 20 61 6e 79  , also close any
33f0: 20 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c   open blob handl
3400: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
3410: 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28  e3Fts5IndexSync(
3420: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
3430: 74 20 62 43 6f 6d 6d 69 74 29 3b 0a 0a 2f 2a 0a  t bCommit);../*.
3440: 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64  ** Discard any d
3450: 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
3460: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
3470: 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20   tables. Do not 
3480: 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74  write it.** to t
3490: 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
34a0: 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  itionally, assum
34b0: 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  e that the conte
34c0: 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
34d0: 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68  a.** table may h
34e0: 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64  ave changed on d
34f0: 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d  isk. So any in-m
3500: 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20  emory caches of 
3510: 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72  %_data .** recor
3520: 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
3530: 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  idated..*/.int s
3540: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
3550: 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65  ollback(Fts5Inde
3560: 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65  x *p);../*.** Ge
3570: 74 20 6f 72 20 73 65 74 20 74 68 65 20 22 61 76  t or set the "av
3580: 65 72 61 67 65 73 22 20 76 61 6c 75 65 73 2e 0a  erages" values..
3590: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
35a0: 73 35 49 6e 64 65 78 47 65 74 41 76 65 72 61 67  s5IndexGetAverag
35b0: 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  es(Fts5Index *p,
35c0: 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34   i64 *pnRow, i64
35d0: 20 2a 61 6e 53 69 7a 65 29 3b 0a 69 6e 74 20 73   *anSize);.int s
35e0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
35f0: 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
3600: 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75  ndex *p, const u
3610: 38 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  8*, int);../*.**
3620: 20 46 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 65   Functions calle
3630: 64 20 62 79 20 74 68 65 20 73 74 6f 72 61 67 65  d by the storage
3640: 20 6d 6f 64 75 6c 65 20 61 73 20 70 61 72 74 20   module as part 
3650: 6f 66 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  of integrity-che
3660: 63 6b 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  ck..*/.u64 sqlit
3670: 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d  e3Fts5IndexCksum
3680: 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 69 36 34  (Fts5Config*,i64
3690: 2c 69 6e 74 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  ,int,int,const c
36a0: 68 61 72 2a 2c 69 6e 74 29 3b 0a 69 6e 74 20 73  har*,int);.int s
36b0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
36c0: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74  ntegrityCheck(Ft
36d0: 73 35 49 6e 64 65 78 2a 2c 20 75 36 34 20 63 6b  s5Index*, u64 ck
36e0: 73 75 6d 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 61  sum);../* .** Ca
36f0: 6c 6c 65 64 20 64 75 72 69 6e 67 20 76 69 72 74  lled during virt
3700: 75 61 6c 20 6d 6f 64 75 6c 65 20 69 6e 69 74 69  ual module initi
3710: 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 20 72 65 67  alization to reg
3720: 69 73 74 65 72 20 55 44 46 20 0a 2a 2a 20 66 74  ister UDF .** ft
3730: 73 35 5f 64 65 63 6f 64 65 28 29 20 77 69 74 68  s5_decode() with
3740: 20 53 51 4c 69 74 65 20 0a 2a 2f 0a 69 6e 74 20   SQLite .*/.int 
3750: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
3760: 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
3770: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3780: 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46  IndexSetCookie(F
3790: 74 73 35 49 6e 64 65 78 2a 2c 20 69 6e 74 29 3b  ts5Index*, int);
37a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
37b0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
37c0: 6f 66 20 65 6e 74 72 69 65 73 20 72 65 61 64 20  of entries read 
37d0: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
37e0: 74 61 62 6c 65 20 62 79 20 0a 2a 2a 20 74 68 69  table by .** thi
37f0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  s connection sin
3800: 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65  ce it was create
3810: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3820: 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28  3Fts5IndexReads(
3830: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a 0a  Fts5Index *p);..
3840: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
3850: 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49  ndexReinit(Fts5I
3860: 6e 64 65 78 20 2a 70 29 3b 0a 69 6e 74 20 73 71  ndex *p);.int sq
3870: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
3880: 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78  timize(Fts5Index
3890: 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *p);.int sqlite
38a0: 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28  3Fts5IndexMerge(
38b0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
38c0: 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 69 6e 74 20  t nMerge);..int 
38d0: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
38e0: 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
38f0: 6e 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a  ndex *p);../*.**
3900: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
3910: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
3920: 35 5f 69 6e 64 65 78 2e 63 2e 0a 2a 2a 2a 2a 2a  5_index.c..*****
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 2a 2a 2a 2a 2a  ****************
3970: 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a  ****************
39c0: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
39d0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
39e0: 5f 76 61 72 69 6e 74 2e 63 2e 20 0a 2a 2f 0a 69  _varint.c. .*/.i
39f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  nt sqlite3Fts5Ge
3a00: 74 56 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20  tVarint32(const 
3a10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
3a20: 2c 20 75 33 32 20 2a 76 29 3b 0a 69 6e 74 20 73  , u32 *v);.int s
3a30: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
3a40: 69 6e 74 4c 65 6e 28 75 33 32 20 69 56 61 6c 29  intLen(u32 iVal)
3a50: 3b 0a 75 38 20 73 71 6c 69 74 65 33 46 74 73 35  ;.u8 sqlite3Fts5
3a60: 47 65 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 20  GetVarint(const 
3a70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20  unsigned char*, 
3a80: 75 36 34 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  u64*);.int sqlit
3a90: 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
3aa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
3ab0: 2c 20 75 36 34 20 76 29 3b 0a 0a 23 64 65 66 69  , u64 v);..#defi
3ac0: 6e 65 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  ne fts5GetVarint
3ad0: 33 32 28 61 2c 62 29 20 73 71 6c 69 74 65 33 46  32(a,b) sqlite3F
3ae0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61  ts5GetVarint32(a
3af0: 2c 28 75 33 32 2a 29 26 62 29 0a 23 64 65 66 69  ,(u32*)&b).#defi
3b00: 6e 65 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  ne fts5GetVarint
3b10: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 47      sqlite3Fts5G
3b20: 65 74 56 61 72 69 6e 74 0a 0a 2f 2a 0a 2a 2a 20  etVarint../*.** 
3b30: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
3b40: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
3b50: 5f 76 61 72 69 6e 74 2e 63 2e 0a 2a 2a 2a 2a 2a  _varint.c..*****
3b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ba0: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
3bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3bf0: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
3c00: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
3c10: 35 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71  5.c. .*/..int sq
3c20: 6c 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b 65  lite3Fts5GetToke
3c30: 6e 69 7a 65 72 28 0a 20 20 46 74 73 35 47 6c 6f  nizer(.  Fts5Glo
3c40: 62 61 6c 2a 2c 20 0a 20 20 63 6f 6e 73 74 20 63  bal*, .  const c
3c50: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69  har **azArg,.  i
3c60: 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74 73 35 54  nt nArg,.  Fts5T
3c70: 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a 20 20 66 74  okenizer**,.  ft
3c80: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a  s5_tokenizer**,.
3c90: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
3ca0: 3b 0a 0a 46 74 73 35 49 6e 64 65 78 20 2a 73 71  ;..Fts5Index *sq
3cb0: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 46 72  lite3Fts5IndexFr
3cc0: 6f 6d 43 73 72 69 64 28 46 74 73 35 47 6c 6f 62  omCsrid(Fts5Glob
3cd0: 61 6c 2a 2c 20 69 36 34 2c 20 69 6e 74 2a 29 3b  al*, i64, int*);
3ce0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
3cf0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
3d00: 20 69 6e 20 66 74 73 35 2e 63 2e 0a 2a 2a 2a 2a   in fts5.c..****
3d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d50: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
3d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3da0: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
3db0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
3dc0: 35 5f 68 61 73 68 2e 63 2e 20 0a 2a 2f 0a 74 79  5_hash.c. .*/.ty
3dd0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
3de0: 35 48 61 73 68 20 46 74 73 35 48 61 73 68 3b 0a  5Hash Fts5Hash;.
3df0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3e00: 68 61 73 68 20 74 61 62 6c 65 2c 20 66 72 65 65  hash table, free
3e10: 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a   a hash table..*
3e20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3e30: 35 48 61 73 68 4e 65 77 28 46 74 73 35 48 61 73  5HashNew(Fts5Has
3e40: 68 2a 2a 2c 20 69 6e 74 20 2a 70 6e 53 69 7a 65  h**, int *pnSize
3e50: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
3e60: 74 73 35 48 61 73 68 46 72 65 65 28 46 74 73 35  ts5HashFree(Fts5
3e70: 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  Hash*);..int sql
3e80: 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
3e90: 65 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 0a  e(.  Fts5Hash*,.
3ea0: 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
3ed0: 68 69 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  his entry */.  i
3ee0: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f00: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
3f10: 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
3f20: 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
3f30: 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f50: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
3f60: 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
3f70: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 62 42 79 74  n */.  char bByt
3f80: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
3f90: 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
3fa0: 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
3fb0: 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
3fc0: 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
3fd0: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70  */.);../*.** Emp
3fe0: 74 79 20 28 62 75 74 20 64 6f 20 6e 6f 74 20 64  ty (but do not d
3ff0: 65 6c 65 74 65 29 20 61 20 68 61 73 68 20 74 61  elete) a hash ta
4000: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
4010: 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
4020: 72 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 0a 69  r(Fts5Hash*);..i
4030: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  nt sqlite3Fts5Ha
4040: 73 68 51 75 65 72 79 28 0a 20 20 46 74 73 35 48  shQuery(.  Fts5H
4050: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
4060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
4070: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
4080: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
4090: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
40a0: 65 72 6d 2c 20 20 20 2f 2a 20 51 75 65 72 79 20  erm,   /* Query 
40b0: 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
40c0: 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20  u8 **ppDoclist, 
40d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
40e0: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  : Pointer to doc
40f0: 6c 69 73 74 20 66 6f 72 20 70 54 65 72 6d 20 2a  list for pTerm *
4100: 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69  /.  int *pnDocli
4110: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
4120: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
4130: 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
4140: 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a 69 6e 74 20  ytes */.);..int 
4150: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
4160: 63 61 6e 49 6e 69 74 28 0a 20 20 46 74 73 35 48  canInit(.  Fts5H
4170: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
4180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
4190: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
41a0: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
41b0: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
41c0: 65 72 6d 20 20 20 20 2f 2a 20 51 75 65 72 79 20  erm    /* Query 
41d0: 70 72 65 66 69 78 20 2a 2f 0a 29 3b 0a 76 6f 69  prefix */.);.voi
41e0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
41f0: 68 53 63 61 6e 4e 65 78 74 28 46 74 73 35 48 61  hScanNext(Fts5Ha
4200: 73 68 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  sh*);.int sqlite
4210: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
4220: 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 76 6f 69  (Fts5Hash*);.voi
4230: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
4240: 68 53 63 61 6e 45 6e 74 72 79 28 46 74 73 35 48  hScanEntry(Fts5H
4250: 61 73 68 20 2a 2c 0a 20 20 63 6f 6e 73 74 20 63  ash *,.  const c
4260: 68 61 72 20 2a 2a 70 7a 54 65 72 6d 2c 20 20 20  har **pzTerm,   
4270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4280: 20 74 65 72 6d 20 28 6e 75 6c 2d 74 65 72 6d 69   term (nul-termi
4290: 6e 61 74 65 64 29 20 2a 2f 0a 20 20 63 6f 6e 73  nated) */.  cons
42a0: 74 20 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74  t u8 **ppDoclist
42b0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
42c0: 55 54 3a 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  UT: pointer to d
42d0: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
42e0: 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20  *pnDoclist      
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4300: 55 54 3a 20 73 69 7a 65 20 6f 66 20 64 6f 63 6c  UT: size of docl
4310: 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
4320: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  );.../*.** End o
4330: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
4340: 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61 73 68  ode in fts5_hash
4350: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
4360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
43a0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
43b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
43f0: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
4400: 65 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67  e in fts5_storag
4410: 65 2e 63 2e 20 66 74 73 35 5f 73 74 6f 72 61 67  e.c. fts5_storag
4420: 65 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e  e.c contains con
4430: 74 61 69 6e 73 20 0a 2a 2a 20 63 6f 64 65 20 74  tains .** code t
4440: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
4450: 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
4460: 25 5f 63 6f 6e 74 65 6e 74 20 61 6e 64 20 25 5f  %_content and %_
4470: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 73 2e 0a  docsize tables..
4480: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
4490: 5f 53 54 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20  _STMT_SCAN_ASC  
44a0: 30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  0     /* SELECT 
44b0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
44c0: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 41 53 43  . ORDER BY 1 ASC
44d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
44e0: 5f 53 54 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20  _STMT_SCAN_DESC 
44f0: 31 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  1     /* SELECT 
4500: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
4510: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 44 45 53  . ORDER BY 1 DES
4520: 43 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  C */.#define FTS
4530: 35 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20  5_STMT_LOOKUP   
4540: 20 32 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54   2     /* SELECT
4550: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e   rowid, * FROM .
4560: 2e 2e 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f  .. WHERE rowid=?
4570: 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
4580: 75 63 74 20 46 74 73 35 53 74 6f 72 61 67 65 20  uct Fts5Storage 
4590: 46 74 73 35 53 74 6f 72 61 67 65 3b 0a 0a 69 6e  Fts5Storage;..in
45a0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
45b0: 72 61 67 65 4f 70 65 6e 28 46 74 73 35 43 6f 6e  rageOpen(Fts5Con
45c0: 66 69 67 2a 2c 20 46 74 73 35 49 6e 64 65 78 2a  fig*, Fts5Index*
45d0: 2c 20 69 6e 74 2c 20 46 74 73 35 53 74 6f 72 61  , int, Fts5Stora
45e0: 67 65 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69  ge**, char**);.i
45f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4600: 6f 72 61 67 65 43 6c 6f 73 65 28 46 74 73 35 53  orageClose(Fts5S
4610: 74 6f 72 61 67 65 20 2a 70 29 3b 0a 69 6e 74 20  torage *p);.int 
4620: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4630: 67 65 52 65 6e 61 6d 65 28 46 74 73 35 53 74 6f  geRename(Fts5Sto
4640: 72 61 67 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  rage*, const cha
4650: 72 20 2a 7a 4e 61 6d 65 29 3b 0a 0a 69 6e 74 20  r *zName);..int 
4660: 73 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70 41  sqlite3Fts5DropA
4670: 6c 6c 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b  ll(Fts5Config*);
4680: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4690: 43 72 65 61 74 65 54 61 62 6c 65 28 46 74 73 35  CreateTable(Fts5
46a0: 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63  Config*, const c
46b0: 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  har*, const char
46c0: 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2a 29  *, int, char **)
46d0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
46e0: 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 28  s5StorageDelete(
46f0: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4700: 69 36 34 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  i64);.int sqlite
4710: 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 74  3Fts5StorageCont
4720: 65 6e 74 49 6e 73 65 72 74 28 46 74 73 35 53 74  entInsert(Fts5St
4730: 6f 72 61 67 65 20 2a 70 2c 20 73 71 6c 69 74 65  orage *p, sqlite
4740: 33 5f 76 61 6c 75 65 2a 2a 2c 20 69 36 34 2a 29  3_value**, i64*)
4750: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4760: 35 53 74 6f 72 61 67 65 49 6e 64 65 78 49 6e 73  5StorageIndexIns
4770: 65 72 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  ert(Fts5Storage 
4780: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  *p, sqlite3_valu
4790: 65 2a 2a 2c 20 69 36 34 29 3b 0a 0a 69 6e 74 20  e**, i64);..int 
47a0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
47b0: 67 65 49 6e 74 65 67 72 69 74 79 28 46 74 73 35  geIntegrity(Fts5
47c0: 53 74 6f 72 61 67 65 20 2a 70 29 3b 0a 0a 69 6e  Storage *p);..in
47d0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
47e0: 72 61 67 65 53 74 6d 74 28 46 74 73 35 53 74 6f  rageStmt(Fts5Sto
47f0: 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 65 53 74  rage *p, int eSt
4800: 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  mt, sqlite3_stmt
4810: 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 76 6f 69  **, char**);.voi
4820: 64 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  d sqlite3Fts5Sto
4830: 72 61 67 65 53 74 6d 74 52 65 6c 65 61 73 65 28  rageStmtRelease(
4840: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4850: 69 6e 74 20 65 53 74 6d 74 2c 20 73 71 6c 69 74  int eStmt, sqlit
4860: 65 33 5f 73 74 6d 74 2a 29 3b 0a 0a 69 6e 74 20  e3_stmt*);..int 
4870: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4880: 67 65 44 6f 63 73 69 7a 65 28 46 74 73 35 53 74  geDocsize(Fts5St
4890: 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 20 69 52  orage *p, i64 iR
48a0: 6f 77 69 64 2c 20 69 6e 74 20 2a 61 43 6f 6c 29  owid, int *aCol)
48b0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
48c0: 35 53 74 6f 72 61 67 65 53 69 7a 65 28 46 74 73  5StorageSize(Fts
48d0: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74  5Storage *p, int
48e0: 20 69 43 6f 6c 2c 20 69 36 34 20 2a 70 6e 41 76   iCol, i64 *pnAv
48f0: 67 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  g);.int sqlite3F
4900: 74 73 35 53 74 6f 72 61 67 65 52 6f 77 43 6f 75  ts5StorageRowCou
4910: 6e 74 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  nt(Fts5Storage *
4920: 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 29 3b 0a  p, i64 *pnRow);.
4930: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4940: 53 74 6f 72 61 67 65 53 79 6e 63 28 46 74 73 35  StorageSync(Fts5
4950: 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20  Storage *p, int 
4960: 62 43 6f 6d 6d 69 74 29 3b 0a 69 6e 74 20 73 71  bCommit);.int sq
4970: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
4980: 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 53 74 6f  Rollback(Fts5Sto
4990: 72 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73  rage *p);..int s
49a0: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
49b0: 65 43 6f 6e 66 69 67 56 61 6c 75 65 28 0a 20 20  eConfigValue(.  
49c0: 20 20 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70    Fts5Storage *p
49d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73  , const char*, s
49e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 69  qlite3_value*, i
49f0: 6e 74 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  nt.);..int sqlit
4a00: 65 33 46 74 73 35 53 74 6f 72 61 67 65 53 70 65  e3Fts5StorageSpe
4a10: 63 69 61 6c 44 65 6c 65 74 65 28 46 74 73 35 53  cialDelete(Fts5S
4a20: 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 20 69  torage *p, i64 i
4a30: 44 65 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Del, sqlite3_val
4a40: 75 65 2a 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  ue**);..int sqli
4a50: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 65  te3Fts5StorageDe
4a60: 6c 65 74 65 41 6c 6c 28 46 74 73 35 53 74 6f 72  leteAll(Fts5Stor
4a70: 61 67 65 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c  age *p);.int sql
4a80: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
4a90: 65 62 75 69 6c 64 28 46 74 73 35 53 74 6f 72 61  ebuild(Fts5Stora
4aa0: 67 65 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69  ge *p);.int sqli
4ab0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4f 70  te3Fts5StorageOp
4ac0: 74 69 6d 69 7a 65 28 46 74 73 35 53 74 6f 72 61  timize(Fts5Stora
4ad0: 67 65 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69  ge *p);.int sqli
4ae0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4d 65  te3Fts5StorageMe
4af0: 72 67 65 28 46 74 73 35 53 74 6f 72 61 67 65 20  rge(Fts5Storage 
4b00: 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 3b  *p, int nMerge);
4b10: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
4b20: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
4b30: 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67 65   in fts5_storage
4b40: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
4b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4b90: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
4be0: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
4bf0: 64 65 20 69 6e 20 66 74 73 35 5f 65 78 70 72 2e  de in fts5_expr.
4c00: 63 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  c. .*/.typedef s
4c10: 74 72 75 63 74 20 46 74 73 35 45 78 70 72 20 46  truct Fts5Expr F
4c20: 74 73 35 45 78 70 72 3b 0a 74 79 70 65 64 65 66  ts5Expr;.typedef
4c30: 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72   struct Fts5Expr
4c40: 4e 6f 64 65 20 46 74 73 35 45 78 70 72 4e 6f 64  Node Fts5ExprNod
4c50: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
4c60: 74 20 46 74 73 35 50 61 72 73 65 20 46 74 73 35  t Fts5Parse Fts5
4c70: 50 61 72 73 65 3b 0a 74 79 70 65 64 65 66 20 73  Parse;.typedef s
4c80: 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e 20  truct Fts5Token 
4c90: 46 74 73 35 54 6f 6b 65 6e 3b 0a 74 79 70 65 64  Fts5Token;.typed
4ca0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 45 78  ef struct Fts5Ex
4cb0: 70 72 50 68 72 61 73 65 20 46 74 73 35 45 78 70  prPhrase Fts5Exp
4cc0: 72 50 68 72 61 73 65 3b 0a 74 79 70 65 64 65 66  rPhrase;.typedef
4cd0: 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72   struct Fts5Expr
4ce0: 4e 65 61 72 73 65 74 20 46 74 73 35 45 78 70 72  Nearset Fts5Expr
4cf0: 4e 65 61 72 73 65 74 3b 0a 0a 73 74 72 75 63 74  Nearset;..struct
4d00: 20 46 74 73 35 54 6f 6b 65 6e 20 7b 0a 20 20 63   Fts5Token {.  c
4d10: 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 20 20 20  onst char *p;   
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d30: 2a 20 54 6f 6b 65 6e 20 74 65 78 74 20 28 6e 6f  * Token text (no
4d40: 74 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65  t NULL terminate
4d50: 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  d) */.  int n;  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
4d80: 6f 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62  of buffer p in b
4d90: 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50  ytes */.};../* P
4da0: 61 72 73 65 20 61 20 4d 41 54 43 48 20 65 78 70  arse a MATCH exp
4db0: 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 69 6e 74 20  ression. */.int 
4dc0: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e  sqlite3Fts5ExprN
4dd0: 65 77 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  ew(.  Fts5Config
4de0: 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 63 6f   *pConfig, .  co
4df0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c  nst char *zExpr,
4e00: 0a 20 20 46 74 73 35 45 78 70 72 20 2a 2a 70 70  .  Fts5Expr **pp
4e10: 4e 65 77 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  New, .  char **p
4e20: 7a 45 72 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66  zErr.);../*.** f
4e30: 6f 72 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46  or(rc = sqlite3F
4e40: 74 73 35 45 78 70 72 46 69 72 73 74 28 70 45 78  ts5ExprFirst(pEx
4e50: 70 72 2c 20 70 49 64 78 2c 20 62 44 65 73 63 29  pr, pIdx, bDesc)
4e60: 3b 0a 2a 2a 20 20 20 20 20 72 63 3d 3d 53 51 4c  ;.**     rc==SQL
4e70: 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
4e80: 69 74 65 33 46 74 73 35 45 78 70 72 45 6f 66 28  ite3Fts5ExprEof(
4e90: 70 45 78 70 72 29 3b 0a 2a 2a 20 20 20 20 20 72  pExpr);.**     r
4ea0: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  c = sqlite3Fts5E
4eb0: 78 70 72 4e 65 78 74 28 70 45 78 70 72 29 0a 2a  xprNext(pExpr).*
4ec0: 2a 20 29 7b 0a 2a 2a 20 20 20 2f 2f 20 54 68 65  * ){.**   // The
4ed0: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72   document with r
4ee0: 6f 77 69 64 20 69 52 6f 77 69 64 20 6d 61 74 63  owid iRowid matc
4ef0: 68 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  hes the expressi
4f00: 6f 6e 21 0a 2a 2a 20 20 20 69 36 34 20 69 52 6f  on!.**   i64 iRo
4f10: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73  wid = sqlite3Fts
4f20: 35 45 78 70 72 52 6f 77 69 64 28 70 45 78 70 72  5ExprRowid(pExpr
4f30: 29 3b 0a 2a 2a 20 7d 0a 2a 2f 0a 69 6e 74 20 73  );.** }.*/.int s
4f40: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 69  qlite3Fts5ExprFi
4f50: 72 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20 46  rst(Fts5Expr*, F
4f60: 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  ts5Index *pIdx, 
4f70: 69 36 34 20 69 4d 69 6e 2c 20 69 6e 74 20 62 44  i64 iMin, int bD
4f80: 65 73 63 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  esc);.int sqlite
4f90: 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 46 74  3Fts5ExprNext(Ft
4fa0: 73 35 45 78 70 72 2a 2c 20 69 36 34 20 69 4d 61  s5Expr*, i64 iMa
4fb0: 78 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  x);.int sqlite3F
4fc0: 74 73 35 45 78 70 72 45 6f 66 28 46 74 73 35 45  ts5ExprEof(Fts5E
4fd0: 78 70 72 2a 29 3b 0a 69 36 34 20 73 71 6c 69 74  xpr*);.i64 sqlit
4fe0: 65 33 46 74 73 35 45 78 70 72 52 6f 77 69 64 28  e3Fts5ExprRowid(
4ff0: 46 74 73 35 45 78 70 72 2a 29 3b 0a 0a 76 6f 69  Fts5Expr*);..voi
5000: 64 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  d sqlite3Fts5Exp
5010: 72 46 72 65 65 28 46 74 73 35 45 78 70 72 2a 29  rFree(Fts5Expr*)
5020: 3b 0a 0a 2f 2a 20 43 61 6c 6c 65 64 20 64 75 72  ;../* Called dur
5030: 69 6e 67 20 73 74 61 72 74 75 70 20 74 6f 20 72  ing startup to r
5040: 65 67 69 73 74 65 72 20 61 20 55 44 46 20 77 69  egister a UDF wi
5050: 74 68 20 53 51 4c 69 74 65 20 2a 2f 0a 69 6e 74  th SQLite */.int
5060: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
5070: 49 6e 69 74 28 46 74 73 35 47 6c 6f 62 61 6c 2a  Init(Fts5Global*
5080: 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e  , sqlite3*);..in
5090: 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
50a0: 72 50 68 72 61 73 65 43 6f 75 6e 74 28 46 74 73  rPhraseCount(Fts
50b0: 35 45 78 70 72 2a 29 3b 0a 69 6e 74 20 73 71 6c  5Expr*);.int sql
50c0: 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61  ite3Fts5ExprPhra
50d0: 73 65 53 69 7a 65 28 46 74 73 35 45 78 70 72 2a  seSize(Fts5Expr*
50e0: 2c 20 69 6e 74 20 69 50 68 72 61 73 65 29 3b 0a  , int iPhrase);.
50f0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
5100: 78 70 72 50 6f 73 6c 69 73 74 28 46 74 73 35 45  xprPoslist(Fts5E
5110: 78 70 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74  xpr*, int, const
5120: 20 75 38 20 2a 2a 29 3b 0a 0a 69 6e 74 20 73 71   u8 **);..int sq
5130: 6c 69 74 65 33 46 74 73 35 45 78 70 72 43 6c 6f  lite3Fts5ExprClo
5140: 6e 65 50 68 72 61 73 65 28 46 74 73 35 43 6f 6e  nePhrase(Fts5Con
5150: 66 69 67 2a 2c 20 46 74 73 35 45 78 70 72 2a 2c  fig*, Fts5Expr*,
5160: 20 69 6e 74 2c 20 46 74 73 35 45 78 70 72 2a 2a   int, Fts5Expr**
5170: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );../***********
5180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51a0: 0a 2a 2a 20 54 68 65 20 66 74 73 35 5f 65 78 70  .** The fts5_exp
51b0: 72 2e 63 20 41 50 49 20 61 62 6f 76 65 20 74 68  r.c API above th
51c0: 69 73 20 70 6f 69 6e 74 20 69 73 20 75 73 65 64  is point is used
51d0: 20 62 79 20 74 68 65 20 6f 74 68 65 72 20 68 61   by the other ha
51e0: 6e 64 2d 77 72 69 74 74 65 6e 0a 2a 2a 20 43 20  nd-written.** C 
51f0: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 6d 6f 64  code in this mod
5200: 75 6c 65 2e 20 54 68 65 20 69 6e 74 65 72 66 61  ule. The interfa
5210: 63 65 73 20 62 65 6c 6f 77 20 74 68 69 73 20 70  ces below this p
5220: 6f 69 6e 74 20 61 72 65 20 63 61 6c 6c 65 64 20  oint are called 
5230: 62 79 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 72  by.** the parser
5240: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 70 61 72   code in fts5par
5250: 73 65 2e 79 2e 20 20 2a 2f 0a 0a 76 6f 69 64 20  se.y.  */..void 
5260: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
5270: 45 72 72 6f 72 28 46 74 73 35 50 61 72 73 65 20  Error(Fts5Parse 
5280: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
5290: 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b  har *zFmt, ...);
52a0: 0a 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  ..Fts5ExprNode *
52b0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
52c0: 4e 6f 64 65 28 0a 20 20 46 74 73 35 50 61 72 73  Node(.  Fts5Pars
52d0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 69 6e 74  e *pParse,.  int
52e0: 20 65 54 79 70 65 2c 0a 20 20 46 74 73 35 45 78   eType,.  Fts5Ex
52f0: 70 72 4e 6f 64 65 20 2a 70 4c 65 66 74 2c 0a 20  prNode *pLeft,. 
5300: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
5310: 52 69 67 68 74 2c 0a 20 20 46 74 73 35 45 78 70  Right,.  Fts5Exp
5320: 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 0a  rNearset *pNear.
5330: 29 3b 0a 0a 46 74 73 35 45 78 70 72 50 68 72 61  );..Fts5ExprPhra
5340: 73 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  se *sqlite3Fts5P
5350: 61 72 73 65 54 65 72 6d 28 0a 20 20 46 74 73 35  arseTerm(.  Fts5
5360: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
5370: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
5380: 20 2a 70 50 68 72 61 73 65 2c 20 0a 20 20 46 74   *pPhrase, .  Ft
5390: 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  s5Token *pToken,
53a0: 0a 20 20 69 6e 74 20 62 50 72 65 66 69 78 0a 29  .  int bPrefix.)
53b0: 3b 0a 0a 46 74 73 35 45 78 70 72 4e 65 61 72 73  ;..Fts5ExprNears
53c0: 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  et *sqlite3Fts5P
53d0: 61 72 73 65 4e 65 61 72 73 65 74 28 0a 20 20 46  arseNearset(.  F
53e0: 74 73 35 50 61 72 73 65 2a 2c 20 0a 20 20 46 74  ts5Parse*, .  Ft
53f0: 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 0a  s5ExprNearset*,.
5400: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
5410: 2a 20 0a 29 3b 0a 0a 46 74 73 35 43 6f 6c 73 65  * .);..Fts5Colse
5420: 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61  t *sqlite3Fts5Pa
5430: 72 73 65 43 6f 6c 73 65 74 28 0a 20 20 46 74 73  rseColset(.  Fts
5440: 35 50 61 72 73 65 2a 2c 20 0a 20 20 46 74 73 35  5Parse*, .  Fts5
5450: 43 6f 6c 73 65 74 2a 2c 20 0a 20 20 46 74 73 35  Colset*, .  Fts5
5460: 54 6f 6b 65 6e 20 2a 0a 29 3b 0a 0a 76 6f 69 64  Token *.);..void
5470: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
5480: 65 50 68 72 61 73 65 46 72 65 65 28 46 74 73 35  ePhraseFree(Fts5
5490: 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0a 76 6f  ExprPhrase*);.vo
54a0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
54b0: 72 73 65 4e 65 61 72 73 65 74 46 72 65 65 28 46  rseNearsetFree(F
54c0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 29  ts5ExprNearset*)
54d0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
54e0: 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
54f0: 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 3b 0a  Fts5ExprNode*);.
5500: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
5510: 35 50 61 72 73 65 53 65 74 44 69 73 74 61 6e 63  5ParseSetDistanc
5520: 65 28 46 74 73 35 50 61 72 73 65 2a 2c 20 46 74  e(Fts5Parse*, Ft
5530: 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 20  s5ExprNearset*, 
5540: 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a 76 6f 69  Fts5Token*);.voi
5550: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
5560: 73 65 53 65 74 43 6f 6c 73 65 74 28 46 74 73 35  seSetColset(Fts5
5570: 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78 70 72  Parse*, Fts5Expr
5580: 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35 43 6f  Nearset*, Fts5Co
5590: 6c 73 65 74 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  lset*);.void sql
55a0: 69 74 65 33 46 74 73 35 50 61 72 73 65 46 69 6e  ite3Fts5ParseFin
55b0: 69 73 68 65 64 28 46 74 73 35 50 61 72 73 65 20  ished(Fts5Parse 
55c0: 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45 78 70  *pParse, Fts5Exp
55d0: 72 4e 6f 64 65 20 2a 70 29 3b 0a 76 6f 69 64 20  rNode *p);.void 
55e0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
55f0: 4e 65 61 72 28 46 74 73 35 50 61 72 73 65 20 2a  Near(Fts5Parse *
5600: 70 50 61 72 73 65 2c 20 46 74 73 35 54 6f 6b 65  pParse, Fts5Toke
5610: 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  n*);../*.** End 
5620: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
5630: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 65 78 70  code in fts5_exp
5640: 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  r.c..***********
5650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
5690: 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..../***********
56a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
56e0: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
56f0: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 61 75 78  code in fts5_aux
5700: 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c  .c. .*/..int sql
5710: 69 74 65 33 46 74 73 35 41 75 78 49 6e 69 74 28  ite3Fts5AuxInit(
5720: 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a 2a  fts5_api*);./*.*
5730: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
5740: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
5750: 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  s5_aux.c..******
5760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
57b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57f0: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
5800: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
5810: 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 20 0a 2a 2f  tokenizer.c. .*/
5820: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
5830: 35 54 6f 6b 65 6e 69 7a 65 72 49 6e 69 74 28 66  5TokenizerInit(f
5840: 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a 2a 2a  ts5_api*);./*.**
5850: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
5860: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
5870: 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 0a 2a  5_tokenizer.c..*
5880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 2f 2a 2a 2a  *********/../***
58d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58e0: 2a 2a 2a 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 0a 2a 2a 20 49 6e 74 65 72  *******.** Inter
5920: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
5930: 66 74 73 35 5f 76 6f 63 61 62 2e 63 2e 20 0a 2a  fts5_vocab.c. .*
5940: 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  /..int sqlite3Ft
5950: 73 35 56 6f 63 61 62 49 6e 69 74 28 46 74 73 35  s5VocabInit(Fts5
5960: 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65 33  Global*, sqlite3
5970: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  *);../*.** End o
5980: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
5990: 6f 64 65 20 69 6e 20 66 74 73 35 5f 76 6f 63 61  ode in fts5_voca
59a0: 62 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  b.c..***********
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f  ***************/
59f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
5a00: 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a  **************.*
5a40: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 61  * Interface to a
5a50: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
5a60: 65 72 61 74 65 64 20 63 6f 64 65 20 69 6e 20 66  erated code in f
5a70: 74 73 35 5f 75 6e 69 63 6f 64 65 32 2e 63 2e 20  ts5_unicode2.c. 
5a80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5a90: 74 73 35 55 6e 69 63 6f 64 65 49 73 61 6c 6e 75  ts5UnicodeIsalnu
5aa0: 6d 28 69 6e 74 20 63 29 3b 0a 69 6e 74 20 73 71  m(int c);.int sq
5ab0: 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
5ac0: 49 73 64 69 61 63 72 69 74 69 63 28 69 6e 74 20  Isdiacritic(int 
5ad0: 63 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  c);.int sqlite3F
5ae0: 74 73 35 55 6e 69 63 6f 64 65 46 6f 6c 64 28 69  ts5UnicodeFold(i
5af0: 6e 74 20 63 2c 20 69 6e 74 20 62 52 65 6d 6f 76  nt c, int bRemov
5b00: 65 44 69 61 63 72 69 74 69 63 29 3b 0a 2f 2a 0a  eDiacritic);./*.
5b10: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
5b20: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
5b30: 74 73 35 5f 75 6e 69 63 6f 64 65 32 2e 63 2e 0a  ts5_unicode2.c..
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 2a 2a 2a 2a 2a 2a 2a  ****************
5b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e  **********/..#en
5b90: 64 69 66 0a                                      dif.