/ Hex Artifact Content
Login

Artifact 5b9e4afe80d18648bc236b9b5bc2f873634326f6:


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 2c 20 69 6e 74 2a 29 3b  al*, i64, int*);
33f0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
3400: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
3410: 20 69 6e 20 66 74 73 35 2e 63 2e 0a 2a 2a 2a 2a   in fts5.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: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a  ****************
34b0: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
34c0: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
34d0: 35 5f 68 61 73 68 2e 63 2e 20 0a 2a 2f 0a 74 79  5_hash.c. .*/.ty
34e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
34f0: 35 48 61 73 68 20 46 74 73 35 48 61 73 68 3b 0a  5Hash Fts5Hash;.
3500: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3510: 68 61 73 68 20 74 61 62 6c 65 2c 20 66 72 65 65  hash table, free
3520: 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a   a hash table..*
3530: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3540: 35 48 61 73 68 4e 65 77 28 46 74 73 35 48 61 73  5HashNew(Fts5Has
3550: 68 2a 2a 2c 20 69 6e 74 20 2a 70 6e 53 69 7a 65  h**, int *pnSize
3560: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
3570: 74 73 35 48 61 73 68 46 72 65 65 28 46 74 73 35  ts5HashFree(Fts5
3580: 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  Hash*);..int sql
3590: 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
35a0: 65 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 0a  e(.  Fts5Hash*,.
35b0: 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
35e0: 68 69 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  his entry */.  i
35f0: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3610: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
3620: 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
3630: 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
3640: 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3660: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
3670: 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
3680: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 62 42 79 74  n */.  char bByt
3690: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
36a0: 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
36b0: 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
36c0: 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
36d0: 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
36e0: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70  */.);../*.** Emp
36f0: 74 79 20 28 62 75 74 20 64 6f 20 6e 6f 74 20 64  ty (but do not d
3700: 65 6c 65 74 65 29 20 61 20 68 61 73 68 20 74 61  elete) a hash ta
3710: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
3720: 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
3730: 72 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 0a 69  r(Fts5Hash*);..i
3740: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  nt sqlite3Fts5Ha
3750: 73 68 51 75 65 72 79 28 0a 20 20 46 74 73 35 48  shQuery(.  Fts5H
3760: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3780: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
3790: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
37a0: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
37b0: 65 72 6d 2c 20 20 20 2f 2a 20 51 75 65 72 79 20  erm,   /* Query 
37c0: 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
37d0: 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20  u8 **ppDoclist, 
37e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
37f0: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  : Pointer to doc
3800: 6c 69 73 74 20 66 6f 72 20 70 54 65 72 6d 20 2a  list for pTerm *
3810: 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69  /.  int *pnDocli
3820: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
3830: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
3840: 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
3850: 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a 69 6e 74 20  ytes */.);..int 
3860: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
3870: 63 61 6e 49 6e 69 74 28 0a 20 20 46 74 73 35 48  canInit(.  Fts5H
3880: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
3890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
38a0: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
38b0: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
38c0: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
38d0: 65 72 6d 20 20 20 20 2f 2a 20 51 75 65 72 79 20  erm    /* Query 
38e0: 70 72 65 66 69 78 20 2a 2f 0a 29 3b 0a 76 6f 69  prefix */.);.voi
38f0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
3900: 68 53 63 61 6e 4e 65 78 74 28 46 74 73 35 48 61  hScanNext(Fts5Ha
3910: 73 68 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  sh*);.int sqlite
3920: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
3930: 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 76 6f 69  (Fts5Hash*);.voi
3940: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
3950: 68 53 63 61 6e 45 6e 74 72 79 28 46 74 73 35 48  hScanEntry(Fts5H
3960: 61 73 68 20 2a 2c 0a 20 20 63 6f 6e 73 74 20 63  ash *,.  const c
3970: 68 61 72 20 2a 2a 70 7a 54 65 72 6d 2c 20 20 20  har **pzTerm,   
3980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
3990: 20 74 65 72 6d 20 28 6e 75 6c 2d 74 65 72 6d 69   term (nul-termi
39a0: 6e 61 74 65 64 29 20 2a 2f 0a 20 20 63 6f 6e 73  nated) */.  cons
39b0: 74 20 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74  t u8 **ppDoclist
39c0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
39d0: 55 54 3a 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  UT: pointer to d
39e0: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
39f0: 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20  *pnDoclist      
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3a10: 55 54 3a 20 73 69 7a 65 20 6f 66 20 64 6f 63 6c  UT: size of docl
3a20: 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
3a30: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  );.../*.** End o
3a40: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
3a50: 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61 73 68  ode in fts5_hash
3a60: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
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 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
3ab0: 0a 2f 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 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
3b00: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
3b10: 65 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67  e in fts5_storag
3b20: 65 2e 63 2e 20 66 74 73 35 5f 73 74 6f 72 61 67  e.c. fts5_storag
3b30: 65 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e  e.c contains con
3b40: 74 61 69 6e 73 20 0a 2a 2a 20 63 6f 64 65 20 74  tains .** code t
3b50: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
3b60: 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
3b70: 25 5f 63 6f 6e 74 65 6e 74 20 61 6e 64 20 25 5f  %_content and %_
3b80: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 73 2e 0a  docsize tables..
3b90: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
3ba0: 5f 53 54 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20  _STMT_SCAN_ASC  
3bb0: 30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  0     /* SELECT 
3bc0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
3bd0: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 41 53 43  . ORDER BY 1 ASC
3be0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
3bf0: 5f 53 54 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20  _STMT_SCAN_DESC 
3c00: 31 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  1     /* SELECT 
3c10: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
3c20: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 44 45 53  . ORDER BY 1 DES
3c30: 43 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  C */.#define FTS
3c40: 35 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20  5_STMT_LOOKUP   
3c50: 20 32 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54   2     /* SELECT
3c60: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e   rowid, * FROM .
3c70: 2e 2e 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f  .. WHERE rowid=?
3c80: 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
3c90: 75 63 74 20 46 74 73 35 53 74 6f 72 61 67 65 20  uct Fts5Storage 
3ca0: 46 74 73 35 53 74 6f 72 61 67 65 3b 0a 0a 69 6e  Fts5Storage;..in
3cb0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
3cc0: 72 61 67 65 4f 70 65 6e 28 46 74 73 35 43 6f 6e  rageOpen(Fts5Con
3cd0: 66 69 67 2a 2c 20 46 74 73 35 49 6e 64 65 78 2a  fig*, Fts5Index*
3ce0: 2c 20 69 6e 74 2c 20 46 74 73 35 53 74 6f 72 61  , int, Fts5Stora
3cf0: 67 65 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69  ge**, char**);.i
3d00: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
3d10: 6f 72 61 67 65 43 6c 6f 73 65 28 46 74 73 35 53  orageClose(Fts5S
3d20: 74 6f 72 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74  torage *p);..int
3d30: 20 73 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70   sqlite3Fts5Drop
3d40: 41 6c 6c 28 46 74 73 35 43 6f 6e 66 69 67 2a 29  All(Fts5Config*)
3d50: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
3d60: 35 43 72 65 61 74 65 54 61 62 6c 65 28 46 74 73  5CreateTable(Fts
3d70: 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20  5Config*, const 
3d80: 63 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61  char*, const cha
3d90: 72 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2a  r*, int, char **
3da0: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
3db0: 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65  ts5StorageDelete
3dc0: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
3dd0: 20 69 36 34 29 3b 0a 69 6e 74 20 73 71 6c 69 74   i64);.int sqlit
3de0: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 73  e3Fts5StorageIns
3df0: 65 72 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  ert(Fts5Storage 
3e00: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  *p, sqlite3_valu
3e10: 65 20 2a 2a 61 70 56 61 6c 2c 20 69 6e 74 2c 20  e **apVal, int, 
3e20: 69 36 34 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  i64*);..int sqli
3e30: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e  te3Fts5StorageIn
3e40: 74 65 67 72 69 74 79 28 46 74 73 35 53 74 6f 72  tegrity(Fts5Stor
3e50: 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71  age *p);..int sq
3e60: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
3e70: 53 74 6d 74 28 46 74 73 35 53 74 6f 72 61 67 65  Stmt(Fts5Storage
3e80: 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20   *p, int eStmt, 
3e90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2a 2c 20  sqlite3_stmt**, 
3ea0: 63 68 61 72 2a 2a 29 3b 0a 76 6f 69 64 20 73 71  char**);.void sq
3eb0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
3ec0: 53 74 6d 74 52 65 6c 65 61 73 65 28 46 74 73 35  StmtRelease(Fts5
3ed0: 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20  Storage *p, int 
3ee0: 65 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73  eStmt, sqlite3_s
3ef0: 74 6d 74 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  tmt*);..int sqli
3f00: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 6f  te3Fts5StorageDo
3f10: 63 73 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67  csize(Fts5Storag
3f20: 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  e *p, i64 iRowid
3f30: 2c 20 69 6e 74 20 2a 61 43 6f 6c 29 3b 0a 69 6e  , int *aCol);.in
3f40: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
3f50: 72 61 67 65 53 69 7a 65 28 46 74 73 35 53 74 6f  rageSize(Fts5Sto
3f60: 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 69 43 6f  rage *p, int iCo
3f70: 6c 2c 20 69 36 34 20 2a 70 6e 41 76 67 29 3b 0a  l, i64 *pnAvg);.
3f80: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
3f90: 74 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28 46  torageRowCount(F
3fa0: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
3fb0: 36 34 20 2a 70 6e 52 6f 77 29 3b 0a 0a 69 6e 74  64 *pnRow);..int
3fc0: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
3fd0: 61 67 65 53 79 6e 63 28 46 74 73 35 53 74 6f 72  ageSync(Fts5Stor
3fe0: 61 67 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d  age *p, int bCom
3ff0: 6d 69 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  mit);.int sqlite
4000: 33 46 74 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c  3Fts5StorageRoll
4010: 62 61 63 6b 28 46 74 73 35 53 74 6f 72 61 67 65  back(Fts5Storage
4020: 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74   *p);..int sqlit
4030: 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e  e3Fts5StorageCon
4040: 66 69 67 56 61 6c 75 65 28 0a 20 20 20 20 46 74  figValue(.    Ft
4050: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 63 6f  s5Storage *p, co
4060: 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74  nst char*, sqlit
4070: 65 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 0a 29  e3_value*, int.)
4080: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
4090: 73 35 53 74 6f 72 61 67 65 53 70 65 63 69 61 6c  s5StorageSpecial
40a0: 44 65 6c 65 74 65 28 46 74 73 35 53 74 6f 72 61  Delete(Fts5Stora
40b0: 67 65 20 2a 70 2c 20 69 36 34 20 69 44 65 6c 2c  ge *p, i64 iDel,
40c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a   sqlite3_value**
40d0: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
40e0: 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65  ts5StorageDelete
40f0: 41 6c 6c 28 46 74 73 35 53 74 6f 72 61 67 65 20  All(Fts5Storage 
4100: 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  *p);.int sqlite3
4110: 46 74 73 35 53 74 6f 72 61 67 65 52 65 62 75 69  Fts5StorageRebui
4120: 6c 64 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ld(Fts5Storage *
4130: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
4140: 74 73 35 53 74 6f 72 61 67 65 4f 70 74 69 6d 69  ts5StorageOptimi
4150: 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ze(Fts5Storage *
4160: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
4170: 74 73 35 53 74 6f 72 61 67 65 4d 65 72 67 65 28  ts5StorageMerge(
4180: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
4190: 69 6e 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 2f 2a  int nMerge);../*
41a0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
41b0: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
41c0: 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 0a  fts5_storage.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 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
4270: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
4280: 6e 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 20 0a  n fts5_expr.c. .
4290: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
42a0: 74 20 46 74 73 35 45 78 70 72 20 46 74 73 35 45  t Fts5Expr Fts5E
42b0: 78 70 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  xpr;.typedef str
42c0: 75 63 74 20 46 74 73 35 45 78 70 72 4e 6f 64 65  uct Fts5ExprNode
42d0: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 3b 0a 74   Fts5ExprNode;.t
42e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
42f0: 73 35 50 61 72 73 65 20 46 74 73 35 50 61 72 73  s5Parse Fts5Pars
4300: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
4310: 74 20 46 74 73 35 54 6f 6b 65 6e 20 46 74 73 35  t Fts5Token Fts5
4320: 54 6f 6b 65 6e 3b 0a 74 79 70 65 64 65 66 20 73  Token;.typedef s
4330: 74 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68  truct Fts5ExprPh
4340: 72 61 73 65 20 46 74 73 35 45 78 70 72 50 68 72  rase Fts5ExprPhr
4350: 61 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ase;.typedef str
4360: 75 63 74 20 46 74 73 35 45 78 70 72 4e 65 61 72  uct Fts5ExprNear
4370: 73 65 74 20 46 74 73 35 45 78 70 72 4e 65 61 72  set Fts5ExprNear
4380: 73 65 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73  set;..struct Fts
4390: 35 54 6f 6b 65 6e 20 7b 0a 20 20 63 6f 6e 73 74  5Token {.  const
43a0: 20 63 68 61 72 20 2a 70 3b 20 20 20 20 20 20 20   char *p;       
43b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
43c0: 6b 65 6e 20 74 65 78 74 20 28 6e 6f 74 20 4e 55  ken text (not NU
43d0: 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 29 20 2a  LL terminated) *
43e0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
4410: 75 66 66 65 72 20 70 20 69 6e 20 62 79 74 65 73  uffer p in bytes
4420: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65   */.};../* Parse
4430: 20 61 20 4d 41 54 43 48 20 65 78 70 72 65 73 73   a MATCH express
4440: 69 6f 6e 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion. */.int sqli
4450: 74 65 33 46 74 73 35 45 78 70 72 4e 65 77 28 0a  te3Fts5ExprNew(.
4460: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
4470: 6f 6e 66 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20  onfig, .  const 
4480: 63 68 61 72 20 2a 7a 45 78 70 72 2c 0a 20 20 46  char *zExpr,.  F
4490: 74 73 35 45 78 70 72 20 2a 2a 70 70 4e 65 77 2c  ts5Expr **ppNew,
44a0: 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
44b0: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28 72  .);../*.** for(r
44c0: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  c = sqlite3Fts5E
44d0: 78 70 72 46 69 72 73 74 28 70 45 78 70 72 2c 20  xprFirst(pExpr, 
44e0: 70 49 64 78 2c 20 62 44 65 73 63 29 3b 0a 2a 2a  pIdx, bDesc);.**
44f0: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
4500: 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  OK && 0==sqlite3
4510: 46 74 73 35 45 78 70 72 45 6f 66 28 70 45 78 70  Fts5ExprEof(pExp
4520: 72 29 3b 0a 2a 2a 20 20 20 20 20 72 63 20 3d 20  r);.**     rc = 
4530: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e  sqlite3Fts5ExprN
4540: 65 78 74 28 70 45 78 70 72 29 0a 2a 2a 20 29 7b  ext(pExpr).** ){
4550: 0a 2a 2a 20 20 20 2f 2f 20 54 68 65 20 64 6f 63  .**   // The doc
4560: 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64  ument with rowid
4570: 20 69 52 6f 77 69 64 20 6d 61 74 63 68 65 73 20   iRowid matches 
4580: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 21 0a  the expression!.
4590: 2a 2a 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  **   i64 iRowid 
45a0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  = sqlite3Fts5Exp
45b0: 72 52 6f 77 69 64 28 70 45 78 70 72 29 3b 0a 2a  rRowid(pExpr);.*
45c0: 2a 20 7d 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  * }.*/.int sqlit
45d0: 65 33 46 74 73 35 45 78 70 72 46 69 72 73 74 28  e3Fts5ExprFirst(
45e0: 46 74 73 35 45 78 70 72 2a 2c 20 46 74 73 35 49  Fts5Expr*, Fts5I
45f0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
4600: 62 44 65 73 63 29 3b 0a 69 6e 74 20 73 71 6c 69  bDesc);.int sqli
4610: 74 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28  te3Fts5ExprNext(
4620: 46 74 73 35 45 78 70 72 2a 29 3b 0a 69 6e 74 20  Fts5Expr*);.int 
4630: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 45  sqlite3Fts5ExprE
4640: 6f 66 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 69  of(Fts5Expr*);.i
4650: 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  64 sqlite3Fts5Ex
4660: 70 72 52 6f 77 69 64 28 46 74 73 35 45 78 70 72  prRowid(Fts5Expr
4670: 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  *);..void sqlite
4680: 33 46 74 73 35 45 78 70 72 46 72 65 65 28 46 74  3Fts5ExprFree(Ft
4690: 73 35 45 78 70 72 2a 29 3b 0a 0a 2f 2a 20 43 61  s5Expr*);../* Ca
46a0: 6c 6c 65 64 20 64 75 72 69 6e 67 20 73 74 61 72  lled during star
46b0: 74 75 70 20 74 6f 20 72 65 67 69 73 74 65 72 20  tup to register 
46c0: 61 20 55 44 46 20 77 69 74 68 20 53 51 4c 69 74  a UDF with SQLit
46d0: 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e */.int sqlite3
46e0: 46 74 73 35 45 78 70 72 49 6e 69 74 28 46 74 73  Fts5ExprInit(Fts
46f0: 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65  5Global*, sqlite
4700: 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  3*);..int sqlite
4710: 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43  3Fts5ExprPhraseC
4720: 6f 75 6e 74 28 46 74 73 35 45 78 70 72 2a 29 3b  ount(Fts5Expr*);
4730: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
4740: 45 78 70 72 50 68 72 61 73 65 53 69 7a 65 28 46  ExprPhraseSize(F
4750: 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 20 69 50  ts5Expr*, int iP
4760: 68 72 61 73 65 29 3b 0a 69 6e 74 20 73 71 6c 69  hrase);.int sqli
4770: 74 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69  te3Fts5ExprPosli
4780: 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e  st(Fts5Expr*, in
4790: 74 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 29 3b  t, const u8 **);
47a0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
47b0: 35 45 78 70 72 50 68 72 61 73 65 45 78 70 72 28  5ExprPhraseExpr(
47c0: 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46 74 73  Fts5Config*, Fts
47d0: 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20 46 74 73  5Expr*, int, Fts
47e0: 35 45 78 70 72 2a 2a 29 3b 0a 0a 2f 2a 2a 2a 2a  5Expr**);../****
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 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
4820: 74 73 35 5f 65 78 70 72 2e 63 20 41 50 49 20 61  ts5_expr.c API a
4830: 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20  bove this point 
4840: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  is used by the o
4850: 74 68 65 72 20 68 61 6e 64 2d 77 72 69 74 74 65  ther hand-writte
4860: 6e 0a 2a 2a 20 43 20 63 6f 64 65 20 69 6e 20 74  n.** C code in t
4870: 68 69 73 20 6d 6f 64 75 6c 65 2e 20 54 68 65 20  his module. The 
4880: 69 6e 74 65 72 66 61 63 65 73 20 62 65 6c 6f 77  interfaces below
4890: 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20   this point are 
48a0: 63 61 6c 6c 65 64 20 62 79 0a 2a 2a 20 74 68 65  called by.** the
48b0: 20 70 61 72 73 65 72 20 63 6f 64 65 20 69 6e 20   parser code in 
48c0: 66 74 73 35 70 61 72 73 65 2e 79 2e 20 20 2a 2f  fts5parse.y.  */
48d0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
48e0: 73 35 50 61 72 73 65 45 72 72 6f 72 28 46 74 73  s5ParseError(Fts
48f0: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
4900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
4910: 2c 20 2e 2e 2e 29 3b 0a 0a 46 74 73 35 45 78 70  , ...);..Fts5Exp
4920: 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65 33 46 74  rNode *sqlite3Ft
4930: 73 35 50 61 72 73 65 4e 6f 64 65 28 0a 20 20 46  s5ParseNode(.  F
4940: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
4950: 2c 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 0a 20  ,.  int eType,. 
4960: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
4970: 4c 65 66 74 2c 0a 20 20 46 74 73 35 45 78 70 72  Left,.  Fts5Expr
4980: 4e 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a 20 20  Node *pRight,.  
4990: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
49a0: 2a 70 4e 65 61 72 0a 29 3b 0a 0a 46 74 73 35 45  *pNear.);..Fts5E
49b0: 78 70 72 50 68 72 61 73 65 20 2a 73 71 6c 69 74  xprPhrase *sqlit
49c0: 65 33 46 74 73 35 50 61 72 73 65 54 65 72 6d 28  e3Fts5ParseTerm(
49d0: 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
49e0: 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78 70  arse, .  Fts5Exp
49f0: 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
4a00: 2c 20 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a  , .  Fts5Token *
4a10: 70 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 62 50  pToken,.  int bP
4a20: 72 65 66 69 78 0a 29 3b 0a 0a 46 74 73 35 45 78  refix.);..Fts5Ex
4a30: 70 72 4e 65 61 72 73 65 74 20 2a 73 71 6c 69 74  prNearset *sqlit
4a40: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73  e3Fts5ParseNears
4a50: 65 74 28 0a 20 20 46 74 73 35 50 61 72 73 65 2a  et(.  Fts5Parse*
4a60: 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61  , .  Fts5ExprNea
4a70: 72 73 65 74 2a 2c 0a 20 20 46 74 73 35 45 78 70  rset*,.  Fts5Exp
4a80: 72 50 68 72 61 73 65 2a 20 0a 29 3b 0a 0a 76 6f  rPhrase* .);..vo
4a90: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
4aa0: 72 73 65 50 68 72 61 73 65 46 72 65 65 28 46 74  rsePhraseFree(Ft
4ab0: 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0a  s5ExprPhrase*);.
4ac0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
4ad0: 50 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65  ParseNearsetFree
4ae0: 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74  (Fts5ExprNearset
4af0: 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  *);.void sqlite3
4b00: 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65  Fts5ParseNodeFre
4b10: 65 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29  e(Fts5ExprNode*)
4b20: 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ;..void sqlite3F
4b30: 74 73 35 50 61 72 73 65 53 65 74 44 69 73 74 61  ts5ParseSetDista
4b40: 6e 63 65 28 46 74 73 35 50 61 72 73 65 2a 2c 20  nce(Fts5Parse*, 
4b50: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a  Fts5ExprNearset*
4b60: 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a 76  , Fts5Token*);.v
4b70: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
4b80: 61 72 73 65 53 65 74 43 6f 6c 75 6d 6e 28 46 74  arseSetColumn(Ft
4b90: 73 35 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78  s5Parse*, Fts5Ex
4ba0: 70 72 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35  prNearset*, Fts5
4bb0: 54 6f 6b 65 6e 2a 29 3b 0a 76 6f 69 64 20 73 71  Token*);.void sq
4bc0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46 69  lite3Fts5ParseFi
4bd0: 6e 69 73 68 65 64 28 46 74 73 35 50 61 72 73 65  nished(Fts5Parse
4be0: 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45 78   *pParse, Fts5Ex
4bf0: 70 72 4e 6f 64 65 20 2a 70 29 3b 0a 76 6f 69 64  prNode *p);.void
4c00: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
4c10: 65 4e 65 61 72 28 46 74 73 35 50 61 72 73 65 20  eNear(Fts5Parse 
4c20: 2a 70 50 61 72 73 65 2c 20 46 74 73 35 54 6f 6b  *pParse, Fts5Tok
4c30: 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64  en*);../*.** End
4c40: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
4c50: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 65 78   code in fts5_ex
4c60: 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  pr.c..**********
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 2a 2a 2a 2a 2a 2a  ****************
4cb0: 2f 0a 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 2a  ****************
4d00: 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
4d10: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 61 75   code in fts5_au
4d20: 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71  x.c. .*/..int sq
4d30: 6c 69 74 65 33 46 74 73 35 41 75 78 49 6e 69 74  lite3Fts5AuxInit
4d40: 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a  (fts5_api*);./*.
4d50: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
4d60: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
4d70: 74 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a 2a 2a 2a  ts5_aux.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 2a  ****************
4dc0: 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a  ****************
4e10: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
4e20: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
4e30: 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 20 0a 2a  _tokenizer.c. .*
4e40: 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  /..int sqlite3Ft
4e50: 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e 69 74 28  s5TokenizerInit(
4e60: 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a 2a  fts5_api*);./*.*
4e70: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
4e80: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
4e90: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 0a  s5_tokenizer.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 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
4f40: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
4f50: 20 66 74 73 35 5f 73 6f 72 74 65 72 2e 63 2e 20   fts5_sorter.c. 
4f60: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
4f70: 63 74 20 46 74 73 35 53 6f 72 74 65 72 20 46 74  ct Fts5Sorter Ft
4f80: 73 35 53 6f 72 74 65 72 3b 0a 0a 69 6e 74 20 73  s5Sorter;..int s
4f90: 71 6c 69 74 65 33 46 74 73 35 53 6f 72 74 65 72  qlite3Fts5Sorter
4fa0: 4e 65 77 28 46 74 73 35 45 78 70 72 20 2a 70 45  New(Fts5Expr *pE
4fb0: 78 70 72 2c 20 46 74 73 35 53 6f 72 74 65 72 20  xpr, Fts5Sorter 
4fc0: 2a 2a 70 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e  **pp);../*.** En
4fd0: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
4fe0: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 73  o code in fts5_s
4ff0: 6f 72 74 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  orter.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 2a 2a 2a  ****************
5040: 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a  ****************
5090: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
50a0: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 76  o code in fts5_v
50b0: 6f 63 61 62 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74  ocab.c. .*/..int
50c0: 20 73 71 6c 69 74 65 33 46 74 73 35 56 6f 63 61   sqlite3Fts5Voca
50d0: 62 49 6e 69 74 28 46 74 73 35 47 6c 6f 62 61 6c  bInit(Fts5Global
50e0: 2a 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 2f  *, sqlite3*);../
50f0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
5100: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
5110: 20 66 74 73 35 5f 76 6f 63 61 62 2e 63 2e 0a 2a   fts5_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 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64  *********/..#end
5170: 69 66 0a                                         if.