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

Artifact fa7c17e5c3ec9c8690387ff962f9dc6aee75e114:


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 68 6f 72 74 20 69 31 36 3b  pedef short i16;
0290: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
02a0: 5f 69 6e 74 36 34 20 69 36 34 3b 0a 74 79 70 65  _int64 i64;.type
02b0: 64 65 66 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  def sqlite3_uint
02c0: 36 34 20 75 36 34 3b 0a 0a 23 64 65 66 69 6e 65  64 u64;..#define
02d0: 20 41 72 72 61 79 53 69 7a 65 28 78 29 20 28 28   ArraySize(x) ((
02e0: 69 6e 74 29 28 73 69 7a 65 6f 66 28 78 29 20 2f  int)(sizeof(x) /
02f0: 20 73 69 7a 65 6f 66 28 78 5b 30 5d 29 29 29 0a   sizeof(x[0]))).
0300: 0a 23 64 65 66 69 6e 65 20 74 65 73 74 63 61 73  .#define testcas
0310: 65 28 78 29 0a 23 64 65 66 69 6e 65 20 41 4c 57  e(x).#define ALW
0320: 41 59 53 28 78 29 20 31 0a 23 64 65 66 69 6e 65  AYS(x) 1.#define
0330: 20 4e 45 56 45 52 28 78 29 20 30 0a 0a 23 64 65   NEVER(x) 0..#de
0340: 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29 20 28 28  fine MIN(x,y) ((
0350: 28 78 29 20 3c 20 28 79 29 29 20 3f 20 28 78 29  (x) < (y)) ? (x)
0360: 20 3a 20 28 79 29 29 0a 23 64 65 66 69 6e 65 20   : (y)).#define 
0370: 4d 41 58 28 78 2c 79 29 20 28 28 28 78 29 20 3e  MAX(x,y) (((x) >
0380: 20 28 79 29 29 20 3f 20 28 78 29 20 3a 20 28 79   (y)) ? (x) : (y
0390: 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  ))../*.** Consta
03a0: 6e 74 73 20 66 6f 72 20 74 68 65 20 6c 61 72 67  nts for the larg
03b0: 65 73 74 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74  est and smallest
03c0: 20 70 6f 73 73 69 62 6c 65 20 36 34 2d 62 69 74   possible 64-bit
03d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73   signed integers
03e0: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 4c 41  ..*/.# define LA
03f0: 52 47 45 53 54 5f 49 4e 54 36 34 20 20 28 30 78  RGEST_INT64  (0x
0400: 66 66 66 66 66 66 66 66 7c 28 28 28 69 36 34 29  ffffffff|(((i64)
0410: 30 78 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29  0x7fffffff)<<32)
0420: 29 0a 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c  ).# define SMALL
0430: 45 53 54 5f 49 4e 54 36 34 20 28 28 28 69 36 34  EST_INT64 (((i64
0440: 29 2d 31 29 20 2d 20 4c 41 52 47 45 53 54 5f 49  )-1) - LARGEST_I
0450: 4e 54 36 34 29 0a 0a 23 65 6e 64 69 66 0a 0a 0a  NT64)..#endif...
0460: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75  /*.** Maximum nu
0470: 6d 62 65 72 20 6f 66 20 70 72 65 66 69 78 20 69  mber of prefix i
0480: 6e 64 65 78 65 73 20 6f 6e 20 73 69 6e 67 6c 65  ndexes on single
0490: 20 46 54 53 35 20 74 61 62 6c 65 2e 20 54 68 69   FTS5 table. Thi
04a0: 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6c 65 73  s must be.** les
04b0: 73 20 74 68 61 6e 20 33 32 2e 20 49 66 20 69 74  s than 32. If it
04c0: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 79 74 68   is set to anyth
04d0: 69 6e 67 20 6c 61 72 67 65 20 74 68 61 6e 20 74  ing large than t
04e0: 68 61 74 2c 20 61 6e 20 23 65 72 72 6f 72 0a 2a  hat, an #error.*
04f0: 2a 20 64 69 72 65 63 74 69 76 65 20 69 6e 20 66  * directive in f
0500: 74 73 35 5f 69 6e 64 65 78 2e 63 20 77 69 6c 6c  ts5_index.c will
0510: 20 63 61 75 73 65 20 74 68 65 20 62 75 69 6c 64   cause the build
0520: 20 74 6f 20 66 61 69 6c 2e 0a 2a 2f 0a 23 64 65   to fail..*/.#de
0530: 66 69 6e 65 20 46 54 53 35 5f 4d 41 58 5f 50 52  fine FTS5_MAX_PR
0540: 45 46 49 58 5f 49 4e 44 45 58 45 53 20 33 31 0a  EFIX_INDEXES 31.
0550: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45  .#define FTS5_DE
0560: 46 41 55 4c 54 5f 4e 45 41 52 44 49 53 54 20 31  FAULT_NEARDIST 1
0570: 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  0.#define FTS5_D
0580: 45 46 41 55 4c 54 5f 52 41 4e 4b 20 20 20 20 20  EFAULT_RANK     
0590: 22 62 6d 32 35 22 0a 0a 2f 2a 20 4e 61 6d 65 20  "bm25"../* Name 
05a0: 6f 66 20 72 61 6e 6b 20 61 6e 64 20 72 6f 77 69  of rank and rowi
05b0: 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65  d columns */.#de
05c0: 66 69 6e 65 20 46 54 53 35 5f 52 41 4e 4b 5f 4e  fine FTS5_RANK_N
05d0: 41 4d 45 20 22 72 61 6e 6b 22 0a 23 64 65 66 69  AME "rank".#defi
05e0: 6e 65 20 46 54 53 35 5f 52 4f 57 49 44 5f 4e 41  ne FTS5_ROWID_NA
05f0: 4d 45 20 22 72 6f 77 69 64 22 0a 0a 23 69 66 64  ME "rowid"..#ifd
0600: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0610: 23 20 64 65 66 69 6e 65 20 46 54 53 35 5f 43 4f  # define FTS5_CO
0620: 52 52 55 50 54 20 73 71 6c 69 74 65 33 46 74 73  RRUPT sqlite3Fts
0630: 35 43 6f 72 72 75 70 74 28 29 0a 69 6e 74 20 73  5Corrupt().int s
0640: 71 6c 69 74 65 33 46 74 73 35 43 6f 72 72 75 70  qlite3Fts5Corrup
0650: 74 28 76 6f 69 64 29 3b 0a 23 65 6c 73 65 0a 23  t(void);.#else.#
0660: 20 64 65 66 69 6e 65 20 46 54 53 35 5f 43 4f 52   define FTS5_COR
0670: 52 55 50 54 20 53 51 4c 49 54 45 5f 43 4f 52 52  RUPT SQLITE_CORR
0680: 55 50 54 5f 56 54 41 42 0a 23 65 6e 64 69 66 0a  UPT_VTAB.#endif.
0690: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 73 73 65 72  ./*.** The asser
06a0: 74 5f 6e 63 28 29 20 6d 61 63 72 6f 20 69 73 20  t_nc() macro is 
06b0: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 61  similar to the a
06c0: 73 73 65 72 74 28 29 20 6d 61 63 72 6f 2c 20 65  ssert() macro, e
06d0: 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
06e0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 73 73   is used for ass
06f0: 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73  ert() conditions
0700: 20 74 68 61 74 20 61 72 65 20 74 72 75 65 20 6f   that are true o
0710: 6e 6c 79 20 69 66 20 69 74 20 63 61 6e 20 62 65  nly if it can be
0720: 20 0a 2a 2a 20 67 75 72 61 6e 74 65 65 64 20 74   .** guranteed t
0730: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
0740: 20 69 73 20 6e 6f 74 20 63 6f 72 72 75 70 74 2e   is not corrupt.
0750: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0760: 45 5f 44 45 42 55 47 0a 65 78 74 65 72 6e 20 69  E_DEBUG.extern i
0770: 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  nt sqlite3_fts5_
0780: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 3b 0a  may_be_corrupt;.
0790: 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 5f  # define assert_
07a0: 6e 63 28 78 29 20 61 73 73 65 72 74 28 73 71 6c  nc(x) assert(sql
07b0: 69 74 65 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65  ite3_fts5_may_be
07c0: 5f 63 6f 72 72 75 70 74 20 7c 7c 20 28 78 29 29  _corrupt || (x))
07d0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
07e0: 61 73 73 65 72 74 5f 6e 63 28 78 29 20 61 73 73  assert_nc(x) ass
07f0: 65 72 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  ert(x).#endif../
0800: 2a 20 4d 61 72 6b 20 61 20 66 75 6e 63 74 69 6f  * Mark a functio
0810: 6e 20 70 61 72 61 6d 65 74 65 72 20 61 73 20 75  n parameter as u
0820: 6e 75 73 65 64 2c 20 74 6f 20 73 75 70 70 72 65  nused, to suppre
0830: 73 73 20 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70  ss nuisance comp
0840: 69 6c 65 72 0a 2a 2a 20 77 61 72 6e 69 6e 67 73  iler.** warnings
0850: 2e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55  . */.#ifndef UNU
0860: 53 45 44 5f 50 41 52 41 4d 0a 23 20 64 65 66 69  SED_PARAM.# defi
0870: 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  ne UNUSED_PARAM(
0880: 58 29 20 20 28 76 6f 69 64 29 28 58 29 0a 23 65  X)  (void)(X).#e
0890: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 55 4e  ndif..#ifndef UN
08a0: 55 53 45 44 5f 50 41 52 41 4d 32 0a 23 20 64 65  USED_PARAM2.# de
08b0: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
08c0: 4d 32 28 58 2c 20 59 29 20 20 28 76 6f 69 64 29  M2(X, Y)  (void)
08d0: 28 58 29 2c 20 28 76 6f 69 64 29 28 59 29 0a 23  (X), (void)(Y).#
08e0: 65 6e 64 69 66 0a 0a 74 79 70 65 64 65 66 20 73  endif..typedef s
08f0: 74 72 75 63 74 20 46 74 73 35 47 6c 6f 62 61 6c  truct Fts5Global
0900: 20 46 74 73 35 47 6c 6f 62 61 6c 3b 0a 74 79 70   Fts5Global;.typ
0910: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
0920: 43 6f 6c 73 65 74 20 46 74 73 35 43 6f 6c 73 65  Colset Fts5Colse
0930: 74 3b 0a 0a 2f 2a 20 49 66 20 61 20 4e 45 41 52  t;../* If a NEAR
0940: 28 29 20 63 6c 75 6d 70 20 6f 72 20 70 68 72 61  () clump or phra
0950: 73 65 20 6d 61 79 20 6f 6e 6c 79 20 6d 61 74 63  se may only matc
0960: 68 20 61 20 73 70 65 63 69 66 69 63 20 73 65 74  h a specific set
0970: 20 6f 66 20 63 6f 6c 75 6d 6e 73 2c 20 0a 2a 2a   of columns, .**
0980: 20 74 68 65 6e 20 61 6e 20 6f 62 6a 65 63 74 20   then an object 
0990: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
09a0: 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74 6f   type is used to
09b0: 20 72 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   record the set 
09c0: 6f 66 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20 45  of columns..** E
09d0: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
09e0: 20 61 69 43 6f 6c 5b 5d 20 61 72 72 61 79 20 69   aiCol[] array i
09f0: 73 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  s a column that 
0a00: 6d 61 79 20 62 65 20 6d 61 74 63 68 65 64 2e 0a  may be matched..
0a10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  **.** This objec
0a20: 74 20 69 73 20 75 73 65 64 20 62 79 20 66 74 73  t is used by fts
0a30: 35 5f 65 78 70 72 2e 63 20 61 6e 64 20 66 74 73  5_expr.c and fts
0a40: 35 5f 69 6e 64 65 78 2e 63 2e 0a 2a 2f 0a 73 74  5_index.c..*/.st
0a50: 72 75 63 74 20 46 74 73 35 43 6f 6c 73 65 74 20  ruct Fts5Colset 
0a60: 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  {.  int nCol;.  
0a70: 69 6e 74 20 61 69 43 6f 6c 5b 31 5d 3b 0a 7d 3b  int aiCol[1];.};
0a80: 0a 0a 0a 0a 2f 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 2a 2a 2a 2a  ****************
0ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0ad0: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
0ae0: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 63 6f 6e  code in fts5_con
0af0: 66 69 67 2e 63 2e 20 66 74 73 35 5f 63 6f 6e 66  fig.c. fts5_conf
0b00: 69 67 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f  ig.c contains co
0b10: 6e 74 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74  ntains code.** t
0b20: 6f 20 70 61 72 73 65 20 74 68 65 20 61 72 67 75  o parse the argu
0b30: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
0b40: 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55  the CREATE VIRTU
0b50: 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  AL TABLE stateme
0b60: 6e 74 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  nt..*/..typedef 
0b70: 73 74 72 75 63 74 20 46 74 73 35 43 6f 6e 66 69  struct Fts5Confi
0b80: 67 20 46 74 73 35 43 6f 6e 66 69 67 3b 0a 0a 2f  g Fts5Config;../
0b90: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
0ba0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0bb0: 67 20 73 74 72 75 63 74 75 72 65 20 65 6e 63 6f  g structure enco
0bc0: 64 65 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  des all informat
0bd0: 69 6f 6e 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20  ion that can.** 
0be0: 62 65 20 67 6c 65 61 6e 65 64 20 66 72 6f 6d 20  be gleaned from 
0bf0: 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55  the CREATE VIRTU
0c00: 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  AL TABLE stateme
0c10: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 64 20 61 6c  nt..**.** And al
0c20: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 6f  l information lo
0c30: 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  aded from the %_
0c40: 63 6f 6e 66 69 67 20 74 61 62 6c 65 2e 0a 2a 2a  config table..**
0c50: 0a 2a 2a 20 6e 41 75 74 6f 6d 65 72 67 65 3a 0a  .** nAutomerge:.
0c60: 2a 2a 20 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d  **   The minimum
0c70: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0c80: 6e 74 73 20 74 68 61 74 20 61 6e 20 61 75 74 6f  nts that an auto
0c90: 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e  -merge operation
0ca0: 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 61 74 74   should.**   att
0cb0: 65 6d 70 74 20 74 6f 20 6d 65 72 67 65 20 74 6f  empt to merge to
0cc0: 67 65 74 68 65 72 2e 20 41 20 76 61 6c 75 65 20  gether. A value 
0cd0: 6f 66 20 31 20 73 65 74 73 20 74 68 65 20 6f 62  of 1 sets the ob
0ce0: 6a 65 63 74 20 74 6f 20 75 73 65 20 74 68 65 20  ject to use the 
0cf0: 0a 2a 2a 20 20 20 63 6f 6d 70 69 6c 65 20 74 69  .**   compile ti
0d00: 6d 65 20 64 65 66 61 75 6c 74 2e 20 5a 65 72 6f  me default. Zero
0d10: 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 2d 6d   disables auto-m
0d20: 65 72 67 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  erge altogether.
0d30: 0a 2a 2a 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 3a  .**.** zContent:
0d40: 0a 2a 2a 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 52  .**.** zContentR
0d50: 6f 77 69 64 3a 0a 2a 2a 20 20 20 54 68 65 20 76  owid:.**   The v
0d60: 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6e 74  alue of the cont
0d70: 65 6e 74 5f 72 6f 77 69 64 3d 20 6f 70 74 69 6f  ent_rowid= optio
0d80: 6e 2c 20 69 66 20 6f 6e 65 20 77 61 73 20 73 70  n, if one was sp
0d90: 65 63 69 66 69 65 64 2e 20 4f 72 20 0a 2a 2a 20  ecified. Or .** 
0da0: 20 20 74 68 65 20 73 74 72 69 6e 67 20 22 72 6f    the string "ro
0db0: 77 69 64 22 20 6f 74 68 65 72 77 69 73 65 2e 20  wid" otherwise. 
0dc0: 54 68 69 73 20 74 65 78 74 20 69 73 20 6e 6f 74  This text is not
0dd0: 20 71 75 6f 74 65 64 20 2d 20 69 66 20 69 74 20   quoted - if it 
0de0: 69 73 0a 2a 2a 20 20 20 75 73 65 64 20 61 73 20  is.**   used as 
0df0: 70 61 72 74 20 6f 66 20 61 6e 20 53 51 4c 20 73  part of an SQL s
0e00: 74 61 74 65 6d 65 6e 74 20 69 74 20 6e 65 65 64  tatement it need
0e10: 73 20 74 6f 20 62 65 20 71 75 6f 74 65 64 20 61  s to be quoted a
0e20: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2a  ppropriately..**
0e30: 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 45 78 70 72  .** zContentExpr
0e40: 6c 69 73 74 3a 0a 2a 2a 0a 2a 2a 20 70 7a 45 72  list:.**.** pzEr
0e50: 72 6d 73 67 3a 0a 2a 2a 20 20 20 54 68 69 73 20  rmsg:.**   This 
0e60: 65 78 69 73 74 73 20 69 6e 20 6f 72 64 65 72 20  exists in order 
0e70: 74 6f 20 61 6c 6c 6f 77 20 74 68 65 20 66 74 73  to allow the fts
0e80: 35 5f 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c 65  5_index.c module
0e90: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 0a 2a 2a   to return a .**
0ea0: 20 20 20 64 65 63 65 6e 74 20 65 72 72 6f 72 20     decent error 
0eb0: 6d 65 73 73 61 67 65 20 69 66 20 69 74 20 65 6e  message if it en
0ec0: 63 6f 75 6e 74 65 72 73 20 61 20 66 69 6c 65 2d  counters a file-
0ed0: 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 69  format version i
0ee0: 74 20 64 6f 65 73 0a 2a 2a 20 20 20 6e 6f 74 20  t does.**   not 
0ef0: 75 6e 64 65 72 73 74 61 6e 64 2e 0a 2a 2a 0a 2a  understand..**.*
0f00: 2a 20 62 43 6f 6c 75 6d 6e 73 69 7a 65 3a 0a 2a  * bColumnsize:.*
0f10: 2a 20 20 20 54 72 75 65 20 69 66 20 74 68 65 20  *   True if the 
0f20: 25 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20  %_docsize table 
0f30: 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
0f40: 2a 20 62 50 72 65 66 69 78 49 6e 64 65 78 3a 0a  * bPrefixIndex:.
0f50: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 6f 6e 6c  **   This is onl
0f60: 79 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  y used for debug
0f70: 67 69 6e 67 2e 20 49 66 20 73 65 74 20 74 6f 20  ging. If set to 
0f80: 66 61 6c 73 65 2c 20 61 6e 79 20 70 72 65 66 69  false, any prefi
0f90: 78 20 69 6e 64 65 78 65 73 0a 2a 2a 20 20 20 61  x indexes.**   a
0fa0: 72 65 20 69 67 6e 6f 72 65 64 2e 20 54 68 69 73  re ignored. This
0fb0: 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 66 69 67   value is config
0fc0: 75 72 65 64 20 75 73 69 6e 67 3a 0a 2a 2a 0a 2a  ured using:.**.*
0fd0: 2a 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  *       INSERT I
0fe0: 4e 54 4f 20 74 62 6c 28 74 62 6c 2c 20 72 61 6e  NTO tbl(tbl, ran
0ff0: 6b 29 20 56 41 4c 55 45 53 28 27 70 72 65 66 69  k) VALUES('prefi
1000: 78 2d 69 6e 64 65 78 27 2c 20 24 62 50 72 65 66  x-index', $bPref
1010: 69 78 49 6e 64 65 78 29 3b 0a 2a 2a 0a 2a 2f 0a  ixIndex);.**.*/.
1020: 73 74 72 75 63 74 20 46 74 73 35 43 6f 6e 66 69  struct Fts5Confi
1030: 67 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  g {.  sqlite3 *d
1040: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1050: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1060: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68  e handle */.  ch
1070: 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1090: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
10a0: 67 20 46 54 53 20 69 6e 64 65 78 20 28 65 2e 67  g FTS index (e.g
10b0: 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 63  . "main") */.  c
10c0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e0: 2a 20 4e 61 6d 65 20 6f 66 20 46 54 53 20 69 6e  * Name of FTS in
10f0: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  dex */.  int nCo
1100: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1120: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  er of columns */
1130: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b  .  char **azCol;
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
1160: 65 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 55 6e  es */.  u8 *abUn
1170: 69 6e 64 65 78 65 64 3b 20 20 20 20 20 20 20 20  indexed;        
1180: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1190: 66 6f 72 20 75 6e 69 6e 64 65 78 65 64 20 63 6f  for unindexed co
11a0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
11b0: 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
11c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11d0: 6d 62 65 72 20 6f 66 20 70 72 65 66 69 78 20 69  mber of prefix i
11e0: 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndexes */.  int 
11f0: 2a 61 50 72 65 66 69 78 3b 20 20 20 20 20 20 20  *aPrefix;       
1200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1210: 69 7a 65 73 20 69 6e 20 62 79 74 65 73 20 6f 66  izes in bytes of
1220: 20 6e 50 72 65 66 69 78 20 70 72 65 66 69 78 20   nPrefix prefix 
1230: 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74  indexes */.  int
1240: 20 65 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20   eContent;      
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1260: 41 6e 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54 20  An FTS5_CONTENT 
1270: 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72 20  value */.  char 
1280: 2a 7a 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20  *zContent;      
1290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f             /* co
12a0: 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 20 0a  ntent table */ .
12b0: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74    char *zContent
12c0: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
12d0: 20 20 2f 2a 20 22 63 6f 6e 74 65 6e 74 5f 72 6f    /* "content_ro
12e0: 77 69 64 3d 22 20 6f 70 74 69 6f 6e 20 76 61 6c  wid=" option val
12f0: 75 65 20 2a 2f 20 0a 20 20 69 6e 74 20 62 43 6f  ue */ .  int bCo
1300: 6c 75 6d 6e 73 69 7a 65 3b 20 20 20 20 20 20 20  lumnsize;       
1310: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 63 6f 6c           /* "col
1320: 75 6d 6e 73 69 7a 65 3d 22 20 6f 70 74 69 6f 6e  umnsize=" option
1330: 20 76 61 6c 75 65 20 28 64 66 6c 74 3d 3d 31 29   value (dflt==1)
1340: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74 61 69   */.  int eDetai
1350: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1360: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 44 45        /* FTS5_DE
1370: 54 41 49 4c 5f 58 58 58 20 76 61 6c 75 65 20 2a  TAIL_XXX value *
1380: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
1390: 6e 74 45 78 70 72 6c 69 73 74 3b 0a 20 20 46 74  ntExprlist;.  Ft
13a0: 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  s5Tokenizer *pTo
13b0: 6b 3b 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69  k;.  fts5_tokeni
13c0: 7a 65 72 20 2a 70 54 6f 6b 41 70 69 3b 0a 0a 20  zer *pTokApi;.. 
13d0: 20 2f 2a 20 56 61 6c 75 65 73 20 6c 6f 61 64 65   /* Values loade
13e0: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e  d from the %_con
13f0: 66 69 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  fig table */.  i
1400: 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20  nt iCookie;     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1420: 2a 20 49 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  * Incremented wh
1430: 65 6e 20 25 5f 63 6f 6e 66 69 67 20 69 73 20 6d  en %_config is m
1440: 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74  odified */.  int
1450: 20 70 67 73 7a 3b 20 20 20 20 20 20 20 20 20 20   pgsz;          
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1470: 41 70 70 72 6f 78 69 6d 61 74 65 20 70 61 67 65  Approximate page
1480: 20 73 69 7a 65 20 75 73 65 64 20 69 6e 20 25 5f   size used in %_
1490: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  data */.  int nA
14a0: 75 74 6f 6d 65 72 67 65 3b 20 20 20 20 20 20 20  utomerge;       
14b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 27 61 75            /* 'au
14c0: 74 6f 6d 65 72 67 65 27 20 73 65 74 74 69 6e 67  tomerge' setting
14d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 72 69 73 69   */.  int nCrisi
14e0: 73 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20  sMerge;         
14f0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
1500: 20 61 6c 6c 6f 77 65 64 20 73 65 67 6d 65 6e 74   allowed segment
1510: 73 20 70 65 72 20 6c 65 76 65 6c 20 2a 2f 0a 20  s per level */. 
1520: 20 69 6e 74 20 6e 48 61 73 68 53 69 7a 65 3b 20   int nHashSize; 
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d   /* Bytes of mem
1550: 6f 72 79 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ory for in-memor
1560: 79 20 68 61 73 68 20 2a 2f 0a 20 20 63 68 61 72  y hash */.  char
1570: 20 2a 7a 52 61 6e 6b 3b 20 20 20 20 20 20 20 20   *zRank;        
1580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1590: 61 6d 65 20 6f 66 20 72 61 6e 6b 20 66 75 6e 63  ame of rank func
15a0: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
15b0: 7a 52 61 6e 6b 41 72 67 73 3b 20 20 20 20 20 20  zRankArgs;      
15c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
15d0: 75 6d 65 6e 74 73 20 74 6f 20 72 61 6e 6b 20 66  uments to rank f
15e0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
15f0: 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 70 6f   If non-NULL, po
1600: 69 6e 74 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  ints to sqlite3_
1610: 76 74 61 62 2e 62 61 73 65 2e 7a 45 72 72 6d 73  vtab.base.zErrms
1620: 67 2e 20 4f 66 74 65 6e 20 4e 55 4c 4c 2e 20 2a  g. Often NULL. *
1630: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
1640: 6d 73 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  msg;..#ifdef SQL
1650: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20  ITE_DEBUG.  int 
1660: 62 50 72 65 66 69 78 49 6e 64 65 78 3b 20 20 20  bPrefixIndex;   
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1680: 72 75 65 20 74 6f 20 75 73 65 20 70 72 65 66 69  rue to use prefi
1690: 78 2d 69 6e 64 65 78 65 73 20 2a 2f 0a 23 65 6e  x-indexes */.#en
16a0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 43 75 72 72 65  dif.};../* Curre
16b0: 6e 74 20 65 78 70 65 63 74 65 64 20 76 61 6c 75  nt expected valu
16c0: 65 20 6f 66 20 25 5f 63 6f 6e 66 69 67 20 74 61  e of %_config ta
16d0: 62 6c 65 20 27 76 65 72 73 69 6f 6e 27 20 66 69  ble 'version' fi
16e0: 65 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  eld */.#define F
16f0: 54 53 35 5f 43 55 52 52 45 4e 54 5f 56 45 52 53  TS5_CURRENT_VERS
1700: 49 4f 4e 20 34 0a 0a 23 64 65 66 69 6e 65 20 46  ION 4..#define F
1710: 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d  TS5_CONTENT_NORM
1720: 41 4c 20 20 20 30 0a 23 64 65 66 69 6e 65 20 46  AL   0.#define F
1730: 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45  TS5_CONTENT_NONE
1740: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 46       1.#define F
1750: 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 45 58 54 45  TS5_CONTENT_EXTE
1760: 52 4e 41 4c 20 32 0a 0a 23 64 65 66 69 6e 65 20  RNAL 2..#define 
1770: 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c  FTS5_DETAIL_FULL
1780: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 46 54      0.#define FT
1790: 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 20  S5_DETAIL_NONE  
17a0: 20 20 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35    1.#define FTS5
17b0: 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20  _DETAIL_COLUMNS 
17c0: 32 0a 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  2....int sqlite3
17d0: 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28  Fts5ConfigParse(
17e0: 0a 20 20 20 20 46 74 73 35 47 6c 6f 62 61 6c 2a  .    Fts5Global*
17f0: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74 2c  , sqlite3*, int,
1800: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 2c 20   const char **, 
1810: 46 74 73 35 43 6f 6e 66 69 67 2a 2a 2c 20 63 68  Fts5Config**, ch
1820: 61 72 2a 2a 0a 29 3b 0a 76 6f 69 64 20 73 71 6c  ar**.);.void sql
1830: 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 46 72  ite3Fts5ConfigFr
1840: 65 65 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b  ee(Fts5Config*);
1850: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
1860: 35 43 6f 6e 66 69 67 44 65 63 6c 61 72 65 56 74  5ConfigDeclareVt
1870: 61 62 28 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  ab(Fts5Config *p
1880: 43 6f 6e 66 69 67 29 3b 0a 0a 69 6e 74 20 73 71  Config);..int sq
1890: 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a  lite3Fts5Tokeniz
18a0: 65 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  e(.  Fts5Config 
18b0: 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20  *pConfig,       
18c0: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e       /* FTS5 Con
18d0: 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63  figuration objec
18e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  t */.  int flags
18f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1900: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 54         /* FTS5_T
1910: 4f 4b 45 4e 49 5a 45 5f 2a 20 66 6c 61 67 73 20  OKENIZE_* flags 
1920: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1930: 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78  *pText, int nTex
1940: 74 2c 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20  t,   /* Text to 
1950: 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 20 20 76 6f  tokenize */.  vo
1960: 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1980: 20 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64 20   Context passed 
1990: 74 6f 20 78 54 6f 6b 65 6e 28 29 20 2a 2f 0a 20  to xToken() */. 
19a0: 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76   int (*xToken)(v
19b0: 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74  oid*, int, const
19c0: 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74   char*, int, int
19d0: 2c 20 69 6e 74 29 20 20 20 20 2f 2a 20 43 61 6c  , int)    /* Cal
19e0: 6c 62 61 63 6b 20 2a 2f 0a 29 3b 0a 0a 76 6f 69  lback */.);..voi
19f0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71  d sqlite3Fts5Deq
1a00: 75 6f 74 65 28 63 68 61 72 20 2a 7a 29 3b 0a 0a  uote(char *z);..
1a10: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74  /* Load the cont
1a20: 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f  ents of the %_co
1a30: 6e 66 69 67 20 74 61 62 6c 65 20 2a 2f 0a 69 6e  nfig table */.in
1a40: 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  t sqlite3Fts5Con
1a50: 66 69 67 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66  figLoad(Fts5Conf
1a60: 69 67 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 53  ig*, int);../* S
1a70: 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1a80: 61 20 73 69 6e 67 6c 65 20 63 6f 6e 66 69 67 20  a single config 
1a90: 61 74 74 72 69 62 75 74 65 20 2a 2f 0a 69 6e 74  attribute */.int
1aa0: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
1ab0: 69 67 53 65 74 56 61 6c 75 65 28 46 74 73 35 43  igSetValue(Fts5C
1ac0: 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68  onfig*, const ch
1ad0: 61 72 2a 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ar*, sqlite3_val
1ae0: 75 65 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 69 6e 74  ue*, int*);..int
1af0: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
1b00: 69 67 50 61 72 73 65 52 61 6e 6b 28 63 6f 6e 73  igParseRank(cons
1b10: 74 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 2a 2c  t char*, char**,
1b20: 20 63 68 61 72 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a   char**);../*.**
1b30: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
1b40: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
1b50: 35 5f 63 6f 6e 66 69 67 2e 63 2e 0a 2a 2a 2a 2a  5_config.c..****
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf0: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
1c00: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
1c10: 35 5f 62 75 66 66 65 72 2e 63 2e 0a 2a 2f 0a 0a  5_buffer.c..*/..
1c20: 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 6f 62 6a  /*.** Buffer obj
1c30: 65 63 74 20 66 6f 72 20 74 68 65 20 69 6e 63 72  ect for the incr
1c40: 65 6d 65 6e 74 61 6c 20 62 75 69 6c 64 69 6e 67  emental building
1c50: 20 6f 66 20 73 74 72 69 6e 67 20 64 61 74 61 2e   of string data.
1c60: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1c70: 63 74 20 46 74 73 35 42 75 66 66 65 72 20 46 74  ct Fts5Buffer Ft
1c80: 73 35 42 75 66 66 65 72 3b 0a 73 74 72 75 63 74  s5Buffer;.struct
1c90: 20 46 74 73 35 42 75 66 66 65 72 20 7b 0a 20 20   Fts5Buffer {.  
1ca0: 75 38 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  u8 *p;.  int n;.
1cb0: 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 7d 3b    int nSpace;.};
1cc0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
1cd0: 35 42 75 66 66 65 72 53 69 7a 65 28 69 6e 74 2a  5BufferSize(int*
1ce0: 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 75  , Fts5Buffer*, u
1cf0: 33 32 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  32);.void sqlite
1d00: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d10: 64 56 61 72 69 6e 74 28 69 6e 74 2a 2c 20 46 74  dVarint(int*, Ft
1d20: 73 35 42 75 66 66 65 72 2a 2c 20 69 36 34 29 3b  s5Buffer*, i64);
1d30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
1d40: 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1d50: 62 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66  b(int*, Fts5Buff
1d60: 65 72 2a 2c 20 75 33 32 2c 20 63 6f 6e 73 74 20  er*, u32, const 
1d70: 75 38 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  u8*);.void sqlit
1d80: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1d90: 6e 64 53 74 72 69 6e 67 28 69 6e 74 20 2a 2c 20  ndString(int *, 
1da0: 46 74 73 35 42 75 66 66 65 72 2a 2c 20 63 6f 6e  Fts5Buffer*, con
1db0: 73 74 20 63 68 61 72 2a 29 3b 0a 76 6f 69 64 20  st char*);.void 
1dc0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1dd0: 72 46 72 65 65 28 46 74 73 35 42 75 66 66 65 72  rFree(Fts5Buffer
1de0: 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  *);.void sqlite3
1df0: 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 46  Fts5BufferZero(F
1e00: 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 76 6f 69  ts5Buffer*);.voi
1e10: 64 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  d sqlite3Fts5Buf
1e20: 66 65 72 53 65 74 28 69 6e 74 2a 2c 20 46 74 73  ferSet(int*, Fts
1e30: 35 42 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63  5Buffer*, int, c
1e40: 6f 6e 73 74 20 75 38 2a 29 3b 0a 76 6f 69 64 20  onst u8*);.void 
1e50: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1e60: 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 69 6e  rAppendPrintf(in
1e70: 74 20 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  t *, Fts5Buffer*
1e80: 2c 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  , char *zFmt, ..
1e90: 2e 29 3b 0a 0a 63 68 61 72 20 2a 73 71 6c 69 74  .);..char *sqlit
1ea0: 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 69 6e  e3Fts5Mprintf(in
1eb0: 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68  t *pRc, const ch
1ec0: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0a  ar *zFmt, ...);.
1ed0: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66  .#define fts5Buf
1ee0: 66 65 72 5a 65 72 6f 28 78 29 20 20 20 20 20 20  ferZero(x)      
1ef0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1f00: 73 35 42 75 66 66 65 72 5a 65 72 6f 28 78 29 0a  s5BufferZero(x).
1f10: 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66  #define fts5Buff
1f20: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 61  erAppendVarint(a
1f30: 2c 62 2c 63 29 20 73 71 6c 69 74 65 33 46 74 73  ,b,c) sqlite3Fts
1f40: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1f50: 69 6e 74 28 61 2c 62 2c 63 29 0a 23 64 65 66 69  int(a,b,c).#defi
1f60: 6e 65 20 66 74 73 35 42 75 66 66 65 72 46 72 65  ne fts5BufferFre
1f70: 65 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  e(a)            
1f80: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1f90: 65 72 46 72 65 65 28 61 29 0a 23 64 65 66 69 6e  erFree(a).#defin
1fa0: 65 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65  e fts5BufferAppe
1fb0: 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20  ndBlob(a,b,c,d) 
1fc0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1fd0: 72 41 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c  rAppendBlob(a,b,
1fe0: 63 2c 64 29 0a 23 64 65 66 69 6e 65 20 66 74 73  c,d).#define fts
1ff0: 35 42 75 66 66 65 72 53 65 74 28 61 2c 62 2c 63  5BufferSet(a,b,c
2000: 2c 64 29 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,d)        sqlit
2010: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
2020: 61 2c 62 2c 63 2c 64 29 0a 0a 23 64 65 66 69 6e  a,b,c,d)..#defin
2030: 65 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77  e fts5BufferGrow
2040: 28 70 52 63 2c 70 42 75 66 2c 6e 6e 29 20 28 20  (pRc,pBuf,nn) ( 
2050: 5c 0a 20 20 28 75 33 32 29 28 28 70 42 75 66 29  \.  (u32)((pBuf)
2060: 2d 3e 6e 29 20 2b 20 28 75 33 32 29 28 6e 6e 29  ->n) + (u32)(nn)
2070: 20 3c 3d 20 28 75 33 32 29 28 28 70 42 75 66 29   <= (u32)((pBuf)
2080: 2d 3e 6e 53 70 61 63 65 29 20 3f 20 30 20 3a 20  ->nSpace) ? 0 : 
2090: 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  \.    sqlite3Fts
20a0: 35 42 75 66 66 65 72 53 69 7a 65 28 28 70 52 63  5BufferSize((pRc
20b0: 29 2c 28 70 42 75 66 29 2c 28 6e 6e 29 2b 28 70  ),(pBuf),(nn)+(p
20c0: 42 75 66 29 2d 3e 6e 29 20 5c 0a 29 0a 0a 2f 2a  Buf)->n) \.)../*
20d0: 20 57 72 69 74 65 20 61 6e 64 20 64 65 63 6f 64   Write and decod
20e0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d  e big-endian 32-
20f0: 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
2100: 65 73 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  es */.void sqlit
2110: 65 33 46 74 73 35 50 75 74 33 32 28 75 38 2a 2c  e3Fts5Put32(u8*,
2120: 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74   int);.int sqlit
2130: 65 33 46 74 73 35 47 65 74 33 32 28 63 6f 6e 73  e3Fts5Get32(cons
2140: 74 20 75 38 2a 29 3b 0a 0a 23 64 65 66 69 6e 65  t u8*);..#define
2150: 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
2160: 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69 50 6f  (iPos) (int)(iPo
2170: 73 20 3e 3e 20 33 32 29 0a 23 64 65 66 69 6e 65  s >> 32).#define
2180: 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
2190: 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69 50 6f  (iPos) (int)(iPo
21a0: 73 20 26 20 30 78 46 46 46 46 46 46 46 46 29 0a  s & 0xFFFFFFFF).
21b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
21c0: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
21d0: 72 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  r Fts5PoslistRea
21e0: 64 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35  der;.struct Fts5
21f0: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 7b 0a  PoslistReader {.
2200: 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 75    /* Variables u
2210: 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 71 6c 69  sed only by sqli
2220: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 49 74  te3Fts5PoslistIt
2230: 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  erXXX() function
2240: 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  s. */.  const u8
2250: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
2260: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
2270: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 69 74 65 72  ion list to iter
2280: 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  ate through */. 
2290: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
22c0: 65 72 20 61 74 20 61 5b 5d 20 69 6e 20 62 79 74  er at a[] in byt
22d0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  es */.  int i;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2300: 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 61 5b 5d  nt offset in a[]
2310: 20 2a 2f 0a 0a 20 20 75 38 20 62 46 6c 61 67 3b   */..  u8 bFlag;
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6c         /* For cl
2340: 69 65 6e 74 20 75 73 65 20 28 61 6e 79 20 63 75  ient use (any cu
2350: 73 74 6f 6d 20 70 75 72 70 6f 73 65 29 20 2a 2f  stom purpose) */
2360: 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
2370: 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 75 38 20  riables */.  u8 
2380: 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20  bEof;           
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a0: 53 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 45  Set to true at E
23b0: 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 50 6f 73  OF */.  i64 iPos
23c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23d0: 20 20 20 20 20 20 20 20 2f 2a 20 28 69 43 6f 6c          /* (iCol
23e0: 3c 3c 33 32 29 20 2b 20 69 50 6f 73 20 2a 2f 0a  <<32) + iPos */.
23f0: 7d 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  };.int sqlite3Ft
2400: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49  s5PoslistReaderI
2410: 6e 69 74 28 0a 20 20 63 6f 6e 73 74 20 75 38 20  nit(.  const u8 
2420: 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  *a, int n,      
2430: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73         /* Poslis
2440: 74 20 62 75 66 66 65 72 20 74 6f 20 69 74 65 72  t buffer to iter
2450: 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  ate through */. 
2460: 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
2470: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
2480: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a   /* Iterator obj
2490: 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ect to initializ
24a0: 65 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c 69  e */.);.int sqli
24b0: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
24c0: 61 64 65 72 4e 65 78 74 28 46 74 73 35 50 6f 73  aderNext(Fts5Pos
24d0: 6c 69 73 74 52 65 61 64 65 72 2a 29 3b 0a 0a 74  listReader*);..t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20  s5PoslistWriter 
2500: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
2510: 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f  r;.struct Fts5Po
2520: 73 6c 69 73 74 57 72 69 74 65 72 20 7b 0a 20 20  slistWriter {.  
2530: 69 36 34 20 69 50 72 65 76 3b 0a 7d 3b 0a 69 6e  i64 iPrev;.};.in
2540: 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  t sqlite3Fts5Pos
2550: 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
2560: 28 46 74 73 35 42 75 66 66 65 72 2a 2c 20 46 74  (Fts5Buffer*, Ft
2570: 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 2a  s5PoslistWriter*
2580: 2c 20 69 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c  , i64);.void sql
2590: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
25a0: 61 66 65 41 70 70 65 6e 64 28 46 74 73 35 42 75  afeAppend(Fts5Bu
25b0: 66 66 65 72 2a 2c 20 69 36 34 2a 2c 20 69 36 34  ffer*, i64*, i64
25c0: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
25d0: 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
25e0: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c  (.  const u8 *a,
25f0: 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2600: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
2610: 6e 74 61 69 6e 69 6e 67 20 70 6f 73 6c 69 73 74  ntaining poslist
2620: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 2c 20 20   */.  int *pi,  
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2650: 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 61   Offset within a
2660: 5b 5d 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4f  [] */.  i64 *piO
2670: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
2680: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2690: 54 3a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  T: Current offse
26a0: 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 20 4d 61 6c 6c  t */.);../* Mall
26b0: 6f 63 20 75 74 69 6c 69 74 79 20 2a 2f 0a 76 6f  oc utility */.vo
26c0: 69 64 20 2a 73 71 6c 69 74 65 33 46 74 73 35 4d  id *sqlite3Fts5M
26d0: 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74 20 2a 70  allocZero(int *p
26e0: 52 63 2c 20 69 6e 74 20 6e 42 79 74 65 29 3b 0a  Rc, int nByte);.
26f0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73  char *sqlite3Fts
2700: 35 53 74 72 6e 64 75 70 28 69 6e 74 20 2a 70 52  5Strndup(int *pR
2710: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  c, const char *p
2720: 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 3b 0a 0a 2f  In, int nIn);../
2730: 2a 20 43 68 61 72 61 63 74 65 72 20 73 65 74 20  * Character set 
2740: 74 65 73 74 73 20 28 6c 69 6b 65 20 69 73 73 70  tests (like issp
2750: 61 63 65 28 29 2c 20 69 73 61 6c 70 68 61 28 29  ace(), isalpha()
2760: 20 65 74 63 2e 29 20 2a 2f 0a 69 6e 74 20 73 71   etc.) */.int sq
2770: 6c 69 74 65 33 46 74 73 35 49 73 42 61 72 65 77  lite3Fts5IsBarew
2780: 6f 72 64 28 63 68 61 72 20 74 29 3b 0a 0a 0a 2f  ord(char t);.../
2790: 2a 20 42 75 63 6b 65 74 20 6f 66 20 74 65 72 6d  * Bucket of term
27a0: 73 20 6f 62 6a 65 63 74 20 75 73 65 64 20 62 79  s object used by
27b0: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
27c0: 68 65 63 6b 20 69 6e 20 6f 66 66 73 65 74 73 3d  heck in offsets=
27d0: 30 20 6d 6f 64 65 2e 20 2a 2f 0a 74 79 70 65 64  0 mode. */.typed
27e0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 54 65  ef struct Fts5Te
27f0: 72 6d 73 65 74 20 46 74 73 35 54 65 72 6d 73 65  rmset Fts5Termse
2800: 74 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  t;.int sqlite3Ft
2810: 73 35 54 65 72 6d 73 65 74 4e 65 77 28 46 74 73  s5TermsetNew(Fts
2820: 35 54 65 72 6d 73 65 74 2a 2a 29 3b 0a 69 6e 74  5Termset**);.int
2830: 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d   sqlite3Fts5Term
2840: 73 65 74 41 64 64 28 46 74 73 35 54 65 72 6d 73  setAdd(Fts5Terms
2850: 65 74 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20  et*, int, const 
2860: 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 20  char*, int, int 
2870: 2a 70 62 50 72 65 73 65 6e 74 29 3b 0a 76 6f 69  *pbPresent);.voi
2880: 64 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72  d sqlite3Fts5Ter
2890: 6d 73 65 74 46 72 65 65 28 46 74 73 35 54 65 72  msetFree(Fts5Ter
28a0: 6d 73 65 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45  mset*);../*.** E
28b0: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
28c0: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
28d0: 62 75 66 66 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  buffer.c..******
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2920: 2a 2a 2a 2a 2f 0a 0a 2f 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 2a  ****************
2960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2970: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
2980: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
2990: 69 6e 64 65 78 2e 63 2e 20 66 74 73 35 5f 69 6e  index.c. fts5_in
29a0: 64 65 78 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63  dex.c contains c
29b0: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20  ontains code.** 
29c0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
29d0: 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
29e0: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
29f0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
2a00: 74 20 46 74 73 35 49 6e 64 65 78 20 46 74 73 35  t Fts5Index Fts5
2a10: 49 6e 64 65 78 3b 0a 74 79 70 65 64 65 66 20 73  Index;.typedef s
2a20: 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 49  truct Fts5IndexI
2a30: 74 65 72 20 46 74 73 35 49 6e 64 65 78 49 74 65  ter Fts5IndexIte
2a40: 72 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 49  r;..struct Fts5I
2a50: 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 69 36 34  ndexIter {.  i64
2a60: 20 69 52 6f 77 69 64 3b 0a 20 20 63 6f 6e 73 74   iRowid;.  const
2a70: 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 69 6e   u8 *pData;.  in
2a80: 74 20 6e 44 61 74 61 3b 0a 20 20 75 38 20 62 45  t nData;.  u8 bE
2a90: 6f 66 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20  of;.};..#define 
2aa0: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
2ab0: 6f 66 28 78 29 20 28 28 78 29 2d 3e 62 45 6f 66  of(x) ((x)->bEof
2ac0: 29 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20  )../*.** Values 
2ad0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
2ae0: 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
2af0: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 49 6e 64  nt passed to Ind
2b00: 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 23 64  exQuery()..*/.#d
2b10: 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f  efine FTS5INDEX_
2b20: 51 55 45 52 59 5f 50 52 45 46 49 58 20 20 20 20  QUERY_PREFIX    
2b30: 20 30 78 30 30 30 31 20 20 20 2f 2a 20 50 72 65   0x0001   /* Pre
2b40: 66 69 78 20 71 75 65 72 79 20 2a 2f 0a 23 64 65  fix query */.#de
2b50: 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51  fine FTS5INDEX_Q
2b60: 55 45 52 59 5f 44 45 53 43 20 20 20 20 20 20 20  UERY_DESC       
2b70: 30 78 30 30 30 32 20 20 20 2f 2a 20 44 6f 63 73  0x0002   /* Docs
2b80: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72   in descending r
2b90: 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 23 64  owid order */.#d
2ba0: 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f  efine FTS5INDEX_
2bb0: 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
2bc0: 20 30 78 30 30 30 34 20 20 20 2f 2a 20 44 6f 20   0x0004   /* Do 
2bd0: 6e 6f 74 20 75 73 65 20 70 72 65 66 69 78 20 69  not use prefix i
2be0: 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ndex */.#define 
2bf0: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2c00: 53 43 41 4e 20 20 20 20 20 20 20 30 78 30 30 30  SCAN       0x000
2c10: 38 20 20 20 2f 2a 20 53 63 61 6e 20 71 75 65 72  8   /* Scan quer
2c20: 79 20 28 66 74 73 35 76 6f 63 61 62 29 20 2a 2f  y (fts5vocab) */
2c30: 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ../* The followi
2c40: 6e 67 20 61 72 65 20 75 73 65 64 20 69 6e 74 65  ng are used inte
2c50: 72 6e 61 6c 6c 79 20 62 79 20 74 68 65 20 66 74  rnally by the ft
2c60: 73 35 5f 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c  s5_index.c modul
2c70: 65 2e 20 54 68 65 79 20 61 72 65 0a 2a 2a 20 64  e. They are.** d
2c80: 65 66 69 6e 65 64 20 68 65 72 65 20 6f 6e 6c 79  efined here only
2c90: 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73 69   to make it easi
2ca0: 65 72 20 74 6f 20 61 76 6f 69 64 20 63 6c 61 73  er to avoid clas
2cb0: 68 65 73 20 77 69 74 68 20 74 68 65 20 66 6c 61  hes with the fla
2cc0: 67 73 0a 2a 2a 20 61 62 6f 76 65 2e 20 2a 2f 0a  gs.** above. */.
2cd0: 23 64 65 66 69 6e 65 20 46 54 53 35 49 4e 44 45  #define FTS5INDE
2ce0: 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54  X_QUERY_SKIPEMPT
2cf0: 59 20 20 30 78 30 30 31 30 0a 23 64 65 66 69 6e  Y  0x0010.#defin
2d00: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
2d10: 59 5f 4e 4f 4f 55 54 50 55 54 20 20 20 30 78 30  Y_NOOUTPUT   0x0
2d20: 30 32 30 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  020../*.** Creat
2d30: 65 2f 64 65 73 74 72 6f 79 20 61 6e 20 46 74 73  e/destroy an Fts
2d40: 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a  5Index object..*
2d50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2d60: 35 49 6e 64 65 78 4f 70 65 6e 28 46 74 73 35 43  5IndexOpen(Fts5C
2d70: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
2d80: 69 6e 74 20 62 43 72 65 61 74 65 2c 20 46 74 73  int bCreate, Fts
2d90: 35 49 6e 64 65 78 2a 2a 2c 20 63 68 61 72 2a 2a  5Index**, char**
2da0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
2db0: 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73  s5IndexClose(Fts
2dc0: 35 49 6e 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a  5Index *p);../*.
2dd0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70  ** Return a simp
2de0: 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  le checksum valu
2df0: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61  e based on the a
2e00: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34  rguments..*/.u64
2e10: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2e20: 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69  xEntryCksum(.  i
2e30: 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e  64 iRowid, .  in
2e40: 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69  t iCol, .  int i
2e50: 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64 78  Pos, .  int iIdx
2e60: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2e70: 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65  pTerm,.  int nTe
2e80: 72 6d 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  rm.);../*.** Arg
2e90: 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74  ument p points t
2ea0: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
2eb0: 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74  ining utf-8 text
2ec0: 20 74 68 61 74 20 69 73 20 6e 20 62 79 74 65 73   that is n bytes
2ed0: 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65   in .** size. Re
2ee0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2ef0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
2f00: 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 20  nChar character 
2f10: 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a  prefix of the.**
2f20: 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66   buffer, or 0 if
2f30: 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20   there are less 
2f40: 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61  than nChar chara
2f50: 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a  cters in total..
2f60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2f70: 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
2f80: 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74  Bytelen(.  const
2f90: 20 63 68 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74   char *p, .  int
2fa0: 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e   nByte, .  int n
2fb0: 43 68 61 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  Char.);../*.** O
2fc0: 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74  pen a new iterat
2fd0: 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
2fe0: 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 73 20  ough all rowids 
2ff0: 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a  that match the .
3000: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b  ** specified tok
3010: 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
3020: 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ix..*/.int sqlit
3030: 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
3040: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
3050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3060: 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78      /* FTS index
3070: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63   to query */.  c
3080: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
3090: 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f  n, int nToken, /
30a0: 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66  * Token (or pref
30b0: 69 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ix) to query for
30c0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
30f0: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
3100: 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  _X flags */.  Ft
3110: 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
3120: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
3130: 20 4d 61 74 63 68 20 74 68 65 73 65 20 63 6f 6c   Match these col
3140: 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46  umns only */.  F
3150: 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70  ts5IndexIter **p
3160: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  pIter          /
3170: 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61  * OUT: New itera
3180: 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 3b  tor object */.);
3190: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69  ../*.** The vari
31a0: 6f 75 73 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ous operations o
31b0: 6e 20 6f 70 65 6e 20 74 6f 6b 65 6e 20 6f 72 20  n open token or 
31c0: 74 6f 6b 65 6e 20 70 72 65 66 69 78 20 69 74 65  token prefix ite
31d0: 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  rators opened.**
31e0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 46 74   using sqlite3Ft
31f0: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  s5IndexQuery()..
3200: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
3210: 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  s5IterNext(Fts5I
3220: 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20  ndexIter*);.int 
3230: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
3240: 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
3250: 78 49 74 65 72 2a 2c 20 69 36 34 20 69 4d 61 74  xIter*, i64 iMat
3260: 63 68 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ch);../*.** Clos
3270: 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70  e an iterator op
3280: 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 46  ened by sqlite3F
3290: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e  ts5IndexQuery().
32a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
32b0: 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74  Fts5IterClose(Ft
32c0: 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a  s5IndexIter*);..
32d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  /*.** This inter
32e0: 66 61 63 65 20 69 73 20 75 73 65 64 20 62 79 20  face is used by 
32f0: 74 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f  the fts5vocab mo
3300: 64 75 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  dule..*/.const c
3310: 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35  har *sqlite3Fts5
3320: 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64  IterTerm(Fts5Ind
3330: 65 78 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a  exIter*, int*);.
3340: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
3350: 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35  terNextScan(Fts5
3360: 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 0a 2f  IndexIter*);.../
3370: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
3380: 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72  emove data to or
3390: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
33a0: 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63   Each time a doc
33b0: 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64  ument is .** add
33c0: 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64  ed to or removed
33d0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c   from the index,
33e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
33f0: 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20  s called one or 
3400: 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  more.** times..*
3410: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  *.** For an inse
3420: 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
3430: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
3440: 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
3450: 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a   new document..*
3460: 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
3470: 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  on is a delete, 
3480: 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
3490: 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63  d (at least) onc
34a0: 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e  e for each.** un
34b0: 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
34c0: 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
34d0: 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
34e0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
34f0: 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65  e iPos.** argume
3500: 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  nt is ignored fo
3510: 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69  r a delete..*/.i
3520: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
3530: 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35  dexWrite(.  Fts5
3540: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
3550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3560: 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f  ndex to write to
3570: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
35a0: 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
35b0: 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
35c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
35f0: 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
3600: 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
3610: 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
3620: 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
3630: 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
3640: 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
3650: 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a 0a  om index */.);..
3660: 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
3670: 68 61 74 20 73 75 62 73 65 71 75 65 6e 74 20 63  hat subsequent c
3680: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46  alls to sqlite3F
3690: 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20  ts5IndexWrite() 
36a0: 70 65 72 74 61 69 6e 20 74 6f 0a 2a 2a 20 64 6f  pertain to.** do
36b0: 63 75 6d 65 6e 74 20 69 44 6f 63 69 64 2e 0a 2a  cument iDocid..*
36c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
36d0: 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65  5IndexBeginWrite
36e0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
36f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3700: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
3710: 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  write to */.  in
3720: 74 20 62 44 65 6c 65 74 65 2c 20 20 20 20 20 20  t bDelete,      
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3740: 20 54 72 75 65 20 69 66 20 63 75 72 72 65 6e 74   True if current
3750: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
3760: 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 36 34 20  delete */.  i64 
3770: 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20  iDocid          
3780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3790: 6f 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20 72  ocid to add or r
37a0: 65 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d 20  emove data from 
37b0: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  */.);../*.** Flu
37c0: 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  sh any data stor
37d0: 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
37e0: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
37f0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
3800: 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
3810: 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
3820: 20 61 6c 73 6f 20 63 6c 6f 73 65 20 61 6e 79 20   also close any 
3830: 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c 65  open blob handle
3840: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
3850: 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46  3Fts5IndexSync(F
3860: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
3870: 20 62 43 6f 6d 6d 69 74 29 3b 0a 0a 2f 2a 0a 2a   bCommit);../*.*
3880: 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61  * Discard any da
3890: 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
38a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
38b0: 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77  tables. Do not w
38c0: 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68  rite it.** to th
38d0: 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
38e0: 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65  tionally, assume
38f0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
3900: 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61  ts of the %_data
3910: 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61  .** table may ha
3920: 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69  ve changed on di
3930: 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65  sk. So any in-me
3940: 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25  mory caches of %
3950: 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64  _data .** record
3960: 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69  s must be invali
3970: 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  dated..*/.int sq
3980: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f  lite3Fts5IndexRo
3990: 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78  llback(Fts5Index
39a0: 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 74   *p);../*.** Get
39b0: 20 6f 72 20 73 65 74 20 74 68 65 20 22 61 76 65   or set the "ave
39c0: 72 61 67 65 73 22 20 76 61 6c 75 65 73 2e 0a 2a  rages" values..*
39d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
39e0: 35 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65  5IndexGetAverage
39f0: 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
3a00: 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20  i64 *pnRow, i64 
3a10: 2a 61 6e 53 69 7a 65 29 3b 0a 69 6e 74 20 73 71  *anSize);.int sq
3a20: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
3a30: 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e  tAverages(Fts5In
3a40: 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38  dex *p, const u8
3a50: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
3a60: 46 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 65 64  Functions called
3a70: 20 62 79 20 74 68 65 20 73 74 6f 72 61 67 65 20   by the storage 
3a80: 6d 6f 64 75 6c 65 20 61 73 20 70 61 72 74 20 6f  module as part o
3a90: 66 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  f integrity-chec
3aa0: 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
3ab0: 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72  3Fts5IndexIntegr
3ac0: 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64  ityCheck(Fts5Ind
3ad0: 65 78 2a 2c 20 75 36 34 20 63 6b 73 75 6d 29 3b  ex*, u64 cksum);
3ae0: 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 65 64 20  ../* .** Called 
3af0: 64 75 72 69 6e 67 20 76 69 72 74 75 61 6c 20 6d  during virtual m
3b00: 6f 64 75 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  odule initializa
3b10: 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 72  tion to register
3b20: 20 55 44 46 20 0a 2a 2a 20 66 74 73 35 5f 64 65   UDF .** fts5_de
3b30: 63 6f 64 65 28 29 20 77 69 74 68 20 53 51 4c 69  code() with SQLi
3b40: 74 65 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  te .*/.int sqlit
3b50: 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28  e3Fts5IndexInit(
3b60: 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e 74 20  sqlite3*);..int 
3b70: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
3b80: 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e  SetCookie(Fts5In
3b90: 64 65 78 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  dex*, int);../*.
3ba0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
3bb0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  tal number of en
3bc0: 74 72 69 65 73 20 72 65 61 64 20 66 72 6f 6d 20  tries read from 
3bd0: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
3be0: 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 63 6f 6e   by .** this con
3bf0: 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 69 74  nection since it
3c00: 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f   was created..*/
3c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3c20: 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49  IndexReads(Fts5I
3c30: 6e 64 65 78 20 2a 70 29 3b 0a 0a 69 6e 74 20 73  ndex *p);..int s
3c40: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
3c50: 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20  einit(Fts5Index 
3c60: 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  *p);.int sqlite3
3c70: 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  Fts5IndexOptimiz
3c80: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b  e(Fts5Index *p);
3c90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3ca0: 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49  IndexMerge(Fts5I
3cb0: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65  ndex *p, int nMe
3cc0: 72 67 65 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  rge);..int sqlit
3cd0: 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43  e3Fts5IndexLoadC
3ce0: 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20  onfig(Fts5Index 
3cf0: 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  *p);../*.** End 
3d00: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
3d10: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 69 6e 64  code in fts5_ind
3d20: 65 78 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ex.c..**********
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 2a 2a 2a  ****************
3d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d70: 2f 0a 0a 2f 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 2a 2a 2a 2a 2a  ****************
3db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
3dc0: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63  * Interface to c
3dd0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 76 61 72 69  ode in fts5_vari
3de0: 6e 74 2e 63 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  nt.c. .*/.int sq
3df0: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
3e00: 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69 67  nt32(const unsig
3e10: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32  ned char *p, u32
3e20: 20 2a 76 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *v);.int sqlite
3e30: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65  3Fts5GetVarintLe
3e40: 6e 28 75 33 32 20 69 56 61 6c 29 3b 0a 75 38 20  n(u32 iVal);.u8 
3e50: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
3e60: 72 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69 67  rint(const unsig
3e70: 6e 65 64 20 63 68 61 72 2a 2c 20 75 36 34 2a 29  ned char*, u64*)
3e80: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
3e90: 35 50 75 74 56 61 72 69 6e 74 28 75 6e 73 69 67  5PutVarint(unsig
3ea0: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 36 34  ned char *p, u64
3eb0: 20 76 29 3b 0a 0a 23 64 65 66 69 6e 65 20 66 74   v);..#define ft
3ec0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  s5GetVarint32(a,
3ed0: 62 29 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  b) sqlite3Fts5Ge
3ee0: 74 56 61 72 69 6e 74 33 32 28 61 2c 28 75 33 32  tVarint32(a,(u32
3ef0: 2a 29 26 62 29 0a 23 64 65 66 69 6e 65 20 66 74  *)&b).#define ft
3f00: 73 35 47 65 74 56 61 72 69 6e 74 20 20 20 20 73  s5GetVarint    s
3f10: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
3f20: 69 6e 74 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  int..#define fts
3f30: 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
3f40: 28 61 2c 20 69 4f 66 66 2c 20 6e 56 61 6c 29 20  (a, iOff, nVal) 
3f50: 7b 20 20 20 20 20 20 5c 0a 20 20 6e 56 61 6c 20  {      \.  nVal 
3f60: 3d 20 28 61 29 5b 69 4f 66 66 2b 2b 5d 3b 20 20  = (a)[iOff++];  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
3f90: 66 28 20 6e 56 61 6c 20 26 20 30 78 38 30 20 29  f( nVal & 0x80 )
3fa0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3fc0: 0a 20 20 20 20 69 4f 66 66 2d 2d 3b 20 20 20 20  .    iOff--;    
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 5c 0a 20 20 20 20 69 4f 66 66 20 2b 3d     \.    iOff +=
4000: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
4010: 28 26 28 61 29 5b 69 4f 66 66 5d 2c 20 6e 56 61  (&(a)[iOff], nVa
4020: 6c 29 3b 20 20 20 20 5c 0a 20 20 7d 20 20 20 20  l);    \.  }    
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 20 20 20 20 20 20 20 20                  
4050: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
4060: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
4070: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
4080: 69 6e 20 66 74 73 35 5f 76 61 72 69 6e 74 2e 63  in fts5_varint.c
4090: 2e 0a 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 2a 2a 2a 2a 2a 2a 2a  ****************
40d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
40e0: 2f 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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49  ***********.** I
4130: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
4140: 20 69 6e 20 66 74 73 35 2e 63 2e 20 0a 2a 2f 0a   in fts5.c. .*/.
4150: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4160: 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20  GetTokenizer(.  
4170: 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 0a 20 20  Fts5Global*, .  
4180: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41  const char **azA
4190: 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  rg,.  int nArg,.
41a0: 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a    Fts5Tokenizer*
41b0: 2a 2c 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69  *,.  fts5_tokeni
41c0: 7a 65 72 2a 2a 2c 0a 20 20 63 68 61 72 20 2a 2a  zer**,.  char **
41d0: 70 7a 45 72 72 0a 29 3b 0a 0a 46 74 73 35 49 6e  pzErr.);..Fts5In
41e0: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 74 73 35  dex *sqlite3Fts5
41f0: 49 6e 64 65 78 46 72 6f 6d 43 73 72 69 64 28 46  IndexFromCsrid(F
4200: 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 69 36 34 2c  ts5Global*, i64,
4210: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 2a 29 3b   Fts5Config **);
4220: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
4230: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
4240: 20 69 6e 20 66 74 73 35 2e 63 2e 0a 2a 2a 2a 2a   in fts5.c..****
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4290: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42e0: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
42f0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
4300: 35 5f 68 61 73 68 2e 63 2e 20 0a 2a 2f 0a 74 79  5_hash.c. .*/.ty
4310: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
4320: 35 48 61 73 68 20 46 74 73 35 48 61 73 68 3b 0a  5Hash Fts5Hash;.
4330: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
4340: 68 61 73 68 20 74 61 62 6c 65 2c 20 66 72 65 65  hash table, free
4350: 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a   a hash table..*
4360: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
4370: 35 48 61 73 68 4e 65 77 28 46 74 73 35 43 6f 6e  5HashNew(Fts5Con
4380: 66 69 67 2a 2c 20 46 74 73 35 48 61 73 68 2a 2a  fig*, Fts5Hash**
4390: 2c 20 69 6e 74 20 2a 70 6e 53 69 7a 65 29 3b 0a  , int *pnSize);.
43a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
43b0: 48 61 73 68 46 72 65 65 28 46 74 73 35 48 61 73  HashFree(Fts5Has
43c0: 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  h*);..int sqlite
43d0: 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a  3Fts5HashWrite(.
43e0: 20 20 46 74 73 35 48 61 73 68 2a 2c 0a 20 20 69    Fts5Hash*,.  i
43f0: 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4410: 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73  * Rowid for this
4420: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
4430: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
4440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4450: 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65  olumn token appe
4460: 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64  ars in (-ve -> d
4470: 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20  elete) */.  int 
4480: 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
44a0: 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
44b0: 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a   within column *
44c0: 2f 0a 20 20 63 68 61 72 20 62 42 79 74 65 2c 0a  /.  char bByte,.
44d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
44e0: 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
44f0: 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64    /* Token to ad
4500: 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f  d or remove to o
4510: 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a  r from index */.
4520: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70 74 79 20  );../*.** Empty 
4530: 28 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65  (but do not dele
4540: 74 65 29 20 61 20 68 61 73 68 20 74 61 62 6c 65  te) a hash table
4550: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4560: 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 46  3Fts5HashClear(F
4570: 74 73 35 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20  ts5Hash*);..int 
4580: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51  sqlite3Fts5HashQ
4590: 75 65 72 79 28 0a 20 20 46 74 73 35 48 61 73 68  uery(.  Fts5Hash
45a0: 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *,              
45b0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
45c0: 74 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 2a  table to query *
45d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
45e0: 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
45f0: 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 74 65 72  ,   /* Query ter
4600: 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  m */.  const u8 
4610: 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20 20 20 20  **ppDoclist,    
4620: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
4630: 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
4640: 74 20 66 6f 72 20 70 54 65 72 6d 20 2a 2f 0a 20  t for pTerm */. 
4650: 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69 73 74 20   int *pnDoclist 
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
4680: 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65   doclist in byte
4690: 73 20 2a 2f 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c  s */.);..int sql
46a0: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
46b0: 49 6e 69 74 28 0a 20 20 46 74 73 35 48 61 73 68  Init(.  Fts5Hash
46c0: 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *,              
46d0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
46e0: 74 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 2a  table to query *
46f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4700: 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
4710: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 70 72 65      /* Query pre
4720: 66 69 78 20 2a 2f 0a 29 3b 0a 76 6f 69 64 20 73  fix */.);.void s
4730: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
4740: 61 6e 4e 65 78 74 28 46 74 73 35 48 61 73 68 2a  anNext(Fts5Hash*
4750: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4760: 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 46 74  s5HashScanEof(Ft
4770: 73 35 48 61 73 68 2a 29 3b 0a 76 6f 69 64 20 73  s5Hash*);.void s
4780: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
4790: 61 6e 45 6e 74 72 79 28 46 74 73 35 48 61 73 68  anEntry(Fts5Hash
47a0: 20 2a 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   *,.  const char
47b0: 20 2a 2a 70 7a 54 65 72 6d 2c 20 20 20 20 20 20   **pzTerm,      
47c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 74 65        /* OUT: te
47d0: 72 6d 20 28 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  rm (nul-terminat
47e0: 65 64 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ed) */.  const u
47f0: 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20 20  8 **ppDoclist,  
4800: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4810: 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   pointer to docl
4820: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ist */.  int *pn
4830: 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20  Doclist         
4840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4850: 20 73 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   size of doclist
4860: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 3b 0a   in bytes */.);.
4870: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
4880: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
4890: 20 69 6e 20 66 74 73 35 5f 68 61 73 68 2e 63 2e   in fts5_hash.c.
48a0: 0a 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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
4940: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
4950: 6e 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63  n fts5_storage.c
4960: 2e 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63  . fts5_storage.c
4970: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69   contains contai
4980: 6e 73 20 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 61  ns .** code to a
4990: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 20 73  ccess the data s
49a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f 63  tored in the %_c
49b0: 6f 6e 74 65 6e 74 20 61 6e 64 20 25 5f 64 6f 63  ontent and %_doc
49c0: 73 69 7a 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  size tables..*/.
49d0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
49e0: 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20 30 20 20  MT_SCAN_ASC  0  
49f0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77     /* SELECT row
4a00: 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  id, * FROM ... O
4a10: 52 44 45 52 20 42 59 20 31 20 41 53 43 20 2a 2f  RDER BY 1 ASC */
4a20: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
4a30: 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20 31 20 20  MT_SCAN_DESC 1  
4a40: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77     /* SELECT row
4a50: 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  id, * FROM ... O
4a60: 52 44 45 52 20 42 59 20 31 20 44 45 53 43 20 2a  RDER BY 1 DESC *
4a70: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  /.#define FTS5_S
4a80: 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20 20 32 20  TMT_LOOKUP    2 
4a90: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f      /* SELECT ro
4aa0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20  wid, * FROM ... 
4ab0: 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 20 2a 2f  WHERE rowid=? */
4ac0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
4ad0: 20 46 74 73 35 53 74 6f 72 61 67 65 20 46 74 73   Fts5Storage Fts
4ae0: 35 53 74 6f 72 61 67 65 3b 0a 0a 69 6e 74 20 73  5Storage;..int s
4af0: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
4b00: 65 4f 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67  eOpen(Fts5Config
4b10: 2a 2c 20 46 74 73 35 49 6e 64 65 78 2a 2c 20 69  *, Fts5Index*, i
4b20: 6e 74 2c 20 46 74 73 35 53 74 6f 72 61 67 65 2a  nt, Fts5Storage*
4b30: 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69 6e 74 20  *, char**);.int 
4b40: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4b50: 67 65 43 6c 6f 73 65 28 46 74 73 35 53 74 6f 72  geClose(Fts5Stor
4b60: 61 67 65 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c  age *p);.int sql
4b70: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
4b80: 65 6e 61 6d 65 28 46 74 73 35 53 74 6f 72 61 67  ename(Fts5Storag
4b90: 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  e*, const char *
4ba0: 7a 4e 61 6d 65 29 3b 0a 0a 69 6e 74 20 73 71 6c  zName);..int sql
4bb0: 69 74 65 33 46 74 73 35 44 72 6f 70 41 6c 6c 28  ite3Fts5DropAll(
4bc0: 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b 0a 69 6e  Fts5Config*);.in
4bd0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65  t sqlite3Fts5Cre
4be0: 61 74 65 54 61 62 6c 65 28 46 74 73 35 43 6f 6e  ateTable(Fts5Con
4bf0: 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  fig*, const char
4c00: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
4c10: 69 6e 74 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 0a  int, char **);..
4c20: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
4c30: 74 6f 72 61 67 65 44 65 6c 65 74 65 28 46 74 73  torageDelete(Fts
4c40: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34  5Storage *p, i64
4c50: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
4c60: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  *);.int sqlite3F
4c70: 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 74 65 6e  ts5StorageConten
4c80: 74 49 6e 73 65 72 74 28 46 74 73 35 53 74 6f 72  tInsert(Fts5Stor
4c90: 61 67 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  age *p, sqlite3_
4ca0: 76 61 6c 75 65 2a 2a 2c 20 69 36 34 2a 29 3b 0a  value**, i64*);.
4cb0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
4cc0: 74 6f 72 61 67 65 49 6e 64 65 78 49 6e 73 65 72  torageIndexInser
4cd0: 74 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  t(Fts5Storage *p
4ce0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
4cf0: 2a 2c 20 69 36 34 29 3b 0a 0a 69 6e 74 20 73 71  *, i64);..int sq
4d00: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
4d10: 49 6e 74 65 67 72 69 74 79 28 46 74 73 35 53 74  Integrity(Fts5St
4d20: 6f 72 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20  orage *p);..int 
4d30: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4d40: 67 65 53 74 6d 74 28 46 74 73 35 53 74 6f 72 61  geStmt(Fts5Stora
4d50: 67 65 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74  ge *p, int eStmt
4d60: 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2a  , sqlite3_stmt**
4d70: 2c 20 63 68 61 72 2a 2a 29 3b 0a 76 6f 69 64 20  , char**);.void 
4d80: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4d90: 67 65 53 74 6d 74 52 65 6c 65 61 73 65 28 46 74  geStmtRelease(Ft
4da0: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e  s5Storage *p, in
4db0: 74 20 65 53 74 6d 74 2c 20 73 71 6c 69 74 65 33  t eStmt, sqlite3
4dc0: 5f 73 74 6d 74 2a 29 3b 0a 0a 69 6e 74 20 73 71  _stmt*);..int sq
4dd0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
4de0: 44 6f 63 73 69 7a 65 28 46 74 73 35 53 74 6f 72  Docsize(Fts5Stor
4df0: 61 67 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  age *p, i64 iRow
4e00: 69 64 2c 20 69 6e 74 20 2a 61 43 6f 6c 29 3b 0a  id, int *aCol);.
4e10: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
4e20: 74 6f 72 61 67 65 53 69 7a 65 28 46 74 73 35 53  torageSize(Fts5S
4e30: 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 69  torage *p, int i
4e40: 43 6f 6c 2c 20 69 36 34 20 2a 70 6e 41 76 67 29  Col, i64 *pnAvg)
4e50: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4e60: 35 53 74 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74  5StorageRowCount
4e70: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
4e80: 20 69 36 34 20 2a 70 6e 52 6f 77 29 3b 0a 0a 69   i64 *pnRow);..i
4e90: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4ea0: 6f 72 61 67 65 53 79 6e 63 28 46 74 73 35 53 74  orageSync(Fts5St
4eb0: 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 62 43  orage *p, int bC
4ec0: 6f 6d 6d 69 74 29 3b 0a 69 6e 74 20 73 71 6c 69  ommit);.int sqli
4ed0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52 6f  te3Fts5StorageRo
4ee0: 6c 6c 62 61 63 6b 28 46 74 73 35 53 74 6f 72 61  llback(Fts5Stora
4ef0: 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c  ge *p);..int sql
4f00: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 43  ite3Fts5StorageC
4f10: 6f 6e 66 69 67 56 61 6c 75 65 28 0a 20 20 20 20  onfigValue(.    
4f20: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4f30: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c  const char*, sql
4f40: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74  ite3_value*, int
4f50: 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .);..int sqlite3
4f60: 46 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74  Fts5StorageDelet
4f70: 65 41 6c 6c 28 46 74 73 35 53 74 6f 72 61 67 65  eAll(Fts5Storage
4f80: 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *p);.int sqlite
4f90: 33 46 74 73 35 53 74 6f 72 61 67 65 52 65 62 75  3Fts5StorageRebu
4fa0: 69 6c 64 28 46 74 73 35 53 74 6f 72 61 67 65 20  ild(Fts5Storage 
4fb0: 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  *p);.int sqlite3
4fc0: 46 74 73 35 53 74 6f 72 61 67 65 4f 70 74 69 6d  Fts5StorageOptim
4fd0: 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65 20  ize(Fts5Storage 
4fe0: 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  *p);.int sqlite3
4ff0: 46 74 73 35 53 74 6f 72 61 67 65 4d 65 72 67 65  Fts5StorageMerge
5000: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
5010: 20 69 6e 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 2f   int nMerge);../
5020: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
5030: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
5040: 20 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e   fts5_storage.c.
5050: 0a 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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e  **********.** In
50f0: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
5100: 69 6e 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 20  in fts5_expr.c. 
5110: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
5120: 63 74 20 46 74 73 35 45 78 70 72 20 46 74 73 35  ct Fts5Expr Fts5
5130: 45 78 70 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Expr;.typedef st
5140: 72 75 63 74 20 46 74 73 35 45 78 70 72 4e 6f 64  ruct Fts5ExprNod
5150: 65 20 46 74 73 35 45 78 70 72 4e 6f 64 65 3b 0a  e Fts5ExprNode;.
5160: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
5170: 74 73 35 50 61 72 73 65 20 46 74 73 35 50 61 72  ts5Parse Fts5Par
5180: 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  se;.typedef stru
5190: 63 74 20 46 74 73 35 54 6f 6b 65 6e 20 46 74 73  ct Fts5Token Fts
51a0: 35 54 6f 6b 65 6e 3b 0a 74 79 70 65 64 65 66 20  5Token;.typedef 
51b0: 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72 50  struct Fts5ExprP
51c0: 68 72 61 73 65 20 46 74 73 35 45 78 70 72 50 68  hrase Fts5ExprPh
51d0: 72 61 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74  rase;.typedef st
51e0: 72 75 63 74 20 46 74 73 35 45 78 70 72 4e 65 61  ruct Fts5ExprNea
51f0: 72 73 65 74 20 46 74 73 35 45 78 70 72 4e 65 61  rset Fts5ExprNea
5200: 72 73 65 74 3b 0a 0a 73 74 72 75 63 74 20 46 74  rset;..struct Ft
5210: 73 35 54 6f 6b 65 6e 20 7b 0a 20 20 63 6f 6e 73  s5Token {.  cons
5220: 74 20 63 68 61 72 20 2a 70 3b 20 20 20 20 20 20  t char *p;      
5230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5240: 6f 6b 65 6e 20 74 65 78 74 20 28 6e 6f 74 20 4e  oken text (not N
5250: 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 29 20  ULL terminated) 
5260: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
5290: 62 75 66 66 65 72 20 70 20 69 6e 20 62 79 74 65  buffer p in byte
52a0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73  s */.};../* Pars
52b0: 65 20 61 20 4d 41 54 43 48 20 65 78 70 72 65 73  e a MATCH expres
52c0: 73 69 6f 6e 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c  sion. */.int sql
52d0: 69 74 65 33 46 74 73 35 45 78 70 72 4e 65 77 28  ite3Fts5ExprNew(
52e0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
52f0: 43 6f 6e 66 69 67 2c 20 0a 20 20 63 6f 6e 73 74  Config, .  const
5300: 20 63 68 61 72 20 2a 7a 45 78 70 72 2c 0a 20 20   char *zExpr,.  
5310: 46 74 73 35 45 78 70 72 20 2a 2a 70 70 4e 65 77  Fts5Expr **ppNew
5320: 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  , .  char **pzEr
5330: 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28  r.);../*.** for(
5340: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
5350: 45 78 70 72 46 69 72 73 74 28 70 45 78 70 72 2c  ExprFirst(pExpr,
5360: 20 70 49 64 78 2c 20 62 44 65 73 63 29 3b 0a 2a   pIdx, bDesc);.*
5370: 2a 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45  *     rc==SQLITE
5380: 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
5390: 33 46 74 73 35 45 78 70 72 45 6f 66 28 70 45 78  3Fts5ExprEof(pEx
53a0: 70 72 29 3b 0a 2a 2a 20 20 20 20 20 72 63 20 3d  pr);.**     rc =
53b0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
53c0: 4e 65 78 74 28 70 45 78 70 72 29 0a 2a 2a 20 29  Next(pExpr).** )
53d0: 7b 0a 2a 2a 20 20 20 2f 2f 20 54 68 65 20 64 6f  {.**   // The do
53e0: 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69  cument with rowi
53f0: 64 20 69 52 6f 77 69 64 20 6d 61 74 63 68 65 73  d iRowid matches
5400: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 21   the expression!
5410: 0a 2a 2a 20 20 20 69 36 34 20 69 52 6f 77 69 64  .**   i64 iRowid
5420: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78   = sqlite3Fts5Ex
5430: 70 72 52 6f 77 69 64 28 70 45 78 70 72 29 3b 0a  prRowid(pExpr);.
5440: 2a 2a 20 7d 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ** }.*/.int sqli
5450: 74 65 33 46 74 73 35 45 78 70 72 46 69 72 73 74  te3Fts5ExprFirst
5460: 28 46 74 73 35 45 78 70 72 2a 2c 20 46 74 73 35  (Fts5Expr*, Fts5
5470: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 36 34  Index *pIdx, i64
5480: 20 69 4d 69 6e 2c 20 69 6e 74 20 62 44 65 73 63   iMin, int bDesc
5490: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
54a0: 73 35 45 78 70 72 4e 65 78 74 28 46 74 73 35 45  s5ExprNext(Fts5E
54b0: 78 70 72 2a 2c 20 69 36 34 20 69 4d 61 78 29 3b  xpr*, i64 iMax);
54c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
54d0: 45 78 70 72 45 6f 66 28 46 74 73 35 45 78 70 72  ExprEof(Fts5Expr
54e0: 2a 29 3b 0a 69 36 34 20 73 71 6c 69 74 65 33 46  *);.i64 sqlite3F
54f0: 74 73 35 45 78 70 72 52 6f 77 69 64 28 46 74 73  ts5ExprRowid(Fts
5500: 35 45 78 70 72 2a 29 3b 0a 0a 76 6f 69 64 20 73  5Expr*);..void s
5510: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 72  qlite3Fts5ExprFr
5520: 65 65 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 0a  ee(Fts5Expr*);..
5530: 2f 2a 20 43 61 6c 6c 65 64 20 64 75 72 69 6e 67  /* Called during
5540: 20 73 74 61 72 74 75 70 20 74 6f 20 72 65 67 69   startup to regi
5550: 73 74 65 72 20 61 20 55 44 46 20 77 69 74 68 20  ster a UDF with 
5560: 53 51 4c 69 74 65 20 2a 2f 0a 69 6e 74 20 73 71  SQLite */.int sq
5570: 6c 69 74 65 33 46 74 73 35 45 78 70 72 49 6e 69  lite3Fts5ExprIni
5580: 74 28 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73  t(Fts5Global*, s
5590: 71 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e 74 20 73  qlite3*);..int s
55a0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 68  qlite3Fts5ExprPh
55b0: 72 61 73 65 43 6f 75 6e 74 28 46 74 73 35 45 78  raseCount(Fts5Ex
55c0: 70 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  pr*);.int sqlite
55d0: 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65 53  3Fts5ExprPhraseS
55e0: 69 7a 65 28 46 74 73 35 45 78 70 72 2a 2c 20 69  ize(Fts5Expr*, i
55f0: 6e 74 20 69 50 68 72 61 73 65 29 3b 0a 69 6e 74  nt iPhrase);.int
5600: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
5610: 50 6f 73 6c 69 73 74 28 46 74 73 35 45 78 70 72  Poslist(Fts5Expr
5620: 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38  *, int, const u8
5630: 20 2a 2a 29 3b 0a 0a 74 79 70 65 64 65 66 20 73   **);..typedef s
5640: 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c 69 73  truct Fts5Poslis
5650: 74 50 6f 70 75 6c 61 74 6f 72 20 46 74 73 35 50  tPopulator Fts5P
5660: 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 3b  oslistPopulator;
5670: 0a 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75  .Fts5PoslistPopu
5680: 6c 61 74 6f 72 20 2a 73 71 6c 69 74 65 33 46 74  lator *sqlite3Ft
5690: 73 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69  s5ExprClearPosli
56a0: 73 74 73 28 46 74 73 35 45 78 70 72 2a 2c 20 69  sts(Fts5Expr*, i
56b0: 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  nt);.int sqlite3
56c0: 46 74 73 35 45 78 70 72 50 6f 70 75 6c 61 74 65  Fts5ExprPopulate
56d0: 50 6f 73 6c 69 73 74 73 28 0a 20 20 20 20 46 74  Poslists(.    Ft
56e0: 73 35 43 6f 6e 66 69 67 2a 2c 20 46 74 73 35 45  s5Config*, Fts5E
56f0: 78 70 72 2a 2c 20 46 74 73 35 50 6f 73 6c 69 73  xpr*, Fts5Poslis
5700: 74 50 6f 70 75 6c 61 74 6f 72 2a 2c 20 69 6e 74  tPopulator*, int
5710: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
5720: 6e 74 0a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  nt.);.void sqlit
5730: 65 33 46 74 73 35 45 78 70 72 43 68 65 63 6b 50  e3Fts5ExprCheckP
5740: 6f 73 6c 69 73 74 73 28 46 74 73 35 45 78 70 72  oslists(Fts5Expr
5750: 2a 2c 20 69 36 34 29 3b 0a 76 6f 69 64 20 73 71  *, i64);.void sq
5760: 6c 69 74 65 33 46 74 73 35 45 78 70 72 43 6c 65  lite3Fts5ExprCle
5770: 61 72 45 6f 66 28 46 74 73 35 45 78 70 72 2a 29  arEof(Fts5Expr*)
5780: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
5790: 73 35 45 78 70 72 43 6c 6f 6e 65 50 68 72 61 73  s5ExprClonePhras
57a0: 65 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74  e(Fts5Expr*, int
57b0: 2c 20 46 74 73 35 45 78 70 72 2a 2a 29 3b 0a 0a  , Fts5Expr**);..
57c0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
57d0: 78 70 72 50 68 72 61 73 65 43 6f 6c 6c 69 73 74  xprPhraseCollist
57e0: 28 46 74 73 35 45 78 70 72 20 2a 2c 20 69 6e 74  (Fts5Expr *, int
57f0: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 2c 20 69  , const u8 **, i
5800: 6e 74 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  nt *);../*******
5810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5830: 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 74 73 35  ****.** The fts5
5840: 5f 65 78 70 72 2e 63 20 41 50 49 20 61 62 6f 76  _expr.c API abov
5850: 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  e this point is 
5860: 75 73 65 64 20 62 79 20 74 68 65 20 6f 74 68 65  used by the othe
5870: 72 20 68 61 6e 64 2d 77 72 69 74 74 65 6e 0a 2a  r hand-written.*
5880: 2a 20 43 20 63 6f 64 65 20 69 6e 20 74 68 69 73  * C code in this
5890: 20 6d 6f 64 75 6c 65 2e 20 54 68 65 20 69 6e 74   module. The int
58a0: 65 72 66 61 63 65 73 20 62 65 6c 6f 77 20 74 68  erfaces below th
58b0: 69 73 20 70 6f 69 6e 74 20 61 72 65 20 63 61 6c  is point are cal
58c0: 6c 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61  led by.** the pa
58d0: 72 73 65 72 20 63 6f 64 65 20 69 6e 20 66 74 73  rser code in fts
58e0: 35 70 61 72 73 65 2e 79 2e 20 20 2a 2f 0a 0a 76  5parse.y.  */..v
58f0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
5900: 61 72 73 65 45 72 72 6f 72 28 46 74 73 35 50 61  arseError(Fts5Pa
5910: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
5920: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
5930: 2e 2e 29 3b 0a 0a 46 74 73 35 45 78 70 72 4e 6f  ..);..Fts5ExprNo
5940: 64 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  de *sqlite3Fts5P
5950: 61 72 73 65 4e 6f 64 65 28 0a 20 20 46 74 73 35  arseNode(.  Fts5
5960: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
5970: 20 69 6e 74 20 65 54 79 70 65 2c 0a 20 20 46 74   int eType,.  Ft
5980: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4c 65 66  s5ExprNode *pLef
5990: 74 2c 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  t,.  Fts5ExprNod
59a0: 65 20 2a 70 52 69 67 68 74 2c 0a 20 20 46 74 73  e *pRight,.  Fts
59b0: 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e  5ExprNearset *pN
59c0: 65 61 72 0a 29 3b 0a 0a 46 74 73 35 45 78 70 72  ear.);..Fts5Expr
59d0: 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65 33 46  Phrase *sqlite3F
59e0: 74 73 35 50 61 72 73 65 54 65 72 6d 28 0a 20 20  ts5ParseTerm(.  
59f0: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
5a00: 65 2c 20 0a 20 20 46 74 73 35 45 78 70 72 50 68  e, .  Fts5ExprPh
5a10: 72 61 73 65 20 2a 70 50 68 72 61 73 65 2c 20 0a  rase *pPhrase, .
5a20: 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f    Fts5Token *pTo
5a30: 6b 65 6e 2c 0a 20 20 69 6e 74 20 62 50 72 65 66  ken,.  int bPref
5a40: 69 78 0a 29 3b 0a 0a 46 74 73 35 45 78 70 72 4e  ix.);..Fts5ExprN
5a50: 65 61 72 73 65 74 20 2a 73 71 6c 69 74 65 33 46  earset *sqlite3F
5a60: 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 28  ts5ParseNearset(
5a70: 0a 20 20 46 74 73 35 50 61 72 73 65 2a 2c 20 0a  .  Fts5Parse*, .
5a80: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
5a90: 74 2a 2c 0a 20 20 46 74 73 35 45 78 70 72 50 68  t*,.  Fts5ExprPh
5aa0: 72 61 73 65 2a 20 0a 29 3b 0a 0a 46 74 73 35 43  rase* .);..Fts5C
5ab0: 6f 6c 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74  olset *sqlite3Ft
5ac0: 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28 0a 20  s5ParseColset(. 
5ad0: 20 46 74 73 35 50 61 72 73 65 2a 2c 20 0a 20 20   Fts5Parse*, .  
5ae0: 46 74 73 35 43 6f 6c 73 65 74 2a 2c 20 0a 20 20  Fts5Colset*, .  
5af0: 46 74 73 35 54 6f 6b 65 6e 20 2a 0a 29 3b 0a 0a  Fts5Token *.);..
5b00: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
5b10: 50 61 72 73 65 50 68 72 61 73 65 46 72 65 65 28  ParsePhraseFree(
5b20: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29  Fts5ExprPhrase*)
5b30: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
5b40: 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72  s5ParseNearsetFr
5b50: 65 65 28 46 74 73 35 45 78 70 72 4e 65 61 72 73  ee(Fts5ExprNears
5b60: 65 74 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  et*);.void sqlit
5b70: 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46  e3Fts5ParseNodeF
5b80: 72 65 65 28 46 74 73 35 45 78 70 72 4e 6f 64 65  ree(Fts5ExprNode
5b90: 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  *);..void sqlite
5ba0: 33 46 74 73 35 50 61 72 73 65 53 65 74 44 69 73  3Fts5ParseSetDis
5bb0: 74 61 6e 63 65 28 46 74 73 35 50 61 72 73 65 2a  tance(Fts5Parse*
5bc0: 2c 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  , Fts5ExprNearse
5bd0: 74 2a 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b  t*, Fts5Token*);
5be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
5bf0: 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28  5ParseSetColset(
5c00: 46 74 73 35 50 61 72 73 65 2a 2c 20 46 74 73 35  Fts5Parse*, Fts5
5c10: 45 78 70 72 4e 65 61 72 73 65 74 2a 2c 20 46 74  ExprNearset*, Ft
5c20: 73 35 43 6f 6c 73 65 74 2a 29 3b 0a 76 6f 69 64  s5Colset*);.void
5c30: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
5c40: 65 46 69 6e 69 73 68 65 64 28 46 74 73 35 50 61  eFinished(Fts5Pa
5c50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73  rse *pParse, Fts
5c60: 35 45 78 70 72 4e 6f 64 65 20 2a 70 29 3b 0a 76  5ExprNode *p);.v
5c70: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
5c80: 61 72 73 65 4e 65 61 72 28 46 74 73 35 50 61 72  arseNear(Fts5Par
5c90: 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35  se *pParse, Fts5
5ca0: 54 6f 6b 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  Token*);../*.** 
5cb0: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
5cc0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
5cd0: 5f 65 78 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  _expr.c..*******
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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d20: 2a 2a 2a 2f 0a 0a 0a 0a 2f 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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d70: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
5d80: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
5d90: 5f 61 75 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74  _aux.c. .*/..int
5da0: 20 73 71 6c 69 74 65 33 46 74 73 35 41 75 78 49   sqlite3Fts5AuxI
5db0: 6e 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a  nit(fts5_api*);.
5dc0: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
5dd0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
5de0: 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a  n fts5_aux.c..**
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e30: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e80: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
5e90: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
5ea0: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e  ts5_tokenizer.c.
5eb0: 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65   .*/..int sqlite
5ec0: 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e  3Fts5TokenizerIn
5ed0: 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f  it(fts5_api*);./
5ee0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
5ef0: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
5f00: 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e   fts5_tokenizer.
5f10: 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c..*************
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 2a 2a 2a 2a 2a 2a  ****************
5f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
5f60: 2f 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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49  ***********.** I
5fb0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
5fc0: 20 69 6e 20 66 74 73 35 5f 76 6f 63 61 62 2e 63   in fts5_vocab.c
5fd0: 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74  . .*/..int sqlit
5fe0: 65 33 46 74 73 35 56 6f 63 61 62 49 6e 69 74 28  e3Fts5VocabInit(
5ff0: 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c  Fts5Global*, sql
6000: 69 74 65 33 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45  ite3*);../*.** E
6010: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
6020: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
6030: 76 6f 63 61 62 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  vocab.c..*******
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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6080: 2a 2a 2a 2f 0a 0a 0a 2f 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 2a  ****************
60c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60d0: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
60e0: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
60f0: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
6100: 69 6e 20 66 74 73 35 5f 75 6e 69 63 6f 64 65 32  in fts5_unicode2
6110: 2e 63 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  .c. .*/.int sqli
6120: 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65 49 73  te3Fts5UnicodeIs
6130: 61 6c 6e 75 6d 28 69 6e 74 20 63 29 3b 0a 69 6e  alnum(int c);.in
6140: 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  t sqlite3Fts5Uni
6150: 63 6f 64 65 49 73 64 69 61 63 72 69 74 69 63 28  codeIsdiacritic(
6160: 69 6e 74 20 63 29 3b 0a 69 6e 74 20 73 71 6c 69  int c);.int sqli
6170: 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65 46 6f  te3Fts5UnicodeFo
6180: 6c 64 28 69 6e 74 20 63 2c 20 69 6e 74 20 62 52  ld(int c, int bR
6190: 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 29 3b  emoveDiacritic);
61a0: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
61b0: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
61c0: 69 6e 20 66 74 73 35 5f 75 6e 69 63 6f 64 65 32  in fts5_unicode2
61d0: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
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 2a 2a 2a 2a 2a  ****************
6210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6220: 0a 23 65 6e 64 69 66 0a                          .#endif.