/ Hex Artifact Content
Login

Artifact 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c:


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 20 46 54   1.#endif../* FT
01f0: 53 33 2f 46 54 53 34 20 72 65 71 75 69 72 65 20  S3/FTS4 require 
0200: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a  virtual tables *
0210: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0220: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
0230: 45 0a 23 20 75 6e 64 65 66 20 53 51 4c 49 54 45  E.# undef SQLITE
0240: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 75  _ENABLE_FTS3.# u
0250: 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
0260: 4c 45 5f 46 54 53 34 0a 23 65 6e 64 69 66 0a 0a  LE_FTS4.#endif..
0270: 2f 2a 0a 2a 2a 20 46 54 53 34 20 69 73 20 72 65  /*.** FTS4 is re
0280: 61 6c 6c 79 20 61 6e 20 65 78 74 65 6e 73 69 6f  ally an extensio
0290: 6e 20 66 6f 72 20 46 54 53 33 2e 20 20 49 74 20  n for FTS3.  It 
02a0: 69 73 20 65 6e 61 62 6c 65 64 20 75 73 69 6e 67  is enabled using
02b0: 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 45   the.** SQLITE_E
02c0: 4e 41 42 4c 45 5f 46 54 53 33 20 6d 61 63 72 6f  NABLE_FTS3 macro
02d0: 2e 20 20 42 75 74 20 74 6f 20 61 76 6f 69 64 20  .  But to avoid 
02e0: 63 6f 6e 66 75 73 69 6f 6e 20 77 65 20 61 6c 73  confusion we als
02f0: 6f 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 53 51 4c  o all.** the SQL
0300: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20  ITE_ENABLE_FTS4 
0310: 6d 61 63 72 6f 20 74 6f 20 73 65 72 76 65 20 61  macro to serve a
0320: 73 20 61 6e 20 61 6c 69 73 73 65 20 66 6f 72 20  s an alisse for 
0330: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
0340: 53 33 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  S3..*/.#if defin
0350: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
0360: 5f 46 54 53 34 29 20 26 26 20 21 64 65 66 69 6e  _FTS4) && !defin
0370: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
0380: 5f 46 54 53 33 29 0a 23 20 64 65 66 69 6e 65 20  _FTS3).# define 
0390: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
03a0: 53 33 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  S3.#endif..#if !
03b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
03c0: 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ORE) || defined(
03d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
03e0: 53 33 29 0a 0a 2f 2a 20 49 66 20 6e 6f 74 20 62  S3)../* If not b
03f0: 75 69 6c 64 69 6e 67 20 61 73 20 70 61 72 74 20  uilding as part 
0400: 6f 66 20 74 68 65 20 63 6f 72 65 2c 20 69 6e 63  of the core, inc
0410: 6c 75 64 65 20 73 71 6c 69 74 65 33 65 78 74 2e  lude sqlite3ext.
0420: 68 2e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  h. */.#ifndef SQ
0430: 4c 49 54 45 5f 43 4f 52 45 0a 23 20 69 6e 63 6c  LITE_CORE.# incl
0440: 75 64 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e  ude "sqlite3ext.
0450: 68 22 20 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  h" .SQLITE_EXTEN
0460: 53 49 4f 4e 5f 49 4e 49 54 33 0a 23 65 6e 64 69  SION_INIT3.#endi
0470: 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  f..#include "sql
0480: 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ite3.h".#include
0490: 20 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72   "fts3_tokenizer
04a0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 66 74  .h".#include "ft
04b0: 73 33 5f 68 61 73 68 2e 68 22 0a 0a 2f 2a 0a 2a  s3_hash.h"../*.*
04c0: 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20  * This constant 
04d0: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 6d  determines the m
04e0: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 6f 66 20  aximum depth of 
04f0: 61 6e 20 46 54 53 20 65 78 70 72 65 73 73 69 6f  an FTS expressio
0500: 6e 20 74 72 65 65 0a 2a 2a 20 74 68 61 74 20 74  n tree.** that t
0510: 68 65 20 6c 69 62 72 61 72 79 20 77 69 6c 6c 20  he library will 
0520: 63 72 65 61 74 65 20 61 6e 64 20 75 73 65 2e 20  create and use. 
0530: 46 54 53 20 75 73 65 73 20 72 65 63 75 72 73 69  FTS uses recursi
0540: 6f 6e 20 74 6f 20 70 65 72 66 6f 72 6d 20 0a 2a  on to perform .*
0550: 2a 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61 74  * various operat
0560: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 71 75 65 72  ions on the quer
0570: 79 20 74 72 65 65 2c 20 73 6f 20 74 68 65 20 64  y tree, so the d
0580: 69 73 61 64 76 61 6e 74 61 67 65 20 6f 66 20 61  isadvantage of a
0590: 20 6c 61 72 67 65 0a 2a 2a 20 6c 69 6d 69 74 20   large.** limit 
05a0: 69 73 20 74 68 61 74 20 69 74 20 6d 61 79 20 61  is that it may a
05b0: 6c 6c 6f 77 20 76 65 72 79 20 6c 61 72 67 65 20  llow very large 
05c0: 71 75 65 72 69 65 73 20 74 6f 20 75 73 65 20 6c  queries to use l
05d0: 61 72 67 65 20 61 6d 6f 75 6e 74 73 0a 2a 2a 20  arge amounts.** 
05e0: 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65 20 28  of stack space (
05f0: 70 65 72 68 61 70 73 20 63 61 75 73 69 6e 67 20  perhaps causing 
0600: 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  a stack overflow
0610: 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
0620: 4c 49 54 45 5f 46 54 53 33 5f 4d 41 58 5f 45 58  LITE_FTS3_MAX_EX
0630: 50 52 5f 44 45 50 54 48 0a 23 20 64 65 66 69 6e  PR_DEPTH.# defin
0640: 65 20 53 51 4c 49 54 45 5f 46 54 53 33 5f 4d 41  e SQLITE_FTS3_MA
0650: 58 5f 45 58 50 52 5f 44 45 50 54 48 20 31 32 0a  X_EXPR_DEPTH 12.
0660: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
0670: 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 63 6f 6e  his constant con
0680: 74 72 6f 6c 73 20 68 6f 77 20 6f 66 74 65 6e 20  trols how often 
0690: 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6d 65 72  segments are mer
06a0: 67 65 64 2e 20 4f 6e 63 65 20 74 68 65 72 65 20  ged. Once there 
06b0: 61 72 65 0a 2a 2a 20 46 54 53 33 5f 4d 45 52 47  are.** FTS3_MERG
06c0: 45 5f 43 4f 55 4e 54 20 73 65 67 6d 65 6e 74 73  E_COUNT segments
06d0: 20 6f 66 20 6c 65 76 65 6c 20 4e 2c 20 74 68 65   of level N, the
06e0: 79 20 61 72 65 20 6d 65 72 67 65 64 20 69 6e 74  y are merged int
06f0: 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 73 65  o a single.** se
0700: 67 6d 65 6e 74 20 6f 66 20 6c 65 76 65 6c 20 4e  gment of level N
0710: 2b 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  +1..*/.#define F
0720: 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20  TS3_MERGE_COUNT 
0730: 31 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  16../*.** This i
0740: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
0750: 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 28 69 6e  ount of data (in
0760: 20 62 79 74 65 73 29 20 74 6f 20 73 74 6f 72 65   bytes) to store
0770: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73 33   in the .** Fts3
0780: 54 61 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65 72  Table.pendingTer
0790: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20 4e  ms hash table. N
07a0: 6f 72 6d 61 6c 6c 79 2c 20 74 68 65 20 68 61 73  ormally, the has
07b0: 68 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 70 6f  h table is.** po
07c0: 70 75 6c 61 74 65 64 20 61 73 20 64 6f 63 75 6d  pulated as docum
07d0: 65 6e 74 73 20 61 72 65 20 69 6e 73 65 72 74 65  ents are inserte
07e0: 64 2f 75 70 64 61 74 65 64 2f 64 65 6c 65 74 65  d/updated/delete
07f0: 64 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  d in a transacti
0800: 6f 6e 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 74  on.** and used t
0810: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73  o create a new s
0820: 65 67 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20  egment when the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
0840: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 20 48 6f 77  ommitted..** How
0850: 65 76 65 72 20 69 66 20 74 68 69 73 20 6c 69 6d  ever if this lim
0860: 69 74 20 69 73 20 72 65 61 63 68 65 64 20 6d 69  it is reached mi
0870: 64 77 61 79 20 74 68 72 6f 75 67 68 20 61 20 74  dway through a t
0880: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6e 65  ransaction, a ne
0890: 77 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73  w .** segment is
08a0: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
08b0: 20 68 61 73 68 20 74 61 62 6c 65 20 63 6c 65 61   hash table clea
08c0: 72 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  red immediately.
08d0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 33  .*/.#define FTS3
08e0: 5f 4d 41 58 5f 50 45 4e 44 49 4e 47 5f 44 41 54  _MAX_PENDING_DAT
08f0: 41 20 28 31 2a 31 30 32 34 2a 31 30 32 34 29 0a  A (1*1024*1024).
0900: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 74 6f 20  ./*.** Macro to 
0910: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
0920: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
0930: 20 61 6e 20 61 72 72 61 79 2e 20 53 51 4c 69 74   an array. SQLit
0940: 65 20 68 61 73 20 61 0a 2a 2a 20 73 69 6d 69 6c  e has a.** simil
0950: 61 72 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20  ar macro called 
0960: 41 72 72 61 79 53 69 7a 65 28 29 2e 20 55 73 65  ArraySize(). Use
0970: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d   a different nam
0980: 65 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20  e to avoid.** a 
0990: 63 6f 6c 6c 69 73 69 6f 6e 20 77 68 65 6e 20 62  collision when b
09a0: 75 69 6c 64 69 6e 67 20 61 6e 20 61 6d 61 6c 67  uilding an amalg
09b0: 61 6d 61 74 69 6f 6e 20 77 69 74 68 20 62 75 69  amation with bui
09c0: 6c 74 2d 69 6e 20 46 54 53 33 2e 0a 2a 2f 0a 23  lt-in FTS3..*/.#
09d0: 64 65 66 69 6e 65 20 53 69 7a 65 6f 66 41 72 72  define SizeofArr
09e0: 61 79 28 58 29 20 28 28 69 6e 74 29 28 73 69 7a  ay(X) ((int)(siz
09f0: 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b  eof(X)/sizeof(X[
0a00: 30 5d 29 29 29 0a 0a 0a 23 69 66 6e 64 65 66 20  0])))...#ifndef 
0a10: 4d 49 4e 0a 23 20 64 65 66 69 6e 65 20 4d 49 4e  MIN.# define MIN
0a20: 28 78 2c 79 29 20 28 28 78 29 3c 28 79 29 3f 28  (x,y) ((x)<(y)?(
0a30: 78 29 3a 28 79 29 29 0a 23 65 6e 64 69 66 0a 23  x):(y)).#endif.#
0a40: 69 66 6e 64 65 66 20 4d 41 58 0a 23 20 64 65 66  ifndef MAX.# def
0a50: 69 6e 65 20 4d 41 58 28 78 2c 79 29 20 28 28 78  ine MAX(x,y) ((x
0a60: 29 3e 28 79 29 3f 28 78 29 3a 28 79 29 29 0a 23  )>(y)?(x):(y)).#
0a70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  endif../*.** Max
0a80: 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61  imum length of a
0a90: 20 76 61 72 69 6e 74 20 65 6e 63 6f 64 65 64 20   varint encoded 
0aa0: 69 6e 74 65 67 65 72 2e 20 54 68 65 20 76 61 72  integer. The var
0ab0: 69 6e 74 20 66 6f 72 6d 61 74 20 69 73 20 64 69  int format is di
0ac0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
0ad0: 74 68 61 74 20 75 73 65 64 20 62 79 20 53 51 4c  that used by SQL
0ae0: 69 74 65 2c 20 73 6f 20 74 68 65 20 6d 61 78 69  ite, so the maxi
0af0: 6d 75 6d 20 6c 65 6e 67 74 68 20 69 73 20 31 30  mum length is 10
0b00: 2c 20 6e 6f 74 20 39 2e 0a 2a 2f 0a 23 64 65 66  , not 9..*/.#def
0b10: 69 6e 65 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  ine FTS3_VARINT_
0b20: 4d 41 58 20 31 30 0a 0a 23 64 65 66 69 6e 65 20  MAX 10..#define 
0b30: 46 54 53 33 5f 42 55 46 46 45 52 5f 50 41 44 44  FTS3_BUFFER_PADD
0b40: 49 4e 47 20 38 0a 0a 2f 2a 0a 2a 2a 20 46 54 53  ING 8../*.** FTS
0b50: 34 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  4 virtual tables
0b60: 20 6d 61 79 20 6d 61 69 6e 74 61 69 6e 20 6d 75   may maintain mu
0b70: 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73 20 2d  ltiple indexes -
0b80: 20 6f 6e 65 20 69 6e 64 65 78 20 6f 66 20 61 6c   one index of al
0b90: 6c 20 74 65 72 6d 73 0a 2a 2a 20 69 6e 20 74 68  l terms.** in th
0ba0: 65 20 64 6f 63 75 6d 65 6e 74 20 73 65 74 20 61  e document set a
0bb0: 6e 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  nd zero or more 
0bc0: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 2e 20  prefix indexes. 
0bd0: 41 6c 6c 20 69 6e 64 65 78 65 73 20 61 72 65 20  All indexes are 
0be0: 73 74 6f 72 65 64 0a 2a 2a 20 61 73 20 6f 6e 65  stored.** as one
0bf0: 20 6f 72 20 6d 6f 72 65 20 62 2b 2d 74 72 65 65   or more b+-tree
0c00: 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  s in the %_segme
0c10: 6e 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72  nts and %_segdir
0c20: 20 74 61 62 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20   tables. .**.** 
0c30: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
0c40: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  o determine whic
0c50: 68 20 69 6e 64 65 78 20 61 20 62 2b 2d 74 72 65  h index a b+-tre
0c60: 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 62 61 73  e belongs to bas
0c70: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c  ed on the.** val
0c80: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ue stored in the
0c90: 20 22 25 5f 73 65 67 64 69 72 2e 6c 65 76 65 6c   "%_segdir.level
0ca0: 22 20 63 6f 6c 75 6d 6e 2e 20 47 69 76 65 6e 20  " column. Given 
0cb0: 74 68 69 73 20 76 61 6c 75 65 20 4c 2c 20 74 68  this value L, th
0cc0: 65 20 69 6e 64 65 78 0a 2a 2a 20 74 68 61 74 20  e index.** that 
0cd0: 74 68 65 20 62 2b 2d 74 72 65 65 20 62 65 6c 6f  the b+-tree belo
0ce0: 6e 67 73 20 74 6f 20 69 73 20 28 4c 3c 3c 31 30  ngs to is (L<<10
0cf0: 29 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ). In other word
0d00: 73 2c 20 61 6c 6c 20 62 2b 2d 74 72 65 65 73 20  s, all b+-trees 
0d10: 77 69 74 68 0a 2a 2a 20 6c 65 76 65 6c 20 76 61  with.** level va
0d20: 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61  lues between 0 a
0d30: 6e 64 20 31 30 32 33 20 28 69 6e 63 6c 75 73 69  nd 1023 (inclusi
0d40: 76 65 29 20 62 65 6c 6f 6e 67 20 74 6f 20 69 6e  ve) belong to in
0d50: 64 65 78 20 30 2c 20 61 6c 6c 20 6c 65 76 65 6c  dex 0, all level
0d60: 73 0a 2a 2a 20 62 65 74 77 65 65 6e 20 31 30 32  s.** between 102
0d70: 34 20 61 6e 64 20 32 30 34 37 20 74 6f 20 69 6e  4 and 2047 to in
0d80: 64 65 78 20 31 2c 20 61 6e 64 20 73 6f 20 6f 6e  dex 1, and so on
0d90: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 63 6f  ..**.** It is co
0da0: 6e 73 69 64 65 72 65 64 20 69 6d 70 6f 73 73 69  nsidered impossi
0db0: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ble for an index
0dc0: 20 74 6f 20 75 73 65 20 6d 6f 72 65 20 74 68 61   to use more tha
0dd0: 6e 20 31 30 32 34 20 6c 65 76 65 6c 73 2e 20 49  n 1024 levels. I
0de0: 6e 20 0a 2a 2a 20 74 68 65 6f 72 79 20 74 68 6f  n .** theory tho
0df0: 75 67 68 20 74 68 69 73 20 6d 61 79 20 68 61 70  ugh this may hap
0e00: 70 65 6e 2c 20 62 75 74 20 6f 6e 6c 79 20 61 66  pen, but only af
0e10: 74 65 72 20 61 74 20 6c 65 61 73 74 20 0a 2a 2a  ter at least .**
0e20: 20 28 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55   (FTS3_MERGE_COU
0e30: 4e 54 5e 31 30 32 34 29 20 73 65 70 61 72 61 74  NT^1024) separat
0e40: 65 20 66 6c 75 73 68 65 73 20 6f 66 20 74 68 65  e flushes of the
0e50: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
0e60: 61 62 6c 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ables..*/.#defin
0e70: 65 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  e FTS3_SEGDIR_MA
0e80: 58 4c 45 56 45 4c 20 20 20 20 20 20 31 30 32 34  XLEVEL      1024
0e90: 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 53 45  .#define FTS3_SE
0ea0: 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 5f 53 54  GDIR_MAXLEVEL_ST
0eb0: 52 20 22 31 30 32 34 22 0a 0a 2f 2a 0a 2a 2a 20  R "1024"../*.** 
0ec0: 54 68 65 20 74 65 73 74 63 61 73 65 28 29 20 6d  The testcase() m
0ed0: 61 63 72 6f 20 69 73 20 6f 6e 6c 79 20 75 73 65  acro is only use
0ee0: 64 20 62 79 20 74 68 65 20 61 6d 61 6c 67 61 6d  d by the amalgam
0ef0: 61 74 69 6f 6e 2e 20 20 49 66 20 75 6e 64 65 66  ation.  If undef
0f00: 69 6e 65 64 2c 0a 2a 2a 20 6d 61 6b 65 20 69 74  ined,.** make it
0f10: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66   a no-op..*/.#if
0f20: 6e 64 65 66 20 74 65 73 74 63 61 73 65 0a 23 20  ndef testcase.# 
0f30: 64 65 66 69 6e 65 20 74 65 73 74 63 61 73 65 28  define testcase(
0f40: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
0f50: 20 54 65 72 6d 69 6e 61 74 6f 72 20 76 61 6c 75   Terminator valu
0f60: 65 73 20 66 6f 72 20 70 6f 73 69 74 69 6f 6e 2d  es for position-
0f70: 6c 69 73 74 73 20 61 6e 64 20 63 6f 6c 75 6d 6e  lists and column
0f80: 2d 6c 69 73 74 73 2e 0a 2a 2f 0a 23 64 65 66 69  -lists..*/.#defi
0f90: 6e 65 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20 20 28  ne POS_COLUMN  (
0fa0: 31 29 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  1)     /* Column
0fb0: 2d 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72  -list terminator
0fc0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 4f 53 5f   */.#define POS_
0fd0: 45 4e 44 20 20 20 20 20 28 30 29 20 20 20 20 20  END     (0)     
0fe0: 2f 2a 20 50 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  /* Position-list
0ff0: 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 20 0a   terminator */ .
1000: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 73 73 65 72  ./*.** The asser
1010: 74 5f 66 74 73 33 5f 6e 63 28 29 20 6d 61 63 72  t_fts3_nc() macr
1020: 6f 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  o is similar to 
1030: 74 68 65 20 61 73 73 65 72 74 28 29 20 6d 61 63  the assert() mac
1040: 72 6f 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ro, except that 
1050: 69 74 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f  it.** is used fo
1060: 72 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64 69  r assert() condi
1070: 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 74  tions that are t
1080: 72 75 65 20 6f 6e 6c 79 20 69 66 20 69 74 20 63  rue only if it c
1090: 61 6e 20 62 65 20 0a 2a 2a 20 67 75 72 61 6e 74  an be .** gurant
10a0: 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74  eed that the dat
10b0: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 63 6f 72  abase is not cor
10c0: 72 75 70 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rupt..*/.#if def
10d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
10e0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
10f0: 4c 49 54 45 5f 54 45 53 54 29 0a 65 78 74 65 72  LITE_TEST).exter
1100: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74  n int sqlite3_ft
1110: 73 33 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70  s3_may_be_corrup
1120: 74 3b 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  t;.# define asse
1130: 72 74 5f 66 74 73 33 5f 6e 63 28 78 29 20 61 73  rt_fts3_nc(x) as
1140: 73 65 72 74 28 73 71 6c 69 74 65 33 5f 66 74 73  sert(sqlite3_fts
1150: 33 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  3_may_be_corrupt
1160: 20 7c 7c 20 28 78 29 29 0a 23 65 6c 73 65 0a 23   || (x)).#else.#
1170: 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 5f 66   define assert_f
1180: 74 73 33 5f 6e 63 28 78 29 20 61 73 73 65 72 74  ts3_nc(x) assert
1190: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
11a0: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 70  * This section p
11b0: 72 6f 76 69 64 65 73 20 64 65 66 69 6e 69 74 69  rovides definiti
11c0: 6f 6e 73 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65  ons to allow the
11d0: 0a 2a 2a 20 46 54 53 33 20 65 78 74 65 6e 73 69  .** FTS3 extensi
11e0: 6f 6e 20 74 6f 20 62 65 20 63 6f 6d 70 69 6c 65  on to be compile
11f0: 64 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65  d outside of the
1200: 20 0a 2a 2a 20 61 6d 61 6c 67 61 6d 61 74 69 6f   .** amalgamatio
1210: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
1220: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
1230: 4e 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 69  N./*.** Macros i
1240: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 63  ndicating that c
1250: 6f 6e 64 69 74 69 6f 6e 61 6c 20 65 78 70 72 65  onditional expre
1260: 73 73 69 6f 6e 73 20 61 72 65 20 61 6c 77 61 79  ssions are alway
1270: 73 20 74 72 75 65 20 6f 72 0a 2a 2a 20 66 61 6c  s true or.** fal
1280: 73 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  se..*/.#ifdef SQ
1290: 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
12a0: 53 54 0a 23 20 64 65 66 69 6e 65 20 41 4c 57 41  ST.# define ALWA
12b0: 59 53 28 78 29 20 28 31 29 0a 23 20 64 65 66 69  YS(x) (1).# defi
12c0: 6e 65 20 4e 45 56 45 52 28 58 29 20 20 28 30 29  ne NEVER(X)  (0)
12d0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
12e0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 23 20 64  QLITE_DEBUG).# d
12f0: 65 66 69 6e 65 20 41 4c 57 41 59 53 28 78 29 20  efine ALWAYS(x) 
1300: 73 71 6c 69 74 65 33 46 74 73 33 41 6c 77 61 79  sqlite3Fts3Alway
1310: 73 28 28 78 29 21 3d 30 29 0a 23 20 64 65 66 69  s((x)!=0).# defi
1320: 6e 65 20 4e 45 56 45 52 28 78 29 20 73 71 6c 69  ne NEVER(x) sqli
1330: 74 65 33 46 74 73 33 4e 65 76 65 72 28 28 78 29  te3Fts3Never((x)
1340: 21 3d 30 29 0a 69 6e 74 20 73 71 6c 69 74 65 33  !=0).int sqlite3
1350: 46 74 73 33 41 6c 77 61 79 73 28 69 6e 74 20 62  Fts3Always(int b
1360: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
1370: 73 33 4e 65 76 65 72 28 69 6e 74 20 62 29 3b 0a  s3Never(int b);.
1380: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41  #else.# define A
1390: 4c 57 41 59 53 28 78 29 20 28 78 29 0a 23 20 64  LWAYS(x) (x).# d
13a0: 65 66 69 6e 65 20 4e 45 56 45 52 28 78 29 20 20  efine NEVER(x)  
13b0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
13c0: 2a 20 49 6e 74 65 72 6e 61 6c 20 74 79 70 65 73  * Internal types
13d0: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 2e   used by SQLite.
13e0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 73 69  .*/.typedef unsi
13f0: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 20 20 20  gned char u8;   
1400: 20 20 20 20 20 20 2f 2a 20 31 2d 62 79 74 65 20        /* 1-byte 
1410: 28 6f 72 20 6c 61 72 67 65 72 29 20 75 6e 73 69  (or larger) unsi
1420: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1430: 74 79 70 65 64 65 66 20 73 68 6f 72 74 20 69 6e  typedef short in
1440: 74 20 69 31 36 3b 20 20 20 20 20 20 20 20 20 20  t i16;          
1450: 20 20 2f 2a 20 32 2d 62 79 74 65 20 28 6f 72 20    /* 2-byte (or 
1460: 6c 61 72 67 65 72 29 20 73 69 67 6e 65 64 20 69  larger) signed i
1470: 6e 74 65 67 65 72 20 2a 2f 0a 74 79 70 65 64 65  nteger */.typede
1480: 66 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75  f unsigned int u
1490: 33 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 34  32;         /* 4
14a0: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
14b0: 6e 74 65 67 65 72 20 2a 2f 0a 74 79 70 65 64 65  nteger */.typede
14c0: 66 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34  f sqlite3_uint64
14d0: 20 75 36 34 3b 20 20 20 20 20 20 20 2f 2a 20 38   u64;       /* 8
14e0: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
14f0: 6e 74 65 67 65 72 20 2a 2f 0a 74 79 70 65 64 65  nteger */.typede
1500: 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  f sqlite3_int64 
1510: 69 36 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 38  i64;        /* 8
1520: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1530: 65 67 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  eger */../*.** M
1540: 61 63 72 6f 20 75 73 65 64 20 74 6f 20 73 75 70  acro used to sup
1550: 70 72 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 77  press compiler w
1560: 61 72 6e 69 6e 67 73 20 66 6f 72 20 75 6e 75 73  arnings for unus
1570: 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ed parameters..*
1580: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44  /.#define UNUSED
1590: 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76  _PARAMETER(x) (v
15a0: 6f 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 41  oid)(x)../*.** A
15b0: 63 74 69 76 61 74 65 20 61 73 73 65 72 74 28 29  ctivate assert()
15c0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 49 54 45 5f   only if SQLITE_
15d0: 54 45 53 54 20 69 73 20 65 6e 61 62 6c 65 64 2e  TEST is enabled.
15e0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
15f0: 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
1600: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1610: 47 29 20 0a 23 20 64 65 66 69 6e 65 20 4e 44 45  G) .# define NDE
1620: 42 55 47 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  BUG 1.#endif../*
1630: 0a 2a 2a 20 54 68 65 20 54 45 53 54 4f 4e 4c 59  .** The TESTONLY
1640: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
1650: 6f 20 65 6e 63 6c 6f 73 65 20 76 61 72 69 61 62  o enclose variab
1660: 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20  le declarations 
1670: 6f 72 0a 2a 2a 20 6f 74 68 65 72 20 62 69 74 73  or.** other bits
1680: 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 61 72   of code that ar
1690: 65 20 6e 65 65 64 65 64 20 74 6f 20 73 75 70 70  e needed to supp
16a0: 6f 72 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ort the argument
16b0: 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 65 73 74  s.** within test
16c0: 63 61 73 65 28 29 20 61 6e 64 20 61 73 73 65 72  case() and asser
16d0: 74 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  t() macros..*/.#
16e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
16f0: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1700: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
1710: 41 47 45 5f 54 45 53 54 29 0a 23 20 64 65 66 69  AGE_TEST).# defi
1720: 6e 65 20 54 45 53 54 4f 4e 4c 59 28 58 29 20 20  ne TESTONLY(X)  
1730: 58 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  X.#else.# define
1740: 20 54 45 53 54 4f 4e 4c 59 28 58 29 0a 23 65 6e   TESTONLY(X).#en
1750: 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
1760: 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49  QLITE_AMALGAMATI
1770: 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ON */..#ifdef SQ
1780: 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
1790: 71 6c 69 74 65 33 46 74 73 33 43 6f 72 72 75 70  qlite3Fts3Corrup
17a0: 74 28 76 6f 69 64 29 3b 0a 23 20 64 65 66 69 6e  t(void);.# defin
17b0: 65 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  e FTS_CORRUPT_VT
17c0: 41 42 20 73 71 6c 69 74 65 33 46 74 73 33 43 6f  AB sqlite3Fts3Co
17d0: 72 72 75 70 74 28 29 0a 23 65 6c 73 65 0a 23 20  rrupt().#else.# 
17e0: 64 65 66 69 6e 65 20 46 54 53 5f 43 4f 52 52 55  define FTS_CORRU
17f0: 50 54 5f 56 54 41 42 20 53 51 4c 49 54 45 5f 43  PT_VTAB SQLITE_C
1800: 4f 52 52 55 50 54 5f 56 54 41 42 0a 23 65 6e 64  ORRUPT_VTAB.#end
1810: 69 66 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  if..typedef stru
1820: 63 74 20 46 74 73 33 54 61 62 6c 65 20 46 74 73  ct Fts3Table Fts
1830: 33 54 61 62 6c 65 3b 0a 74 79 70 65 64 65 66 20  3Table;.typedef 
1840: 73 74 72 75 63 74 20 46 74 73 33 43 75 72 73 6f  struct Fts3Curso
1850: 72 20 46 74 73 33 43 75 72 73 6f 72 3b 0a 74 79  r Fts3Cursor;.ty
1860: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
1870: 33 45 78 70 72 20 46 74 73 33 45 78 70 72 3b 0a  3Expr Fts3Expr;.
1880: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
1890: 74 73 33 50 68 72 61 73 65 20 46 74 73 33 50 68  ts3Phrase Fts3Ph
18a0: 72 61 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74  rase;.typedef st
18b0: 72 75 63 74 20 46 74 73 33 50 68 72 61 73 65 54  ruct Fts3PhraseT
18c0: 6f 6b 65 6e 20 46 74 73 33 50 68 72 61 73 65 54  oken Fts3PhraseT
18d0: 6f 6b 65 6e 3b 0a 0a 74 79 70 65 64 65 66 20 73  oken;..typedef s
18e0: 74 72 75 63 74 20 46 74 73 33 44 6f 63 6c 69 73  truct Fts3Doclis
18f0: 74 20 46 74 73 33 44 6f 63 6c 69 73 74 3b 0a 74  t Fts3Doclist;.t
1900: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
1910: 73 33 53 65 67 46 69 6c 74 65 72 20 46 74 73 33  s3SegFilter Fts3
1920: 53 65 67 46 69 6c 74 65 72 3b 0a 74 79 70 65 64  SegFilter;.typed
1930: 65 66 20 73 74 72 75 63 74 20 46 74 73 33 44 65  ef struct Fts3De
1940: 66 65 72 72 65 64 54 6f 6b 65 6e 20 46 74 73 33  ferredToken Fts3
1950: 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 3b 0a 74  DeferredToken;.t
1960: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
1970: 73 33 53 65 67 52 65 61 64 65 72 20 46 74 73 33  s3SegReader Fts3
1980: 53 65 67 52 65 61 64 65 72 3b 0a 74 79 70 65 64  SegReader;.typed
1990: 65 66 20 73 74 72 75 63 74 20 46 74 73 33 4d 75  ef struct Fts3Mu
19a0: 6c 74 69 53 65 67 52 65 61 64 65 72 20 46 74 73  ltiSegReader Fts
19b0: 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 3b  3MultiSegReader;
19c0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
19d0: 20 4d 61 74 63 68 69 6e 66 6f 42 75 66 66 65 72   MatchinfoBuffer
19e0: 20 4d 61 74 63 68 69 6e 66 6f 42 75 66 66 65 72   MatchinfoBuffer
19f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 6f 6e 6e 65  ;../*.** A conne
1a00: 63 74 69 6f 6e 20 74 6f 20 61 20 66 75 6c 6c 74  ction to a fullt
1a10: 65 78 74 20 69 6e 64 65 78 20 69 73 20 61 6e 20  ext index is an 
1a20: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1a30: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72  following.** str
1a40: 75 63 74 75 72 65 2e 20 54 68 65 20 78 43 72 65  ucture. The xCre
1a50: 61 74 65 20 61 6e 64 20 78 43 6f 6e 6e 65 63 74  ate and xConnect
1a60: 20 6d 65 74 68 6f 64 73 20 63 72 65 61 74 65 20   methods create 
1a70: 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  an instance.** o
1a80: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1a90: 20 61 6e 64 20 78 44 65 73 74 72 6f 79 20 61 6e   and xDestroy an
1aa0: 64 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 66 72  d xDisconnect fr
1ab0: 65 65 20 74 68 61 74 20 69 6e 73 74 61 6e 63 65  ee that instance
1ac0: 2e 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 6d  ..** All other m
1ad0: 65 74 68 6f 64 73 20 72 65 63 65 69 76 65 20 61  ethods receive a
1ae0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1af0: 73 74 72 75 63 74 75 72 65 20 61 73 20 6f 6e 65  structure as one
1b00: 20 6f 66 20 74 68 65 69 72 0a 2a 2a 20 61 72 67   of their.** arg
1b10: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63  uments..*/.struc
1b20: 74 20 46 74 73 33 54 61 62 6c 65 20 7b 0a 20 20  t Fts3Table {.  
1b30: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73  sqlite3_vtab bas
1b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b50: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 75 73  /* Base class us
1b60: 65 64 20 62 79 20 53 51 4c 69 74 65 20 63 6f 72  ed by SQLite cor
1b70: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
1b80: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
1b90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1ba0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1bb0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
1bc0: 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
1bd0: 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 69 63 61         /* logica
1be0: 6c 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  l database name 
1bf0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c00: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
1c10: 20 20 20 20 20 2f 2a 20 76 69 72 74 75 61 6c 20       /* virtual 
1c20: 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
1c30: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  int nColumn;    
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6e 61 6d  /* number of nam
1c60: 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 76 69  ed columns in vi
1c70: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
1c80: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 75 6d 6e   char **azColumn
1c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ca0: 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   /* column names
1cb0: 2e 20 20 6d 61 6c 6c 6f 63 65 64 20 2a 2f 0a 20  .  malloced */. 
1cc0: 20 75 38 20 2a 61 62 4e 6f 74 69 6e 64 65 78 65   u8 *abNotindexe
1cd0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ce0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 27 6e 6f   /* True for 'no
1cf0: 74 69 6e 64 65 78 65 64 27 20 63 6f 6c 75 6d 6e  tindexed' column
1d00: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 74  s */.  sqlite3_t
1d10: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e  okenizer *pToken
1d20: 69 7a 65 72 3b 20 20 2f 2a 20 74 6f 6b 65 6e 69  izer;  /* tokeni
1d30: 7a 65 72 20 66 6f 72 20 69 6e 73 65 72 74 73 20  zer for inserts 
1d40: 61 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  and queries */. 
1d50: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54   char *zContentT
1d60: 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bl;             
1d70: 20 2f 2a 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20   /* content=xxx 
1d80: 6f 70 74 69 6f 6e 2c 20 6f 72 20 4e 55 4c 4c 20  option, or NULL 
1d90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 6e 67  */.  char *zLang
1da0: 75 61 67 65 69 64 3b 20 20 20 20 20 20 20 20 20  uageid;         
1db0: 20 20 20 20 20 2f 2a 20 6c 61 6e 67 75 61 67 65       /* language
1dc0: 69 64 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 6f  id=xxx option, o
1dd0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
1de0: 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3b 20  nAutoincrmerge; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1e00: 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
1e10: 62 79 20 27 61 75 74 6f 6d 65 72 67 65 27 20 2a  by 'automerge' *
1e20: 2f 0a 20 20 75 33 32 20 6e 4c 65 61 66 41 64 64  /.  u32 nLeafAdd
1e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e50: 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 61 64 64   leaf blocks add
1e60: 65 64 20 74 68 69 73 20 74 72 61 6e 73 20 2a 2f  ed this trans */
1e70: 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 69 6c  ..  /* Precompil
1e80: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73  ed statements us
1e90: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
1ea0: 65 6e 74 61 74 69 6f 6e 2e 20 45 61 63 68 20 6f  entation. Each o
1eb0: 66 20 74 68 65 73 65 20 0a 20 20 2a 2a 20 73 74  f these .  ** st
1ec0: 61 74 65 6d 65 6e 74 73 20 69 73 20 72 75 6e 20  atements is run 
1ed0: 61 6e 64 20 72 65 73 65 74 20 77 69 74 68 69 6e  and reset within
1ee0: 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61   a single virtua
1ef0: 6c 20 74 61 62 6c 65 20 41 50 49 20 63 61 6c 6c  l table API call
1f00: 2e 20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  . .  */.  sqlite
1f10: 33 5f 73 74 6d 74 20 2a 61 53 74 6d 74 5b 34 30  3_stmt *aStmt[40
1f20: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ];.  sqlite3_stm
1f30: 74 20 2a 70 53 65 65 6b 53 74 6d 74 3b 20 20 20  t *pSeekStmt;   
1f40: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 66 6f       /* Cache fo
1f50: 72 20 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b  r fts3CursorSeek
1f60: 53 74 6d 74 28 29 20 2a 2f 0a 0a 20 20 63 68 61  Stmt() */..  cha
1f70: 72 20 2a 7a 52 65 61 64 45 78 70 72 6c 69 73 74  r *zReadExprlist
1f80: 3b 0a 20 20 63 68 61 72 20 2a 7a 57 72 69 74 65  ;.  char *zWrite
1f90: 45 78 70 72 6c 69 73 74 3b 0a 0a 20 20 69 6e 74  Exprlist;..  int
1fa0: 20 6e 4e 6f 64 65 53 69 7a 65 3b 20 20 20 20 20   nNodeSize;     
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc0: 53 6f 66 74 20 6c 69 6d 69 74 20 66 6f 72 20 6e  Soft limit for n
1fd0: 6f 64 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38  ode size */.  u8
1fe0: 20 62 46 74 73 34 3b 20 20 20 20 20 20 20 20 20   bFts4;         
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2000: 20 54 72 75 65 20 66 6f 72 20 46 54 53 34 2c 20   True for FTS4, 
2010: 66 61 6c 73 65 20 66 6f 72 20 46 54 53 33 20 2a  false for FTS3 *
2020: 2f 0a 20 20 75 38 20 62 48 61 73 53 74 61 74 3b  /.  u8 bHasStat;
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 25      /* True if %
2050: 5f 73 74 61 74 20 74 61 62 6c 65 20 65 78 69 73  _stat table exis
2060: 74 73 20 28 32 3d 3d 75 6e 6b 6e 6f 77 6e 29 20  ts (2==unknown) 
2070: 2a 2f 0a 20 20 75 38 20 62 48 61 73 44 6f 63 73  */.  u8 bHasDocs
2080: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2090: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20a0: 25 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20  %_docsize table 
20b0: 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20 62  exists */.  u8 b
20c0: 44 65 73 63 49 64 78 3b 20 20 20 20 20 20 20 20  DescIdx;        
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20e0: 72 75 65 20 69 66 20 64 6f 63 6c 69 73 74 73 20  rue if doclists 
20f0: 61 72 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f  are in reverse o
2100: 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 62 49 67  rder */.  u8 bIg
2110: 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 3b 20 20  noreSavepoint;  
2120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2130: 65 20 74 6f 20 69 67 6e 6f 72 65 20 78 53 61 76  e to ignore xSav
2140: 65 70 6f 69 6e 74 20 69 6e 76 6f 63 61 74 69 6f  epoint invocatio
2150: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 73  ns */.  int nPgs
2160: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
2170: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2180: 73 69 7a 65 20 66 6f 72 20 68 6f 73 74 20 64 61  size for host da
2190: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
21a0: 20 2a 7a 53 65 67 6d 65 6e 74 73 54 62 6c 3b 20   *zSegmentsTbl; 
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21c0: 61 6d 65 20 6f 66 20 25 5f 73 65 67 6d 65 6e 74  ame of %_segment
21d0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  s table */.  sql
21e0: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 53 65 67 6d  ite3_blob *pSegm
21f0: 65 6e 74 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  ents;        /* 
2200: 42 6c 6f 62 20 68 61 6e 64 6c 65 20 6f 70 65 6e  Blob handle open
2210: 20 6f 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 74   on %_segments t
2220: 61 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 0a 20  able */..  /* . 
2230: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
2240: 67 20 61 72 72 61 79 20 6f 66 20 68 61 73 68 20  g array of hash 
2250: 74 61 62 6c 65 73 20 69 73 20 75 73 65 64 20 74  tables is used t
2260: 6f 20 62 75 66 66 65 72 20 70 65 6e 64 69 6e 67  o buffer pending
2270: 20 69 6e 64 65 78 20 0a 20 20 2a 2a 20 75 70 64   index .  ** upd
2280: 61 74 65 73 20 64 75 72 69 6e 67 20 74 72 61 6e  ates during tran
2290: 73 61 63 74 69 6f 6e 73 2e 20 41 6c 6c 20 70 65  sactions. All pe
22a0: 6e 64 69 6e 67 20 75 70 64 61 74 65 73 20 62 75  nding updates bu
22b0: 66 66 65 72 65 64 20 61 74 20 61 6e 79 20 6f 6e  ffered at any on
22c0: 65 0a 20 20 2a 2a 20 74 69 6d 65 20 6d 75 73 74  e.  ** time must
22d0: 20 73 68 61 72 65 20 61 20 63 6f 6d 6d 6f 6e 20   share a common 
22e0: 6c 61 6e 67 75 61 67 65 2d 69 64 20 28 73 65 65  language-id (see
22f0: 20 74 68 65 20 46 54 53 34 20 6c 61 6e 67 69 64   the FTS4 langid
2300: 3d 20 66 65 61 74 75 72 65 29 2e 0a 20 20 2a 2a  = feature)..  **
2310: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 61 6e   The current lan
2320: 67 75 61 67 65 20 69 64 20 69 73 20 73 74 6f 72  guage id is stor
2330: 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65 20 69  ed in variable i
2340: 50 72 65 76 4c 61 6e 67 69 64 2e 0a 20 20 2a 2a  PrevLangid..  **
2350: 0a 20 20 2a 2a 20 41 20 73 69 6e 67 6c 65 20 46  .  ** A single F
2360: 54 53 34 20 74 61 62 6c 65 20 6d 61 79 20 68 61  TS4 table may ha
2370: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 75 6c 6c  ve multiple full
2380: 2d 74 65 78 74 20 69 6e 64 65 78 65 73 2e 20 46  -text indexes. F
2390: 6f 72 20 65 61 63 68 20 69 6e 64 65 78 0a 20 20  or each index.  
23a0: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  ** there is an e
23b0: 6e 74 72 79 20 69 6e 20 74 68 65 20 61 49 6e 64  ntry in the aInd
23c0: 65 78 5b 5d 20 61 72 72 61 79 2e 20 49 6e 64 65  ex[] array. Inde
23d0: 78 20 30 20 69 73 20 61 6e 20 69 6e 64 65 78 20  x 0 is an index 
23e0: 6f 66 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  of all the.  ** 
23f0: 74 65 72 6d 73 20 74 68 61 74 20 61 70 70 65 61  terms that appea
2400: 72 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  r in the documen
2410: 74 20 73 65 74 2e 20 45 61 63 68 20 73 75 62 73  t set. Each subs
2420: 65 71 75 65 6e 74 20 69 6e 64 65 78 20 69 6e 20  equent index in 
2430: 61 49 6e 64 65 78 5b 5d 0a 20 20 2a 2a 20 69 73  aIndex[].  ** is
2440: 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 70 72 65   an index of pre
2450: 66 69 78 65 73 20 6f 66 20 61 20 73 70 65 63 69  fixes of a speci
2460: 66 69 63 20 6c 65 6e 67 74 68 2e 0a 20 20 2a 2a  fic length..  **
2470: 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 6e  .  ** Variable n
2480: 50 65 6e 64 69 6e 67 44 61 74 61 20 63 6f 6e 74  PendingData cont
2490: 61 69 6e 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ains an estimate
24a0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 6f 6e 73   the memory cons
24b0: 75 6d 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a  umed by the .  *
24c0: 2a 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 73  * pending data s
24d0: 74 72 75 63 74 75 72 65 73 2c 20 69 6e 63 6c 75  tructures, inclu
24e0: 64 69 6e 67 20 68 61 73 68 20 74 61 62 6c 65 20  ding hash table 
24f0: 6f 76 65 72 68 65 61 64 2c 20 62 75 74 20 6e 6f  overhead, but no
2500: 74 20 69 6e 63 6c 75 64 69 6e 67 0a 20 20 2a 2a  t including.  **
2510: 20 6d 61 6c 6c 6f 63 20 6f 76 65 72 68 65 61 64   malloc overhead
2520: 2e 20 20 57 68 65 6e 20 6e 50 65 6e 64 69 6e 67  .  When nPending
2530: 44 61 74 61 20 65 78 63 65 65 64 73 20 6e 4d 61  Data exceeds nMa
2540: 78 50 65 6e 64 69 6e 67 44 61 74 61 2c 20 61 6c  xPendingData, al
2550: 6c 20 68 61 73 68 0a 20 20 2a 2a 20 74 61 62 6c  l hash.  ** tabl
2560: 65 73 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  es are flushed t
2570: 6f 20 64 69 73 6b 2e 20 56 61 72 69 61 62 6c 65  o disk. Variable
2580: 20 69 50 72 65 76 44 6f 63 69 64 20 69 73 20 74   iPrevDocid is t
2590: 68 65 20 64 6f 63 69 64 20 6f 66 20 74 68 65 20  he docid of the 
25a0: 6d 6f 73 74 20 0a 20 20 2a 2a 20 72 65 63 65 6e  most .  ** recen
25b0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 72 65 63  tly inserted rec
25c0: 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ord..  */.  int 
25d0: 6e 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  nIndex;         
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25f0: 69 7a 65 20 6f 66 20 61 49 6e 64 65 78 5b 5d 20  ize of aIndex[] 
2600: 2a 2f 0a 20 20 73 74 72 75 63 74 20 46 74 73 33  */.  struct Fts3
2610: 49 6e 64 65 78 20 7b 0a 20 20 20 20 69 6e 74 20  Index {.    int 
2620: 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  nPrefix;        
2630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
2640: 66 69 78 20 6c 65 6e 67 74 68 20 28 30 20 66 6f  fix length (0 fo
2650: 72 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64  r main terms ind
2660: 65 78 29 20 2a 2f 0a 20 20 20 20 46 74 73 33 48  ex) */.    Fts3H
2670: 61 73 68 20 68 50 65 6e 64 69 6e 67 3b 20 20 20  ash hPending;   
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64           /* Pend
2690: 69 6e 67 20 74 65 72 6d 73 20 74 61 62 6c 65 20  ing terms table 
26a0: 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 20 2a  for this index *
26b0: 2f 0a 20 20 7d 20 2a 61 49 6e 64 65 78 3b 0a 20  /.  } *aIndex;. 
26c0: 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67   int nMaxPending
26d0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
26e0: 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20   /* Max pending 
26f0: 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73  data before flus
2700: 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  h to disk */.  i
2710: 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b  nt nPendingData;
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2730: 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 73 20  * Current bytes 
2740: 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20  of pending data 
2750: 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  */.  sqlite_int6
2760: 34 20 69 50 72 65 76 44 6f 63 69 64 3b 20 20 20  4 iPrevDocid;   
2770: 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66       /* Docid of
2780: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
2790: 6e 73 65 72 74 65 64 20 64 6f 63 75 6d 65 6e 74  nserted document
27a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 72 65 76 4c   */.  int iPrevL
27b0: 61 6e 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  angid;          
27c0: 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 69 64 20        /* Langid 
27d0: 6f 66 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  of recently inse
27e0: 72 74 65 64 20 64 6f 63 75 6d 65 6e 74 20 2a 2f  rted document */
27f0: 0a 20 20 69 6e 74 20 62 50 72 65 76 44 65 6c 65  .  int bPrevDele
2800: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2810: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61     /* True if la
2820: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  st operation was
2830: 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 0a 23 69   a delete */..#i
2840: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2850: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
2860: 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
2870: 47 45 5f 54 45 53 54 29 0a 20 20 2f 2a 20 53 74  GE_TEST).  /* St
2880: 61 74 65 20 76 61 72 69 61 62 6c 65 73 20 75 73  ate variables us
2890: 65 64 20 66 6f 72 20 76 61 6c 69 64 61 74 69 6e  ed for validatin
28a0: 67 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  g that the trans
28b0: 61 63 74 69 6f 6e 20 63 6f 6e 74 72 6f 6c 0a 20  action control. 
28c0: 20 2a 2a 20 6d 65 74 68 6f 64 73 20 6f 66 20 74   ** methods of t
28d0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
28e0: 20 61 72 65 20 63 61 6c 6c 65 64 20 61 74 20 61   are called at a
28f0: 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65 73  ppropriate times
2900: 2e 20 20 54 68 65 73 65 0a 20 20 2a 2a 20 76 61  .  These.  ** va
2910: 6c 75 65 73 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  lues do not cont
2920: 72 69 62 75 74 65 20 74 6f 20 46 54 53 20 66 75  ribute to FTS fu
2930: 6e 63 74 69 6f 6e 61 6c 69 74 79 3b 20 74 68 65  nctionality; the
2940: 79 20 61 72 65 20 75 73 65 64 20 66 6f 72 0a 20  y are used for. 
2950: 20 2a 2a 20 76 65 72 69 66 79 69 6e 67 20 74 68   ** verifying th
2960: 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  e operation of t
2970: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a  he SQLite core..
2980: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 54 72 61    */.  int inTra
2990: 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 2f 2a  nsaction;     /*
29a0: 20 54 72 75 65 20 61 66 74 65 72 20 78 42 65 67   True after xBeg
29b0: 69 6e 20 62 75 74 20 62 65 66 6f 72 65 20 78 43  in but before xC
29c0: 6f 6d 6d 69 74 2f 78 52 6f 6c 6c 62 61 63 6b 20  ommit/xRollback 
29d0: 2a 2f 0a 20 20 69 6e 74 20 6d 78 53 61 76 65 70  */.  int mxSavep
29e0: 6f 69 6e 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  oint;       /* L
29f0: 61 72 67 65 73 74 20 76 61 6c 69 64 20 78 53 61  argest valid xSa
2a00: 76 65 70 6f 69 6e 74 20 69 6e 74 65 67 65 72 20  vepoint integer 
2a10: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  */.#endif..#ifde
2a20: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2a30: 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73 61 62  /* True to disab
2a40: 6c 65 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  le the increment
2a50: 61 6c 20 64 6f 63 6c 69 73 74 20 6f 70 74 69 6d  al doclist optim
2a60: 69 7a 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 73  ization. This is
2a70: 20 63 6f 6e 74 72 6f 6c 65 64 0a 20 20 2a 2a 20   controled.  ** 
2a80: 62 79 20 73 70 65 63 69 61 6c 20 69 6e 73 65 72  by special inser
2a90: 74 20 63 6f 6d 6d 61 6e 64 20 27 74 65 73 74 2d  t command 'test-
2aa0: 6e 6f 2d 69 6e 63 72 2d 64 6f 63 6c 69 73 74 27  no-incr-doclist'
2ab0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 49  .  */.  int bNoI
2ac0: 6e 63 72 44 6f 63 6c 69 73 74 3b 0a 23 65 6e 64  ncrDoclist;.#end
2ad0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  if.};../*.** Whe
2ae0: 6e 20 74 68 65 20 63 6f 72 65 20 77 61 6e 74 73  n the core wants
2af0: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68   to read from th
2b00: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  e virtual table,
2b10: 20 69 74 20 63 72 65 61 74 65 73 20 61 0a 2a 2a   it creates a.**
2b20: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
2b30: 75 72 73 6f 72 20 28 61 6e 20 69 6e 73 74 61 6e  ursor (an instan
2b40: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2b50: 69 6e 67 20 73 74 72 75 63 74 75 72 65 29 20 75  ing structure) u
2b60: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 78 4f 70 65  sing.** the xOpe
2b70: 6e 20 6d 65 74 68 6f 64 2e 20 43 75 72 73 6f 72  n method. Cursor
2b80: 73 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20  s are destroyed 
2b90: 75 73 69 6e 67 20 74 68 65 20 78 43 6c 6f 73 65  using the xClose
2ba0: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 72 75   method..*/.stru
2bb0: 63 74 20 46 74 73 33 43 75 72 73 6f 72 20 7b 0a  ct Fts3Cursor {.
2bc0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
2bd0: 75 72 73 6f 72 20 62 61 73 65 3b 20 20 20 20 20  ursor base;     
2be0: 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20    /* Base class 
2bf0: 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 63  used by SQLite c
2c00: 6f 72 65 20 2a 2f 0a 20 20 69 31 36 20 65 53 65  ore */.  i16 eSe
2c10: 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  arch;           
2c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
2c30: 63 68 20 73 74 72 61 74 65 67 79 20 28 73 65 65  ch strategy (see
2c40: 20 62 65 6c 6f 77 29 20 2a 2f 0a 20 20 75 38 20   below) */.  u8 
2c50: 69 73 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20  isEof;          
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c70: 54 72 75 65 20 69 66 20 61 74 20 45 6e 64 20 4f  True if at End O
2c80: 66 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 75  f Results */.  u
2c90: 38 20 69 73 52 65 71 75 69 72 65 53 65 65 6b 3b  8 isRequireSeek;
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cb0: 2a 20 54 72 75 65 20 69 66 20 6d 75 73 74 20 73  * True if must s
2cc0: 65 65 6b 20 70 53 74 6d 74 20 74 6f 20 25 5f 63  eek pStmt to %_c
2cd0: 6f 6e 74 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20  ontent row */.  
2ce0: 75 38 20 62 53 65 65 6b 53 74 6d 74 3b 20 20 20  u8 bSeekStmt;   
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 2f 2a 20 54 72 75 65 20 69 66 20 70 53 74 6d 74  /* True if pStmt
2d10: 20 69 73 20 61 20 73 65 65 6b 20 2a 2f 0a 20 20   is a seek */.  
2d20: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2d30: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2d40: 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  /* Prepared stat
2d50: 65 6d 65 6e 74 20 69 6e 20 75 73 65 20 62 79 20  ement in use by 
2d60: 74 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  the cursor */.  
2d70: 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 3b  Fts3Expr *pExpr;
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 2f 2a 20 50 61 72 73 65 64 20 4d 41 54 43 48 20  /* Parsed MATCH 
2da0: 71 75 65 72 79 20 73 74 72 69 6e 67 20 2a 2f 0a  query string */.
2db0: 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 3b 20 20    int iLangid;  
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 62 65    /* Language be
2de0: 69 6e 67 20 71 75 65 72 69 65 64 20 66 6f 72 20  ing queried for 
2df0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65  */.  int nPhrase
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e20: 66 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61  f matchable phra
2e30: 73 65 73 20 69 6e 20 71 75 65 72 79 20 2a 2f 0a  ses in query */.
2e40: 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f    Fts3DeferredTo
2e50: 6b 65 6e 20 2a 70 44 65 66 65 72 72 65 64 3b 20  ken *pDeferred; 
2e60: 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
2e70: 61 72 63 68 20 74 6f 6b 65 6e 73 2c 20 69 66 20  arch tokens, if 
2e80: 61 6e 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  any */.  sqlite3
2e90: 5f 69 6e 74 36 34 20 69 50 72 65 76 49 64 3b 20  _int64 iPrevId; 
2ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
2eb0: 69 6f 75 73 20 69 64 20 72 65 61 64 20 66 72 6f  ious id read fro
2ec0: 6d 20 61 44 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  m aDoclist */.  
2ed0: 63 68 61 72 20 2a 70 4e 65 78 74 49 64 3b 20 20  char *pNextId;  
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 2f 2a 20 50 6f 69 6e 74 65 72 20 69 6e 74 6f 20  /* Pointer into 
2f00: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 44 6f 63  the body of aDoc
2f10: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
2f20: 61 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  aDoclist;       
2f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
2f40: 74 20 6f 66 20 64 6f 63 69 64 73 20 66 6f 72 20  t of docids for 
2f50: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65  full-text querie
2f60: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c  s */.  int nDocl
2f70: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
2f80: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2f90: 66 20 62 75 66 66 65 72 20 61 74 20 61 44 6f 63  f buffer at aDoc
2fa0: 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62 44 65  list */.  u8 bDe
2fb0: 73 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sc;             
2fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2fd0: 65 20 74 6f 20 73 6f 72 74 20 69 6e 20 64 65 73  e to sort in des
2fe0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
2ff0: 0a 20 20 69 6e 74 20 65 45 76 61 6c 6d 6f 64 65  .  int eEvalmode
3000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3010: 20 20 20 2f 2a 20 41 6e 20 46 54 53 33 5f 45 56     /* An FTS3_EV
3020: 41 4c 5f 58 58 20 63 6f 6e 73 74 61 6e 74 20 2a  AL_XX constant *
3030: 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 41 76 67 3b  /.  int nRowAvg;
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 20 20 20 2f 2a 20 41 76 65 72 61 67 65 20 73      /* Average s
3060: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
3070: 72 6f 77 73 2c 20 69 6e 20 70 61 67 65 73 20 2a  rows, in pages *
3080: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
3090: 34 20 6e 44 6f 63 3b 20 20 20 20 20 20 20 20 20  4 nDoc;         
30a0: 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 73      /* Documents
30b0: 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69   in table */.  i
30c0: 36 34 20 69 4d 69 6e 44 6f 63 69 64 3b 20 20 20  64 iMinDocid;   
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30e0: 2a 20 4d 69 6e 69 6d 75 6d 20 64 6f 63 69 64 20  * Minimum docid 
30f0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
3100: 36 34 20 69 4d 61 78 44 6f 63 69 64 3b 20 20 20  64 iMaxDocid;   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3120: 2a 20 4d 61 78 69 6d 75 6d 20 64 6f 63 69 64 20  * Maximum docid 
3130: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
3140: 6e 74 20 69 73 4d 61 74 63 68 69 6e 66 6f 4e 65  nt isMatchinfoNe
3150: 65 64 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  eded;          /
3160: 2a 20 54 72 75 65 20 77 68 65 6e 20 61 4d 61 74  * True when aMat
3170: 63 68 69 6e 66 6f 5b 5d 20 6e 65 65 64 73 20 66  chinfo[] needs f
3180: 69 6c 6c 69 6e 67 20 69 6e 20 2a 2f 0a 20 20 4d  illing in */.  M
3190: 61 74 63 68 69 6e 66 6f 42 75 66 66 65 72 20 2a  atchinfoBuffer *
31a0: 70 4d 49 42 75 66 66 65 72 3b 20 20 20 20 20 2f  pMIBuffer;     /
31b0: 2a 20 42 75 66 66 65 72 20 66 6f 72 20 6d 61 74  * Buffer for mat
31c0: 63 68 69 6e 66 6f 20 64 61 74 61 20 2a 2f 0a 7d  chinfo data */.}
31d0: 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f  ;..#define FTS3_
31e0: 45 56 41 4c 5f 46 49 4c 54 45 52 20 20 20 20 30  EVAL_FILTER    0
31f0: 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 45 56  .#define FTS3_EV
3200: 41 4c 5f 4e 45 58 54 20 20 20 20 20 20 31 0a 23  AL_NEXT      1.#
3210: 64 65 66 69 6e 65 20 46 54 53 33 5f 45 56 41 4c  define FTS3_EVAL
3220: 5f 4d 41 54 43 48 49 4e 46 4f 20 32 0a 0a 2f 2a  _MATCHINFO 2../*
3230: 0a 2a 2a 20 54 68 65 20 46 74 73 33 43 75 72 73  .** The Fts3Curs
3240: 6f 72 2e 65 53 65 61 72 63 68 20 6d 65 6d 62 65  or.eSearch membe
3250: 72 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  r is always set 
3260: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  to one of the fo
3270: 6c 6c 6f 77 69 6e 67 2e 0a 2a 2a 20 41 63 74 75  llowing..** Actu
3280: 61 6c 79 2c 20 46 74 73 33 43 75 72 73 6f 72 2e  aly, Fts3Cursor.
3290: 65 53 65 61 72 63 68 20 63 61 6e 20 62 65 20 67  eSearch can be g
32a0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
32b0: 71 75 61 6c 20 74 6f 0a 2a 2a 20 46 54 53 33 5f  qual to.** FTS3_
32c0: 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 2e  FULLTEXT_SEARCH.
32d0: 20 20 49 66 20 73 6f 2c 20 74 68 65 6e 20 46 74    If so, then Ft
32e0: 73 33 43 75 72 73 6f 72 2e 65 53 65 61 72 63 68  s3Cursor.eSearch
32f0: 20 2d 20 32 20 69 73 20 74 68 65 20 69 6e 64 65   - 2 is the inde
3300: 78 0a 2a 2a 20 6f 66 20 74 68 65 20 63 6f 6c 75  x.** of the colu
3310: 6d 6e 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  mn to be searche
3320: 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  d.  For example,
3330: 20 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52   in.**.**     CR
3340: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
3350: 4c 45 20 65 78 31 20 55 53 49 4e 47 20 66 74 73  LE ex1 USING fts
3360: 33 28 61 2c 62 2c 63 2c 64 29 3b 0a 2a 2a 20 20  3(a,b,c,d);.**  
3370: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20     SELECT docid 
3380: 46 52 4f 4d 20 65 78 31 20 57 48 45 52 45 20 62  FROM ex1 WHERE b
3390: 20 4d 41 54 43 48 20 27 6f 6e 65 20 74 77 6f 20   MATCH 'one two 
33a0: 74 68 72 65 65 27 3b 0a 2a 2a 20 0a 2a 2a 20 42  three';.** .** B
33b0: 65 63 61 75 73 65 20 74 68 65 20 4c 48 53 20 6f  ecause the LHS o
33c0: 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
33d0: 61 74 6f 72 20 69 73 20 32 6e 64 20 63 6f 6c 75  ator is 2nd colu
33e0: 6d 6e 20 22 62 22 2c 0a 2a 2a 20 46 74 73 33 43  mn "b",.** Fts3C
33f0: 75 72 73 6f 72 2e 65 53 65 61 72 63 68 20 77 69  ursor.eSearch wi
3400: 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 46 54 53  ll be set to FTS
3410: 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43  3_FULLTEXT_SEARC
3420: 48 2b 31 2e 20 20 28 2b 30 20 66 6f 72 20 61 2c  H+1.  (+0 for a,
3430: 0a 2a 2a 20 2b 31 20 66 6f 72 20 62 2c 20 2b 32  .** +1 for b, +2
3440: 20 66 6f 72 20 63 2c 20 2b 33 20 66 6f 72 20 64   for c, +3 for d
3450: 2e 29 20 20 49 66 20 74 68 65 20 4c 48 53 20 6f  .)  If the LHS o
3460: 66 20 4d 41 54 43 48 20 77 65 72 65 20 22 65 78  f MATCH were "ex
3470: 31 22 20 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  1" .** indicatin
3480: 67 20 74 68 61 74 20 61 6c 6c 20 63 6f 6c 75 6d  g that all colum
3490: 6e 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 61  ns should be sea
34a0: 72 63 68 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 65  rched,.** then e
34b0: 53 65 61 72 63 68 20 77 6f 75 6c 64 20 62 65 20  Search would be 
34c0: 73 65 74 20 74 6f 20 46 54 53 33 5f 46 55 4c 4c  set to FTS3_FULL
34d0: 54 45 58 54 5f 53 45 41 52 43 48 2b 34 2e 0a 2a  TEXT_SEARCH+4..*
34e0: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 46  /.#define FTS3_F
34f0: 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 30  ULLSCAN_SEARCH 0
3500: 20 20 20 20 2f 2a 20 4c 69 6e 65 61 72 20 73 63      /* Linear sc
3510: 61 6e 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74 20  an of %_content 
3520: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
3530: 20 46 54 53 33 5f 44 4f 43 49 44 5f 53 45 41 52   FTS3_DOCID_SEAR
3540: 43 48 20 20 20 20 31 20 20 20 20 2f 2a 20 4c 6f  CH    1    /* Lo
3550: 6f 6b 75 70 20 62 79 20 72 6f 77 69 64 20 6f 6e  okup by rowid on
3560: 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
3570: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 33   */.#define FTS3
3580: 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48  _FULLTEXT_SEARCH
3590: 20 32 20 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65   2    /* Full-te
35a0: 78 74 20 69 6e 64 65 78 20 73 65 61 72 63 68 20  xt index search 
35b0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f  */../*.** The lo
35c0: 77 65 72 20 31 36 2d 62 69 74 73 20 6f 66 20 74  wer 16-bits of t
35d0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
35e0: 5f 69 6e 66 6f 2e 69 64 78 4e 75 6d 20 76 61 6c  _info.idxNum val
35f0: 75 65 20 73 65 74 20 62 79 0a 2a 2a 20 74 68 65  ue set by.** the
3600: 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65   xBestIndex() me
3610: 74 68 6f 64 20 63 6f 6e 74 61 69 6e 73 20 74 68  thod contains th
3620: 65 20 46 74 73 33 43 75 72 73 6f 72 2e 65 53 65  e Fts3Cursor.eSe
3630: 61 72 63 68 20 76 61 6c 75 65 20 64 65 73 63 72  arch value descr
3640: 69 62 65 64 0a 2a 2a 20 61 62 6f 76 65 2e 20 54  ibed.** above. T
3650: 68 65 20 75 70 70 65 72 20 31 36 2d 62 69 74 73  he upper 16-bits
3660: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 62 69   contain a combi
3670: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  nation of the fo
3680: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 62 69 74 73 2c  llowing.** bits,
3690: 20 75 73 65 64 20 74 6f 20 64 65 73 63 72 69 62   used to describ
36a0: 65 20 65 78 74 72 61 20 63 6f 6e 73 74 72 61 69  e extra constrai
36b0: 6e 74 73 20 6f 6e 20 66 75 6c 6c 2d 74 65 78 74  nts on full-text
36c0: 20 73 65 61 72 63 68 65 73 2e 0a 2a 2f 0a 23 64   searches..*/.#d
36d0: 65 66 69 6e 65 20 46 54 53 33 5f 48 41 56 45 5f  efine FTS3_HAVE_
36e0: 4c 41 4e 47 49 44 20 20 20 20 30 78 30 30 30 31  LANGID    0x0001
36f0: 30 30 30 30 20 20 20 20 20 20 2f 2a 20 6c 61 6e  0000      /* lan
3700: 67 75 61 67 65 69 64 3d 3f 20 2a 2f 0a 23 64 65  guageid=? */.#de
3710: 66 69 6e 65 20 46 54 53 33 5f 48 41 56 45 5f 44  fine FTS3_HAVE_D
3720: 4f 43 49 44 5f 47 45 20 20 30 78 30 30 30 32 30  OCID_GE  0x00020
3730: 30 30 30 20 20 20 20 20 20 2f 2a 20 64 6f 63 69  000      /* doci
3740: 64 3e 3d 3f 20 2a 2f 0a 23 64 65 66 69 6e 65 20  d>=? */.#define 
3750: 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49 44 5f  FTS3_HAVE_DOCID_
3760: 4c 45 20 20 30 78 30 30 30 34 30 30 30 30 20 20  LE  0x00040000  
3770: 20 20 20 20 2f 2a 20 64 6f 63 69 64 3c 3d 3f 20      /* docid<=? 
3780: 2a 2f 0a 0a 73 74 72 75 63 74 20 46 74 73 33 44  */..struct Fts3D
3790: 6f 63 6c 69 73 74 20 7b 0a 20 20 63 68 61 72 20  oclist {.  char 
37a0: 2a 61 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *aAll;          
37b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
37c0: 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f  ay containing do
37d0: 63 6c 69 73 74 20 28 6f 72 20 4e 55 4c 4c 29 20  clist (or NULL) 
37e0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 3b 20 20  */.  int nAll;  
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
3810: 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  [] in bytes */. 
3820: 20 63 68 61 72 20 2a 70 4e 65 78 74 44 6f 63 69   char *pNextDoci
3830: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3840: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
3850: 78 74 20 64 6f 63 69 64 20 2a 2f 0a 0a 20 20 73  xt docid */..  s
3860: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
3870: 63 69 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  cid;          /*
3880: 20 43 75 72 72 65 6e 74 20 64 6f 63 69 64 20 28   Current docid (
3890: 69 66 20 70 4c 69 73 74 21 3d 30 29 20 2a 2f 0a  if pList!=0) */.
38a0: 20 20 69 6e 74 20 62 46 72 65 65 4c 69 73 74 3b    int bFreeList;
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 70 4c 69 73   /* True if pLis
38d0: 74 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  t should be sqli
38e0: 74 65 33 5f 66 72 65 65 28 29 64 20 2a 2f 0a 20  te3_free()d */. 
38f0: 20 63 68 61 72 20 2a 70 4c 69 73 74 3b 20 20 20   char *pList;   
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3910: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f  /* Pointer to po
3920: 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 6c 6c  sition list foll
3930: 6f 77 69 6e 67 20 69 44 6f 63 69 64 20 2a 2f 0a  owing iDocid */.
3940: 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20    int nList;    
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 70 6f   /* Length of po
3970: 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 7d  sition list */.}
3980: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 70 68 72 61  ;../*.** A "phra
3990: 73 65 22 20 69 73 20 61 20 73 65 71 75 65 6e 63  se" is a sequenc
39a0: 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  e of one or more
39b0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 6d 75 73   tokens that mus
39c0: 74 20 6d 61 74 63 68 20 69 6e 0a 2a 2a 20 73 65  t match in.** se
39d0: 71 75 65 6e 63 65 2e 20 20 41 20 73 69 6e 67 6c  quence.  A singl
39e0: 65 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 62  e token is the b
39f0: 61 73 65 20 63 61 73 65 20 61 6e 64 20 74 68 65  ase case and the
3a00: 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 63 61 73   most common cas
3a10: 65 2e 0a 2a 2a 20 46 6f 72 20 61 20 73 65 71 75  e..** For a sequ
3a20: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 63  ence of tokens c
3a30: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 64 6f 75 62  ontained in doub
3a40: 6c 65 2d 71 75 6f 74 65 73 20 28 69 2e 65 2e 20  le-quotes (i.e. 
3a50: 22 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 22 29  "one two three")
3a60: 0a 2a 2a 20 6e 54 6f 6b 65 6e 20 77 69 6c 6c 20  .** nToken will 
3a70: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
3a80: 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 73   tokens in the s
3a90: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75 63 74  tring..*/.struct
3aa0: 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e   Fts3PhraseToken
3ab0: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20   {.  char *z;   
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ad0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
3ae0: 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69  the token */.  i
3af0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
3b20: 73 20 69 6e 20 62 75 66 66 65 72 20 7a 20 2a 2f  s in buffer z */
3b30: 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 3b  .  int isPrefix;
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 6f     /* True if to
3b60: 6b 65 6e 20 65 6e 64 73 20 77 69 74 68 20 61 20  ken ends with a 
3b70: 22 2a 22 20 63 68 61 72 61 63 74 65 72 20 2a 2f  "*" character */
3b80: 0a 20 20 69 6e 74 20 62 46 69 72 73 74 3b 20 20  .  int bFirst;  
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 6f     /* True if to
3bb0: 6b 65 6e 20 6d 75 73 74 20 61 70 70 65 61 72 20  ken must appear 
3bc0: 61 74 20 70 6f 73 69 74 69 6f 6e 20 30 20 2a 2f  at position 0 */
3bd0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
3be0: 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e   above this poin
3bf0: 74 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  t are populated 
3c00: 77 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  when the express
3c10: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70 61 72 73  ion is.  ** pars
3c20: 65 64 20 28 62 79 20 63 6f 64 65 20 69 6e 20 66  ed (by code in f
3c30: 74 73 33 5f 65 78 70 72 2e 63 29 2e 20 42 65 6c  ts3_expr.c). Bel
3c40: 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  ow this point th
3c50: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 0a  e variables are.
3c60: 20 20 2a 2a 20 75 73 65 64 20 77 68 65 6e 20 65    ** used when e
3c70: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 65 78  valuating the ex
3c80: 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 46  pression. */.  F
3c90: 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
3ca0: 20 2a 70 44 65 66 65 72 72 65 64 3b 20 20 20 2f   *pDeferred;   /
3cb0: 2a 20 44 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  * Deferred token
3cc0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 69 73   object for this
3cd0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 46 74 73 33   token */.  Fts3
3ce0: 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
3cf0: 70 53 65 67 63 73 72 3b 20 20 20 20 2f 2a 20 53  pSegcsr;    /* S
3d00: 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 20 66 6f  egment-reader fo
3d10: 72 20 74 68 69 73 20 74 6f 6b 65 6e 20 2a 2f 0a  r this token */.
3d20: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 33 50  };..struct Fts3P
3d30: 68 72 61 73 65 20 7b 0a 20 20 2f 2a 20 43 61 63  hrase {.  /* Cac
3d40: 68 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 66 6f  he of doclist fo
3d50: 72 20 74 68 69 73 20 70 68 72 61 73 65 2e 20 2a  r this phrase. *
3d60: 2f 0a 20 20 46 74 73 33 44 6f 63 6c 69 73 74 20  /.  Fts3Doclist 
3d70: 64 6f 63 6c 69 73 74 3b 0a 20 20 69 6e 74 20 62  doclist;.  int b
3d80: 49 6e 63 72 3b 20 20 20 20 20 20 20 20 20 20 20  Incr;           
3d90: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3da0: 20 64 6f 63 6c 69 73 74 20 69 73 20 6c 6f 61 64   doclist is load
3db0: 65 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79  ed incrementally
3dc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 6f 63 6c 69   */.  int iDocli
3dd0: 73 74 54 6f 6b 65 6e 3b 0a 0a 20 20 2f 2a 20 55  stToken;..  /* U
3de0: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 74  sed by sqlite3Ft
3df0: 73 33 45 76 61 6c 50 68 72 61 73 65 50 6f 73 6c  s3EvalPhrasePosl
3e00: 69 73 74 28 29 20 69 66 20 74 68 69 73 20 69 73  ist() if this is
3e10: 20 61 20 64 65 73 63 65 6e 64 65 6e 74 20 6f 66   a descendent of
3e20: 20 61 6e 0a 20 20 2a 2a 20 4f 52 20 63 6f 6e 64   an.  ** OR cond
3e30: 69 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 63 68 61  ition.  */.  cha
3e40: 72 20 2a 70 4f 72 50 6f 73 6c 69 73 74 3b 0a 20  r *pOrPoslist;. 
3e50: 20 69 36 34 20 69 4f 72 44 6f 63 69 64 3b 0a 0a   i64 iOrDocid;..
3e60: 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 62    /* Variables b
3e70: 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20  elow this point 
3e80: 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62 79  are populated by
3e90: 20 66 74 73 33 5f 65 78 70 72 2e 63 20 77 68 65   fts3_expr.c whe
3ea0: 6e 20 70 61 72 73 69 6e 67 20 0a 20 20 2a 2a 20  n parsing .  ** 
3eb0: 61 20 4d 41 54 43 48 20 65 78 70 72 65 73 73 69  a MATCH expressi
3ec0: 6f 6e 2e 20 45 76 65 72 79 74 68 69 6e 67 20 61  on. Everything a
3ed0: 62 6f 76 65 20 69 73 20 70 61 72 74 20 6f 66 20  bove is part of 
3ee0: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 70  the evaluation p
3ef0: 68 61 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 6e  hase. .  */.  in
3f00: 74 20 6e 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20  t nToken;       
3f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3f20: 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20  er of tokens in 
3f30: 74 68 65 20 70 68 72 61 73 65 20 2a 2f 0a 20 20  the phrase */.  
3f40: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
3f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
3f60: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 74 68  dex of column th
3f70: 69 73 20 70 68 72 61 73 65 20 6d 75 73 74 20 6d  is phrase must m
3f80: 61 74 63 68 20 2a 2f 0a 20 20 46 74 73 33 50 68  atch */.  Fts3Ph
3f90: 72 61 73 65 54 6f 6b 65 6e 20 61 54 6f 6b 65 6e  raseToken aToken
3fa0: 5b 31 5d 3b 20 2f 2a 20 4f 6e 65 20 65 6e 74 72  [1]; /* One entr
3fb0: 79 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e  y for each token
3fc0: 20 69 6e 20 74 68 65 20 70 68 72 61 73 65 20 2a   in the phrase *
3fd0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 72  /.};../*.** A tr
3fe0: 65 65 20 6f 66 20 74 68 65 73 65 20 6f 62 6a 65  ee of these obje
3ff0: 63 74 73 20 66 6f 72 6d 73 20 74 68 65 20 52 48  cts forms the RH
4000: 53 20 6f 66 20 61 20 4d 41 54 43 48 20 6f 70 65  S of a MATCH ope
4010: 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
4020: 46 74 73 33 45 78 70 72 2e 65 54 79 70 65 20 69  Fts3Expr.eType i
4030: 73 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  s FTSQUERY_PHRAS
4040: 45 20 61 6e 64 20 69 73 4c 6f 61 64 65 64 20 69  E and isLoaded i
4050: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 44 6f  s true, then aDo
4060: 63 6c 69 73 74 20 0a 2a 2a 20 70 6f 69 6e 74 73  clist .** points
4070: 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62   to a malloced b
4080: 75 66 66 65 72 2c 20 73 69 7a 65 20 6e 44 6f 63  uffer, size nDoc
4090: 6c 69 73 74 20 62 79 74 65 73 2c 20 63 6f 6e 74  list bytes, cont
40a0: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  aining the resul
40b0: 74 73 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 70  ts .** of this p
40c0: 68 72 61 73 65 20 71 75 65 72 79 20 69 6e 20 46  hrase query in F
40d0: 54 53 33 20 64 6f 63 6c 69 73 74 20 66 6f 72 6d  TS3 doclist form
40e0: 61 74 2e 20 41 73 20 75 73 75 61 6c 2c 20 74 68  at. As usual, th
40f0: 65 20 69 6e 69 74 69 61 6c 20 0a 2a 2a 20 22 4c  e initial .** "L
4100: 65 6e 67 74 68 22 20 66 69 65 6c 64 20 66 6f 75  ength" field fou
4110: 6e 64 20 69 6e 20 64 6f 63 6c 69 73 74 73 20 73  nd in doclists s
4120: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 69 73  tored on disk is
4130: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
4140: 69 73 20 0a 2a 2a 20 62 75 66 66 65 72 2e 0a 2a  is .** buffer..*
4150: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 61 4d  *.** Variable aM
4160: 49 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66  I is used only f
4170: 6f 72 20 46 54 53 51 55 45 52 59 5f 4e 45 41 52  or FTSQUERY_NEAR
4180: 20 6e 6f 64 65 73 20 74 6f 20 73 74 6f 72 65 20   nodes to store 
4190: 74 68 65 20 67 6c 6f 62 61 6c 0a 2a 2a 20 6d 61  the global.** ma
41a0: 74 63 68 69 6e 66 6f 20 64 61 74 61 2e 20 49 66  tchinfo data. If
41b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
41c0: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
41d0: 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e   array of size n
41e0: 43 6f 6c 2a 33 2c 0a 2a 2a 20 77 68 65 72 65 20  Col*3,.** where 
41f0: 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62  nCol is the numb
4200: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
4210: 20 74 68 65 20 71 75 65 72 69 65 64 20 46 54 53   the queried FTS
4220: 20 74 61 62 6c 65 2e 20 54 68 65 20 61 72 72 61   table. The arra
4230: 79 0a 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65  y.** is populate
4240: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
4250: 0a 2a 2a 20 20 20 61 4d 49 5b 69 43 6f 6c 2a 33  .**   aMI[iCol*3
4260: 20 2b 20 30 5d 20 3d 20 55 6e 64 65 66 69 6e 65   + 0] = Undefine
4270: 64 0a 2a 2a 20 20 20 61 4d 49 5b 69 43 6f 6c 2a  d.**   aMI[iCol*
4280: 33 20 2b 20 31 5d 20 3d 20 4e 75 6d 62 65 72 20  3 + 1] = Number 
4290: 6f 66 20 6f 63 63 75 72 72 65 6e 63 65 73 0a 2a  of occurrences.*
42a0: 2a 20 20 20 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b  *   aMI[iCol*3 +
42b0: 20 32 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66 20   2] = Number of 
42c0: 72 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rows containing 
42d0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73  at least one ins
42e0: 74 61 6e 63 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tance.**.** The 
42f0: 61 4d 49 20 61 72 72 61 79 20 69 73 20 61 6c 6c  aMI array is all
4300: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
4310: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49  ite3_malloc(). I
4320: 74 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  t should be free
4330: 64 20 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 65  d .** when the e
4340: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 69  xpression node i
4350: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
4360: 33 45 78 70 72 20 7b 0a 20 20 69 6e 74 20 65 54  3Expr {.  int eT
4370: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
4380: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
4390: 68 65 20 46 54 53 51 55 45 52 59 5f 58 58 58 20  he FTSQUERY_XXX 
43a0: 76 61 6c 75 65 73 20 64 65 66 69 6e 65 64 20 62  values defined b
43b0: 65 6c 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  elow */.  int nN
43c0: 65 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ear;            
43d0: 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 69 66       /* Valid if
43e0: 20 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59   eType==FTSQUERY
43f0: 5f 4e 45 41 52 20 2a 2f 0a 20 20 46 74 73 33 45  _NEAR */.  Fts3E
4400: 78 70 72 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  xpr *pParent;   
4410: 20 20 20 20 20 20 2f 2a 20 70 50 61 72 65 6e 74        /* pParent
4420: 2d 3e 70 4c 65 66 74 3d 3d 74 68 69 73 20 6f 72  ->pLeft==this or
4430: 20 70 50 61 72 65 6e 74 2d 3e 70 52 69 67 68 74   pParent->pRight
4440: 3d 3d 74 68 69 73 20 2a 2f 0a 20 20 46 74 73 33  ==this */.  Fts3
4450: 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
4460: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
4470: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 46 74 73 33  perand */.  Fts3
4480: 45 78 70 72 20 2a 70 52 69 67 68 74 3b 20 20 20  Expr *pRight;   
4490: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
44a0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 46 74 73  operand */.  Fts
44b0: 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  3Phrase *pPhrase
44c0: 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64  ;       /* Valid
44d0: 20 69 66 20 65 54 79 70 65 3d 3d 46 54 53 51 55   if eType==FTSQU
44e0: 45 52 59 5f 50 48 52 41 53 45 20 2a 2f 0a 0a 20  ERY_PHRASE */.. 
44f0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
4500: 67 20 61 72 65 20 75 73 65 64 20 62 79 20 74 68  g are used by th
4510: 65 20 66 74 73 33 5f 65 76 61 6c 2e 63 20 6d 6f  e fts3_eval.c mo
4520: 64 75 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  dule. */.  sqlit
4530: 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b  e3_int64 iDocid;
4540: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4550: 20 64 6f 63 69 64 20 2a 2f 0a 20 20 75 38 20 62   docid */.  u8 b
4560: 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Eof;            
4570: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
4580: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
4590: 73 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64 79  s at EOF already
45a0: 20 2a 2f 0a 20 20 75 38 20 62 53 74 61 72 74 3b   */.  u8 bStart;
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 44 6f 63   /* True if iDoc
45d0: 69 64 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  id is valid */. 
45e0: 20 75 38 20 62 44 65 66 65 72 72 65 64 3b 20 20   u8 bDeferred;  
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4600: 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72  rue if this expr
4610: 65 73 73 69 6f 6e 20 69 73 20 65 6e 74 69 72 65  ession is entire
4620: 6c 79 20 64 65 66 65 72 72 65 64 20 2a 2f 0a 0a  ly deferred */..
4630: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
4640: 6e 67 20 61 72 65 20 75 73 65 64 20 62 79 20 74  ng are used by t
4650: 68 65 20 66 74 73 33 5f 73 6e 69 70 70 65 74 2e  he fts3_snippet.
4660: 63 20 6d 6f 64 75 6c 65 2e 20 2a 2f 0a 20 20 69  c module. */.  i
4670: 6e 74 20 69 50 68 72 61 73 65 3b 20 20 20 20 20  nt iPhrase;     
4680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
4690: 65 78 20 6f 66 20 74 68 69 73 20 70 68 72 61 73  ex of this phras
46a0: 65 20 69 6e 20 6d 61 74 63 68 69 6e 66 6f 28 29  e in matchinfo()
46b0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 75 33   results */.  u3
46c0: 32 20 2a 61 4d 49 3b 20 20 20 20 20 20 20 20 20  2 *aMI;         
46d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20           /* See 
46e0: 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  above */.};../*.
46f0: 2a 2a 20 43 61 6e 64 69 64 61 74 65 20 76 61 6c  ** Candidate val
4700: 75 65 73 20 66 6f 72 20 46 74 73 33 51 75 65 72  ues for Fts3Quer
4710: 79 2e 65 54 79 70 65 2e 20 4e 6f 74 65 20 74 68  y.eType. Note th
4720: 61 74 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  at the order of 
4730: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 66 6f 75  the first.** fou
4740: 72 20 76 61 6c 75 65 73 20 69 73 20 69 6e 20 6f  r values is in o
4750: 72 64 65 72 20 6f 66 20 70 72 65 63 65 64 65 6e  rder of preceden
4760: 63 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ce when parsing 
4770: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 6f 72  expressions. For
4780: 20 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68   .** example, th
4790: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
47a0: 2a 2a 20 20 20 22 61 20 4f 52 20 62 20 41 4e 44  **   "a OR b AND
47b0: 20 63 20 4e 4f 54 20 64 20 4e 45 41 52 20 65 22   c NOT d NEAR e"
47c0: 0a 2a 2a 0a 2a 2a 20 69 73 20 65 71 75 69 76 61  .**.** is equiva
47d0: 6c 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  lent to:.**.**  
47e0: 20 22 61 20 4f 52 20 28 62 20 41 4e 44 20 28 63   "a OR (b AND (c
47f0: 20 4e 4f 54 20 28 64 20 4e 45 41 52 20 65 29 29   NOT (d NEAR e))
4800: 29 22 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  )".*/.#define FT
4810: 53 51 55 45 52 59 5f 4e 45 41 52 20 20 20 31 0a  SQUERY_NEAR   1.
4820: 23 64 65 66 69 6e 65 20 46 54 53 51 55 45 52 59  #define FTSQUERY
4830: 5f 4e 4f 54 20 20 20 20 32 0a 23 64 65 66 69 6e  _NOT    2.#defin
4840: 65 20 46 54 53 51 55 45 52 59 5f 41 4e 44 20 20  e FTSQUERY_AND  
4850: 20 20 33 0a 23 64 65 66 69 6e 65 20 46 54 53 51    3.#define FTSQ
4860: 55 45 52 59 5f 4f 52 20 20 20 20 20 34 0a 23 64  UERY_OR     4.#d
4870: 65 66 69 6e 65 20 46 54 53 51 55 45 52 59 5f 50  efine FTSQUERY_P
4880: 48 52 41 53 45 20 35 0a 0a 0a 2f 2a 20 66 74 73  HRASE 5.../* fts
4890: 33 5f 77 72 69 74 65 2e 63 20 2a 2f 0a 69 6e 74  3_write.c */.int
48a0: 20 73 71 6c 69 74 65 33 46 74 73 33 55 70 64 61   sqlite3Fts3Upda
48b0: 74 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  teMethod(sqlite3
48c0: 5f 76 74 61 62 2a 2c 69 6e 74 2c 73 71 6c 69 74  _vtab*,int,sqlit
48d0: 65 33 5f 76 61 6c 75 65 2a 2a 2c 73 71 6c 69 74  e3_value**,sqlit
48e0: 65 33 5f 69 6e 74 36 34 2a 29 3b 0a 69 6e 74 20  e3_int64*);.int 
48f0: 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
4900: 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 46 74 73  ngTermsFlush(Fts
4910: 33 54 61 62 6c 65 20 2a 29 3b 0a 76 6f 69 64 20  3Table *);.void 
4920: 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
4930: 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 46 74 73  ngTermsClear(Fts
4940: 33 54 61 62 6c 65 20 2a 29 3b 0a 69 6e 74 20 73  3Table *);.int s
4950: 71 6c 69 74 65 33 46 74 73 33 4f 70 74 69 6d 69  qlite3Fts3Optimi
4960: 7a 65 28 46 74 73 33 54 61 62 6c 65 20 2a 29 3b  ze(Fts3Table *);
4970: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
4980: 53 65 67 52 65 61 64 65 72 4e 65 77 28 69 6e 74  SegReaderNew(int
4990: 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69  , int, sqlite3_i
49a0: 6e 74 36 34 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nt64,.  sqlite3_
49b0: 69 6e 74 36 34 2c 20 73 71 6c 69 74 65 33 5f 69  int64, sqlite3_i
49c0: 6e 74 36 34 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt64, const char
49d0: 20 2a 2c 20 69 6e 74 2c 20 46 74 73 33 53 65 67   *, int, Fts3Seg
49e0: 52 65 61 64 65 72 2a 2a 29 3b 0a 69 6e 74 20 73  Reader**);.int s
49f0: 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
4a00: 64 65 72 50 65 6e 64 69 6e 67 28 0a 20 20 46 74  derPending(.  Ft
4a10: 73 33 54 61 62 6c 65 2a 2c 69 6e 74 2c 63 6f 6e  s3Table*,int,con
4a20: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74  st char*,int,int
4a30: 2c 46 74 73 33 53 65 67 52 65 61 64 65 72 2a 2a  ,Fts3SegReader**
4a40: 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
4a50: 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
4a60: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
4a70: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4a80: 73 33 41 6c 6c 53 65 67 64 69 72 73 28 46 74 73  s3AllSegdirs(Fts
4a90: 33 54 61 62 6c 65 2a 2c 20 69 6e 74 2c 20 69 6e  3Table*, int, in
4aa0: 74 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f  t, int, sqlite3_
4ab0: 73 74 6d 74 20 2a 2a 29 3b 0a 69 6e 74 20 73 71  stmt **);.int sq
4ac0: 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f  lite3Fts3ReadBlo
4ad0: 63 6b 28 46 74 73 33 54 61 62 6c 65 2a 2c 20 73  ck(Fts3Table*, s
4ae0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 20 63 68  qlite3_int64, ch
4af0: 61 72 20 2a 2a 2c 20 69 6e 74 2a 2c 20 69 6e 74  ar **, int*, int
4b00: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
4b10: 46 74 73 33 53 65 6c 65 63 74 44 6f 63 74 6f 74  Fts3SelectDoctot
4b20: 61 6c 28 46 74 73 33 54 61 62 6c 65 20 2a 2c 20  al(Fts3Table *, 
4b30: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 29  sqlite3_stmt **)
4b40: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
4b50: 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 46  3SelectDocsize(F
4b60: 74 73 33 54 61 62 6c 65 20 2a 2c 20 73 71 6c 69  ts3Table *, sqli
4b70: 74 65 33 5f 69 6e 74 36 34 2c 20 73 71 6c 69 74  te3_int64, sqlit
4b80: 65 33 5f 73 74 6d 74 20 2a 2a 29 3b 0a 0a 23 69  e3_stmt **);..#i
4b90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
4ba0: 41 42 4c 45 5f 46 54 53 34 5f 44 45 46 45 52 52  ABLE_FTS4_DEFERR
4bb0: 45 44 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ED.void sqlite3F
4bc0: 74 73 33 46 72 65 65 44 65 66 65 72 72 65 64 54  ts3FreeDeferredT
4bd0: 6f 6b 65 6e 73 28 46 74 73 33 43 75 72 73 6f 72  okens(Fts3Cursor
4be0: 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33   *);.int sqlite3
4bf0: 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 46  Fts3DeferToken(F
4c00: 74 73 33 43 75 72 73 6f 72 20 2a 2c 20 46 74 73  ts3Cursor *, Fts
4c10: 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 2c 20  3PhraseToken *, 
4c20: 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  int);.int sqlite
4c30: 33 46 74 73 33 43 61 63 68 65 44 65 66 65 72 72  3Fts3CacheDeferr
4c40: 65 64 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43  edDoclists(Fts3C
4c50: 75 72 73 6f 72 20 2a 29 3b 0a 76 6f 69 64 20 73  ursor *);.void s
4c60: 71 6c 69 74 65 33 46 74 73 33 46 72 65 65 44 65  qlite3Fts3FreeDe
4c70: 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 46  ferredDoclists(F
4c80: 74 73 33 43 75 72 73 6f 72 20 2a 29 3b 0a 69 6e  ts3Cursor *);.in
4c90: 74 20 73 71 6c 69 74 65 33 46 74 73 33 44 65 66  t sqlite3Fts3Def
4ca0: 65 72 72 65 64 54 6f 6b 65 6e 4c 69 73 74 28 46  erredTokenList(F
4cb0: 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
4cc0: 20 2a 2c 20 63 68 61 72 20 2a 2a 2c 20 69 6e 74   *, char **, int
4cd0: 20 2a 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66   *);.#else.# def
4ce0: 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73 33 46  ine sqlite3Fts3F
4cf0: 72 65 65 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  reeDeferredToken
4d00: 73 28 78 29 0a 23 20 64 65 66 69 6e 65 20 73 71  s(x).# define sq
4d10: 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 54 6f  lite3Fts3DeferTo
4d20: 6b 65 6e 28 78 2c 79 2c 7a 29 20 53 51 4c 49 54  ken(x,y,z) SQLIT
4d30: 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 73 71  E_OK.# define sq
4d40: 6c 69 74 65 33 46 74 73 33 43 61 63 68 65 44 65  lite3Fts3CacheDe
4d50: 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 78  ferredDoclists(x
4d60: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65  ) SQLITE_OK.# de
4d70: 66 69 6e 65 20 73 71 6c 69 74 65 33 46 74 73 33  fine sqlite3Fts3
4d80: 46 72 65 65 44 65 66 65 72 72 65 64 44 6f 63 6c  FreeDeferredDocl
4d90: 69 73 74 73 28 78 29 0a 23 20 64 65 66 69 6e 65  ists(x).# define
4da0: 20 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65   sqlite3Fts3Defe
4db0: 72 72 65 64 54 6f 6b 65 6e 4c 69 73 74 28 78 2c  rredTokenList(x,
4dc0: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  y,z) SQLITE_OK.#
4dd0: 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69  endif..void sqli
4de0: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
4df0: 6c 6f 73 65 28 46 74 73 33 54 61 62 6c 65 20 2a  lose(Fts3Table *
4e00: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
4e10: 73 33 4d 61 78 4c 65 76 65 6c 28 46 74 73 33 54  s3MaxLevel(Fts3T
4e20: 61 62 6c 65 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a  able *, int *);.
4e30: 0a 2f 2a 20 53 70 65 63 69 61 6c 20 76 61 6c 75  ./* Special valu
4e40: 65 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 62  es interpreted b
4e50: 79 20 73 71 6c 69 74 65 33 53 65 67 52 65 61 64  y sqlite3SegRead
4e60: 65 72 43 75 72 73 6f 72 28 29 20 2a 2f 0a 23 64  erCursor() */.#d
4e70: 65 66 69 6e 65 20 46 54 53 33 5f 53 45 47 43 55  efine FTS3_SEGCU
4e80: 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 20 20 20  RSOR_PENDING    
4e90: 20 20 20 20 2d 31 0a 23 64 65 66 69 6e 65 20 46      -1.#define F
4ea0: 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
4eb0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 2d 32 0a  L            -2.
4ec0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
4ed0: 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 46  SegReaderStart(F
4ee0: 74 73 33 54 61 62 6c 65 2a 2c 20 46 74 73 33 4d  ts3Table*, Fts3M
4ef0: 75 6c 74 69 53 65 67 52 65 61 64 65 72 2a 2c 20  ultiSegReader*, 
4f00: 46 74 73 33 53 65 67 46 69 6c 74 65 72 2a 29 3b  Fts3SegFilter*);
4f10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
4f20: 53 65 67 52 65 61 64 65 72 53 74 65 70 28 46 74  SegReaderStep(Ft
4f30: 73 33 54 61 62 6c 65 20 2a 2c 20 46 74 73 33 4d  s3Table *, Fts3M
4f40: 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 29  ultiSegReader *)
4f50: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
4f60: 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73  s3SegReaderFinis
4f70: 68 28 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  h(Fts3MultiSegRe
4f80: 61 64 65 72 20 2a 29 3b 0a 0a 69 6e 74 20 73 71  ader *);..int sq
4f90: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
4fa0: 65 72 43 75 72 73 6f 72 28 46 74 73 33 54 61 62  erCursor(Fts3Tab
4fb0: 6c 65 20 2a 2c 20 0a 20 20 20 20 69 6e 74 2c 20  le *, .    int, 
4fc0: 69 6e 74 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20  int, int, const 
4fd0: 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 69 6e 74  char *, int, int
4fe0: 2c 20 69 6e 74 2c 20 46 74 73 33 4d 75 6c 74 69  , int, Fts3Multi
4ff0: 53 65 67 52 65 61 64 65 72 20 2a 29 3b 0a 0a 2f  SegReader *);../
5000: 2a 20 46 6c 61 67 73 20 61 6c 6c 6f 77 65 64 20  * Flags allowed 
5010: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 34  as part of the 4
5020: 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 53  th argument to S
5030: 65 67 6d 65 6e 74 52 65 61 64 65 72 49 74 65 72  egmentReaderIter
5040: 61 74 65 28 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ate() */.#define
5050: 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45   FTS3_SEGMENT_RE
5060: 51 55 49 52 45 5f 50 4f 53 20 20 20 30 78 30 30  QUIRE_POS   0x00
5070: 30 30 30 30 30 31 0a 23 64 65 66 69 6e 65 20 46  000001.#define F
5080: 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f  TS3_SEGMENT_IGNO
5090: 52 45 5f 45 4d 50 54 59 20 20 30 78 30 30 30 30  RE_EMPTY  0x0000
50a0: 30 30 30 32 0a 23 64 65 66 69 6e 65 20 46 54 53  0002.#define FTS
50b0: 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55 4d 4e  3_SEGMENT_COLUMN
50c0: 5f 46 49 4c 54 45 52 20 30 78 30 30 30 30 30 30  _FILTER 0x000000
50d0: 30 34 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f  04.#define FTS3_
50e0: 53 45 47 4d 45 4e 54 5f 50 52 45 46 49 58 20 20  SEGMENT_PREFIX  
50f0: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 38        0x00000008
5100: 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 53 45  .#define FTS3_SE
5110: 47 4d 45 4e 54 5f 53 43 41 4e 20 20 20 20 20 20  GMENT_SCAN      
5120: 20 20 20 20 30 78 30 30 30 30 30 30 31 30 0a 23      0x00000010.#
5130: 64 65 66 69 6e 65 20 46 54 53 33 5f 53 45 47 4d  define FTS3_SEGM
5140: 45 4e 54 5f 46 49 52 53 54 20 20 20 20 20 20 20  ENT_FIRST       
5150: 20 20 30 78 30 30 30 30 30 30 32 30 0a 0a 2f 2a    0x00000020../*
5160: 20 54 79 70 65 20 70 61 73 73 65 64 20 61 73 20   Type passed as 
5170: 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
5180: 53 65 67 6d 65 6e 74 52 65 61 64 65 72 49 74 65  SegmentReaderIte
5190: 72 61 74 65 28 29 20 2a 2f 0a 73 74 72 75 63 74  rate() */.struct
51a0: 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 7b   Fts3SegFilter {
51b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
51c0: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 54 65 72  Term;.  int nTer
51d0: 6d 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  m;.  int iCol;. 
51e0: 20 69 6e 74 20 66 6c 61 67 73 3b 0a 7d 3b 0a 0a   int flags;.};..
51f0: 73 74 72 75 63 74 20 46 74 73 33 4d 75 6c 74 69  struct Fts3Multi
5200: 53 65 67 52 65 61 64 65 72 20 7b 0a 20 20 2f 2a  SegReader {.  /*
5210: 20 55 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   Used internally
5220: 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 33 53   by sqlite3Fts3S
5230: 65 67 52 65 61 64 65 72 58 58 58 28 29 20 63 61  egReaderXXX() ca
5240: 6c 6c 73 20 2a 2f 0a 20 20 46 74 73 33 53 65 67  lls */.  Fts3Seg
5250: 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65  Reader **apSegme
5260: 6e 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61  nt;      /* Arra
5270: 79 20 6f 66 20 46 74 73 33 53 65 67 52 65 61 64  y of Fts3SegRead
5280: 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  er objects */.  
5290: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20 20  int nSegment;   
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53 65 67  /* Size of apSeg
52c0: 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  ment array */.  
52d0: 69 6e 74 20 6e 41 64 76 61 6e 63 65 3b 20 20 20  int nAdvance;   
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 73 65 67 2d  /* How many seg-
5300: 72 65 61 64 65 72 73 20 74 6f 20 61 64 76 61 6e  readers to advan
5310: 63 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46  ce */.  Fts3SegF
5320: 69 6c 74 65 72 20 2a 70 46 69 6c 74 65 72 3b 20  ilter *pFilter; 
5330: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
5340: 65 72 20 74 6f 20 66 69 6c 74 65 72 20 6f 62 6a  er to filter obj
5350: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ect */.  char *a
5360: 42 75 66 66 65 72 3b 20 20 20 20 20 20 20 20 20  Buffer;         
5370: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
5380: 65 72 20 74 6f 20 6d 65 72 67 65 20 64 6f 63 6c  er to merge docl
5390: 69 73 74 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  ists in */.  int
53a0: 20 6e 42 75 66 66 65 72 3b 20 20 20 20 20 20 20   nBuffer;       
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
53c0: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
53d0: 66 20 61 42 75 66 66 65 72 5b 5d 20 69 6e 20 62  f aBuffer[] in b
53e0: 79 74 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  ytes */..  int i
53f0: 43 6f 6c 46 69 6c 74 65 72 3b 20 20 20 20 20 20  ColFilter;      
5400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
5410: 20 3e 3d 30 2c 20 66 69 6c 74 65 72 20 66 6f 72   >=0, filter for
5420: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   this column */.
5430: 20 20 69 6e 74 20 62 52 65 73 74 61 72 74 3b 0a    int bRestart;.
5440: 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 74  .  /* Used by ft
5450: 73 33 2e 63 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  s3.c only. */.  
5460: 69 6e 74 20 6e 43 6f 73 74 3b 20 20 20 20 20 20  int nCost;      
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e 6e 69  /* Cost of runni
5490: 6e 67 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  ng iterator */. 
54a0: 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 3b 20 20 20   int bLookup;   
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6c 6f   /* True if a lo
54d0: 6f 6b 75 70 20 6f 66 20 61 20 73 69 6e 67 6c 65  okup of a single
54e0: 20 65 6e 74 72 79 2e 20 2a 2f 0a 0a 20 20 2f 2a   entry. */..  /*
54f0: 20 4f 75 74 70 75 74 20 76 61 6c 75 65 73 2e 20   Output values. 
5500: 56 61 6c 69 64 20 6f 6e 6c 79 20 61 66 74 65 72  Valid only after
5510: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74   Fts3SegReaderSt
5520: 65 70 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c  ep() returns SQL
5530: 49 54 45 5f 52 4f 57 2e 20 2a 2f 0a 20 20 63 68  ITE_ROW. */.  ch
5540: 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20  ar *zTerm;      
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5560: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 65 72 6d   Pointer to term
5570: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
5580: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55a0: 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e  Size of zTerm in
55b0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
55c0: 20 2a 61 44 6f 63 6c 69 73 74 3b 20 20 20 20 20   *aDoclist;     
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
55e0: 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
55f0: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  t buffer */.  in
5600: 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  t nDoclist;     
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5620: 20 53 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73   Size of aDoclis
5630: 74 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  t[] in bytes */.
5640: 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  };..int sqlite3F
5650: 74 73 33 49 6e 63 72 6d 65 72 67 65 28 46 74 73  ts3Incrmerge(Fts
5660: 33 54 61 62 6c 65 2a 2c 69 6e 74 2c 69 6e 74 29  3Table*,int,int)
5670: 3b 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 33 47  ;..#define fts3G
5680: 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 70 69  etVarint32(p, pi
5690: 56 61 6c 29 20 28 20 20 20 20 20 20 20 20 20 20  Val) (          
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 5c 0a 20 20 28 2a 28 75 38 2a 29 28 70 29 26   \.  (*(u8*)(p)&
56d0: 30 78 38 30 29 20 3f 20 73 71 6c 69 74 65 33 46  0x80) ? sqlite3F
56e0: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
56f0: 2c 20 70 69 56 61 6c 29 20 3a 20 28 2a 70 69 56  , piVal) : (*piV
5700: 61 6c 3d 2a 28 75 38 2a 29 28 70 29 2c 20 31 29  al=*(u8*)(p), 1)
5710: 20 5c 0a 29 0a 0a 2f 2a 20 66 74 73 33 2e 63 20   \.)../* fts3.c 
5720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
5730: 74 73 33 45 72 72 4d 73 67 28 63 68 61 72 2a 2a  ts3ErrMsg(char**
5740: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 2e 2e 2e  ,const char*,...
5750: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
5760: 73 33 50 75 74 56 61 72 69 6e 74 28 63 68 61 72  s3PutVarint(char
5770: 20 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   *, sqlite3_int6
5780: 34 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  4);.int sqlite3F
5790: 74 73 33 47 65 74 56 61 72 69 6e 74 28 63 6f 6e  ts3GetVarint(con
57a0: 73 74 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74  st char *, sqlit
57b0: 65 5f 69 6e 74 36 34 20 2a 29 3b 0a 69 6e 74 20  e_int64 *);.int 
57c0: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
57d0: 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 63 68 61  rint32(const cha
57e0: 72 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a 69 6e 74  r *, int *);.int
57f0: 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
5800: 6e 74 4c 65 6e 28 73 71 6c 69 74 65 33 5f 75 69  ntLen(sqlite3_ui
5810: 6e 74 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c 69  nt64);.void sqli
5820: 74 65 33 46 74 73 33 44 65 71 75 6f 74 65 28 63  te3Fts3Dequote(c
5830: 68 61 72 20 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  har *);.void sql
5840: 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50  ite3Fts3DoclistP
5850: 72 65 76 28 69 6e 74 2c 63 68 61 72 2a 2c 69 6e  rev(int,char*,in
5860: 74 2c 63 68 61 72 2a 2a 2c 73 71 6c 69 74 65 33  t,char**,sqlite3
5870: 5f 69 6e 74 36 34 2a 2c 69 6e 74 2a 2c 75 38 2a  _int64*,int*,u8*
5880: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
5890: 73 33 45 76 61 6c 50 68 72 61 73 65 53 74 61 74  s3EvalPhraseStat
58a0: 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 2c 20  s(Fts3Cursor *, 
58b0: 46 74 73 33 45 78 70 72 20 2a 2c 20 75 33 32 20  Fts3Expr *, u32 
58c0: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  *);.int sqlite3F
58d0: 74 73 33 46 69 72 73 74 46 69 6c 74 65 72 28 73  ts3FirstFilter(s
58e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 20 63 68  qlite3_int64, ch
58f0: 61 72 20 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20  ar *, int, char 
5900: 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  *);.void sqlite3
5910: 46 74 73 33 43 72 65 61 74 65 53 74 61 74 54 61  Fts3CreateStatTa
5920: 62 6c 65 28 69 6e 74 2a 2c 20 46 74 73 33 54 61  ble(int*, Fts3Ta
5930: 62 6c 65 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  ble*);.int sqlit
5940: 65 33 46 74 73 33 45 76 61 6c 54 65 73 74 44 65  e3Fts3EvalTestDe
5950: 66 65 72 72 65 64 28 46 74 73 33 43 75 72 73 6f  ferred(Fts3Curso
5960: 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a 70 52  r *pCsr, int *pR
5970: 63 29 3b 0a 0a 2f 2a 20 66 74 73 33 5f 74 6f 6b  c);../* fts3_tok
5980: 65 6e 69 7a 65 72 2e 63 20 2a 2f 0a 63 6f 6e 73  enizer.c */.cons
5990: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  t char *sqlite3F
59a0: 74 73 33 4e 65 78 74 54 6f 6b 65 6e 28 63 6f 6e  ts3NextToken(con
59b0: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 20 2a  st char *, int *
59c0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
59d0: 73 33 49 6e 69 74 48 61 73 68 54 61 62 6c 65 28  s3InitHashTable(
59e0: 73 71 6c 69 74 65 33 20 2a 2c 20 46 74 73 33 48  sqlite3 *, Fts3H
59f0: 61 73 68 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ash *, const cha
5a00: 72 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  r *);.int sqlite
5a10: 33 46 74 73 33 49 6e 69 74 54 6f 6b 65 6e 69 7a  3Fts3InitTokeniz
5a20: 65 72 28 46 74 73 33 48 61 73 68 20 2a 70 48 61  er(Fts3Hash *pHa
5a30: 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  sh, const char *
5a40: 2c 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  , .    sqlite3_t
5a50: 6f 6b 65 6e 69 7a 65 72 20 2a 2a 2c 20 63 68 61  okenizer **, cha
5a60: 72 20 2a 2a 0a 29 3b 0a 69 6e 74 20 73 71 6c 69  r **.);.int sqli
5a70: 74 65 33 46 74 73 33 49 73 49 64 43 68 61 72 28  te3Fts3IsIdChar(
5a80: 63 68 61 72 29 3b 0a 0a 2f 2a 20 66 74 73 33 5f  char);../* fts3_
5a90: 73 6e 69 70 70 65 74 2e 63 20 2a 2f 0a 76 6f 69  snippet.c */.voi
5aa0: 64 20 73 71 6c 69 74 65 33 46 74 73 33 4f 66 66  d sqlite3Fts3Off
5ab0: 73 65 74 73 28 73 71 6c 69 74 65 33 5f 63 6f 6e  sets(sqlite3_con
5ac0: 74 65 78 74 2a 2c 20 46 74 73 33 43 75 72 73 6f  text*, Fts3Curso
5ad0: 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  r*);.void sqlite
5ae0: 33 46 74 73 33 53 6e 69 70 70 65 74 28 73 71 6c  3Fts3Snippet(sql
5af0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 2c 20  ite3_context *, 
5b00: 46 74 73 33 43 75 72 73 6f 72 20 2a 2c 20 63 6f  Fts3Cursor *, co
5b10: 6e 73 74 20 63 68 61 72 20 2a 2c 0a 20 20 63 6f  nst char *,.  co
5b20: 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73  nst char *, cons
5b30: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 69  t char *, int, i
5b40: 6e 74 0a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  nt.);.void sqlit
5b50: 65 33 46 74 73 33 4d 61 74 63 68 69 6e 66 6f 28  e3Fts3Matchinfo(
5b60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5b70: 2a 2c 20 46 74 73 33 43 75 72 73 6f 72 20 2a 2c  *, Fts3Cursor *,
5b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a   const char *);.
5b90: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
5ba0: 4d 49 42 75 66 66 65 72 46 72 65 65 28 4d 61 74  MIBufferFree(Mat
5bb0: 63 68 69 6e 66 6f 42 75 66 66 65 72 20 2a 70 29  chinfoBuffer *p)
5bc0: 3b 0a 0a 2f 2a 20 66 74 73 33 5f 65 78 70 72 2e  ;../* fts3_expr.
5bd0: 63 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  c */.int sqlite3
5be0: 46 74 73 33 45 78 70 72 50 61 72 73 65 28 73 71  Fts3ExprParse(sq
5bf0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20  lite3_tokenizer 
5c00: 2a 2c 20 69 6e 74 2c 0a 20 20 63 68 61 72 20 2a  *, int,.  char *
5c10: 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74  *, int, int, int
5c20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  , const char *, 
5c30: 69 6e 74 2c 20 46 74 73 33 45 78 70 72 20 2a 2a  int, Fts3Expr **
5c40: 2c 20 63 68 61 72 20 2a 2a 0a 29 3b 0a 76 6f 69  , char **.);.voi
5c50: 64 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70  d sqlite3Fts3Exp
5c60: 72 46 72 65 65 28 46 74 73 33 45 78 70 72 20 2a  rFree(Fts3Expr *
5c70: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
5c80: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
5c90: 33 46 74 73 33 45 78 70 72 49 6e 69 74 54 65 73  3Fts3ExprInitTes
5ca0: 74 49 6e 74 65 72 66 61 63 65 28 73 71 6c 69 74  tInterface(sqlit
5cb0: 65 33 20 2a 64 62 2c 20 46 74 73 33 48 61 73 68  e3 *db, Fts3Hash
5cc0: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  *);.int sqlite3F
5cd0: 74 73 33 49 6e 69 74 54 65 72 6d 28 73 71 6c 69  ts3InitTerm(sqli
5ce0: 74 65 33 20 2a 64 62 29 3b 0a 23 65 6e 64 69 66  te3 *db);.#endif
5cf0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
5d00: 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 73  3OpenTokenizer(s
5d10: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
5d20: 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63   *, int, const c
5d30: 68 61 72 20 2a 2c 20 69 6e 74 2c 0a 20 20 73 71  har *, int,.  sq
5d40: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
5d50: 63 75 72 73 6f 72 20 2a 2a 0a 29 3b 0a 0a 2f 2a  cursor **.);../*
5d60: 20 66 74 73 33 5f 61 75 78 2e 63 20 2a 2f 0a 69   fts3_aux.c */.i
5d70: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e  nt sqlite3Fts3In
5d80: 69 74 41 75 78 28 73 71 6c 69 74 65 33 20 2a 64  itAux(sqlite3 *d
5d90: 62 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  b);..void sqlite
5da0: 33 46 74 73 33 45 76 61 6c 50 68 72 61 73 65 43  3Fts3EvalPhraseC
5db0: 6c 65 61 6e 75 70 28 46 74 73 33 50 68 72 61 73  leanup(Fts3Phras
5dc0: 65 20 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74  e *);..int sqlit
5dd0: 65 33 46 74 73 33 4d 73 72 49 6e 63 72 53 74 61  e3Fts3MsrIncrSta
5de0: 72 74 28 0a 20 20 20 20 46 74 73 33 54 61 62 6c  rt(.    Fts3Tabl
5df0: 65 2a 2c 20 46 74 73 33 4d 75 6c 74 69 53 65 67  e*, Fts3MultiSeg
5e00: 52 65 61 64 65 72 2a 2c 20 69 6e 74 2c 20 63 6f  Reader*, int, co
5e10: 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b  nst char*, int);
5e20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
5e30: 4d 73 72 49 6e 63 72 4e 65 78 74 28 0a 20 20 20  MsrIncrNext(.   
5e40: 20 46 74 73 33 54 61 62 6c 65 20 2a 2c 20 46 74   Fts3Table *, Ft
5e50: 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
5e60: 20 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   *, sqlite3_int6
5e70: 34 20 2a 2c 20 63 68 61 72 20 2a 2a 2c 20 69 6e  4 *, char **, in
5e80: 74 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  t *);.int sqlite
5e90: 33 46 74 73 33 45 76 61 6c 50 68 72 61 73 65 50  3Fts3EvalPhraseP
5ea0: 6f 73 6c 69 73 74 28 46 74 73 33 43 75 72 73 6f  oslist(Fts3Curso
5eb0: 72 20 2a 2c 20 46 74 73 33 45 78 70 72 20 2a 2c  r *, Fts3Expr *,
5ec0: 20 69 6e 74 20 69 43 6f 6c 2c 20 63 68 61 72 20   int iCol, char 
5ed0: 2a 2a 29 3b 20 0a 69 6e 74 20 73 71 6c 69 74 65  **); .int sqlite
5ee0: 33 46 74 73 33 4d 73 72 4f 76 66 6c 28 46 74 73  3Fts3MsrOvfl(Fts
5ef0: 33 43 75 72 73 6f 72 20 2a 2c 20 46 74 73 33 4d  3Cursor *, Fts3M
5f00: 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 2c  ultiSegReader *,
5f10: 20 69 6e 74 20 2a 29 3b 0a 69 6e 74 20 73 71 6c   int *);.int sql
5f20: 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 52  ite3Fts3MsrIncrR
5f30: 65 73 74 61 72 74 28 46 74 73 33 4d 75 6c 74 69  estart(Fts3Multi
5f40: 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 29  SegReader *pCsr)
5f50: 3b 0a 0a 2f 2a 20 66 74 73 33 5f 74 6f 6b 65 6e  ;../* fts3_token
5f60: 69 7a 65 5f 76 74 61 62 2e 63 20 2a 2f 0a 69 6e  ize_vtab.c */.in
5f70: 74 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  t sqlite3Fts3Ini
5f80: 74 54 6f 6b 28 73 71 6c 69 74 65 33 2a 2c 20 46  tTok(sqlite3*, F
5f90: 74 73 33 48 61 73 68 20 2a 29 3b 0a 0a 2f 2a 20  ts3Hash *);../* 
5fa0: 66 74 73 33 5f 75 6e 69 63 6f 64 65 32 2e 63 20  fts3_unicode2.c 
5fb0: 28 66 75 6e 63 74 69 6f 6e 73 20 67 65 6e 65 72  (functions gener
5fc0: 61 74 65 64 20 62 79 20 70 61 72 73 69 6e 67 20  ated by parsing 
5fd0: 75 6e 69 63 6f 64 65 20 74 65 78 74 20 66 69 6c  unicode text fil
5fe0: 65 73 29 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  es) */.#ifndef S
5ff0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 46 54  QLITE_DISABLE_FT
6000: 53 33 5f 55 4e 49 43 4f 44 45 0a 69 6e 74 20 73  S3_UNICODE.int s
6010: 71 6c 69 74 65 33 46 74 73 55 6e 69 63 6f 64 65  qlite3FtsUnicode
6020: 46 6f 6c 64 28 69 6e 74 2c 20 69 6e 74 29 3b 0a  Fold(int, int);.
6030: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 55 6e  int sqlite3FtsUn
6040: 69 63 6f 64 65 49 73 61 6c 6e 75 6d 28 69 6e 74  icodeIsalnum(int
6050: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
6060: 73 55 6e 69 63 6f 64 65 49 73 64 69 61 63 72 69  sUnicodeIsdiacri
6070: 74 69 63 28 69 6e 74 29 3b 0a 23 65 6e 64 69 66  tic(int);.#endif
6080: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  ..#endif /* !SQL
6090: 49 54 45 5f 43 4f 52 45 20 7c 7c 20 53 51 4c 49  ITE_CORE || SQLI
60a0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2a  TE_ENABLE_FTS3 *
60b0: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 46 54 53  /.#endif /* _FTS
60c0: 49 4e 54 5f 48 20 2a 2f 0a                       INT_H */.