/ Hex Artifact Content
Login

Artifact 666aba8432940a8449a3bd4636e898fe906ed95d:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2f 0a 23 69 66 6e  *****.**.*/.#ifn
0180: 64 65 66 20 5f 46 54 53 35 49 4e 54 5f 48 0a 23  def _FTS5INT_H.#
0190: 64 65 66 69 6e 65 20 5f 46 54 53 35 49 4e 54 5f  define _FTS5INT_
01a0: 48 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 74 73  H..#include "fts
01b0: 35 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73  5.h".#include "s
01c0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 53 51 4c  qlite3ext.h".SQL
01d0: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
01e0: 49 54 31 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73  IT1..#include <s
01f0: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
0200: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69  e <assert.h>..#i
0210: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  fndef SQLITE_AMA
0220: 4c 47 41 4d 41 54 49 4f 4e 0a 0a 74 79 70 65 64  LGAMATION..typed
0230: 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ef unsigned char
0240: 20 20 75 38 3b 0a 74 79 70 65 64 65 66 20 75 6e    u8;.typedef un
0250: 73 69 67 6e 65 64 20 69 6e 74 20 20 20 75 33 32  signed int   u32
0260: 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ;.typedef unsign
0270: 65 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74 79  ed short u16;.ty
0280: 70 65 64 65 66 20 73 71 6c 69 74 65 33 5f 69 6e  pedef sqlite3_in
0290: 74 36 34 20 69 36 34 3b 0a 74 79 70 65 64 65 66  t64 i64;.typedef
02a0: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
02b0: 75 36 34 3b 0a 0a 23 64 65 66 69 6e 65 20 41 72  u64;..#define Ar
02c0: 72 61 79 53 69 7a 65 28 78 29 20 28 73 69 7a 65  raySize(x) (size
02d0: 6f 66 28 78 29 20 2f 20 73 69 7a 65 6f 66 28 78  of(x) / sizeof(x
02e0: 5b 30 5d 29 29 0a 0a 23 64 65 66 69 6e 65 20 74  [0]))..#define t
02f0: 65 73 74 63 61 73 65 28 78 29 0a 23 64 65 66 69  estcase(x).#defi
0300: 6e 65 20 41 4c 57 41 59 53 28 78 29 20 31 0a 23  ne ALWAYS(x) 1.#
0310: 64 65 66 69 6e 65 20 4e 45 56 45 52 28 78 29 20  define NEVER(x) 
0320: 30 0a 0a 23 64 65 66 69 6e 65 20 4d 49 4e 28 78  0..#define MIN(x
0330: 2c 79 29 20 28 28 28 78 29 20 3c 20 28 79 29 29  ,y) (((x) < (y))
0340: 20 3f 20 28 78 29 20 3a 20 28 79 29 29 0a 23 64   ? (x) : (y)).#d
0350: 65 66 69 6e 65 20 4d 41 58 28 78 2c 79 29 20 28  efine MAX(x,y) (
0360: 28 28 78 29 20 3e 20 28 79 29 29 20 3f 20 28 78  ((x) > (y)) ? (x
0370: 29 20 3a 20 28 79 29 29 0a 0a 2f 2a 0a 2a 2a 20  ) : (y))../*.** 
0380: 43 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 74 68  Constants for th
0390: 65 20 6c 61 72 67 65 73 74 20 61 6e 64 20 73 6d  e largest and sm
03a0: 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
03b0: 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
03c0: 74 65 67 65 72 73 2e 0a 2a 2f 0a 23 20 64 65 66  tegers..*/.# def
03d0: 69 6e 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ine LARGEST_INT6
03e0: 34 20 20 28 30 78 66 66 66 66 66 66 66 66 7c 28  4  (0xffffffff|(
03f0: 28 28 69 36 34 29 30 78 37 66 66 66 66 66 66 66  ((i64)0x7fffffff
0400: 29 3c 3c 33 32 29 29 0a 23 20 64 65 66 69 6e 65  )<<32)).# define
0410: 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
0420: 28 28 28 69 36 34 29 2d 31 29 20 2d 20 4c 41 52  (((i64)-1) - LAR
0430: 47 45 53 54 5f 49 4e 54 36 34 29 0a 0a 23 65 6e  GEST_INT64)..#en
0440: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  dif.../*.** Maxi
0450: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72  mum number of pr
0460: 65 66 69 78 20 69 6e 64 65 78 65 73 20 6f 6e 20  efix indexes on 
0470: 73 69 6e 67 6c 65 20 46 54 53 35 20 74 61 62 6c  single FTS5 tabl
0480: 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 0a  e. This must be.
0490: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2e  ** less than 32.
04a0: 20 49 66 20 69 74 20 69 73 20 73 65 74 20 74 6f   If it is set to
04b0: 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
04c0: 74 68 61 6e 20 74 68 61 74 2c 20 61 6e 20 23 65  than that, an #e
04d0: 72 72 6f 72 0a 2a 2a 20 64 69 72 65 63 74 69 76  rror.** directiv
04e0: 65 20 69 6e 20 66 74 73 35 5f 69 6e 64 65 78 2e  e in fts5_index.
04f0: 63 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  c will cause the
0500: 20 62 75 69 6c 64 20 74 6f 20 66 61 69 6c 2e 0a   build to fail..
0510: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
0520: 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58  MAX_PREFIX_INDEX
0530: 45 53 20 33 31 0a 0a 23 64 65 66 69 6e 65 20 46  ES 31..#define F
0540: 54 53 35 5f 44 45 46 41 55 4c 54 5f 4e 45 41 52  TS5_DEFAULT_NEAR
0550: 44 49 53 54 20 31 30 0a 23 64 65 66 69 6e 65 20  DIST 10.#define 
0560: 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 52 41 4e  FTS5_DEFAULT_RAN
0570: 4b 20 20 20 20 20 22 62 6d 32 35 22 0a 0a 2f 2a  K     "bm25"../*
0580: 20 4e 61 6d 65 20 6f 66 20 72 61 6e 6b 20 61 6e   Name of rank an
0590: 64 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 73 20  d rowid columns 
05a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
05b0: 52 41 4e 4b 5f 4e 41 4d 45 20 22 72 61 6e 6b 22  RANK_NAME "rank"
05c0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 52 4f  .#define FTS5_RO
05d0: 57 49 44 5f 4e 41 4d 45 20 22 72 6f 77 69 64 22  WID_NAME "rowid"
05e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
05f0: 44 45 42 55 47 0a 23 20 64 65 66 69 6e 65 20 46  DEBUG.# define F
0600: 54 53 35 5f 43 4f 52 52 55 50 54 20 73 71 6c 69  TS5_CORRUPT sqli
0610: 74 65 33 46 74 73 35 43 6f 72 72 75 70 74 28 29  te3Fts5Corrupt()
0620: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
0630: 43 6f 72 72 75 70 74 28 76 6f 69 64 29 3b 0a 23  Corrupt(void);.#
0640: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 46 54  else.# define FT
0650: 53 35 5f 43 4f 52 52 55 50 54 20 53 51 4c 49 54  S5_CORRUPT SQLIT
0660: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 0a 23  E_CORRUPT_VTAB.#
0670: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0680: 20 61 73 73 65 72 74 5f 6e 63 28 29 20 6d 61 63   assert_nc() mac
0690: 72 6f 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ro is similar to
06a0: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 6d 61   the assert() ma
06b0: 63 72 6f 2c 20 65 78 63 65 70 74 20 74 68 61 74  cro, except that
06c0: 20 69 74 0a 2a 2a 20 69 73 20 75 73 65 64 20 66   it.** is used f
06d0: 6f 72 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64  or assert() cond
06e0: 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  itions that are 
06f0: 74 72 75 65 20 6f 6e 6c 79 20 69 66 20 69 74 20  true only if it 
0700: 63 61 6e 20 62 65 20 0a 2a 2a 20 67 75 72 61 6e  can be .** guran
0710: 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
0720: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 63 6f  tabase is not co
0730: 72 72 75 70 74 2e 0a 2a 2f 0a 23 69 66 64 65 66  rrupt..*/.#ifdef
0740: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 65 78   SQLITE_DEBUG.ex
0750: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0760: 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f 72  _fts5_may_be_cor
0770: 72 75 70 74 3b 0a 23 20 64 65 66 69 6e 65 20 61  rupt;.# define a
0780: 73 73 65 72 74 5f 6e 63 28 78 29 20 61 73 73 65  ssert_nc(x) asse
0790: 72 74 28 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  rt(sqlite3_fts5_
07a0: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 20 7c  may_be_corrupt |
07b0: 7c 20 28 78 29 29 0a 23 65 6c 73 65 0a 23 20 64  | (x)).#else.# d
07c0: 65 66 69 6e 65 20 61 73 73 65 72 74 5f 6e 63 28  efine assert_nc(
07d0: 78 29 20 61 73 73 65 72 74 28 78 29 0a 23 65 6e  x) assert(x).#en
07e0: 64 69 66 0a 0a 74 79 70 65 64 65 66 20 73 74 72  dif..typedef str
07f0: 75 63 74 20 46 74 73 35 47 6c 6f 62 61 6c 20 46  uct Fts5Global F
0800: 74 73 35 47 6c 6f 62 61 6c 3b 0a 0a 2f 2a 2a 2a  ts5Global;../***
0810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0850: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  *******.** Inter
0860: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
0870: 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63 2e 20 66  fts5_config.c. f
0880: 74 73 35 5f 63 6f 6e 66 69 67 2e 63 20 63 6f 6e  ts5_config.c con
0890: 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e 73 20 63  tains contains c
08a0: 6f 64 65 0a 2a 2a 20 74 6f 20 70 61 72 73 65 20  ode.** to parse 
08b0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61  the arguments pa
08c0: 73 73 65 64 20 74 6f 20 74 68 65 20 43 52 45 41  ssed to the CREA
08d0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
08e0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 0a   statement..*/..
08f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
0900: 74 73 35 43 6f 6e 66 69 67 20 46 74 73 35 43 6f  ts5Config Fts5Co
0910: 6e 66 69 67 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nfig;../*.** An 
0920: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0930: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0940: 75 72 65 20 65 6e 63 6f 64 65 73 20 61 6c 6c 20  ure encodes all 
0950: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
0960: 20 63 61 6e 0a 2a 2a 20 62 65 20 67 6c 65 61 6e   can.** be glean
0970: 65 64 20 66 72 6f 6d 20 74 68 65 20 43 52 45 41  ed from the CREA
0980: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0990: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
09a0: 2a 20 41 6e 64 20 61 6c 6c 20 69 6e 66 6f 72 6d  * And all inform
09b0: 61 74 69 6f 6e 20 6c 6f 61 64 65 64 20 66 72 6f  ation loaded fro
09c0: 6d 20 74 68 65 20 25 5f 63 6f 6e 66 69 67 20 74  m the %_config t
09d0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e 41 75 74  able..**.** nAut
09e0: 6f 6d 65 72 67 65 3a 0a 2a 2a 20 20 20 54 68 65  omerge:.**   The
09f0: 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   minimum number 
0a00: 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  of segments that
0a10: 20 61 6e 20 61 75 74 6f 2d 6d 65 72 67 65 20 6f   an auto-merge o
0a20: 70 65 72 61 74 69 6f 6e 20 73 68 6f 75 6c 64 0a  peration should.
0a30: 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20  **   attempt to 
0a40: 6d 65 72 67 65 20 74 6f 67 65 74 68 65 72 2e 20  merge together. 
0a50: 41 20 76 61 6c 75 65 20 6f 66 20 31 20 73 65 74  A value of 1 set
0a60: 73 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  s the object to 
0a70: 75 73 65 20 74 68 65 20 0a 2a 2a 20 20 20 63 6f  use the .**   co
0a80: 6d 70 69 6c 65 20 74 69 6d 65 20 64 65 66 61 75  mpile time defau
0a90: 6c 74 2e 20 5a 65 72 6f 20 64 69 73 61 62 6c 65  lt. Zero disable
0aa0: 73 20 61 75 74 6f 2d 6d 65 72 67 65 20 61 6c 74  s auto-merge alt
0ab0: 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 7a  ogether..**.** z
0ac0: 43 6f 6e 74 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 7a  Content:.**.** z
0ad0: 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3a 0a 2a 2a  ContentRowid:.**
0ae0: 20 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20     The value of 
0af0: 74 68 65 20 63 6f 6e 74 65 6e 74 5f 72 6f 77 69  the content_rowi
0b00: 64 3d 20 6f 70 74 69 6f 6e 2c 20 69 66 20 6f 6e  d= option, if on
0b10: 65 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2e  e was specified.
0b20: 20 4f 72 20 0a 2a 2a 20 20 20 74 68 65 20 73 74   Or .**   the st
0b30: 72 69 6e 67 20 22 72 6f 77 69 64 22 20 6f 74 68  ring "rowid" oth
0b40: 65 72 77 69 73 65 2e 20 54 68 69 73 20 74 65 78  erwise. This tex
0b50: 74 20 69 73 20 6e 6f 74 20 71 75 6f 74 65 64 20  t is not quoted 
0b60: 2d 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 20 20  - if it is.**   
0b70: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
0b80: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
0b90: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
0ba0: 71 75 6f 74 65 64 20 61 70 70 72 6f 70 72 69 61  quoted appropria
0bb0: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 7a 43 6f 6e  tely..**.** zCon
0bc0: 74 65 6e 74 45 78 70 72 6c 69 73 74 3a 0a 2a 2a  tentExprlist:.**
0bd0: 0a 2a 2a 20 70 7a 45 72 72 6d 73 67 3a 0a 2a 2a  .** pzErrmsg:.**
0be0: 20 20 20 54 68 69 73 20 65 78 69 73 74 73 20 69     This exists i
0bf0: 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77  n order to allow
0c00: 20 74 68 65 20 66 74 73 35 5f 69 6e 64 65 78 2e   the fts5_index.
0c10: 63 20 6d 6f 64 75 6c 65 20 74 6f 20 72 65 74 75  c module to retu
0c20: 72 6e 20 61 20 0a 2a 2a 20 20 20 64 65 63 65 6e  rn a .**   decen
0c30: 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  t error message 
0c40: 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 73  if it encounters
0c50: 20 61 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 76   a file-format v
0c60: 65 72 73 69 6f 6e 20 69 74 20 64 6f 65 73 0a 2a  ersion it does.*
0c70: 2a 20 20 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  *   not understa
0c80: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 62 43 6f 6c 75 6d  nd..**.** bColum
0c90: 6e 73 69 7a 65 3a 0a 2a 2a 20 20 20 54 72 75 65  nsize:.**   True
0ca0: 20 69 66 20 74 68 65 20 25 5f 64 6f 63 73 69 7a   if the %_docsiz
0cb0: 65 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74  e table is creat
0cc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 62 50 72 65 66 69  ed..**.** bPrefi
0cd0: 78 49 6e 64 65 78 3a 0a 2a 2a 20 20 20 54 68 69  xIndex:.**   Thi
0ce0: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
0cf0: 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 20 49 66  or debugging. If
0d00: 20 73 65 74 20 74 6f 20 66 61 6c 73 65 2c 20 61   set to false, a
0d10: 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ny prefix indexe
0d20: 73 0a 2a 2a 20 20 20 61 72 65 20 69 67 6e 6f 72  s.**   are ignor
0d30: 65 64 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69  ed. This value i
0d40: 73 20 63 6f 6e 66 69 67 75 72 65 64 20 75 73 69  s configured usi
0d50: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ng:.**.**       
0d60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 28  INSERT INTO tbl(
0d70: 74 62 6c 2c 20 72 61 6e 6b 29 20 56 41 4c 55 45  tbl, rank) VALUE
0d80: 53 28 27 70 72 65 66 69 78 2d 69 6e 64 65 78 27  S('prefix-index'
0d90: 2c 20 24 62 50 72 65 66 69 78 49 6e 64 65 78 29  , $bPrefixIndex)
0da0: 3b 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ;.**.*/.struct F
0db0: 74 73 35 43 6f 6e 66 69 67 20 7b 0a 20 20 73 71  ts5Config {.  sq
0dc0: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0de0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
0df0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   */.  char *zDb;
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
0e20: 65 20 68 6f 6c 64 69 6e 67 20 46 54 53 20 69 6e  e holding FTS in
0e30: 64 65 78 20 28 65 2e 67 2e 20 22 6d 61 69 6e 22  dex (e.g. "main"
0e40: 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ) */.  char *zNa
0e50: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
0e60: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0e70: 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20  f FTS index */. 
0e80: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
0eb0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  lumns */.  char 
0ec0: 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  **azCol;        
0ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
0ee0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
0ef0: 75 38 20 2a 61 62 55 6e 69 6e 64 65 78 65 64 3b  u8 *abUnindexed;
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 2f 2a 20 54 72 75 65 20 66 6f 72 20 75 6e 69 6e  /* True for unin
0f20: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f  dexed columns */
0f30: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0f60: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 2a  prefix indexes *
0f70: 2f 0a 20 20 69 6e 74 20 2a 61 50 72 65 66 69 78  /.  int *aPrefix
0f80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0f90: 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 69 6e 20      /* Sizes in 
0fa0: 62 79 74 65 73 20 6f 66 20 6e 50 72 65 66 69 78  bytes of nPrefix
0fb0: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   prefix indexes 
0fc0: 2a 2f 0a 20 20 69 6e 74 20 65 43 6f 6e 74 65 6e  */.  int eConten
0fd0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
0fe0: 20 20 20 20 20 2f 2a 20 41 6e 20 46 54 53 35 5f       /* An FTS5_
0ff0: 43 4f 4e 54 45 4e 54 20 76 61 6c 75 65 20 2a 2f  CONTENT value */
1000: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e  .  char *zConten
1010: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1020: 20 20 20 2f 2a 20 63 6f 6e 74 65 6e 74 20 74 61     /* content ta
1030: 62 6c 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a  ble */ .  char *
1040: 7a 43 6f 6e 74 65 6e 74 52 6f 77 69 64 3b 20 20  zContentRowid;  
1050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 63 6f            /* "co
1060: 6e 74 65 6e 74 5f 72 6f 77 69 64 3d 22 20 6f 70  ntent_rowid=" op
1070: 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 20 0a 20  tion value */ . 
1080: 20 69 6e 74 20 62 43 6f 6c 75 6d 6e 73 69 7a 65   int bColumnsize
1090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10a0: 20 2f 2a 20 22 63 6f 6c 75 6d 6e 73 69 7a 65 3d   /* "columnsize=
10b0: 22 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 28  " option value (
10c0: 64 66 6c 74 3d 3d 31 29 20 2a 2f 0a 20 20 63 68  dflt==1) */.  ch
10d0: 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 45 78 70 72  ar *zContentExpr
10e0: 6c 69 73 74 3b 0a 20 20 46 74 73 35 54 6f 6b 65  list;.  Fts5Toke
10f0: 6e 69 7a 65 72 20 2a 70 54 6f 6b 3b 0a 20 20 66  nizer *pTok;.  f
1100: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70  ts5_tokenizer *p
1110: 54 6f 6b 41 70 69 3b 0a 0a 20 20 2f 2a 20 56 61  TokApi;..  /* Va
1120: 6c 75 65 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  lues loaded from
1130: 20 74 68 65 20 25 5f 63 6f 6e 66 69 67 20 74 61   the %_config ta
1140: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ble */.  int iCo
1150: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
1160: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
1170: 65 6d 65 6e 74 65 64 20 77 68 65 6e 20 25 5f 63  emented when %_c
1180: 6f 6e 66 69 67 20 69 73 20 6d 6f 64 69 66 69 65  onfig is modifie
1190: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 3b  d */.  int pgsz;
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b0: 20 20 20 20 20 20 20 2f 2a 20 41 70 70 72 6f 78         /* Approx
11c0: 69 6d 61 74 65 20 70 61 67 65 20 73 69 7a 65 20  imate page size 
11d0: 75 73 65 64 20 69 6e 20 25 5f 64 61 74 61 20 2a  used in %_data *
11e0: 2f 0a 20 20 69 6e 74 20 6e 41 75 74 6f 6d 65 72  /.  int nAutomer
11f0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1200: 20 20 20 20 2f 2a 20 27 61 75 74 6f 6d 65 72 67      /* 'automerg
1210: 65 27 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  e' setting */.  
1220: 69 6e 74 20 6e 43 72 69 73 69 73 4d 65 72 67 65  int nCrisisMerge
1230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1240: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
1250: 65 64 20 73 65 67 6d 65 6e 74 73 20 70 65 72 20  ed segments per 
1260: 6c 65 76 65 6c 20 2a 2f 0a 20 20 63 68 61 72 20  level */.  char 
1270: 2a 7a 52 61 6e 6b 3b 20 20 20 20 20 20 20 20 20  *zRank;         
1280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1290: 6d 65 20 6f 66 20 72 61 6e 6b 20 66 75 6e 63 74  me of rank funct
12a0: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
12b0: 52 61 6e 6b 41 72 67 73 3b 20 20 20 20 20 20 20  RankArgs;       
12c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
12d0: 6d 65 6e 74 73 20 74 6f 20 72 61 6e 6b 20 66 75  ments to rank fu
12e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
12f0: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 70 6f 69  If non-NULL, poi
1300: 6e 74 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  nts to sqlite3_v
1310: 74 61 62 2e 62 61 73 65 2e 7a 45 72 72 6d 73 67  tab.base.zErrmsg
1320: 2e 20 4f 66 74 65 6e 20 4e 55 4c 4c 2e 20 2a 2f  . Often NULL. */
1330: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d  .  char **pzErrm
1340: 73 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  sg;..#ifdef SQLI
1350: 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 62  TE_DEBUG.  int b
1360: 50 72 65 66 69 78 49 6e 64 65 78 3b 20 20 20 20  PrefixIndex;    
1370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1380: 75 65 20 74 6f 20 75 73 65 20 70 72 65 66 69 78  ue to use prefix
1390: 2d 69 6e 64 65 78 65 73 20 2a 2f 0a 23 65 6e 64  -indexes */.#end
13a0: 69 66 0a 7d 3b 0a 0a 2f 2a 20 43 75 72 72 65 6e  if.};../* Curren
13b0: 74 20 65 78 70 65 63 74 65 64 20 76 61 6c 75 65  t expected value
13c0: 20 6f 66 20 25 5f 63 6f 6e 66 69 67 20 74 61 62   of %_config tab
13d0: 6c 65 20 27 76 65 72 73 69 6f 6e 27 20 66 69 65  le 'version' fie
13e0: 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  ld */.#define FT
13f0: 53 35 5f 43 55 52 52 45 4e 54 5f 56 45 52 53 49  S5_CURRENT_VERSI
1400: 4f 4e 20 34 0a 0a 23 64 65 66 69 6e 65 20 46 54  ON 4..#define FT
1410: 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41  S5_CONTENT_NORMA
1420: 4c 20 20 20 30 0a 23 64 65 66 69 6e 65 20 46 54  L   0.#define FT
1430: 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20  S5_CONTENT_NONE 
1440: 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 46 54      1.#define FT
1450: 53 35 5f 43 4f 4e 54 45 4e 54 5f 45 58 54 45 52  S5_CONTENT_EXTER
1460: 4e 41 4c 20 32 0a 0a 0a 0a 0a 69 6e 74 20 73 71  NAL 2.....int sq
1470: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50  lite3Fts5ConfigP
1480: 61 72 73 65 28 0a 20 20 20 20 46 74 73 35 47 6c  arse(.    Fts5Gl
1490: 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  obal*, sqlite3*,
14a0: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72   int, const char
14b0: 20 2a 2a 2c 20 46 74 73 35 43 6f 6e 66 69 67 2a   **, Fts5Config*
14c0: 2a 2c 20 63 68 61 72 2a 2a 0a 29 3b 0a 76 6f 69  *, char**.);.voi
14d0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  d sqlite3Fts5Con
14e0: 66 69 67 46 72 65 65 28 46 74 73 35 43 6f 6e 66  figFree(Fts5Conf
14f0: 69 67 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  ig*);..int sqlit
1500: 65 33 46 74 73 35 43 6f 6e 66 69 67 44 65 63 6c  e3Fts5ConfigDecl
1510: 61 72 65 56 74 61 62 28 46 74 73 35 43 6f 6e 66  areVtab(Fts5Conf
1520: 69 67 20 2a 70 43 6f 6e 66 69 67 29 3b 0a 0a 69  ig *pConfig);..i
1530: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f  nt sqlite3Fts5To
1540: 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35 43 6f  kenize(.  Fts5Co
1550: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20  nfig *pConfig,  
1560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1570: 35 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  5 Configuration 
1580: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1590: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15b0: 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 2a 20 66  TS5_TOKENIZE_* f
15c0: 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
15d0: 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74  char *pText, int
15e0: 20 6e 54 65 78 74 2c 20 20 20 2f 2a 20 54 65 78   nText,   /* Tex
15f0: 74 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f  t to tokenize */
1600: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61     /* Context pa
1630: 73 73 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29  ssed to xToken()
1640: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b   */.  int (*xTok
1650: 65 6e 29 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20  en)(void*, int, 
1660: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
1670: 2c 20 69 6e 74 2c 20 69 6e 74 29 20 20 20 20 2f  , int, int)    /
1680: 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 3b  * Callback */.);
1690: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
16a0: 73 35 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a  s5Dequote(char *
16b0: 7a 29 3b 0a 0a 2f 2a 20 4c 6f 61 64 20 74 68 65  z);../* Load the
16c0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
16d0: 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65 20   %_config table 
16e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
16f0: 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 46 74 73  s5ConfigLoad(Fts
1700: 35 43 6f 6e 66 69 67 2a 2c 20 69 6e 74 29 3b 0a  5Config*, int);.
1710: 0a 2f 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  ./* Set the valu
1720: 65 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f  e of a single co
1730: 6e 66 69 67 20 61 74 74 72 69 62 75 74 65 20 2a  nfig attribute *
1740: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1750: 35 43 6f 6e 66 69 67 53 65 74 56 61 6c 75 65 28  5ConfigSetValue(
1760: 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e  Fts5Config*, con
1770: 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65  st char*, sqlite
1780: 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 2a 29 3b  3_value*, int*);
1790: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
17a0: 35 43 6f 6e 66 69 67 50 61 72 73 65 52 61 6e 6b  5ConfigParseRank
17b0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 63 68  (const char*, ch
17c0: 61 72 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 0a  ar**, char**);..
17d0: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
17e0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
17f0: 6e 20 66 74 73 35 5f 63 6f 6e 66 69 67 2e 63 2e  n fts5_config.c.
1800: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
1850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
18a0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
18b0: 6e 20 66 74 73 35 5f 62 75 66 66 65 72 2e 63 2e  n fts5_buffer.c.
18c0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  .*/../*.** Buffe
18d0: 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  r object for the
18e0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 75 69   incremental bui
18f0: 6c 64 69 6e 67 20 6f 66 20 73 74 72 69 6e 67 20  lding of string 
1900: 64 61 74 61 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  data..*/.typedef
1910: 20 73 74 72 75 63 74 20 46 74 73 35 42 75 66 66   struct Fts5Buff
1920: 65 72 20 46 74 73 35 42 75 66 66 65 72 3b 0a 73  er Fts5Buffer;.s
1930: 74 72 75 63 74 20 46 74 73 35 42 75 66 66 65 72  truct Fts5Buffer
1940: 20 7b 0a 20 20 75 38 20 2a 70 3b 0a 20 20 69 6e   {.  u8 *p;.  in
1950: 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 53 70 61 63  t n;.  int nSpac
1960: 65 3b 0a 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  e;.};..int sqlit
1970: 65 33 46 74 73 35 42 75 66 66 65 72 47 72 6f 77  e3Fts5BufferGrow
1980: 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65  (int*, Fts5Buffe
1990: 72 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 73  r*, int);.void s
19a0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
19b0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 69 6e 74  AppendVarint(int
19c0: 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
19d0: 69 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  i64);.void sqlit
19e0: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
19f0: 6e 64 42 6c 6f 62 28 69 6e 74 2a 2c 20 46 74 73  ndBlob(int*, Fts
1a00: 35 42 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63  5Buffer*, int, c
1a10: 6f 6e 73 74 20 75 38 2a 29 3b 0a 76 6f 69 64 20  onst u8*);.void 
1a20: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1a30: 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28 69 6e  rAppendString(in
1a40: 74 20 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  t *, Fts5Buffer*
1a50: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
1a60: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
1a70: 42 75 66 66 65 72 46 72 65 65 28 46 74 73 35 42  BufferFree(Fts5B
1a80: 75 66 66 65 72 2a 29 3b 0a 76 6f 69 64 20 73 71  uffer*);.void sq
1a90: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
1aa0: 65 72 6f 28 46 74 73 35 42 75 66 66 65 72 2a 29  ero(Fts5Buffer*)
1ab0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
1ac0: 73 35 42 75 66 66 65 72 53 65 74 28 69 6e 74 2a  s5BufferSet(int*
1ad0: 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69  , Fts5Buffer*, i
1ae0: 6e 74 2c 20 63 6f 6e 73 74 20 75 38 2a 29 3b 0a  nt, const u8*);.
1af0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
1b00: 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
1b10: 74 66 28 69 6e 74 20 2a 2c 20 46 74 73 35 42 75  tf(int *, Fts5Bu
1b20: 66 66 65 72 2a 2c 20 63 68 61 72 20 2a 7a 46 6d  ffer*, char *zFm
1b30: 74 2c 20 2e 2e 2e 29 3b 0a 76 6f 69 64 20 73 71  t, ...);.void sq
1b40: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1b50: 70 70 65 6e 64 33 32 28 69 6e 74 2a 2c 20 46 74  ppend32(int*, Ft
1b60: 73 35 42 75 66 66 65 72 2a 2c 20 69 6e 74 29 3b  s5Buffer*, int);
1b70: 0a 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  ..char *sqlite3F
1b80: 74 73 35 4d 70 72 69 6e 74 66 28 69 6e 74 20 2a  ts5Mprintf(int *
1b90: 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  pRc, const char 
1ba0: 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 3b 0a 0a 23 64  *zFmt, ...);..#d
1bb0: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
1bc0: 5a 65 72 6f 28 78 29 20 20 20 20 20 20 20 20 20  Zero(x)         
1bd0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1be0: 75 66 66 65 72 5a 65 72 6f 28 78 29 0a 23 64 65  ufferZero(x).#de
1bf0: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 47  fine fts5BufferG
1c00: 72 6f 77 28 61 2c 62 2c 63 29 20 20 20 20 20 20  row(a,b,c)      
1c10: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1c20: 66 66 65 72 47 72 6f 77 28 61 2c 62 2c 63 29 0a  fferGrow(a,b,c).
1c30: 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66  #define fts5Buff
1c40: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 61  erAppendVarint(a
1c50: 2c 62 2c 63 29 20 73 71 6c 69 74 65 33 46 74 73  ,b,c) sqlite3Fts
1c60: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1c70: 69 6e 74 28 61 2c 62 2c 63 29 0a 23 64 65 66 69  int(a,b,c).#defi
1c80: 6e 65 20 66 74 73 35 42 75 66 66 65 72 46 72 65  ne fts5BufferFre
1c90: 65 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  e(a)            
1ca0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1cb0: 65 72 46 72 65 65 28 61 29 0a 23 64 65 66 69 6e  erFree(a).#defin
1cc0: 65 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65  e fts5BufferAppe
1cd0: 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20  ndBlob(a,b,c,d) 
1ce0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1cf0: 72 41 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c  rAppendBlob(a,b,
1d00: 63 2c 64 29 0a 23 64 65 66 69 6e 65 20 66 74 73  c,d).#define fts
1d10: 35 42 75 66 66 65 72 53 65 74 28 61 2c 62 2c 63  5BufferSet(a,b,c
1d20: 2c 64 29 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,d)        sqlit
1d30: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
1d40: 61 2c 62 2c 63 2c 64 29 0a 23 64 65 66 69 6e 65  a,b,c,d).#define
1d50: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1d60: 64 33 32 28 61 2c 62 2c 63 29 20 20 20 20 20 73  d32(a,b,c)     s
1d70: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d80: 41 70 70 65 6e 64 33 32 28 61 2c 62 2c 63 29 0a  Append32(a,b,c).
1d90: 0a 2f 2a 20 57 72 69 74 65 20 61 6e 64 20 64 65  ./* Write and de
1da0: 63 6f 64 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  code big-endian 
1db0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  32-bit integer v
1dc0: 61 6c 75 65 73 20 2a 2f 0a 76 6f 69 64 20 73 71  alues */.void sq
1dd0: 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 75  lite3Fts5Put32(u
1de0: 38 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71  8*, int);.int sq
1df0: 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28 63  lite3Fts5Get32(c
1e00: 6f 6e 73 74 20 75 38 2a 29 3b 0a 0a 23 64 65 66  onst u8*);..#def
1e10: 69 6e 65 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c  ine FTS5_POS2COL
1e20: 55 4d 4e 28 69 50 6f 73 29 20 28 69 6e 74 29 28  UMN(iPos) (int)(
1e30: 69 50 6f 73 20 3e 3e 20 33 32 29 0a 23 64 65 66  iPos >> 32).#def
1e40: 69 6e 65 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  ine FTS5_POS2OFF
1e50: 53 45 54 28 69 50 6f 73 29 20 28 69 6e 74 29 28  SET(iPos) (int)(
1e60: 69 50 6f 73 20 26 20 30 78 46 46 46 46 46 46 46  iPos & 0xFFFFFFF
1e70: 46 29 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  F)..typedef stru
1e80: 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65  ct Fts5PoslistRe
1e90: 61 64 65 72 20 46 74 73 35 50 6f 73 6c 69 73 74  ader Fts5Poslist
1ea0: 52 65 61 64 65 72 3b 0a 73 74 72 75 63 74 20 46  Reader;.struct F
1eb0: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
1ec0: 20 7b 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65   {.  /* Variable
1ed0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 62 79 20 73  s used only by s
1ee0: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1ef0: 74 49 74 65 72 58 58 58 28 29 20 66 75 6e 63 74  tIterXXX() funct
1f00: 69 6f 6e 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  ions. */.  int i
1f10: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
1f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1f30: 20 28 69 43 6f 6c 3e 3d 30 29 2c 20 74 68 69 73   (iCol>=0), this
1f40: 20 63 6f 6c 75 6d 6e 20 6f 6e 6c 79 20 2a 2f 0a   column only */.
1f50: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20    const u8 *a;  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69    /* Position li
1f80: 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  st to iterate th
1f90: 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  rough */.  int n
1fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1fc0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
1fd0: 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  a[] in bytes */.
1fe0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
2010: 73 65 74 20 69 6e 20 61 5b 5d 20 2a 2f 0a 0a 20  set in a[] */.. 
2020: 20 75 38 20 62 46 6c 61 67 3b 20 20 20 20 20 20   u8 bFlag;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 2f 2a 20 46 6f 72 20 63 6c 69 65 6e 74 20 75   /* For client u
2050: 73 65 20 28 61 6e 79 20 63 75 73 74 6f 6d 20 70  se (any custom p
2060: 75 72 70 6f 73 65 29 20 2a 2f 0a 0a 20 20 2f 2a  urpose) */..  /*
2070: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2080: 73 20 2a 2f 0a 20 20 75 38 20 62 45 6f 66 3b 20  s */.  u8 bEof; 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
20b0: 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a   true at EOF */.
20c0: 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20 20 20    i64 iPos;     
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33 32 29 20    /* (iCol<<32) 
20f0: 2b 20 69 50 6f 73 20 2a 2f 0a 7d 3b 0a 69 6e 74  + iPos */.};.int
2100: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2110: 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 0a 20  istReaderInit(. 
2120: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 2f 2a 20 49 66 20 28 69 43 6f 6c 3e 3d 30 29   /* If (iCol>=0)
2150: 2c 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 6e  , this column on
2160: 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ly */.  const u8
2170: 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20   *a, int n,     
2180: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69          /* Posli
2190: 73 74 20 62 75 66 66 65 72 20 74 6f 20 69 74 65  st buffer to ite
21a0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a  rate through */.
21b0: 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61    Fts5PoslistRea
21c0: 64 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  der *pIter      
21d0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62    /* Iterator ob
21e0: 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  ject to initiali
21f0: 7a 65 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c  ze */.);.int sql
2200: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
2210: 65 61 64 65 72 4e 65 78 74 28 46 74 73 35 50 6f  eaderNext(Fts5Po
2220: 73 6c 69 73 74 52 65 61 64 65 72 2a 29 3b 0a 0a  slistReader*);..
2230: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2240: 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
2250: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
2260: 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35 50  er;.struct Fts5P
2270: 6f 73 6c 69 73 74 57 72 69 74 65 72 20 7b 0a 20  oslistWriter {. 
2280: 20 69 36 34 20 69 50 72 65 76 3b 0a 7d 3b 0a 69   i64 iPrev;.};.i
2290: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  nt sqlite3Fts5Po
22a0: 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e  slistWriterAppen
22b0: 64 28 46 74 73 35 42 75 66 66 65 72 2a 2c 20 46  d(Fts5Buffer*, F
22c0: 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
22d0: 2a 2c 20 69 36 34 29 3b 0a 0a 69 6e 74 20 73 71  *, i64);..int sq
22e0: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
22f0: 4e 65 78 74 36 34 28 0a 20 20 63 6f 6e 73 74 20  Next64(.  const 
2300: 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20  u8 *a, int n,   
2310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
2320: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
2330: 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oslist */.  int 
2340: 2a 70 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pi,            
2350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2360: 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20 77 69  N/OUT: Offset wi
2370: 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 36  thin a[] */.  i6
2380: 34 20 2a 70 69 4f 66 66 20 20 20 20 20 20 20 20  4 *piOff        
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a0: 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
23b0: 20 6f 66 66 73 65 74 20 2a 2f 0a 29 3b 0a 0a 2f   offset */.);../
23c0: 2a 20 4d 61 6c 6c 6f 63 20 75 74 69 6c 69 74 79  * Malloc utility
23d0: 20 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65   */.void *sqlite
23e0: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
23f0: 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74 20 6e 42  int *pRc, int nB
2400: 79 74 65 29 3b 0a 63 68 61 72 20 2a 73 71 6c 69  yte);.char *sqli
2410: 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 69  te3Fts5Strndup(i
2420: 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63  nt *pRc, const c
2430: 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49  har *pIn, int nI
2440: 6e 29 3b 0a 0a 2f 2a 20 43 68 61 72 61 63 74 65  n);../* Characte
2450: 72 20 73 65 74 20 74 65 73 74 73 20 28 6c 69 6b  r set tests (lik
2460: 65 20 69 73 73 70 61 63 65 28 29 2c 20 69 73 61  e isspace(), isa
2470: 6c 70 68 61 28 29 20 65 74 63 2e 29 20 2a 2f 0a  lpha() etc.) */.
2480: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2490: 73 42 61 72 65 77 6f 72 64 28 63 68 61 72 20 74  sBareword(char t
24a0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  );../*.** End of
24b0: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   interface to co
24c0: 64 65 20 69 6e 20 66 74 73 35 5f 62 75 66 66 65  de in fts5_buffe
24d0: 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  r.c..***********
24e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2520: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2570: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
2580: 64 65 20 69 6e 20 66 74 73 35 5f 69 6e 64 65 78  de in fts5_index
2590: 2e 63 2e 20 66 74 73 35 5f 69 6e 64 65 78 2e 63  .c. fts5_index.c
25a0: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69   contains contai
25b0: 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f 20 61 63  ns code.** to ac
25c0: 63 65 73 73 20 74 68 65 20 64 61 74 61 20 73 74  cess the data st
25d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61  ored in the %_da
25e0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 74 79  ta table..*/..ty
25f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2600: 35 49 6e 64 65 78 20 46 74 73 35 49 6e 64 65 78  5Index Fts5Index
2610: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2620: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 46   Fts5IndexIter F
2630: 74 73 35 49 6e 64 65 78 49 74 65 72 3b 0a 0a 2f  ts5IndexIter;../
2640: 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 75 73 65 64  *.** Values used
2650: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
2660: 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 70  flags argument p
2670: 61 73 73 65 64 20 74 6f 20 49 6e 64 65 78 51 75  assed to IndexQu
2680: 65 72 79 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ery()..*/.#defin
2690: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
26a0: 59 5f 50 52 45 46 49 58 20 20 20 20 20 30 78 30  Y_PREFIX     0x0
26b0: 30 30 31 20 20 20 2f 2a 20 50 72 65 66 69 78 20  001   /* Prefix 
26c0: 71 75 65 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  query */.#define
26d0: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
26e0: 5f 44 45 53 43 20 20 20 20 20 20 20 30 78 30 30  _DESC       0x00
26f0: 30 32 20 20 20 2f 2a 20 44 6f 63 73 20 69 6e 20  02   /* Docs in 
2700: 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64  descending rowid
2710: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2720: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
2730: 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 30 78 30  Y_TEST_NOIDX 0x0
2740: 30 30 34 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  004   /* Do not 
2750: 75 73 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  use prefix index
2760: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
2770: 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
2780: 20 20 20 20 20 20 20 30 78 30 30 30 38 20 20 20         0x0008   
2790: 2f 2a 20 53 63 61 6e 20 71 75 65 72 79 20 28 66  /* Scan query (f
27a0: 74 73 35 76 6f 63 61 62 29 20 2a 2f 0a 0a 2f 2a  ts5vocab) */../*
27b0: 0a 2a 2a 20 43 72 65 61 74 65 2f 64 65 73 74 72  .** Create/destr
27c0: 6f 79 20 61 6e 20 46 74 73 35 49 6e 64 65 78 20  oy an Fts5Index 
27d0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73  object..*/.int s
27e0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
27f0: 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67 20 2a  pen(Fts5Config *
2800: 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20 62 43 72  pConfig, int bCr
2810: 65 61 74 65 2c 20 46 74 73 35 49 6e 64 65 78 2a  eate, Fts5Index*
2820: 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69 6e 74 20  *, char**);.int 
2830: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2840: 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20  Close(Fts5Index 
2850: 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28  *p);../*.** for(
2860: 0a 2a 2a 20 20 20 70 49 74 65 72 20 3d 20 73 71  .**   pIter = sq
2870: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
2880: 65 72 79 28 70 2c 20 22 74 6f 6b 65 6e 22 2c 20  ery(p, "token", 
2890: 35 2c 20 30 29 3b 0a 2a 2a 20 20 20 30 3d 3d 73  5, 0);.**   0==s
28a0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
28b0: 66 28 70 49 74 65 72 29 3b 0a 2a 2a 20 20 20 73  f(pIter);.**   s
28c0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
28d0: 78 74 28 70 49 74 65 72 29 0a 2a 2a 20 29 7b 0a  xt(pIter).** ){.
28e0: 2a 2a 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  **   i64 iRowid 
28f0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
2900: 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 2a  rRowid(pIter);.*
2910: 2a 20 7d 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4f 70  * }.*/../*.** Op
2920: 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f  en a new iterato
2930: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f  r to iterate tho
2940: 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 73 20 74  ugh all rowids t
2950: 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a  hat match the .*
2960: 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65  * specified toke
2970: 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69  n or token prefi
2980: 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
2990: 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
29a0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
29d0: 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f  to query */.  co
29e0: 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
29f0: 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a  , int nToken, /*
2a00: 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69   Token (or prefi
2a10: 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  x) to query for 
2a20: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2a50: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2a60: 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
2a70: 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49  5IndexIter **ppI
2a80: 74 65 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ter.);../*.** Th
2a90: 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61 74  e various operat
2aa0: 69 6f 6e 73 20 6f 6e 20 6f 70 65 6e 20 74 6f 6b  ions on open tok
2ab0: 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
2ac0: 69 78 20 69 74 65 72 61 74 6f 72 73 20 6f 70 65  ix iterators ope
2ad0: 6e 65 64 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  ned.** using sql
2ae0: 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
2af0: 72 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ry()..*/.int sql
2b00: 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
2b10: 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b  Fts5IndexIter*);
2b20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2b30: 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
2b40: 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20 73 71  exIter*);.int sq
2b50: 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
2b60: 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
2b70: 74 65 72 2a 2c 20 69 36 34 20 69 4d 61 74 63 68  ter*, i64 iMatch
2b80: 29 3b 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74  );.i64 sqlite3Ft
2b90: 73 35 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  s5IterRowid(Fts5
2ba0: 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74  IndexIter*);.int
2bb0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2bc0: 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e 64 65  Poslist(Fts5Inde
2bd0: 78 49 74 65 72 2a 2c 20 63 6f 6e 73 74 20 75 38  xIter*, const u8
2be0: 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 6e 2c 20   **pp, int *pn, 
2bf0: 69 36 34 20 2a 70 69 29 3b 0a 69 6e 74 20 73 71  i64 *pi);.int sq
2c00: 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
2c10: 6c 69 73 74 42 75 66 66 65 72 28 46 74 73 35 49  listBuffer(Fts5I
2c20: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
2c30: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2c40: 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f);../*.** Close
2c50: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65   an iterator ope
2c60: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 74  ned by sqlite3Ft
2c70: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  s5IndexQuery()..
2c80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
2c90: 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73  ts5IterClose(Fts
2ca0: 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 2f  5IndexIter*);../
2cb0: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
2cc0: 61 63 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ace is used by t
2cd0: 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64  he fts5vocab mod
2ce0: 75 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ule..*/.const ch
2cf0: 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49  ar *sqlite3Fts5I
2d00: 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65  terTerm(Fts5Inde
2d10: 78 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 69  xIter*, int*);.i
2d20: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
2d30: 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49  erNextScan(Fts5I
2d40: 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 0a 2f 2a  ndexIter*);.../*
2d50: 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
2d60: 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
2d70: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
2d80: 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
2d90: 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
2da0: 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
2db0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
2dc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2dd0: 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
2de0: 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
2df0: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
2e00: 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
2e10: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
2e20: 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
2e30: 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
2e40: 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
2e50: 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
2e60: 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
2e70: 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
2e80: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
2e90: 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
2ea0: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
2eb0: 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
2ec0: 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
2ed0: 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
2ee0: 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
2ef0: 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e   a delete..*/.in
2f00: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2f10: 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
2f20: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
2f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2f40: 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
2f50: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
2f80: 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
2f90: 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
2fa0: 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2fd0: 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
2fe0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
2ff0: 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
3000: 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
3010: 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
3020: 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
3030: 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a 0a 2f  m index */.);../
3040: 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
3050: 61 74 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  at subsequent ca
3060: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
3070: 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
3080: 65 72 74 61 69 6e 20 74 6f 0a 2a 2a 20 64 6f 63  ertain to.** doc
3090: 75 6d 65 6e 74 20 69 44 6f 63 69 64 2e 0a 2a 2f  ument iDocid..*/
30a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
30b0: 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28  IndexBeginWrite(
30c0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
30f0: 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
3100: 20 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20   iDocid         
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3120: 44 6f 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20  Docid to add or 
3130: 72 65 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d  remove data from
3140: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c   */.);../*.** Fl
3150: 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
3160: 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
3170: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
3180: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
3190: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  ..** If the bCom
31a0: 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
31b0: 2c 20 61 6c 73 6f 20 63 6c 6f 73 65 20 61 6e 79  , also close any
31c0: 20 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c   open blob handl
31d0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
31e0: 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28  e3Fts5IndexSync(
31f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
3200: 74 20 62 43 6f 6d 6d 69 74 29 3b 0a 0a 2f 2a 0a  t bCommit);../*.
3210: 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64  ** Discard any d
3220: 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
3230: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
3240: 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20   tables. Do not 
3250: 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74  write it.** to t
3260: 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
3270: 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  itionally, assum
3280: 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  e that the conte
3290: 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
32a0: 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68  a.** table may h
32b0: 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64  ave changed on d
32c0: 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d  isk. So any in-m
32d0: 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20  emory caches of 
32e0: 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72  %_data .** recor
32f0: 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
3300: 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  idated..*/.int s
3310: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
3320: 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65  ollback(Fts5Inde
3330: 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65  x *p);../*.** Ge
3340: 74 20 6f 72 20 73 65 74 20 74 68 65 20 22 61 76  t or set the "av
3350: 65 72 61 67 65 73 22 20 76 61 6c 75 65 73 2e 0a  erages" values..
3360: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
3370: 73 35 49 6e 64 65 78 47 65 74 41 76 65 72 61 67  s5IndexGetAverag
3380: 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  es(Fts5Index *p,
3390: 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34   i64 *pnRow, i64
33a0: 20 2a 61 6e 53 69 7a 65 29 3b 0a 69 6e 74 20 73   *anSize);.int s
33b0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
33c0: 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
33d0: 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75  ndex *p, const u
33e0: 38 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  8*, int);../*.**
33f0: 20 46 75 6e 63 74 69 6f 6e 73 20 63 61 6c 6c 65   Functions calle
3400: 64 20 62 79 20 74 68 65 20 73 74 6f 72 61 67 65  d by the storage
3410: 20 6d 6f 64 75 6c 65 20 61 73 20 70 61 72 74 20   module as part 
3420: 6f 66 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  of integrity-che
3430: 63 6b 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  ck..*/.u64 sqlit
3440: 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d  e3Fts5IndexCksum
3450: 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 69 36 34  (Fts5Config*,i64
3460: 2c 69 6e 74 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  ,int,int,const c
3470: 68 61 72 2a 2c 69 6e 74 29 3b 0a 69 6e 74 20 73  har*,int);.int s
3480: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
3490: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74  ntegrityCheck(Ft
34a0: 73 35 49 6e 64 65 78 2a 2c 20 75 36 34 20 63 6b  s5Index*, u64 ck
34b0: 73 75 6d 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 61  sum);../* .** Ca
34c0: 6c 6c 65 64 20 64 75 72 69 6e 67 20 76 69 72 74  lled during virt
34d0: 75 61 6c 20 6d 6f 64 75 6c 65 20 69 6e 69 74 69  ual module initi
34e0: 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 20 72 65 67  alization to reg
34f0: 69 73 74 65 72 20 55 44 46 20 0a 2a 2a 20 66 74  ister UDF .** ft
3500: 73 35 5f 64 65 63 6f 64 65 28 29 20 77 69 74 68  s5_decode() with
3510: 20 53 51 4c 69 74 65 20 0a 2a 2f 0a 69 6e 74 20   SQLite .*/.int 
3520: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
3530: 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
3540: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3550: 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46  IndexSetCookie(F
3560: 74 73 35 49 6e 64 65 78 2a 2c 20 69 6e 74 29 3b  ts5Index*, int);
3570: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3580: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
3590: 6f 66 20 65 6e 74 72 69 65 73 20 72 65 61 64 20  of entries read 
35a0: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
35b0: 74 61 62 6c 65 20 62 79 20 0a 2a 2a 20 74 68 69  table by .** thi
35c0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  s connection sin
35d0: 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65  ce it was create
35e0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
35f0: 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28  3Fts5IndexReads(
3600: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 3b 0a 0a  Fts5Index *p);..
3610: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
3620: 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49  ndexReinit(Fts5I
3630: 6e 64 65 78 20 2a 70 29 3b 0a 69 6e 74 20 73 71  ndex *p);.int sq
3640: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
3650: 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78  timize(Fts5Index
3660: 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *p);.int sqlite
3670: 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28  3Fts5IndexMerge(
3680: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
3690: 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 69 6e 74 20  t nMerge);..int 
36a0: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
36b0: 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
36c0: 6e 64 65 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a  ndex *p);../*.**
36d0: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
36e0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
36f0: 35 5f 69 6e 64 65 78 2e 63 2e 0a 2a 2a 2a 2a 2a  5_index.c..*****
3700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3740: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
3750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3790: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
37a0: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
37b0: 5f 76 61 72 69 6e 74 2e 63 2e 20 0a 2a 2f 0a 69  _varint.c. .*/.i
37c0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  nt sqlite3Fts5Ge
37d0: 74 56 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20  tVarint32(const 
37e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
37f0: 2c 20 75 33 32 20 2a 76 29 3b 0a 69 6e 74 20 73  , u32 *v);.int s
3800: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
3810: 69 6e 74 4c 65 6e 28 75 33 32 20 69 56 61 6c 29  intLen(u32 iVal)
3820: 3b 0a 75 38 20 73 71 6c 69 74 65 33 46 74 73 35  ;.u8 sqlite3Fts5
3830: 47 65 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 20  GetVarint(const 
3840: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20  unsigned char*, 
3850: 75 36 34 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  u64*);.int sqlit
3860: 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
3870: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
3880: 2c 20 75 36 34 20 76 29 3b 0a 0a 23 64 65 66 69  , u64 v);..#defi
3890: 6e 65 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  ne fts5GetVarint
38a0: 33 32 28 61 2c 62 29 20 73 71 6c 69 74 65 33 46  32(a,b) sqlite3F
38b0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61  ts5GetVarint32(a
38c0: 2c 28 75 33 32 2a 29 26 62 29 0a 23 64 65 66 69  ,(u32*)&b).#defi
38d0: 6e 65 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  ne fts5GetVarint
38e0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 47      sqlite3Fts5G
38f0: 65 74 56 61 72 69 6e 74 0a 0a 2f 2a 0a 2a 2a 20  etVarint../*.** 
3900: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
3910: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
3920: 5f 76 61 72 69 6e 74 2e 63 2e 0a 2a 2a 2a 2a 2a  _varint.c..*****
3930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3970: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
3980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39c0: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
39d0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
39e0: 35 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71  5.c. .*/..int sq
39f0: 6c 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b 65  lite3Fts5GetToke
3a00: 6e 69 7a 65 72 28 0a 20 20 46 74 73 35 47 6c 6f  nizer(.  Fts5Glo
3a10: 62 61 6c 2a 2c 20 0a 20 20 63 6f 6e 73 74 20 63  bal*, .  const c
3a20: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69  har **azArg,.  i
3a30: 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74 73 35 54  nt nArg,.  Fts5T
3a40: 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a 20 20 66 74  okenizer**,.  ft
3a50: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a  s5_tokenizer**,.
3a60: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
3a70: 3b 0a 0a 46 74 73 35 49 6e 64 65 78 20 2a 73 71  ;..Fts5Index *sq
3a80: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 46 72  lite3Fts5IndexFr
3a90: 6f 6d 43 73 72 69 64 28 46 74 73 35 47 6c 6f 62  omCsrid(Fts5Glob
3aa0: 61 6c 2a 2c 20 69 36 34 2c 20 69 6e 74 2a 29 3b  al*, i64, int*);
3ab0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
3ac0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
3ad0: 20 69 6e 20 66 74 73 35 2e 63 2e 0a 2a 2a 2a 2a   in fts5.c..****
3ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b20: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
3b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b70: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
3b80: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
3b90: 35 5f 68 61 73 68 2e 63 2e 20 0a 2a 2f 0a 74 79  5_hash.c. .*/.ty
3ba0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
3bb0: 35 48 61 73 68 20 46 74 73 35 48 61 73 68 3b 0a  5Hash Fts5Hash;.
3bc0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3bd0: 68 61 73 68 20 74 61 62 6c 65 2c 20 66 72 65 65  hash table, free
3be0: 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a   a hash table..*
3bf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3c00: 35 48 61 73 68 4e 65 77 28 46 74 73 35 48 61 73  5HashNew(Fts5Has
3c10: 68 2a 2a 2c 20 69 6e 74 20 2a 70 6e 53 69 7a 65  h**, int *pnSize
3c20: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
3c30: 74 73 35 48 61 73 68 46 72 65 65 28 46 74 73 35  ts5HashFree(Fts5
3c40: 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  Hash*);..int sql
3c50: 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
3c60: 65 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 0a  e(.  Fts5Hash*,.
3c70: 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
3ca0: 68 69 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  his entry */.  i
3cb0: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cd0: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
3ce0: 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
3cf0: 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
3d00: 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d20: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
3d30: 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
3d40: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 62 42 79 74  n */.  char bByt
3d50: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
3d60: 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
3d70: 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
3d80: 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
3d90: 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
3da0: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70  */.);../*.** Emp
3db0: 74 79 20 28 62 75 74 20 64 6f 20 6e 6f 74 20 64  ty (but do not d
3dc0: 65 6c 65 74 65 29 20 61 20 68 61 73 68 20 74 61  elete) a hash ta
3dd0: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
3de0: 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
3df0: 72 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 0a 69  r(Fts5Hash*);..i
3e00: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  nt sqlite3Fts5Ha
3e10: 73 68 51 75 65 72 79 28 0a 20 20 46 74 73 35 48  shQuery(.  Fts5H
3e20: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
3e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3e40: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
3e50: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
3e60: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
3e70: 65 72 6d 2c 20 20 20 2f 2a 20 51 75 65 72 79 20  erm,   /* Query 
3e80: 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
3e90: 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20  u8 **ppDoclist, 
3ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3eb0: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  : Pointer to doc
3ec0: 6c 69 73 74 20 66 6f 72 20 70 54 65 72 6d 20 2a  list for pTerm *
3ed0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69  /.  int *pnDocli
3ee0: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
3ef0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
3f00: 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
3f10: 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a 69 6e 74 20  ytes */.);..int 
3f20: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
3f30: 63 61 6e 49 6e 69 74 28 0a 20 20 46 74 73 35 48  canInit(.  Fts5H
3f40: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
3f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3f60: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
3f70: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
3f80: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
3f90: 65 72 6d 20 20 20 20 2f 2a 20 51 75 65 72 79 20  erm    /* Query 
3fa0: 70 72 65 66 69 78 20 2a 2f 0a 29 3b 0a 76 6f 69  prefix */.);.voi
3fb0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
3fc0: 68 53 63 61 6e 4e 65 78 74 28 46 74 73 35 48 61  hScanNext(Fts5Ha
3fd0: 73 68 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  sh*);.int sqlite
3fe0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
3ff0: 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 76 6f 69  (Fts5Hash*);.voi
4000: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
4010: 68 53 63 61 6e 45 6e 74 72 79 28 46 74 73 35 48  hScanEntry(Fts5H
4020: 61 73 68 20 2a 2c 0a 20 20 63 6f 6e 73 74 20 63  ash *,.  const c
4030: 68 61 72 20 2a 2a 70 7a 54 65 72 6d 2c 20 20 20  har **pzTerm,   
4040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4050: 20 74 65 72 6d 20 28 6e 75 6c 2d 74 65 72 6d 69   term (nul-termi
4060: 6e 61 74 65 64 29 20 2a 2f 0a 20 20 63 6f 6e 73  nated) */.  cons
4070: 74 20 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74  t u8 **ppDoclist
4080: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
4090: 55 54 3a 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  UT: pointer to d
40a0: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
40b0: 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20  *pnDoclist      
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
40d0: 55 54 3a 20 73 69 7a 65 20 6f 66 20 64 6f 63 6c  UT: size of docl
40e0: 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
40f0: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  );.../*.** End o
4100: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
4110: 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61 73 68  ode in fts5_hash
4120: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
4130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4170: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
41c0: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
41d0: 65 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67  e in fts5_storag
41e0: 65 2e 63 2e 20 66 74 73 35 5f 73 74 6f 72 61 67  e.c. fts5_storag
41f0: 65 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e  e.c contains con
4200: 74 61 69 6e 73 20 0a 2a 2a 20 63 6f 64 65 20 74  tains .** code t
4210: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
4220: 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
4230: 25 5f 63 6f 6e 74 65 6e 74 20 61 6e 64 20 25 5f  %_content and %_
4240: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 73 2e 0a  docsize tables..
4250: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
4260: 5f 53 54 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20  _STMT_SCAN_ASC  
4270: 30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  0     /* SELECT 
4280: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
4290: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 41 53 43  . ORDER BY 1 ASC
42a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
42b0: 5f 53 54 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20  _STMT_SCAN_DESC 
42c0: 31 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  1     /* SELECT 
42d0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
42e0: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 44 45 53  . ORDER BY 1 DES
42f0: 43 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  C */.#define FTS
4300: 35 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20  5_STMT_LOOKUP   
4310: 20 32 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54   2     /* SELECT
4320: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e   rowid, * FROM .
4330: 2e 2e 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f  .. WHERE rowid=?
4340: 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
4350: 75 63 74 20 46 74 73 35 53 74 6f 72 61 67 65 20  uct Fts5Storage 
4360: 46 74 73 35 53 74 6f 72 61 67 65 3b 0a 0a 69 6e  Fts5Storage;..in
4370: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
4380: 72 61 67 65 4f 70 65 6e 28 46 74 73 35 43 6f 6e  rageOpen(Fts5Con
4390: 66 69 67 2a 2c 20 46 74 73 35 49 6e 64 65 78 2a  fig*, Fts5Index*
43a0: 2c 20 69 6e 74 2c 20 46 74 73 35 53 74 6f 72 61  , int, Fts5Stora
43b0: 67 65 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69  ge**, char**);.i
43c0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
43d0: 6f 72 61 67 65 43 6c 6f 73 65 28 46 74 73 35 53  orageClose(Fts5S
43e0: 74 6f 72 61 67 65 20 2a 70 29 3b 0a 69 6e 74 20  torage *p);.int 
43f0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4400: 67 65 52 65 6e 61 6d 65 28 46 74 73 35 53 74 6f  geRename(Fts5Sto
4410: 72 61 67 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  rage*, const cha
4420: 72 20 2a 7a 4e 61 6d 65 29 3b 0a 0a 69 6e 74 20  r *zName);..int 
4430: 73 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70 41  sqlite3Fts5DropA
4440: 6c 6c 28 46 74 73 35 43 6f 6e 66 69 67 2a 29 3b  ll(Fts5Config*);
4450: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4460: 43 72 65 61 74 65 54 61 62 6c 65 28 46 74 73 35  CreateTable(Fts5
4470: 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63  Config*, const c
4480: 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  har*, const char
4490: 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2a 29  *, int, char **)
44a0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
44b0: 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 28  s5StorageDelete(
44c0: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
44d0: 69 36 34 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  i64);.int sqlite
44e0: 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65  3Fts5StorageInse
44f0: 72 74 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  rt(Fts5Storage *
4500: 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  p, sqlite3_value
4510: 20 2a 2a 61 70 56 61 6c 2c 20 69 6e 74 2c 20 69   **apVal, int, i
4520: 36 34 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  64*);..int sqlit
4530: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74  e3Fts5StorageInt
4540: 65 67 72 69 74 79 28 46 74 73 35 53 74 6f 72 61  egrity(Fts5Stora
4550: 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c  ge *p);..int sql
4560: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
4570: 74 6d 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  tmt(Fts5Storage 
4580: 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20 73  *p, int eStmt, s
4590: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2a 2c 20 63  qlite3_stmt**, c
45a0: 68 61 72 2a 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  har**);.void sql
45b0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
45c0: 74 6d 74 52 65 6c 65 61 73 65 28 46 74 73 35 53  tmtRelease(Fts5S
45d0: 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 65  torage *p, int e
45e0: 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73 74  Stmt, sqlite3_st
45f0: 6d 74 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  mt*);..int sqlit
4600: 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 6f 63  e3Fts5StorageDoc
4610: 73 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65  size(Fts5Storage
4620: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
4630: 20 69 6e 74 20 2a 61 43 6f 6c 29 3b 0a 69 6e 74   int *aCol);.int
4640: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
4650: 61 67 65 53 69 7a 65 28 46 74 73 35 53 74 6f 72  ageSize(Fts5Stor
4660: 61 67 65 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  age *p, int iCol
4670: 2c 20 69 36 34 20 2a 70 6e 41 76 67 29 3b 0a 69  , i64 *pnAvg);.i
4680: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4690: 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28 46 74  orageRowCount(Ft
46a0: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 36  s5Storage *p, i6
46b0: 34 20 2a 70 6e 52 6f 77 29 3b 0a 0a 69 6e 74 20  4 *pnRow);..int 
46c0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
46d0: 67 65 53 79 6e 63 28 46 74 73 35 53 74 6f 72 61  geSync(Fts5Stora
46e0: 67 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d  ge *p, int bComm
46f0: 69 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  it);.int sqlite3
4700: 46 74 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c 62  Fts5StorageRollb
4710: 61 63 6b 28 46 74 73 35 53 74 6f 72 61 67 65 20  ack(Fts5Storage 
4720: 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  *p);..int sqlite
4730: 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 66  3Fts5StorageConf
4740: 69 67 56 61 6c 75 65 28 0a 20 20 20 20 46 74 73  igValue(.    Fts
4750: 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 63 6f 6e  5Storage *p, con
4760: 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65  st char*, sqlite
4770: 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 0a 29 3b  3_value*, int.);
4780: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
4790: 35 53 74 6f 72 61 67 65 53 70 65 63 69 61 6c 44  5StorageSpecialD
47a0: 65 6c 65 74 65 28 46 74 73 35 53 74 6f 72 61 67  elete(Fts5Storag
47b0: 65 20 2a 70 2c 20 69 36 34 20 69 44 65 6c 2c 20  e *p, i64 iDel, 
47c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
47d0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
47e0: 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 41  s5StorageDeleteA
47f0: 6c 6c 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ll(Fts5Storage *
4800: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
4810: 74 73 35 53 74 6f 72 61 67 65 52 65 62 75 69 6c  ts5StorageRebuil
4820: 64 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  d(Fts5Storage *p
4830: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4840: 73 35 53 74 6f 72 61 67 65 4f 70 74 69 6d 69 7a  s5StorageOptimiz
4850: 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  e(Fts5Storage *p
4860: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4870: 73 35 53 74 6f 72 61 67 65 4d 65 72 67 65 28 46  s5StorageMerge(F
4880: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
4890: 6e 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 2f 2a 0a  nt nMerge);../*.
48a0: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
48b0: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
48c0: 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 0a 2a  ts5_storage.c..*
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 2a 2a 2a 2a 2a  ****************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
4970: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
4980: 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 20 0a 2a   fts5_expr.c. .*
4990: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
49a0: 20 46 74 73 35 45 78 70 72 20 46 74 73 35 45 78   Fts5Expr Fts5Ex
49b0: 70 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  pr;.typedef stru
49c0: 63 74 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  ct Fts5ExprNode 
49d0: 46 74 73 35 45 78 70 72 4e 6f 64 65 3b 0a 74 79  Fts5ExprNode;.ty
49e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
49f0: 35 50 61 72 73 65 20 46 74 73 35 50 61 72 73 65  5Parse Fts5Parse
4a00: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
4a10: 20 46 74 73 35 54 6f 6b 65 6e 20 46 74 73 35 54   Fts5Token Fts5T
4a20: 6f 6b 65 6e 3b 0a 74 79 70 65 64 65 66 20 73 74  oken;.typedef st
4a30: 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68 72  ruct Fts5ExprPhr
4a40: 61 73 65 20 46 74 73 35 45 78 70 72 50 68 72 61  ase Fts5ExprPhra
4a50: 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  se;.typedef stru
4a60: 63 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  ct Fts5ExprNears
4a70: 65 74 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  et Fts5ExprNears
4a80: 65 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  et;.typedef stru
4a90: 63 74 20 46 74 73 35 45 78 70 72 43 6f 6c 73 65  ct Fts5ExprColse
4aa0: 74 20 46 74 73 35 45 78 70 72 43 6f 6c 73 65 74  t Fts5ExprColset
4ab0: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 54 6f  ;..struct Fts5To
4ac0: 6b 65 6e 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ken {.  const ch
4ad0: 61 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ar *p;          
4ae0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e          /* Token
4af0: 20 74 65 78 74 20 28 6e 6f 74 20 4e 55 4c 4c 20   text (not NULL 
4b00: 74 65 72 6d 69 6e 61 74 65 64 29 20 2a 2f 0a 20  terminated) */. 
4b10: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
4b40: 65 72 20 70 20 69 6e 20 62 79 74 65 73 20 2a 2f  er p in bytes */
4b50: 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20  .};../* Parse a 
4b60: 4d 41 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e  MATCH expression
4b70: 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  . */.int sqlite3
4b80: 46 74 73 35 45 78 70 72 4e 65 77 28 0a 20 20 46  Fts5ExprNew(.  F
4b90: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
4ba0: 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  ig, .  const cha
4bb0: 72 20 2a 7a 45 78 70 72 2c 0a 20 20 46 74 73 35  r *zExpr,.  Fts5
4bc0: 45 78 70 72 20 2a 2a 70 70 4e 65 77 2c 20 0a 20  Expr **ppNew, . 
4bd0: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 3b   char **pzErr.);
4be0: 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28 72 63 20 3d  ../*.** for(rc =
4bf0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
4c00: 46 69 72 73 74 28 70 45 78 70 72 2c 20 70 49 64  First(pExpr, pId
4c10: 78 2c 20 62 44 65 73 63 29 3b 0a 2a 2a 20 20 20  x, bDesc);.**   
4c20: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
4c30: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
4c40: 35 45 78 70 72 45 6f 66 28 70 45 78 70 72 29 3b  5ExprEof(pExpr);
4c50: 0a 2a 2a 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .**     rc = sql
4c60: 69 74 65 33 46 74 73 35 45 78 70 72 4e 65 78 74  ite3Fts5ExprNext
4c70: 28 70 45 78 70 72 29 0a 2a 2a 20 29 7b 0a 2a 2a  (pExpr).** ){.**
4c80: 20 20 20 2f 2f 20 54 68 65 20 64 6f 63 75 6d 65     // The docume
4c90: 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69 52  nt with rowid iR
4ca0: 6f 77 69 64 20 6d 61 74 63 68 65 73 20 74 68 65  owid matches the
4cb0: 20 65 78 70 72 65 73 73 69 6f 6e 21 0a 2a 2a 20   expression!.** 
4cc0: 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73    i64 iRowid = s
4cd0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 52 6f  qlite3Fts5ExprRo
4ce0: 77 69 64 28 70 45 78 70 72 29 3b 0a 2a 2a 20 7d  wid(pExpr);.** }
4cf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
4d00: 74 73 35 45 78 70 72 46 69 72 73 74 28 46 74 73  ts5ExprFirst(Fts
4d10: 35 45 78 70 72 2a 2c 20 46 74 73 35 49 6e 64 65  5Expr*, Fts5Inde
4d20: 78 20 2a 70 49 64 78 2c 20 69 36 34 20 69 4d 69  x *pIdx, i64 iMi
4d30: 6e 2c 20 69 6e 74 20 62 44 65 73 63 29 3b 0a 69  n, int bDesc);.i
4d40: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
4d50: 70 72 4e 65 78 74 28 46 74 73 35 45 78 70 72 2a  prNext(Fts5Expr*
4d60: 2c 20 69 36 34 20 69 4d 61 78 29 3b 0a 69 6e 74  , i64 iMax);.int
4d70: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
4d80: 45 6f 66 28 46 74 73 35 45 78 70 72 2a 29 3b 0a  Eof(Fts5Expr*);.
4d90: 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 45  i64 sqlite3Fts5E
4da0: 78 70 72 52 6f 77 69 64 28 46 74 73 35 45 78 70  xprRowid(Fts5Exp
4db0: 72 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74  r*);..void sqlit
4dc0: 65 33 46 74 73 35 45 78 70 72 46 72 65 65 28 46  e3Fts5ExprFree(F
4dd0: 74 73 35 45 78 70 72 2a 29 3b 0a 0a 2f 2a 20 43  ts5Expr*);../* C
4de0: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 73 74 61  alled during sta
4df0: 72 74 75 70 20 74 6f 20 72 65 67 69 73 74 65 72  rtup to register
4e00: 20 61 20 55 44 46 20 77 69 74 68 20 53 51 4c 69   a UDF with SQLi
4e10: 74 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  te */.int sqlite
4e20: 33 46 74 73 35 45 78 70 72 49 6e 69 74 28 46 74  3Fts5ExprInit(Ft
4e30: 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74  s5Global*, sqlit
4e40: 65 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  e3*);..int sqlit
4e50: 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65  e3Fts5ExprPhrase
4e60: 43 6f 75 6e 74 28 46 74 73 35 45 78 70 72 2a 29  Count(Fts5Expr*)
4e70: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4e80: 35 45 78 70 72 50 68 72 61 73 65 53 69 7a 65 28  5ExprPhraseSize(
4e90: 46 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 20 69  Fts5Expr*, int i
4ea0: 50 68 72 61 73 65 29 3b 0a 69 6e 74 20 73 71 6c  Phrase);.int sql
4eb0: 69 74 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c  ite3Fts5ExprPosl
4ec0: 69 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20 69  ist(Fts5Expr*, i
4ed0: 6e 74 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 29  nt, const u8 **)
4ee0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
4ef0: 73 35 45 78 70 72 43 6c 6f 6e 65 50 68 72 61 73  s5ExprClonePhras
4f00: 65 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46  e(Fts5Config*, F
4f10: 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20 46  ts5Expr*, int, F
4f20: 74 73 35 45 78 70 72 2a 2a 29 3b 0a 0a 2f 2a 2a  ts5Expr**);../**
4f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
4f60: 20 66 74 73 35 5f 65 78 70 72 2e 63 20 41 50 49   fts5_expr.c API
4f70: 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e   above this poin
4f80: 74 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  t is used by the
4f90: 20 6f 74 68 65 72 20 68 61 6e 64 2d 77 72 69 74   other hand-writ
4fa0: 74 65 6e 0a 2a 2a 20 43 20 63 6f 64 65 20 69 6e  ten.** C code in
4fb0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 20 54 68   this module. Th
4fc0: 65 20 69 6e 74 65 72 66 61 63 65 73 20 62 65 6c  e interfaces bel
4fd0: 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72  ow this point ar
4fe0: 65 20 63 61 6c 6c 65 64 20 62 79 0a 2a 2a 20 74  e called by.** t
4ff0: 68 65 20 70 61 72 73 65 72 20 63 6f 64 65 20 69  he parser code i
5000: 6e 20 66 74 73 35 70 61 72 73 65 2e 79 2e 20 20  n fts5parse.y.  
5010: 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */..void sqlite3
5020: 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 46  Fts5ParseError(F
5030: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
5040: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
5050: 6d 74 2c 20 2e 2e 2e 29 3b 0a 0a 46 74 73 35 45  mt, ...);..Fts5E
5060: 78 70 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65 33  xprNode *sqlite3
5070: 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28 0a 20  Fts5ParseNode(. 
5080: 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
5090: 73 65 2c 0a 20 20 69 6e 74 20 65 54 79 70 65 2c  se,.  int eType,
50a0: 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
50b0: 2a 70 4c 65 66 74 2c 0a 20 20 46 74 73 35 45 78  *pLeft,.  Fts5Ex
50c0: 70 72 4e 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a  prNode *pRight,.
50d0: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
50e0: 74 20 2a 70 4e 65 61 72 0a 29 3b 0a 0a 46 74 73  t *pNear.);..Fts
50f0: 35 45 78 70 72 50 68 72 61 73 65 20 2a 73 71 6c  5ExprPhrase *sql
5100: 69 74 65 33 46 74 73 35 50 61 72 73 65 54 65 72  ite3Fts5ParseTer
5110: 6d 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a  m(.  Fts5Parse *
5120: 70 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45  pParse, .  Fts5E
5130: 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61  xprPhrase *pPhra
5140: 73 65 2c 20 0a 20 20 46 74 73 35 54 6f 6b 65 6e  se, .  Fts5Token
5150: 20 2a 70 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20   *pToken,.  int 
5160: 62 50 72 65 66 69 78 0a 29 3b 0a 0a 46 74 73 35  bPrefix.);..Fts5
5170: 45 78 70 72 4e 65 61 72 73 65 74 20 2a 73 71 6c  ExprNearset *sql
5180: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61  ite3Fts5ParseNea
5190: 72 73 65 74 28 0a 20 20 46 74 73 35 50 61 72 73  rset(.  Fts5Pars
51a0: 65 2a 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e  e*, .  Fts5ExprN
51b0: 65 61 72 73 65 74 2a 2c 0a 20 20 46 74 73 35 45  earset*,.  Fts5E
51c0: 78 70 72 50 68 72 61 73 65 2a 20 0a 29 3b 0a 0a  xprPhrase* .);..
51d0: 46 74 73 35 45 78 70 72 43 6f 6c 73 65 74 20 2a  Fts5ExprColset *
51e0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
51f0: 43 6f 6c 73 65 74 28 0a 20 20 46 74 73 35 50 61  Colset(.  Fts5Pa
5200: 72 73 65 2a 2c 20 0a 20 20 46 74 73 35 45 78 70  rse*, .  Fts5Exp
5210: 72 43 6f 6c 73 65 74 2a 2c 20 0a 20 20 46 74 73  rColset*, .  Fts
5220: 35 54 6f 6b 65 6e 20 2a 0a 29 3b 0a 0a 76 6f 69  5Token *.);..voi
5230: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
5240: 73 65 50 68 72 61 73 65 46 72 65 65 28 46 74 73  sePhraseFree(Fts
5250: 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0a 76  5ExprPhrase*);.v
5260: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
5270: 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65 28  arseNearsetFree(
5280: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a  Fts5ExprNearset*
5290: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
52a0: 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65  ts5ParseNodeFree
52b0: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 3b  (Fts5ExprNode*);
52c0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
52d0: 73 35 50 61 72 73 65 53 65 74 44 69 73 74 61 6e  s5ParseSetDistan
52e0: 63 65 28 46 74 73 35 50 61 72 73 65 2a 2c 20 46  ce(Fts5Parse*, F
52f0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c  ts5ExprNearset*,
5300: 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a 76 6f   Fts5Token*);.vo
5310: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
5320: 72 73 65 53 65 74 43 6f 6c 73 65 74 28 46 74 73  rseSetColset(Fts
5330: 35 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78 70  5Parse*, Fts5Exp
5340: 72 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35 45  rNearset*, Fts5E
5350: 78 70 72 43 6f 6c 73 65 74 2a 29 3b 0a 76 6f 69  xprColset*);.voi
5360: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
5370: 73 65 46 69 6e 69 73 68 65 64 28 46 74 73 35 50  seFinished(Fts5P
5380: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74  arse *pParse, Ft
5390: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 29 3b 0a  s5ExprNode *p);.
53a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
53b0: 50 61 72 73 65 4e 65 61 72 28 46 74 73 35 50 61  ParseNear(Fts5Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73  rse *pParse, Fts
53d0: 35 54 6f 6b 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  5Token*);../*.**
53e0: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
53f0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
5400: 35 5f 65 78 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  5_expr.c..******
5410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5450: 2a 2a 2a 2a 2f 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ****/..../******
5460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
54a0: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
54b0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
54c0: 35 5f 61 75 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e  5_aux.c. .*/..in
54d0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 41 75 78  t sqlite3Fts5Aux
54e0: 49 6e 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b  Init(fts5_api*);
54f0: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
5500: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
5510: 69 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 0a 2a  in fts5_aux.c..*
5520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
5570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55b0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  *******.** Inter
55c0: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
55d0: 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63  fts5_tokenizer.c
55e0: 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74  . .*/..int sqlit
55f0: 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49  e3Fts5TokenizerI
5600: 6e 69 74 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a  nit(fts5_api*);.
5610: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74  /*.** End of int
5620: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
5630: 6e 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72  n fts5_tokenizer
5640: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
5650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
5690: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
56a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
56e0: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
56f0: 65 20 69 6e 20 66 74 73 35 5f 76 6f 63 61 62 2e  e in fts5_vocab.
5700: 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69  c. .*/..int sqli
5710: 74 65 33 46 74 73 35 56 6f 63 61 62 49 6e 69 74  te3Fts5VocabInit
5720: 28 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71  (Fts5Global*, sq
5730: 6c 69 74 65 33 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  lite3*);../*.** 
5740: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
5750: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
5760: 5f 76 6f 63 61 62 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  _vocab.c..******
5770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
57c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5800: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
5810: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
5820: 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  y generated code
5830: 20 69 6e 20 66 74 73 35 5f 75 6e 69 63 6f 64 65   in fts5_unicode
5840: 32 2e 63 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  2.c. .*/.int sql
5850: 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65 49  ite3Fts5UnicodeI
5860: 73 61 6c 6e 75 6d 28 69 6e 74 20 63 29 3b 0a 69  salnum(int c);.i
5870: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e  nt sqlite3Fts5Un
5880: 69 63 6f 64 65 49 73 64 69 61 63 72 69 74 69 63  icodeIsdiacritic
5890: 28 69 6e 74 20 63 29 3b 0a 69 6e 74 20 73 71 6c  (int c);.int sql
58a0: 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65 46  ite3Fts5UnicodeF
58b0: 6f 6c 64 28 69 6e 74 20 63 2c 20 69 6e 74 20 62  old(int c, int b
58c0: 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 29  RemoveDiacritic)
58d0: 3b 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ;./*.** End of i
58e0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
58f0: 20 69 6e 20 66 74 73 35 5f 75 6e 69 63 6f 64 65   in fts5_unicode
5900: 32 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  2.c..***********
5910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
5950: 0a 0a 23 65 6e 64 69 66 0a                       ..#endif.