/ Hex Artifact Content
Login

Artifact f9e7772d3ad2b8aac6ad77a5867a254f4422992e:


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 28 69 6e 74  raySize(x) ((int
02d0: 29 28 73 69 7a 65 6f 66 28 78 29 20 2f 20 73 69  )(sizeof(x) / si
02e0: 7a 65 6f 66 28 78 5b 30 5d 29 29 29 0a 0a 23 64  zeof(x[0])))..#d
02f0: 65 66 69 6e 65 20 74 65 73 74 63 61 73 65 28 78  efine testcase(x
0300: 29 0a 23 64 65 66 69 6e 65 20 41 4c 57 41 59 53  ).#define ALWAYS
0310: 28 78 29 20 31 0a 23 64 65 66 69 6e 65 20 4e 45  (x) 1.#define NE
0320: 56 45 52 28 78 29 20 30 0a 0a 23 64 65 66 69 6e  VER(x) 0..#defin
0330: 65 20 4d 49 4e 28 78 2c 79 29 20 28 28 28 78 29  e MIN(x,y) (((x)
0340: 20 3c 20 28 79 29 29 20 3f 20 28 78 29 20 3a 20   < (y)) ? (x) : 
0350: 28 79 29 29 0a 23 64 65 66 69 6e 65 20 4d 41 58  (y)).#define MAX
0360: 28 78 2c 79 29 20 28 28 28 78 29 20 3e 20 28 79  (x,y) (((x) > (y
0370: 29 29 20 3f 20 28 78 29 20 3a 20 28 79 29 29 0a  )) ? (x) : (y)).
0380: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
0390: 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65 73 74   for the largest
03a0: 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74 20 70 6f   and smallest po
03b0: 73 73 69 62 6c 65 20 36 34 2d 62 69 74 20 73 69  ssible 64-bit si
03c0: 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2e 0a 2a  gned integers..*
03d0: 2f 0a 23 20 64 65 66 69 6e 65 20 4c 41 52 47 45  /.# define LARGE
03e0: 53 54 5f 49 4e 54 36 34 20 20 28 30 78 66 66 66  ST_INT64  (0xfff
03f0: 66 66 66 66 66 7c 28 28 28 69 36 34 29 30 78 37  fffff|(((i64)0x7
0400: 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a 23  fffffff)<<32)).#
0410: 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53 54   define SMALLEST
0420: 5f 49 4e 54 36 34 20 28 28 28 69 36 34 29 2d 31  _INT64 (((i64)-1
0430: 29 20 2d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) - LARGEST_INT6
0440: 34 29 0a 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  4)..#endif.../*.
0450: 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** Maximum numbe
0460: 72 20 6f 66 20 70 72 65 66 69 78 20 69 6e 64 65  r of prefix inde
0470: 78 65 73 20 6f 6e 20 73 69 6e 67 6c 65 20 46 54  xes on single FT
0480: 53 35 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d  S5 table. This m
0490: 75 73 74 20 62 65 0a 2a 2a 20 6c 65 73 73 20 74  ust be.** less t
04a0: 68 61 6e 20 33 32 2e 20 49 66 20 69 74 20 69 73  han 32. If it is
04b0: 20 73 65 74 20 74 6f 20 61 6e 79 74 68 69 6e 67   set to anything
04c0: 20 6c 61 72 67 65 20 74 68 61 6e 20 74 68 61 74   large than that
04d0: 2c 20 61 6e 20 23 65 72 72 6f 72 0a 2a 2a 20 64  , an #error.** d
04e0: 69 72 65 63 74 69 76 65 20 69 6e 20 66 74 73 35  irective in fts5
04f0: 5f 69 6e 64 65 78 2e 63 20 77 69 6c 6c 20 63 61  _index.c will ca
0500: 75 73 65 20 74 68 65 20 62 75 69 6c 64 20 74 6f  use the build to
0510: 20 66 61 69 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e   fail..*/.#defin
0520: 65 20 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49  e FTS5_MAX_PREFI
0530: 58 5f 49 4e 44 45 58 45 53 20 33 31 0a 0a 23 64  X_INDEXES 31..#d
0540: 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41 55  efine FTS5_DEFAU
0550: 4c 54 5f 4e 45 41 52 44 49 53 54 20 31 30 0a 23  LT_NEARDIST 10.#
0560: 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41  define FTS5_DEFA
0570: 55 4c 54 5f 52 41 4e 4b 20 20 20 20 20 22 62 6d  ULT_RANK     "bm
0580: 32 35 22 0a 0a 2f 2a 20 4e 61 6d 65 20 6f 66 20  25"../* Name of 
0590: 72 61 6e 6b 20 61 6e 64 20 72 6f 77 69 64 20 63  rank and rowid c
05a0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e  olumns */.#defin
05b0: 65 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d 45  e FTS5_RANK_NAME
05c0: 20 22 72 61 6e 6b 22 0a 23 64 65 66 69 6e 65 20   "rank".#define 
05d0: 46 54 53 35 5f 52 4f 57 49 44 5f 4e 41 4d 45 20  FTS5_ROWID_NAME 
05e0: 22 72 6f 77 69 64 22 0a 0a 23 69 66 64 65 66 20  "rowid"..#ifdef 
05f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23 20 64  SQLITE_DEBUG.# d
0600: 65 66 69 6e 65 20 46 54 53 35 5f 43 4f 52 52 55  efine FTS5_CORRU
0610: 50 54 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f  PT sqlite3Fts5Co
0620: 72 72 75 70 74 28 29 0a 69 6e 74 20 73 71 6c 69  rrupt().int sqli
0630: 74 65 33 46 74 73 35 43 6f 72 72 75 70 74 28 76  te3Fts5Corrupt(v
0640: 6f 69 64 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  oid);.#else.# de
0650: 66 69 6e 65 20 46 54 53 35 5f 43 4f 52 52 55 50  fine FTS5_CORRUP
0660: 54 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  T SQLITE_CORRUPT
0670: 5f 56 54 41 42 0a 23 65 6e 64 69 66 0a 0a 2f 2a  _VTAB.#endif../*
0680: 0a 2a 2a 20 54 68 65 20 61 73 73 65 72 74 5f 6e  .** The assert_n
0690: 63 28 29 20 6d 61 63 72 6f 20 69 73 20 73 69 6d  c() macro is sim
06a0: 69 6c 61 72 20 74 6f 20 74 68 65 20 61 73 73 65  ilar to the asse
06b0: 72 74 28 29 20 6d 61 63 72 6f 2c 20 65 78 63 65  rt() macro, exce
06c0: 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 69 73  pt that it.** is
06d0: 20 75 73 65 64 20 66 6f 72 20 61 73 73 65 72 74   used for assert
06e0: 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  () conditions th
06f0: 61 74 20 61 72 65 20 74 72 75 65 20 6f 6e 6c 79  at are true only
0700: 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 0a 2a   if it can be .*
0710: 2a 20 67 75 72 61 6e 74 65 65 64 20 74 68 61 74  * guranteed that
0720: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
0730: 20 6e 6f 74 20 63 6f 72 72 75 70 74 2e 0a 2a 2f   not corrupt..*/
0740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0750: 45 42 55 47 0a 65 78 74 65 72 6e 20 69 6e 74 20  EBUG.extern int 
0760: 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 6d 61 79  sqlite3_fts5_may
0770: 5f 62 65 5f 63 6f 72 72 75 70 74 3b 0a 23 20 64  _be_corrupt;.# d
0780: 65 66 69 6e 65 20 61 73 73 65 72 74 5f 6e 63 28  efine assert_nc(
0790: 78 29 20 61 73 73 65 72 74 28 73 71 6c 69 74 65  x) assert(sqlite
07a0: 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f  3_fts5_may_be_co
07b0: 72 72 75 70 74 20 7c 7c 20 28 78 29 29 0a 23 65  rrupt || (x)).#e
07c0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
07d0: 65 72 74 5f 6e 63 28 78 29 20 61 73 73 65 72 74  ert_nc(x) assert
07e0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d  (x).#endif../* M
07f0: 61 72 6b 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ark a function p
0800: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73  arameter as unus
0810: 65 64 2c 20 74 6f 20 73 75 70 70 72 65 73 73 20  ed, to suppress 
0820: 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
0830: 72 0a 2a 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a  r.** warnings. *
0840: 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44  /.#ifndef UNUSED
0850: 5f 50 41 52 41 4d 0a 23 20 64 65 66 69 6e 65 20  _PARAM.# define 
0860: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20  UNUSED_PARAM(X) 
0870: 20 28 76 6f 69 64 29 28 58 29 0a 23 65 6e 64 69   (void)(X).#endi
0880: 66 0a 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  f..#ifndef UNUSE
0890: 44 5f 50 41 52 41 4d 32 0a 23 20 64 65 66 69 6e  D_PARAM2.# defin
08a0: 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28  e UNUSED_PARAM2(
08b0: 58 2c 20 59 29 20 20 28 76 6f 69 64 29 28 58 29  X, Y)  (void)(X)
08c0: 2c 20 28 76 6f 69 64 29 28 59 29 0a 23 65 6e 64  , (void)(Y).#end
08d0: 69 66 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  if..typedef stru
08e0: 63 74 20 46 74 73 35 47 6c 6f 62 61 6c 20 46 74  ct Fts5Global Ft
08f0: 73 35 47 6c 6f 62 61 6c 3b 0a 74 79 70 65 64 65  s5Global;.typede
0900: 66 20 73 74 72 75 63 74 20 46 74 73 35 43 6f 6c  f struct Fts5Col
0910: 73 65 74 20 46 74 73 35 43 6f 6c 73 65 74 3b 0a  set Fts5Colset;.
0920: 0a 2f 2a 20 49 66 20 61 20 4e 45 41 52 28 29 20  ./* If a NEAR() 
0930: 63 6c 75 6d 70 20 6f 72 20 70 68 72 61 73 65 20  clump or phrase 
0940: 6d 61 79 20 6f 6e 6c 79 20 6d 61 74 63 68 20 61  may only match a
0950: 20 73 70 65 63 69 66 69 63 20 73 65 74 20 6f 66   specific set of
0960: 20 63 6f 6c 75 6d 6e 73 2c 20 0a 2a 2a 20 74 68   columns, .** th
0970: 65 6e 20 61 6e 20 6f 62 6a 65 63 74 20 6f 66 20  en an object of 
0980: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  the following ty
0990: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  pe is used to re
09a0: 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66 20  cord the set of 
09b0: 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20 45 61 63 68  columns..** Each
09c0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 61 69   entry in the ai
09d0: 43 6f 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 61  Col[] array is a
09e0: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 79   column that may
09f0: 20 62 65 20 6d 61 74 63 68 65 64 2e 0a 2a 2a 0a   be matched..**.
0a00: 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69  ** This object i
0a10: 73 20 75 73 65 64 20 62 79 20 66 74 73 35 5f 65  s used by fts5_e
0a20: 78 70 72 2e 63 20 61 6e 64 20 66 74 73 35 5f 69  xpr.c and fts5_i
0a30: 6e 64 65 78 2e 63 2e 0a 2a 2f 0a 73 74 72 75 63  ndex.c..*/.struc
0a40: 74 20 46 74 73 35 43 6f 6c 73 65 74 20 7b 0a 20  t Fts5Colset {. 
0a50: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74   int nCol;.  int
0a60: 20 61 69 43 6f 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 0a   aiCol[1];.};...
0a70: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
0a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
0ac0: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
0ad0: 65 20 69 6e 20 66 74 73 35 5f 63 6f 6e 66 69 67  e in fts5_config
0ae0: 2e 63 2e 20 66 74 73 35 5f 63 6f 6e 66 69 67 2e  .c. fts5_config.
0af0: 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61  c contains conta
0b00: 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f 20 70  ins code.** to p
0b10: 61 72 73 65 20 74 68 65 20 61 72 67 75 6d 65 6e  arse the argumen
0b20: 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
0b30: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0b40: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
0b50: 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72  .*/..typedef str
0b60: 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67 20 46  uct Fts5Config F
0b70: 74 73 35 43 6f 6e 66 69 67 3b 0a 0a 2f 2a 0a 2a  ts5Config;../*.*
0b80: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0b90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0ba0: 74 72 75 63 74 75 72 65 20 65 6e 63 6f 64 65 73  tructure encodes
0bb0: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
0bc0: 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20   that can.** be 
0bd0: 67 6c 65 61 6e 65 64 20 66 72 6f 6d 20 74 68 65  gleaned from the
0be0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0bf0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
0c00: 0a 2a 2a 0a 2a 2a 20 41 6e 64 20 61 6c 6c 20 69  .**.** And all i
0c10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 6f 61 64 65  nformation loade
0c20: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e  d from the %_con
0c30: 66 69 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  fig table..**.**
0c40: 20 6e 41 75 74 6f 6d 65 72 67 65 3a 0a 2a 2a 20   nAutomerge:.** 
0c50: 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75    The minimum nu
0c60: 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
0c70: 20 74 68 61 74 20 61 6e 20 61 75 74 6f 2d 6d 65   that an auto-me
0c80: 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 68  rge operation sh
0c90: 6f 75 6c 64 0a 2a 2a 20 20 20 61 74 74 65 6d 70  ould.**   attemp
0ca0: 74 20 74 6f 20 6d 65 72 67 65 20 74 6f 67 65 74  t to merge toget
0cb0: 68 65 72 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  her. A value of 
0cc0: 31 20 73 65 74 73 20 74 68 65 20 6f 62 6a 65 63  1 sets the objec
0cd0: 74 20 74 6f 20 75 73 65 20 74 68 65 20 0a 2a 2a  t to use the .**
0ce0: 20 20 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20     compile time 
0cf0: 64 65 66 61 75 6c 74 2e 20 5a 65 72 6f 20 64 69  default. Zero di
0d00: 73 61 62 6c 65 73 20 61 75 74 6f 2d 6d 65 72 67  sables auto-merg
0d10: 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  e altogether..**
0d20: 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 3a 0a 2a 2a  .** zContent:.**
0d30: 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 52 6f 77 69  .** zContentRowi
0d40: 64 3a 0a 2a 2a 20 20 20 54 68 65 20 76 61 6c 75  d:.**   The valu
0d50: 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
0d60: 5f 72 6f 77 69 64 3d 20 6f 70 74 69 6f 6e 2c 20  _rowid= option, 
0d70: 69 66 20 6f 6e 65 20 77 61 73 20 73 70 65 63 69  if one was speci
0d80: 66 69 65 64 2e 20 4f 72 20 0a 2a 2a 20 20 20 74  fied. Or .**   t
0d90: 68 65 20 73 74 72 69 6e 67 20 22 72 6f 77 69 64  he string "rowid
0da0: 22 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  " otherwise. Thi
0db0: 73 20 74 65 78 74 20 69 73 20 6e 6f 74 20 71 75  s text is not qu
0dc0: 6f 74 65 64 20 2d 20 69 66 20 69 74 20 69 73 0a  oted - if it is.
0dd0: 2a 2a 20 20 20 75 73 65 64 20 61 73 20 70 61 72  **   used as par
0de0: 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74  t of an SQL stat
0df0: 65 6d 65 6e 74 20 69 74 20 6e 65 65 64 73 20 74  ement it needs t
0e00: 6f 20 62 65 20 71 75 6f 74 65 64 20 61 70 70 72  o be quoted appr
0e10: 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  opriately..**.**
0e20: 20 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73   zContentExprlis
0e30: 74 3a 0a 2a 2a 0a 2a 2a 20 70 7a 45 72 72 6d 73  t:.**.** pzErrms
0e40: 67 3a 0a 2a 2a 20 20 20 54 68 69 73 20 65 78 69  g:.**   This exi
0e50: 73 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sts in order to 
0e60: 61 6c 6c 6f 77 20 74 68 65 20 66 74 73 35 5f 69  allow the fts5_i
0e70: 6e 64 65 78 2e 63 20 6d 6f 64 75 6c 65 20 74 6f  ndex.c module to
0e80: 20 72 65 74 75 72 6e 20 61 20 0a 2a 2a 20 20 20   return a .**   
0e90: 64 65 63 65 6e 74 20 65 72 72 6f 72 20 6d 65 73  decent error mes
0ea0: 73 61 67 65 20 69 66 20 69 74 20 65 6e 63 6f 75  sage if it encou
0eb0: 6e 74 65 72 73 20 61 20 66 69 6c 65 2d 66 6f 72  nters a file-for
0ec0: 6d 61 74 20 76 65 72 73 69 6f 6e 20 69 74 20 64  mat version it d
0ed0: 6f 65 73 0a 2a 2a 20 20 20 6e 6f 74 20 75 6e 64  oes.**   not und
0ee0: 65 72 73 74 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 62  erstand..**.** b
0ef0: 43 6f 6c 75 6d 6e 73 69 7a 65 3a 0a 2a 2a 20 20  Columnsize:.**  
0f00: 20 54 72 75 65 20 69 66 20 74 68 65 20 25 5f 64   True if the %_d
0f10: 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 69 73 20  ocsize table is 
0f20: 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 62  created..**.** b
0f30: 50 72 65 66 69 78 49 6e 64 65 78 3a 0a 2a 2a 20  PrefixIndex:.** 
0f40: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
0f50: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
0f60: 67 2e 20 49 66 20 73 65 74 20 74 6f 20 66 61 6c  g. If set to fal
0f70: 73 65 2c 20 61 6e 79 20 70 72 65 66 69 78 20 69  se, any prefix i
0f80: 6e 64 65 78 65 73 0a 2a 2a 20 20 20 61 72 65 20  ndexes.**   are 
0f90: 69 67 6e 6f 72 65 64 2e 20 54 68 69 73 20 76 61  ignored. This va
0fa0: 6c 75 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  lue is configure
0fb0: 64 20 75 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  d using:.**.**  
0fc0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0fd0: 20 74 62 6c 28 74 62 6c 2c 20 72 61 6e 6b 29 20   tbl(tbl, rank) 
0fe0: 56 41 4c 55 45 53 28 27 70 72 65 66 69 78 2d 69  VALUES('prefix-i
0ff0: 6e 64 65 78 27 2c 20 24 62 50 72 65 66 69 78 49  ndex', $bPrefixI
1000: 6e 64 65 78 29 3b 0a 2a 2a 0a 2a 2f 0a 73 74 72  ndex);.**.*/.str
1010: 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67 20 7b  uct Fts5Config {
1020: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1050: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  andle */.  char 
1060: 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
1070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1080: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 46  tabase holding F
1090: 54 53 20 69 6e 64 65 78 20 28 65 2e 67 2e 20 22  TS index (e.g. "
10a0: 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 63 68 61 72  main") */.  char
10b0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10d0: 61 6d 65 20 6f 66 20 46 54 53 20 69 6e 64 65 78  ame of FTS index
10e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1110: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
1120: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20  char **azCol;   
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
1150: 2a 2f 0a 20 20 75 38 20 2a 61 62 55 6e 69 6e 64  */.  u8 *abUnind
1160: 65 78 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  exed;           
1170: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1180: 20 75 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d   unindexed colum
1190: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  ns */.  int nPre
11a0: 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
11b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11c0: 72 20 6f 66 20 70 72 65 66 69 78 20 69 6e 64 65  r of prefix inde
11d0: 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  xes */.  int *aP
11e0: 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
11f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1200: 73 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6e 50  s in bytes of nP
1210: 72 65 66 69 78 20 70 72 65 66 69 78 20 69 6e 64  refix prefix ind
1220: 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 43  exes */.  int eC
1230: 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20  ontent;         
1240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
1250: 46 54 53 35 5f 43 4f 4e 54 45 4e 54 20 76 61 6c  FTS5_CONTENT val
1260: 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ue */.  char *zC
1270: 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20  ontent;         
1280: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
1290: 6e 74 20 74 61 62 6c 65 20 2a 2f 20 0a 20 20 63  nt table */ .  c
12a0: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 52 6f 77  har *zContentRow
12b0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  id;            /
12c0: 2a 20 22 63 6f 6e 74 65 6e 74 5f 72 6f 77 69 64  * "content_rowid
12d0: 3d 22 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20  =" option value 
12e0: 2a 2f 20 0a 20 20 69 6e 74 20 62 43 6f 6c 75 6d  */ .  int bColum
12f0: 6e 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nsize;          
1300: 20 20 20 20 20 20 2f 2a 20 22 63 6f 6c 75 6d 6e        /* "column
1310: 73 69 7a 65 3d 22 20 6f 70 74 69 6f 6e 20 76 61  size=" option va
1320: 6c 75 65 20 28 64 66 6c 74 3d 3d 31 29 20 2a 2f  lue (dflt==1) */
1330: 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 3b 20  .  int eDetail; 
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 2f 2a 20 46 54 53 35 5f 44 45 54 41 49     /* FTS5_DETAI
1360: 4c 5f 58 58 58 20 76 61 6c 75 65 20 2a 2f 0a 20  L_XXX value */. 
1370: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 45   char *zContentE
1380: 78 70 72 6c 69 73 74 3b 0a 20 20 46 74 73 35 54  xprlist;.  Fts5T
1390: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 3b 0a  okenizer *pTok;.
13a0: 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72    fts5_tokenizer
13b0: 20 2a 70 54 6f 6b 41 70 69 3b 0a 0a 20 20 2f 2a   *pTokApi;..  /*
13c0: 20 56 61 6c 75 65 73 20 6c 6f 61 64 65 64 20 66   Values loaded f
13d0: 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 66 69 67  rom the %_config
13e0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
13f0: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
1400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1410: 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20  ncremented when 
1420: 25 5f 63 6f 6e 66 69 67 20 69 73 20 6d 6f 64 69  %_config is modi
1430: 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 70 67  fied */.  int pg
1440: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
1450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
1460: 72 6f 78 69 6d 61 74 65 20 70 61 67 65 20 73 69  roximate page si
1470: 7a 65 20 75 73 65 64 20 69 6e 20 25 5f 64 61 74  ze used in %_dat
1480: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 75 74 6f  a */.  int nAuto
1490: 6d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20  merge;          
14a0: 20 20 20 20 20 20 20 2f 2a 20 27 61 75 74 6f 6d         /* 'autom
14b0: 65 72 67 65 27 20 73 65 74 74 69 6e 67 20 2a 2f  erge' setting */
14c0: 0a 20 20 69 6e 74 20 6e 43 72 69 73 69 73 4d 65  .  int nCrisisMe
14d0: 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rge;            
14e0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
14f0: 6c 6f 77 65 64 20 73 65 67 6d 65 6e 74 73 20 70  lowed segments p
1500: 65 72 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e  er level */.  in
1510: 74 20 6e 48 61 73 68 53 69 7a 65 3b 20 20 20 20  t nHashSize;    
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1530: 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   Bytes of memory
1540: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   for in-memory h
1550: 61 73 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ash */.  char *z
1560: 52 61 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Rank;           
1570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1580: 20 6f 66 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f   of rank functio
1590: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 61  n */.  char *zRa
15a0: 6e 6b 41 72 67 73 3b 20 20 20 20 20 20 20 20 20  nkArgs;         
15b0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
15c0: 6e 74 73 20 74 6f 20 72 61 6e 6b 20 66 75 6e 63  nts to rank func
15d0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  tion */..  /* If
15e0: 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 70 6f 69 6e 74   non-NULL, point
15f0: 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 74 61  s to sqlite3_vta
1600: 62 2e 62 61 73 65 2e 7a 45 72 72 6d 73 67 2e 20  b.base.zErrmsg. 
1610: 4f 66 74 65 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  Often NULL. */. 
1620: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
1630: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1640: 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 62 50 72  _DEBUG.  int bPr
1650: 65 66 69 78 49 6e 64 65 78 3b 20 20 20 20 20 20  efixIndex;      
1660: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1670: 20 74 6f 20 75 73 65 20 70 72 65 66 69 78 2d 69   to use prefix-i
1680: 6e 64 65 78 65 73 20 2a 2f 0a 23 65 6e 64 69 66  ndexes */.#endif
1690: 0a 7d 3b 0a 0a 2f 2a 20 43 75 72 72 65 6e 74 20  .};../* Current 
16a0: 65 78 70 65 63 74 65 64 20 76 61 6c 75 65 20 6f  expected value o
16b0: 66 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65  f %_config table
16c0: 20 27 76 65 72 73 69 6f 6e 27 20 66 69 65 6c 64   'version' field
16d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
16e0: 5f 43 55 52 52 45 4e 54 5f 56 45 52 53 49 4f 4e  _CURRENT_VERSION
16f0: 20 34 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35   4..#define FTS5
1700: 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20  _CONTENT_NORMAL 
1710: 20 20 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35    0.#define FTS5
1720: 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20 20 20  _CONTENT_NONE   
1730: 20 20 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35    1.#define FTS5
1740: 5f 43 4f 4e 54 45 4e 54 5f 45 58 54 45 52 4e 41  _CONTENT_EXTERNA
1750: 4c 20 32 0a 0a 23 64 65 66 69 6e 65 20 46 54 53  L 2..#define FTS
1760: 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 20 20  5_DETAIL_FULL   
1770: 20 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f   0.#define FTS5_
1780: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 20 20 20 31  DETAIL_NONE    1
1790: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45  .#define FTS5_DE
17a0: 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 32 0a 0a  TAIL_COLUMNS 2..
17b0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
17c0: 35 43 6f 6e 66 69 67 50 61 72 73 65 28 0a 20 20  5ConfigParse(.  
17d0: 20 20 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73    Fts5Global*, s
17e0: 71 6c 69 74 65 33 2a 2c 20 69 6e 74 2c 20 63 6f  qlite3*, int, co
17f0: 6e 73 74 20 63 68 61 72 20 2a 2a 2c 20 46 74 73  nst char **, Fts
1800: 35 43 6f 6e 66 69 67 2a 2a 2c 20 63 68 61 72 2a  5Config**, char*
1810: 2a 0a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  *.);.void sqlite
1820: 33 46 74 73 35 43 6f 6e 66 69 67 46 72 65 65 28  3Fts5ConfigFree(
1830: 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b 0a 0a 69  Fts5Config*);..i
1840: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f  nt sqlite3Fts5Co
1850: 6e 66 69 67 44 65 63 6c 61 72 65 56 74 61 62 28  nfigDeclareVtab(
1860: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1870: 66 69 67 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  fig);..int sqlit
1880: 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 0a  e3Fts5Tokenize(.
1890: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
18a0: 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20  onfig,          
18b0: 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69 67    /* FTS5 Config
18c0: 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  uration object *
18d0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 2f 2a 20 46 54 53 35 5f 54 4f 4b 45      /* FTS5_TOKE
1900: 4e 49 5a 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  NIZE_* flags */.
1910: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
1920: 65 78 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20  ext, int nText, 
1930: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 74 6f 6b    /* Text to tok
1940: 65 6e 69 7a 65 20 2a 2f 0a 20 20 76 6f 69 64 20  enize */.  void 
1950: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
1960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1970: 6e 74 65 78 74 20 70 61 73 73 65 64 20 74 6f 20  ntext passed to 
1980: 78 54 6f 6b 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  xToken() */.  in
1990: 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64  t (*xToken)(void
19a0: 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68  *, int, const ch
19b0: 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69  ar*, int, int, i
19c0: 6e 74 29 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61  nt)    /* Callba
19d0: 63 6b 20 2a 2f 0a 29 3b 0a 0a 76 6f 69 64 20 73  ck */.);..void s
19e0: 71 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f 74  qlite3Fts5Dequot
19f0: 65 28 63 68 61 72 20 2a 7a 29 3b 0a 0a 2f 2a 20  e(char *z);../* 
1a00: 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Load the content
1a10: 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 66 69  s of the %_confi
1a20: 67 20 74 61 62 6c 65 20 2a 2f 0a 69 6e 74 20 73  g table */.int s
1a30: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
1a40: 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66 69 67 2a  Load(Fts5Config*
1a50: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 53 65 74 20  , int);../* Set 
1a60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
1a70: 69 6e 67 6c 65 20 63 6f 6e 66 69 67 20 61 74 74  ingle config att
1a80: 72 69 62 75 74 65 20 2a 2f 0a 69 6e 74 20 73 71  ribute */.int sq
1a90: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 53  lite3Fts5ConfigS
1aa0: 65 74 56 61 6c 75 65 28 46 74 73 35 43 6f 6e 66  etValue(Fts5Conf
1ab0: 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  ig*, const char*
1ac0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
1ad0: 2c 20 69 6e 74 2a 29 3b 0a 0a 69 6e 74 20 73 71  , int*);..int sq
1ae0: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50  lite3Fts5ConfigP
1af0: 61 72 73 65 52 61 6e 6b 28 63 6f 6e 73 74 20 63  arseRank(const c
1b00: 68 61 72 2a 2c 20 63 68 61 72 2a 2a 2c 20 63 68  har*, char**, ch
1b10: 61 72 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e  ar**);../*.** En
1b20: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
1b30: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 63  o code in fts5_c
1b40: 6f 6e 66 69 67 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  onfig.c..*******
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b90: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
1ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1be0: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
1bf0: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 62  o code in fts5_b
1c00: 75 66 66 65 72 2e 63 2e 0a 2a 2f 0a 0a 2f 2a 0a  uffer.c..*/../*.
1c10: 2a 2a 20 42 75 66 66 65 72 20 6f 62 6a 65 63 74  ** Buffer object
1c20: 20 66 6f 72 20 74 68 65 20 69 6e 63 72 65 6d 65   for the increme
1c30: 6e 74 61 6c 20 62 75 69 6c 64 69 6e 67 20 6f 66  ntal building of
1c40: 20 73 74 72 69 6e 67 20 64 61 74 61 2e 0a 2a 2f   string data..*/
1c50: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1c60: 46 74 73 35 42 75 66 66 65 72 20 46 74 73 35 42  Fts5Buffer Fts5B
1c70: 75 66 66 65 72 3b 0a 73 74 72 75 63 74 20 46 74  uffer;.struct Ft
1c80: 73 35 42 75 66 66 65 72 20 7b 0a 20 20 75 38 20  s5Buffer {.  u8 
1c90: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  *p;.  int n;.  i
1ca0: 6e 74 20 6e 53 70 61 63 65 3b 0a 7d 3b 0a 0a 69  nt nSpace;.};..i
1cb0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  nt sqlite3Fts5Bu
1cc0: 66 66 65 72 53 69 7a 65 28 69 6e 74 2a 2c 20 46  fferSize(int*, F
1cd0: 74 73 35 42 75 66 66 65 72 2a 2c 20 75 33 32 29  ts5Buffer*, u32)
1ce0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
1cf0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1d00: 72 69 6e 74 28 69 6e 74 2a 2c 20 46 74 73 35 42  rint(int*, Fts5B
1d10: 75 66 66 65 72 2a 2c 20 69 36 34 29 3b 0a 76 6f  uffer*, i64);.vo
1d20: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  id sqlite3Fts5Bu
1d30: 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 69  fferAppendBlob(i
1d40: 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  nt*, Fts5Buffer*
1d50: 2c 20 75 33 32 2c 20 63 6f 6e 73 74 20 75 38 2a  , u32, const u8*
1d60: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
1d70: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 53  ts5BufferAppendS
1d80: 74 72 69 6e 67 28 69 6e 74 20 2a 2c 20 46 74 73  tring(int *, Fts
1d90: 35 42 75 66 66 65 72 2a 2c 20 63 6f 6e 73 74 20  5Buffer*, const 
1da0: 63 68 61 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  char*);.void sql
1db0: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
1dc0: 65 65 28 46 74 73 35 42 75 66 66 65 72 2a 29 3b  ee(Fts5Buffer*);
1dd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
1de0: 35 42 75 66 66 65 72 5a 65 72 6f 28 46 74 73 35  5BufferZero(Fts5
1df0: 42 75 66 66 65 72 2a 29 3b 0a 76 6f 69 64 20 73  Buffer*);.void s
1e00: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1e10: 53 65 74 28 69 6e 74 2a 2c 20 46 74 73 35 42 75  Set(int*, Fts5Bu
1e20: 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73  ffer*, int, cons
1e30: 74 20 75 38 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  t u8*);.void sql
1e40: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1e50: 70 65 6e 64 50 72 69 6e 74 66 28 69 6e 74 20 2a  pendPrintf(int *
1e60: 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 63  , Fts5Buffer*, c
1e70: 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b  har *zFmt, ...);
1e80: 0a 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  ..char *sqlite3F
1e90: 74 73 35 4d 70 72 69 6e 74 66 28 69 6e 74 20 2a  ts5Mprintf(int *
1ea0: 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  pRc, const char 
1eb0: 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0a 0a 23 64  *zFmt, ...);..#d
1ec0: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
1ed0: 5a 65 72 6f 28 78 29 20 20 20 20 20 20 20 20 20  Zero(x)         
1ee0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1ef0: 75 66 66 65 72 5a 65 72 6f 28 78 29 0a 23 64 65  ufferZero(x).#de
1f00: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 41  fine fts5BufferA
1f10: 70 70 65 6e 64 56 61 72 69 6e 74 28 61 2c 62 2c  ppendVarint(a,b,
1f20: 63 29 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  c) sqlite3Fts5Bu
1f30: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1f40: 28 61 2c 62 2c 63 29 0a 23 64 65 66 69 6e 65 20  (a,b,c).#define 
1f50: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 61  fts5BufferFree(a
1f60: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  )             sq
1f70: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
1f80: 72 65 65 28 61 29 0a 23 64 65 66 69 6e 65 20 66  ree(a).#define f
1f90: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1fa0: 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20 73 71 6c  lob(a,b,c,d) sql
1fb0: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1fc0: 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c 64  pendBlob(a,b,c,d
1fd0: 29 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ).#define fts5Bu
1fe0: 66 66 65 72 53 65 74 28 61 2c 62 2c 63 2c 64 29  fferSet(a,b,c,d)
1ff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
2000: 74 73 35 42 75 66 66 65 72 53 65 74 28 61 2c 62  ts5BufferSet(a,b
2010: 2c 63 2c 64 29 0a 0a 23 64 65 66 69 6e 65 20 66  ,c,d)..#define f
2020: 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 70 52  ts5BufferGrow(pR
2030: 63 2c 70 42 75 66 2c 6e 6e 29 20 28 20 5c 0a 20  c,pBuf,nn) ( \. 
2040: 20 28 75 33 32 29 28 28 70 42 75 66 29 2d 3e 6e   (u32)((pBuf)->n
2050: 29 20 2b 20 28 75 33 32 29 28 6e 6e 29 20 3c 3d  ) + (u32)(nn) <=
2060: 20 28 75 33 32 29 28 28 70 42 75 66 29 2d 3e 6e   (u32)((pBuf)->n
2070: 53 70 61 63 65 29 20 3f 20 30 20 3a 20 5c 0a 20  Space) ? 0 : \. 
2080: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2090: 66 66 65 72 53 69 7a 65 28 28 70 52 63 29 2c 28  fferSize((pRc),(
20a0: 70 42 75 66 29 2c 28 6e 6e 29 2b 28 70 42 75 66  pBuf),(nn)+(pBuf
20b0: 29 2d 3e 6e 29 20 5c 0a 29 0a 0a 2f 2a 20 57 72  )->n) \.)../* Wr
20c0: 69 74 65 20 61 6e 64 20 64 65 63 6f 64 65 20 62  ite and decode b
20d0: 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
20e0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
20f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
2100: 74 73 35 50 75 74 33 32 28 75 38 2a 2c 20 69 6e  ts5Put32(u8*, in
2110: 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  t);.int sqlite3F
2120: 74 73 35 47 65 74 33 32 28 63 6f 6e 73 74 20 75  ts5Get32(const u
2130: 38 2a 29 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54  8*);..#define FT
2140: 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50  S5_POS2COLUMN(iP
2150: 6f 73 29 20 28 69 6e 74 29 28 69 50 6f 73 20 3e  os) (int)(iPos >
2160: 3e 20 33 32 29 0a 23 64 65 66 69 6e 65 20 46 54  > 32).#define FT
2170: 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 69 50  S5_POS2OFFSET(iP
2180: 6f 73 29 20 28 69 6e 74 29 28 69 50 6f 73 20 26  os) (int)(iPos &
2190: 20 30 78 46 46 46 46 46 46 46 46 29 0a 0a 74 79   0xFFFFFFFF)..ty
21a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
21b0: 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 46  5PoslistReader F
21c0: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
21d0: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f 73  ;.struct Fts5Pos
21e0: 6c 69 73 74 52 65 61 64 65 72 20 7b 0a 20 20 2f  listReader {.  /
21f0: 2a 20 56 61 72 69 61 62 6c 65 73 20 75 73 65 64  * Variables used
2200: 20 6f 6e 6c 79 20 62 79 20 73 71 6c 69 74 65 33   only by sqlite3
2210: 46 74 73 35 50 6f 73 6c 69 73 74 49 74 65 72 58  Fts5PoslistIterX
2220: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  XX() functions. 
2230: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
2240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2250: 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2260: 20 6c 69 73 74 20 74 6f 20 69 74 65 72 61 74 65   list to iterate
2270: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e   through */.  in
2280: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
22b0: 61 74 20 61 5b 5d 20 69 6e 20 62 79 74 65 73 20  at a[] in bytes 
22c0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
22f0: 6f 66 66 73 65 74 20 69 6e 20 61 5b 5d 20 2a 2f  offset in a[] */
2300: 0a 0a 20 20 75 38 20 62 46 6c 61 67 3b 20 20 20  ..  u8 bFlag;   
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6c 69 65 6e      /* For clien
2330: 74 20 75 73 65 20 28 61 6e 79 20 63 75 73 74 6f  t use (any custo
2340: 6d 20 70 75 72 70 6f 73 65 29 20 2a 2f 0a 0a 20  m purpose) */.. 
2350: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
2360: 62 6c 65 73 20 2a 2f 0a 20 20 75 38 20 62 45 6f  bles */.  u8 bEo
2370: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
2390: 20 74 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20   to true at EOF 
23a0: 2a 2f 0a 20 20 69 36 34 20 69 50 6f 73 3b 20 20  */.  i64 iPos;  
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33       /* (iCol<<3
23d0: 32 29 20 2b 20 69 50 6f 73 20 2a 2f 0a 7d 3b 0a  2) + iPos */.};.
23e0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
23f0: 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
2400: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c  (.  const u8 *a,
2410: 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2420: 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 62      /* Poslist b
2430: 75 66 66 65 72 20 74 6f 20 69 74 65 72 61 74 65  uffer to iterate
2440: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 46 74   through */.  Ft
2450: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
2460: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 2f 2a  *pIter        /*
2470: 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   Iterator object
2480: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a   to initialize *
2490: 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  /.);.int sqlite3
24a0: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
24b0: 72 4e 65 78 74 28 46 74 73 35 50 6f 73 6c 69 73  rNext(Fts5Poslis
24c0: 74 52 65 61 64 65 72 2a 29 3b 0a 0a 74 79 70 65  tReader*);..type
24d0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50  def struct Fts5P
24e0: 6f 73 6c 69 73 74 57 72 69 74 65 72 20 46 74 73  oslistWriter Fts
24f0: 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 3b 0a  5PoslistWriter;.
2500: 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69  struct Fts5Posli
2510: 73 74 57 72 69 74 65 72 20 7b 0a 20 20 69 36 34  stWriter {.  i64
2520: 20 69 50 72 65 76 3b 0a 7d 3b 0a 69 6e 74 20 73   iPrev;.};.int s
2530: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2540: 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 46 74  tWriterAppend(Ft
2550: 73 35 42 75 66 66 65 72 2a 2c 20 46 74 73 35 50  s5Buffer*, Fts5P
2560: 6f 73 6c 69 73 74 57 72 69 74 65 72 2a 2c 20 69  oslistWriter*, i
2570: 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  64);.void sqlite
2580: 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
2590: 41 70 70 65 6e 64 28 46 74 73 35 42 75 66 66 65  Append(Fts5Buffe
25a0: 72 2a 2c 20 69 36 34 2a 2c 20 69 36 34 29 3b 0a  r*, i64*, i64);.
25b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
25c0: 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 0a 20  PoslistNext64(. 
25d0: 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
25e0: 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
25f0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
2600: 69 6e 69 6e 67 20 70 6f 73 6c 69 73 74 20 2a 2f  ining poslist */
2610: 0a 20 20 69 6e 74 20 2a 70 69 2c 20 20 20 20 20  .  int *pi,     
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4f 66     /* IN/OUT: Of
2640: 66 73 65 74 20 77 69 74 68 69 6e 20 61 5b 5d 20  fset within a[] 
2650: 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4f 66 66 20  */.  i64 *piOff 
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2680: 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 2a  Current offset *
2690: 2f 0a 29 3b 0a 0a 2f 2a 20 4d 61 6c 6c 6f 63 20  /.);../* Malloc 
26a0: 75 74 69 6c 69 74 79 20 2a 2f 0a 76 6f 69 64 20  utility */.void 
26b0: 2a 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  *sqlite3Fts5Mall
26c0: 6f 63 5a 65 72 6f 28 69 6e 74 20 2a 70 52 63 2c  ocZero(int *pRc,
26d0: 20 69 6e 74 20 6e 42 79 74 65 29 3b 0a 63 68 61   int nByte);.cha
26e0: 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 53 74  r *sqlite3Fts5St
26f0: 72 6e 64 75 70 28 69 6e 74 20 2a 70 52 63 2c 20  rndup(int *pRc, 
2700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c  const char *pIn,
2710: 20 69 6e 74 20 6e 49 6e 29 3b 0a 0a 2f 2a 20 43   int nIn);../* C
2720: 68 61 72 61 63 74 65 72 20 73 65 74 20 74 65 73  haracter set tes
2730: 74 73 20 28 6c 69 6b 65 20 69 73 73 70 61 63 65  ts (like isspace
2740: 28 29 2c 20 69 73 61 6c 70 68 61 28 29 20 65 74  (), isalpha() et
2750: 63 2e 29 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  c.) */.int sqlit
2760: 65 33 46 74 73 35 49 73 42 61 72 65 77 6f 72 64  e3Fts5IsBareword
2770: 28 63 68 61 72 20 74 29 3b 0a 0a 0a 2f 2a 20 42  (char t);.../* B
2780: 75 63 6b 65 74 20 6f 66 20 74 65 72 6d 73 20 6f  ucket of terms o
2790: 62 6a 65 63 74 20 75 73 65 64 20 62 79 20 74 68  bject used by th
27a0: 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
27b0: 6b 20 69 6e 20 6f 66 66 73 65 74 73 3d 30 20 6d  k in offsets=0 m
27c0: 6f 64 65 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20  ode. */.typedef 
27d0: 73 74 72 75 63 74 20 46 74 73 35 54 65 72 6d 73  struct Fts5Terms
27e0: 65 74 20 46 74 73 35 54 65 72 6d 73 65 74 3b 0a  et Fts5Termset;.
27f0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 54  int sqlite3Fts5T
2800: 65 72 6d 73 65 74 4e 65 77 28 46 74 73 35 54 65  ermsetNew(Fts5Te
2810: 72 6d 73 65 74 2a 2a 29 3b 0a 69 6e 74 20 73 71  rmset**);.int sq
2820: 6c 69 74 65 33 46 74 73 35 54 65 72 6d 73 65 74  lite3Fts5Termset
2830: 41 64 64 28 46 74 73 35 54 65 72 6d 73 65 74 2a  Add(Fts5Termset*
2840: 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61  , int, const cha
2850: 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 70 62  r*, int, int *pb
2860: 50 72 65 73 65 6e 74 29 3b 0a 76 6f 69 64 20 73  Present);.void s
2870: 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d 73 65  qlite3Fts5Termse
2880: 74 46 72 65 65 28 46 74 73 35 54 65 72 6d 73 65  tFree(Fts5Termse
2890: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  t*);../*.** End 
28a0: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
28b0: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 62 75 66  code in fts5_buf
28c0: 66 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  fer.c..*********
28d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2910: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
2920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2960: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
2970: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 69 6e 64  code in fts5_ind
2980: 65 78 2e 63 2e 20 66 74 73 35 5f 69 6e 64 65 78  ex.c. fts5_index
2990: 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74  .c contains cont
29a0: 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f 20  ains code.** to 
29b0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 20  access the data 
29c0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f  stored in the %_
29d0: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  data table..*/..
29e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
29f0: 74 73 35 49 6e 64 65 78 20 46 74 73 35 49 6e 64  ts5Index Fts5Ind
2a00: 65 78 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ex;.typedef stru
2a10: 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ct Fts5IndexIter
2a20: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 3b 0a   Fts5IndexIter;.
2a30: 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e 64 65  .struct Fts5Inde
2a40: 78 49 74 65 72 20 7b 0a 20 20 69 36 34 20 69 52  xIter {.  i64 iR
2a50: 6f 77 69 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  owid;.  const u8
2a60: 20 2a 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e   *pData;.  int n
2a70: 44 61 74 61 3b 0a 20 20 75 38 20 62 45 6f 66 3b  Data;.  u8 bEof;
2a80: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 73 71 6c  .};..#define sql
2a90: 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
2aa0: 78 29 20 28 28 78 29 2d 3e 62 45 6f 66 29 0a 0a  x) ((x)->bEof)..
2ab0: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 75 73 65  /*.** Values use
2ac0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2ad0: 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
2ae0: 70 61 73 73 65 64 20 74 6f 20 49 6e 64 65 78 51  passed to IndexQ
2af0: 75 65 72 79 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  uery()..*/.#defi
2b00: 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  ne FTS5INDEX_QUE
2b10: 52 59 5f 50 52 45 46 49 58 20 20 20 20 20 30 78  RY_PREFIX     0x
2b20: 30 30 30 31 20 20 20 2f 2a 20 50 72 65 66 69 78  0001   /* Prefix
2b30: 20 71 75 65 72 79 20 2a 2f 0a 23 64 65 66 69 6e   query */.#defin
2b40: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
2b50: 59 5f 44 45 53 43 20 20 20 20 20 20 20 30 78 30  Y_DESC       0x0
2b60: 30 30 32 20 20 20 2f 2a 20 44 6f 63 73 20 69 6e  002   /* Docs in
2b70: 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
2b80: 64 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69  d order */.#defi
2b90: 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  ne FTS5INDEX_QUE
2ba0: 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 30 78  RY_TEST_NOIDX 0x
2bb0: 30 30 30 34 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  0004   /* Do not
2bc0: 20 75 73 65 20 70 72 65 66 69 78 20 69 6e 64 65   use prefix inde
2bd0: 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  x */.#define FTS
2be0: 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
2bf0: 4e 20 20 20 20 20 20 20 30 78 30 30 30 38 20 20  N       0x0008  
2c00: 20 2f 2a 20 53 63 61 6e 20 71 75 65 72 79 20 28   /* Scan query (
2c10: 66 74 73 35 76 6f 63 61 62 29 20 2a 2f 0a 0a 2f  fts5vocab) */../
2c20: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2c30: 61 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  are used interna
2c40: 6c 6c 79 20 62 79 20 74 68 65 20 66 74 73 35 5f  lly by the fts5_
2c50: 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 20  index.c module. 
2c60: 54 68 65 79 20 61 72 65 0a 2a 2a 20 64 65 66 69  They are.** defi
2c70: 6e 65 64 20 68 65 72 65 20 6f 6e 6c 79 20 74 6f  ned here only to
2c80: 20 6d 61 6b 65 20 69 74 20 65 61 73 69 65 72 20   make it easier 
2c90: 74 6f 20 61 76 6f 69 64 20 63 6c 61 73 68 65 73  to avoid clashes
2ca0: 20 77 69 74 68 20 74 68 65 20 66 6c 61 67 73 0a   with the flags.
2cb0: 2a 2a 20 61 62 6f 76 65 2e 20 2a 2f 0a 23 64 65  ** above. */.#de
2cc0: 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51  fine FTS5INDEX_Q
2cd0: 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 20 20  UERY_SKIPEMPTY  
2ce0: 30 78 30 30 31 30 0a 23 64 65 66 69 6e 65 20 46  0x0010.#define F
2cf0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e  TS5INDEX_QUERY_N
2d00: 4f 4f 55 54 50 55 54 20 20 20 30 78 30 30 32 30  OOUTPUT   0x0020
2d10: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 2f 64  ../*.** Create/d
2d20: 65 73 74 72 6f 79 20 61 6e 20 46 74 73 35 49 6e  estroy an Fts5In
2d30: 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69  dex object..*/.i
2d40: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2d50: 64 65 78 4f 70 65 6e 28 46 74 73 35 43 6f 6e 66  dexOpen(Fts5Conf
2d60: 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 69 6e 74  ig *pConfig, int
2d70: 20 62 43 72 65 61 74 65 2c 20 46 74 73 35 49 6e   bCreate, Fts5In
2d80: 64 65 78 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a  dex**, char**);.
2d90: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2da0: 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e  ndexClose(Fts5In
2db0: 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20  dex *p);../*.** 
2dc0: 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20  Return a simple 
2dd0: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62  checksum value b
2de0: 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75  ased on the argu
2df0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71  ments..*/.u64 sq
2e00: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
2e10: 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20  tryCksum(.  i64 
2e20: 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69  iRowid, .  int i
2e30: 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73  Col, .  int iPos
2e40: 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20  , .  int iIdx,. 
2e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
2e60: 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a  rm,.  int nTerm.
2e70: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  );../*.** Argume
2e80: 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
2e90: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
2ea0: 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
2eb0: 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
2ec0: 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
2ed0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2ee0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
2ef0: 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
2f00: 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
2f10: 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
2f20: 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
2f30: 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
2f40: 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
2f50: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2f60: 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
2f70: 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  elen(.  const ch
2f80: 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42  ar *p, .  int nB
2f90: 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61  yte, .  int nCha
2fa0: 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  r.);../*.** Open
2fb0: 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20   a new iterator 
2fc0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67  to iterate thoug
2fd0: 68 20 61 6c 6c 20 72 6f 77 69 64 73 20 74 68 61  h all rowids tha
2fe0: 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20  t match the .** 
2ff0: 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20  specified token 
3000: 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e  or token prefix.
3010: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
3020: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20  ts5IndexQuery(. 
3030: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f   /* FTS index to
3060: 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73   query */.  cons
3070: 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
3080: 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54  int nToken, /* T
3090: 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29  oken (or prefix)
30a0: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
30b0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
30e0: 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20  S5INDEX_QUERY_X 
30f0: 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43  flags */.  Fts5C
3100: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
3110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
3120: 74 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e  tch these column
3130: 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35  s only */.  Fts5
3140: 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74  IndexIter **ppIt
3150: 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er          /* O
3160: 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72  UT: New iterator
3170: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 3b 0a 0a 2f   object */.);../
3180: 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73  *.** The various
3190: 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 6f   operations on o
31a0: 70 65 6e 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b  pen token or tok
31b0: 65 6e 20 70 72 65 66 69 78 20 69 74 65 72 61 74  en prefix iterat
31c0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 75 73  ors opened.** us
31d0: 69 6e 67 20 73 71 6c 69 74 65 33 46 74 73 35 49  ing sqlite3Fts5I
31e0: 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a  ndexQuery()..*/.
31f0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
3200: 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65  terNext(Fts5Inde
3210: 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20 73 71 6c  xIter*);.int sql
3220: 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
3230: 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74  From(Fts5IndexIt
3240: 65 72 2a 2c 20 69 36 34 20 69 4d 61 74 63 68 29  er*, i64 iMatch)
3250: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  ;../*.** Close a
3260: 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65  n iterator opene
3270: 64 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 35  d by sqlite3Fts5
3280: 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
3290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
32a0: 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
32b0: 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 2f 2a 0a  ndexIter*);../*.
32c0: 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
32d0: 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
32e0: 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c   fts5vocab modul
32f0: 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
3300: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65   *sqlite3Fts5Ite
3310: 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49  rTerm(Fts5IndexI
3320: 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 69 6e 74  ter*, int*);.int
3330: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
3340: 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e 64  NextScan(Fts5Ind
3350: 65 78 49 74 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a  exIter*);.../*.*
3360: 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f  * Insert or remo
3370: 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72  ve data to or fr
3380: 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61  om the index. Ea
3390: 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65  ch time a docume
33a0: 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20  nt is .** added 
33b0: 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
33c0: 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  om the index, th
33d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
33e0: 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  alled one or mor
33f0: 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a  e.** times..**.*
3400: 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c  * For an insert,
3410: 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c   it must be call
3420: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
3430: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65   token in the ne
3440: 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49  w document..** I
3450: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
3460: 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20  is a delete, it 
3470: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28  must be called (
3480: 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66  at least) once f
3490: 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75  or each.** uniqu
34a0: 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64  e token in the d
34b0: 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  ocument with an 
34c0: 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20  iCol value less 
34d0: 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69  than zero. The i
34e0: 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  Pos.** argument 
34f0: 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61  is ignored for a
3500: 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20   delete..*/.int 
3510: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
3520: 57 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64  Write(.  Fts5Ind
3530: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
3540: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
3550: 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  x to write to */
3560: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3580: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b     /* Column tok
3590: 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d  en appears in (-
35a0: 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f  ve -> delete) */
35b0: 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
35e0: 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63  f token within c
35f0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
3600: 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
3610: 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f  nt nToken  /* To
3620: 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65  ken to add or re
3630: 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20  move to or from 
3640: 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  index */.);../*.
3650: 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
3660: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
3670: 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  s to sqlite3Fts5
3680: 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72  IndexWrite() per
3690: 74 61 69 6e 20 74 6f 0a 2a 2a 20 64 6f 63 75 6d  tain to.** docum
36a0: 65 6e 74 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a 69  ent iDocid..*/.i
36b0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
36c0: 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 0a 20  dexBeginWrite(. 
36d0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69   /* Index to wri
3700: 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62  te to */.  int b
3710: 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
3720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3730: 75 65 20 69 66 20 63 75 72 72 65 6e 74 20 6f 70  ue if current op
3740: 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65 6c  eration is a del
3750: 65 74 65 20 2a 2f 0a 20 20 69 36 34 20 69 44 6f  ete */.  i64 iDo
3760: 63 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  cid             
3770: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69           /* Doci
3780: 64 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f  d to add or remo
3790: 76 65 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ve data from */.
37a0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  );../*.** Flush 
37b0: 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20  any data stored 
37c0: 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
37d0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20   hash tables to 
37e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
37f0: 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
3800: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6c  flag is true, al
3810: 73 6f 20 63 6c 6f 73 65 20 61 6e 79 20 6f 70 65  so close any ope
3820: 6e 20 62 6c 6f 62 20 68 61 6e 64 6c 65 73 2e 0a  n blob handles..
3830: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
3840: 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35  s5IndexSync(Fts5
3850: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43  Index *p, int bC
3860: 6f 6d 6d 69 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  ommit);../*.** D
3870: 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61 20  iscard any data 
3880: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
3890: 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
38a0: 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  les. Do not writ
38b0: 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64  e it.** to the d
38c0: 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
38d0: 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68  nally, assume th
38e0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
38f0: 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  of the %_data.**
3900: 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20   table may have 
3910: 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e  changed on disk.
3920: 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72   So any in-memor
3930: 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61  y caches of %_da
3940: 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d  ta .** records m
3950: 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ust be invalidat
3960: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3970: 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62  e3Fts5IndexRollb
3980: 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ack(Fts5Index *p
3990: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 6f 72  );../*.** Get or
39a0: 20 73 65 74 20 74 68 65 20 22 61 76 65 72 61 67   set the "averag
39b0: 65 73 22 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 69  es" values..*/.i
39c0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
39d0: 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
39e0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
39f0: 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e   *pnRow, i64 *an
3a00: 53 69 7a 65 29 3b 0a 69 6e 74 20 73 71 6c 69 74  Size);.int sqlit
3a10: 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76  e3Fts5IndexSetAv
3a20: 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
3a30: 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20   *p, const u8*, 
3a40: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  int);../*.** Fun
3a50: 63 74 69 6f 6e 73 20 63 61 6c 6c 65 64 20 62 79  ctions called by
3a60: 20 74 68 65 20 73 74 6f 72 61 67 65 20 6d 6f 64   the storage mod
3a70: 75 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 69  ule as part of i
3a80: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a  ntegrity-check..
3a90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
3aa0: 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
3ab0: 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78 2a  Check(Fts5Index*
3ac0: 2c 20 75 36 34 20 63 6b 73 75 6d 29 3b 0a 0a 2f  , u64 cksum);../
3ad0: 2a 20 0a 2a 2a 20 43 61 6c 6c 65 64 20 64 75 72  * .** Called dur
3ae0: 69 6e 67 20 76 69 72 74 75 61 6c 20 6d 6f 64 75  ing virtual modu
3af0: 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
3b00: 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20 55 44  n to register UD
3b10: 46 20 0a 2a 2a 20 66 74 73 35 5f 64 65 63 6f 64  F .** fts5_decod
3b20: 65 28 29 20 77 69 74 68 20 53 51 4c 69 74 65 20  e() with SQLite 
3b30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
3b40: 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c  ts5IndexInit(sql
3b50: 69 74 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  ite3*);..int sql
3b60: 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
3b70: 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78  Cookie(Fts5Index
3b80: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
3b90: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
3ba0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
3bb0: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
3bc0: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 62 79   %_data table by
3bd0: 20 0a 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63   .** this connec
3be0: 74 69 6f 6e 20 73 69 6e 63 65 20 69 74 20 77 61  tion since it wa
3bf0: 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e  s created..*/.in
3c00: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
3c10: 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65  exReads(Fts5Inde
3c20: 78 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  x *p);..int sqli
3c30: 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e  te3Fts5IndexRein
3c40: 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  it(Fts5Index *p)
3c50: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
3c60: 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46  5IndexOptimize(F
3c70: 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a 69 6e  ts5Index *p);.in
3c80: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
3c90: 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65  exMerge(Fts5Inde
3ca0: 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65  x *p, int nMerge
3cb0: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
3cc0: 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66  ts5IndexLoadConf
3cd0: 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ig(Fts5Index *p)
3ce0: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  ;../*.** End of 
3cf0: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  interface to cod
3d00: 65 20 69 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e  e in fts5_index.
3d10: 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c..*************
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 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
3d60: 2f 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 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49  ***********.** I
3db0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
3dc0: 20 69 6e 20 66 74 73 35 5f 76 61 72 69 6e 74 2e   in fts5_varint.
3dd0: 63 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  c. .*/.int sqlit
3de0: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 33  e3Fts5GetVarint3
3df0: 32 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  2(const unsigned
3e00: 20 63 68 61 72 20 2a 70 2c 20 75 33 32 20 2a 76   char *p, u32 *v
3e10: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
3e20: 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 75  s5GetVarintLen(u
3e30: 33 32 20 69 56 61 6c 29 3b 0a 75 38 20 73 71 6c  32 iVal);.u8 sql
3e40: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
3e50: 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  t(const unsigned
3e60: 20 63 68 61 72 2a 2c 20 75 36 34 2a 29 3b 0a 69   char*, u64*);.i
3e70: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  nt sqlite3Fts5Pu
3e80: 74 56 61 72 69 6e 74 28 75 6e 73 69 67 6e 65 64  tVarint(unsigned
3e90: 20 63 68 61 72 20 2a 70 2c 20 75 36 34 20 76 29   char *p, u64 v)
3ea0: 3b 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 47  ;..#define fts5G
3eb0: 65 74 56 61 72 69 6e 74 33 32 28 61 2c 62 29 20  etVarint32(a,b) 
3ec0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
3ed0: 72 69 6e 74 33 32 28 61 2c 28 75 33 32 2a 29 26  rint32(a,(u32*)&
3ee0: 62 29 0a 23 64 65 66 69 6e 65 20 66 74 73 35 47  b).#define fts5G
3ef0: 65 74 56 61 72 69 6e 74 20 20 20 20 73 71 6c 69  etVarint    sqli
3f00: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
3f10: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 46 61  ..#define fts5Fa
3f20: 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  stGetVarint32(a,
3f30: 20 69 4f 66 66 2c 20 6e 56 61 6c 29 20 7b 20 20   iOff, nVal) {  
3f40: 20 20 20 20 5c 0a 20 20 6e 56 61 6c 20 3d 20 28      \.  nVal = (
3f50: 61 29 5b 69 4f 66 66 2b 2b 5d 3b 20 20 20 20 20  a)[iOff++];     
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
3f80: 6e 56 61 6c 20 26 20 30 78 38 30 20 29 7b 20 20  nVal & 0x80 ){  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3fb0: 20 20 69 4f 66 66 2d 2d 3b 20 20 20 20 20 20 20    iOff--;       
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 5c 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  \.    iOff += ft
3ff0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 28  s5GetVarint32(&(
4000: 61 29 5b 69 4f 66 66 5d 2c 20 6e 56 61 6c 29 3b  a)[iOff], nVal);
4010: 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20      \.  }       
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a          \.}.../*
4050: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
4060: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
4070: 66 74 73 35 5f 76 61 72 69 6e 74 2e 63 2e 0a 2a  fts5_varint.c..*
4080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
40d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4110: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
4120: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
4130: 20 66 74 73 35 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e   fts5.c. .*/..in
4140: 74 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  t sqlite3Fts5Get
4150: 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 46 74 73  Tokenizer(.  Fts
4160: 35 47 6c 6f 62 61 6c 2a 2c 20 0a 20 20 63 6f 6e  5Global*, .  con
4170: 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  st char **azArg,
4180: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 46  .  int nArg,.  F
4190: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a  ts5Tokenizer**,.
41a0: 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72    fts5_tokenizer
41b0: 2a 2a 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  **,.  char **pzE
41c0: 72 72 0a 29 3b 0a 0a 46 74 73 35 49 6e 64 65 78  rr.);..Fts5Index
41d0: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64   *sqlite3Fts5Ind
41e0: 65 78 46 72 6f 6d 43 73 72 69 64 28 46 74 73 35  exFromCsrid(Fts5
41f0: 47 6c 6f 62 61 6c 2a 2c 20 69 36 34 2c 20 46 74  Global*, i64, Ft
4200: 73 35 43 6f 6e 66 69 67 20 2a 2a 29 3b 0a 0a 2f  s5Config **);../
4210: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
4220: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
4230: 20 66 74 73 35 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a   fts5.c..*******
4240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4280: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
4290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42d0: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
42e0: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 68  o code in fts5_h
42f0: 61 73 68 2e 63 2e 20 0a 2a 2f 0a 74 79 70 65 64  ash.c. .*/.typed
4300: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 48 61  ef struct Fts5Ha
4310: 73 68 20 46 74 73 35 48 61 73 68 3b 0a 0a 2f 2a  sh Fts5Hash;../*
4320: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 68 61 73  .** Create a has
4330: 68 20 74 61 62 6c 65 2c 20 66 72 65 65 20 61 20  h table, free a 
4340: 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69  hash table..*/.i
4350: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  nt sqlite3Fts5Ha
4360: 73 68 4e 65 77 28 46 74 73 35 43 6f 6e 66 69 67  shNew(Fts5Config
4370: 2a 2c 20 46 74 73 35 48 61 73 68 2a 2a 2c 20 69  *, Fts5Hash**, i
4380: 6e 74 20 2a 70 6e 53 69 7a 65 29 3b 0a 76 6f 69  nt *pnSize);.voi
4390: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
43a0: 68 46 72 65 65 28 46 74 73 35 48 61 73 68 2a 29  hFree(Fts5Hash*)
43b0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
43c0: 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 46  s5HashWrite(.  F
43d0: 74 73 35 48 61 73 68 2a 2c 0a 20 20 69 36 34 20  ts5Hash*,.  i64 
43e0: 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
4400: 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 65 6e  owid for this en
4410: 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  try */.  int iCo
4420: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
4440: 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73  mn token appears
4450: 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65   in (-ve -> dele
4460: 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f  te) */.  int iPo
4470: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
4480: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
4490: 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69  tion of token wi
44a0: 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  thin column */. 
44b0: 20 63 68 61 72 20 62 42 79 74 65 2c 0a 20 20 63   char bByte,.  c
44c0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
44d0: 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f  n, int nToken  /
44e0: 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f  * Token to add o
44f0: 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66  r remove to or f
4500: 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a  rom index */.);.
4510: 0a 2f 2a 0a 2a 2a 20 45 6d 70 74 79 20 28 62 75  ./*.** Empty (bu
4520: 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 29  t do not delete)
4530: 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a   a hash table..*
4540: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
4550: 73 35 48 61 73 68 43 6c 65 61 72 28 46 74 73 35  s5HashClear(Fts5
4560: 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  Hash*);..int sql
4570: 69 74 65 33 46 74 73 35 48 61 73 68 51 75 65 72  ite3Fts5HashQuer
4580: 79 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 20  y(.  Fts5Hash*, 
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
45b0: 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  le to query */. 
45c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
45d0: 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
45e0: 20 2f 2a 20 51 75 65 72 79 20 74 65 72 6d 20 2a   /* Query term *
45f0: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  /.  const u8 **p
4600: 70 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20  pDoclist,       
4610: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
4620: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66  ter to doclist f
4630: 6f 72 20 70 54 65 72 6d 20 2a 2f 0a 20 20 69 6e  or pTerm */.  in
4640: 74 20 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20  t *pnDoclist    
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4660: 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 64 6f   OUT: Size of do
4670: 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  clist in bytes *
4680: 2f 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  /.);..int sqlite
4690: 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
46a0: 74 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 20  t(.  Fts5Hash*, 
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46c0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
46d0: 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  le to query */. 
46e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
46f0: 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  rm, int nTerm   
4700: 20 2f 2a 20 51 75 65 72 79 20 70 72 65 66 69 78   /* Query prefix
4710: 20 2a 2f 0a 29 3b 0a 76 6f 69 64 20 73 71 6c 69   */.);.void sqli
4720: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e  te3Fts5HashScanN
4730: 65 78 74 28 46 74 73 35 48 61 73 68 2a 29 3b 0a  ext(Fts5Hash*);.
4740: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48  int sqlite3Fts5H
4750: 61 73 68 53 63 61 6e 45 6f 66 28 46 74 73 35 48  ashScanEof(Fts5H
4760: 61 73 68 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69  ash*);.void sqli
4770: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
4780: 6e 74 72 79 28 46 74 73 35 48 61 73 68 20 2a 2c  ntry(Fts5Hash *,
4790: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
47a0: 70 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  pzTerm,         
47b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 74 65 72 6d 20     /* OUT: term 
47c0: 28 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 29  (nul-terminated)
47d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
47e0: 2a 70 70 44 6f 63 6c 69 73 74 2c 20 20 20 20 20  *ppDoclist,     
47f0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 70 6f        /* OUT: po
4800: 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
4810: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63   */.  int *pnDoc
4820: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
4830: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 69        /* OUT: si
4840: 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e  ze of doclist in
4850: 20 62 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f   bytes */.);.../
4860: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
4870: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
4880: 20 66 74 73 35 5f 68 61 73 68 2e 63 2e 0a 2a 2a   fts5_hash.c..**
4890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4920: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
4930: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
4940: 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 20 66  ts5_storage.c. f
4950: 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 20 63 6f  ts5_storage.c co
4960: 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e 73 20  ntains contains 
4970: 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 61 63 63 65  .** code to acce
4980: 73 73 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  ss the data stor
4990: 65 64 20 69 6e 20 74 68 65 20 25 5f 63 6f 6e 74  ed in the %_cont
49a0: 65 6e 74 20 61 6e 64 20 25 5f 64 6f 63 73 69 7a  ent and %_docsiz
49b0: 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 0a 23 64  e tables..*/..#d
49c0: 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54 5f  efine FTS5_STMT_
49d0: 53 43 41 4e 5f 41 53 43 20 20 30 20 20 20 20 20  SCAN_ASC  0     
49e0: 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  /* SELECT rowid,
49f0: 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45   * FROM ... ORDE
4a00: 52 20 42 59 20 31 20 41 53 43 20 2a 2f 0a 23 64  R BY 1 ASC */.#d
4a10: 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54 5f  efine FTS5_STMT_
4a20: 53 43 41 4e 5f 44 45 53 43 20 31 20 20 20 20 20  SCAN_DESC 1     
4a30: 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  /* SELECT rowid,
4a40: 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45   * FROM ... ORDE
4a50: 52 20 42 59 20 31 20 44 45 53 43 20 2a 2f 0a 23  R BY 1 DESC */.#
4a60: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54  define FTS5_STMT
4a70: 5f 4c 4f 4f 4b 55 50 20 20 20 20 32 20 20 20 20  _LOOKUP    2    
4a80: 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64   /* SELECT rowid
4a90: 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45  , * FROM ... WHE
4aa0: 52 45 20 72 6f 77 69 64 3d 3f 20 2a 2f 0a 0a 74  RE rowid=? */..t
4ab0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
4ac0: 73 35 53 74 6f 72 61 67 65 20 46 74 73 35 53 74  s5Storage Fts5St
4ad0: 6f 72 61 67 65 3b 0a 0a 69 6e 74 20 73 71 6c 69  orage;..int sqli
4ae0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4f 70  te3Fts5StorageOp
4af0: 65 6e 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20  en(Fts5Config*, 
4b00: 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 6e 74 2c  Fts5Index*, int,
4b10: 20 46 74 73 35 53 74 6f 72 61 67 65 2a 2a 2c 20   Fts5Storage**, 
4b20: 63 68 61 72 2a 2a 29 3b 0a 69 6e 74 20 73 71 6c  char**);.int sql
4b30: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 43  ite3Fts5StorageC
4b40: 6c 6f 73 65 28 46 74 73 35 53 74 6f 72 61 67 65  lose(Fts5Storage
4b50: 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *p);.int sqlite
4b60: 33 46 74 73 35 53 74 6f 72 61 67 65 52 65 6e 61  3Fts5StorageRena
4b70: 6d 65 28 46 74 73 35 53 74 6f 72 61 67 65 2a 2c  me(Fts5Storage*,
4b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4b90: 6d 65 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  me);..int sqlite
4ba0: 33 46 74 73 35 44 72 6f 70 41 6c 6c 28 46 74 73  3Fts5DropAll(Fts
4bb0: 35 43 6f 6e 66 69 67 2a 29 3b 0a 69 6e 74 20 73  5Config*);.int s
4bc0: 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
4bd0: 54 61 62 6c 65 28 46 74 73 35 43 6f 6e 66 69 67  Table(Fts5Config
4be0: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
4bf0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
4c00: 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 0a 69 6e 74  , char **);..int
4c10: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
4c20: 61 67 65 44 65 6c 65 74 65 28 46 74 73 35 53 74  ageDelete(Fts5St
4c30: 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 2c 20 73  orage *p, i64, s
4c40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b  qlite3_value**);
4c50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4c60: 53 74 6f 72 61 67 65 43 6f 6e 74 65 6e 74 49 6e  StorageContentIn
4c70: 73 65 72 74 28 46 74 73 35 53 74 6f 72 61 67 65  sert(Fts5Storage
4c80: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c   *p, sqlite3_val
4c90: 75 65 2a 2a 2c 20 69 36 34 2a 29 3b 0a 69 6e 74  ue**, i64*);.int
4ca0: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
4cb0: 61 67 65 49 6e 64 65 78 49 6e 73 65 72 74 28 46  ageIndexInsert(F
4cc0: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 73  ts5Storage *p, s
4cd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 2c 20  qlite3_value**, 
4ce0: 69 36 34 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  i64);..int sqlit
4cf0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74  e3Fts5StorageInt
4d00: 65 67 72 69 74 79 28 46 74 73 35 53 74 6f 72 61  egrity(Fts5Stora
4d10: 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c  ge *p);..int sql
4d20: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
4d30: 74 6d 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  tmt(Fts5Storage 
4d40: 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20 73  *p, int eStmt, s
4d50: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2a 2c 20 63  qlite3_stmt**, c
4d60: 68 61 72 2a 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  har**);.void sql
4d70: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
4d80: 74 6d 74 52 65 6c 65 61 73 65 28 46 74 73 35 53  tmtRelease(Fts5S
4d90: 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 65  torage *p, int e
4da0: 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73 74  Stmt, sqlite3_st
4db0: 6d 74 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  mt*);..int sqlit
4dc0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 6f 63  e3Fts5StorageDoc
4dd0: 73 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65  size(Fts5Storage
4de0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
4df0: 20 69 6e 74 20 2a 61 43 6f 6c 29 3b 0a 69 6e 74   int *aCol);.int
4e00: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
4e10: 61 67 65 53 69 7a 65 28 46 74 73 35 53 74 6f 72  ageSize(Fts5Stor
4e20: 61 67 65 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  age *p, int iCol
4e30: 2c 20 69 36 34 20 2a 70 6e 41 76 67 29 3b 0a 69  , i64 *pnAvg);.i
4e40: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4e50: 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28 46 74  orageRowCount(Ft
4e60: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36  s5Storage *p, i6
4e70: 34 20 2a 70 6e 52 6f 77 29 3b 0a 0a 69 6e 74 20  4 *pnRow);..int 
4e80: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4e90: 67 65 53 79 6e 63 28 46 74 73 35 53 74 6f 72 61  geSync(Fts5Stora
4ea0: 67 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d  ge *p, int bComm
4eb0: 69 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  it);.int sqlite3
4ec0: 46 74 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c 62  Fts5StorageRollb
4ed0: 61 63 6b 28 46 74 73 35 53 74 6f 72 61 67 65 20  ack(Fts5Storage 
4ee0: 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  *p);..int sqlite
4ef0: 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 66  3Fts5StorageConf
4f00: 69 67 56 61 6c 75 65 28 0a 20 20 20 20 46 74 73  igValue(.    Fts
4f10: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 63 6f 6e  5Storage *p, con
4f20: 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65  st char*, sqlite
4f30: 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 0a 29 3b  3_value*, int.);
4f40: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
4f50: 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 41 6c  5StorageDeleteAl
4f60: 6c 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  l(Fts5Storage *p
4f70: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4f80: 73 35 53 74 6f 72 61 67 65 52 65 62 75 69 6c 64  s5StorageRebuild
4f90: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29  (Fts5Storage *p)
4fa0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4fb0: 35 53 74 6f 72 61 67 65 4f 70 74 69 6d 69 7a 65  5StorageOptimize
4fc0: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29  (Fts5Storage *p)
4fd0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4fe0: 35 53 74 6f 72 61 67 65 4d 65 72 67 65 28 46 74  5StorageMerge(Ft
4ff0: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e  s5Storage *p, in
5000: 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 2f 2a 0a 2a  t nMerge);../*.*
5010: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
5020: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
5030: 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 0a 2a 2a  s5_storage.c..**
5040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5080: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
5090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50d0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  *******.** Inter
50e0: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
50f0: 66 74 73 35 5f 65 78 70 72 2e 63 2e 20 0a 2a 2f  fts5_expr.c. .*/
5100: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5110: 46 74 73 35 45 78 70 72 20 46 74 73 35 45 78 70  Fts5Expr Fts5Exp
5120: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
5130: 74 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 46  t Fts5ExprNode F
5140: 74 73 35 45 78 70 72 4e 6f 64 65 3b 0a 74 79 70  ts5ExprNode;.typ
5150: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
5160: 50 61 72 73 65 20 46 74 73 35 50 61 72 73 65 3b  Parse Fts5Parse;
5170: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5180: 46 74 73 35 54 6f 6b 65 6e 20 46 74 73 35 54 6f  Fts5Token Fts5To
5190: 6b 65 6e 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ken;.typedef str
51a0: 75 63 74 20 46 74 73 35 45 78 70 72 50 68 72 61  uct Fts5ExprPhra
51b0: 73 65 20 46 74 73 35 45 78 70 72 50 68 72 61 73  se Fts5ExprPhras
51c0: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
51d0: 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  t Fts5ExprNearse
51e0: 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  t Fts5ExprNearse
51f0: 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 54  t;..struct Fts5T
5200: 6f 6b 65 6e 20 7b 0a 20 20 63 6f 6e 73 74 20 63  oken {.  const c
5210: 68 61 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  har *p;         
5220: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65           /* Toke
5230: 6e 20 74 65 78 74 20 28 6e 6f 74 20 4e 55 4c 4c  n text (not NULL
5240: 20 74 65 72 6d 69 6e 61 74 65 64 29 20 2a 2f 0a   terminated) */.
5250: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5270: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
5280: 66 65 72 20 70 20 69 6e 20 62 79 74 65 73 20 2a  fer p in bytes *
5290: 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61  /.};../* Parse a
52a0: 20 4d 41 54 43 48 20 65 78 70 72 65 73 73 69 6f   MATCH expressio
52b0: 6e 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n. */.int sqlite
52c0: 33 46 74 73 35 45 78 70 72 4e 65 77 28 0a 20 20  3Fts5ExprNew(.  
52d0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
52e0: 66 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  fig, .  const ch
52f0: 61 72 20 2a 7a 45 78 70 72 2c 0a 20 20 46 74 73  ar *zExpr,.  Fts
5300: 35 45 78 70 72 20 2a 2a 70 70 4e 65 77 2c 20 0a  5Expr **ppNew, .
5310: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
5320: 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28 72 63 20  ;../*.** for(rc 
5330: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  = sqlite3Fts5Exp
5340: 72 46 69 72 73 74 28 70 45 78 70 72 2c 20 70 49  rFirst(pExpr, pI
5350: 64 78 2c 20 62 44 65 73 63 29 3b 0a 2a 2a 20 20  dx, bDesc);.**  
5360: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
5370: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74   && 0==sqlite3Ft
5380: 73 35 45 78 70 72 45 6f 66 28 70 45 78 70 72 29  s5ExprEof(pExpr)
5390: 3b 0a 2a 2a 20 20 20 20 20 72 63 20 3d 20 73 71  ;.**     rc = sq
53a0: 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e 65 78  lite3Fts5ExprNex
53b0: 74 28 70 45 78 70 72 29 0a 2a 2a 20 29 7b 0a 2a  t(pExpr).** ){.*
53c0: 2a 20 20 20 2f 2f 20 54 68 65 20 64 6f 63 75 6d  *   // The docum
53d0: 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69  ent with rowid i
53e0: 52 6f 77 69 64 20 6d 61 74 63 68 65 73 20 74 68  Rowid matches th
53f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 21 0a 2a 2a  e expression!.**
5400: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
5410: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 52  sqlite3Fts5ExprR
5420: 6f 77 69 64 28 70 45 78 70 72 29 3b 0a 2a 2a 20  owid(pExpr);.** 
5430: 7d 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  }.*/.int sqlite3
5440: 46 74 73 35 45 78 70 72 46 69 72 73 74 28 46 74  Fts5ExprFirst(Ft
5450: 73 35 45 78 70 72 2a 2c 20 46 74 73 35 49 6e 64  s5Expr*, Fts5Ind
5460: 65 78 20 2a 70 49 64 78 2c 20 69 36 34 20 69 4d  ex *pIdx, i64 iM
5470: 69 6e 2c 20 69 6e 74 20 62 44 65 73 63 29 3b 0a  in, int bDesc);.
5480: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
5490: 78 70 72 4e 65 78 74 28 46 74 73 35 45 78 70 72  xprNext(Fts5Expr
54a0: 2a 2c 20 69 36 34 20 69 4d 61 78 29 3b 0a 69 6e  *, i64 iMax);.in
54b0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
54c0: 72 45 6f 66 28 46 74 73 35 45 78 70 72 2a 29 3b  rEof(Fts5Expr*);
54d0: 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35  .i64 sqlite3Fts5
54e0: 45 78 70 72 52 6f 77 69 64 28 46 74 73 35 45 78  ExprRowid(Fts5Ex
54f0: 70 72 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69  pr*);..void sqli
5500: 74 65 33 46 74 73 35 45 78 70 72 46 72 65 65 28  te3Fts5ExprFree(
5510: 46 74 73 35 45 78 70 72 2a 29 3b 0a 0a 2f 2a 20  Fts5Expr*);../* 
5520: 43 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 73 74  Called during st
5530: 61 72 74 75 70 20 74 6f 20 72 65 67 69 73 74 65  artup to registe
5540: 72 20 61 20 55 44 46 20 77 69 74 68 20 53 51 4c  r a UDF with SQL
5550: 69 74 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ite */.int sqlit
5560: 65 33 46 74 73 35 45 78 70 72 49 6e 69 74 28 46  e3Fts5ExprInit(F
5570: 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69  ts5Global*, sqli
5580: 74 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  te3*);..int sqli
5590: 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73  te3Fts5ExprPhras
55a0: 65 43 6f 75 6e 74 28 46 74 73 35 45 78 70 72 2a  eCount(Fts5Expr*
55b0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
55c0: 73 35 45 78 70 72 50 68 72 61 73 65 53 69 7a 65  s5ExprPhraseSize
55d0: 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 20  (Fts5Expr*, int 
55e0: 69 50 68 72 61 73 65 29 3b 0a 69 6e 74 20 73 71  iPhrase);.int sq
55f0: 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 6f 73  lite3Fts5ExprPos
5600: 6c 69 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20  list(Fts5Expr*, 
5610: 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a  int, const u8 **
5620: 29 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  );..typedef stru
5630: 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f  ct Fts5PoslistPo
5640: 70 75 6c 61 74 6f 72 20 46 74 73 35 50 6f 73 6c  pulator Fts5Posl
5650: 69 73 74 50 6f 70 75 6c 61 74 6f 72 3b 0a 46 74  istPopulator;.Ft
5660: 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74  s5PoslistPopulat
5670: 6f 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 45  or *sqlite3Fts5E
5680: 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73 74 73  xprClearPoslists
5690: 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 29  (Fts5Expr*, int)
56a0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
56b0: 35 45 78 70 72 50 6f 70 75 6c 61 74 65 50 6f 73  5ExprPopulatePos
56c0: 6c 69 73 74 73 28 0a 20 20 20 20 46 74 73 35 43  lists(.    Fts5C
56d0: 6f 6e 66 69 67 2a 2c 20 46 74 73 35 45 78 70 72  onfig*, Fts5Expr
56e0: 2a 2c 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f  *, Fts5PoslistPo
56f0: 70 75 6c 61 74 6f 72 2a 2c 20 69 6e 74 2c 20 63  pulator*, int, c
5700: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 0a  onst char*, int.
5710: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
5720: 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c  ts5ExprCheckPosl
5730: 69 73 74 73 28 46 74 73 35 45 78 70 72 2a 2c 20  ists(Fts5Expr*, 
5740: 69 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  i64);.void sqlit
5750: 65 33 46 74 73 35 45 78 70 72 43 6c 65 61 72 45  e3Fts5ExprClearE
5760: 6f 66 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 0a  of(Fts5Expr*);..
5770: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
5780: 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65 28 46  xprClonePhrase(F
5790: 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20 46  ts5Expr*, int, F
57a0: 74 73 35 45 78 70 72 2a 2a 29 3b 0a 0a 69 6e 74  ts5Expr**);..int
57b0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
57c0: 50 68 72 61 73 65 43 6f 6c 6c 69 73 74 28 46 74  PhraseCollist(Ft
57d0: 73 35 45 78 70 72 20 2a 2c 20 69 6e 74 2c 20 63  s5Expr *, int, c
57e0: 6f 6e 73 74 20 75 38 20 2a 2a 2c 20 69 6e 74 20  onst u8 **, int 
57f0: 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);../**********
5800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5820: 2a 0a 2a 2a 20 54 68 65 20 66 74 73 35 5f 65 78  *.** The fts5_ex
5830: 70 72 2e 63 20 41 50 49 20 61 62 6f 76 65 20 74  pr.c API above t
5840: 68 69 73 20 70 6f 69 6e 74 20 69 73 20 75 73 65  his point is use
5850: 64 20 62 79 20 74 68 65 20 6f 74 68 65 72 20 68  d by the other h
5860: 61 6e 64 2d 77 72 69 74 74 65 6e 0a 2a 2a 20 43  and-written.** C
5870: 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 6d 6f   code in this mo
5880: 64 75 6c 65 2e 20 54 68 65 20 69 6e 74 65 72 66  dule. The interf
5890: 61 63 65 73 20 62 65 6c 6f 77 20 74 68 69 73 20  aces below this 
58a0: 70 6f 69 6e 74 20 61 72 65 20 63 61 6c 6c 65 64  point are called
58b0: 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 72 73 65   by.** the parse
58c0: 72 20 63 6f 64 65 20 69 6e 20 66 74 73 35 70 61  r code in fts5pa
58d0: 72 73 65 2e 79 2e 20 20 2a 2f 0a 0a 76 6f 69 64  rse.y.  */..void
58e0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
58f0: 65 45 72 72 6f 72 28 46 74 73 35 50 61 72 73 65  eError(Fts5Parse
5900: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
5910: 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29  char *zFmt, ...)
5920: 3b 0a 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20  ;..Fts5ExprNode 
5930: 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73  *sqlite3Fts5Pars
5940: 65 4e 6f 64 65 28 0a 20 20 46 74 73 35 50 61 72  eNode(.  Fts5Par
5950: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 69 6e  se *pParse,.  in
5960: 74 20 65 54 79 70 65 2c 0a 20 20 46 74 73 35 45  t eType,.  Fts5E
5970: 78 70 72 4e 6f 64 65 20 2a 70 4c 65 66 74 2c 0a  xprNode *pLeft,.
5980: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
5990: 70 52 69 67 68 74 2c 0a 20 20 46 74 73 35 45 78  pRight,.  Fts5Ex
59a0: 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
59b0: 0a 29 3b 0a 0a 46 74 73 35 45 78 70 72 50 68 72  .);..Fts5ExprPhr
59c0: 61 73 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35  ase *sqlite3Fts5
59d0: 50 61 72 73 65 54 65 72 6d 28 0a 20 20 46 74 73  ParseTerm(.  Fts
59e0: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
59f0: 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73  .  Fts5ExprPhras
5a00: 65 20 2a 70 50 68 72 61 73 65 2c 20 0a 20 20 46  e *pPhrase, .  F
5a10: 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  ts5Token *pToken
5a20: 2c 0a 20 20 69 6e 74 20 62 50 72 65 66 69 78 0a  ,.  int bPrefix.
5a30: 29 3b 0a 0a 46 74 73 35 45 78 70 72 4e 65 61 72  );..Fts5ExprNear
5a40: 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35  set *sqlite3Fts5
5a50: 50 61 72 73 65 4e 65 61 72 73 65 74 28 0a 20 20  ParseNearset(.  
5a60: 46 74 73 35 50 61 72 73 65 2a 2c 20 0a 20 20 46  Fts5Parse*, .  F
5a70: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c  ts5ExprNearset*,
5a80: 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73  .  Fts5ExprPhras
5a90: 65 2a 20 0a 29 3b 0a 0a 46 74 73 35 43 6f 6c 73  e* .);..Fts5Cols
5aa0: 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  et *sqlite3Fts5P
5ab0: 61 72 73 65 43 6f 6c 73 65 74 28 0a 20 20 46 74  arseColset(.  Ft
5ac0: 73 35 50 61 72 73 65 2a 2c 20 0a 20 20 46 74 73  s5Parse*, .  Fts
5ad0: 35 43 6f 6c 73 65 74 2a 2c 20 0a 20 20 46 74 73  5Colset*, .  Fts
5ae0: 35 54 6f 6b 65 6e 20 2a 0a 29 3b 0a 0a 76 6f 69  5Token *.);..voi
5af0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
5b00: 73 65 50 68 72 61 73 65 46 72 65 65 28 46 74 73  sePhraseFree(Fts
5b10: 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0a 76  5ExprPhrase*);.v
5b20: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
5b30: 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65 28  arseNearsetFree(
5b40: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a  Fts5ExprNearset*
5b50: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
5b60: 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65  ts5ParseNodeFree
5b70: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 3b  (Fts5ExprNode*);
5b80: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
5b90: 73 35 50 61 72 73 65 53 65 74 44 69 73 74 61 6e  s5ParseSetDistan
5ba0: 63 65 28 46 74 73 35 50 61 72 73 65 2a 2c 20 46  ce(Fts5Parse*, F
5bb0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c  ts5ExprNearset*,
5bc0: 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a 76 6f   Fts5Token*);.vo
5bd0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
5be0: 72 73 65 53 65 74 43 6f 6c 73 65 74 28 46 74 73  rseSetColset(Fts
5bf0: 35 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78 70  5Parse*, Fts5Exp
5c00: 72 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35 43  rNearset*, Fts5C
5c10: 6f 6c 73 65 74 2a 29 3b 0a 76 6f 69 64 20 73 71  olset*);.void sq
5c20: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46 69  lite3Fts5ParseFi
5c30: 6e 69 73 68 65 64 28 46 74 73 35 50 61 72 73 65  nished(Fts5Parse
5c40: 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45 78   *pParse, Fts5Ex
5c50: 70 72 4e 6f 64 65 20 2a 70 29 3b 0a 76 6f 69 64  prNode *p);.void
5c60: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
5c70: 65 4e 65 61 72 28 46 74 73 35 50 61 72 73 65 20  eNear(Fts5Parse 
5c80: 2a 70 50 61 72 73 65 2c 20 46 74 73 35 54 6f 6b  *pParse, Fts5Tok
5c90: 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64  en*);../*.** End
5ca0: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
5cb0: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 65 78   code in fts5_ex
5cc0: 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  pr.c..**********
5cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d10: 2f 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..../**********
5d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d60: 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
5d70: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 61 75   code in fts5_au
5d80: 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71  x.c. .*/..int sq
5d90: 6c 69 74 65 33 46 74 73 35 41 75 78 49 6e 69 74  lite3Fts5AuxInit
5da0: 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a  (fts5_api*);./*.
5db0: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
5dc0: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
5dd0: 74 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a 2a 2a 2a  ts5_aux.c..*****
5de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e20: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
5e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e70: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
5e80: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
5e90: 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 20 0a 2a  _tokenizer.c. .*
5ea0: 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  /..int sqlite3Ft
5eb0: 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e 69 74 28  s5TokenizerInit(
5ec0: 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a 2a  fts5_api*);./*.*
5ed0: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
5ee0: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
5ef0: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 0a  s5_tokenizer.c..
5f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
5f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f90: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
5fa0: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
5fb0: 20 66 74 73 35 5f 76 6f 63 61 62 2e 63 2e 20 0a   fts5_vocab.c. .
5fc0: 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  */..int sqlite3F
5fd0: 74 73 35 56 6f 63 61 62 49 6e 69 74 28 46 74 73  ts5VocabInit(Fts
5fe0: 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65  5Global*, sqlite
5ff0: 33 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  3*);../*.** End 
6000: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
6010: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 76 6f 63  code in fts5_voc
6020: 61 62 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ab.c..**********
6030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6070: 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
6080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
60c0: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
60d0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
60e0: 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 6e 20  nerated code in 
60f0: 66 74 73 35 5f 75 6e 69 63 6f 64 65 32 2e 63 2e  fts5_unicode2.c.
6100: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
6110: 46 74 73 35 55 6e 69 63 6f 64 65 49 73 61 6c 6e  Fts5UnicodeIsaln
6120: 75 6d 28 69 6e 74 20 63 29 3b 0a 69 6e 74 20 73  um(int c);.int s
6130: 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64  qlite3Fts5Unicod
6140: 65 49 73 64 69 61 63 72 69 74 69 63 28 69 6e 74  eIsdiacritic(int
6150: 20 63 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33   c);.int sqlite3
6160: 46 74 73 35 55 6e 69 63 6f 64 65 46 6f 6c 64 28  Fts5UnicodeFold(
6170: 69 6e 74 20 63 2c 20 69 6e 74 20 62 52 65 6d 6f  int c, int bRemo
6180: 76 65 44 69 61 63 72 69 74 69 63 29 3b 0a 2f 2a  veDiacritic);./*
6190: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
61a0: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
61b0: 66 74 73 35 5f 75 6e 69 63 6f 64 65 32 2e 63 2e  fts5_unicode2.c.
61c0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
61d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65  ***********/..#e
6210: 6e 64 69 66 0a                                   ndif.