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

Artifact fc3edf2538551c5bdb02885c517483d604394d3c:


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 49 6e 74 2e 68 22 0a 0a 0a 2f 2a  qliteInt.h".../*
01d0: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62  .** Maximum numb
01e0: 65 72 20 6f 66 20 70 72 65 66 69 78 20 69 6e 64  er of prefix ind
01f0: 65 78 65 73 20 6f 6e 20 73 69 6e 67 6c 65 20 46  exes on single F
0200: 54 53 35 20 74 61 62 6c 65 2e 20 54 68 69 73 20  TS5 table. This 
0210: 6d 75 73 74 20 62 65 0a 2a 2a 20 6c 65 73 73 20  must be.** less 
0220: 74 68 61 6e 20 33 32 2e 20 49 66 20 69 74 20 69  than 32. If it i
0230: 73 20 73 65 74 20 74 6f 20 61 6e 79 74 68 69 6e  s set to anythin
0240: 67 20 6c 61 72 67 65 20 74 68 61 6e 20 74 68 61  g large than tha
0250: 74 2c 20 61 6e 20 23 65 72 72 6f 72 0a 2a 2a 20  t, an #error.** 
0260: 64 69 72 65 63 74 69 76 65 20 69 6e 20 66 74 73  directive in fts
0270: 35 5f 69 6e 64 65 78 2e 63 20 77 69 6c 6c 20 63  5_index.c will c
0280: 61 75 73 65 20 74 68 65 20 62 75 69 6c 64 20 74  ause the build t
0290: 6f 20 66 61 69 6c 2e 0a 2a 2f 0a 23 64 65 66 69  o fail..*/.#defi
02a0: 6e 65 20 46 54 53 35 5f 4d 41 58 5f 50 52 45 46  ne FTS5_MAX_PREF
02b0: 49 58 5f 49 4e 44 45 58 45 53 20 33 31 0a 0a 23  IX_INDEXES 31..#
02c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46 41  define FTS5_DEFA
02d0: 55 4c 54 5f 4e 45 41 52 44 49 53 54 20 31 30 0a  ULT_NEARDIST 10.
02e0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 45 46  #define FTS5_DEF
02f0: 41 55 4c 54 5f 52 41 4e 4b 20 20 20 20 20 22 62  AULT_RANK     "b
0300: 6d 32 35 22 0a 0a 2f 2a 20 4e 61 6d 65 20 6f 66  m25"../* Name of
0310: 20 72 61 6e 6b 20 61 6e 64 20 72 6f 77 69 64 20   rank and rowid 
0320: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69  columns */.#defi
0330: 6e 65 20 46 54 53 35 5f 52 41 4e 4b 5f 4e 41 4d  ne FTS5_RANK_NAM
0340: 45 20 22 72 61 6e 6b 22 0a 23 64 65 66 69 6e 65  E "rank".#define
0350: 20 46 54 53 35 5f 52 4f 57 49 44 5f 4e 41 4d 45   FTS5_ROWID_NAME
0360: 20 22 72 6f 77 69 64 22 0a 0a 23 69 66 64 65 66   "rowid"..#ifdef
0370: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23 20   SQLITE_DEBUG.# 
0380: 64 65 66 69 6e 65 20 46 54 53 35 5f 43 4f 52 52  define FTS5_CORR
0390: 55 50 54 20 73 71 6c 69 74 65 33 46 74 73 35 43  UPT sqlite3Fts5C
03a0: 6f 72 72 75 70 74 28 29 0a 69 6e 74 20 73 71 6c  orrupt().int sql
03b0: 69 74 65 33 46 74 73 35 43 6f 72 72 75 70 74 28  ite3Fts5Corrupt(
03c0: 76 6f 69 64 29 3b 0a 23 65 6c 73 65 0a 23 20 64  void);.#else.# d
03d0: 65 66 69 6e 65 20 46 54 53 35 5f 43 4f 52 52 55  efine FTS5_CORRU
03e0: 50 54 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  PT SQLITE_CORRUP
03f0: 54 5f 56 54 41 42 0a 23 65 6e 64 69 66 0a 0a 2f  T_VTAB.#endif../
0400: 2a 0a 2a 2a 20 54 68 65 20 61 73 73 65 72 74 5f  *.** The assert_
0410: 6e 63 28 29 20 6d 61 63 72 6f 20 69 73 20 73 69  nc() macro is si
0420: 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 61 73 73  milar to the ass
0430: 65 72 74 28 29 20 6d 61 63 72 6f 2c 20 65 78 63  ert() macro, exc
0440: 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 69  ept that it.** i
0450: 73 20 75 73 65 64 20 66 6f 72 20 61 73 73 65 72  s used for asser
0460: 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  t() conditions t
0470: 68 61 74 20 61 72 65 20 74 72 75 65 20 6f 6e 6c  hat are true onl
0480: 79 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 0a  y if it can be .
0490: 2a 2a 20 67 75 72 61 6e 74 65 65 64 20 74 68 61  ** guranteed tha
04a0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
04b0: 73 20 6e 6f 74 20 63 6f 72 72 75 70 74 2e 0a 2a  s not corrupt..*
04c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
04d0: 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
04e0: 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 6d 61 79  sqlite3_fts5_may
04f0: 5f 62 65 5f 63 6f 72 72 75 70 74 3b 0a 23 20 64  _be_corrupt;.# d
0500: 65 66 69 6e 65 20 61 73 73 65 72 74 5f 6e 63 28  efine assert_nc(
0510: 78 29 20 61 73 73 65 72 74 28 73 71 6c 69 74 65  x) assert(sqlite
0520: 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63 6f  3_fts5_may_be_co
0530: 72 72 75 70 74 20 7c 7c 20 28 78 29 29 0a 23 65  rrupt || (x)).#e
0540: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
0550: 65 72 74 5f 6e 63 28 78 29 20 61 73 73 65 72 74  ert_nc(x) assert
0560: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65  (x).#endif..type
0570: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 47  def struct Fts5G
0580: 6c 6f 62 61 6c 20 46 74 73 35 47 6c 6f 62 61 6c  lobal Fts5Global
0590: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
05a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
05e0: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63  * Interface to c
05f0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 63 6f 6e 66  ode in fts5_conf
0600: 69 67 2e 63 2e 20 66 74 73 35 5f 63 6f 6e 66 69  ig.c. fts5_confi
0610: 67 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e  g.c contains con
0620: 74 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f  tains code.** to
0630: 20 70 61 72 73 65 20 74 68 65 20 61 72 67 75 6d   parse the argum
0640: 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74  ents passed to t
0650: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
0660: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
0670: 74 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73  t..*/..typedef s
0680: 74 72 75 63 74 20 46 74 73 35 43 6f 6e 66 69 67  truct Fts5Config
0690: 20 46 74 73 35 43 6f 6e 66 69 67 3b 0a 0a 2f 2a   Fts5Config;../*
06a0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
06b0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
06c0: 20 73 74 72 75 63 74 75 72 65 20 65 6e 63 6f 64   structure encod
06d0: 65 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  es all informati
06e0: 6f 6e 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  on that can.** b
06f0: 65 20 67 6c 65 61 6e 65 64 20 66 72 6f 6d 20 74  e gleaned from t
0700: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
0710: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
0720: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 64 20 61 6c 6c  t..**.** And all
0730: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 6f 61   information loa
0740: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 63  ded from the %_c
0750: 6f 6e 66 69 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a  onfig table..**.
0760: 2a 2a 20 6e 41 75 74 6f 6d 65 72 67 65 3a 0a 2a  ** nAutomerge:.*
0770: 2a 20 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  *   The minimum 
0780: 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
0790: 74 73 20 74 68 61 74 20 61 6e 20 61 75 74 6f 2d  ts that an auto-
07a0: 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20  merge operation 
07b0: 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 61 74 74 65  should.**   atte
07c0: 6d 70 74 20 74 6f 20 6d 65 72 67 65 20 74 6f 67  mpt to merge tog
07d0: 65 74 68 65 72 2e 20 41 20 76 61 6c 75 65 20 6f  ether. A value o
07e0: 66 20 31 20 73 65 74 73 20 74 68 65 20 6f 62 6a  f 1 sets the obj
07f0: 65 63 74 20 74 6f 20 75 73 65 20 74 68 65 20 0a  ect to use the .
0800: 2a 2a 20 20 20 63 6f 6d 70 69 6c 65 20 74 69 6d  **   compile tim
0810: 65 20 64 65 66 61 75 6c 74 2e 20 5a 65 72 6f 20  e default. Zero 
0820: 64 69 73 61 62 6c 65 73 20 61 75 74 6f 2d 6d 65  disables auto-me
0830: 72 67 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a  rge altogether..
0840: 2a 2a 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 3a 0a  **.** zContent:.
0850: 2a 2a 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 52 6f  **.** zContentRo
0860: 77 69 64 3a 0a 2a 2a 20 20 20 54 68 65 20 76 61  wid:.**   The va
0870: 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  lue of the conte
0880: 6e 74 5f 72 6f 77 69 64 3d 20 6f 70 74 69 6f 6e  nt_rowid= option
0890: 2c 20 69 66 20 6f 6e 65 20 77 61 73 20 73 70 65  , if one was spe
08a0: 63 69 66 69 65 64 2e 20 4f 72 20 0a 2a 2a 20 20  cified. Or .**  
08b0: 20 74 68 65 20 73 74 72 69 6e 67 20 22 72 6f 77   the string "row
08c0: 69 64 22 20 6f 74 68 65 72 77 69 73 65 2e 20 54  id" otherwise. T
08d0: 68 69 73 20 74 65 78 74 20 69 73 20 6e 6f 74 20  his text is not 
08e0: 71 75 6f 74 65 64 20 2d 20 69 66 20 69 74 20 69  quoted - if it i
08f0: 73 0a 2a 2a 20 20 20 75 73 65 64 20 61 73 20 70  s.**   used as p
0900: 61 72 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74  art of an SQL st
0910: 61 74 65 6d 65 6e 74 20 69 74 20 6e 65 65 64 73  atement it needs
0920: 20 74 6f 20 62 65 20 71 75 6f 74 65 64 20 61 70   to be quoted ap
0930: 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2a 0a  propriately..**.
0940: 2a 2a 20 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c  ** zContentExprl
0950: 69 73 74 3a 0a 2a 2a 0a 2a 2a 20 70 7a 45 72 72  ist:.**.** pzErr
0960: 6d 73 67 3a 0a 2a 2a 20 20 20 54 68 69 73 20 65  msg:.**   This e
0970: 78 69 73 74 73 20 69 6e 20 6f 72 64 65 72 20 74  xists in order t
0980: 6f 20 61 6c 6c 6f 77 20 74 68 65 20 66 74 73 35  o allow the fts5
0990: 5f 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c 65 20  _index.c module 
09a0: 74 6f 20 72 65 74 75 72 6e 20 61 20 0a 2a 2a 20  to return a .** 
09b0: 20 20 64 65 63 65 6e 74 20 65 72 72 6f 72 20 6d    decent error m
09c0: 65 73 73 61 67 65 20 69 66 20 69 74 20 65 6e 63  essage if it enc
09d0: 6f 75 6e 74 65 72 73 20 61 20 66 69 6c 65 2d 66  ounters a file-f
09e0: 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 69 74  ormat version it
09f0: 20 64 6f 65 73 0a 2a 2a 20 20 20 6e 6f 74 20 75   does.**   not u
0a00: 6e 64 65 72 73 74 61 6e 64 2e 0a 2a 2a 0a 2a 2f  nderstand..**.*/
0a10: 0a 73 74 72 75 63 74 20 46 74 73 35 43 6f 6e 66  .struct Fts5Conf
0a20: 69 67 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ig {.  sqlite3 *
0a30: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
0a40: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
0a50: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
0a60: 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0a80: 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
0a90: 6e 67 20 46 54 53 20 69 6e 64 65 78 20 28 65 2e  ng FTS index (e.
0aa0: 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20  g. "main") */.  
0ab0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 46 54 53 20 69  /* Name of FTS i
0ae0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ndex */.  int nC
0af0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0b10: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
0b20: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  /.  char **azCol
0b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0b40: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
0b50: 6d 65 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 55  mes */.  u8 *abU
0b60: 6e 69 6e 64 65 78 65 64 3b 20 20 20 20 20 20 20  nindexed;       
0b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0b80: 20 66 6f 72 20 75 6e 69 6e 64 65 78 65 64 20 63   for unindexed c
0b90: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
0ba0: 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  nPrefix;        
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0bc0: 75 6d 62 65 72 20 6f 66 20 70 72 65 66 69 78 20  umber of prefix 
0bd0: 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74  indexes */.  int
0be0: 20 2a 61 50 72 65 66 69 78 3b 20 20 20 20 20 20   *aPrefix;      
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0c00: 53 69 7a 65 73 20 69 6e 20 62 79 74 65 73 20 6f  Sizes in bytes o
0c10: 66 20 6e 50 72 65 66 69 78 20 70 72 65 66 69 78  f nPrefix prefix
0c20: 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e   indexes */.  in
0c30: 74 20 65 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20  t eContent;     
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c50: 20 41 6e 20 46 54 53 35 5f 43 4f 4e 54 45 4e 54   An FTS5_CONTENT
0c60: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72   value */.  char
0c70: 20 2a 7a 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20   *zContent;     
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
0c90: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 20  ontent table */ 
0ca0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e  .  char *zConten
0cb0: 74 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  tRowid;         
0cc0: 20 20 20 2f 2a 20 22 63 6f 6e 74 65 6e 74 5f 72     /* "content_r
0cd0: 6f 77 69 64 3d 22 20 6f 70 74 69 6f 6e 20 76 61  owid=" option va
0ce0: 6c 75 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a  lue */ .  char *
0cf0: 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73 74  zContentExprlist
0d00: 3b 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ;.  Fts5Tokenize
0d10: 72 20 2a 70 54 6f 6b 3b 0a 20 20 66 74 73 35 5f  r *pTok;.  fts5_
0d20: 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 41  tokenizer *pTokA
0d30: 70 69 3b 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73  pi;..  /* Values
0d40: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65   loaded from the
0d50: 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65 20   %_config table 
0d60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  */.  int iCookie
0d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0d80: 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
0d90: 74 65 64 20 77 68 65 6e 20 25 5f 63 6f 6e 66 69  ted when %_confi
0da0: 67 20 69 73 20 6d 6f 64 69 66 69 65 64 20 2a 2f  g is modified */
0db0: 0a 20 20 69 6e 74 20 70 67 73 7a 3b 20 20 20 20  .  int pgsz;    
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 20 20 20 2f 2a 20 41 70 70 72 6f 78 69 6d 61 74     /* Approximat
0de0: 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  e page size used
0df0: 20 69 6e 20 25 5f 64 61 74 61 20 2a 2f 0a 20 20   in %_data */.  
0e00: 69 6e 74 20 6e 41 75 74 6f 6d 65 72 67 65 3b 20  int nAutomerge; 
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 2f 2a 20 27 61 75 74 6f 6d 65 72 67 65 27 20 73  /* 'automerge' s
0e30: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  etting */.  int 
0e40: 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 20 20 20  nCrisisMerge;   
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
0e60: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
0e70: 65 67 6d 65 6e 74 73 20 70 65 72 20 6c 65 76 65  egments per leve
0e80: 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 61  l */.  char *zRa
0e90: 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nk;             
0ea0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0eb0: 66 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20  f rank function 
0ec0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b  */.  char *zRank
0ed0: 41 72 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  Args;           
0ee0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
0ef0: 73 20 74 6f 20 72 61 6e 6b 20 66 75 6e 63 74 69  s to rank functi
0f00: 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e  on */..  /* If n
0f10: 6f 6e 2d 4e 55 4c 4c 2c 20 70 6f 69 6e 74 73 20  on-NULL, points 
0f20: 74 6f 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  to sqlite3_vtab.
0f30: 62 61 73 65 2e 7a 45 72 72 6d 73 67 2e 20 4f 66  base.zErrmsg. Of
0f40: 74 65 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 63  ten NULL. */.  c
0f50: 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 3b 0a  har **pzErrmsg;.
0f60: 7d 3b 0a 0a 2f 2a 20 43 75 72 72 65 6e 74 20 65  };../* Current e
0f70: 78 70 65 63 74 65 64 20 76 61 6c 75 65 20 6f 66  xpected value of
0f80: 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65 20   %_config table 
0f90: 27 76 65 72 73 69 6f 6e 27 20 66 69 65 6c 64 20  'version' field 
0fa0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
0fb0: 43 55 52 52 45 4e 54 5f 56 45 52 53 49 4f 4e 20  CURRENT_VERSION 
0fc0: 31 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  1..#define FTS5_
0fd0: 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 20  CONTENT_NORMAL  
0fe0: 20 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f   0.#define FTS5_
0ff0: 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20 20 20 20  CONTENT_NONE    
1000: 20 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f   1.#define FTS5_
1010: 43 4f 4e 54 45 4e 54 5f 45 58 54 45 52 4e 41 4c  CONTENT_EXTERNAL
1020: 20 32 0a 0a 0a 0a 0a 69 6e 74 20 73 71 6c 69 74   2.....int sqlit
1030: 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73  e3Fts5ConfigPars
1040: 65 28 0a 20 20 20 20 46 74 73 35 47 6c 6f 62 61  e(.    Fts5Globa
1050: 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 69 6e  l*, sqlite3*, in
1060: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  t, const char **
1070: 2c 20 46 74 73 35 43 6f 6e 66 69 67 2a 2a 2c 20  , Fts5Config**, 
1080: 63 68 61 72 2a 2a 0a 29 3b 0a 76 6f 69 64 20 73  char**.);.void s
1090: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
10a0: 46 72 65 65 28 46 74 73 35 43 6f 6e 66 69 67 2a  Free(Fts5Config*
10b0: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
10c0: 74 73 35 43 6f 6e 66 69 67 44 65 63 6c 61 72 65  ts5ConfigDeclare
10d0: 56 74 61 62 28 46 74 73 35 43 6f 6e 66 69 67 20  Vtab(Fts5Config 
10e0: 2a 70 43 6f 6e 66 69 67 29 3b 0a 0a 69 6e 74 20  *pConfig);..int 
10f0: 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e  sqlite3Fts5Token
1100: 69 7a 65 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  ize(.  Fts5Confi
1110: 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20  g *pConfig,     
1120: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43         /* FTS5 C
1130: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
1140: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
1150: 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74 20  har *pText, int 
1160: 6e 54 65 78 74 2c 20 20 20 2f 2a 20 54 65 78 74  nText,   /* Text
1170: 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a   to tokenize */.
1180: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61 73    /* Context pas
11b0: 73 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29 20  sed to xToken() 
11c0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65  */.  int (*xToke
11d0: 6e 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20  n)(void*, const 
11e0: 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c  char*, int, int,
11f0: 20 69 6e 74 29 20 20 20 20 2f 2a 20 43 61 6c 6c   int)    /* Call
1200: 62 61 63 6b 20 2a 2f 0a 29 3b 0a 0a 76 6f 69 64  back */.);..void
1210: 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71 75   sqlite3Fts5Dequ
1220: 6f 74 65 28 63 68 61 72 20 2a 7a 29 3b 0a 0a 2f  ote(char *z);../
1230: 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65  * Load the conte
1240: 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e  nts of the %_con
1250: 66 69 67 20 74 61 62 6c 65 20 2a 2f 0a 69 6e 74  fig table */.int
1260: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
1270: 69 67 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66 69  igLoad(Fts5Confi
1280: 67 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 53 65  g*, int);../* Se
1290: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  t the value of a
12a0: 20 73 69 6e 67 6c 65 20 63 6f 6e 66 69 67 20 61   single config a
12b0: 74 74 72 69 62 75 74 65 20 2a 2f 0a 69 6e 74 20  ttribute */.int 
12c0: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
12d0: 67 53 65 74 56 61 6c 75 65 28 46 74 73 35 43 6f  gSetValue(Fts5Co
12e0: 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61  nfig*, const cha
12f0: 72 2a 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r*, sqlite3_valu
1300: 65 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 69 6e 74 20  e*, int*);..int 
1310: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
1320: 67 50 61 72 73 65 52 61 6e 6b 28 63 6f 6e 73 74  gParseRank(const
1330: 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 2a 2c 20   char*, char**, 
1340: 63 68 61 72 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char**);../*.** 
1350: 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65  End of interface
1360: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
1370: 5f 63 6f 6e 66 69 67 2e 63 2e 0a 2a 2a 2a 2a 2a  _config.c..*****
1380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c0: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
13d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1410: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
1420: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
1430: 5f 62 75 66 66 65 72 2e 63 2e 0a 2a 2f 0a 0a 2f  _buffer.c..*/../
1440: 2a 0a 2a 2a 20 42 75 66 66 65 72 20 6f 62 6a 65  *.** Buffer obje
1450: 63 74 20 66 6f 72 20 74 68 65 20 69 6e 63 72 65  ct for the incre
1460: 6d 65 6e 74 61 6c 20 62 75 69 6c 64 69 6e 67 20  mental building 
1470: 6f 66 20 73 74 72 69 6e 67 20 64 61 74 61 2e 0a  of string data..
1480: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1490: 74 20 46 74 73 35 42 75 66 66 65 72 20 46 74 73  t Fts5Buffer Fts
14a0: 35 42 75 66 66 65 72 3b 0a 73 74 72 75 63 74 20  5Buffer;.struct 
14b0: 46 74 73 35 42 75 66 66 65 72 20 7b 0a 20 20 75  Fts5Buffer {.  u
14c0: 38 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  8 *p;.  int n;. 
14d0: 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 7d 3b 0a   int nSpace;.};.
14e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
14f0: 42 75 66 66 65 72 47 72 6f 77 28 69 6e 74 2a 2c  BufferGrow(int*,
1500: 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69 6e   Fts5Buffer*, in
1510: 74 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  t);.void sqlite3
1520: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1530: 56 61 72 69 6e 74 28 69 6e 74 2a 2c 20 46 74 73  Varint(int*, Fts
1540: 35 42 75 66 66 65 72 2a 2c 20 69 36 34 29 3b 0a  5Buffer*, i64);.
1550: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
1560: 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1570: 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66 65  (int*, Fts5Buffe
1580: 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75  r*, int, const u
1590: 38 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  8*);.void sqlite
15a0: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
15b0: 64 53 74 72 69 6e 67 28 69 6e 74 20 2a 2c 20 46  dString(int *, F
15c0: 74 73 35 42 75 66 66 65 72 2a 2c 20 63 6f 6e 73  ts5Buffer*, cons
15d0: 74 20 63 68 61 72 2a 29 3b 0a 76 6f 69 64 20 73  t char*);.void s
15e0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
15f0: 46 72 65 65 28 46 74 73 35 42 75 66 66 65 72 2a  Free(Fts5Buffer*
1600: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
1610: 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 46 74  ts5BufferZero(Ft
1620: 73 35 42 75 66 66 65 72 2a 29 3b 0a 76 6f 69 64  s5Buffer*);.void
1630: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1640: 65 72 53 65 74 28 69 6e 74 2a 2c 20 46 74 73 35  erSet(int*, Fts5
1650: 42 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63 6f  Buffer*, int, co
1660: 6e 73 74 20 75 38 2a 29 3b 0a 76 6f 69 64 20 73  nst u8*);.void s
1670: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1680: 41 70 70 65 6e 64 50 72 69 6e 74 66 28 69 6e 74  AppendPrintf(int
1690: 20 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c   *, Fts5Buffer*,
16a0: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
16b0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
16c0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 33  ts5BufferAppend3
16d0: 32 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66  2(int*, Fts5Buff
16e0: 65 72 2a 2c 20 69 6e 74 29 3b 0a 0a 23 64 65 66  er*, int);..#def
16f0: 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 5a 65  ine fts5BufferZe
1700: 72 6f 28 78 29 20 20 20 20 20 20 20 20 20 20 20  ro(x)           
1710: 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1720: 66 65 72 5a 65 72 6f 28 78 29 0a 23 64 65 66 69  ferZero(x).#defi
1730: 6e 65 20 66 74 73 35 42 75 66 66 65 72 47 72 6f  ne fts5BufferGro
1740: 77 28 61 2c 62 2c 63 29 20 20 20 20 20 20 20 20  w(a,b,c)        
1750: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1760: 65 72 47 72 6f 77 28 61 2c 62 2c 63 29 0a 23 64  erGrow(a,b,c).#d
1770: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
1780: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 61 2c 62  AppendVarint(a,b
1790: 2c 63 29 20 73 71 6c 69 74 65 33 46 74 73 35 42  ,c) sqlite3Fts5B
17a0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
17b0: 74 28 61 2c 62 2c 63 29 0a 23 64 65 66 69 6e 65  t(a,b,c).#define
17c0: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
17d0: 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20 73  a)             s
17e0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
17f0: 46 72 65 65 28 61 29 0a 23 64 65 66 69 6e 65 20  Free(a).#define 
1800: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1810: 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20 73 71  Blob(a,b,c,d) sq
1820: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1830: 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c 63 2c  ppendBlob(a,b,c,
1840: 64 29 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42  d).#define fts5B
1850: 75 66 66 65 72 53 65 74 28 61 2c 62 2c 63 2c 64  ufferSet(a,b,c,d
1860: 29 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  )        sqlite3
1870: 46 74 73 35 42 75 66 66 65 72 53 65 74 28 61 2c  Fts5BufferSet(a,
1880: 62 2c 63 2c 64 29 0a 23 64 65 66 69 6e 65 20 66  b,c,d).#define f
1890: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 33  ts5BufferAppend3
18a0: 32 28 61 2c 62 2c 63 29 20 20 20 20 20 73 71 6c  2(a,b,c)     sql
18b0: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
18c0: 70 65 6e 64 33 32 28 61 2c 62 2c 63 29 0a 0a 2f  pend32(a,b,c)../
18d0: 2a 20 57 72 69 74 65 20 61 6e 64 20 64 65 63 6f  * Write and deco
18e0: 64 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32  de big-endian 32
18f0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
1900: 75 65 73 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ues */.void sqli
1910: 74 65 33 46 74 73 35 50 75 74 33 32 28 75 38 2a  te3Fts5Put32(u8*
1920: 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69  , int);.int sqli
1930: 74 65 33 46 74 73 35 47 65 74 33 32 28 63 6f 6e  te3Fts5Get32(con
1940: 73 74 20 75 38 2a 29 3b 0a 0a 23 64 65 66 69 6e  st u8*);..#defin
1950: 65 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  e FTS5_POS2COLUM
1960: 4e 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69 50  N(iPos) (int)(iP
1970: 6f 73 20 3e 3e 20 33 32 29 0a 23 64 65 66 69 6e  os >> 32).#defin
1980: 65 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45  e FTS5_POS2OFFSE
1990: 54 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69 50  T(iPos) (int)(iP
19a0: 6f 73 20 26 20 30 78 46 46 46 46 46 46 46 46 29  os & 0xFFFFFFFF)
19b0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
19c0: 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
19d0: 65 72 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65  er Fts5PoslistRe
19e0: 61 64 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73  ader;.struct Fts
19f0: 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 7b  5PoslistReader {
1a00: 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20  .  /* Variables 
1a10: 75 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 71 6c  used only by sql
1a20: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 49  ite3Fts5PoslistI
1a30: 74 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f  terXXX() functio
1a40: 6e 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ns. */.  int iCo
1a50: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 28           /* If (
1a70: 69 43 6f 6c 3e 3d 30 29 2c 20 74 68 69 73 20 63  iCol>=0), this c
1a80: 6f 6c 75 6d 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20  olumn only */.  
1a90: 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20 20 20  const u8 *a;    
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74  /* Position list
1ac0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1ad0: 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ugh */.  int n; 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b00: 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 61 5b   of buffer at a[
1b10: 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
1b20: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  /* Current offse
1b50: 74 20 69 6e 20 61 5b 5d 20 2a 2f 0a 0a 20 20 2f  t in a[] */..  /
1b60: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
1b70: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66  es */.  int bEof
1b80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
1ba0: 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  o true at EOF */
1bb0: 0a 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20 20  .  i64 iPos;    
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33 32 29     /* (iCol<<32)
1be0: 20 2b 20 69 50 6f 73 20 2a 2f 0a 7d 3b 0a 69 6e   + iPos */.};.in
1bf0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  t sqlite3Fts5Pos
1c00: 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 0a  listReaderInit(.
1c10: 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 2f 2a 20 49 66 20 28 69 43 6f 6c 3e 3d 30    /* If (iCol>=0
1c40: 29 2c 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f  ), this column o
1c50: 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nly */.  const u
1c60: 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20  8 *a, int n,    
1c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c           /* Posl
1c80: 69 73 74 20 62 75 66 66 65 72 20 74 6f 20 69 74  ist buffer to it
1c90: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
1ca0: 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65  .  Fts5PoslistRe
1cb0: 61 64 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  ader *pIter     
1cc0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f     /* Iterator o
1cd0: 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c  bject to initial
1ce0: 69 7a 65 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71  ize */.);.int sq
1cf0: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1d00: 52 65 61 64 65 72 4e 65 78 74 28 46 74 73 35 50  ReaderNext(Fts5P
1d10: 6f 73 6c 69 73 74 52 65 61 64 65 72 2a 29 3b 0a  oslistReader*);.
1d20: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1d30: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
1d40: 72 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69  r Fts5PoslistWri
1d50: 74 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35  ter;.struct Fts5
1d60: 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 7b 0a  PoslistWriter {.
1d70: 20 20 69 36 34 20 69 50 72 65 76 3b 0a 7d 3b 0a    i64 iPrev;.};.
1d80: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
1d90: 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65  oslistWriterAppe
1da0: 6e 64 28 46 74 73 35 42 75 66 66 65 72 2a 2c 20  nd(Fts5Buffer*, 
1db0: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
1dc0: 72 2a 2c 20 69 36 34 29 3b 0a 0a 69 6e 74 20 73  r*, i64);..int s
1dd0: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1de0: 74 4e 65 78 74 36 34 28 0a 20 20 63 6f 6e 73 74  tNext64(.  const
1df0: 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20   u8 *a, int n,  
1e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1e10: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1e20: 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  poslist */.  int
1e30: 20 2a 70 69 2c 20 20 20 20 20 20 20 20 20 20 20   *pi,           
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e50: 49 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20 77  IN/OUT: Offset w
1e60: 69 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69  ithin a[] */.  i
1e70: 36 34 20 2a 70 69 4f 66 66 20 20 20 20 20 20 20  64 *piOff       
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e90: 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
1ea0: 74 20 6f 66 66 73 65 74 20 2a 2f 0a 29 3b 0a 0a  t offset */.);..
1eb0: 2f 2a 20 4d 61 6c 6c 6f 63 20 75 74 69 6c 69 74  /* Malloc utilit
1ec0: 79 20 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  y */.void *sqlit
1ed0: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1ee0: 28 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74 20 6e  (int *pRc, int n
1ef0: 42 79 74 65 29 3b 0a 63 68 61 72 20 2a 73 71 6c  Byte);.char *sql
1f00: 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28  ite3Fts5Strndup(
1f10: 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20  int *pRc, const 
1f20: 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e  char *pIn, int n
1f30: 49 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  In);../*.** End 
1f40: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
1f50: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 62 75 66  code in fts5_buf
1f60: 66 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  fer.c..*********
1f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fb0: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
1fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2000: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
2010: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 69 6e 64  code in fts5_ind
2020: 65 78 2e 63 2e 20 66 74 73 35 5f 69 6e 64 65 78  ex.c. fts5_index
2030: 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74  .c contains cont
2040: 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f 20  ains code.** to 
2050: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 20  access the data 
2060: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f  stored in the %_
2070: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  data table..*/..
2080: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2090: 74 73 35 49 6e 64 65 78 20 46 74 73 35 49 6e 64  ts5Index Fts5Ind
20a0: 65 78 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ex;.typedef stru
20b0: 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ct Fts5IndexIter
20c0: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 3b 0a   Fts5IndexIter;.
20d0: 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 75 73  ./*.** Values us
20e0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
20f0: 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
2100: 20 70 61 73 73 65 64 20 74 6f 20 49 6e 64 65 78   passed to Index
2110: 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 23 64 65 66  Query()..*/.#def
2120: 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  ine FTS5INDEX_QU
2130: 45 52 59 5f 50 52 45 46 49 58 20 20 20 20 20 30  ERY_PREFIX     0
2140: 78 30 30 30 31 20 20 20 2f 2a 20 50 72 65 66 69  x0001   /* Prefi
2150: 78 20 71 75 65 72 79 20 2a 2f 0a 23 64 65 66 69  x query */.#defi
2160: 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  ne FTS5INDEX_QUE
2170: 52 59 5f 44 45 53 43 20 20 20 20 20 20 20 30 78  RY_DESC       0x
2180: 30 30 30 32 20 20 20 2f 2a 20 44 6f 63 73 20 69  0002   /* Docs i
2190: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  n descending row
21a0: 69 64 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66  id order */.#def
21b0: 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  ine FTS5INDEX_QU
21c0: 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 30  ERY_TEST_NOIDX 0
21d0: 78 30 30 30 34 20 20 20 2f 2a 20 44 6f 20 6e 6f  x0004   /* Do no
21e0: 74 20 75 73 65 20 70 72 65 66 69 78 20 69 6e 64  t use prefix ind
21f0: 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  ex */.#define FT
2200: 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
2210: 41 4e 20 20 20 20 20 20 20 30 78 30 30 30 38 20  AN       0x0008 
2220: 20 20 2f 2a 20 53 63 61 6e 20 71 75 65 72 79 20    /* Scan query 
2230: 28 66 74 73 35 76 6f 63 61 62 29 20 2a 2f 0a 0a  (fts5vocab) */..
2240: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 2f 64 65 73  /*.** Create/des
2250: 74 72 6f 79 20 61 6e 20 46 74 73 35 49 6e 64 65  troy an Fts5Inde
2260: 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74  x object..*/.int
2270: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2280: 78 4f 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67  xOpen(Fts5Config
2290: 20 2a 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20 62   *pConfig, int b
22a0: 43 72 65 61 74 65 2c 20 46 74 73 35 49 6e 64 65  Create, Fts5Inde
22b0: 78 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69 6e  x**, char**);.in
22c0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
22d0: 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  exClose(Fts5Inde
22e0: 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f  x *p);../*.** fo
22f0: 72 28 0a 2a 2a 20 20 20 70 49 74 65 72 20 3d 20  r(.**   pIter = 
2300: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2310: 51 75 65 72 79 28 70 2c 20 22 74 6f 6b 65 6e 22  Query(p, "token"
2320: 2c 20 35 2c 20 30 29 3b 0a 2a 2a 20 20 20 30 3d  , 5, 0);.**   0=
2330: 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  =sqlite3Fts5Iter
2340: 45 6f 66 28 70 49 74 65 72 29 3b 0a 2a 2a 20 20  Eof(pIter);.**  
2350: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2360: 4e 65 78 74 28 70 49 74 65 72 29 0a 2a 2a 20 29  Next(pIter).** )
2370: 7b 0a 2a 2a 20 20 20 69 36 34 20 69 52 6f 77 69  {.**   i64 iRowi
2380: 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  d = sqlite3Fts5I
2390: 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b  terRowid(pIter);
23a0: 0a 2a 2a 20 7d 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  .** }.*/../*.** 
23b0: 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61  Open a new itera
23c0: 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  tor to iterate t
23d0: 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69 64 73  hough all docids
23e0: 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
23f0: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f  .** specified to
2400: 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65  ken or token pre
2410: 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  fix..*/.int sqli
2420: 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
2430: 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  y(.  Fts5Index *
2440: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2450: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
2460: 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  x to query */.  
2470: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
2480: 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  en, int nToken, 
2490: 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65  /* Token (or pre
24a0: 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f  fix) to query fo
24b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
24c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24d0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
24e0: 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  f FTS5INDEX_QUER
24f0: 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  Y_X flags */.  F
2500: 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70  ts5IndexIter **p
2510: 70 49 74 65 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  pIter.);../*.** 
2520: 54 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72  The various oper
2530: 61 74 69 6f 6e 73 20 6f 6e 20 6f 70 65 6e 20 74  ations on open t
2540: 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
2550: 65 66 69 78 20 69 74 65 72 61 74 6f 72 73 20 6f  efix iterators o
2560: 70 65 6e 65 64 0a 2a 2a 20 75 73 69 6e 67 20 73  pened.** using s
2570: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
2580: 75 65 72 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  uery()..*/.int s
2590: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
25a0: 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a  f(Fts5IndexIter*
25b0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
25c0: 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  s5IterNext(Fts5I
25d0: 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20  ndexIter*);.int 
25e0: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
25f0: 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
2600: 78 49 74 65 72 2a 2c 20 69 36 34 20 69 4d 61 74  xIter*, i64 iMat
2610: 63 68 29 3b 0a 69 36 34 20 73 71 6c 69 74 65 33  ch);.i64 sqlite3
2620: 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 46 74  Fts5IterRowid(Ft
2630: 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69  s5IndexIter*);.i
2640: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
2650: 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e  erPoslist(Fts5In
2660: 64 65 78 49 74 65 72 2a 2c 20 63 6f 6e 73 74 20  dexIter*, const 
2670: 75 38 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 6e  u8 **pp, int *pn
2680: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  );../*.** Close 
2690: 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e  an iterator open
26a0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 74 73  ed by sqlite3Fts
26b0: 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a  5IndexQuery()..*
26c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
26d0: 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35  s5IterClose(Fts5
26e0: 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 2f 2a  IndexIter*);../*
26f0: 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
2700: 63 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ce is used by th
2710: 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75  e fts5vocab modu
2720: 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2730: 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74  r *sqlite3Fts5It
2740: 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
2750: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 69 6e  Iter*, int*);.in
2760: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
2770: 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e  rNextScan(Fts5In
2780: 64 65 78 49 74 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a  dexIter*);.../*.
2790: 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d  ** Insert or rem
27a0: 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66  ove data to or f
27b0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45  rom the index. E
27c0: 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d  ach time a docum
27d0: 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64  ent is .** added
27e0: 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66   to or removed f
27f0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74  rom the index, t
2800: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2810: 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  called one or mo
2820: 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a  re.** times..**.
2830: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74  ** For an insert
2840: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
2850: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
2860: 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e  h token in the n
2870: 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20  ew document..** 
2880: 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
2890: 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74   is a delete, it
28a0: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
28b0: 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20  (at least) once 
28c0: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71  for each.** uniq
28d0: 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ue token in the 
28e0: 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  document with an
28f0: 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73   iCol value less
2900: 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20   than zero. The 
2910: 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iPos.** argument
2920: 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
2930: 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74  a delete..*/.int
2940: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2950: 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e  xWrite(.  Fts5In
2960: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
2970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2980: 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  ex to write to *
2990: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
29c0: 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28  ken appears in (
29d0: 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a  -ve -> delete) *
29e0: 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  /.  int iPos,   
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
2a10: 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
2a20: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73  column */.  cons
2a30: 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
2a40: 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54  int nToken  /* T
2a50: 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72  oken to add or r
2a60: 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d  emove to or from
2a70: 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a 0a 2f 2a   index */.);../*
2a80: 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
2a90: 74 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  t subsequent cal
2aa0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ls to sqlite3Fts
2ab0: 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65  5IndexWrite() pe
2ac0: 72 74 61 69 6e 20 74 6f 0a 2a 2a 20 64 6f 63 75  rtain to.** docu
2ad0: 6d 65 6e 74 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a  ment iDocid..*/.
2ae0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2af0: 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 0a  ndexBeginWrite(.
2b00: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
2b30: 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
2b40: 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20  iDocid          
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2b60: 6f 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20 72  ocid to add or r
2b70: 65 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d 20  emove data from 
2b80: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  */.);../*.** Flu
2b90: 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  sh any data stor
2ba0: 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
2bb0: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
2bc0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
2bd0: 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
2be0: 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
2bf0: 20 61 6c 73 6f 20 63 6c 6f 73 65 20 61 6e 79 20   also close any 
2c00: 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c 65  open blob handle
2c10: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2c20: 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46  3Fts5IndexSync(F
2c30: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
2c40: 20 62 43 6f 6d 6d 69 74 29 3b 0a 0a 2f 2a 0a 2a   bCommit);../*.*
2c50: 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61  * Discard any da
2c60: 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
2c70: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2c80: 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77  tables. Do not w
2c90: 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68  rite it.** to th
2ca0: 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
2cb0: 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65  tionally, assume
2cc0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2cd0: 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61  ts of the %_data
2ce0: 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61  .** table may ha
2cf0: 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69  ve changed on di
2d00: 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65  sk. So any in-me
2d10: 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25  mory caches of %
2d20: 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64  _data .** record
2d30: 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69  s must be invali
2d40: 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  dated..*/.int sq
2d50: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f  lite3Fts5IndexRo
2d60: 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78  llback(Fts5Index
2d70: 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   *p);../*.** Ret
2d80: 72 69 65 76 65 20 61 6e 64 20 63 6c 65 61 72 20  rieve and clear 
2d90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 72 72 6f  the current erro
2da0: 72 20 63 6f 64 65 2c 20 72 65 73 70 65 63 74 69  r code, respecti
2db0: 76 65 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vely..*/.int sql
2dc0: 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 72 72  ite3Fts5IndexErr
2dd0: 63 6f 64 65 28 46 74 73 35 49 6e 64 65 78 2a 29  code(Fts5Index*)
2de0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
2df0: 73 35 49 6e 64 65 78 52 65 73 65 74 28 46 74 73  s5IndexReset(Fts
2e00: 35 49 6e 64 65 78 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  5Index*);../*.**
2e10: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
2e20: 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
2e30: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2e40: 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65  3Fts5IndexGetAve
2e50: 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
2e60: 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  *p, Fts5Buffer *
2e70: 70 42 75 66 29 3b 0a 69 6e 74 20 73 71 6c 69 74  pBuf);.int sqlit
2e80: 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76  e3Fts5IndexSetAv
2e90: 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
2ea0: 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20   *p, const u8*, 
2eb0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  int);../*.** Fun
2ec0: 63 74 69 6f 6e 73 20 63 61 6c 6c 65 64 20 62 79  ctions called by
2ed0: 20 74 68 65 20 73 74 6f 72 61 67 65 20 6d 6f 64   the storage mod
2ee0: 75 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 69  ule as part of i
2ef0: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a  ntegrity-check..
2f00: 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74  */.u64 sqlite3Ft
2f10: 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 46 74 73  s5IndexCksum(Fts
2f20: 35 43 6f 6e 66 69 67 2a 2c 69 36 34 2c 69 6e 74  5Config*,i64,int
2f30: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
2f40: 2c 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74  ,int);.int sqlit
2f50: 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67  e3Fts5IndexInteg
2f60: 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e  rityCheck(Fts5In
2f70: 64 65 78 2a 2c 20 75 36 34 20 63 6b 73 75 6d 29  dex*, u64 cksum)
2f80: 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 65 64  ;../* .** Called
2f90: 20 64 75 72 69 6e 67 20 76 69 72 74 75 61 6c 20   during virtual 
2fa0: 6d 6f 64 75 6c 65 20 69 6e 69 74 69 61 6c 69 7a  module initializ
2fb0: 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65  ation to registe
2fc0: 72 20 55 44 46 20 0a 2a 2a 20 66 74 73 35 5f 64  r UDF .** fts5_d
2fd0: 65 63 6f 64 65 28 29 20 77 69 74 68 20 53 51 4c  ecode() with SQL
2fe0: 69 74 65 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ite .*/.int sqli
2ff0: 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74  te3Fts5IndexInit
3000: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e 74  (sqlite3*);..int
3010: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
3020: 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49  xSetCookie(Fts5I
3030: 6e 64 65 78 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ndex*, int);../*
3040: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
3050: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65  otal number of e
3060: 6e 74 72 69 65 73 20 72 65 61 64 20 66 72 6f 6d  ntries read from
3070: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
3080: 65 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 63 6f  e by .** this co
3090: 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 69  nnection since i
30a0: 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
30b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
30c0: 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35  5IndexReads(Fts5
30d0: 49 6e 64 65 78 20 2a 70 29 3b 0a 0a 69 6e 74 20  Index *p);..int 
30e0: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
30f0: 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78  Reinit(Fts5Index
3100: 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *p);.int sqlite
3110: 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69  3Fts5IndexOptimi
3120: 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ze(Fts5Index *p)
3130: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
3140: 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35  5IndexMerge(Fts5
3150: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d  Index *p, int nM
3160: 65 72 67 65 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  erge);..int sqli
3170: 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64  te3Fts5IndexLoad
3180: 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78  Config(Fts5Index
3190: 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74   *p);..int sqlit
31a0: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 33  e3Fts5GetVarint3
31b0: 32 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  2(const unsigned
31c0: 20 63 68 61 72 20 2a 70 2c 20 75 33 32 20 2a 76   char *p, u32 *v
31d0: 29 3b 0a 23 64 65 66 69 6e 65 20 66 74 73 35 47  );.#define fts5G
31e0: 65 74 56 61 72 69 6e 74 33 32 28 61 2c 62 29 20  etVarint32(a,b) 
31f0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
3200: 72 69 6e 74 33 32 28 61 2c 28 75 33 32 2a 29 26  rint32(a,(u32*)&
3210: 62 29 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  b)..int sqlite3F
3220: 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28  ts5GetVarintLen(
3230: 75 33 32 20 69 56 61 6c 29 3b 0a 0a 2f 2a 0a 2a  u32 iVal);../*.*
3240: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
3250: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
3260: 73 35 5f 69 6e 64 65 78 2e 63 2e 0a 2a 2a 2a 2a  s5_index.c..****
3270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
32c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3300: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
3310: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
3320: 35 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71  5.c. .*/..int sq
3330: 6c 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b 65  lite3Fts5GetToke
3340: 6e 69 7a 65 72 28 0a 20 20 46 74 73 35 47 6c 6f  nizer(.  Fts5Glo
3350: 62 61 6c 2a 2c 20 0a 20 20 63 6f 6e 73 74 20 63  bal*, .  const c
3360: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69  har **azArg,.  i
3370: 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74 73 35 54  nt nArg,.  Fts5T
3380: 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a 20 20 66 74  okenizer**,.  ft
3390: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a  s5_tokenizer**,.
33a0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
33b0: 3b 0a 0a 46 74 73 35 49 6e 64 65 78 20 2a 73 71  ;..Fts5Index *sq
33c0: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 46 72  lite3Fts5IndexFr
33d0: 6f 6d 43 73 72 69 64 28 46 74 73 35 47 6c 6f 62  omCsrid(Fts5Glob
33e0: 61 6c 2a 2c 20 69 36 34 29 3b 0a 0a 2f 2a 0a 2a  al*, i64);../*.*
33f0: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
3400: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
3410: 73 35 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s5.c..**********
3420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3460: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
3470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
34b0: 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63  * Interface to c
34c0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61 73 68  ode in fts5_hash
34d0: 2e 63 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20  .c. .*/.typedef 
34e0: 73 74 72 75 63 74 20 46 74 73 35 48 61 73 68 20  struct Fts5Hash 
34f0: 46 74 73 35 48 61 73 68 3b 0a 0a 2f 2a 0a 2a 2a  Fts5Hash;../*.**
3500: 20 43 72 65 61 74 65 20 61 20 68 61 73 68 20 74   Create a hash t
3510: 61 62 6c 65 2c 20 66 72 65 65 20 61 20 68 61 73  able, free a has
3520: 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  h table..*/.int 
3530: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e  sqlite3Fts5HashN
3540: 65 77 28 46 74 73 35 48 61 73 68 2a 2a 2c 20 69  ew(Fts5Hash**, i
3550: 6e 74 20 2a 70 6e 53 69 7a 65 29 3b 0a 76 6f 69  nt *pnSize);.voi
3560: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
3570: 68 46 72 65 65 28 46 74 73 35 48 61 73 68 2a 29  hFree(Fts5Hash*)
3580: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
3590: 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 46  s5HashWrite(.  F
35a0: 74 73 35 48 61 73 68 2a 2c 0a 20 20 69 36 34 20  ts5Hash*,.  i64 
35b0: 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
35d0: 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 65 6e  owid for this en
35e0: 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  try */.  int iCo
35f0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
3600: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3610: 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73  mn token appears
3620: 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65   in (-ve -> dele
3630: 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f  te) */.  int iPo
3640: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
3650: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
3660: 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69  tion of token wi
3670: 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  thin column */. 
3680: 20 63 68 61 72 20 62 42 79 74 65 2c 0a 20 20 63   char bByte,.  c
3690: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
36a0: 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f  n, int nToken  /
36b0: 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f  * Token to add o
36c0: 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66  r remove to or f
36d0: 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a  rom index */.);.
36e0: 0a 2f 2a 0a 2a 2a 20 45 6d 70 74 79 20 28 62 75  ./*.** Empty (bu
36f0: 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 29  t do not delete)
3700: 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a   a hash table..*
3710: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
3720: 73 35 48 61 73 68 43 6c 65 61 72 28 46 74 73 35  s5HashClear(Fts5
3730: 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  Hash*);..int sql
3740: 69 74 65 33 46 74 73 35 48 61 73 68 51 75 65 72  ite3Fts5HashQuer
3750: 79 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 20  y(.  Fts5Hash*, 
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
3780: 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  le to query */. 
3790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
37a0: 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
37b0: 20 2f 2a 20 51 75 65 72 79 20 74 65 72 6d 20 2a   /* Query term *
37c0: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  /.  const u8 **p
37d0: 70 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20  pDoclist,       
37e0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
37f0: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66  ter to doclist f
3800: 6f 72 20 70 54 65 72 6d 20 2a 2f 0a 20 20 69 6e  or pTerm */.  in
3810: 74 20 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20  t *pnDoclist    
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3830: 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 64 6f   OUT: Size of do
3840: 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  clist in bytes *
3850: 2f 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  /.);..int sqlite
3860: 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
3870: 74 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 20  t(.  Fts5Hash*, 
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
38a0: 6c 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  le to query */. 
38b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
38c0: 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  rm, int nTerm   
38d0: 20 2f 2a 20 51 75 65 72 79 20 70 72 65 66 69 78   /* Query prefix
38e0: 20 2a 2f 0a 29 3b 0a 76 6f 69 64 20 73 71 6c 69   */.);.void sqli
38f0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e  te3Fts5HashScanN
3900: 65 78 74 28 46 74 73 35 48 61 73 68 2a 29 3b 0a  ext(Fts5Hash*);.
3910: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48  int sqlite3Fts5H
3920: 61 73 68 53 63 61 6e 45 6f 66 28 46 74 73 35 48  ashScanEof(Fts5H
3930: 61 73 68 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69  ash*);.void sqli
3940: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
3950: 6e 74 72 79 28 46 74 73 35 48 61 73 68 20 2a 2c  ntry(Fts5Hash *,
3960: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
3970: 70 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  pzTerm,         
3980: 20 20 20 2f 2a 20 4f 55 54 3a 20 74 65 72 6d 20     /* OUT: term 
3990: 28 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 29  (nul-terminated)
39a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
39b0: 2a 70 70 44 6f 63 6c 69 73 74 2c 20 20 20 20 20  *ppDoclist,     
39c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 70 6f        /* OUT: po
39d0: 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
39e0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63   */.  int *pnDoc
39f0: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
3a00: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 69        /* OUT: si
3a10: 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e  ze of doclist in
3a20: 20 62 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f   bytes */.);.../
3a30: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
3a40: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
3a50: 20 66 74 73 35 5f 68 61 73 68 2e 63 2e 0a 2a 2a   fts5_hash.c..**
3a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
3ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3af0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66  ******.** Interf
3b00: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
3b10: 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 20 66  ts5_storage.c. f
3b20: 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 20 63 6f  ts5_storage.c co
3b30: 6e 74 61 69 6e 73 20 63 6f 6e 74 61 69 6e 73 20  ntains contains 
3b40: 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 61 63 63 65  .** code to acce
3b50: 73 73 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  ss the data stor
3b60: 65 64 20 69 6e 20 74 68 65 20 25 5f 63 6f 6e 74  ed in the %_cont
3b70: 65 6e 74 20 61 6e 64 20 25 5f 64 6f 63 73 69 7a  ent and %_docsiz
3b80: 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 0a 23 64  e tables..*/..#d
3b90: 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54 5f  efine FTS5_STMT_
3ba0: 53 43 41 4e 5f 41 53 43 20 20 30 20 20 20 20 20  SCAN_ASC  0     
3bb0: 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  /* SELECT rowid,
3bc0: 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45   * FROM ... ORDE
3bd0: 52 20 42 59 20 31 20 41 53 43 20 2a 2f 0a 23 64  R BY 1 ASC */.#d
3be0: 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54 5f  efine FTS5_STMT_
3bf0: 53 43 41 4e 5f 44 45 53 43 20 31 20 20 20 20 20  SCAN_DESC 1     
3c00: 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  /* SELECT rowid,
3c10: 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45   * FROM ... ORDE
3c20: 52 20 42 59 20 31 20 44 45 53 43 20 2a 2f 0a 23  R BY 1 DESC */.#
3c30: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54 4d 54  define FTS5_STMT
3c40: 5f 4c 4f 4f 4b 55 50 20 20 20 20 32 20 20 20 20  _LOOKUP    2    
3c50: 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64   /* SELECT rowid
3c60: 2c 20 2a 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45  , * FROM ... WHE
3c70: 52 45 20 72 6f 77 69 64 3d 3f 20 2a 2f 0a 0a 74  RE rowid=? */..t
3c80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
3c90: 73 35 53 74 6f 72 61 67 65 20 46 74 73 35 53 74  s5Storage Fts5St
3ca0: 6f 72 61 67 65 3b 0a 0a 69 6e 74 20 73 71 6c 69  orage;..int sqli
3cb0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 4f 70  te3Fts5StorageOp
3cc0: 65 6e 28 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20  en(Fts5Config*, 
3cd0: 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 6e 74 2c  Fts5Index*, int,
3ce0: 20 46 74 73 35 53 74 6f 72 61 67 65 2a 2a 2c 20   Fts5Storage**, 
3cf0: 63 68 61 72 2a 2a 29 3b 0a 69 6e 74 20 73 71 6c  char**);.int sql
3d00: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 43  ite3Fts5StorageC
3d10: 6c 6f 73 65 28 46 74 73 35 53 74 6f 72 61 67 65  lose(Fts5Storage
3d20: 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74   *p);..int sqlit
3d30: 65 33 46 74 73 35 44 72 6f 70 41 6c 6c 28 46 74  e3Fts5DropAll(Ft
3d40: 73 35 43 6f 6e 66 69 67 2a 29 3b 0a 69 6e 74 20  s5Config*);.int 
3d50: 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
3d60: 65 54 61 62 6c 65 28 46 74 73 35 43 6f 6e 66 69  eTable(Fts5Confi
3d70: 67 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  g*, const char*,
3d80: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
3d90: 74 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 0a 69 6e  t, char **);..in
3da0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
3db0: 72 61 67 65 44 65 6c 65 74 65 28 46 74 73 35 53  rageDelete(Fts5S
3dc0: 74 6f 72 61 67 65 20 2a 70 2c 20 69 36 34 29 3b  torage *p, i64);
3dd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
3de0: 53 74 6f 72 61 67 65 49 6e 73 65 72 74 28 46 74  StorageInsert(Ft
3df0: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 73 71  s5Storage *p, sq
3e00: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
3e10: 56 61 6c 2c 20 69 6e 74 2c 20 69 36 34 2a 29 3b  Val, int, i64*);
3e20: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
3e30: 35 53 74 6f 72 61 67 65 49 6e 74 65 67 72 69 74  5StorageIntegrit
3e40: 79 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  y(Fts5Storage *p
3e50: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
3e60: 74 73 35 53 74 6f 72 61 67 65 53 74 6d 74 28 46  ts5StorageStmt(F
3e70: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
3e80: 6e 74 20 65 53 74 6d 74 2c 20 73 71 6c 69 74 65  nt eStmt, sqlite
3e90: 33 5f 73 74 6d 74 2a 2a 2c 20 63 68 61 72 2a 2a  3_stmt**, char**
3ea0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
3eb0: 74 73 35 53 74 6f 72 61 67 65 53 74 6d 74 52 65  ts5StorageStmtRe
3ec0: 6c 65 61 73 65 28 46 74 73 35 53 74 6f 72 61 67  lease(Fts5Storag
3ed0: 65 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c  e *p, int eStmt,
3ee0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b   sqlite3_stmt*);
3ef0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
3f00: 35 53 74 6f 72 61 67 65 44 6f 63 73 69 7a 65 28  5StorageDocsize(
3f10: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
3f20: 69 36 34 20 69 52 6f 77 69 64 2c 20 69 6e 74 20  i64 iRowid, int 
3f30: 2a 61 43 6f 6c 29 3b 0a 69 6e 74 20 73 71 6c 69  *aCol);.int sqli
3f40: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53 69  te3Fts5StorageSi
3f50: 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ze(Fts5Storage *
3f60: 70 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 36 34  p, int iCol, i64
3f70: 20 2a 70 6e 41 76 67 29 3b 0a 69 6e 74 20 73 71   *pnAvg);.int sq
3f80: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
3f90: 52 6f 77 43 6f 75 6e 74 28 46 74 73 35 53 74 6f  RowCount(Fts5Sto
3fa0: 72 61 67 65 20 2a 70 2c 20 69 36 34 20 2a 70 6e  rage *p, i64 *pn
3fb0: 52 6f 77 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  Row);..int sqlit
3fc0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 53 79 6e  e3Fts5StorageSyn
3fd0: 63 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70  c(Fts5Storage *p
3fe0: 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 3b 0a  , int bCommit);.
3ff0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
4000: 74 6f 72 61 67 65 52 6f 6c 6c 62 61 63 6b 28 46  torageRollback(F
4010: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0a  ts5Storage *p);.
4020: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4030: 53 74 6f 72 61 67 65 43 6f 6e 66 69 67 56 61 6c  StorageConfigVal
4040: 75 65 28 0a 20 20 20 20 46 74 73 35 53 74 6f 72  ue(.    Fts5Stor
4050: 61 67 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  age *p, const ch
4060: 61 72 2a 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ar*, sqlite3_val
4070: 75 65 2a 2c 20 69 6e 74 0a 29 3b 0a 0a 69 6e 74  ue*, int.);..int
4080: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
4090: 61 67 65 53 70 65 63 69 61 6c 44 65 6c 65 74 65  ageSpecialDelete
40a0: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
40b0: 20 69 36 34 20 69 44 65 6c 2c 20 73 71 6c 69 74   i64 iDel, sqlit
40c0: 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 0a 69 6e  e3_value**);..in
40d0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
40e0: 72 61 67 65 44 65 6c 65 74 65 41 6c 6c 28 46 74  rageDeleteAll(Ft
40f0: 73 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0a 69  s5Storage *p);.i
4100: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
4110: 6f 72 61 67 65 52 65 62 75 69 6c 64 28 46 74 73  orageRebuild(Fts
4120: 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0a 69 6e  5Storage *p);.in
4130: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
4140: 72 61 67 65 4f 70 74 69 6d 69 7a 65 28 46 74 73  rageOptimize(Fts
4150: 35 53 74 6f 72 61 67 65 20 2a 70 29 3b 0a 69 6e  5Storage *p);.in
4160: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
4170: 72 61 67 65 4d 65 72 67 65 28 46 74 73 35 53 74  rageMerge(Fts5St
4180: 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 6e 4d  orage *p, int nM
4190: 65 72 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e  erge);../*.** En
41a0: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
41b0: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 73  o code in fts5_s
41c0: 74 6f 72 61 67 65 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  torage.c..******
41d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4210: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
4220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4260: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
4270: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
4280: 5f 65 78 70 72 2e 63 2e 20 0a 2a 2f 0a 74 79 70  _expr.c. .*/.typ
4290: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
42a0: 45 78 70 72 20 46 74 73 35 45 78 70 72 3b 0a 74  Expr Fts5Expr;.t
42b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
42c0: 73 35 45 78 70 72 4e 6f 64 65 20 46 74 73 35 45  s5ExprNode Fts5E
42d0: 78 70 72 4e 6f 64 65 3b 0a 74 79 70 65 64 65 66  xprNode;.typedef
42e0: 20 73 74 72 75 63 74 20 46 74 73 35 50 61 72 73   struct Fts5Pars
42f0: 65 20 46 74 73 35 50 61 72 73 65 3b 0a 74 79 70  e Fts5Parse;.typ
4300: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
4310: 54 6f 6b 65 6e 20 46 74 73 35 54 6f 6b 65 6e 3b  Token Fts5Token;
4320: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
4330: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 46  Fts5ExprPhrase F
4340: 74 73 35 45 78 70 72 50 68 72 61 73 65 3b 0a 74  ts5ExprPhrase;.t
4350: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
4360: 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 46 74  s5ExprNearset Ft
4370: 73 35 45 78 70 72 4e 65 61 72 73 65 74 3b 0a 0a  s5ExprNearset;..
4380: 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e  struct Fts5Token
4390: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
43a0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
43b0: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 65       /* Token te
43c0: 78 74 20 28 6e 6f 74 20 4e 55 4c 4c 20 74 65 72  xt (not NULL ter
43d0: 6d 69 6e 61 74 65 64 29 20 2a 2f 0a 20 20 69 6e  minated) */.  in
43e0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4400: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
4410: 70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b  p in bytes */.};
4420: 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 4d 41 54  ../* Parse a MAT
4430: 43 48 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a  CH expression. *
4440: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
4450: 35 45 78 70 72 4e 65 77 28 0a 20 20 46 74 73 35  5ExprNew(.  Fts5
4460: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
4470: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4480: 7a 45 78 70 72 2c 0a 20 20 46 74 73 35 45 78 70  zExpr,.  Fts5Exp
4490: 72 20 2a 2a 70 70 4e 65 77 2c 20 0a 20 20 63 68  r **ppNew, .  ch
44a0: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 3b 0a 0a 2f  ar **pzErr.);../
44b0: 2a 0a 2a 2a 20 66 6f 72 28 72 63 20 3d 20 73 71  *.** for(rc = sq
44c0: 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 69 72  lite3Fts5ExprFir
44d0: 73 74 28 70 45 78 70 72 2c 20 70 49 64 78 2c 20  st(pExpr, pIdx, 
44e0: 62 44 65 73 63 29 3b 0a 2a 2a 20 20 20 20 20 72  bDesc);.**     r
44f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
4500: 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 45 78  0==sqlite3Fts5Ex
4510: 70 72 45 6f 66 28 70 45 78 70 72 29 3b 0a 2a 2a  prEof(pExpr);.**
4520: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4530: 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 70 45  3Fts5ExprNext(pE
4540: 78 70 72 29 0a 2a 2a 20 29 7b 0a 2a 2a 20 20 20  xpr).** ){.**   
4550: 2f 2f 20 54 68 65 20 64 6f 63 75 6d 65 6e 74 20  // The document 
4560: 77 69 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69  with rowid iRowi
4570: 64 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78  d matches the ex
4580: 70 72 65 73 73 69 6f 6e 21 0a 2a 2a 20 20 20 69  pression!.**   i
4590: 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  64 iRowid = sqli
45a0: 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69 64  te3Fts5ExprRowid
45b0: 28 70 45 78 70 72 29 3b 0a 2a 2a 20 7d 0a 2a 2f  (pExpr);.** }.*/
45c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
45d0: 45 78 70 72 46 69 72 73 74 28 46 74 73 35 45 78  ExprFirst(Fts5Ex
45e0: 70 72 2a 2c 20 46 74 73 35 49 6e 64 65 78 20 2a  pr*, Fts5Index *
45f0: 70 49 64 78 2c 20 69 6e 74 20 62 44 65 73 63 29  pIdx, int bDesc)
4600: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4610: 35 45 78 70 72 4e 65 78 74 28 46 74 73 35 45 78  5ExprNext(Fts5Ex
4620: 70 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  pr*);.int sqlite
4630: 33 46 74 73 35 45 78 70 72 45 6f 66 28 46 74 73  3Fts5ExprEof(Fts
4640: 35 45 78 70 72 2a 29 3b 0a 69 36 34 20 73 71 6c  5Expr*);.i64 sql
4650: 69 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69  ite3Fts5ExprRowi
4660: 64 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 0a 76  d(Fts5Expr*);..v
4670: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 45  oid sqlite3Fts5E
4680: 78 70 72 46 72 65 65 28 46 74 73 35 45 78 70 72  xprFree(Fts5Expr
4690: 2a 29 3b 0a 0a 2f 2a 20 43 61 6c 6c 65 64 20 64  *);../* Called d
46a0: 75 72 69 6e 67 20 73 74 61 72 74 75 70 20 74 6f  uring startup to
46b0: 20 72 65 67 69 73 74 65 72 20 61 20 55 44 46 20   register a UDF 
46c0: 77 69 74 68 20 53 51 4c 69 74 65 20 2a 2f 0a 69  with SQLite */.i
46d0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
46e0: 70 72 49 6e 69 74 28 46 74 73 35 47 6c 6f 62 61  prInit(Fts5Globa
46f0: 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 0a  l*, sqlite3*);..
4700: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
4710: 78 70 72 50 68 72 61 73 65 43 6f 75 6e 74 28 46  xprPhraseCount(F
4720: 74 73 35 45 78 70 72 2a 29 3b 0a 69 6e 74 20 73  ts5Expr*);.int s
4730: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 68  qlite3Fts5ExprPh
4740: 72 61 73 65 53 69 7a 65 28 46 74 73 35 45 78 70  raseSize(Fts5Exp
4750: 72 2a 2c 20 69 6e 74 20 69 50 68 72 61 73 65 29  r*, int iPhrase)
4760: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4770: 35 45 78 70 72 50 6f 73 6c 69 73 74 28 46 74 73  5ExprPoslist(Fts
4780: 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e  5Expr*, int, con
4790: 73 74 20 75 38 20 2a 2a 29 3b 0a 0a 69 6e 74 20  st u8 **);..int 
47a0: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50  sqlite3Fts5ExprP
47b0: 68 72 61 73 65 45 78 70 72 28 46 74 73 35 43 6f  hraseExpr(Fts5Co
47c0: 6e 66 69 67 2a 2c 20 46 74 73 35 45 78 70 72 2a  nfig*, Fts5Expr*
47d0: 2c 20 69 6e 74 2c 20 46 74 73 35 45 78 70 72 2a  , int, Fts5Expr*
47e0: 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);../**********
47f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4810: 2a 0a 2a 2a 20 54 68 65 20 66 74 73 35 5f 65 78  *.** The fts5_ex
4820: 70 72 2e 63 20 41 50 49 20 61 62 6f 76 65 20 74  pr.c API above t
4830: 68 69 73 20 70 6f 69 6e 74 20 69 73 20 75 73 65  his point is use
4840: 64 20 62 79 20 74 68 65 20 6f 74 68 65 72 20 68  d by the other h
4850: 61 6e 64 2d 77 72 69 74 74 65 6e 0a 2a 2a 20 43  and-written.** C
4860: 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 6d 6f   code in this mo
4870: 64 75 6c 65 2e 20 54 68 65 20 69 6e 74 65 72 66  dule. The interf
4880: 61 63 65 73 20 62 65 6c 6f 77 20 74 68 69 73 20  aces below this 
4890: 70 6f 69 6e 74 20 61 72 65 20 63 61 6c 6c 65 64  point are called
48a0: 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 72 73 65   by.** the parse
48b0: 72 20 63 6f 64 65 20 69 6e 20 66 74 73 35 70 61  r code in fts5pa
48c0: 72 73 65 2e 79 2e 20 20 2a 2f 0a 0a 76 6f 69 64  rse.y.  */..void
48d0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
48e0: 65 45 72 72 6f 72 28 46 74 73 35 50 61 72 73 65  eError(Fts5Parse
48f0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
4900: 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29  char *zFmt, ...)
4910: 3b 0a 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20  ;..Fts5ExprNode 
4920: 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73  *sqlite3Fts5Pars
4930: 65 4e 6f 64 65 28 0a 20 20 46 74 73 35 50 61 72  eNode(.  Fts5Par
4940: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 69 6e  se *pParse,.  in
4950: 74 20 65 54 79 70 65 2c 0a 20 20 46 74 73 35 45  t eType,.  Fts5E
4960: 78 70 72 4e 6f 64 65 20 2a 70 4c 65 66 74 2c 0a  xprNode *pLeft,.
4970: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
4980: 70 52 69 67 68 74 2c 0a 20 20 46 74 73 35 45 78  pRight,.  Fts5Ex
4990: 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
49a0: 0a 29 3b 0a 0a 46 74 73 35 45 78 70 72 50 68 72  .);..Fts5ExprPhr
49b0: 61 73 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35  ase *sqlite3Fts5
49c0: 50 61 72 73 65 54 65 72 6d 28 0a 20 20 46 74 73  ParseTerm(.  Fts
49d0: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
49e0: 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73  .  Fts5ExprPhras
49f0: 65 20 2a 70 50 68 72 61 73 65 2c 20 0a 20 20 46  e *pPhrase, .  F
4a00: 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  ts5Token *pToken
4a10: 2c 0a 20 20 69 6e 74 20 62 50 72 65 66 69 78 0a  ,.  int bPrefix.
4a20: 29 3b 0a 0a 46 74 73 35 45 78 70 72 4e 65 61 72  );..Fts5ExprNear
4a30: 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35  set *sqlite3Fts5
4a40: 50 61 72 73 65 4e 65 61 72 73 65 74 28 0a 20 20  ParseNearset(.  
4a50: 46 74 73 35 50 61 72 73 65 2a 2c 20 0a 20 20 46  Fts5Parse*, .  F
4a60: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 2c  ts5ExprNearset*,
4a70: 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73  .  Fts5ExprPhras
4a80: 65 2a 20 0a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c  e* .);..void sql
4a90: 69 74 65 33 46 74 73 35 50 61 72 73 65 50 68 72  ite3Fts5ParsePhr
4aa0: 61 73 65 46 72 65 65 28 46 74 73 35 45 78 70 72  aseFree(Fts5Expr
4ab0: 50 68 72 61 73 65 2a 29 3b 0a 76 6f 69 64 20 73  Phrase*);.void s
4ac0: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
4ad0: 65 61 72 73 65 74 46 72 65 65 28 46 74 73 35 45  earsetFree(Fts5E
4ae0: 78 70 72 4e 65 61 72 73 65 74 2a 29 3b 0a 76 6f  xprNearset*);.vo
4af0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
4b00: 72 73 65 4e 6f 64 65 46 72 65 65 28 46 74 73 35  rseNodeFree(Fts5
4b10: 45 78 70 72 4e 6f 64 65 2a 29 3b 0a 0a 76 6f 69  ExprNode*);..voi
4b20: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
4b30: 73 65 53 65 74 44 69 73 74 61 6e 63 65 28 46 74  seSetDistance(Ft
4b40: 73 35 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78  s5Parse*, Fts5Ex
4b50: 70 72 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35  prNearset*, Fts5
4b60: 54 6f 6b 65 6e 2a 29 3b 0a 76 6f 69 64 20 73 71  Token*);.void sq
4b70: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65  lite3Fts5ParseSe
4b80: 74 43 6f 6c 75 6d 6e 28 46 74 73 35 50 61 72 73  tColumn(Fts5Pars
4b90: 65 2a 2c 20 46 74 73 35 45 78 70 72 4e 65 61 72  e*, Fts5ExprNear
4ba0: 73 65 74 2a 2c 20 46 74 73 35 54 6f 6b 65 6e 2a  set*, Fts5Token*
4bb0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
4bc0: 74 73 35 50 61 72 73 65 46 69 6e 69 73 68 65 64  ts5ParseFinished
4bd0: 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72  (Fts5Parse *pPar
4be0: 73 65 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65  se, Fts5ExprNode
4bf0: 20 2a 70 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74   *p);.void sqlit
4c00: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 28  e3Fts5ParseNear(
4c10: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
4c20: 65 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a  e, Fts5Token*);.
4c30: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e  ./*.** End of in
4c40: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
4c50: 69 6e 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 0a  in fts5_expr.c..
4c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 0a 2f  **********/..../
4cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e  **********.** In
4d00: 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20  terface to code 
4d10: 69 6e 20 66 74 73 35 5f 61 75 78 2e 63 2e 20 0a  in fts5_aux.c. .
4d20: 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  */..int sqlite3F
4d30: 74 73 35 41 75 78 49 6e 69 74 28 66 74 73 35 5f  ts5AuxInit(fts5_
4d40: 61 70 69 2a 29 3b 0a 2f 2a 0a 2a 2a 20 45 6e 64  api*);./*.** End
4d50: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
4d60: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 61 75   code in fts5_au
4d70: 78 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  x.c..***********
4d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
4dc0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
4e10: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f   Interface to co
4e20: 64 65 20 69 6e 20 66 74 73 35 5f 74 6f 6b 65 6e  de in fts5_token
4e30: 69 7a 65 72 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74  izer.c. .*/..int
4e40: 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65   sqlite3Fts5Toke
4e50: 6e 69 7a 65 72 49 6e 69 74 28 66 74 73 35 5f 61  nizerInit(fts5_a
4e60: 70 69 2a 29 3b 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  pi*);./*.** End 
4e70: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
4e80: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 74 6f 6b  code in fts5_tok
4e90: 65 6e 69 7a 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  enizer.c..******
4ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ee0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
4ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f30: 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  **.** Interface 
4f40: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
4f50: 73 6f 72 74 65 72 2e 63 2e 20 0a 2a 2f 0a 74 79  sorter.c. .*/.ty
4f60: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
4f70: 35 53 6f 72 74 65 72 20 46 74 73 35 53 6f 72 74  5Sorter Fts5Sort
4f80: 65 72 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  er;..int sqlite3
4f90: 46 74 73 35 53 6f 72 74 65 72 4e 65 77 28 46 74  Fts5SorterNew(Ft
4fa0: 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 46  s5Expr *pExpr, F
4fb0: 74 73 35 53 6f 72 74 65 72 20 2a 2a 70 70 29 3b  ts5Sorter **pp);
4fc0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
4fd0: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
4fe0: 20 69 6e 20 66 74 73 35 5f 73 6f 72 74 65 72 2e   in fts5_sorter.
4ff0: 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c..*************
5000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
5040: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
5050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49  ***********.** I
5090: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
50a0: 20 69 6e 20 66 74 73 35 5f 76 6f 63 61 62 2e 63   in fts5_vocab.c
50b0: 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74  . .*/..int sqlit
50c0: 65 33 46 74 73 35 56 6f 63 61 62 49 6e 69 74 28  e3Fts5VocabInit(
50d0: 46 74 73 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c  Fts5Global*, sql
50e0: 69 74 65 33 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45  ite3*);../*.** E
50f0: 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20  nd of interface 
5100: 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f  to code in fts5_
5110: 76 6f 63 61 62 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  vocab.c..*******
5120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5160: 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 0a           ***/..#endif.