/ Hex Artifact Content
Login

Artifact 1e58825246b56259267382d2f9902774c049460a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4e 6f 76 20 31  /*.** 2009 Nov 1
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** 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 49 4e 54 5f 48 0a 23 64  def _FTSINT_H.#d
0190: 65 66 69 6e 65 20 5f 46 54 53 49 4e 54 5f 48 0a  efine _FTSINT_H.
01a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
01b0: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
01c0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
01d0: 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 42 55 47  .# define NDEBUG
01e0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
01f0: 20 46 54 53 34 20 69 73 20 72 65 61 6c 6c 79 20   FTS4 is really 
0200: 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72  an extension for
0210: 20 46 54 53 33 2e 20 20 49 74 20 69 73 20 65 6e   FTS3.  It is en
0220: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 0a  abled using the.
0230: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
0240: 5f 46 54 53 33 20 6d 61 63 72 6f 2e 20 20 42 75  _FTS3 macro.  Bu
0250: 74 20 74 6f 20 61 76 6f 69 64 20 63 6f 6e 66 75  t to avoid confu
0260: 73 69 6f 6e 20 77 65 20 61 6c 73 6f 20 61 6c 6c  sion we also all
0270: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45  .** the SQLITE_E
0280: 4e 41 42 4c 45 5f 46 54 53 34 20 6d 61 63 72 6f  NABLE_FTS4 macro
0290: 20 74 6f 20 73 65 72 76 65 20 61 73 20 61 6e 20   to serve as an 
02a0: 61 6c 69 73 73 65 20 66 6f 72 20 53 51 4c 49 54  alisse for SQLIT
02b0: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 2e 0a 2a  E_ENABLE_FTS3..*
02c0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
02d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
02e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
02f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
0300: 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  ).# define SQLIT
0310: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 23 65  E_ENABLE_FTS3.#e
0320: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
0330: 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20  ed(SQLITE_CORE) 
0340: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
0350: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a  E_ENABLE_FTS3)..
0360: 2f 2a 20 49 66 20 6e 6f 74 20 62 75 69 6c 64 69  /* If not buildi
0370: 6e 67 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ng as part of th
0380: 65 20 63 6f 72 65 2c 20 69 6e 63 6c 75 64 65 20  e core, include 
0390: 73 71 6c 69 74 65 33 65 78 74 2e 68 2e 20 2a 2f  sqlite3ext.h. */
03a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
03b0: 43 4f 52 45 0a 23 20 69 6e 63 6c 75 64 65 20 22  CORE.# include "
03c0: 73 71 6c 69 74 65 33 65 78 74 2e 68 22 20 0a 65  sqlite3ext.h" .e
03d0: 78 74 65 72 6e 20 63 6f 6e 73 74 20 73 71 6c 69  xtern const sqli
03e0: 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
03f0: 20 2a 73 71 6c 69 74 65 33 5f 61 70 69 3b 0a 23   *sqlite3_api;.#
0400: 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20  endif..#include 
0410: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63  "sqlite3.h".#inc
0420: 6c 75 64 65 20 22 66 74 73 33 5f 74 6f 6b 65 6e  lude "fts3_token
0430: 69 7a 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  izer.h".#include
0440: 20 22 66 74 73 33 5f 68 61 73 68 2e 68 22 0a 0a   "fts3_hash.h"..
0450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74  /*.** This const
0460: 61 6e 74 20 63 6f 6e 74 72 6f 6c 73 20 68 6f 77  ant controls how
0470: 20 6f 66 74 65 6e 20 73 65 67 6d 65 6e 74 73 20   often segments 
0480: 61 72 65 20 6d 65 72 67 65 64 2e 20 4f 6e 63 65  are merged. Once
0490: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 46 54   there are.** FT
04a0: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 73  S3_MERGE_COUNT s
04b0: 65 67 6d 65 6e 74 73 20 6f 66 20 6c 65 76 65 6c  egments of level
04c0: 20 4e 2c 20 74 68 65 79 20 61 72 65 20 6d 65 72   N, they are mer
04d0: 67 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ged into a singl
04e0: 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 66 20  e.** segment of 
04f0: 6c 65 76 65 6c 20 4e 2b 31 2e 0a 2a 2f 0a 23 64  level N+1..*/.#d
0500: 65 66 69 6e 65 20 46 54 53 33 5f 4d 45 52 47 45  efine FTS3_MERGE
0510: 5f 43 4f 55 4e 54 20 31 36 0a 0a 2f 2a 0a 2a 2a  _COUNT 16../*.**
0520: 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 78   This is the max
0530: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 64  imum amount of d
0540: 61 74 61 20 28 69 6e 20 62 79 74 65 73 29 20 74  ata (in bytes) t
0550: 6f 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 0a  o store in the .
0560: 2a 2a 20 46 74 73 33 54 61 62 6c 65 2e 70 65 6e  ** Fts3Table.pen
0570: 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74  dingTerms hash t
0580: 61 62 6c 65 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  able. Normally, 
0590: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69  the hash table i
05a0: 73 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 64 20 61  s.** populated a
05b0: 73 20 64 6f 63 75 6d 65 6e 74 73 20 61 72 65 20  s documents are 
05c0: 69 6e 73 65 72 74 65 64 2f 75 70 64 61 74 65 64  inserted/updated
05d0: 2f 64 65 6c 65 74 65 64 20 69 6e 20 61 20 74 72  /deleted in a tr
05e0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ansaction.** and
05f0: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
0600: 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 77 68  a new segment wh
0610: 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
0620: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
0630: 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 74  .** However if t
0640: 68 69 73 20 6c 69 6d 69 74 20 69 73 20 72 65 61  his limit is rea
0650: 63 68 65 64 20 6d 69 64 77 61 79 20 74 68 72 6f  ched midway thro
0660: 75 67 68 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ugh a transactio
0670: 6e 2c 20 61 20 6e 65 77 20 0a 2a 2a 20 73 65 67  n, a new .** seg
0680: 6d 65 6e 74 20 69 73 20 63 72 65 61 74 65 64 20  ment is created 
0690: 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
06a0: 6c 65 20 63 6c 65 61 72 65 64 20 69 6d 6d 65 64  le cleared immed
06b0: 69 61 74 65 6c 79 2e 0a 2a 2f 0a 23 64 65 66 69  iately..*/.#defi
06c0: 6e 65 20 46 54 53 33 5f 4d 41 58 5f 50 45 4e 44  ne FTS3_MAX_PEND
06d0: 49 4e 47 5f 44 41 54 41 20 28 31 2a 31 30 32 34  ING_DATA (1*1024
06e0: 2a 31 30 32 34 29 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *1024)../*.** Ma
06f0: 63 72 6f 20 74 6f 20 72 65 74 75 72 6e 20 74 68  cro to return th
0700: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
0710: 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61 79  ents in an array
0720: 2e 20 53 51 4c 69 74 65 20 68 61 73 20 61 0a 2a  . SQLite has a.*
0730: 2a 20 73 69 6d 69 6c 61 72 20 6d 61 63 72 6f 20  * similar macro 
0740: 63 61 6c 6c 65 64 20 41 72 72 61 79 53 69 7a 65  called ArraySize
0750: 28 29 2e 20 55 73 65 20 61 20 64 69 66 66 65 72  (). Use a differ
0760: 65 6e 74 20 6e 61 6d 65 20 74 6f 20 61 76 6f 69  ent name to avoi
0770: 64 0a 2a 2a 20 61 20 63 6f 6c 6c 69 73 69 6f 6e  d.** a collision
0780: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 61   when building a
0790: 6e 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 77  n amalgamation w
07a0: 69 74 68 20 62 75 69 6c 74 2d 69 6e 20 46 54 53  ith built-in FTS
07b0: 33 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 69  3..*/.#define Si
07c0: 7a 65 6f 66 41 72 72 61 79 28 58 29 20 28 28 69  zeofArray(X) ((i
07d0: 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73 69  nt)(sizeof(X)/si
07e0: 7a 65 6f 66 28 58 5b 30 5d 29 29 29 0a 0a 0a 23  zeof(X[0])))...#
07f0: 69 66 6e 64 65 66 20 4d 49 4e 0a 23 20 64 65 66  ifndef MIN.# def
0800: 69 6e 65 20 4d 49 4e 28 78 2c 79 29 20 28 28 78  ine MIN(x,y) ((x
0810: 29 3c 28 79 29 3f 28 78 29 3a 28 79 29 29 0a 23  )<(y)?(x):(y)).#
0820: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4d 41  endif.#ifndef MA
0830: 58 0a 23 20 64 65 66 69 6e 65 20 4d 41 58 28 78  X.# define MAX(x
0840: 2c 79 29 20 28 28 78 29 3e 28 79 29 3f 28 78 29  ,y) ((x)>(y)?(x)
0850: 3a 28 79 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  :(y)).#endif../*
0860: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67  .** Maximum leng
0870: 74 68 20 6f 66 20 61 20 76 61 72 69 6e 74 20 65  th of a varint e
0880: 6e 63 6f 64 65 64 20 69 6e 74 65 67 65 72 2e 20  ncoded integer. 
0890: 54 68 65 20 76 61 72 69 6e 74 20 66 6f 72 6d 61  The varint forma
08a0: 74 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  t is different.*
08b0: 2a 20 66 72 6f 6d 20 74 68 61 74 20 75 73 65 64  * from that used
08c0: 20 62 79 20 53 51 4c 69 74 65 2c 20 73 6f 20 74   by SQLite, so t
08d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67 74  he maximum lengt
08e0: 68 20 69 73 20 31 30 2c 20 6e 6f 74 20 39 2e 0a  h is 10, not 9..
08f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f  */.#define FTS3_
0900: 56 41 52 49 4e 54 5f 4d 41 58 20 31 30 0a 0a 2f  VARINT_MAX 10../
0910: 2a 0a 2a 2a 20 46 54 53 34 20 76 69 72 74 75 61  *.** FTS4 virtua
0920: 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6d 61 69  l tables may mai
0930: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 69  ntain multiple i
0940: 6e 64 65 78 65 73 20 2d 20 6f 6e 65 20 69 6e 64  ndexes - one ind
0950: 65 78 20 6f 66 20 61 6c 6c 20 74 65 72 6d 73 0a  ex of all terms.
0960: 2a 2a 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  ** in the docume
0970: 6e 74 20 73 65 74 20 61 6e 64 20 7a 65 72 6f 20  nt set and zero 
0980: 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20 69  or more prefix i
0990: 6e 64 65 78 65 73 2e 20 41 6c 6c 20 69 6e 64 65  ndexes. All inde
09a0: 78 65 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  xes are stored.*
09b0: 2a 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * as one or more
09c0: 20 62 2b 2d 74 72 65 65 73 20 69 6e 20 74 68 65   b+-trees in the
09d0: 20 25 5f 73 65 67 6d 65 6e 74 73 20 61 6e 64 20   %_segments and 
09e0: 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 73 2e  %_segdir tables.
09f0: 20 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f   .**.** It is po
0a00: 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  ssible to determ
0a10: 69 6e 65 20 77 68 69 63 68 20 69 6e 64 65 78 20  ine which index 
0a20: 61 20 62 2b 2d 74 72 65 65 20 62 65 6c 6f 6e 67  a b+-tree belong
0a30: 73 20 74 6f 20 62 61 73 65 64 20 6f 6e 20 74 68  s to based on th
0a40: 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72 65  e.** value store
0a50: 64 20 69 6e 20 74 68 65 20 22 25 5f 73 65 67 64  d in the "%_segd
0a60: 69 72 2e 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  ir.level" column
0a70: 2e 20 47 69 76 65 6e 20 74 68 69 73 20 76 61 6c  . Given this val
0a80: 75 65 20 4c 2c 20 74 68 65 20 69 6e 64 65 78 0a  ue L, the index.
0a90: 2a 2a 20 74 68 61 74 20 74 68 65 20 62 2b 2d 74  ** that the b+-t
0aa0: 72 65 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 69  ree belongs to i
0ab0: 73 20 28 4c 3c 3c 31 30 29 2e 20 49 6e 20 6f 74  s (L<<10). In ot
0ac0: 68 65 72 20 77 6f 72 64 73 2c 20 61 6c 6c 20 62  her words, all b
0ad0: 2b 2d 74 72 65 65 73 20 77 69 74 68 0a 2a 2a 20  +-trees with.** 
0ae0: 6c 65 76 65 6c 20 76 61 6c 75 65 73 20 62 65 74  level values bet
0af0: 77 65 65 6e 20 30 20 61 6e 64 20 31 30 32 33 20  ween 0 and 1023 
0b00: 28 69 6e 63 6c 75 73 69 76 65 29 20 62 65 6c 6f  (inclusive) belo
0b10: 6e 67 20 74 6f 20 69 6e 64 65 78 20 30 2c 20 61  ng to index 0, a
0b20: 6c 6c 20 6c 65 76 65 6c 73 0a 2a 2a 20 62 65 74  ll levels.** bet
0b30: 77 65 65 6e 20 31 30 32 34 20 61 6e 64 20 32 30  ween 1024 and 20
0b40: 34 37 20 74 6f 20 69 6e 64 65 78 20 31 2c 20 61  47 to index 1, a
0b50: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
0b60: 49 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  It is considered
0b70: 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
0b80: 61 6e 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  an index to use 
0b90: 6d 6f 72 65 20 74 68 61 6e 20 31 30 32 34 20 6c  more than 1024 l
0ba0: 65 76 65 6c 73 2e 20 49 6e 20 0a 2a 2a 20 74 68  evels. In .** th
0bb0: 65 6f 72 79 20 74 68 6f 75 67 68 20 74 68 69 73  eory though this
0bc0: 20 6d 61 79 20 68 61 70 70 65 6e 2c 20 62 75 74   may happen, but
0bd0: 20 6f 6e 6c 79 20 61 66 74 65 72 20 61 74 20 6c   only after at l
0be0: 65 61 73 74 20 0a 2a 2a 20 28 46 54 53 33 5f 4d  east .** (FTS3_M
0bf0: 45 52 47 45 5f 43 4f 55 4e 54 5e 31 30 32 34 29  ERGE_COUNT^1024)
0c00: 20 73 65 70 61 72 61 74 65 20 66 6c 75 73 68 65   separate flushe
0c10: 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
0c20: 2d 74 65 72 6d 73 20 74 61 62 6c 65 73 2e 0a 2a  -terms tables..*
0c30: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 53  /.#define FTS3_S
0c40: 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 20  EGDIR_MAXLEVEL  
0c50: 20 20 20 20 31 30 32 34 0a 23 64 65 66 69 6e 65      1024.#define
0c60: 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58   FTS3_SEGDIR_MAX
0c70: 4c 45 56 45 4c 5f 53 54 52 20 22 31 30 32 34 22  LEVEL_STR "1024"
0c80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 65 73 74  ../*.** The test
0c90: 63 61 73 65 28 29 20 6d 61 63 72 6f 20 69 73 20  case() macro is 
0ca0: 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
0cb0: 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 20 20   amalgamation.  
0cc0: 49 66 20 75 6e 64 65 66 69 6e 65 64 2c 0a 2a 2a  If undefined,.**
0cd0: 20 6d 61 6b 65 20 69 74 20 61 20 6e 6f 2d 6f 70   make it a no-op
0ce0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 74 65 73  ..*/.#ifndef tes
0cf0: 74 63 61 73 65 0a 23 20 64 65 66 69 6e 65 20 74  tcase.# define t
0d00: 65 73 74 63 61 73 65 28 58 29 0a 23 65 6e 64 69  estcase(X).#endi
0d10: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 72 6d 69 6e 61  f../*.** Termina
0d20: 74 6f 72 20 76 61 6c 75 65 73 20 66 6f 72 20 70  tor values for p
0d30: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 73 20 61 6e  osition-lists an
0d40: 64 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 73 2e 0a  d column-lists..
0d50: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 4f 53 5f 43  */.#define POS_C
0d60: 4f 4c 55 4d 4e 20 20 28 31 29 20 20 20 20 20 2f  OLUMN  (1)     /
0d70: 2a 20 43 6f 6c 75 6d 6e 2d 6c 69 73 74 20 74 65  * Column-list te
0d80: 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 23 64 65 66  rminator */.#def
0d90: 69 6e 65 20 50 4f 53 5f 45 4e 44 20 20 20 20 20  ine POS_END     
0da0: 28 30 29 20 20 20 20 20 2f 2a 20 50 6f 73 69 74  (0)     /* Posit
0db0: 69 6f 6e 2d 6c 69 73 74 20 74 65 72 6d 69 6e 61  ion-list termina
0dc0: 74 6f 72 20 2a 2f 20 0a 0a 2f 2a 0a 2a 2a 20 54  tor */ ../*.** T
0dd0: 68 69 73 20 73 65 63 74 69 6f 6e 20 70 72 6f 76  his section prov
0de0: 69 64 65 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ides definitions
0df0: 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65 0a 2a 2a   to allow the.**
0e00: 20 46 54 53 33 20 65 78 74 65 6e 73 69 6f 6e 20   FTS3 extension 
0e10: 74 6f 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 6f  to be compiled o
0e20: 75 74 73 69 64 65 20 6f 66 20 74 68 65 20 0a 2a  utside of the .*
0e30: 2a 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a  * amalgamation..
0e40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0e50: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f  E_AMALGAMATION./
0e60: 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 69 6e 64 69  *.** Macros indi
0e70: 63 61 74 69 6e 67 20 74 68 61 74 20 63 6f 6e 64  cating that cond
0e80: 69 74 69 6f 6e 61 6c 20 65 78 70 72 65 73 73 69  itional expressi
0e90: 6f 6e 73 20 61 72 65 20 61 6c 77 61 79 73 20 74  ons are always t
0ea0: 72 75 65 20 6f 72 0a 2a 2a 20 66 61 6c 73 65 2e  rue or.** false.
0eb0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0ec0: 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 0a  E_COVERAGE_TEST.
0ed0: 23 20 64 65 66 69 6e 65 20 41 4c 57 41 59 53 28  # define ALWAYS(
0ee0: 78 29 20 28 31 29 0a 23 20 64 65 66 69 6e 65 20  x) (1).# define 
0ef0: 4e 45 56 45 52 28 58 29 20 20 28 30 29 0a 23 65  NEVER(X)  (0).#e
0f00: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 4c 57  lse.# define ALW
0f10: 41 59 53 28 78 29 20 28 78 29 0a 23 20 64 65 66  AYS(x) (x).# def
0f20: 69 6e 65 20 4e 45 56 45 52 28 78 29 20 20 28 78  ine NEVER(x)  (x
0f30: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
0f40: 49 6e 74 65 72 6e 61 6c 20 74 79 70 65 73 20 75  Internal types u
0f50: 73 65 64 20 62 79 20 53 51 4c 69 74 65 2e 0a 2a  sed by SQLite..*
0f60: 2f 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  /.typedef unsign
0f70: 65 64 20 63 68 61 72 20 75 38 3b 20 20 20 20 20  ed char u8;     
0f80: 20 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 28 6f      /* 1-byte (o
0f90: 72 20 6c 61 72 67 65 72 29 20 75 6e 73 69 67 6e  r larger) unsign
0fa0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 74 79  ed integer */.ty
0fb0: 70 65 64 65 66 20 73 68 6f 72 74 20 69 6e 74 20  pedef short int 
0fc0: 69 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20  i16;            
0fd0: 2f 2a 20 32 2d 62 79 74 65 20 28 6f 72 20 6c 61  /* 2-byte (or la
0fe0: 72 67 65 72 29 20 73 69 67 6e 65 64 20 69 6e 74  rger) signed int
0ff0: 65 67 65 72 20 2a 2f 0a 74 79 70 65 64 65 66 20  eger */.typedef 
1000: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32  unsigned int u32
1010: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 34 2d 62  ;         /* 4-b
1020: 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
1030: 65 67 65 72 20 2a 2f 0a 74 79 70 65 64 65 66 20  eger */.typedef 
1040: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75  sqlite3_uint64 u
1050: 36 34 3b 20 20 20 20 20 20 20 2f 2a 20 38 2d 62  64;       /* 8-b
1060: 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
1070: 65 67 65 72 20 2a 2f 0a 74 79 70 65 64 65 66 20  eger */.typedef 
1080: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36  sqlite3_int64 i6
1090: 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 38 2d 62  4;        /* 8-b
10a0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
10b0: 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  er */../*.** Mac
10c0: 72 6f 20 75 73 65 64 20 74 6f 20 73 75 70 70 72  ro used to suppr
10d0: 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  ess compiler war
10e0: 6e 69 6e 67 73 20 66 6f 72 20 75 6e 75 73 65 64  nings for unused
10f0: 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2f 0a   parameters..*/.
1100: 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 50  #define UNUSED_P
1110: 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f 69  ARAMETER(x) (voi
1120: 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 41 63 74  d)(x)../*.** Act
1130: 69 76 61 74 65 20 61 73 73 65 72 74 28 29 20 6f  ivate assert() o
1140: 6e 6c 79 20 69 66 20 53 51 4c 49 54 45 5f 54 45  nly if SQLITE_TE
1150: 53 54 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a  ST is enabled..*
1160: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
1170: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
1180: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1190: 20 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 42 55   .# define NDEBU
11a0: 47 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  G 1.#endif../*.*
11b0: 2a 20 54 68 65 20 54 45 53 54 4f 4e 4c 59 20 6d  * The TESTONLY m
11c0: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
11d0: 65 6e 63 6c 6f 73 65 20 76 61 72 69 61 62 6c 65  enclose variable
11e0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 6f 72   declarations or
11f0: 0a 2a 2a 20 6f 74 68 65 72 20 62 69 74 73 20 6f  .** other bits o
1200: 66 20 63 6f 64 65 20 74 68 61 74 20 61 72 65 20  f code that are 
1210: 6e 65 65 64 65 64 20 74 6f 20 73 75 70 70 6f 72  needed to suppor
1220: 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 0a  t the arguments.
1230: 2a 2a 20 77 69 74 68 69 6e 20 74 65 73 74 63 61  ** within testca
1240: 73 65 28 29 20 61 6e 64 20 61 73 73 65 72 74 28  se() and assert(
1250: 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 69 66  ) macros..*/.#if
1260: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1270: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1280: 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
1290: 45 5f 54 45 53 54 29 0a 23 20 64 65 66 69 6e 65  E_TEST).# define
12a0: 20 54 45 53 54 4f 4e 4c 59 28 58 29 20 20 58 0a   TESTONLY(X)  X.
12b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54  #else.# define T
12c0: 45 53 54 4f 4e 4c 59 28 58 29 0a 23 65 6e 64 69  ESTONLY(X).#endi
12d0: 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
12e0: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
12f0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1300: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
1310: 69 74 65 33 46 74 73 33 43 6f 72 72 75 70 74 28  ite3Fts3Corrupt(
1320: 76 6f 69 64 29 3b 0a 23 20 64 65 66 69 6e 65 20  void);.# define 
1330: 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  FTS_CORRUPT_VTAB
1340: 20 73 71 6c 69 74 65 33 46 74 73 33 43 6f 72 72   sqlite3Fts3Corr
1350: 75 70 74 28 29 0a 23 65 6c 73 65 0a 23 20 64 65  upt().#else.# de
1360: 66 69 6e 65 20 46 54 53 5f 43 4f 52 52 55 50 54  fine FTS_CORRUPT
1370: 5f 56 54 41 42 20 53 51 4c 49 54 45 5f 43 4f 52  _VTAB SQLITE_COR
1380: 52 55 50 54 5f 56 54 41 42 0a 23 65 6e 64 69 66  RUPT_VTAB.#endif
1390: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
13a0: 20 46 74 73 33 54 61 62 6c 65 20 46 74 73 33 54   Fts3Table Fts3T
13b0: 61 62 6c 65 3b 0a 74 79 70 65 64 65 66 20 73 74  able;.typedef st
13c0: 72 75 63 74 20 46 74 73 33 43 75 72 73 6f 72 20  ruct Fts3Cursor 
13d0: 46 74 73 33 43 75 72 73 6f 72 3b 0a 74 79 70 65  Fts3Cursor;.type
13e0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 33 45  def struct Fts3E
13f0: 78 70 72 20 46 74 73 33 45 78 70 72 3b 0a 74 79  xpr Fts3Expr;.ty
1400: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
1410: 33 50 68 72 61 73 65 20 46 74 73 33 50 68 72 61  3Phrase Fts3Phra
1420: 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  se;.typedef stru
1430: 63 74 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b  ct Fts3PhraseTok
1440: 65 6e 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b  en Fts3PhraseTok
1450: 65 6e 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72  en;..typedef str
1460: 75 63 74 20 46 74 73 33 44 6f 63 6c 69 73 74 20  uct Fts3Doclist 
1470: 46 74 73 33 44 6f 63 6c 69 73 74 3b 0a 74 79 70  Fts3Doclist;.typ
1480: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 33  edef struct Fts3
1490: 53 65 67 46 69 6c 74 65 72 20 46 74 73 33 53 65  SegFilter Fts3Se
14a0: 67 46 69 6c 74 65 72 3b 0a 74 79 70 65 64 65 66  gFilter;.typedef
14b0: 20 73 74 72 75 63 74 20 46 74 73 33 44 65 66 65   struct Fts3Defe
14c0: 72 72 65 64 54 6f 6b 65 6e 20 46 74 73 33 44 65  rredToken Fts3De
14d0: 66 65 72 72 65 64 54 6f 6b 65 6e 3b 0a 74 79 70  ferredToken;.typ
14e0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 33  edef struct Fts3
14f0: 53 65 67 52 65 61 64 65 72 20 46 74 73 33 53 65  SegReader Fts3Se
1500: 67 52 65 61 64 65 72 3b 0a 74 79 70 65 64 65 66  gReader;.typedef
1510: 20 73 74 72 75 63 74 20 46 74 73 33 4d 75 6c 74   struct Fts3Mult
1520: 69 53 65 67 52 65 61 64 65 72 20 46 74 73 33 4d  iSegReader Fts3M
1530: 75 6c 74 69 53 65 67 52 65 61 64 65 72 3b 0a 0a  ultiSegReader;..
1540: 2f 2a 0a 2a 2a 20 41 20 63 6f 6e 6e 65 63 74 69  /*.** A connecti
1550: 6f 6e 20 74 6f 20 61 20 66 75 6c 6c 74 65 78 74  on to a fulltext
1560: 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6e 73   index is an ins
1570: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1580: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
1590: 75 72 65 2e 20 54 68 65 20 78 43 72 65 61 74 65  ure. The xCreate
15a0: 20 61 6e 64 20 78 43 6f 6e 6e 65 63 74 20 6d 65   and xConnect me
15b0: 74 68 6f 64 73 20 63 72 65 61 74 65 20 61 6e 20  thods create an 
15c0: 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74  instance.** of t
15d0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61 6e  his structure an
15e0: 64 20 78 44 65 73 74 72 6f 79 20 61 6e 64 20 78  d xDestroy and x
15f0: 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 65 65 20  Disconnect free 
1600: 74 68 61 74 20 69 6e 73 74 61 6e 63 65 2e 0a 2a  that instance..*
1610: 2a 20 41 6c 6c 20 6f 74 68 65 72 20 6d 65 74 68  * All other meth
1620: 6f 64 73 20 72 65 63 65 69 76 65 20 61 20 70 6f  ods receive a po
1630: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72  inter to the str
1640: 75 63 74 75 72 65 20 61 73 20 6f 6e 65 20 6f 66  ucture as one of
1650: 20 74 68 65 69 72 0a 2a 2a 20 61 72 67 75 6d 65   their.** argume
1660: 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  nts..*/.struct F
1670: 74 73 33 54 61 62 6c 65 20 7b 0a 20 20 73 71 6c  ts3Table {.  sql
1680: 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20  ite3_vtab base; 
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a0: 42 61 73 65 20 63 6c 61 73 73 20 75 73 65 64 20  Base class used 
16b0: 62 79 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  by SQLite core *
16c0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
16f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1700: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1710: 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
1720: 20 20 20 20 2f 2a 20 6c 6f 67 69 63 61 6c 20 64      /* logical d
1730: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
1740: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1750: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1760: 20 20 2f 2a 20 76 69 72 74 75 61 6c 20 74 61 62    /* virtual tab
1770: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  le name */.  int
1780: 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17a0: 6e 75 6d 62 65 72 20 6f 66 20 6e 61 6d 65 64 20  number of named 
17b0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 76 69 72 74 75  columns in virtu
17c0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68  al table */.  ch
17d0: 61 72 20 2a 2a 61 7a 43 6f 6c 75 6d 6e 3b 20 20  ar **azColumn;  
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
1800: 6d 61 6c 6c 6f 63 65 64 20 2a 2f 0a 20 20 73 71  malloced */.  sq
1810: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20  lite3_tokenizer 
1820: 2a 70 54 6f 6b 65 6e 69 7a 65 72 3b 20 20 2f 2a  *pTokenizer;  /*
1830: 20 74 6f 6b 65 6e 69 7a 65 72 20 66 6f 72 20 69   tokenizer for i
1840: 6e 73 65 72 74 73 20 61 6e 64 20 71 75 65 72 69  nserts and queri
1850: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  es */.  char *zC
1860: 6f 6e 74 65 6e 74 54 62 6c 3b 20 20 20 20 20 20  ontentTbl;      
1870: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
1880: 6e 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 6f  nt=xxx option, o
1890: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
18a0: 20 2a 7a 4c 61 6e 67 75 61 67 65 69 64 3b 20 20   *zLanguageid;  
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
18c0: 61 6e 67 75 61 67 65 69 64 3d 78 78 78 20 6f 70  anguageid=xxx op
18d0: 74 69 6f 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  tion, or NULL */
18e0: 0a 20 20 75 38 20 62 41 75 74 6f 69 6e 63 72 6d  .  u8 bAutoincrm
18f0: 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  erge;           
1900: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 75     /* True if au
1910: 74 6f 6d 65 72 67 65 3d 31 20 2a 2f 0a 20 20 75  tomerge=1 */.  u
1920: 33 32 20 6e 4c 65 61 66 41 64 64 3b 20 20 20 20  32 nLeafAdd;    
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
1950: 20 62 6c 6f 63 6b 73 20 61 64 64 65 64 20 74 68   blocks added th
1960: 69 73 20 74 72 61 6e 73 20 2a 2f 0a 0a 20 20 2f  is trans */..  /
1970: 2a 20 50 72 65 63 6f 6d 70 69 6c 65 64 20 73 74  * Precompiled st
1980: 61 74 65 6d 65 6e 74 73 20 75 73 65 64 20 62 79  atements used by
1990: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
19a0: 69 6f 6e 2e 20 45 61 63 68 20 6f 66 20 74 68 65  ion. Each of the
19b0: 73 65 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  se .  ** stateme
19c0: 6e 74 73 20 69 73 20 72 75 6e 20 61 6e 64 20 72  nts is run and r
19d0: 65 73 65 74 20 77 69 74 68 69 6e 20 61 20 73 69  eset within a si
19e0: 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62  ngle virtual tab
19f0: 6c 65 20 41 50 49 20 63 61 6c 6c 2e 20 0a 20 20  le API call. .  
1a00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
1a10: 74 20 2a 61 53 74 6d 74 5b 33 37 5d 3b 0a 0a 20  t *aStmt[37];.. 
1a20: 20 63 68 61 72 20 2a 7a 52 65 61 64 45 78 70 72   char *zReadExpr
1a30: 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 7a 57  list;.  char *zW
1a40: 72 69 74 65 45 78 70 72 6c 69 73 74 3b 0a 0a 20  riteExprlist;.. 
1a50: 20 69 6e 74 20 6e 4e 6f 64 65 53 69 7a 65 3b 20   int nNodeSize; 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 2f 2a 20 53 6f 66 74 20 6c 69 6d 69 74 20 66   /* Soft limit f
1a80: 6f 72 20 6e 6f 64 65 20 73 69 7a 65 20 2a 2f 0a  or node size */.
1a90: 20 20 75 38 20 62 46 74 73 34 3b 20 20 20 20 20    u8 bFts4;     
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 46 54    /* True for FT
1ac0: 53 34 2c 20 66 61 6c 73 65 20 66 6f 72 20 46 54  S4, false for FT
1ad0: 53 33 20 2a 2f 0a 20 20 75 38 20 62 48 61 73 53  S3 */.  u8 bHasS
1ae0: 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1b00: 69 66 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20  if %_stat table 
1b10: 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20 62  exists */.  u8 b
1b20: 48 61 73 44 6f 63 73 69 7a 65 3b 20 20 20 20 20  HasDocsize;     
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b40: 72 75 65 20 69 66 20 25 5f 64 6f 63 73 69 7a 65  rue if %_docsize
1b50: 20 74 61 62 6c 65 20 65 78 69 73 74 73 20 2a 2f   table exists */
1b60: 0a 20 20 75 38 20 62 44 65 73 63 49 64 78 3b 20  .  u8 bDescIdx; 
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 6f     /* True if do
1b90: 63 6c 69 73 74 73 20 61 72 65 20 69 6e 20 72 65  clists are in re
1ba0: 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
1bb0: 20 75 38 20 62 49 67 6e 6f 72 65 53 61 76 65 70   u8 bIgnoreSavep
1bc0: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  oint;           
1bd0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 67 6e 6f   /* True to igno
1be0: 72 65 20 78 53 61 76 65 70 6f 69 6e 74 20 69 6e  re xSavepoint in
1bf0: 76 6f 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  vocations */.  i
1c00: 6e 74 20 6e 50 67 73 7a 3b 20 20 20 20 20 20 20  nt nPgsz;       
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c20: 2a 20 50 61 67 65 20 73 69 7a 65 20 66 6f 72 20  * Page size for 
1c30: 68 6f 73 74 20 64 61 74 61 62 61 73 65 20 2a 2f  host database */
1c40: 0a 20 20 63 68 61 72 20 2a 7a 53 65 67 6d 65 6e  .  char *zSegmen
1c50: 74 73 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  tsTbl;          
1c60: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 25 5f     /* Name of %_
1c70: 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a  segments table *
1c80: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
1c90: 20 2a 70 53 65 67 6d 65 6e 74 73 3b 20 20 20 20   *pSegments;    
1ca0: 20 20 20 20 2f 2a 20 42 6c 6f 62 20 68 61 6e 64      /* Blob hand
1cb0: 6c 65 20 6f 70 65 6e 20 6f 6e 20 25 5f 73 65 67  le open on %_seg
1cc0: 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a 0a  ments table */..
1cd0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66    /* .  ** The f
1ce0: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 6f  ollowing array o
1cf0: 66 20 68 61 73 68 20 74 61 62 6c 65 73 20 69 73  f hash tables is
1d00: 20 75 73 65 64 20 74 6f 20 62 75 66 66 65 72 20   used to buffer 
1d10: 70 65 6e 64 69 6e 67 20 69 6e 64 65 78 20 0a 20  pending index . 
1d20: 20 2a 2a 20 75 70 64 61 74 65 73 20 64 75 72 69   ** updates duri
1d30: 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ng transactions.
1d40: 20 41 6c 6c 20 70 65 6e 64 69 6e 67 20 75 70 64   All pending upd
1d50: 61 74 65 73 20 62 75 66 66 65 72 65 64 20 61 74  ates buffered at
1d60: 20 61 6e 79 20 6f 6e 65 0a 20 20 2a 2a 20 74 69   any one.  ** ti
1d70: 6d 65 20 6d 75 73 74 20 73 68 61 72 65 20 61 20  me must share a 
1d80: 63 6f 6d 6d 6f 6e 20 6c 61 6e 67 75 61 67 65 2d  common language-
1d90: 69 64 20 28 73 65 65 20 74 68 65 20 46 54 53 34  id (see the FTS4
1da0: 20 6c 61 6e 67 69 64 3d 20 66 65 61 74 75 72 65   langid= feature
1db0: 29 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  )..  ** The curr
1dc0: 65 6e 74 20 6c 61 6e 67 75 61 67 65 20 69 64 20  ent language id 
1dd0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 76 61 72  is stored in var
1de0: 69 61 62 6c 65 20 69 50 72 65 76 4c 61 6e 67 69  iable iPrevLangi
1df0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 73  d..  **.  ** A s
1e00: 69 6e 67 6c 65 20 46 54 53 34 20 74 61 62 6c 65  ingle FTS4 table
1e10: 20 6d 61 79 20 68 61 76 65 20 6d 75 6c 74 69 70   may have multip
1e20: 6c 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  le full-text ind
1e30: 65 78 65 73 2e 20 46 6f 72 20 65 61 63 68 20 69  exes. For each i
1e40: 6e 64 65 78 0a 20 20 2a 2a 20 74 68 65 72 65 20  ndex.  ** there 
1e50: 69 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  is an entry in t
1e60: 68 65 20 61 49 6e 64 65 78 5b 5d 20 61 72 72 61  he aIndex[] arra
1e70: 79 2e 20 49 6e 64 65 78 20 30 20 69 73 20 61 6e  y. Index 0 is an
1e80: 20 69 6e 64 65 78 20 6f 66 20 61 6c 6c 20 74 68   index of all th
1e90: 65 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 68 61  e.  ** terms tha
1ea0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
1eb0: 64 6f 63 75 6d 65 6e 74 20 73 65 74 2e 20 45 61  document set. Ea
1ec0: 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  ch subsequent in
1ed0: 64 65 78 20 69 6e 20 61 49 6e 64 65 78 5b 5d 0a  dex in aIndex[].
1ee0: 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 64 65 78    ** is an index
1ef0: 20 6f 66 20 70 72 65 66 69 78 65 73 20 6f 66 20   of prefixes of 
1f00: 61 20 73 70 65 63 69 66 69 63 20 6c 65 6e 67 74  a specific lengt
1f10: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72  h..  **.  ** Var
1f20: 69 61 62 6c 65 20 6e 50 65 6e 64 69 6e 67 44 61  iable nPendingDa
1f30: 74 61 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  ta contains an e
1f40: 73 74 69 6d 61 74 65 20 74 68 65 20 6d 65 6d 6f  stimate the memo
1f50: 72 79 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 74  ry consumed by t
1f60: 68 65 20 0a 20 20 2a 2a 20 70 65 6e 64 69 6e 67  he .  ** pending
1f70: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
1f80: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 68 61 73 68  , including hash
1f90: 20 74 61 62 6c 65 20 6f 76 65 72 68 65 61 64 2c   table overhead,
1fa0: 20 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75 64 69   but not includi
1fb0: 6e 67 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 6f  ng.  ** malloc o
1fc0: 76 65 72 68 65 61 64 2e 20 20 57 68 65 6e 20 6e  verhead.  When n
1fd0: 50 65 6e 64 69 6e 67 44 61 74 61 20 65 78 63 65  PendingData exce
1fe0: 65 64 73 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44  eds nMaxPendingD
1ff0: 61 74 61 2c 20 61 6c 6c 20 68 61 73 68 0a 20 20  ata, all hash.  
2000: 2a 2a 20 74 61 62 6c 65 73 20 61 72 65 20 66 6c  ** tables are fl
2010: 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 56  ushed to disk. V
2020: 61 72 69 61 62 6c 65 20 69 50 72 65 76 44 6f 63  ariable iPrevDoc
2030: 69 64 20 69 73 20 74 68 65 20 64 6f 63 69 64 20  id is the docid 
2040: 6f 66 20 74 68 65 20 6d 6f 73 74 20 0a 20 20 2a  of the most .  *
2050: 2a 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  * recently inser
2060: 74 65 64 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f  ted record..  */
2070: 0a 20 20 69 6e 74 20 6e 49 6e 64 65 78 3b 20 20  .  int nIndex;  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 49     /* Size of aI
20a0: 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20 73 74 72 75  ndex[] */.  stru
20b0: 63 74 20 46 74 73 33 49 6e 64 65 78 20 7b 0a 20  ct Fts3Index {. 
20c0: 20 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20     int nPrefix; 
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 2f 2a 20 50 72 65 66 69 78 20 6c 65 6e 67 74   /* Prefix lengt
20f0: 68 20 28 30 20 66 6f 72 20 6d 61 69 6e 20 74 65  h (0 for main te
2100: 72 6d 73 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20  rms index) */.  
2110: 20 20 46 74 73 33 48 61 73 68 20 68 50 65 6e 64    Fts3Hash hPend
2120: 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ing;            
2130: 2f 2a 20 50 65 6e 64 69 6e 67 20 74 65 72 6d 73  /* Pending terms
2140: 20 74 61 62 6c 65 20 66 6f 72 20 74 68 69 73 20   table for this 
2150: 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2a 61 49  index */.  } *aI
2160: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  ndex;.  int nMax
2170: 50 65 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20  PendingData;    
2180: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 70          /* Max p
2190: 65 6e 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f  ending data befo
21a0: 72 65 20 66 6c 75 73 68 20 74 6f 20 64 69 73 6b  re flush to disk
21b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69   */.  int nPendi
21c0: 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  ngData;         
21d0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
21e0: 20 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e   bytes of pendin
21f0: 67 20 64 61 74 61 20 2a 2f 0a 20 20 73 71 6c 69  g data */.  sqli
2200: 74 65 5f 69 6e 74 36 34 20 69 50 72 65 76 44 6f  te_int64 iPrevDo
2210: 63 69 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  cid;        /* D
2220: 6f 63 69 64 20 6f 66 20 6d 6f 73 74 20 72 65 63  ocid of most rec
2230: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 64  ently inserted d
2240: 6f 63 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ocument */.  int
2250: 20 69 50 72 65 76 4c 61 6e 67 69 64 3b 20 20 20   iPrevLangid;   
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2270: 4c 61 6e 67 69 64 20 6f 66 20 72 65 63 65 6e 74  Langid of recent
2280: 6c 79 20 69 6e 73 65 72 74 65 64 20 64 6f 63 75  ly inserted docu
2290: 6d 65 6e 74 20 2a 2f 0a 0a 23 69 66 20 64 65 66  ment */..#if def
22a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
22b0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
22c0: 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
22d0: 53 54 29 0a 20 20 2f 2a 20 53 74 61 74 65 20 76  ST).  /* State v
22e0: 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f  ariables used fo
22f0: 72 20 76 61 6c 69 64 61 74 69 6e 67 20 74 68 61  r validating tha
2300: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
2310: 6e 20 63 6f 6e 74 72 6f 6c 0a 20 20 2a 2a 20 6d  n control.  ** m
2320: 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 76 69  ethods of the vi
2330: 72 74 75 61 6c 20 74 61 62 6c 65 20 61 72 65 20  rtual table are 
2340: 63 61 6c 6c 65 64 20 61 74 20 61 70 70 72 6f 70  called at approp
2350: 72 69 61 74 65 20 74 69 6d 65 73 2e 20 20 54 68  riate times.  Th
2360: 65 73 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  ese.  ** values 
2370: 64 6f 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  do not contribut
2380: 65 20 74 6f 20 46 54 53 20 66 75 6e 63 74 69 6f  e to FTS functio
2390: 6e 61 6c 69 74 79 3b 20 74 68 65 79 20 61 72 65  nality; they are
23a0: 20 75 73 65 64 20 66 6f 72 0a 20 20 2a 2a 20 76   used for.  ** v
23b0: 65 72 69 66 79 69 6e 67 20 74 68 65 20 6f 70 65  erifying the ope
23c0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  ration of the SQ
23d0: 4c 69 74 65 20 63 6f 72 65 2e 0a 20 20 2a 2f 0a  Lite core..  */.
23e0: 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 61 63 74    int inTransact
23f0: 69 6f 6e 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  ion;     /* True
2400: 20 61 66 74 65 72 20 78 42 65 67 69 6e 20 62 75   after xBegin bu
2410: 74 20 62 65 66 6f 72 65 20 78 43 6f 6d 6d 69 74  t before xCommit
2420: 2f 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  /xRollback */.  
2430: 69 6e 74 20 6d 78 53 61 76 65 70 6f 69 6e 74 3b  int mxSavepoint;
2440: 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73         /* Larges
2450: 74 20 76 61 6c 69 64 20 78 53 61 76 65 70 6f 69  t valid xSavepoi
2460: 6e 74 20 69 6e 74 65 67 65 72 20 2a 2f 0a 23 65  nt integer */.#e
2470: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 57  ndif.};../*.** W
2480: 68 65 6e 20 74 68 65 20 63 6f 72 65 20 77 61 6e  hen the core wan
2490: 74 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ts to read from 
24a0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
24b0: 65 2c 20 69 74 20 63 72 65 61 74 65 73 20 61 0a  e, it creates a.
24c0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
24d0: 20 63 75 72 73 6f 72 20 28 61 6e 20 69 6e 73 74   cursor (an inst
24e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
24f0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 29  owing structure)
2500: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 78 4f   using.** the xO
2510: 70 65 6e 20 6d 65 74 68 6f 64 2e 20 43 75 72 73  pen method. Curs
2520: 6f 72 73 20 61 72 65 20 64 65 73 74 72 6f 79 65  ors are destroye
2530: 64 20 75 73 69 6e 67 20 74 68 65 20 78 43 6c 6f  d using the xClo
2540: 73 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  se method..*/.st
2550: 72 75 63 74 20 46 74 73 33 43 75 72 73 6f 72 20  ruct Fts3Cursor 
2560: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
2570: 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20 20 20  _cursor base;   
2580: 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73      /* Base clas
2590: 73 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  s used by SQLite
25a0: 20 63 6f 72 65 20 2a 2f 0a 20 20 69 31 36 20 65   core */.  i16 e
25b0: 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20  Search;         
25c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
25d0: 61 72 63 68 20 73 74 72 61 74 65 67 79 20 28 73  arch strategy (s
25e0: 65 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 20 20 75  ee below) */.  u
25f0: 38 20 69 73 45 6f 66 3b 20 20 20 20 20 20 20 20  8 isEof;        
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2610: 2a 20 54 72 75 65 20 69 66 20 61 74 20 45 6e 64  * True if at End
2620: 20 4f 66 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20   Of Results */. 
2630: 20 75 38 20 69 73 52 65 71 75 69 72 65 53 65 65   u8 isRequireSee
2640: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2650: 20 2f 2a 20 54 72 75 65 20 69 66 20 6d 75 73 74   /* True if must
2660: 20 73 65 65 6b 20 70 53 74 6d 74 20 74 6f 20 25   seek pStmt to %
2670: 5f 63 6f 6e 74 65 6e 74 20 72 6f 77 20 2a 2f 0a  _content row */.
2680: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2690: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
26a0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
26b0: 61 74 65 6d 65 6e 74 20 69 6e 20 75 73 65 20 62  atement in use b
26c0: 79 20 74 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a  y the cursor */.
26d0: 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70    Fts3Expr *pExp
26e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
26f0: 20 20 2f 2a 20 50 61 72 73 65 64 20 4d 41 54 43    /* Parsed MATC
2700: 48 20 71 75 65 72 79 20 73 74 72 69 6e 67 20 2a  H query string *
2710: 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 3b  /.  int iLangid;
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
2740: 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 66 6f  being queried fo
2750: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 68 72 61  r */.  int nPhra
2760: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2770: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2780: 20 6f 66 20 6d 61 74 63 68 61 62 6c 65 20 70 68   of matchable ph
2790: 72 61 73 65 73 20 69 6e 20 71 75 65 72 79 20 2a  rases in query *
27a0: 2f 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64  /.  Fts3Deferred
27b0: 54 6f 6b 65 6e 20 2a 70 44 65 66 65 72 72 65 64  Token *pDeferred
27c0: 3b 20 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20  ;   /* Deferred 
27d0: 73 65 61 72 63 68 20 74 6f 6b 65 6e 73 2c 20 69  search tokens, i
27e0: 66 20 61 6e 79 20 2a 2f 0a 20 20 73 71 6c 69 74  f any */.  sqlit
27f0: 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76 49 64  e3_int64 iPrevId
2800: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ;          /* Pr
2810: 65 76 69 6f 75 73 20 69 64 20 72 65 61 64 20 66  evious id read f
2820: 72 6f 6d 20 61 44 6f 63 6c 69 73 74 20 2a 2f 0a  rom aDoclist */.
2830: 20 20 63 68 61 72 20 2a 70 4e 65 78 74 49 64 3b    char *pNextId;
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 69 6e 74    /* Pointer int
2860: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 44  o the body of aD
2870: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  oclist */.  char
2880: 20 2a 61 44 6f 63 6c 69 73 74 3b 20 20 20 20 20   *aDoclist;     
2890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
28a0: 69 73 74 20 6f 66 20 64 6f 63 69 64 73 20 66 6f  ist of docids fo
28b0: 72 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  r full-text quer
28c0: 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f  ies */.  int nDo
28d0: 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
28e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
28f0: 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 61 44   of buffer at aD
2900: 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62  oclist */.  u8 b
2910: 44 65 73 63 3b 20 20 20 20 20 20 20 20 20 20 20  Desc;           
2920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2930: 72 75 65 20 74 6f 20 73 6f 72 74 20 69 6e 20 64  rue to sort in d
2940: 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  escending order 
2950: 2a 2f 0a 20 20 69 6e 74 20 65 45 76 61 6c 6d 6f  */.  int eEvalmo
2960: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
2970: 20 20 20 20 20 2f 2a 20 41 6e 20 46 54 53 33 5f       /* An FTS3_
2980: 45 56 41 4c 5f 58 58 20 63 6f 6e 73 74 61 6e 74  EVAL_XX constant
2990: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 41 76   */.  int nRowAv
29a0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
29b0: 20 20 20 20 20 20 2f 2a 20 41 76 65 72 61 67 65        /* Average
29c0: 20 73 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   size of databas
29d0: 65 20 72 6f 77 73 2c 20 69 6e 20 70 61 67 65 73  e rows, in pages
29e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
29f0: 74 36 34 20 6e 44 6f 63 3b 20 20 20 20 20 20 20  t64 nDoc;       
2a00: 20 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e        /* Documen
2a10: 74 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 0a  ts in table */..
2a20: 20 20 69 6e 74 20 69 73 4d 61 74 63 68 69 6e 66    int isMatchinf
2a30: 6f 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20 20  oNeeded;        
2a40: 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 61    /* True when a
2a50: 4d 61 74 63 68 69 6e 66 6f 5b 5d 20 6e 65 65 64  Matchinfo[] need
2a60: 73 20 66 69 6c 6c 69 6e 67 20 69 6e 20 2a 2f 0a  s filling in */.
2a70: 20 20 75 33 32 20 2a 61 4d 61 74 63 68 69 6e 66    u32 *aMatchinf
2a80: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
2a90: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
2aa0: 20 61 62 6f 75 74 20 6d 6f 73 74 20 72 65 63 65   about most rece
2ab0: 6e 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e  nt match */.  in
2ac0: 74 20 6e 4d 61 74 63 68 69 6e 66 6f 3b 20 20 20  t nMatchinfo;   
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
2af0: 6e 74 73 20 69 6e 20 61 4d 61 74 63 68 69 6e 66  nts in aMatchinf
2b00: 6f 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  o[] */.  char *z
2b10: 4d 61 74 63 68 69 6e 66 6f 3b 20 20 20 20 20 20  Matchinfo;      
2b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
2b30: 68 69 6e 66 6f 20 73 70 65 63 69 66 69 63 61 74  hinfo specificat
2b40: 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ion */.};..#defi
2b50: 6e 65 20 46 54 53 33 5f 45 56 41 4c 5f 46 49 4c  ne FTS3_EVAL_FIL
2b60: 54 45 52 20 20 20 20 30 0a 23 64 65 66 69 6e 65  TER    0.#define
2b70: 20 46 54 53 33 5f 45 56 41 4c 5f 4e 45 58 54 20   FTS3_EVAL_NEXT 
2b80: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 46       1.#define F
2b90: 54 53 33 5f 45 56 41 4c 5f 4d 41 54 43 48 49 4e  TS3_EVAL_MATCHIN
2ba0: 46 4f 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  FO 2../*.** The 
2bb0: 46 74 73 33 43 75 72 73 6f 72 2e 65 53 65 61 72  Fts3Cursor.eSear
2bc0: 63 68 20 6d 65 6d 62 65 72 20 69 73 20 61 6c 77  ch member is alw
2bd0: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
2be0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e  f the following.
2bf0: 0a 2a 2a 20 41 63 74 75 61 6c 79 2c 20 46 74 73  .** Actualy, Fts
2c00: 33 43 75 72 73 6f 72 2e 65 53 65 61 72 63 68 20  3Cursor.eSearch 
2c10: 63 61 6e 20 62 65 20 67 72 65 61 74 65 72 20 74  can be greater t
2c20: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a  han or equal to.
2c30: 2a 2a 20 46 54 53 33 5f 46 55 4c 4c 54 45 58 54  ** FTS3_FULLTEXT
2c40: 5f 53 45 41 52 43 48 2e 20 20 49 66 20 73 6f 2c  _SEARCH.  If so,
2c50: 20 74 68 65 6e 20 46 74 73 33 43 75 72 73 6f 72   then Fts3Cursor
2c60: 2e 65 53 65 61 72 63 68 20 2d 20 32 20 69 73 20  .eSearch - 2 is 
2c70: 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20  the index.** of 
2c80: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  the column to be
2c90: 20 73 65 61 72 63 68 65 64 2e 20 20 46 6f 72 20   searched.  For 
2ca0: 65 78 61 6d 70 6c 65 2c 20 69 6e 0a 2a 2a 0a 2a  example, in.**.*
2cb0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 52  *     CREATE VIR
2cc0: 54 55 41 4c 20 54 41 42 4c 45 20 65 78 31 20 55  TUAL TABLE ex1 U
2cd0: 53 49 4e 47 20 66 74 73 33 28 61 2c 62 2c 63 2c  SING fts3(a,b,c,
2ce0: 64 29 3b 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  d);.**     SELEC
2cf0: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 65 78 31  T docid FROM ex1
2d00: 20 57 48 45 52 45 20 62 20 4d 41 54 43 48 20 27   WHERE b MATCH '
2d10: 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 27 3b 0a  one two three';.
2d20: 2a 2a 20 0a 2a 2a 20 42 65 63 61 75 73 65 20 74  ** .** Because t
2d30: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 4d 41  he LHS of the MA
2d40: 54 43 48 20 6f 70 65 72 61 74 6f 72 20 69 73 20  TCH operator is 
2d50: 32 6e 64 20 63 6f 6c 75 6d 6e 20 22 62 22 2c 0a  2nd column "b",.
2d60: 2a 2a 20 46 74 73 33 43 75 72 73 6f 72 2e 65 53  ** Fts3Cursor.eS
2d70: 65 61 72 63 68 20 77 69 6c 6c 20 62 65 20 73 65  earch will be se
2d80: 74 20 74 6f 20 46 54 53 33 5f 46 55 4c 4c 54 45  t to FTS3_FULLTE
2d90: 58 54 5f 53 45 41 52 43 48 2b 31 2e 20 20 28 2b  XT_SEARCH+1.  (+
2da0: 30 20 66 6f 72 20 61 2c 0a 2a 2a 20 2b 31 20 66  0 for a,.** +1 f
2db0: 6f 72 20 62 2c 20 2b 32 20 66 6f 72 20 63 2c 20  or b, +2 for c, 
2dc0: 2b 33 20 66 6f 72 20 64 2e 29 20 20 49 66 20 74  +3 for d.)  If t
2dd0: 68 65 20 4c 48 53 20 6f 66 20 4d 41 54 43 48 20  he LHS of MATCH 
2de0: 77 65 72 65 20 22 65 78 31 22 20 0a 2a 2a 20 69  were "ex1" .** i
2df0: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
2e00: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 73 68 6f 75 6c  ll columns shoul
2e10: 64 20 62 65 20 73 65 61 72 63 68 65 64 2c 0a 2a  d be searched,.*
2e20: 2a 20 74 68 65 6e 20 65 53 65 61 72 63 68 20 77  * then eSearch w
2e30: 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 46  ould be set to F
2e40: 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41  TS3_FULLTEXT_SEA
2e50: 52 43 48 2b 34 2e 0a 2a 2f 0a 23 64 65 66 69 6e  RCH+4..*/.#defin
2e60: 65 20 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f  e FTS3_FULLSCAN_
2e70: 53 45 41 52 43 48 20 30 20 20 20 20 2f 2a 20 4c  SEARCH 0    /* L
2e80: 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 25 5f  inear scan of %_
2e90: 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f  content table */
2ea0: 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 44 4f  .#define FTS3_DO
2eb0: 43 49 44 5f 53 45 41 52 43 48 20 20 20 20 31 20  CID_SEARCH    1 
2ec0: 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 62 79 20     /* Lookup by 
2ed0: 72 6f 77 69 64 20 6f 6e 20 25 5f 63 6f 6e 74 65  rowid on %_conte
2ee0: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  nt table */.#def
2ef0: 69 6e 65 20 46 54 53 33 5f 46 55 4c 4c 54 45 58  ine FTS3_FULLTEX
2f00: 54 5f 53 45 41 52 43 48 20 32 20 20 20 20 2f 2a  T_SEARCH 2    /*
2f10: 20 46 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   Full-text index
2f20: 20 73 65 61 72 63 68 20 2a 2f 0a 0a 0a 73 74 72   search */...str
2f30: 75 63 74 20 46 74 73 33 44 6f 63 6c 69 73 74 20  uct Fts3Doclist 
2f40: 7b 0a 20 20 63 68 61 72 20 2a 61 41 6c 6c 3b 20  {.  char *aAll; 
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 2f 2a 20 41 72 72 61 79 20 63 6f 6e 74     /* Array cont
2f70: 61 69 6e 69 6e 67 20 64 6f 63 6c 69 73 74 20 28  aining doclist (
2f80: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
2f90: 74 20 6e 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  t nAll;         
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb0: 53 69 7a 65 20 6f 66 20 61 5b 5d 20 69 6e 20 62  Size of a[] in b
2fc0: 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
2fd0: 70 4e 65 78 74 44 6f 63 69 64 3b 20 20 20 20 20  pNextDocid;     
2fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2ff0: 74 65 72 20 74 6f 20 6e 65 78 74 20 64 6f 63 69  ter to next doci
3000: 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f  d */..  sqlite3_
3010: 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20 20  int64 iDocid;   
3020: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
3030: 74 20 64 6f 63 69 64 20 28 69 66 20 70 4c 69 73  t docid (if pLis
3040: 74 21 3d 30 29 20 2a 2f 0a 20 20 69 6e 74 20 62  t!=0) */.  int b
3050: 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
3060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3070: 65 20 69 66 20 70 4c 69 73 74 20 73 68 6f 75 6c  e if pList shoul
3080: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 66 72 65  d be sqlite3_fre
3090: 65 28 29 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  e()d */.  char *
30a0: 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
30b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
30c0: 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20  ter to position 
30d0: 6c 69 73 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  list following i
30e0: 44 6f 63 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  Docid */.  int n
30f0: 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
3100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3110: 67 74 68 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20  gth of position 
3120: 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  list */.};../*.*
3130: 2a 20 41 20 22 70 68 72 61 73 65 22 20 69 73 20  * A "phrase" is 
3140: 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e  a sequence of on
3150: 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e 73  e or more tokens
3160: 20 74 68 61 74 20 6d 75 73 74 20 6d 61 74 63 68   that must match
3170: 20 69 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 2e   in.** sequence.
3180: 20 20 41 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e    A single token
3190: 20 69 73 20 74 68 65 20 62 61 73 65 20 63 61 73   is the base cas
31a0: 65 20 61 6e 64 20 74 68 65 20 6d 6f 73 74 20 63  e and the most c
31b0: 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 20 46  ommon case..** F
31c0: 6f 72 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  or a sequence of
31d0: 20 74 6f 6b 65 6e 73 20 63 6f 6e 74 61 69 6e 65   tokens containe
31e0: 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74  d in double-quot
31f0: 65 73 20 28 69 2e 65 2e 20 22 6f 6e 65 20 74 77  es (i.e. "one tw
3200: 6f 20 74 68 72 65 65 22 29 0a 2a 2a 20 6e 54 6f  o three").** nTo
3210: 6b 65 6e 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ken will be the 
3220: 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
3230: 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a   in the string..
3240: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 33 50 68  */.struct Fts3Ph
3250: 72 61 73 65 54 6f 6b 65 6e 20 7b 0a 20 20 63 68  raseToken {.  ch
3260: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3280: 20 54 65 78 74 20 6f 66 20 74 68 65 20 74 6f 6b   Text of the tok
3290: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  en */.  int n;  
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32c0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75  r of bytes in bu
32d0: 66 66 65 72 20 7a 20 2a 2f 0a 20 20 69 6e 74 20  ffer z */.  int 
32e0: 69 73 50 72 65 66 69 78 3b 20 20 20 20 20 20 20  isPrefix;       
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3300: 72 75 65 20 69 66 20 74 6f 6b 65 6e 20 65 6e 64  rue if token end
3310: 73 20 77 69 74 68 20 61 20 22 2a 22 20 63 68 61  s with a "*" cha
3320: 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  racter */.  int 
3330: 62 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  bFirst;         
3340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3350: 72 75 65 20 69 66 20 74 6f 6b 65 6e 20 6d 75 73  rue if token mus
3360: 74 20 61 70 70 65 61 72 20 61 74 20 70 6f 73 69  t appear at posi
3370: 74 69 6f 6e 20 30 20 2a 2f 0a 0a 20 20 2f 2a 20  tion 0 */..  /* 
3380: 56 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20  Variables above 
3390: 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 70  this point are p
33a0: 6f 70 75 6c 61 74 65 64 20 77 68 65 6e 20 74 68  opulated when th
33b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  e expression is.
33c0: 20 20 2a 2a 20 70 61 72 73 65 64 20 28 62 79 20    ** parsed (by 
33d0: 63 6f 64 65 20 69 6e 20 66 74 73 33 5f 65 78 70  code in fts3_exp
33e0: 72 2e 63 29 2e 20 42 65 6c 6f 77 20 74 68 69 73  r.c). Below this
33f0: 20 70 6f 69 6e 74 20 74 68 65 20 76 61 72 69 61   point the varia
3400: 62 6c 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 73  bles are.  ** us
3410: 65 64 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69  ed when evaluati
3420: 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ng the expressio
3430: 6e 2e 20 2a 2f 0a 20 20 46 74 73 33 44 65 66 65  n. */.  Fts3Defe
3440: 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65  rredToken *pDefe
3450: 72 72 65 64 3b 20 20 20 2f 2a 20 44 65 66 65 72  rred;   /* Defer
3460: 72 65 64 20 74 6f 6b 65 6e 20 6f 62 6a 65 63 74  red token object
3470: 20 66 6f 72 20 74 68 69 73 20 74 6f 6b 65 6e 20   for this token 
3480: 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  */.  Fts3MultiSe
3490: 67 52 65 61 64 65 72 20 2a 70 53 65 67 63 73 72  gReader *pSegcsr
34a0: 3b 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 2d  ;    /* Segment-
34b0: 72 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20  reader for this 
34c0: 74 6f 6b 65 6e 20 2a 2f 0a 7d 3b 0a 0a 73 74 72  token */.};..str
34d0: 75 63 74 20 46 74 73 33 50 68 72 61 73 65 20 7b  uct Fts3Phrase {
34e0: 0a 20 20 2f 2a 20 43 61 63 68 65 20 6f 66 20 64  .  /* Cache of d
34f0: 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20  oclist for this 
3500: 70 68 72 61 73 65 2e 20 2a 2f 0a 20 20 46 74 73  phrase. */.  Fts
3510: 33 44 6f 63 6c 69 73 74 20 64 6f 63 6c 69 73 74  3Doclist doclist
3520: 3b 0a 20 20 69 6e 74 20 62 49 6e 63 72 3b 20 20  ;.  int bIncr;  
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3540: 2a 20 54 72 75 65 20 69 66 20 64 6f 63 6c 69 73  * True if doclis
3550: 74 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 63 72  t is loaded incr
3560: 65 6d 65 6e 74 61 6c 6c 79 20 2a 2f 0a 20 20 69  ementally */.  i
3570: 6e 74 20 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e  nt iDoclistToken
3580: 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ;..  /* Variable
3590: 73 20 62 65 6c 6f 77 20 74 68 69 73 20 70 6f 69  s below this poi
35a0: 6e 74 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64  nt are populated
35b0: 20 62 79 20 66 74 73 33 5f 65 78 70 72 2e 63 20   by fts3_expr.c 
35c0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 0a 20 20  when parsing .  
35d0: 2a 2a 20 61 20 4d 41 54 43 48 20 65 78 70 72 65  ** a MATCH expre
35e0: 73 73 69 6f 6e 2e 20 45 76 65 72 79 74 68 69 6e  ssion. Everythin
35f0: 67 20 61 62 6f 76 65 20 69 73 20 70 61 72 74 20  g above is part 
3600: 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  of the evaluatio
3610: 6e 20 70 68 61 73 65 2e 20 0a 20 20 2a 2f 0a 20  n phase. .  */. 
3620: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 20 20 20 20   int nToken;    
3630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3640: 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
3650: 69 6e 20 74 68 65 20 70 68 72 61 73 65 20 2a 2f  in the phrase */
3660: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3680: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
3690: 20 74 68 69 73 20 70 68 72 61 73 65 20 6d 75 73   this phrase mus
36a0: 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 46 74 73  t match */.  Fts
36b0: 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 61 54 6f  3PhraseToken aTo
36c0: 6b 65 6e 5b 31 5d 3b 20 2f 2a 20 4f 6e 65 20 65  ken[1]; /* One e
36d0: 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 74 6f  ntry for each to
36e0: 6b 65 6e 20 69 6e 20 74 68 65 20 70 68 72 61 73  ken in the phras
36f0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
3700: 20 74 72 65 65 20 6f 66 20 74 68 65 73 65 20 6f   tree of these o
3710: 62 6a 65 63 74 73 20 66 6f 72 6d 73 20 74 68 65  bjects forms the
3720: 20 52 48 53 20 6f 66 20 61 20 4d 41 54 43 48 20   RHS of a MATCH 
3730: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
3740: 49 66 20 46 74 73 33 45 78 70 72 2e 65 54 79 70  If Fts3Expr.eTyp
3750: 65 20 69 73 20 46 54 53 51 55 45 52 59 5f 50 48  e is FTSQUERY_PH
3760: 52 41 53 45 20 61 6e 64 20 69 73 4c 6f 61 64 65  RASE and isLoade
3770: 64 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  d is true, then 
3780: 61 44 6f 63 6c 69 73 74 20 0a 2a 2a 20 70 6f 69  aDoclist .** poi
3790: 6e 74 73 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65  nts to a malloce
37a0: 64 20 62 75 66 66 65 72 2c 20 73 69 7a 65 20 6e  d buffer, size n
37b0: 44 6f 63 6c 69 73 74 20 62 79 74 65 73 2c 20 63  Doclist bytes, c
37c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
37d0: 73 75 6c 74 73 20 0a 2a 2a 20 6f 66 20 74 68 69  sults .** of thi
37e0: 73 20 70 68 72 61 73 65 20 71 75 65 72 79 20 69  s phrase query i
37f0: 6e 20 46 54 53 33 20 64 6f 63 6c 69 73 74 20 66  n FTS3 doclist f
3800: 6f 72 6d 61 74 2e 20 41 73 20 75 73 75 61 6c 2c  ormat. As usual,
3810: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 0a 2a 2a   the initial .**
3820: 20 22 4c 65 6e 67 74 68 22 20 66 69 65 6c 64 20   "Length" field 
3830: 66 6f 75 6e 64 20 69 6e 20 64 6f 63 6c 69 73 74  found in doclist
3840: 73 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  s stored on disk
3850: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
3860: 20 74 68 69 73 20 0a 2a 2a 20 62 75 66 66 65 72   this .** buffer
3870: 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65  ..**.** Variable
3880: 20 61 4d 49 20 69 73 20 75 73 65 64 20 6f 6e 6c   aMI is used onl
3890: 79 20 66 6f 72 20 46 54 53 51 55 45 52 59 5f 4e  y for FTSQUERY_N
38a0: 45 41 52 20 6e 6f 64 65 73 20 74 6f 20 73 74 6f  EAR nodes to sto
38b0: 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 0a 2a 2a  re the global.**
38c0: 20 6d 61 74 63 68 69 6e 66 6f 20 64 61 74 61 2e   matchinfo data.
38d0: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
38e0: 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
38f0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a   an array of siz
3900: 65 20 6e 43 6f 6c 2a 33 2c 0a 2a 2a 20 77 68 65  e nCol*3,.** whe
3910: 72 65 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e  re nCol is the n
3920: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
3930: 20 69 6e 20 74 68 65 20 71 75 65 72 69 65 64 20   in the queried 
3940: 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20 61  FTS table. The a
3950: 72 72 61 79 0a 2a 2a 20 69 73 20 70 6f 70 75 6c  rray.** is popul
3960: 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
3970: 0a 2a 2a 0a 2a 2a 20 20 20 61 4d 49 5b 69 43 6f  .**.**   aMI[iCo
3980: 6c 2a 33 20 2b 20 30 5d 20 3d 20 55 6e 64 65 66  l*3 + 0] = Undef
3990: 69 6e 65 64 0a 2a 2a 20 20 20 61 4d 49 5b 69 43  ined.**   aMI[iC
39a0: 6f 6c 2a 33 20 2b 20 31 5d 20 3d 20 4e 75 6d 62  ol*3 + 1] = Numb
39b0: 65 72 20 6f 66 20 6f 63 63 75 72 72 65 6e 63 65  er of occurrence
39c0: 73 0a 2a 2a 20 20 20 61 4d 49 5b 69 43 6f 6c 2a  s.**   aMI[iCol*
39d0: 33 20 2b 20 32 5d 20 3d 20 4e 75 6d 62 65 72 20  3 + 2] = Number 
39e0: 6f 66 20 72 6f 77 73 20 63 6f 6e 74 61 69 6e 69  of rows containi
39f0: 6e 67 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ng at least one 
3a00: 69 6e 73 74 61 6e 63 65 0a 2a 2a 0a 2a 2a 20 54  instance.**.** T
3a10: 68 65 20 61 4d 49 20 61 72 72 61 79 20 69 73 20  he aMI array is 
3a20: 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
3a30: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
3a40: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 66  . It should be f
3a50: 72 65 65 64 20 0a 2a 2a 20 77 68 65 6e 20 74 68  reed .** when th
3a60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  e expression nod
3a70: 65 20 69 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  e is..*/.struct 
3a80: 46 74 73 33 45 78 70 72 20 7b 0a 20 20 69 6e 74  Fts3Expr {.  int
3a90: 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
3aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3ab0: 66 20 74 68 65 20 46 54 53 51 55 45 52 59 5f 58  f the FTSQUERY_X
3ac0: 58 58 20 76 61 6c 75 65 73 20 64 65 66 69 6e 65  XX values define
3ad0: 64 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 69 6e 74  d below */.  int
3ae0: 20 6e 4e 65 61 72 3b 20 20 20 20 20 20 20 20 20   nNear;         
3af0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64          /* Valid
3b00: 20 69 66 20 65 54 79 70 65 3d 3d 46 54 53 51 55   if eType==FTSQU
3b10: 45 52 59 5f 4e 45 41 52 20 2a 2f 0a 20 20 46 74  ERY_NEAR */.  Ft
3b20: 73 33 45 78 70 72 20 2a 70 50 61 72 65 6e 74 3b  s3Expr *pParent;
3b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 72           /* pPar
3b40: 65 6e 74 2d 3e 70 4c 65 66 74 3d 3d 74 68 69 73  ent->pLeft==this
3b50: 20 6f 72 20 70 50 61 72 65 6e 74 2d 3e 70 52 69   or pParent->pRi
3b60: 67 68 74 3d 3d 74 68 69 73 20 2a 2f 0a 20 20 46  ght==this */.  F
3b70: 74 73 33 45 78 70 72 20 2a 70 4c 65 66 74 3b 20  ts3Expr *pLeft; 
3b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
3b90: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 46  t operand */.  F
3ba0: 74 73 33 45 78 70 72 20 2a 70 52 69 67 68 74 3b  ts3Expr *pRight;
3bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
3bc0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
3bd0: 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68 72  Fts3Phrase *pPhr
3be0: 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 56 61  ase;       /* Va
3bf0: 6c 69 64 20 69 66 20 65 54 79 70 65 3d 3d 46 54  lid if eType==FT
3c00: 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 2a 2f  SQUERY_PHRASE */
3c10: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
3c20: 77 69 6e 67 20 61 72 65 20 75 73 65 64 20 62 79  wing are used by
3c30: 20 74 68 65 20 66 74 73 33 5f 65 76 61 6c 2e 63   the fts3_eval.c
3c40: 20 6d 6f 64 75 6c 65 2e 20 2a 2f 0a 20 20 73 71   module. */.  sq
3c50: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63  lite3_int64 iDoc
3c60: 69 64 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72  id;      /* Curr
3c70: 65 6e 74 20 64 6f 63 69 64 20 2a 2f 0a 20 20 75  ent docid */.  u
3c80: 38 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20  8 bEof;         
3c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3ca0: 65 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  e this expressio
3cb0: 6e 20 69 73 20 61 74 20 45 4f 46 20 61 6c 72 65  n is at EOF alre
3cc0: 61 64 79 20 2a 2f 0a 20 20 75 38 20 62 53 74 61  ady */.  u8 bSta
3cd0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rt;             
3ce0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
3cf0: 44 6f 63 69 64 20 69 73 20 76 61 6c 69 64 20 2a  Docid is valid *
3d00: 2f 0a 20 20 75 38 20 62 44 65 66 65 72 72 65 64  /.  u8 bDeferred
3d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3d20: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 65  * True if this e
3d30: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6e 74  xpression is ent
3d40: 69 72 65 6c 79 20 64 65 66 65 72 72 65 64 20 2a  irely deferred *
3d50: 2f 0a 0a 20 20 75 33 32 20 2a 61 4d 49 3b 0a 7d  /..  u32 *aMI;.}
3d60: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6e 64 69 64 61  ;../*.** Candida
3d70: 74 65 20 76 61 6c 75 65 73 20 66 6f 72 20 46 74  te values for Ft
3d80: 73 33 51 75 65 72 79 2e 65 54 79 70 65 2e 20 4e  s3Query.eType. N
3d90: 6f 74 65 20 74 68 61 74 20 74 68 65 20 6f 72 64  ote that the ord
3da0: 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 0a  er of the first.
3db0: 2a 2a 20 66 6f 75 72 20 76 61 6c 75 65 73 20 69  ** four values i
3dc0: 73 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 70 72  s in order of pr
3dd0: 65 63 65 64 65 6e 63 65 20 77 68 65 6e 20 70 61  ecedence when pa
3de0: 72 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  rsing expression
3df0: 73 2e 20 46 6f 72 20 0a 2a 2a 20 65 78 61 6d 70  s. For .** examp
3e00: 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  le, the followin
3e10: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 20 4f 52  g:.**.**   "a OR
3e20: 20 62 20 41 4e 44 20 63 20 4e 4f 54 20 64 20 4e   b AND c NOT d N
3e30: 45 41 52 20 65 22 0a 2a 2a 0a 2a 2a 20 69 73 20  EAR e".**.** is 
3e40: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 2a  equivalent to:.*
3e50: 2a 0a 2a 2a 20 20 20 22 61 20 4f 52 20 28 62 20  *.**   "a OR (b 
3e60: 41 4e 44 20 28 63 20 4e 4f 54 20 28 64 20 4e 45  AND (c NOT (d NE
3e70: 41 52 20 65 29 29 29 22 0a 2a 2f 0a 23 64 65 66  AR e)))".*/.#def
3e80: 69 6e 65 20 46 54 53 51 55 45 52 59 5f 4e 45 41  ine FTSQUERY_NEA
3e90: 52 20 20 20 31 0a 23 64 65 66 69 6e 65 20 46 54  R   1.#define FT
3ea0: 53 51 55 45 52 59 5f 4e 4f 54 20 20 20 20 32 0a  SQUERY_NOT    2.
3eb0: 23 64 65 66 69 6e 65 20 46 54 53 51 55 45 52 59  #define FTSQUERY
3ec0: 5f 41 4e 44 20 20 20 20 33 0a 23 64 65 66 69 6e  _AND    3.#defin
3ed0: 65 20 46 54 53 51 55 45 52 59 5f 4f 52 20 20 20  e FTSQUERY_OR   
3ee0: 20 20 34 0a 23 64 65 66 69 6e 65 20 46 54 53 51    4.#define FTSQ
3ef0: 55 45 52 59 5f 50 48 52 41 53 45 20 35 0a 0a 0a  UERY_PHRASE 5...
3f00: 2f 2a 20 66 74 73 33 5f 77 72 69 74 65 2e 63 20  /* fts3_write.c 
3f10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
3f20: 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28 73  s3UpdateMethod(s
3f30: 71 6c 69 74 65 33 5f 76 74 61 62 2a 2c 69 6e 74  qlite3_vtab*,int
3f40: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
3f50: 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  ,sqlite3_int64*)
3f60: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
3f70: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75  3PendingTermsFlu
3f80: 73 68 28 46 74 73 33 54 61 62 6c 65 20 2a 29 3b  sh(Fts3Table *);
3f90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
3fa0: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65  3PendingTermsCle
3fb0: 61 72 28 46 74 73 33 54 61 62 6c 65 20 2a 29 3b  ar(Fts3Table *);
3fc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
3fd0: 4f 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62  Optimize(Fts3Tab
3fe0: 6c 65 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  le *);.int sqlit
3ff0: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e  e3Fts3SegReaderN
4000: 65 77 28 69 6e 74 2c 20 69 6e 74 2c 20 73 71 6c  ew(int, int, sql
4010: 69 74 65 33 5f 69 6e 74 36 34 2c 0a 20 20 73 71  ite3_int64,.  sq
4020: 6c 69 74 65 33 5f 69 6e 74 36 34 2c 20 73 71 6c  lite3_int64, sql
4030: 69 74 65 33 5f 69 6e 74 36 34 2c 20 63 6f 6e 73  ite3_int64, cons
4040: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 46  t char *, int, F
4050: 74 73 33 53 65 67 52 65 61 64 65 72 2a 2a 29 3b  ts3SegReader**);
4060: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
4070: 53 65 67 52 65 61 64 65 72 50 65 6e 64 69 6e 67  SegReaderPending
4080: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 2a 2c 69  (.  Fts3Table*,i
4090: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  nt,const char*,i
40a0: 6e 74 2c 69 6e 74 2c 46 74 73 33 53 65 67 52 65  nt,int,Fts3SegRe
40b0: 61 64 65 72 2a 2a 29 3b 0a 76 6f 69 64 20 73 71  ader**);.void sq
40c0: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
40d0: 65 72 46 72 65 65 28 46 74 73 33 53 65 67 52 65  erFree(Fts3SegRe
40e0: 61 64 65 72 20 2a 29 3b 0a 69 6e 74 20 73 71 6c  ader *);.int sql
40f0: 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64 69  ite3Fts3AllSegdi
4100: 72 73 28 46 74 73 33 54 61 62 6c 65 2a 2c 20 69  rs(Fts3Table*, i
4110: 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 73 71  nt, int, int, sq
4120: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 29 3b 0a  lite3_stmt **);.
4130: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 52  int sqlite3Fts3R
4140: 65 61 64 4c 6f 63 6b 28 46 74 73 33 54 61 62 6c  eadLock(Fts3Tabl
4150: 65 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  e *);.int sqlite
4160: 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 46  3Fts3ReadBlock(F
4170: 74 73 33 54 61 62 6c 65 2a 2c 20 73 71 6c 69 74  ts3Table*, sqlit
4180: 65 33 5f 69 6e 74 36 34 2c 20 63 68 61 72 20 2a  e3_int64, char *
4190: 2a 2c 20 69 6e 74 2a 2c 20 69 6e 74 2a 29 3b 0a  *, int*, int*);.
41a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
41b0: 53 65 6c 65 63 74 44 6f 63 74 6f 74 61 6c 28 46  SelectDoctotal(F
41c0: 74 73 33 54 61 62 6c 65 20 2a 2c 20 73 71 6c 69  ts3Table *, sqli
41d0: 74 65 33 5f 73 74 6d 74 20 2a 2a 29 3b 0a 69 6e  te3_stmt **);.in
41e0: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 6c  t sqlite3Fts3Sel
41f0: 65 63 74 44 6f 63 73 69 7a 65 28 46 74 73 33 54  ectDocsize(Fts3T
4200: 61 62 6c 65 20 2a 2c 20 73 71 6c 69 74 65 33 5f  able *, sqlite3_
4210: 69 6e 74 36 34 2c 20 73 71 6c 69 74 65 33 5f 73  int64, sqlite3_s
4220: 74 6d 74 20 2a 2a 29 3b 0a 0a 23 69 66 6e 64 65  tmt **);..#ifnde
4230: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
4240: 5f 46 54 53 34 5f 44 45 46 45 52 52 45 44 0a 76  _FTS4_DEFERRED.v
4250: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 46  oid sqlite3Fts3F
4260: 72 65 65 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  reeDeferredToken
4270: 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29 3b  s(Fts3Cursor *);
4280: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
4290: 44 65 66 65 72 54 6f 6b 65 6e 28 46 74 73 33 43  DeferToken(Fts3C
42a0: 75 72 73 6f 72 20 2a 2c 20 46 74 73 33 50 68 72  ursor *, Fts3Phr
42b0: 61 73 65 54 6f 6b 65 6e 20 2a 2c 20 69 6e 74 29  aseToken *, int)
42c0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
42d0: 33 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f  3CacheDeferredDo
42e0: 63 6c 69 73 74 73 28 46 74 73 33 43 75 72 73 6f  clists(Fts3Curso
42f0: 72 20 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  r *);.void sqlit
4300: 65 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72  e3Fts3FreeDeferr
4310: 65 64 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43  edDoclists(Fts3C
4320: 75 72 73 6f 72 20 2a 29 3b 0a 69 6e 74 20 73 71  ursor *);.int sq
4330: 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 72 65  lite3Fts3Deferre
4340: 64 54 6f 6b 65 6e 4c 69 73 74 28 46 74 73 33 44  dTokenList(Fts3D
4350: 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 2c 20  eferredToken *, 
4360: 63 68 61 72 20 2a 2a 2c 20 69 6e 74 20 2a 29 3b  char **, int *);
4370: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4380: 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65 44  sqlite3Fts3FreeD
4390: 65 66 65 72 72 65 64 54 6f 6b 65 6e 73 28 78 29  eferredTokens(x)
43a0: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
43b0: 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28  3Fts3DeferToken(
43c0: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
43d0: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
43e0: 33 46 74 73 33 43 61 63 68 65 44 65 66 65 72 72  3Fts3CacheDeferr
43f0: 65 64 44 6f 63 6c 69 73 74 73 28 78 29 20 53 51  edDoclists(x) SQ
4400: 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65  LITE_OK.# define
4410: 20 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65   sqlite3Fts3Free
4420: 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73  DeferredDoclists
4430: 28 78 29 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  (x).# define sql
4440: 69 74 65 33 46 74 73 33 44 65 66 65 72 72 65 64  ite3Fts3Deferred
4450: 54 6f 6b 65 6e 4c 69 73 74 28 78 2c 79 2c 7a 29  TokenList(x,y,z)
4460: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
4470: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  f..void sqlite3F
4480: 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65  ts3SegmentsClose
4490: 28 46 74 73 33 54 61 62 6c 65 20 2a 29 3b 0a 69  (Fts3Table *);.i
44a0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 61  nt sqlite3Fts3Ma
44b0: 78 4c 65 76 65 6c 28 46 74 73 33 54 61 62 6c 65  xLevel(Fts3Table
44c0: 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a 0a 2f 2a 20   *, int *);../* 
44d0: 53 70 65 63 69 61 6c 20 76 61 6c 75 65 73 20 69  Special values i
44e0: 6e 74 65 72 70 72 65 74 65 64 20 62 79 20 73 71  nterpreted by sq
44f0: 6c 69 74 65 33 53 65 67 52 65 61 64 65 72 43 75  lite3SegReaderCu
4500: 72 73 6f 72 28 29 20 2a 2f 0a 23 64 65 66 69 6e  rsor() */.#defin
4510: 65 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  e FTS3_SEGCURSOR
4520: 5f 50 45 4e 44 49 4e 47 20 20 20 20 20 20 20 20  _PENDING        
4530: 2d 31 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f  -1.#define FTS3_
4540: 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 20 20  SEGCURSOR_ALL   
4550: 20 20 20 20 20 20 20 20 20 2d 32 0a 0a 69 6e 74           -2..int
4560: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
4570: 65 61 64 65 72 53 74 61 72 74 28 46 74 73 33 54  eaderStart(Fts3T
4580: 61 62 6c 65 2a 2c 20 46 74 73 33 4d 75 6c 74 69  able*, Fts3Multi
4590: 53 65 67 52 65 61 64 65 72 2a 2c 20 46 74 73 33  SegReader*, Fts3
45a0: 53 65 67 46 69 6c 74 65 72 2a 29 3b 0a 69 6e 74  SegFilter*);.int
45b0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
45c0: 65 61 64 65 72 53 74 65 70 28 46 74 73 33 54 61  eaderStep(Fts3Ta
45d0: 62 6c 65 20 2a 2c 20 46 74 73 33 4d 75 6c 74 69  ble *, Fts3Multi
45e0: 53 65 67 52 65 61 64 65 72 20 2a 29 3b 0a 76 6f  SegReader *);.vo
45f0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  id sqlite3Fts3Se
4600: 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 46 74  gReaderFinish(Ft
4610: 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
4620: 20 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65   *);..int sqlite
4630: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  3Fts3SegReaderCu
4640: 72 73 6f 72 28 46 74 73 33 54 61 62 6c 65 20 2a  rsor(Fts3Table *
4650: 2c 20 0a 20 20 20 20 69 6e 74 2c 20 69 6e 74 2c  , .    int, int,
4660: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72   int, const char
4670: 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e   *, int, int, in
4680: 74 2c 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  t, Fts3MultiSegR
4690: 65 61 64 65 72 20 2a 29 3b 0a 0a 2f 2a 20 46 6c  eader *);../* Fl
46a0: 61 67 73 20 61 6c 6c 6f 77 65 64 20 61 73 20 70  ags allowed as p
46b0: 61 72 74 20 6f 66 20 74 68 65 20 34 74 68 20 61  art of the 4th a
46c0: 72 67 75 6d 65 6e 74 20 74 6f 20 53 65 67 6d 65  rgument to Segme
46d0: 6e 74 52 65 61 64 65 72 49 74 65 72 61 74 65 28  ntReaderIterate(
46e0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ) */.#define FTS
46f0: 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52  3_SEGMENT_REQUIR
4700: 45 5f 50 4f 53 20 20 20 30 78 30 30 30 30 30 30  E_POS   0x000000
4710: 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f  01.#define FTS3_
4720: 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45  SEGMENT_IGNORE_E
4730: 4d 50 54 59 20 20 30 78 30 30 30 30 30 30 30 32  MPTY  0x00000002
4740: 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 53 45  .#define FTS3_SE
4750: 47 4d 45 4e 54 5f 43 4f 4c 55 4d 4e 5f 46 49 4c  GMENT_COLUMN_FIL
4760: 54 45 52 20 30 78 30 30 30 30 30 30 30 34 0a 23  TER 0x00000004.#
4770: 64 65 66 69 6e 65 20 46 54 53 33 5f 53 45 47 4d  define FTS3_SEGM
4780: 45 4e 54 5f 50 52 45 46 49 58 20 20 20 20 20 20  ENT_PREFIX      
4790: 20 20 30 78 30 30 30 30 30 30 30 38 0a 23 64 65    0x00000008.#de
47a0: 66 69 6e 65 20 46 54 53 33 5f 53 45 47 4d 45 4e  fine FTS3_SEGMEN
47b0: 54 5f 53 43 41 4e 20 20 20 20 20 20 20 20 20 20  T_SCAN          
47c0: 30 78 30 30 30 30 30 30 31 30 0a 23 64 65 66 69  0x00000010.#defi
47d0: 6e 65 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f  ne FTS3_SEGMENT_
47e0: 46 49 52 53 54 20 20 20 20 20 20 20 20 20 30 78  FIRST         0x
47f0: 30 30 30 30 30 30 32 30 0a 0a 2f 2a 20 54 79 70  00000020../* Typ
4800: 65 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20  e passed as 4th 
4810: 61 72 67 75 6d 65 6e 74 20 74 6f 20 53 65 67 6d  argument to Segm
4820: 65 6e 74 52 65 61 64 65 72 49 74 65 72 61 74 65  entReaderIterate
4830: 28 29 20 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  () */.struct Fts
4840: 33 53 65 67 46 69 6c 74 65 72 20 7b 0a 20 20 63  3SegFilter {.  c
4850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
4860: 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20  ;.  int nTerm;. 
4870: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
4880: 20 66 6c 61 67 73 3b 0a 7d 3b 0a 0a 73 74 72 75   flags;.};..stru
4890: 63 74 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  ct Fts3MultiSegR
48a0: 65 61 64 65 72 20 7b 0a 20 20 2f 2a 20 55 73 65  eader {.  /* Use
48b0: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
48c0: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
48d0: 61 64 65 72 58 58 58 28 29 20 63 61 6c 6c 73 20  aderXXX() calls 
48e0: 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
48f0: 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 3b 20  er **apSegment; 
4900: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
4910: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
4920: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  bjects */.  int 
4930: 6e 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 20  nSegment;       
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 69 7a 65 20 6f 66 20 61 70 53 65 67 6d 65 6e 74  ize of apSegment
4960: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
4970: 6e 41 64 76 61 6e 63 65 3b 20 20 20 20 20 20 20  nAdvance;       
4980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
4990: 6f 77 20 6d 61 6e 79 20 73 65 67 2d 72 65 61 64  ow many seg-read
49a0: 65 72 73 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  ers to advance *
49b0: 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65  /.  Fts3SegFilte
49c0: 72 20 2a 70 46 69 6c 74 65 72 3b 20 20 20 20 20  r *pFilter;     
49d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
49e0: 6f 20 66 69 6c 74 65 72 20 6f 62 6a 65 63 74 20  o filter object 
49f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 42 75 66 66  */.  char *aBuff
4a00: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
4a10: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
4a20: 6f 20 6d 65 72 67 65 20 64 6f 63 6c 69 73 74 73  o merge doclists
4a30: 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75   in */.  int nBu
4a40: 66 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ffer;           
4a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
4a60: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 42  cated size of aB
4a70: 75 66 66 65 72 5b 5d 20 69 6e 20 62 79 74 65 73  uffer[] in bytes
4a80: 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43 6f 6c 46   */..  int iColF
4a90: 69 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  ilter;          
4aa0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
4ab0: 2c 20 66 69 6c 74 65 72 20 66 6f 72 20 74 68 69  , filter for thi
4ac0: 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  s column */.  in
4ad0: 74 20 62 52 65 73 74 61 72 74 3b 0a 0a 20 20 2f  t bRestart;..  /
4ae0: 2a 20 55 73 65 64 20 62 79 20 66 74 73 33 2e 63  * Used by fts3.c
4af0: 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 69 6e 74 20   only. */.  int 
4b00: 6e 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  nCost;          
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4b20: 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 69  ost of running i
4b30: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
4b40: 20 62 4c 6f 6f 6b 75 70 3b 20 20 20 20 20 20 20   bLookup;       
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b60: 54 72 75 65 20 69 66 20 61 20 6c 6f 6f 6b 75 70  True if a lookup
4b70: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 65 6e 74   of a single ent
4b80: 72 79 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ry. */..  /* Out
4b90: 70 75 74 20 76 61 6c 75 65 73 2e 20 56 61 6c 69  put values. Vali
4ba0: 64 20 6f 6e 6c 79 20 61 66 74 65 72 20 46 74 73  d only after Fts
4bb0: 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 29  3SegReaderStep()
4bc0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4bd0: 52 4f 57 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ROW. */.  char *
4be0: 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  zTerm;          
4bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
4c00: 6e 74 65 72 20 74 6f 20 74 65 72 6d 20 62 75 66  nter to term buf
4c10: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  fer */.  int nTe
4c20: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
4c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4c40: 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74   of zTerm in byt
4c50: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  es */.  char *aD
4c60: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
4c70: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
4c80: 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 62 75  er to doclist bu
4c90: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ffer */.  int nD
4ca0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
4cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4cc0: 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 5b 5d 20  e of aDoclist[] 
4cd0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a  in bytes */.};..
4ce0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 49  int sqlite3Fts3I
4cf0: 6e 63 72 6d 65 72 67 65 28 46 74 73 33 54 61 62  ncrmerge(Fts3Tab
4d00: 6c 65 2a 2c 69 6e 74 2c 69 6e 74 29 3b 0a 0a 2f  le*,int,int);../
4d10: 2a 20 66 74 73 33 2e 63 20 2a 2f 0a 69 6e 74 20  * fts3.c */.int 
4d20: 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
4d30: 72 69 6e 74 28 63 68 61 72 20 2a 2c 20 73 71 6c  rint(char *, sql
4d40: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 69 6e 74  ite3_int64);.int
4d50: 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
4d60: 61 72 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  arint(const char
4d70: 20 2a 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   *, sqlite_int64
4d80: 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33   *);.int sqlite3
4d90: 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  Fts3GetVarint32(
4da0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
4db0: 74 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  t *);.int sqlite
4dc0: 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 73  3Fts3VarintLen(s
4dd0: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 3b 0a  qlite3_uint64);.
4de0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
4df0: 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 29 3b  Dequote(char *);
4e00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
4e10: 33 44 6f 63 6c 69 73 74 50 72 65 76 28 69 6e 74  3DoclistPrev(int
4e20: 2c 63 68 61 72 2a 2c 69 6e 74 2c 63 68 61 72 2a  ,char*,int,char*
4e30: 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *,sqlite3_int64*
4e40: 2c 69 6e 74 2a 2c 75 38 2a 29 3b 0a 69 6e 74 20  ,int*,u8*);.int 
4e50: 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c 50  sqlite3Fts3EvalP
4e60: 68 72 61 73 65 53 74 61 74 73 28 46 74 73 33 43  hraseStats(Fts3C
4e70: 75 72 73 6f 72 20 2a 2c 20 46 74 73 33 45 78 70  ursor *, Fts3Exp
4e80: 72 20 2a 2c 20 75 33 32 20 2a 29 3b 0a 69 6e 74  r *, u32 *);.int
4e90: 20 73 71 6c 69 74 65 33 46 74 73 33 46 69 72 73   sqlite3Fts3Firs
4ea0: 74 46 69 6c 74 65 72 28 73 71 6c 69 74 65 33 5f  tFilter(sqlite3_
4eb0: 69 6e 74 36 34 2c 20 63 68 61 72 20 2a 2c 20 69  int64, char *, i
4ec0: 6e 74 2c 20 63 68 61 72 20 2a 29 3b 0a 76 6f 69  nt, char *);.voi
4ed0: 64 20 73 71 6c 69 74 65 33 46 74 73 33 43 72 65  d sqlite3Fts3Cre
4ee0: 61 74 65 53 74 61 74 54 61 62 6c 65 28 69 6e 74  ateStatTable(int
4ef0: 2a 2c 20 46 74 73 33 54 61 62 6c 65 2a 29 3b 0a  *, Fts3Table*);.
4f00: 0a 2f 2a 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a  ./* fts3_tokeniz
4f10: 65 72 2e 63 20 2a 2f 0a 63 6f 6e 73 74 20 63 68  er.c */.const ch
4f20: 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 33 4e  ar *sqlite3Fts3N
4f30: 65 78 74 54 6f 6b 65 6e 28 63 6f 6e 73 74 20 63  extToken(const c
4f40: 68 61 72 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a 69  har *, int *);.i
4f50: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e  nt sqlite3Fts3In
4f60: 69 74 48 61 73 68 54 61 62 6c 65 28 73 71 6c 69  itHashTable(sqli
4f70: 74 65 33 20 2a 2c 20 46 74 73 33 48 61 73 68 20  te3 *, Fts3Hash 
4f80: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  *, const char *)
4f90: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4fa0: 33 49 6e 69 74 54 6f 6b 65 6e 69 7a 65 72 28 46  3InitTokenizer(F
4fb0: 74 73 33 48 61 73 68 20 2a 70 48 61 73 68 2c 20  ts3Hash *pHash, 
4fc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 0a 20  const char *, . 
4fd0: 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e     sqlite3_token
4fe0: 69 7a 65 72 20 2a 2a 2c 20 63 68 61 72 20 2a 2a  izer **, char **
4ff0: 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .);.int sqlite3F
5000: 74 73 33 49 73 49 64 43 68 61 72 28 63 68 61 72  ts3IsIdChar(char
5010: 29 3b 0a 0a 2f 2a 20 66 74 73 33 5f 73 6e 69 70  );../* fts3_snip
5020: 70 65 74 2e 63 20 2a 2f 0a 76 6f 69 64 20 73 71  pet.c */.void sq
5030: 6c 69 74 65 33 46 74 73 33 4f 66 66 73 65 74 73  lite3Fts3Offsets
5040: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5050: 2a 2c 20 46 74 73 33 43 75 72 73 6f 72 2a 29 3b  *, Fts3Cursor*);
5060: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
5070: 33 53 6e 69 70 70 65 74 28 73 71 6c 69 74 65 33  3Snippet(sqlite3
5080: 5f 63 6f 6e 74 65 78 74 20 2a 2c 20 46 74 73 33  _context *, Fts3
5090: 43 75 72 73 6f 72 20 2a 2c 20 63 6f 6e 73 74 20  Cursor *, const 
50a0: 63 68 61 72 20 2a 2c 0a 20 20 63 6f 6e 73 74 20  char *,.  const 
50b0: 63 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68  char *, const ch
50c0: 61 72 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 0a 29  ar *, int, int.)
50d0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
50e0: 73 33 4d 61 74 63 68 69 6e 66 6f 28 73 71 6c 69  s3Matchinfo(sqli
50f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 2c 20 46  te3_context *, F
5100: 74 73 33 43 75 72 73 6f 72 20 2a 2c 20 63 6f 6e  ts3Cursor *, con
5110: 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 20  st char *);../* 
5120: 66 74 73 33 5f 65 78 70 72 2e 63 20 2a 2f 0a 69  fts3_expr.c */.i
5130: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 45 78  nt sqlite3Fts3Ex
5140: 70 72 50 61 72 73 65 28 73 71 6c 69 74 65 33 5f  prParse(sqlite3_
5150: 74 6f 6b 65 6e 69 7a 65 72 20 2a 2c 20 69 6e 74  tokenizer *, int
5160: 2c 0a 20 20 63 68 61 72 20 2a 2a 2c 20 69 6e 74  ,.  char **, int
5170: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 63 6f 6e 73  , int, int, cons
5180: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 46  t char *, int, F
5190: 74 73 33 45 78 70 72 20 2a 2a 0a 29 3b 0a 76 6f  ts3Expr **.);.vo
51a0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 45 78  id sqlite3Fts3Ex
51b0: 70 72 46 72 65 65 28 46 74 73 33 45 78 70 72 20  prFree(Fts3Expr 
51c0: 2a 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  *);.#ifdef SQLIT
51d0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
51e0: 65 33 46 74 73 33 45 78 70 72 49 6e 69 74 54 65  e3Fts3ExprInitTe
51f0: 73 74 49 6e 74 65 72 66 61 63 65 28 73 71 6c 69  stInterface(sqli
5200: 74 65 33 20 2a 64 62 29 3b 0a 69 6e 74 20 73 71  te3 *db);.int sq
5210: 6c 69 74 65 33 46 74 73 33 49 6e 69 74 54 65 72  lite3Fts3InitTer
5220: 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 29 3b 0a  m(sqlite3 *db);.
5230: 23 65 6e 64 69 66 0a 0a 69 6e 74 20 73 71 6c 69  #endif..int sqli
5240: 74 65 33 46 74 73 33 4f 70 65 6e 54 6f 6b 65 6e  te3Fts3OpenToken
5250: 69 7a 65 72 28 73 71 6c 69 74 65 33 5f 74 6f 6b  izer(sqlite3_tok
5260: 65 6e 69 7a 65 72 20 2a 2c 20 69 6e 74 2c 20 63  enizer *, int, c
5270: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
5280: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  ,.  sqlite3_toke
5290: 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 2a 0a  nizer_cursor **.
52a0: 29 3b 0a 0a 2f 2a 20 66 74 73 33 5f 61 75 78 2e  );../* fts3_aux.
52b0: 63 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  c */.int sqlite3
52c0: 46 74 73 33 49 6e 69 74 41 75 78 28 73 71 6c 69  Fts3InitAux(sqli
52d0: 74 65 33 20 2a 64 62 29 3b 0a 0a 76 6f 69 64 20  te3 *db);..void 
52e0: 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c 50  sqlite3Fts3EvalP
52f0: 68 72 61 73 65 43 6c 65 61 6e 75 70 28 46 74 73  hraseCleanup(Fts
5300: 33 50 68 72 61 73 65 20 2a 29 3b 0a 0a 69 6e 74  3Phrase *);..int
5310: 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
5320: 6e 63 72 53 74 61 72 74 28 0a 20 20 20 20 46 74  ncrStart(.    Ft
5330: 73 33 54 61 62 6c 65 2a 2c 20 46 74 73 33 4d 75  s3Table*, Fts3Mu
5340: 6c 74 69 53 65 67 52 65 61 64 65 72 2a 2c 20 69  ltiSegReader*, i
5350: 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  nt, const char*,
5360: 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74   int);.int sqlit
5370: 65 33 46 74 73 33 4d 73 72 49 6e 63 72 4e 65 78  e3Fts3MsrIncrNex
5380: 74 28 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65  t(.    Fts3Table
5390: 20 2a 2c 20 46 74 73 33 4d 75 6c 74 69 53 65 67   *, Fts3MultiSeg
53a0: 52 65 61 64 65 72 20 2a 2c 20 73 71 6c 69 74 65  Reader *, sqlite
53b0: 33 5f 69 6e 74 36 34 20 2a 2c 20 63 68 61 72 20  3_int64 *, char 
53c0: 2a 2a 2c 20 69 6e 74 20 2a 29 3b 0a 69 6e 74 20  **, int *);.int 
53d0: 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c 50  sqlite3Fts3EvalP
53e0: 68 72 61 73 65 50 6f 73 6c 69 73 74 28 46 74 73  hrasePoslist(Fts
53f0: 33 43 75 72 73 6f 72 20 2a 2c 20 46 74 73 33 45  3Cursor *, Fts3E
5400: 78 70 72 20 2a 2c 20 69 6e 74 20 69 43 6f 6c 2c  xpr *, int iCol,
5410: 20 63 68 61 72 20 2a 2a 29 3b 20 0a 69 6e 74 20   char **); .int 
5420: 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 4f 76  sqlite3Fts3MsrOv
5430: 66 6c 28 46 74 73 33 43 75 72 73 6f 72 20 2a 2c  fl(Fts3Cursor *,
5440: 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
5450: 64 65 72 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a 69  der *, int *);.i
5460: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73  nt sqlite3Fts3Ms
5470: 72 49 6e 63 72 52 65 73 74 61 72 74 28 46 74 73  rIncrRestart(Fts
5480: 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
5490: 2a 70 43 73 72 29 3b 0a 0a 2f 2a 20 66 74 73 33  *pCsr);../* fts3
54a0: 5f 75 6e 69 63 6f 64 65 32 2e 63 20 28 66 75 6e  _unicode2.c (fun
54b0: 63 74 69 6f 6e 73 20 67 65 6e 65 72 61 74 65 64  ctions generated
54c0: 20 62 79 20 70 61 72 73 69 6e 67 20 75 6e 69 63   by parsing unic
54d0: 6f 64 65 20 74 65 78 74 20 66 69 6c 65 73 29 20  ode text files) 
54e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
54f0: 5f 45 4e 41 42 4c 45 5f 46 54 53 34 5f 55 4e 49  _ENABLE_FTS4_UNI
5500: 43 4f 44 45 36 31 0a 69 6e 74 20 73 71 6c 69 74  CODE61.int sqlit
5510: 65 33 46 74 73 55 6e 69 63 6f 64 65 46 6f 6c 64  e3FtsUnicodeFold
5520: 28 69 6e 74 2c 20 69 6e 74 29 3b 0a 69 6e 74 20  (int, int);.int 
5530: 73 71 6c 69 74 65 33 46 74 73 55 6e 69 63 6f 64  sqlite3FtsUnicod
5540: 65 49 73 61 6c 6e 75 6d 28 69 6e 74 29 3b 0a 69  eIsalnum(int);.i
5550: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 55 6e 69  nt sqlite3FtsUni
5560: 63 6f 64 65 49 73 64 69 61 63 72 69 74 69 63 28  codeIsdiacritic(
5570: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 65  int);.#endif..#e
5580: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
5590: 43 4f 52 45 20 7c 7c 20 53 51 4c 49 54 45 5f 45  CORE || SQLITE_E
55a0: 4e 41 42 4c 45 5f 46 54 53 33 20 2a 2f 0a 23 65  NABLE_FTS3 */.#e
55b0: 6e 64 69 66 20 2f 2a 20 5f 46 54 53 49 4e 54 5f  ndif /* _FTSINT_
55c0: 48 20 2a 2f 0a                                   H */.