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

Artifact ba0fd64be01cf7bf47ad20fcd23b629fdde6c4dc:


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: 44 45 42 55 47 0a 65 78 74 65 72 6e 20 69 6e 74  DEBUG.extern int
04e0: 20 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 6d 61   sqlite3_fts5_ma
04f0: 79 5f 62 65 5f 63 6f 72 72 75 70 74 3b 0a 23 20  y_be_corrupt;.# 
0500: 64 65 66 69 6e 65 20 61 73 73 65 72 74 5f 6e 63  define assert_nc
0510: 28 78 29 20 61 73 73 65 72 74 28 73 71 6c 69 74  (x) assert(sqlit
0520: 65 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f 63  e3_fts5_may_be_c
0530: 6f 72 72 75 70 74 20 7c 7c 20 28 78 29 29 0a 23  orrupt || (x)).#
0540: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
0550: 73 65 72 74 5f 6e 63 28 78 29 20 61 73 73 65 72  sert_nc(x) asser
0560: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 74 79 70  t(x).#endif..typ
0570: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
0580: 47 6c 6f 62 61 6c 20 46 74 73 35 47 6c 6f 62 61  Global Fts5Globa
0590: 6c 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  l;../***********
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 2a 0a  ***************.
05e0: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
05f0: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 63 6f 6e  code in fts5_con
0600: 66 69 67 2e 63 2e 20 66 74 73 35 5f 63 6f 6e 66  fig.c. fts5_conf
0610: 69 67 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f  ig.c contains co
0620: 6e 74 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74  ntains code.** t
0630: 6f 20 70 61 72 73 65 20 74 68 65 20 61 72 67 75  o parse the argu
0640: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
0650: 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55  the CREATE VIRTU
0660: 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  AL TABLE stateme
0670: 6e 74 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  nt..*/..typedef 
0680: 73 74 72 75 63 74 20 46 74 73 35 43 6f 6e 66 69  struct Fts5Confi
0690: 67 20 46 74 73 35 43 6f 6e 66 69 67 3b 0a 0a 2f  g Fts5Config;../
06a0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
06b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
06c0: 67 20 73 74 72 75 63 74 75 72 65 20 65 6e 63 6f  g structure enco
06d0: 64 65 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  des all informat
06e0: 69 6f 6e 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20  ion that can.** 
06f0: 62 65 20 67 6c 65 61 6e 65 64 20 66 72 6f 6d 20  be gleaned from 
0700: 74 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55  the CREATE VIRTU
0710: 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  AL TABLE stateme
0720: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 64 20 61 6c  nt..**.** And al
0730: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 6f  l information lo
0740: 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  aded from the %_
0750: 63 6f 6e 66 69 67 20 74 61 62 6c 65 2e 0a 2a 2a  config table..**
0760: 0a 2a 2a 20 6e 41 75 74 6f 6d 65 72 67 65 3a 0a  .** nAutomerge:.
0770: 2a 2a 20 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d  **   The minimum
0780: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0790: 6e 74 73 20 74 68 61 74 20 61 6e 20 61 75 74 6f  nts that an auto
07a0: 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e  -merge operation
07b0: 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 61 74 74   should.**   att
07c0: 65 6d 70 74 20 74 6f 20 6d 65 72 67 65 20 74 6f  empt to merge to
07d0: 67 65 74 68 65 72 2e 20 41 20 76 61 6c 75 65 20  gether. A value 
07e0: 6f 66 20 31 20 73 65 74 73 20 74 68 65 20 6f 62  of 1 sets the ob
07f0: 6a 65 63 74 20 74 6f 20 75 73 65 20 74 68 65 20  ject to use the 
0800: 0a 2a 2a 20 20 20 63 6f 6d 70 69 6c 65 20 74 69  .**   compile ti
0810: 6d 65 20 64 65 66 61 75 6c 74 2e 20 5a 65 72 6f  me default. Zero
0820: 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 2d 6d   disables auto-m
0830: 65 72 67 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  erge altogether.
0840: 0a 2a 2a 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 3a  .**.** zContent:
0850: 0a 2a 2a 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 52  .**.** zContentR
0860: 6f 77 69 64 3a 0a 2a 2a 20 20 20 54 68 65 20 76  owid:.**   The v
0870: 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6e 74  alue of the cont
0880: 65 6e 74 5f 72 6f 77 69 64 3d 20 6f 70 74 69 6f  ent_rowid= optio
0890: 6e 2c 20 69 66 20 6f 6e 65 20 77 61 73 20 73 70  n, if one was sp
08a0: 65 63 69 66 69 65 64 2e 20 4f 72 20 0a 2a 2a 20  ecified. Or .** 
08b0: 20 20 74 68 65 20 73 74 72 69 6e 67 20 22 72 6f    the string "ro
08c0: 77 69 64 22 20 6f 74 68 65 72 77 69 73 65 2e 20  wid" otherwise. 
08d0: 54 68 69 73 20 74 65 78 74 20 69 73 20 6e 6f 74  This text is not
08e0: 20 71 75 6f 74 65 64 20 2d 20 69 66 20 69 74 20   quoted - if it 
08f0: 69 73 0a 2a 2a 20 20 20 75 73 65 64 20 61 73 20  is.**   used as 
0900: 70 61 72 74 20 6f 66 20 61 6e 20 53 51 4c 20 73  part of an SQL s
0910: 74 61 74 65 6d 65 6e 74 20 69 74 20 6e 65 65 64  tatement it need
0920: 73 20 74 6f 20 62 65 20 71 75 6f 74 65 64 20 61  s to be quoted a
0930: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2a  ppropriately..**
0940: 0a 2a 2a 20 7a 43 6f 6e 74 65 6e 74 45 78 70 72  .** zContentExpr
0950: 6c 69 73 74 3a 0a 2a 2a 0a 2a 2a 20 70 7a 45 72  list:.**.** pzEr
0960: 72 6d 73 67 3a 0a 2a 2a 20 20 20 54 68 69 73 20  rmsg:.**   This 
0970: 65 78 69 73 74 73 20 69 6e 20 6f 72 64 65 72 20  exists in order 
0980: 74 6f 20 61 6c 6c 6f 77 20 74 68 65 20 66 74 73  to allow the fts
0990: 35 5f 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c 65  5_index.c module
09a0: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 0a 2a 2a   to return a .**
09b0: 20 20 20 64 65 63 65 6e 74 20 65 72 72 6f 72 20     decent error 
09c0: 6d 65 73 73 61 67 65 20 69 66 20 69 74 20 65 6e  message if it en
09d0: 63 6f 75 6e 74 65 72 73 20 61 20 66 69 6c 65 2d  counters a file-
09e0: 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 69  format version i
09f0: 74 20 64 6f 65 73 0a 2a 2a 20 20 20 6e 6f 74 20  t does.**   not 
0a00: 75 6e 64 65 72 73 74 61 6e 64 2e 0a 2a 2a 0a 2a  understand..**.*
0a10: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 43 6f 6e  /.struct Fts5Con
0a20: 66 69 67 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  fig {.  sqlite3 
0a30: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
0a40: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0a50: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
0a60: 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
0a90: 69 6e 67 20 46 54 53 20 69 6e 64 65 78 20 28 65  ing FTS index (e
0aa0: 2e 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20  .g. "main") */. 
0ab0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 46 54 53 20   /* Name of FTS 
0ae0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
0af0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
0b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0b10: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
0b20: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  */.  char **azCo
0b30: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0b40: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
0b50: 61 6d 65 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62  ames */.  u8 *ab
0b60: 55 6e 69 6e 64 65 78 65 64 3b 20 20 20 20 20 20  Unindexed;      
0b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0b80: 65 20 66 6f 72 20 75 6e 69 6e 64 65 78 65 64 20  e for unindexed 
0b90: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
0ba0: 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0bc0: 4e 75 6d 62 65 72 20 6f 66 20 70 72 65 66 69 78  Number of prefix
0bd0: 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e   indexes */.  in
0be0: 74 20 2a 61 50 72 65 66 69 78 3b 20 20 20 20 20  t *aPrefix;     
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c00: 20 53 69 7a 65 73 20 69 6e 20 62 79 74 65 73 20   Sizes in bytes 
0c10: 6f 66 20 6e 50 72 65 66 69 78 20 70 72 65 66 69  of nPrefix prefi
0c20: 78 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  x indexes */.  i
0c30: 6e 74 20 65 43 6f 6e 74 65 6e 74 3b 20 20 20 20  nt eContent;    
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c50: 2a 20 41 6e 20 46 54 53 35 5f 43 4f 4e 54 45 4e  * An FTS5_CONTEN
0c60: 54 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61  T value */.  cha
0c70: 72 20 2a 7a 43 6f 6e 74 65 6e 74 3b 20 20 20 20  r *zContent;    
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0c90: 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f  content table */
0ca0: 20 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65   .  char *zConte
0cb0: 6e 74 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  ntRowid;        
0cc0: 20 20 20 20 2f 2a 20 22 63 6f 6e 74 65 6e 74 5f      /* "content_
0cd0: 72 6f 77 69 64 3d 22 20 6f 70 74 69 6f 6e 20 76  rowid=" option v
0ce0: 61 6c 75 65 20 2a 2f 20 0a 20 20 63 68 61 72 20  alue */ .  char 
0cf0: 2a 7a 43 6f 6e 74 65 6e 74 45 78 70 72 6c 69 73  *zContentExprlis
0d00: 74 3b 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  t;.  Fts5Tokeniz
0d10: 65 72 20 2a 70 54 6f 6b 3b 0a 20 20 66 74 73 35  er *pTok;.  fts5
0d20: 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b  _tokenizer *pTok
0d30: 41 70 69 3b 0a 0a 20 20 2f 2a 20 56 61 6c 75 65  Api;..  /* Value
0d40: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  s loaded from th
0d50: 65 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65  e %_config table
0d60: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69   */.  int iCooki
0d70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0d80: 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
0d90: 6e 74 65 64 20 77 68 65 6e 20 25 5f 63 6f 6e 66  nted when %_conf
0da0: 69 67 20 69 73 20 6d 6f 64 69 66 69 65 64 20 2a  ig is modified *
0db0: 2f 0a 20 20 69 6e 74 20 70 67 73 7a 3b 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 20 2f 2a 20 41 70 70 72 6f 78 69 6d 61      /* Approxima
0de0: 74 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  te page size use
0df0: 64 20 69 6e 20 25 5f 64 61 74 61 20 2a 2f 0a 20  d in %_data */. 
0e00: 20 69 6e 74 20 6e 41 75 74 6f 6d 65 72 67 65 3b   int nAutomerge;
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 2f 2a 20 27 61 75 74 6f 6d 65 72 67 65 27 20   /* 'automerge' 
0e30: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  setting */.  int
0e40: 20 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 20 20   nCrisisMerge;  
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e60: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
0e70: 73 65 67 6d 65 6e 74 73 20 70 65 72 20 6c 65 76  segments per lev
0e80: 65 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52  el */.  char *zR
0e90: 61 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ank;            
0ea0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
0eb0: 6f 66 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e  of rank function
0ec0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 61 6e   */.  char *zRan
0ed0: 6b 41 72 67 73 3b 20 20 20 20 20 20 20 20 20 20  kArgs;          
0ee0: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
0ef0: 74 73 20 74 6f 20 72 61 6e 6b 20 66 75 6e 63 74  ts to rank funct
0f00: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ion */..  /* If 
0f10: 6e 6f 6e 2d 4e 55 4c 4c 2c 20 70 6f 69 6e 74 73  non-NULL, points
0f20: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 74 61 62   to sqlite3_vtab
0f30: 2e 62 61 73 65 2e 7a 45 72 72 6d 73 67 2e 20 4f  .base.zErrmsg. O
0f40: 66 74 65 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  ften NULL. */.  
0f50: 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 3b  char **pzErrmsg;
0f60: 0a 7d 3b 0a 0a 2f 2a 20 43 75 72 72 65 6e 74 20  .};../* Current 
0f70: 65 78 70 65 63 74 65 64 20 76 61 6c 75 65 20 6f  expected value o
0f80: 66 20 25 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65  f %_config table
0f90: 20 27 76 65 72 73 69 6f 6e 27 20 66 69 65 6c 64   'version' field
0fa0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
0fb0: 5f 43 55 52 52 45 4e 54 5f 56 45 52 53 49 4f 4e  _CURRENT_VERSION
0fc0: 20 32 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35   2..#define FTS5
0fd0: 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20  _CONTENT_NORMAL 
0fe0: 20 20 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35    0.#define FTS5
0ff0: 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 4e 45 20 20 20  _CONTENT_NONE   
1000: 20 20 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35    1.#define FTS5
1010: 5f 43 4f 4e 54 45 4e 54 5f 45 58 54 45 52 4e 41  _CONTENT_EXTERNA
1020: 4c 20 32 0a 0a 0a 0a 0a 69 6e 74 20 73 71 6c 69  L 2.....int sqli
1030: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72  te3Fts5ConfigPar
1040: 73 65 28 0a 20 20 20 20 46 74 73 35 47 6c 6f 62  se(.    Fts5Glob
1050: 61 6c 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 69  al*, sqlite3*, i
1060: 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  nt, const char *
1070: 2a 2c 20 46 74 73 35 43 6f 6e 66 69 67 2a 2a 2c  *, Fts5Config**,
1080: 20 63 68 61 72 2a 2a 0a 29 3b 0a 76 6f 69 64 20   char**.);.void 
1090: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
10a0: 67 46 72 65 65 28 46 74 73 35 43 6f 6e 66 69 67  gFree(Fts5Config
10b0: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
10c0: 46 74 73 35 43 6f 6e 66 69 67 44 65 63 6c 61 72  Fts5ConfigDeclar
10d0: 65 56 74 61 62 28 46 74 73 35 43 6f 6e 66 69 67  eVtab(Fts5Config
10e0: 20 2a 70 43 6f 6e 66 69 67 29 3b 0a 0a 69 6e 74   *pConfig);..int
10f0: 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65   sqlite3Fts5Toke
1100: 6e 69 7a 65 28 0a 20 20 46 74 73 35 43 6f 6e 66  nize(.  Fts5Conf
1110: 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20  ig *pConfig,    
1120: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
1130: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
1140: 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
1150: 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74  char *pText, int
1160: 20 6e 54 65 78 74 2c 20 20 20 2f 2a 20 54 65 78   nText,   /* Tex
1170: 74 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f  t to tokenize */
1180: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 61     /* Context pa
11b0: 73 73 65 64 20 74 6f 20 78 54 6f 6b 65 6e 28 29  ssed to xToken()
11c0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b   */.  int (*xTok
11d0: 65 6e 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74  en)(void*, const
11e0: 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74   char*, int, int
11f0: 2c 20 69 6e 74 29 20 20 20 20 2f 2a 20 43 61 6c  , int)    /* Cal
1200: 6c 62 61 63 6b 20 2a 2f 0a 29 3b 0a 0a 76 6f 69  lback */.);..voi
1210: 64 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71  d sqlite3Fts5Deq
1220: 75 6f 74 65 28 63 68 61 72 20 2a 7a 29 3b 0a 0a  uote(char *z);..
1230: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74  /* Load the cont
1240: 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f  ents of the %_co
1250: 6e 66 69 67 20 74 61 62 6c 65 20 2a 2f 0a 69 6e  nfig table */.in
1260: 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  t sqlite3Fts5Con
1270: 66 69 67 4c 6f 61 64 28 46 74 73 35 43 6f 6e 66  figLoad(Fts5Conf
1280: 69 67 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 53  ig*, int);../* S
1290: 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
12a0: 61 20 73 69 6e 67 6c 65 20 63 6f 6e 66 69 67 20  a single config 
12b0: 61 74 74 72 69 62 75 74 65 20 2a 2f 0a 69 6e 74  attribute */.int
12c0: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
12d0: 69 67 53 65 74 56 61 6c 75 65 28 46 74 73 35 43  igSetValue(Fts5C
12e0: 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20 63 68  onfig*, const ch
12f0: 61 72 2a 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ar*, sqlite3_val
1300: 75 65 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 69 6e 74  ue*, int*);..int
1310: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
1320: 69 67 50 61 72 73 65 52 61 6e 6b 28 63 6f 6e 73  igParseRank(cons
1330: 74 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 2a 2c  t char*, char**,
1340: 20 63 68 61 72 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a   char**);../*.**
1350: 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61 63   End of interfac
1360: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
1370: 35 5f 63 6f 6e 66 69 67 2e 63 2e 0a 2a 2a 2a 2a  5_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 2a 2f 0a 0a 2f 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 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
1420: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
1430: 35 5f 62 75 66 66 65 72 2e 63 2e 0a 2a 2f 0a 0a  5_buffer.c..*/..
1440: 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 6f 62 6a  /*.** Buffer obj
1450: 65 63 74 20 66 6f 72 20 74 68 65 20 69 6e 63 72  ect for the incr
1460: 65 6d 65 6e 74 61 6c 20 62 75 69 6c 64 69 6e 67  emental building
1470: 20 6f 66 20 73 74 72 69 6e 67 20 64 61 74 61 2e   of string data.
1480: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1490: 63 74 20 46 74 73 35 42 75 66 66 65 72 20 46 74  ct Fts5Buffer Ft
14a0: 73 35 42 75 66 66 65 72 3b 0a 73 74 72 75 63 74  s5Buffer;.struct
14b0: 20 46 74 73 35 42 75 66 66 65 72 20 7b 0a 20 20   Fts5Buffer {.  
14c0: 75 38 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  u8 *p;.  int n;.
14d0: 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 7d 3b    int nSpace;.};
14e0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
14f0: 35 42 75 66 66 65 72 47 72 6f 77 28 69 6e 74 2a  5BufferGrow(int*
1500: 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20 69  , Fts5Buffer*, i
1510: 6e 74 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  nt);.void sqlite
1520: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1530: 64 56 61 72 69 6e 74 28 69 6e 74 2a 2c 20 46 74  dVarint(int*, Ft
1540: 73 35 42 75 66 66 65 72 2a 2c 20 69 36 34 29 3b  s5Buffer*, i64);
1550: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
1560: 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1570: 62 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66 66  b(int*, Fts5Buff
1580: 65 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20  er*, int, const 
1590: 75 38 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  u8*);.void sqlit
15a0: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
15b0: 6e 64 53 74 72 69 6e 67 28 69 6e 74 20 2a 2c 20  ndString(int *, 
15c0: 46 74 73 35 42 75 66 66 65 72 2a 2c 20 63 6f 6e  Fts5Buffer*, con
15d0: 73 74 20 63 68 61 72 2a 29 3b 0a 76 6f 69 64 20  st char*);.void 
15e0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
15f0: 72 46 72 65 65 28 46 74 73 35 42 75 66 66 65 72  rFree(Fts5Buffer
1600: 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  *);.void sqlite3
1610: 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 46  Fts5BufferZero(F
1620: 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 76 6f 69  ts5Buffer*);.voi
1630: 64 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  d sqlite3Fts5Buf
1640: 66 65 72 53 65 74 28 69 6e 74 2a 2c 20 46 74 73  ferSet(int*, Fts
1650: 35 42 75 66 66 65 72 2a 2c 20 69 6e 74 2c 20 63  5Buffer*, int, c
1660: 6f 6e 73 74 20 75 38 2a 29 3b 0a 76 6f 69 64 20  onst u8*);.void 
1670: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1680: 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 69 6e  rAppendPrintf(in
1690: 74 20 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  t *, Fts5Buffer*
16a0: 2c 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  , char *zFmt, ..
16b0: 2e 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .);.void sqlite3
16c0: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
16d0: 33 32 28 69 6e 74 2a 2c 20 46 74 73 35 42 75 66  32(int*, Fts5Buf
16e0: 66 65 72 2a 2c 20 69 6e 74 29 3b 0a 0a 23 64 65  fer*, int);..#de
16f0: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 5a  fine fts5BufferZ
1700: 65 72 6f 28 78 29 20 20 20 20 20 20 20 20 20 20  ero(x)          
1710: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1720: 66 66 65 72 5a 65 72 6f 28 78 29 0a 23 64 65 66  fferZero(x).#def
1730: 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 47 72  ine fts5BufferGr
1740: 6f 77 28 61 2c 62 2c 63 29 20 20 20 20 20 20 20  ow(a,b,c)       
1750: 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1760: 66 65 72 47 72 6f 77 28 61 2c 62 2c 63 29 0a 23  ferGrow(a,b,c).#
1770: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
1780: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 61 2c  rAppendVarint(a,
1790: 62 2c 63 29 20 73 71 6c 69 74 65 33 46 74 73 35  b,c) sqlite3Fts5
17a0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
17b0: 6e 74 28 61 2c 62 2c 63 29 0a 23 64 65 66 69 6e  nt(a,b,c).#defin
17c0: 65 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65  e fts5BufferFree
17d0: 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (a)             
17e0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
17f0: 72 46 72 65 65 28 61 29 0a 23 64 65 66 69 6e 65  rFree(a).#define
1800: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1810: 64 42 6c 6f 62 28 61 2c 62 2c 63 2c 64 29 20 73  dBlob(a,b,c,d) s
1820: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1830: 41 70 70 65 6e 64 42 6c 6f 62 28 61 2c 62 2c 63  AppendBlob(a,b,c
1840: 2c 64 29 0a 23 64 65 66 69 6e 65 20 66 74 73 35  ,d).#define fts5
1850: 42 75 66 66 65 72 53 65 74 28 61 2c 62 2c 63 2c  BufferSet(a,b,c,
1860: 64 29 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  d)        sqlite
1870: 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 61  3Fts5BufferSet(a
1880: 2c 62 2c 63 2c 64 29 0a 23 64 65 66 69 6e 65 20  ,b,c,d).#define 
1890: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
18a0: 33 32 28 61 2c 62 2c 63 29 20 20 20 20 20 73 71  32(a,b,c)     sq
18b0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
18c0: 70 70 65 6e 64 33 32 28 61 2c 62 2c 63 29 0a 0a  ppend32(a,b,c)..
18d0: 2f 2a 20 57 72 69 74 65 20 61 6e 64 20 64 65 63  /* Write and dec
18e0: 6f 64 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 33  ode big-endian 3
18f0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  2-bit integer va
1900: 6c 75 65 73 20 2a 2f 0a 76 6f 69 64 20 73 71 6c  lues */.void sql
1910: 69 74 65 33 46 74 73 35 50 75 74 33 32 28 75 38  ite3Fts5Put32(u8
1920: 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c  *, int);.int sql
1930: 69 74 65 33 46 74 73 35 47 65 74 33 32 28 63 6f  ite3Fts5Get32(co
1940: 6e 73 74 20 75 38 2a 29 3b 0a 0a 23 64 65 66 69  nst u8*);..#defi
1950: 6e 65 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55  ne FTS5_POS2COLU
1960: 4d 4e 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69  MN(iPos) (int)(i
1970: 50 6f 73 20 3e 3e 20 33 32 29 0a 23 64 65 66 69  Pos >> 32).#defi
1980: 6e 65 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53  ne FTS5_POS2OFFS
1990: 45 54 28 69 50 6f 73 29 20 28 69 6e 74 29 28 69  ET(iPos) (int)(i
19a0: 50 6f 73 20 26 20 30 78 46 46 46 46 46 46 46 46  Pos & 0xFFFFFFFF
19b0: 29 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  )..typedef struc
19c0: 74 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  t Fts5PoslistRea
19d0: 64 65 72 20 46 74 73 35 50 6f 73 6c 69 73 74 52  der Fts5PoslistR
19e0: 65 61 64 65 72 3b 0a 73 74 72 75 63 74 20 46 74  eader;.struct Ft
19f0: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
1a00: 7b 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  {.  /* Variables
1a10: 20 75 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 71   used only by sq
1a20: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1a30: 49 74 65 72 58 58 58 28 29 20 66 75 6e 63 74 69  IterXXX() functi
1a40: 6f 6e 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ons. */.  int iC
1a50: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1a70: 28 69 43 6f 6c 3e 3d 30 29 2c 20 74 68 69 73 20  (iCol>=0), this 
1a80: 63 6f 6c 75 6d 6e 20 6f 6e 6c 79 20 2a 2f 0a 20  column only */. 
1a90: 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20 20   const u8 *a;   
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73   /* Position lis
1ac0: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
1ad0: 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ough */.  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 20 2f 2a 20 53 69 7a            /* Siz
1b00: 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 61  e of buffer at a
1b10: 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  [] in bytes */. 
1b20: 20 69 6e 74 20 69 3b 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: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73   /* Current offs
1b50: 65 74 20 69 6e 20 61 5b 5d 20 2a 2f 0a 0a 20 20  et in a[] */..  
1b60: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
1b70: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f  les */.  int bEo
1b80: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
1ba0: 74 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a  to true at EOF *
1bb0: 2f 0a 20 20 69 36 34 20 69 50 6f 73 3b 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 20 2f 2a 20 28 69 43 6f 6c 3c 3c 33 32      /* (iCol<<32
1be0: 29 20 2b 20 69 50 6f 73 20 2a 2f 0a 7d 3b 0a 69  ) + iPos */.};.i
1bf0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  nt sqlite3Fts5Po
1c00: 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28  slistReaderInit(
1c10: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 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 20 2f 2a 20 49 66 20 28 69 43 6f 6c 3e 3d     /* If (iCol>=
1c40: 30 29 2c 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  0), this column 
1c50: 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  only */.  const 
1c60: 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20  u8 *a, int n,   
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
1c80: 6c 69 73 74 20 62 75 66 66 65 72 20 74 6f 20 69  list buffer to i
1c90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
1ca0: 2f 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52  /.  Fts5PoslistR
1cb0: 65 61 64 65 72 20 2a 70 49 74 65 72 20 20 20 20  eader *pIter    
1cc0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
1cd0: 6f 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61  object to initia
1ce0: 6c 69 7a 65 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73  lize */.);.int s
1cf0: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1d00: 74 52 65 61 64 65 72 4e 65 78 74 28 46 74 73 35  tReaderNext(Fts5
1d10: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 2a 29 3b  PoslistReader*);
1d20: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
1d30: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
1d40: 65 72 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72  er Fts5PoslistWr
1d50: 69 74 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73  iter;.struct Fts
1d60: 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 7b  5PoslistWriter {
1d70: 0a 20 20 69 36 34 20 69 50 72 65 76 3b 0a 7d 3b  .  i64 iPrev;.};
1d80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1d90: 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
1da0: 65 6e 64 28 46 74 73 35 42 75 66 66 65 72 2a 2c  end(Fts5Buffer*,
1db0: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
1dc0: 65 72 2a 2c 20 69 36 34 29 3b 0a 0a 69 6e 74 20  er*, i64);..int 
1dd0: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1de0: 73 74 4e 65 78 74 36 34 28 0a 20 20 63 6f 6e 73  stNext64(.  cons
1df0: 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20  t u8 *a, int n, 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1e10: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1e20: 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e   poslist */.  in
1e30: 74 20 2a 70 69 2c 20 20 20 20 20 20 20 20 20 20  t *pi,          
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e50: 20 49 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20   IN/OUT: Offset 
1e60: 77 69 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  within a[] */.  
1e70: 69 36 34 20 2a 70 69 4f 66 66 20 20 20 20 20 20  i64 *piOff      
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65  /* IN/OUT: Curre
1ea0: 6e 74 20 6f 66 66 73 65 74 20 2a 2f 0a 29 3b 0a  nt offset */.);.
1eb0: 0a 2f 2a 20 4d 61 6c 6c 6f 63 20 75 74 69 6c 69  ./* Malloc utili
1ec0: 74 79 20 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  ty */.void *sqli
1ed0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
1ee0: 6f 28 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74 20  o(int *pRc, int 
1ef0: 6e 42 79 74 65 29 3b 0a 63 68 61 72 20 2a 73 71  nByte);.char *sq
1f00: 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70  lite3Fts5Strndup
1f10: 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74  (int *pRc, const
1f20: 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20   char *pIn, int 
1f30: 6e 49 6e 29 3b 0a 0a 2f 2a 20 43 68 61 72 61 63  nIn);../* Charac
1f40: 74 65 72 20 73 65 74 20 74 65 73 74 73 20 28 6c  ter set tests (l
1f50: 69 6b 65 20 69 73 73 70 61 63 65 28 29 2c 20 69  ike isspace(), i
1f60: 73 61 6c 70 68 61 28 29 20 65 74 63 2e 29 20 2a  salpha() etc.) *
1f70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1f80: 35 49 73 42 61 72 65 77 6f 72 64 28 63 68 61 72  5IsBareword(char
1f90: 20 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20   t);../*.** End 
1fa0: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  of interface to 
1fb0: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 62 75 66  code in fts5_buf
1fc0: 66 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  fer.c..*********
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 2a  ****************
2000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2010: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
2020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2060: 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
2070: 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 69 6e 64  code in fts5_ind
2080: 65 78 2e 63 2e 20 66 74 73 35 5f 69 6e 64 65 78  ex.c. fts5_index
2090: 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e 74  .c contains cont
20a0: 61 69 6e 73 20 63 6f 64 65 0a 2a 2a 20 74 6f 20  ains code.** to 
20b0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 20  access the data 
20c0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f  stored in the %_
20d0: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  data table..*/..
20e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
20f0: 74 73 35 49 6e 64 65 78 20 46 74 73 35 49 6e 64  ts5Index Fts5Ind
2100: 65 78 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ex;.typedef stru
2110: 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ct Fts5IndexIter
2120: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 3b 0a   Fts5IndexIter;.
2130: 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 75 73  ./*.** Values us
2140: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
2150: 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
2160: 20 70 61 73 73 65 64 20 74 6f 20 49 6e 64 65 78   passed to Index
2170: 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 23 64 65 66  Query()..*/.#def
2180: 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  ine FTS5INDEX_QU
2190: 45 52 59 5f 50 52 45 46 49 58 20 20 20 20 20 30  ERY_PREFIX     0
21a0: 78 30 30 30 31 20 20 20 2f 2a 20 50 72 65 66 69  x0001   /* Prefi
21b0: 78 20 71 75 65 72 79 20 2a 2f 0a 23 64 65 66 69  x query */.#defi
21c0: 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  ne FTS5INDEX_QUE
21d0: 52 59 5f 44 45 53 43 20 20 20 20 20 20 20 30 78  RY_DESC       0x
21e0: 30 30 30 32 20 20 20 2f 2a 20 44 6f 63 73 20 69  0002   /* Docs i
21f0: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  n descending row
2200: 69 64 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66  id order */.#def
2210: 69 6e 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  ine FTS5INDEX_QU
2220: 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 30  ERY_TEST_NOIDX 0
2230: 78 30 30 30 34 20 20 20 2f 2a 20 44 6f 20 6e 6f  x0004   /* Do no
2240: 74 20 75 73 65 20 70 72 65 66 69 78 20 69 6e 64  t use prefix ind
2250: 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  ex */.#define FT
2260: 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
2270: 41 4e 20 20 20 20 20 20 20 30 78 30 30 30 38 20  AN       0x0008 
2280: 20 20 2f 2a 20 53 63 61 6e 20 71 75 65 72 79 20    /* Scan query 
2290: 28 66 74 73 35 76 6f 63 61 62 29 20 2a 2f 0a 0a  (fts5vocab) */..
22a0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 2f 64 65 73  /*.** Create/des
22b0: 74 72 6f 79 20 61 6e 20 46 74 73 35 49 6e 64 65  troy an Fts5Inde
22c0: 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74  x object..*/.int
22d0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22e0: 78 4f 70 65 6e 28 46 74 73 35 43 6f 6e 66 69 67  xOpen(Fts5Config
22f0: 20 2a 70 43 6f 6e 66 69 67 2c 20 69 6e 74 20 62   *pConfig, int b
2300: 43 72 65 61 74 65 2c 20 46 74 73 35 49 6e 64 65  Create, Fts5Inde
2310: 78 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69 6e  x**, char**);.in
2320: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2330: 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  exClose(Fts5Inde
2340: 78 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f  x *p);../*.** fo
2350: 72 28 0a 2a 2a 20 20 20 70 49 74 65 72 20 3d 20  r(.**   pIter = 
2360: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2370: 51 75 65 72 79 28 70 2c 20 22 74 6f 6b 65 6e 22  Query(p, "token"
2380: 2c 20 35 2c 20 30 29 3b 0a 2a 2a 20 20 20 30 3d  , 5, 0);.**   0=
2390: 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  =sqlite3Fts5Iter
23a0: 45 6f 66 28 70 49 74 65 72 29 3b 0a 2a 2a 20 20  Eof(pIter);.**  
23b0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
23c0: 4e 65 78 74 28 70 49 74 65 72 29 0a 2a 2a 20 29  Next(pIter).** )
23d0: 7b 0a 2a 2a 20 20 20 69 36 34 20 69 52 6f 77 69  {.**   i64 iRowi
23e0: 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  d = sqlite3Fts5I
23f0: 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b  terRowid(pIter);
2400: 0a 2a 2a 20 7d 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  .** }.*/../*.** 
2410: 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61  Open a new itera
2420: 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  tor to iterate t
2430: 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69 64 73  hough all docids
2440: 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
2450: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f  .** specified to
2460: 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65  ken or token pre
2470: 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  fix..*/.int sqli
2480: 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
2490: 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  y(.  Fts5Index *
24a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24b0: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
24c0: 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  x to query */.  
24d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
24e0: 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  en, int nToken, 
24f0: 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65  /* Token (or pre
2500: 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f  fix) to query fo
2510: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
2520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2530: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2540: 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  f FTS5INDEX_QUER
2550: 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  Y_X flags */.  F
2560: 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70  ts5IndexIter **p
2570: 70 49 74 65 72 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  pIter.);../*.** 
2580: 54 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72  The various oper
2590: 61 74 69 6f 6e 73 20 6f 6e 20 6f 70 65 6e 20 74  ations on open t
25a0: 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
25b0: 65 66 69 78 20 69 74 65 72 61 74 6f 72 73 20 6f  efix iterators o
25c0: 70 65 6e 65 64 0a 2a 2a 20 75 73 69 6e 67 20 73  pened.** using s
25d0: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
25e0: 75 65 72 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  uery()..*/.int s
25f0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
2600: 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a  f(Fts5IndexIter*
2610: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
2620: 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  s5IterNext(Fts5I
2630: 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69 6e 74 20  ndexIter*);.int 
2640: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
2650: 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
2660: 78 49 74 65 72 2a 2c 20 69 36 34 20 69 4d 61 74  xIter*, i64 iMat
2670: 63 68 29 3b 0a 69 36 34 20 73 71 6c 69 74 65 33  ch);.i64 sqlite3
2680: 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 46 74  Fts5IterRowid(Ft
2690: 73 35 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 69  s5IndexIter*);.i
26a0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
26b0: 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e  erPoslist(Fts5In
26c0: 64 65 78 49 74 65 72 2a 2c 20 63 6f 6e 73 74 20  dexIter*, const 
26d0: 75 38 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 6e  u8 **pp, int *pn
26e0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  );../*.** Close 
26f0: 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e  an iterator open
2700: 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 74 73  ed by sqlite3Fts
2710: 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a  5IndexQuery()..*
2720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
2730: 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35  s5IterClose(Fts5
2740: 49 6e 64 65 78 49 74 65 72 2a 29 3b 0a 0a 2f 2a  IndexIter*);../*
2750: 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
2760: 63 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ce is used by th
2770: 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75  e fts5vocab modu
2780: 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2790: 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74  r *sqlite3Fts5It
27a0: 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
27b0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 69 6e  Iter*, int*);.in
27c0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
27d0: 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e  rNextScan(Fts5In
27e0: 64 65 78 49 74 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a  dexIter*);.../*.
27f0: 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d  ** Insert or rem
2800: 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66  ove data to or f
2810: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45  rom the index. E
2820: 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d  ach time a docum
2830: 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64  ent is .** added
2840: 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66   to or removed f
2850: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74  rom the index, t
2860: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2870: 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  called one or mo
2880: 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a  re.** times..**.
2890: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74  ** For an insert
28a0: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
28b0: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
28c0: 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e  h token in the n
28d0: 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20  ew document..** 
28e0: 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
28f0: 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74   is a delete, it
2900: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
2910: 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20  (at least) once 
2920: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71  for each.** uniq
2930: 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ue token in the 
2940: 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  document with an
2950: 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73   iCol value less
2960: 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20   than zero. The 
2970: 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iPos.** argument
2980: 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
2990: 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74  a delete..*/.int
29a0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
29b0: 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e  xWrite(.  Fts5In
29c0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
29d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29e0: 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  ex to write to *
29f0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
2a20: 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28  ken appears in (
2a30: 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a  -ve -> delete) *
2a40: 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  /.  int iPos,   
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
2a70: 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
2a80: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73  column */.  cons
2a90: 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
2aa0: 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54  int nToken  /* T
2ab0: 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72  oken to add or r
2ac0: 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d  emove to or from
2ad0: 20 69 6e 64 65 78 20 2a 2f 0a 29 3b 0a 0a 2f 2a   index */.);../*
2ae0: 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
2af0: 74 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  t subsequent cal
2b00: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ls to sqlite3Fts
2b10: 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65  5IndexWrite() pe
2b20: 72 74 61 69 6e 20 74 6f 0a 2a 2a 20 64 6f 63 75  rtain to.** docu
2b30: 6d 65 6e 74 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a  ment iDocid..*/.
2b40: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2b50: 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 0a  ndexBeginWrite(.
2b60: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
2b90: 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
2ba0: 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20  iDocid          
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2bc0: 6f 63 69 64 20 74 6f 20 61 64 64 20 6f 72 20 72  ocid to add or r
2bd0: 65 6d 6f 76 65 20 64 61 74 61 20 66 72 6f 6d 20  emove data from 
2be0: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  */.);../*.** Flu
2bf0: 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  sh any data stor
2c00: 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
2c10: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
2c20: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
2c30: 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
2c40: 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
2c50: 20 61 6c 73 6f 20 63 6c 6f 73 65 20 61 6e 79 20   also close any 
2c60: 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e 64 6c 65  open blob handle
2c70: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2c80: 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46  3Fts5IndexSync(F
2c90: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
2ca0: 20 62 43 6f 6d 6d 69 74 29 3b 0a 0a 2f 2a 0a 2a   bCommit);../*.*
2cb0: 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61  * Discard any da
2cc0: 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
2cd0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2ce0: 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77  tables. Do not w
2cf0: 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68  rite it.** to th
2d00: 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
2d10: 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65  tionally, assume
2d20: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2d30: 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61  ts of the %_data
2d40: 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61  .** table may ha
2d50: 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69  ve changed on di
2d60: 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65  sk. So any in-me
2d70: 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25  mory caches of %
2d80: 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64  _data .** record
2d90: 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69  s must be invali
2da0: 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  dated..*/.int sq
2db0: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f  lite3Fts5IndexRo
2dc0: 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78  llback(Fts5Index
2dd0: 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   *p);../*.** Ret
2de0: 72 69 65 76 65 20 61 6e 64 20 63 6c 65 61 72 20  rieve and clear 
2df0: 74 68 65 20 63 75 72 72 65 6e 74 20 65 72 72 6f  the current erro
2e00: 72 20 63 6f 64 65 2c 20 72 65 73 70 65 63 74 69  r code, respecti
2e10: 76 65 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vely..*/.int sql
2e20: 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 72 72  ite3Fts5IndexErr
2e30: 63 6f 64 65 28 46 74 73 35 49 6e 64 65 78 2a 29  code(Fts5Index*)
2e40: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
2e50: 73 35 49 6e 64 65 78 52 65 73 65 74 28 46 74 73  s5IndexReset(Fts
2e60: 35 49 6e 64 65 78 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  5Index*);../*.**
2e70: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
2e80: 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
2e90: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2ea0: 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65  3Fts5IndexGetAve
2eb0: 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
2ec0: 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  *p, Fts5Buffer *
2ed0: 70 42 75 66 29 3b 0a 69 6e 74 20 73 71 6c 69 74  pBuf);.int sqlit
2ee0: 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76  e3Fts5IndexSetAv
2ef0: 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
2f00: 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20   *p, const u8*, 
2f10: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  int);../*.** Fun
2f20: 63 74 69 6f 6e 73 20 63 61 6c 6c 65 64 20 62 79  ctions called by
2f30: 20 74 68 65 20 73 74 6f 72 61 67 65 20 6d 6f 64   the storage mod
2f40: 75 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 69  ule as part of i
2f50: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a  ntegrity-check..
2f60: 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74  */.u64 sqlite3Ft
2f70: 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 46 74 73  s5IndexCksum(Fts
2f80: 35 43 6f 6e 66 69 67 2a 2c 69 36 34 2c 69 6e 74  5Config*,i64,int
2f90: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
2fa0: 2c 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74  ,int);.int sqlit
2fb0: 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67  e3Fts5IndexInteg
2fc0: 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e  rityCheck(Fts5In
2fd0: 64 65 78 2a 2c 20 75 36 34 20 63 6b 73 75 6d 29  dex*, u64 cksum)
2fe0: 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 65 64  ;../* .** Called
2ff0: 20 64 75 72 69 6e 67 20 76 69 72 74 75 61 6c 20   during virtual 
3000: 6d 6f 64 75 6c 65 20 69 6e 69 74 69 61 6c 69 7a  module initializ
3010: 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65  ation to registe
3020: 72 20 55 44 46 20 0a 2a 2a 20 66 74 73 35 5f 64  r UDF .** fts5_d
3030: 65 63 6f 64 65 28 29 20 77 69 74 68 20 53 51 4c  ecode() with SQL
3040: 69 74 65 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ite .*/.int sqli
3050: 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74  te3Fts5IndexInit
3060: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 69 6e 74  (sqlite3*);..int
3070: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
3080: 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49  xSetCookie(Fts5I
3090: 6e 64 65 78 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ndex*, int);../*
30a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
30b0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65  otal number of e
30c0: 6e 74 72 69 65 73 20 72 65 61 64 20 66 72 6f 6d  ntries read from
30d0: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
30e0: 65 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 63 6f  e by .** this co
30f0: 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 69  nnection since i
3100: 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
3110: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3120: 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35  5IndexReads(Fts5
3130: 49 6e 64 65 78 20 2a 70 29 3b 0a 0a 69 6e 74 20  Index *p);..int 
3140: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
3150: 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78  Reinit(Fts5Index
3160: 20 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *p);.int sqlite
3170: 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69  3Fts5IndexOptimi
3180: 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ze(Fts5Index *p)
3190: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
31a0: 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35  5IndexMerge(Fts5
31b0: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d  Index *p, int nM
31c0: 65 72 67 65 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  erge);..int sqli
31d0: 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64  te3Fts5IndexLoad
31e0: 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78  Config(Fts5Index
31f0: 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74   *p);..int sqlit
3200: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 33  e3Fts5GetVarint3
3210: 32 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  2(const unsigned
3220: 20 63 68 61 72 20 2a 70 2c 20 75 33 32 20 2a 76   char *p, u32 *v
3230: 29 3b 0a 23 64 65 66 69 6e 65 20 66 74 73 35 47  );.#define fts5G
3240: 65 74 56 61 72 69 6e 74 33 32 28 61 2c 62 29 20  etVarint32(a,b) 
3250: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
3260: 72 69 6e 74 33 32 28 61 2c 28 75 33 32 2a 29 26  rint32(a,(u32*)&
3270: 62 29 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  b)..int sqlite3F
3280: 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28  ts5GetVarintLen(
3290: 75 33 32 20 69 56 61 6c 29 3b 0a 0a 2f 2a 0a 2a  u32 iVal);../*.*
32a0: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
32b0: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
32c0: 73 35 5f 69 6e 64 65 78 2e 63 2e 0a 2a 2a 2a 2a  s5_index.c..****
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3310: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
3320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3360: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
3370: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
3380: 35 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71  5.c. .*/..int sq
3390: 6c 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b 65  lite3Fts5GetToke
33a0: 6e 69 7a 65 72 28 0a 20 20 46 74 73 35 47 6c 6f  nizer(.  Fts5Glo
33b0: 62 61 6c 2a 2c 20 0a 20 20 63 6f 6e 73 74 20 63  bal*, .  const c
33c0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69  har **azArg,.  i
33d0: 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74 73 35 54  nt nArg,.  Fts5T
33e0: 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a 20 20 66 74  okenizer**,.  ft
33f0: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2a 2a 2c 0a  s5_tokenizer**,.
3400: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
3410: 3b 0a 0a 46 74 73 35 49 6e 64 65 78 20 2a 73 71  ;..Fts5Index *sq
3420: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 46 72  lite3Fts5IndexFr
3430: 6f 6d 43 73 72 69 64 28 46 74 73 35 47 6c 6f 62  omCsrid(Fts5Glob
3440: 61 6c 2a 2c 20 69 36 34 2c 20 69 6e 74 2a 29 3b  al*, i64, int*);
3450: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69  ../*.** End of i
3460: 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65  nterface to code
3470: 20 69 6e 20 66 74 73 35 2e 63 2e 0a 2a 2a 2a 2a   in fts5.c..****
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34c0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
34d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3510: 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ****.** Interfac
3520: 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73  e to code in fts
3530: 35 5f 68 61 73 68 2e 63 2e 20 0a 2a 2f 0a 74 79  5_hash.c. .*/.ty
3540: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
3550: 35 48 61 73 68 20 46 74 73 35 48 61 73 68 3b 0a  5Hash Fts5Hash;.
3560: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3570: 68 61 73 68 20 74 61 62 6c 65 2c 20 66 72 65 65  hash table, free
3580: 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a   a hash table..*
3590: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
35a0: 35 48 61 73 68 4e 65 77 28 46 74 73 35 48 61 73  5HashNew(Fts5Has
35b0: 68 2a 2a 2c 20 69 6e 74 20 2a 70 6e 53 69 7a 65  h**, int *pnSize
35c0: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
35d0: 74 73 35 48 61 73 68 46 72 65 65 28 46 74 73 35  ts5HashFree(Fts5
35e0: 48 61 73 68 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c  Hash*);..int sql
35f0: 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
3600: 65 28 0a 20 20 46 74 73 35 48 61 73 68 2a 2c 0a  e(.  Fts5Hash*,.
3610: 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3630: 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
3640: 68 69 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  his entry */.  i
3650: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3670: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
3680: 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
3690: 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
36a0: 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36c0: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
36d0: 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
36e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 62 42 79 74  n */.  char bByt
36f0: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
3700: 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
3710: 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
3720: 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
3730: 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
3740: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6d 70  */.);../*.** Emp
3750: 74 79 20 28 62 75 74 20 64 6f 20 6e 6f 74 20 64  ty (but do not d
3760: 65 6c 65 74 65 29 20 61 20 68 61 73 68 20 74 61  elete) a hash ta
3770: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
3780: 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
3790: 72 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 0a 69  r(Fts5Hash*);..i
37a0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 48 61  nt sqlite3Fts5Ha
37b0: 73 68 51 75 65 72 79 28 0a 20 20 46 74 73 35 48  shQuery(.  Fts5H
37c0: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
37e0: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
37f0: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
3800: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
3810: 65 72 6d 2c 20 20 20 2f 2a 20 51 75 65 72 79 20  erm,   /* Query 
3820: 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
3830: 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74 2c 20  u8 **ppDoclist, 
3840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3850: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  : Pointer to doc
3860: 6c 69 73 74 20 66 6f 72 20 70 54 65 72 6d 20 2a  list for pTerm *
3870: 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 6c 69  /.  int *pnDocli
3880: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
3890: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
38a0: 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
38b0: 79 74 65 73 20 2a 2f 0a 29 3b 0a 0a 69 6e 74 20  ytes */.);..int 
38c0: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
38d0: 63 61 6e 49 6e 69 74 28 0a 20 20 46 74 73 35 48  canInit(.  Fts5H
38e0: 61 73 68 2a 2c 20 20 20 20 20 20 20 20 20 20 20  ash*,           
38f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3900: 73 68 20 74 61 62 6c 65 20 74 6f 20 71 75 65 72  sh table to quer
3910: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
3920: 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
3930: 65 72 6d 20 20 20 20 2f 2a 20 51 75 65 72 79 20  erm    /* Query 
3940: 70 72 65 66 69 78 20 2a 2f 0a 29 3b 0a 76 6f 69  prefix */.);.voi
3950: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
3960: 68 53 63 61 6e 4e 65 78 74 28 46 74 73 35 48 61  hScanNext(Fts5Ha
3970: 73 68 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  sh*);.int sqlite
3980: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
3990: 28 46 74 73 35 48 61 73 68 2a 29 3b 0a 76 6f 69  (Fts5Hash*);.voi
39a0: 64 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  d sqlite3Fts5Has
39b0: 68 53 63 61 6e 45 6e 74 72 79 28 46 74 73 35 48  hScanEntry(Fts5H
39c0: 61 73 68 20 2a 2c 0a 20 20 63 6f 6e 73 74 20 63  ash *,.  const c
39d0: 68 61 72 20 2a 2a 70 7a 54 65 72 6d 2c 20 20 20  har **pzTerm,   
39e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
39f0: 20 74 65 72 6d 20 28 6e 75 6c 2d 74 65 72 6d 69   term (nul-termi
3a00: 6e 61 74 65 64 29 20 2a 2f 0a 20 20 63 6f 6e 73  nated) */.  cons
3a10: 74 20 75 38 20 2a 2a 70 70 44 6f 63 6c 69 73 74  t u8 **ppDoclist
3a20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
3a30: 55 54 3a 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  UT: pointer to d
3a40: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
3a50: 2a 70 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20  *pnDoclist      
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3a70: 55 54 3a 20 73 69 7a 65 20 6f 66 20 64 6f 63 6c  UT: size of docl
3a80: 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
3a90: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  );.../*.** End o
3aa0: 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 63  f interface to c
3ab0: 6f 64 65 20 69 6e 20 66 74 73 35 5f 68 61 73 68  ode in fts5_hash
3ac0: 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c..************
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 2a 2a 2a 2a  ****************
3b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
3b10: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
3b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
3b60: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 63 6f 64  Interface to cod
3b70: 65 20 69 6e 20 66 74 73 35 5f 73 74 6f 72 61 67  e in fts5_storag
3b80: 65 2e 63 2e 20 66 74 73 35 5f 73 74 6f 72 61 67  e.c. fts5_storag
3b90: 65 2e 63 20 63 6f 6e 74 61 69 6e 73 20 63 6f 6e  e.c contains con
3ba0: 74 61 69 6e 73 20 0a 2a 2a 20 63 6f 64 65 20 74  tains .** code t
3bb0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
3bc0: 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
3bd0: 25 5f 63 6f 6e 74 65 6e 74 20 61 6e 64 20 25 5f  %_content and %_
3be0: 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 73 2e 0a  docsize tables..
3bf0: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  */..#define FTS5
3c00: 5f 53 54 4d 54 5f 53 43 41 4e 5f 41 53 43 20 20  _STMT_SCAN_ASC  
3c10: 30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  0     /* SELECT 
3c20: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
3c30: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 41 53 43  . ORDER BY 1 ASC
3c40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
3c50: 5f 53 54 4d 54 5f 53 43 41 4e 5f 44 45 53 43 20  _STMT_SCAN_DESC 
3c60: 31 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  1     /* SELECT 
3c70: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e 2e  rowid, * FROM ..
3c80: 2e 20 4f 52 44 45 52 20 42 59 20 31 20 44 45 53  . ORDER BY 1 DES
3c90: 43 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  C */.#define FTS
3ca0: 35 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 20 20 20  5_STMT_LOOKUP   
3cb0: 20 32 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54   2     /* SELECT
3cc0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 2e   rowid, * FROM .
3cd0: 2e 2e 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f  .. WHERE rowid=?
3ce0: 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
3cf0: 75 63 74 20 46 74 73 35 53 74 6f 72 61 67 65 20  uct Fts5Storage 
3d00: 46 74 73 35 53 74 6f 72 61 67 65 3b 0a 0a 69 6e  Fts5Storage;..in
3d10: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
3d20: 72 61 67 65 4f 70 65 6e 28 46 74 73 35 43 6f 6e  rageOpen(Fts5Con
3d30: 66 69 67 2a 2c 20 46 74 73 35 49 6e 64 65 78 2a  fig*, Fts5Index*
3d40: 2c 20 69 6e 74 2c 20 46 74 73 35 53 74 6f 72 61  , int, Fts5Stora
3d50: 67 65 2a 2a 2c 20 63 68 61 72 2a 2a 29 3b 0a 69  ge**, char**);.i
3d60: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  nt sqlite3Fts5St
3d70: 6f 72 61 67 65 43 6c 6f 73 65 28 46 74 73 35 53  orageClose(Fts5S
3d80: 74 6f 72 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74  torage *p);..int
3d90: 20 73 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70   sqlite3Fts5Drop
3da0: 41 6c 6c 28 46 74 73 35 43 6f 6e 66 69 67 2a 29  All(Fts5Config*)
3db0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
3dc0: 35 43 72 65 61 74 65 54 61 62 6c 65 28 46 74 73  5CreateTable(Fts
3dd0: 35 43 6f 6e 66 69 67 2a 2c 20 63 6f 6e 73 74 20  5Config*, const 
3de0: 63 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61  char*, const cha
3df0: 72 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2a  r*, int, char **
3e00: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
3e10: 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65  ts5StorageDelete
3e20: 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c  (Fts5Storage *p,
3e30: 20 69 36 34 29 3b 0a 69 6e 74 20 73 71 6c 69 74   i64);.int sqlit
3e40: 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 73  e3Fts5StorageIns
3e50: 65 72 74 28 46 74 73 35 53 74 6f 72 61 67 65 20  ert(Fts5Storage 
3e60: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  *p, sqlite3_valu
3e70: 65 20 2a 2a 61 70 56 61 6c 2c 20 69 6e 74 2c 20  e **apVal, int, 
3e80: 69 36 34 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  i64*);..int sqli
3e90: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e  te3Fts5StorageIn
3ea0: 74 65 67 72 69 74 79 28 46 74 73 35 53 74 6f 72  tegrity(Fts5Stor
3eb0: 61 67 65 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71  age *p);..int sq
3ec0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
3ed0: 53 74 6d 74 28 46 74 73 35 53 74 6f 72 61 67 65  Stmt(Fts5Storage
3ee0: 20 2a 70 2c 20 69 6e 74 20 65 53 74 6d 74 2c 20   *p, int eStmt, 
3ef0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2a 2c 20  sqlite3_stmt**, 
3f00: 63 68 61 72 2a 2a 29 3b 0a 76 6f 69 64 20 73 71  char**);.void sq
3f10: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
3f20: 53 74 6d 74 52 65 6c 65 61 73 65 28 46 74 73 35  StmtRelease(Fts5
3f30: 53 74 6f 72 61 67 65 20 2a 70 2c 20 69 6e 74 20  Storage *p, int 
3f40: 65 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 73  eStmt, sqlite3_s
3f50: 74 6d 74 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  tmt*);..int sqli
3f60: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 6f  te3Fts5StorageDo
3f70: 63 73 69 7a 65 28 46 74 73 35 53 74 6f 72 61 67  csize(Fts5Storag
3f80: 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  e *p, i64 iRowid
3f90: 2c 20 69 6e 74 20 2a 61 43 6f 6c 29 3b 0a 69 6e  , int *aCol);.in
3fa0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  t sqlite3Fts5Sto
3fb0: 72 61 67 65 53 69 7a 65 28 46 74 73 35 53 74 6f  rageSize(Fts5Sto
3fc0: 72 61 67 65 20 2a 70 2c 20 69 6e 74 20 69 43 6f  rage *p, int iCo
3fd0: 6c 2c 20 69 36 34 20 2a 70 6e 41 76 67 29 3b 0a  l, i64 *pnAvg);.
3fe0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 53  int sqlite3Fts5S
3ff0: 74 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28 46  torageRowCount(F
4000: 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 69  ts5Storage *p, i
4010: 36 34 20 2a 70 6e 52 6f 77 29 3b 0a 0a 69 6e 74  64 *pnRow);..int
4020: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
4030: 61 67 65 53 79 6e 63 28 46 74 73 35 53 74 6f 72  ageSync(Fts5Stor
4040: 61 67 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d  age *p, int bCom
4050: 6d 69 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  mit);.int sqlite
4060: 33 46 74 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c  3Fts5StorageRoll
4070: 62 61 63 6b 28 46 74 73 35 53 74 6f 72 61 67 65  back(Fts5Storage
4080: 20 2a 70 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74   *p);..int sqlit
4090: 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e  e3Fts5StorageCon
40a0: 66 69 67 56 61 6c 75 65 28 0a 20 20 20 20 46 74  figValue(.    Ft
40b0: 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20 63 6f  s5Storage *p, co
40c0: 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74  nst char*, sqlit
40d0: 65 33 5f 76 61 6c 75 65 2a 2c 20 69 6e 74 0a 29  e3_value*, int.)
40e0: 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ;..int sqlite3Ft
40f0: 73 35 53 74 6f 72 61 67 65 53 70 65 63 69 61 6c  s5StorageSpecial
4100: 44 65 6c 65 74 65 28 46 74 73 35 53 74 6f 72 61  Delete(Fts5Stora
4110: 67 65 20 2a 70 2c 20 69 36 34 20 69 44 65 6c 2c  ge *p, i64 iDel,
4120: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a   sqlite3_value**
4130: 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  );..int sqlite3F
4140: 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65  ts5StorageDelete
4150: 41 6c 6c 28 46 74 73 35 53 74 6f 72 61 67 65 20  All(Fts5Storage 
4160: 2a 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  *p);.int sqlite3
4170: 46 74 73 35 53 74 6f 72 61 67 65 52 65 62 75 69  Fts5StorageRebui
4180: 6c 64 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ld(Fts5Storage *
4190: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
41a0: 74 73 35 53 74 6f 72 61 67 65 4f 70 74 69 6d 69  ts5StorageOptimi
41b0: 7a 65 28 46 74 73 35 53 74 6f 72 61 67 65 20 2a  ze(Fts5Storage *
41c0: 70 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  p);.int sqlite3F
41d0: 74 73 35 53 74 6f 72 61 67 65 4d 65 72 67 65 28  ts5StorageMerge(
41e0: 46 74 73 35 53 74 6f 72 61 67 65 20 2a 70 2c 20  Fts5Storage *p, 
41f0: 69 6e 74 20 6e 4d 65 72 67 65 29 3b 0a 0a 2f 2a  int nMerge);../*
4200: 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  .** End of inter
4210: 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20  face to code in 
4220: 66 74 73 35 5f 73 74 6f 72 61 67 65 2e 63 2e 0a  fts5_storage.c..
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 2a 2a 2a 2a 2a 2a 2a  ****************
4270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
4280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74  *********.** Int
42d0: 65 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69  erface to code i
42e0: 6e 20 66 74 73 35 5f 65 78 70 72 2e 63 2e 20 0a  n fts5_expr.c. .
42f0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
4300: 74 20 46 74 73 35 45 78 70 72 20 46 74 73 35 45  t Fts5Expr Fts5E
4310: 78 70 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  xpr;.typedef str
4320: 75 63 74 20 46 74 73 35 45 78 70 72 4e 6f 64 65  uct Fts5ExprNode
4330: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 3b 0a 74   Fts5ExprNode;.t
4340: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
4350: 73 35 50 61 72 73 65 20 46 74 73 35 50 61 72 73  s5Parse Fts5Pars
4360: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
4370: 74 20 46 74 73 35 54 6f 6b 65 6e 20 46 74 73 35  t Fts5Token Fts5
4380: 54 6f 6b 65 6e 3b 0a 74 79 70 65 64 65 66 20 73  Token;.typedef s
4390: 74 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68  truct Fts5ExprPh
43a0: 72 61 73 65 20 46 74 73 35 45 78 70 72 50 68 72  rase Fts5ExprPhr
43b0: 61 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ase;.typedef str
43c0: 75 63 74 20 46 74 73 35 45 78 70 72 4e 65 61 72  uct Fts5ExprNear
43d0: 73 65 74 20 46 74 73 35 45 78 70 72 4e 65 61 72  set Fts5ExprNear
43e0: 73 65 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73  set;..struct Fts
43f0: 35 54 6f 6b 65 6e 20 7b 0a 20 20 63 6f 6e 73 74  5Token {.  const
4400: 20 63 68 61 72 20 2a 70 3b 20 20 20 20 20 20 20   char *p;       
4410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
4420: 6b 65 6e 20 74 65 78 74 20 28 6e 6f 74 20 4e 55  ken text (not NU
4430: 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 29 20 2a  LL terminated) *
4440: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
4470: 75 66 66 65 72 20 70 20 69 6e 20 62 79 74 65 73  uffer p in bytes
4480: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65   */.};../* Parse
4490: 20 61 20 4d 41 54 43 48 20 65 78 70 72 65 73 73   a MATCH express
44a0: 69 6f 6e 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion. */.int sqli
44b0: 74 65 33 46 74 73 35 45 78 70 72 4e 65 77 28 0a  te3Fts5ExprNew(.
44c0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
44d0: 6f 6e 66 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20  onfig, .  const 
44e0: 63 68 61 72 20 2a 7a 45 78 70 72 2c 0a 20 20 46  char *zExpr,.  F
44f0: 74 73 35 45 78 70 72 20 2a 2a 70 70 4e 65 77 2c  ts5Expr **ppNew,
4500: 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
4510: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 66 6f 72 28 72  .);../*.** for(r
4520: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  c = sqlite3Fts5E
4530: 78 70 72 46 69 72 73 74 28 70 45 78 70 72 2c 20  xprFirst(pExpr, 
4540: 70 49 64 78 2c 20 62 44 65 73 63 29 3b 0a 2a 2a  pIdx, bDesc);.**
4550: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
4560: 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  OK && 0==sqlite3
4570: 46 74 73 35 45 78 70 72 45 6f 66 28 70 45 78 70  Fts5ExprEof(pExp
4580: 72 29 3b 0a 2a 2a 20 20 20 20 20 72 63 20 3d 20  r);.**     rc = 
4590: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e  sqlite3Fts5ExprN
45a0: 65 78 74 28 70 45 78 70 72 29 0a 2a 2a 20 29 7b  ext(pExpr).** ){
45b0: 0a 2a 2a 20 20 20 2f 2f 20 54 68 65 20 64 6f 63  .**   // The doc
45c0: 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64  ument with rowid
45d0: 20 69 52 6f 77 69 64 20 6d 61 74 63 68 65 73 20   iRowid matches 
45e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 21 0a  the expression!.
45f0: 2a 2a 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  **   i64 iRowid 
4600: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  = sqlite3Fts5Exp
4610: 72 52 6f 77 69 64 28 70 45 78 70 72 29 3b 0a 2a  rRowid(pExpr);.*
4620: 2a 20 7d 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  * }.*/.int sqlit
4630: 65 33 46 74 73 35 45 78 70 72 46 69 72 73 74 28  e3Fts5ExprFirst(
4640: 46 74 73 35 45 78 70 72 2a 2c 20 46 74 73 35 49  Fts5Expr*, Fts5I
4650: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
4660: 62 44 65 73 63 29 3b 0a 69 6e 74 20 73 71 6c 69  bDesc);.int sqli
4670: 74 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28  te3Fts5ExprNext(
4680: 46 74 73 35 45 78 70 72 2a 29 3b 0a 69 6e 74 20  Fts5Expr*);.int 
4690: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 45  sqlite3Fts5ExprE
46a0: 6f 66 28 46 74 73 35 45 78 70 72 2a 29 3b 0a 69  of(Fts5Expr*);.i
46b0: 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  64 sqlite3Fts5Ex
46c0: 70 72 52 6f 77 69 64 28 46 74 73 35 45 78 70 72  prRowid(Fts5Expr
46d0: 2a 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  *);..void sqlite
46e0: 33 46 74 73 35 45 78 70 72 46 72 65 65 28 46 74  3Fts5ExprFree(Ft
46f0: 73 35 45 78 70 72 2a 29 3b 0a 0a 2f 2a 20 43 61  s5Expr*);../* Ca
4700: 6c 6c 65 64 20 64 75 72 69 6e 67 20 73 74 61 72  lled during star
4710: 74 75 70 20 74 6f 20 72 65 67 69 73 74 65 72 20  tup to register 
4720: 61 20 55 44 46 20 77 69 74 68 20 53 51 4c 69 74  a UDF with SQLit
4730: 65 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e */.int sqlite3
4740: 46 74 73 35 45 78 70 72 49 6e 69 74 28 46 74 73  Fts5ExprInit(Fts
4750: 35 47 6c 6f 62 61 6c 2a 2c 20 73 71 6c 69 74 65  5Global*, sqlite
4760: 33 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  3*);..int sqlite
4770: 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43  3Fts5ExprPhraseC
4780: 6f 75 6e 74 28 46 74 73 35 45 78 70 72 2a 29 3b  ount(Fts5Expr*);
4790: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
47a0: 45 78 70 72 50 68 72 61 73 65 53 69 7a 65 28 46  ExprPhraseSize(F
47b0: 74 73 35 45 78 70 72 2a 2c 20 69 6e 74 20 69 50  ts5Expr*, int iP
47c0: 68 72 61 73 65 29 3b 0a 69 6e 74 20 73 71 6c 69  hrase);.int sqli
47d0: 74 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69  te3Fts5ExprPosli
47e0: 73 74 28 46 74 73 35 45 78 70 72 2a 2c 20 69 6e  st(Fts5Expr*, in
47f0: 74 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 29 3b  t, const u8 **);
4800: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
4810: 35 45 78 70 72 50 68 72 61 73 65 45 78 70 72 28  5ExprPhraseExpr(
4820: 46 74 73 35 43 6f 6e 66 69 67 2a 2c 20 46 74 73  Fts5Config*, Fts
4830: 35 45 78 70 72 2a 2c 20 69 6e 74 2c 20 46 74 73  5Expr*, int, Fts
4840: 35 45 78 70 72 2a 2a 29 3b 0a 0a 2f 2a 2a 2a 2a  5Expr**);../****
4850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4870: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
4880: 74 73 35 5f 65 78 70 72 2e 63 20 41 50 49 20 61  ts5_expr.c API a
4890: 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20  bove this point 
48a0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  is used by the o
48b0: 74 68 65 72 20 68 61 6e 64 2d 77 72 69 74 74 65  ther hand-writte
48c0: 6e 0a 2a 2a 20 43 20 63 6f 64 65 20 69 6e 20 74  n.** C code in t
48d0: 68 69 73 20 6d 6f 64 75 6c 65 2e 20 54 68 65 20  his module. The 
48e0: 69 6e 74 65 72 66 61 63 65 73 20 62 65 6c 6f 77  interfaces below
48f0: 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20   this point are 
4900: 63 61 6c 6c 65 64 20 62 79 0a 2a 2a 20 74 68 65  called by.** the
4910: 20 70 61 72 73 65 72 20 63 6f 64 65 20 69 6e 20   parser code in 
4920: 66 74 73 35 70 61 72 73 65 2e 79 2e 20 20 2a 2f  fts5parse.y.  */
4930: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
4940: 73 35 50 61 72 73 65 45 72 72 6f 72 28 46 74 73  s5ParseError(Fts
4950: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
4960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
4970: 2c 20 2e 2e 2e 29 3b 0a 0a 46 74 73 35 45 78 70  , ...);..Fts5Exp
4980: 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65 33 46 74  rNode *sqlite3Ft
4990: 73 35 50 61 72 73 65 4e 6f 64 65 28 0a 20 20 46  s5ParseNode(.  F
49a0: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
49b0: 2c 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 0a 20  ,.  int eType,. 
49c0: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
49d0: 4c 65 66 74 2c 0a 20 20 46 74 73 35 45 78 70 72  Left,.  Fts5Expr
49e0: 4e 6f 64 65 20 2a 70 52 69 67 68 74 2c 0a 20 20  Node *pRight,.  
49f0: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
4a00: 2a 70 4e 65 61 72 0a 29 3b 0a 0a 46 74 73 35 45  *pNear.);..Fts5E
4a10: 78 70 72 50 68 72 61 73 65 20 2a 73 71 6c 69 74  xprPhrase *sqlit
4a20: 65 33 46 74 73 35 50 61 72 73 65 54 65 72 6d 28  e3Fts5ParseTerm(
4a30: 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
4a40: 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78 70  arse, .  Fts5Exp
4a50: 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
4a60: 2c 20 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a  , .  Fts5Token *
4a70: 70 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 62 50  pToken,.  int bP
4a80: 72 65 66 69 78 0a 29 3b 0a 0a 46 74 73 35 45 78  refix.);..Fts5Ex
4a90: 70 72 4e 65 61 72 73 65 74 20 2a 73 71 6c 69 74  prNearset *sqlit
4aa0: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73  e3Fts5ParseNears
4ab0: 65 74 28 0a 20 20 46 74 73 35 50 61 72 73 65 2a  et(.  Fts5Parse*
4ac0: 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61  , .  Fts5ExprNea
4ad0: 72 73 65 74 2a 2c 0a 20 20 46 74 73 35 45 78 70  rset*,.  Fts5Exp
4ae0: 72 50 68 72 61 73 65 2a 20 0a 29 3b 0a 0a 76 6f  rPhrase* .);..vo
4af0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
4b00: 72 73 65 50 68 72 61 73 65 46 72 65 65 28 46 74  rsePhraseFree(Ft
4b10: 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0a  s5ExprPhrase*);.
4b20: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
4b30: 50 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65  ParseNearsetFree
4b40: 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74  (Fts5ExprNearset
4b50: 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  *);.void sqlite3
4b60: 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65  Fts5ParseNodeFre
4b70: 65 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29  e(Fts5ExprNode*)
4b80: 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ;..void sqlite3F
4b90: 74 73 35 50 61 72 73 65 53 65 74 44 69 73 74 61  ts5ParseSetDista
4ba0: 6e 63 65 28 46 74 73 35 50 61 72 73 65 2a 2c 20  nce(Fts5Parse*, 
4bb0: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a  Fts5ExprNearset*
4bc0: 2c 20 46 74 73 35 54 6f 6b 65 6e 2a 29 3b 0a 76  , Fts5Token*);.v
4bd0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
4be0: 61 72 73 65 53 65 74 43 6f 6c 75 6d 6e 28 46 74  arseSetColumn(Ft
4bf0: 73 35 50 61 72 73 65 2a 2c 20 46 74 73 35 45 78  s5Parse*, Fts5Ex
4c00: 70 72 4e 65 61 72 73 65 74 2a 2c 20 46 74 73 35  prNearset*, Fts5
4c10: 54 6f 6b 65 6e 2a 29 3b 0a 76 6f 69 64 20 73 71  Token*);.void sq
4c20: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46 69  lite3Fts5ParseFi
4c30: 6e 69 73 68 65 64 28 46 74 73 35 50 61 72 73 65  nished(Fts5Parse
4c40: 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45 78   *pParse, Fts5Ex
4c50: 70 72 4e 6f 64 65 20 2a 70 29 3b 0a 76 6f 69 64  prNode *p);.void
4c60: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
4c70: 65 4e 65 61 72 28 46 74 73 35 50 61 72 73 65 20  eNear(Fts5Parse 
4c80: 2a 70 50 61 72 73 65 2c 20 46 74 73 35 54 6f 6b  *pParse, Fts5Tok
4c90: 65 6e 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64  en*);../*.** End
4ca0: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
4cb0: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 65 78   code in fts5_ex
4cc0: 70 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  pr.c..**********
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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d10: 2f 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..../**********
4d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d60: 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
4d70: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 61 75   code in fts5_au
4d80: 78 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74 20 73 71  x.c. .*/..int sq
4d90: 6c 69 74 65 33 46 74 73 35 41 75 78 49 6e 69 74  lite3Fts5AuxInit
4da0: 28 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a  (fts5_api*);./*.
4db0: 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66  ** End of interf
4dc0: 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66  ace to code in f
4dd0: 74 73 35 5f 61 75 78 2e 63 2e 0a 2a 2a 2a 2a 2a  ts5_aux.c..*****
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e20: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
4e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e70: 2a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ***.** Interface
4e80: 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35   to code in fts5
4e90: 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 20 0a 2a  _tokenizer.c. .*
4ea0: 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  /..int sqlite3Ft
4eb0: 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e 69 74 28  s5TokenizerInit(
4ec0: 66 74 73 35 5f 61 70 69 2a 29 3b 0a 2f 2a 0a 2a  fts5_api*);./*.*
4ed0: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 66 61  * End of interfa
4ee0: 63 65 20 74 6f 20 63 6f 64 65 20 69 6e 20 66 74  ce to code in ft
4ef0: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 2e 63 2e 0a  s5_tokenizer.c..
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
4f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
4fa0: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
4fb0: 20 66 74 73 35 5f 73 6f 72 74 65 72 2e 63 2e 20   fts5_sorter.c. 
4fc0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
4fd0: 63 74 20 46 74 73 35 53 6f 72 74 65 72 20 46 74  ct Fts5Sorter Ft
4fe0: 73 35 53 6f 72 74 65 72 3b 0a 0a 69 6e 74 20 73  s5Sorter;..int s
4ff0: 71 6c 69 74 65 33 46 74 73 35 53 6f 72 74 65 72  qlite3Fts5Sorter
5000: 4e 65 77 28 46 74 73 35 45 78 70 72 20 2a 70 45  New(Fts5Expr *pE
5010: 78 70 72 2c 20 46 74 73 35 53 6f 72 74 65 72 20  xpr, Fts5Sorter 
5020: 2a 2a 70 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 6e  **pp);../*.** En
5030: 64 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74  d of interface t
5040: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 73  o code in fts5_s
5050: 6f 72 74 65 72 2e 63 2e 0a 2a 2a 2a 2a 2a 2a 2a  orter.c..*******
5060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50a0: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
50b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50f0: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
5100: 6f 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 76  o code in fts5_v
5110: 6f 63 61 62 2e 63 2e 20 0a 2a 2f 0a 0a 69 6e 74  ocab.c. .*/..int
5120: 20 73 71 6c 69 74 65 33 46 74 73 35 56 6f 63 61   sqlite3Fts5Voca
5130: 62 49 6e 69 74 28 46 74 73 35 47 6c 6f 62 61 6c  bInit(Fts5Global
5140: 2a 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 2f  *, sqlite3*);../
5150: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65  *.** End of inte
5160: 72 66 61 63 65 20 74 6f 20 63 6f 64 65 20 69 6e  rface to code in
5170: 20 66 74 73 35 5f 76 6f 63 61 62 2e 63 2e 0a 2a   fts5_vocab.c..*
5180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
51d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5210: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6e 74 65  ********.** Inte
5220: 72 66 61 63 65 20 74 6f 20 61 75 74 6f 6d 61 74  rface to automat
5230: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
5240: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 75 6e   code in fts5_un
5250: 69 63 6f 64 65 32 2e 63 2e 20 0a 2a 2f 0a 69 6e  icode2.c. .*/.in
5260: 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  t sqlite3Fts5Uni
5270: 63 6f 64 65 49 73 61 6c 6e 75 6d 28 69 6e 74 20  codeIsalnum(int 
5280: 63 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  c);.int sqlite3F
5290: 74 73 35 55 6e 69 63 6f 64 65 49 73 64 69 61 63  ts5UnicodeIsdiac
52a0: 72 69 74 69 63 28 69 6e 74 20 63 29 3b 0a 69 6e  ritic(int c);.in
52b0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  t sqlite3Fts5Uni
52c0: 63 6f 64 65 46 6f 6c 64 28 69 6e 74 20 63 2c 20  codeFold(int c, 
52d0: 69 6e 74 20 62 52 65 6d 6f 76 65 44 69 61 63 72  int bRemoveDiacr
52e0: 69 74 69 63 29 3b 0a 2f 2a 0a 2a 2a 20 45 6e 64  itic);./*.** End
52f0: 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 74 6f   of interface to
5300: 20 63 6f 64 65 20 69 6e 20 66 74 73 35 5f 75 6e   code in fts5_un
5310: 69 63 6f 64 65 32 2e 63 2e 0a 2a 2a 2a 2a 2a 2a  icode2.c..******
5320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5360: 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 0a        ****/..#endif.