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

Artifact 945926ea4b6a686c3e9834640a252d9870b7191e:


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 0a 23 69 66  *****.**.*/..#if
0180: 6e 64 65 66 20 5f 46 54 53 49 4e 54 5f 48 0a 23  ndef _FTSINT_H.#
0190: 64 65 66 69 6e 65 20 5f 46 54 53 49 4e 54 5f 48  define _FTSINT_H
01a0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
01b0: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
01c0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
01d0: 20 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 42 55   .# define NDEBU
01e0: 47 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  G 1.#endif..#inc
01f0: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0200: 0a 23 69 6e 63 6c 75 64 65 20 22 66 74 73 33 5f  .#include "fts3_
0210: 74 6f 6b 65 6e 69 7a 65 72 2e 68 22 0a 23 69 6e  tokenizer.h".#in
0220: 63 6c 75 64 65 20 22 66 74 73 33 5f 68 61 73 68  clude "fts3_hash
0230: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h"../*.** This 
0240: 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 74 72 6f 6c  constant control
0250: 73 20 68 6f 77 20 6f 66 74 65 6e 20 73 65 67 6d  s how often segm
0260: 65 6e 74 73 20 61 72 65 20 6d 65 72 67 65 64 2e  ents are merged.
0270: 20 4f 6e 63 65 20 74 68 65 72 65 20 61 72 65 0a   Once there are.
0280: 2a 2a 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f  ** FTS3_MERGE_CO
0290: 55 4e 54 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  UNT segments of 
02a0: 6c 65 76 65 6c 20 4e 2c 20 74 68 65 79 20 61 72  level N, they ar
02b0: 65 20 6d 65 72 67 65 64 20 69 6e 74 6f 20 61 20  e merged into a 
02c0: 73 69 6e 67 6c 65 0a 2a 2a 20 73 65 67 6d 65 6e  single.** segmen
02d0: 74 20 6f 66 20 6c 65 76 65 6c 20 4e 2b 31 2e 0a  t of level N+1..
02e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f  */.#define FTS3_
02f0: 4d 45 52 47 45 5f 43 4f 55 4e 54 20 31 36 0a 0a  MERGE_COUNT 16..
0300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
0310: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
0320: 20 6f 66 20 64 61 74 61 20 28 69 6e 20 62 79 74   of data (in byt
0330: 65 73 29 20 74 6f 20 73 74 6f 72 65 20 69 6e 20  es) to store in 
0340: 74 68 65 20 0a 2a 2a 20 46 74 73 33 54 61 62 6c  the .** Fts3Tabl
0350: 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 68  e.pendingTerms h
0360: 61 73 68 20 74 61 62 6c 65 2e 20 4e 6f 72 6d 61  ash table. Norma
0370: 6c 6c 79 2c 20 74 68 65 20 68 61 73 68 20 74 61  lly, the hash ta
0380: 62 6c 65 20 69 73 0a 2a 2a 20 70 6f 70 75 6c 61  ble is.** popula
0390: 74 65 64 20 61 73 20 64 6f 63 75 6d 65 6e 74 73  ted as documents
03a0: 20 61 72 65 20 69 6e 73 65 72 74 65 64 2f 75 70   are inserted/up
03b0: 64 61 74 65 64 2f 64 65 6c 65 74 65 64 20 69 6e  dated/deleted in
03c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
03d0: 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 63 72  * and used to cr
03e0: 65 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  eate a new segme
03f0: 6e 74 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  nt when the tran
0400: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
0410: 74 74 65 64 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  tted..** However
0420: 20 69 66 20 74 68 69 73 20 6c 69 6d 69 74 20 69   if this limit i
0430: 73 20 72 65 61 63 68 65 64 20 6d 69 64 77 61 79  s reached midway
0440: 20 74 68 72 6f 75 67 68 20 61 20 74 72 61 6e 73   through a trans
0450: 61 63 74 69 6f 6e 2c 20 61 20 6e 65 77 20 0a 2a  action, a new .*
0460: 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 63 72 65  * segment is cre
0470: 61 74 65 64 20 61 6e 64 20 74 68 65 20 68 61 73  ated and the has
0480: 68 20 74 61 62 6c 65 20 63 6c 65 61 72 65 64 20  h table cleared 
0490: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a  immediately..*/.
04a0: 23 64 65 66 69 6e 65 20 46 54 53 33 5f 4d 41 58  #define FTS3_MAX
04b0: 5f 50 45 4e 44 49 4e 47 5f 44 41 54 41 20 28 31  _PENDING_DATA (1
04c0: 2a 31 30 32 34 2a 31 30 32 34 29 0a 0a 2f 2a 0a  *1024*1024)../*.
04d0: 2a 2a 20 4d 61 63 72 6f 20 74 6f 20 72 65 74 75  ** Macro to retu
04e0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
04f0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
0500: 61 72 72 61 79 2e 20 53 51 4c 69 74 65 20 68 61  array. SQLite ha
0510: 73 20 61 0a 2a 2a 20 73 69 6d 69 6c 61 72 20 6d  s a.** similar m
0520: 61 63 72 6f 20 63 61 6c 6c 65 64 20 41 72 72 61  acro called Arra
0530: 79 53 69 7a 65 28 29 2e 20 55 73 65 20 61 20 64  ySize(). Use a d
0540: 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 20 74 6f  ifferent name to
0550: 20 61 76 6f 69 64 0a 2a 2a 20 61 20 63 6f 6c 6c   avoid.** a coll
0560: 69 73 69 6f 6e 20 77 68 65 6e 20 62 75 69 6c 64  ision when build
0570: 69 6e 67 20 61 6e 20 61 6d 61 6c 67 61 6d 61 74  ing an amalgamat
0580: 69 6f 6e 20 77 69 74 68 20 62 75 69 6c 74 2d 69  ion with built-i
0590: 6e 20 46 54 53 33 2e 0a 2a 2f 0a 23 64 65 66 69  n FTS3..*/.#defi
05a0: 6e 65 20 53 69 7a 65 6f 66 41 72 72 61 79 28 58  ne SizeofArray(X
05b0: 29 20 28 28 69 6e 74 29 28 73 69 7a 65 6f 66 28  ) ((int)(sizeof(
05c0: 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d 29 29  X)/sizeof(X[0]))
05d0: 29 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  )../*.** Maximum
05e0: 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 76 61 72   length of a var
05f0: 69 6e 74 20 65 6e 63 6f 64 65 64 20 69 6e 74 65  int encoded inte
0600: 67 65 72 2e 20 54 68 65 20 76 61 72 69 6e 74 20  ger. The varint 
0610: 66 6f 72 6d 61 74 20 69 73 20 64 69 66 66 65 72  format is differ
0620: 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 61 74  ent.** from that
0630: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 2c   used by SQLite,
0640: 20 73 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   so the maximum 
0650: 6c 65 6e 67 74 68 20 69 73 20 31 30 2c 20 6e 6f  length is 10, no
0660: 74 20 39 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  t 9..*/.#define 
0670: 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20  FTS3_VARINT_MAX 
0680: 31 30 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 65  10../*.** The te
0690: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 69  stcase() macro i
06a0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74  s only used by t
06b0: 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e  he amalgamation.
06c0: 20 20 49 66 20 75 6e 64 65 66 69 6e 65 64 2c 0a    If undefined,.
06d0: 2a 2a 20 6d 61 6b 65 20 69 74 20 61 20 6e 6f 2d  ** make it a no-
06e0: 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 74  op..*/.#ifndef t
06f0: 65 73 74 63 61 73 65 0a 23 20 64 65 66 69 6e 65  estcase.# define
0700: 20 74 65 73 74 63 61 73 65 28 58 29 0a 23 65 6e   testcase(X).#en
0710: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 72 6d 69  dif../*.** Termi
0720: 6e 61 74 6f 72 20 76 61 6c 75 65 73 20 66 6f 72  nator values for
0730: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 73 20   position-lists 
0740: 61 6e 64 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 73  and column-lists
0750: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 4f 53  ..*/.#define POS
0760: 5f 43 4f 4c 55 4d 4e 20 20 28 31 29 20 20 20 20  _COLUMN  (1)    
0770: 20 2f 2a 20 43 6f 6c 75 6d 6e 2d 6c 69 73 74 20   /* Column-list 
0780: 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 23 64  terminator */.#d
0790: 65 66 69 6e 65 20 50 4f 53 5f 45 4e 44 20 20 20  efine POS_END   
07a0: 20 20 28 30 29 20 20 20 20 20 2f 2a 20 50 6f 73    (0)     /* Pos
07b0: 69 74 69 6f 6e 2d 6c 69 73 74 20 74 65 72 6d 69  ition-list termi
07c0: 6e 61 74 6f 72 20 2a 2f 20 0a 0a 2f 2a 0a 2a 2a  nator */ ../*.**
07d0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 70 72   This section pr
07e0: 6f 76 69 64 65 73 20 64 65 66 69 6e 69 74 69 6f  ovides definitio
07f0: 6e 73 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65 0a  ns to allow the.
0800: 2a 2a 20 46 54 53 33 20 65 78 74 65 6e 73 69 6f  ** FTS3 extensio
0810: 6e 20 74 6f 20 62 65 20 63 6f 6d 70 69 6c 65 64  n to be compiled
0820: 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65 20   outside of the 
0830: 0a 2a 2a 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  .** amalgamation
0840: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0850: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
0860: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 69 6e  ./*.** Macros in
0870: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 63 6f  dicating that co
0880: 6e 64 69 74 69 6f 6e 61 6c 20 65 78 70 72 65 73  nditional expres
0890: 73 69 6f 6e 73 20 61 72 65 20 61 6c 77 61 79 73  sions are always
08a0: 20 74 72 75 65 20 6f 72 0a 2a 2a 20 66 61 6c 73   true or.** fals
08b0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
08c0: 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
08d0: 54 0a 23 20 64 65 66 69 6e 65 20 41 4c 57 41 59  T.# define ALWAY
08e0: 53 28 78 29 20 28 31 29 0a 23 20 64 65 66 69 6e  S(x) (1).# defin
08f0: 65 20 4e 45 56 45 52 28 58 29 20 20 28 30 29 0a  e NEVER(X)  (0).
0900: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41  #else.# define A
0910: 4c 57 41 59 53 28 78 29 20 28 78 29 0a 23 20 64  LWAYS(x) (x).# d
0920: 65 66 69 6e 65 20 4e 45 56 45 52 28 58 29 20 20  efine NEVER(X)  
0930: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
0940: 2a 20 49 6e 74 65 72 6e 61 6c 20 74 79 70 65 73  * Internal types
0950: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 2e   used by SQLite.
0960: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 73 69  .*/.typedef unsi
0970: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 20 20 20  gned char u8;   
0980: 20 20 20 20 20 20 2f 2a 20 31 2d 62 79 74 65 20        /* 1-byte 
0990: 28 6f 72 20 6c 61 72 67 65 72 29 20 75 6e 73 69  (or larger) unsi
09a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
09b0: 74 79 70 65 64 65 66 20 73 68 6f 72 74 20 69 6e  typedef short in
09c0: 74 20 69 31 36 3b 20 20 20 20 20 20 20 20 20 20  t i16;          
09d0: 20 20 2f 2a 20 32 2d 62 79 74 65 20 28 6f 72 20    /* 2-byte (or 
09e0: 6c 61 72 67 65 72 29 20 73 69 67 6e 65 64 20 69  larger) signed i
09f0: 6e 74 65 67 65 72 20 2a 2f 0a 74 79 70 65 64 65  nteger */.typede
0a00: 66 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75  f unsigned int u
0a10: 33 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 34  32;         /* 4
0a20: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
0a30: 6e 74 65 67 65 72 20 2a 2f 0a 74 79 70 65 64 65  nteger */.typede
0a40: 66 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34  f sqlite3_uint64
0a50: 20 75 36 34 3b 20 20 20 20 20 20 20 2f 2a 20 38   u64;       /* 8
0a60: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
0a70: 6e 74 65 67 65 72 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nteger */./*.** 
0a80: 4d 61 63 72 6f 20 75 73 65 64 20 74 6f 20 73 75  Macro used to su
0a90: 70 70 72 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  ppress compiler 
0aa0: 77 61 72 6e 69 6e 67 73 20 66 6f 72 20 75 6e 75  warnings for unu
0ab0: 73 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  sed parameters..
0ac0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45  */.#define UNUSE
0ad0: 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20 28  D_PARAMETER(x) (
0ae0: 76 6f 69 64 29 28 78 29 0a 23 65 6e 64 69 66 0a  void)(x).#endif.
0af0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0b00: 46 74 73 33 54 61 62 6c 65 20 46 74 73 33 54 61  Fts3Table Fts3Ta
0b10: 62 6c 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ble;.typedef str
0b20: 75 63 74 20 46 74 73 33 43 75 72 73 6f 72 20 46  uct Fts3Cursor F
0b30: 74 73 33 43 75 72 73 6f 72 3b 0a 74 79 70 65 64  ts3Cursor;.typed
0b40: 65 66 20 73 74 72 75 63 74 20 46 74 73 33 45 78  ef struct Fts3Ex
0b50: 70 72 20 46 74 73 33 45 78 70 72 3b 0a 74 79 70  pr Fts3Expr;.typ
0b60: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 33  edef struct Fts3
0b70: 50 68 72 61 73 65 20 46 74 73 33 50 68 72 61 73  Phrase Fts3Phras
0b80: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
0b90: 74 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65  t Fts3PhraseToke
0ba0: 6e 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65  n Fts3PhraseToke
0bb0: 6e 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  n;..typedef stru
0bc0: 63 74 20 46 74 73 33 53 65 67 46 69 6c 74 65 72  ct Fts3SegFilter
0bd0: 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 3b 0a   Fts3SegFilter;.
0be0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
0bf0: 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
0c00: 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b   Fts3DeferredTok
0c10: 65 6e 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  en;.typedef stru
0c20: 63 74 20 46 74 73 33 53 65 67 52 65 61 64 65 72  ct Fts3SegReader
0c30: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 3b 0a   Fts3SegReader;.
0c40: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
0c50: 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
0c60: 6f 72 20 46 74 73 33 53 65 67 52 65 61 64 65 72  or Fts3SegReader
0c70: 43 75 72 73 6f 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41  Cursor;../*.** A
0c80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
0c90: 20 66 75 6c 6c 74 65 78 74 20 69 6e 64 65 78 20   fulltext index 
0ca0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
0cb0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0cc0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ** structure. Th
0cd0: 65 20 78 43 72 65 61 74 65 20 61 6e 64 20 78 43  e xCreate and xC
0ce0: 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 73 20 63  onnect methods c
0cf0: 72 65 61 74 65 20 61 6e 20 69 6e 73 74 61 6e 63  reate an instanc
0d00: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 73 74 72  e.** of this str
0d10: 75 63 74 75 72 65 20 61 6e 64 20 78 44 65 73 74  ucture and xDest
0d20: 72 6f 79 20 61 6e 64 20 78 44 69 73 63 6f 6e 6e  roy and xDisconn
0d30: 65 63 74 20 66 72 65 65 20 74 68 61 74 20 69 6e  ect free that in
0d40: 73 74 61 6e 63 65 2e 0a 2a 2a 20 41 6c 6c 20 6f  stance..** All o
0d50: 74 68 65 72 20 6d 65 74 68 6f 64 73 20 72 65 63  ther methods rec
0d60: 65 69 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  eive a pointer t
0d70: 6f 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  o the structure 
0d80: 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 69 72 0a  as one of their.
0d90: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
0da0: 0a 73 74 72 75 63 74 20 46 74 73 33 54 61 62 6c  .struct Fts3Tabl
0db0: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  e {.  sqlite3_vt
0dc0: 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  ab base;        
0dd0: 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c        /* Base cl
0de0: 61 73 73 20 75 73 65 64 20 62 79 20 53 51 4c 69  ass used by SQLi
0df0: 74 65 20 63 6f 72 65 20 2a 2f 0a 20 20 73 71 6c  te core */.  sql
0e00: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e20: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
0e30: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
0e40: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e60: 6c 6f 67 69 63 61 6c 20 64 61 74 61 62 61 73 65  logical database
0e70: 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
0e80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
0e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76 69             /* vi
0ea0: 72 74 75 61 6c 20 74 61 62 6c 65 20 6e 61 6d 65  rtual table name
0eb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
0ec0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
0ed0: 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20        /* number 
0ee0: 6f 66 20 6e 61 6d 65 64 20 63 6f 6c 75 6d 6e 73  of named columns
0ef0: 20 69 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c   in virtual tabl
0f00: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  e */.  char **az
0f10: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
0f20: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e         /* column
0f30: 20 6e 61 6d 65 73 2e 20 20 6d 61 6c 6c 6f 63 65   names.  malloce
0f40: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 74  d */.  sqlite3_t
0f50: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e  okenizer *pToken
0f60: 69 7a 65 72 3b 20 20 2f 2a 20 74 6f 6b 65 6e 69  izer;  /* tokeni
0f70: 7a 65 72 20 66 6f 72 20 69 6e 73 65 72 74 73 20  zer for inserts 
0f80: 61 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a  and queries */..
0f90: 20 20 2f 2a 20 50 72 65 63 6f 6d 70 69 6c 65 64    /* Precompiled
0fa0: 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 65 64   statements used
0fb0: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
0fc0: 74 61 74 69 6f 6e 2e 20 45 61 63 68 20 6f 66 20  tation. Each of 
0fd0: 74 68 65 73 65 20 0a 20 20 2a 2a 20 73 74 61 74  these .  ** stat
0fe0: 65 6d 65 6e 74 73 20 69 73 20 72 75 6e 20 61 6e  ements is run an
0ff0: 64 20 72 65 73 65 74 20 77 69 74 68 69 6e 20 61  d reset within a
1000: 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c 20   single virtual 
1010: 74 61 62 6c 65 20 41 50 49 20 63 61 6c 6c 2e 20  table API call. 
1020: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1030: 73 74 6d 74 20 2a 61 53 74 6d 74 5b 32 34 5d 3b  stmt *aStmt[24];
1040: 0a 0a 20 20 63 68 61 72 20 2a 7a 52 65 61 64 45  ..  char *zReadE
1050: 78 70 72 6c 69 73 74 3b 0a 20 20 63 68 61 72 20  xprlist;.  char 
1060: 2a 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74 3b  *zWriteExprlist;
1070: 0a 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 53 69 7a  ..  int nNodeSiz
1080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1090: 20 20 20 20 2f 2a 20 53 6f 66 74 20 6c 69 6d 69      /* Soft limi
10a0: 74 20 66 6f 72 20 6e 6f 64 65 20 73 69 7a 65 20  t for node size 
10b0: 2a 2f 0a 20 20 75 38 20 62 48 61 73 53 74 61 74  */.  u8 bHasStat
10c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
10e0: 25 5f 73 74 61 74 20 74 61 62 6c 65 20 65 78 69  %_stat table exi
10f0: 73 74 73 20 2a 2f 0a 20 20 75 38 20 62 48 61 73  sts */.  u8 bHas
1100: 44 6f 63 73 69 7a 65 3b 20 20 20 20 20 20 20 20  Docsize;        
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1120: 20 69 66 20 25 5f 64 6f 63 73 69 7a 65 20 74 61   if %_docsize ta
1130: 62 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ble exists */.  
1140: 69 6e 74 20 6e 50 67 73 7a 3b 20 20 20 20 20 20  int nPgsz;      
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 66 6f 72  /* Page size for
1170: 20 68 6f 73 74 20 64 61 74 61 62 61 73 65 20 2a   host database *
1180: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 65 67 6d 65  /.  char *zSegme
1190: 6e 74 73 54 62 6c 3b 20 20 20 20 20 20 20 20 20  ntsTbl;         
11a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 25      /* Name of %
11b0: 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
11c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
11d0: 62 20 2a 70 53 65 67 6d 65 6e 74 73 3b 20 20 20  b *pSegments;   
11e0: 20 20 20 20 20 2f 2a 20 42 6c 6f 62 20 68 61 6e       /* Blob han
11f0: 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 25 5f 73 65  dle open on %_se
1200: 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a  gments table */.
1210: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1220: 69 6e 67 20 68 61 73 68 20 74 61 62 6c 65 20 69  ing hash table i
1230: 73 20 75 73 65 64 20 74 6f 20 62 75 66 66 65 72  s used to buffer
1240: 20 70 65 6e 64 69 6e 67 20 69 6e 64 65 78 20 75   pending index u
1250: 70 64 61 74 65 73 20 64 75 72 69 6e 67 0a 20 20  pdates during.  
1260: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ** transactions.
1270: 20 56 61 72 69 61 62 6c 65 20 6e 50 65 6e 64 69   Variable nPendi
1280: 6e 67 44 61 74 61 20 65 73 74 69 6d 61 74 65 73  ngData estimates
1290: 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 69 7a 65   the memory size
12a0: 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 65   of the .  ** pe
12b0: 6e 64 69 6e 67 20 64 61 74 61 2c 20 69 6e 63 6c  nding data, incl
12c0: 75 64 69 6e 67 20 68 61 73 68 20 74 61 62 6c 65  uding hash table
12d0: 20 6f 76 65 72 68 65 61 64 2c 20 62 75 74 20 6e   overhead, but n
12e0: 6f 74 20 6d 61 6c 6c 6f 63 20 6f 76 65 72 68 65  ot malloc overhe
12f0: 61 64 2e 20 0a 20 20 2a 2a 20 57 68 65 6e 20 6e  ad. .  ** When n
1300: 50 65 6e 64 69 6e 67 44 61 74 61 20 65 78 63 65  PendingData exce
1310: 65 64 73 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44  eds nMaxPendingD
1320: 61 74 61 2c 20 74 68 65 20 62 75 66 66 65 72 20  ata, the buffer 
1330: 69 73 20 66 6c 75 73 68 65 64 20 0a 20 20 2a 2a  is flushed .  **
1340: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
1350: 56 61 72 69 61 62 6c 65 20 69 50 72 65 76 44 6f  Variable iPrevDo
1360: 63 69 64 20 69 73 20 74 68 65 20 64 6f 63 69 64  cid is the docid
1370: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
1380: 65 6e 74 6c 79 0a 20 20 2a 2a 20 69 6e 73 65 72  ently.  ** inser
1390: 74 65 64 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f  ted record..  */
13a0: 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69  .  int nMaxPendi
13b0: 6e 67 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 50  ngData;.  int nP
13c0: 65 6e 64 69 6e 67 44 61 74 61 3b 0a 20 20 73 71  endingData;.  sq
13d0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 50 72 65 76  lite_int64 iPrev
13e0: 44 6f 63 69 64 3b 0a 20 20 46 74 73 33 48 61 73  Docid;.  Fts3Has
13f0: 68 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 3b 0a  h pendingTerms;.
1400: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  };../*.** When t
1410: 68 65 20 63 6f 72 65 20 77 61 6e 74 73 20 74 6f  he core wants to
1420: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 76   read from the v
1430: 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 74  irtual table, it
1440: 20 63 72 65 61 74 65 73 20 61 0a 2a 2a 20 76 69   creates a.** vi
1450: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
1460: 6f 72 20 28 61 6e 20 69 6e 73 74 61 6e 63 65 20  or (an instance 
1470: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1480: 20 73 74 72 75 63 74 75 72 65 29 20 75 73 69 6e   structure) usin
1490: 67 0a 2a 2a 20 74 68 65 20 78 4f 70 65 6e 20 6d  g.** the xOpen m
14a0: 65 74 68 6f 64 2e 20 43 75 72 73 6f 72 73 20 61  ethod. Cursors a
14b0: 72 65 20 64 65 73 74 72 6f 79 65 64 20 75 73 69  re destroyed usi
14c0: 6e 67 20 74 68 65 20 78 43 6c 6f 73 65 20 6d 65  ng the xClose me
14d0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  thod..*/.struct 
14e0: 46 74 73 33 43 75 72 73 6f 72 20 7b 0a 20 20 73  Fts3Cursor {.  s
14f0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
1500: 6f 72 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f  or base;       /
1510: 2a 20 42 61 73 65 20 63 6c 61 73 73 20 75 73 65  * Base class use
1520: 64 20 62 79 20 53 51 4c 69 74 65 20 63 6f 72 65  d by SQLite core
1530: 20 2a 2f 0a 20 20 69 31 36 20 65 53 65 61 72 63   */.  i16 eSearc
1540: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1550: 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
1560: 73 74 72 61 74 65 67 79 20 28 73 65 65 20 62 65  strategy (see be
1570: 6c 6f 77 29 20 2a 2f 0a 20 20 75 38 20 69 73 45  low) */.  u8 isE
1580: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
1590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15a0: 65 20 69 66 20 61 74 20 45 6e 64 20 4f 66 20 52  e if at End Of R
15b0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 75 38 20 69  esults */.  u8 i
15c0: 73 52 65 71 75 69 72 65 53 65 65 6b 3b 20 20 20  sRequireSeek;   
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15e0: 72 75 65 20 69 66 20 6d 75 73 74 20 73 65 65 6b  rue if must seek
15f0: 20 70 53 74 6d 74 20 74 6f 20 25 5f 63 6f 6e 74   pStmt to %_cont
1600: 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 73 71 6c  ent row */.  sql
1610: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1630: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
1640: 6e 74 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  nt in use by the
1650: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74 73   cursor */.  Fts
1660: 33 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20  3Expr *pExpr;   
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1680: 50 61 72 73 65 64 20 4d 41 54 43 48 20 71 75 65  Parsed MATCH que
1690: 72 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69  ry string */.  i
16a0: 6e 74 20 6e 50 68 72 61 73 65 3b 20 20 20 20 20  nt nPhrase;     
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
16d0: 68 61 62 6c 65 20 70 68 72 61 73 65 73 20 69 6e  hable phrases in
16e0: 20 71 75 65 72 79 20 2a 2f 0a 20 20 46 74 73 33   query */.  Fts3
16f0: 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70  DeferredToken *p
1700: 44 65 66 65 72 72 65 64 3b 20 20 20 2f 2a 20 44  Deferred;   /* D
1710: 65 66 65 72 72 65 64 20 73 65 61 72 63 68 20 74  eferred search t
1720: 6f 6b 65 6e 73 2c 20 69 66 20 61 6e 79 20 2a 2f  okens, if any */
1730: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1740: 20 69 50 72 65 76 49 64 3b 20 20 20 20 20 20 20   iPrevId;       
1750: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 69     /* Previous i
1760: 64 20 72 65 61 64 20 66 72 6f 6d 20 61 44 6f 63  d read from aDoc
1770: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
1780: 70 4e 65 78 74 49 64 3b 20 20 20 20 20 20 20 20  pNextId;        
1790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
17a0: 6e 74 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f  nter into the bo
17b0: 64 79 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 2a  dy of aDoclist *
17c0: 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  /.  char *aDocli
17d0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
17e0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64      /* List of d
17f0: 6f 63 69 64 73 20 66 6f 72 20 66 75 6c 6c 2d 74  ocids for full-t
1800: 65 78 74 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ext queries */. 
1810: 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20   int nDoclist;  
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
1840: 65 72 20 61 74 20 61 44 6f 63 6c 69 73 74 20 2a  er at aDoclist *
1850: 2f 0a 20 20 69 6e 74 20 65 45 76 61 6c 6d 6f 64  /.  int eEvalmod
1860: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1870: 20 20 20 20 2f 2a 20 41 6e 20 46 54 53 33 5f 45      /* An FTS3_E
1880: 56 41 4c 5f 58 58 20 63 6f 6e 73 74 61 6e 74 20  VAL_XX constant 
1890: 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 41 76 67  */.  int nRowAvg
18a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18b0: 20 20 20 20 20 2f 2a 20 41 76 65 72 61 67 65 20       /* Average 
18c0: 73 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  size of database
18d0: 20 72 6f 77 73 2c 20 69 6e 20 70 61 67 65 73 20   rows, in pages 
18e0: 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 4d 61 74 63  */..  int isMatc
18f0: 68 69 6e 66 6f 4e 65 65 64 65 64 3b 20 20 20 20  hinfoNeeded;    
1900: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 68        /* True wh
1910: 65 6e 20 61 4d 61 74 63 68 69 6e 66 6f 5b 5d 20  en aMatchinfo[] 
1920: 6e 65 65 64 73 20 66 69 6c 6c 69 6e 67 20 69 6e  needs filling in
1930: 20 2a 2f 0a 20 20 75 33 32 20 2a 61 4d 61 74 63   */.  u32 *aMatc
1940: 68 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  hinfo;          
1950: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
1960: 74 69 6f 6e 20 61 62 6f 75 74 20 6d 6f 73 74 20  tion about most 
1970: 72 65 63 65 6e 74 20 6d 61 74 63 68 20 2a 2f 0a  recent match */.
1980: 20 20 69 6e 74 20 6e 4d 61 74 63 68 69 6e 66 6f    int nMatchinfo
1990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
19b0: 6c 65 6d 65 6e 74 73 20 69 6e 20 61 4d 61 74 63  lements in aMatc
19c0: 68 69 6e 66 6f 5b 5d 20 2a 2f 0a 20 20 63 68 61  hinfo[] */.  cha
19d0: 72 20 2a 7a 4d 61 74 63 68 69 6e 66 6f 3b 20 20  r *zMatchinfo;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f0: 4d 61 74 63 68 69 6e 66 6f 20 73 70 65 63 69 66  Matchinfo specif
1a00: 69 63 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23  ication */.};..#
1a10: 64 65 66 69 6e 65 20 46 54 53 33 5f 45 56 41 4c  define FTS3_EVAL
1a20: 5f 46 49 4c 54 45 52 20 20 20 20 30 0a 23 64 65  _FILTER    0.#de
1a30: 66 69 6e 65 20 46 54 53 33 5f 45 56 41 4c 5f 4e  fine FTS3_EVAL_N
1a40: 45 58 54 20 20 20 20 20 20 31 0a 23 64 65 66 69  EXT      1.#defi
1a50: 6e 65 20 46 54 53 33 5f 45 56 41 4c 5f 4d 41 54  ne FTS3_EVAL_MAT
1a60: 43 48 49 4e 46 4f 20 32 0a 0a 2f 2a 0a 2a 2a 20  CHINFO 2../*.** 
1a70: 54 68 65 20 46 74 73 33 43 75 72 73 6f 72 2e 65  The Fts3Cursor.e
1a80: 53 65 61 72 63 68 20 6d 65 6d 62 65 72 20 69 73  Search member is
1a90: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f   always set to o
1aa0: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
1ab0: 69 6e 67 2e 0a 2a 2a 20 41 63 74 75 61 6c 79 2c  ing..** Actualy,
1ac0: 20 46 74 73 33 43 75 72 73 6f 72 2e 65 53 65 61   Fts3Cursor.eSea
1ad0: 72 63 68 20 63 61 6e 20 62 65 20 67 72 65 61 74  rch can be great
1ae0: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1af0: 20 74 6f 0a 2a 2a 20 46 54 53 33 5f 46 55 4c 4c   to.** FTS3_FULL
1b00: 54 45 58 54 5f 53 45 41 52 43 48 2e 20 20 49 66  TEXT_SEARCH.  If
1b10: 20 73 6f 2c 20 74 68 65 6e 20 46 74 73 33 43 75   so, then Fts3Cu
1b20: 72 73 6f 72 2e 65 53 65 61 72 63 68 20 2d 20 32  rsor.eSearch - 2
1b30: 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   is the index.**
1b40: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
1b50: 6f 20 62 65 20 73 65 61 72 63 68 65 64 2e 20 20  o be searched.  
1b60: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 0a  For example, in.
1b70: 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45  **.**     CREATE
1b80: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65   VIRTUAL TABLE e
1b90: 78 31 20 55 53 49 4e 47 20 66 74 73 33 28 61 2c  x1 USING fts3(a,
1ba0: 62 2c 63 2c 64 29 3b 0a 2a 2a 20 20 20 20 20 53  b,c,d);.**     S
1bb0: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
1bc0: 20 65 78 31 20 57 48 45 52 45 20 62 20 4d 41 54   ex1 WHERE b MAT
1bd0: 43 48 20 27 6f 6e 65 20 74 77 6f 20 74 68 72 65  CH 'one two thre
1be0: 65 27 3b 0a 2a 2a 20 0a 2a 2a 20 42 65 63 61 75  e';.** .** Becau
1bf0: 73 65 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  se the LHS of th
1c00: 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72  e MATCH operator
1c10: 20 69 73 20 32 6e 64 20 63 6f 6c 75 6d 6e 20 22   is 2nd column "
1c20: 62 22 2c 0a 2a 2a 20 46 74 73 33 43 75 72 73 6f  b",.** Fts3Curso
1c30: 72 2e 65 53 65 61 72 63 68 20 77 69 6c 6c 20 62  r.eSearch will b
1c40: 65 20 73 65 74 20 74 6f 20 46 54 53 33 5f 46 55  e set to FTS3_FU
1c50: 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 2b 31 2e  LLTEXT_SEARCH+1.
1c60: 20 20 28 2b 30 20 66 6f 72 20 61 2c 0a 2a 2a 20    (+0 for a,.** 
1c70: 2b 31 20 66 6f 72 20 62 2c 20 2b 32 20 66 6f 72  +1 for b, +2 for
1c80: 20 63 2c 20 2b 33 20 66 6f 72 20 64 2e 29 20 20   c, +3 for d.)  
1c90: 49 66 20 74 68 65 20 4c 48 53 20 6f 66 20 4d 41  If the LHS of MA
1ca0: 54 43 48 20 77 65 72 65 20 22 65 78 31 22 20 0a  TCH were "ex1" .
1cb0: 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ** indicating th
1cc0: 61 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 73  at all columns s
1cd0: 68 6f 75 6c 64 20 62 65 20 73 65 61 72 63 68 65  hould be searche
1ce0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 65 53 65 61 72  d,.** then eSear
1cf0: 63 68 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20  ch would be set 
1d00: 74 6f 20 46 54 53 33 5f 46 55 4c 4c 54 45 58 54  to FTS3_FULLTEXT
1d10: 5f 53 45 41 52 43 48 2b 34 2e 0a 2a 2f 0a 23 64  _SEARCH+4..*/.#d
1d20: 65 66 69 6e 65 20 46 54 53 33 5f 46 55 4c 4c 53  efine FTS3_FULLS
1d30: 43 41 4e 5f 53 45 41 52 43 48 20 30 20 20 20 20  CAN_SEARCH 0    
1d40: 2f 2a 20 4c 69 6e 65 61 72 20 73 63 61 6e 20 6f  /* Linear scan o
1d50: 66 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c  f %_content tabl
1d60: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  e */.#define FTS
1d70: 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20 20  3_DOCID_SEARCH  
1d80: 20 20 31 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70    1    /* Lookup
1d90: 20 62 79 20 72 6f 77 69 64 20 6f 6e 20 25 5f 63   by rowid on %_c
1da0: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  ontent table */.
1db0: 23 64 65 66 69 6e 65 20 46 54 53 33 5f 46 55 4c  #define FTS3_FUL
1dc0: 4c 54 45 58 54 5f 53 45 41 52 43 48 20 32 20 20  LTEXT_SEARCH 2  
1dd0: 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 69    /* Full-text i
1de0: 6e 64 65 78 20 73 65 61 72 63 68 20 2a 2f 0a 0a  ndex search */..
1df0: 2f 2a 0a 2a 2a 20 41 20 22 70 68 72 61 73 65 22  /*.** A "phrase"
1e00: 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
1e10: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f  f one or more to
1e20: 6b 65 6e 73 20 74 68 61 74 20 6d 75 73 74 20 6d  kens that must m
1e30: 61 74 63 68 20 69 6e 0a 2a 2a 20 73 65 71 75 65  atch in.** seque
1e40: 6e 63 65 2e 20 20 41 20 73 69 6e 67 6c 65 20 74  nce.  A single t
1e50: 6f 6b 65 6e 20 69 73 20 74 68 65 20 62 61 73 65  oken is the base
1e60: 20 63 61 73 65 20 61 6e 64 20 74 68 65 20 6d 6f   case and the mo
1e70: 73 74 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  st common case..
1e80: 2a 2a 20 46 6f 72 20 61 20 73 65 71 75 65 6e 63  ** For a sequenc
1e90: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 63 6f 6e 74  e of tokens cont
1ea0: 61 69 6e 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d  ained in double-
1eb0: 71 75 6f 74 65 73 20 28 69 2e 65 2e 20 22 6f 6e  quotes (i.e. "on
1ec0: 65 20 74 77 6f 20 74 68 72 65 65 22 29 0a 2a 2a  e two three").**
1ed0: 20 6e 54 6f 6b 65 6e 20 77 69 6c 6c 20 62 65 20   nToken will be 
1ee0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  the number of to
1ef0: 6b 65 6e 73 20 69 6e 20 74 68 65 20 73 74 72 69  kens in the stri
1f00: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 44  ng..**.** The nD
1f10: 6f 63 4d 61 74 63 68 20 61 6e 64 20 6e 4d 61 74  ocMatch and nMat
1f20: 63 68 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e  ch variables con
1f30: 74 61 69 6e 20 64 61 74 61 20 74 68 61 74 20 6d  tain data that m
1f40: 61 79 20 62 65 20 75 73 65 64 20 62 79 20 74 68  ay be used by th
1f50: 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 66 6f 28 29  e.** matchinfo()
1f60: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 79 20   function. They 
1f70: 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 77 68  are populated wh
1f80: 65 6e 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  en the full-text
1f90: 20 69 6e 64 65 78 20 69 73 20 0a 2a 2a 20 71 75   index is .** qu
1fa0: 65 72 69 65 64 20 66 6f 72 20 68 69 74 73 20 6f  eried for hits o
1fb0: 6e 20 74 68 65 20 70 68 72 61 73 65 2e 20 49 66  n the phrase. If
1fc0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b   one or more tok
1fd0: 65 6e 73 20 69 6e 20 74 68 65 20 70 68 72 61 73  ens in the phras
1fe0: 65 0a 2a 2a 20 61 72 65 20 64 65 66 65 72 72 65  e.** are deferre
1ff0: 64 2c 20 74 68 65 20 6e 44 6f 63 4d 61 74 63 68  d, the nDocMatch
2000: 20 61 6e 64 20 6e 4d 61 74 63 68 20 76 61 72 69   and nMatch vari
2010: 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75 6c 61  ables are popula
2020: 74 65 64 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20  ted based.** on 
2030: 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 74  the assumption t
2040: 68 61 74 20 74 68 65 20 0a 2a 2f 0a 73 74 72 75  hat the .*/.stru
2050: 63 74 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b  ct Fts3PhraseTok
2060: 65 6e 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20  en {.  char *z; 
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2090: 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20  f the token */. 
20a0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
20d0: 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 7a 20  tes in buffer z 
20e0: 2a 2f 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69  */.  int isPrefi
20f0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2100: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2110: 74 6f 6b 65 6e 20 65 6e 64 73 20 77 69 74 68 20  token ends with 
2120: 61 20 22 2a 22 20 63 68 61 72 61 63 74 65 72 20  a "*" character 
2130: 2a 2f 0a 20 20 69 6e 74 20 62 46 75 6c 6c 74 65  */.  int bFullte
2140: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
2150: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2160: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
2170: 77 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 46 74  was used */.  Ft
2180: 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  s3SegReaderCurso
2190: 72 20 2a 70 53 65 67 63 73 72 3b 20 20 20 2f 2a  r *pSegcsr;   /*
21a0: 20 53 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 20   Segment-reader 
21b0: 66 6f 72 20 74 68 69 73 20 74 6f 6b 65 6e 20 2a  for this token *
21c0: 2f 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64  /.  Fts3Deferred
21d0: 54 6f 6b 65 6e 20 2a 70 44 65 66 65 72 72 65 64  Token *pDeferred
21e0: 3b 20 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20  ;   /* Deferred 
21f0: 74 6f 6b 65 6e 20 6f 62 6a 65 63 74 20 66 6f 72  token object for
2200: 20 74 68 69 73 20 74 6f 6b 65 6e 20 2a 2f 0a 7d   this token */.}
2210: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 33 50 68  ;..struct Fts3Ph
2220: 72 61 73 65 20 7b 0a 20 20 2f 2a 20 56 61 72 69  rase {.  /* Vari
2230: 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20  ables populated 
2240: 62 79 20 66 74 73 33 5f 65 78 70 72 2e 63 20 77  by fts3_expr.c w
2250: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 4d 41  hen parsing a MA
2260: 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  TCH expression *
2270: 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 20  /.  int nToken; 
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2290: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  * Number of toke
22a0: 6e 73 20 69 6e 20 74 68 65 20 70 68 72 61 73 65  ns in the phrase
22b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
22c0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
22d0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
22e0: 75 6d 6e 20 74 68 69 73 20 70 68 72 61 73 65 20  umn this phrase 
22f0: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20  must match */.  
2300: 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20  int isNot;      
2310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68             /* Ph
2320: 72 61 73 65 20 70 72 65 66 69 78 65 64 20 62 79  rase prefixed by
2330: 20 75 6e 61 72 79 20 6e 6f 74 20 28 2d 29 20 6f   unary not (-) o
2340: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73  perator */.  Fts
2350: 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 61 54 6f  3PhraseToken aTo
2360: 6b 65 6e 5b 31 5d 3b 20 2f 2a 20 4f 6e 65 20 65  ken[1]; /* One e
2370: 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 74 6f  ntry for each to
2380: 6b 65 6e 20 69 6e 20 74 68 65 20 70 68 72 61 73  ken in the phras
2390: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
23a0: 20 74 72 65 65 20 6f 66 20 74 68 65 73 65 20 6f   tree of these o
23b0: 62 6a 65 63 74 73 20 66 6f 72 6d 73 20 74 68 65  bjects forms the
23c0: 20 52 48 53 20 6f 66 20 61 20 4d 41 54 43 48 20   RHS of a MATCH 
23d0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
23e0: 49 66 20 46 74 73 33 45 78 70 72 2e 65 54 79 70  If Fts3Expr.eTyp
23f0: 65 20 69 73 20 65 69 74 68 65 72 20 46 54 53 51  e is either FTSQ
2400: 55 45 52 59 5f 4e 45 41 52 20 6f 72 20 46 54 53  UERY_NEAR or FTS
2410: 51 55 45 52 59 5f 50 48 52 41 53 45 20 61 6e 64  QUERY_PHRASE and
2420: 20 69 73 4c 6f 61 64 65 64 0a 2a 2a 20 69 73 20   isLoaded.** is 
2430: 74 72 75 65 2c 20 74 68 65 6e 20 61 44 6f 63 6c  true, then aDocl
2440: 69 73 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ist points to a 
2450: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 2c  malloced buffer,
2460: 20 73 69 7a 65 20 6e 44 6f 63 6c 69 73 74 20 62   size nDoclist b
2470: 79 74 65 73 2c 20 0a 2a 2a 20 63 6f 6e 74 61 69  ytes, .** contai
2480: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ning the results
2490: 20 6f 66 20 74 68 65 20 4e 45 41 52 20 6f 72 20   of the NEAR or 
24a0: 70 68 72 61 73 65 20 71 75 65 72 79 20 69 6e 20  phrase query in 
24b0: 46 54 53 33 20 64 6f 63 6c 69 73 74 0a 2a 2a 20  FTS3 doclist.** 
24c0: 66 6f 72 6d 61 74 2e 20 41 73 20 75 73 75 61 6c  format. As usual
24d0: 2c 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 4c  , the initial "L
24e0: 65 6e 67 74 68 22 20 66 69 65 6c 64 20 66 6f 75  ength" field fou
24f0: 6e 64 20 69 6e 20 64 6f 63 6c 69 73 74 73 20 73  nd in doclists s
2500: 74 6f 72 65 64 0a 2a 2a 20 6f 6e 20 64 69 73 6b  tored.** on disk
2510: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
2520: 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a   this buffer..**
2530: 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 70 43 75  .** Variable pCu
2540: 72 72 65 6e 74 20 61 6c 77 61 79 73 20 70 6f 69  rrent always poi
2550: 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
2560: 20 6f 66 20 61 20 64 6f 63 69 64 20 66 69 65 6c   of a docid fiel
2570: 64 20 77 69 74 68 69 6e 0a 2a 2a 20 61 44 6f 63  d within.** aDoc
2580: 6c 69 73 74 2e 20 53 69 6e 63 65 20 74 68 65 20  list. Since the 
2590: 64 6f 63 6c 69 73 74 20 69 73 20 75 73 75 61 6c  doclist is usual
25a0: 6c 79 20 73 63 61 6e 6e 65 64 20 69 6e 20 64 6f  ly scanned in do
25b0: 63 69 64 20 6f 72 64 65 72 2c 20 74 68 69 73 20  cid order, this 
25c0: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
25d0: 6f 20 61 63 63 65 6c 65 72 61 74 65 20 73 65 65  o accelerate see
25e0: 6b 69 6e 67 20 74 6f 20 74 68 65 20 72 65 71 75  king to the requ
25f0: 69 72 65 64 20 64 6f 63 69 64 20 77 69 74 68 69  ired docid withi
2600: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a  n the doclist..*
2610: 2f 0a 73 74 72 75 63 74 20 46 74 73 33 45 78 70  /.struct Fts3Exp
2620: 72 20 7b 0a 20 20 69 6e 74 20 65 54 79 70 65 3b  r {.  int eType;
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 46   /* One of the F
2650: 54 53 51 55 45 52 59 5f 58 58 58 20 76 61 6c 75  TSQUERY_XXX valu
2660: 65 73 20 64 65 66 69 6e 65 64 20 62 65 6c 6f 77  es defined below
2670: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 61 72 3b   */.  int nNear;
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 2f 2a 20 56 61 6c 69 64 20 69 66 20 65 54 79   /* Valid if eTy
26a0: 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
26b0: 52 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20  R */.  Fts3Expr 
26c0: 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
26d0: 20 20 2f 2a 20 70 50 61 72 65 6e 74 2d 3e 70 4c    /* pParent->pL
26e0: 65 66 74 3d 3d 74 68 69 73 20 6f 72 20 70 50 61  eft==this or pPa
26f0: 72 65 6e 74 2d 3e 70 52 69 67 68 74 3d 3d 74 68  rent->pRight==th
2700: 69 73 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  is */.  Fts3Expr
2710: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
2720: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
2730: 6e 64 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  nd */.  Fts3Expr
2740: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20   *pRight;       
2750: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
2760: 61 6e 64 20 2a 2f 0a 20 20 46 74 73 33 50 68 72  and */.  Fts3Phr
2770: 61 73 65 20 2a 70 50 68 72 61 73 65 3b 20 20 20  ase *pPhrase;   
2780: 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 69 66 20      /* Valid if 
2790: 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f  eType==FTSQUERY_
27a0: 50 48 52 41 53 45 20 2a 2f 0a 0a 20 20 69 6e 74  PHRASE */..  int
27b0: 20 69 73 4c 6f 61 64 65 64 3b 20 20 20 20 20 20   isLoaded;      
27c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27d0: 69 66 20 61 44 6f 63 6c 69 73 74 2f 6e 44 6f 63  if aDoclist/nDoc
27e0: 6c 69 73 74 20 61 72 65 20 69 6e 69 74 69 61 6c  list are initial
27f0: 69 7a 65 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20  ized. */.  char 
2800: 2a 61 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  *aDoclist;      
2810: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
2820: 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c 69  containing docli
2830: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63  st */.  int nDoc
2840: 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
2850: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44     /* Size of aD
2860: 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  oclist in bytes 
2870: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  */..  sqlite3_in
2880: 74 36 34 20 69 43 75 72 72 65 6e 74 3b 0a 20 20  t64 iCurrent;.  
2890: 63 68 61 72 20 2a 70 43 75 72 72 65 6e 74 3b 0a  char *pCurrent;.
28a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6e 64 69 64  };../*.** Candid
28b0: 61 74 65 20 76 61 6c 75 65 73 20 66 6f 72 20 46  ate values for F
28c0: 74 73 33 51 75 65 72 79 2e 65 54 79 70 65 2e 20  ts3Query.eType. 
28d0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6f 72  Note that the or
28e0: 64 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  der of the first
28f0: 0a 2a 2a 20 66 6f 75 72 20 76 61 6c 75 65 73 20  .** four values 
2900: 69 73 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 70  is in order of p
2910: 72 65 63 65 64 65 6e 63 65 20 77 68 65 6e 20 70  recedence when p
2920: 61 72 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f  arsing expressio
2930: 6e 73 2e 20 46 6f 72 20 0a 2a 2a 20 65 78 61 6d  ns. For .** exam
2940: 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ple, the followi
2950: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 20 4f  ng:.**.**   "a O
2960: 52 20 62 20 41 4e 44 20 63 20 4e 4f 54 20 64 20  R b AND c NOT d 
2970: 4e 45 41 52 20 65 22 0a 2a 2a 0a 2a 2a 20 69 73  NEAR e".**.** is
2980: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
2990: 2a 2a 0a 2a 2a 20 20 20 22 61 20 4f 52 20 28 62  **.**   "a OR (b
29a0: 20 41 4e 44 20 28 63 20 4e 4f 54 20 28 64 20 4e   AND (c NOT (d N
29b0: 45 41 52 20 65 29 29 29 22 0a 2a 2f 0a 23 64 65  EAR e)))".*/.#de
29c0: 66 69 6e 65 20 46 54 53 51 55 45 52 59 5f 4e 45  fine FTSQUERY_NE
29d0: 41 52 20 20 20 31 0a 23 64 65 66 69 6e 65 20 46  AR   1.#define F
29e0: 54 53 51 55 45 52 59 5f 4e 4f 54 20 20 20 20 32  TSQUERY_NOT    2
29f0: 0a 23 64 65 66 69 6e 65 20 46 54 53 51 55 45 52  .#define FTSQUER
2a00: 59 5f 41 4e 44 20 20 20 20 33 0a 23 64 65 66 69  Y_AND    3.#defi
2a10: 6e 65 20 46 54 53 51 55 45 52 59 5f 4f 52 20 20  ne FTSQUERY_OR  
2a20: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 46 54 53     4.#define FTS
2a30: 51 55 45 52 59 5f 50 48 52 41 53 45 20 35 0a 0a  QUERY_PHRASE 5..
2a40: 0a 2f 2a 20 66 74 73 33 5f 77 72 69 74 65 2e 63  ./* fts3_write.c
2a50: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46   */.int sqlite3F
2a60: 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28  ts3UpdateMethod(
2a70: 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 2c 69 6e  sqlite3_vtab*,in
2a80: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
2a90: 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *,sqlite3_int64*
2aa0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
2ab0: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c  s3PendingTermsFl
2ac0: 75 73 68 28 46 74 73 33 54 61 62 6c 65 20 2a 29  ush(Fts3Table *)
2ad0: 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ;.void sqlite3Ft
2ae0: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c  s3PendingTermsCl
2af0: 65 61 72 28 46 74 73 33 54 61 62 6c 65 20 2a 29  ear(Fts3Table *)
2b00: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
2b10: 33 4f 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61  3Optimize(Fts3Ta
2b20: 62 6c 65 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69  ble *);.int sqli
2b30: 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
2b40: 4e 65 77 28 69 6e 74 2c 20 73 71 6c 69 74 65 33  New(int, sqlite3
2b50: 5f 69 6e 74 36 34 2c 0a 20 20 73 71 6c 69 74 65  _int64,.  sqlite
2b60: 33 5f 69 6e 74 36 34 2c 20 73 71 6c 69 74 65 33  3_int64, sqlite3
2b70: 5f 69 6e 74 36 34 2c 20 63 6f 6e 73 74 20 63 68  _int64, const ch
2b80: 61 72 20 2a 2c 20 69 6e 74 2c 20 46 74 73 33 53  ar *, int, Fts3S
2b90: 65 67 52 65 61 64 65 72 2a 2a 29 3b 0a 69 6e 74  egReader**);.int
2ba0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
2bb0: 65 61 64 65 72 50 65 6e 64 69 6e 67 28 46 74 73  eaderPending(Fts
2bc0: 33 54 61 62 6c 65 2a 2c 63 6f 6e 73 74 20 63 68  3Table*,const ch
2bd0: 61 72 2a 2c 69 6e 74 2c 69 6e 74 2c 46 74 73 33  ar*,int,int,Fts3
2be0: 53 65 67 52 65 61 64 65 72 2a 2a 29 3b 0a 76 6f  SegReader**);.vo
2bf0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  id sqlite3Fts3Se
2c00: 67 52 65 61 64 65 72 46 72 65 65 28 46 74 73 33  gReaderFree(Fts3
2c10: 53 65 67 52 65 61 64 65 72 20 2a 29 3b 0a 69 6e  SegReader *);.in
2c20: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
2c30: 52 65 61 64 65 72 43 6f 73 74 28 46 74 73 33 43  ReaderCost(Fts3C
2c40: 75 72 73 6f 72 20 2a 2c 20 46 74 73 33 53 65 67  ursor *, Fts3Seg
2c50: 52 65 61 64 65 72 20 2a 2c 20 69 6e 74 20 2a 29  Reader *, int *)
2c60: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
2c70: 33 41 6c 6c 53 65 67 64 69 72 73 28 46 74 73 33  3AllSegdirs(Fts3
2c80: 54 61 62 6c 65 2a 2c 20 69 6e 74 2c 20 73 71 6c  Table*, int, sql
2c90: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 29 3b 0a 69  ite3_stmt **);.i
2ca0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 52 65  nt sqlite3Fts3Re
2cb0: 61 64 4c 6f 63 6b 28 46 74 73 33 54 61 62 6c 65  adLock(Fts3Table
2cc0: 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33   *);.int sqlite3
2cd0: 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 46 74  Fts3ReadBlock(Ft
2ce0: 73 33 54 61 62 6c 65 2a 2c 20 73 71 6c 69 74 65  s3Table*, sqlite
2cf0: 33 5f 69 6e 74 36 34 2c 20 63 68 61 72 20 2a 2a  3_int64, char **
2d00: 2c 20 69 6e 74 2a 29 3b 0a 0a 69 6e 74 20 73 71  , int*);..int sq
2d10: 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63 74 44  lite3Fts3SelectD
2d20: 6f 63 74 6f 74 61 6c 28 46 74 73 33 54 61 62 6c  octotal(Fts3Tabl
2d30: 65 20 2a 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d  e *, sqlite3_stm
2d40: 74 20 2a 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  t **);.int sqlit
2d50: 65 33 46 74 73 33 53 65 6c 65 63 74 44 6f 63 73  e3Fts3SelectDocs
2d60: 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20 2a 2c  ize(Fts3Table *,
2d70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 20   sqlite3_int64, 
2d80: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 29  sqlite3_stmt **)
2d90: 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  ;..void sqlite3F
2da0: 74 73 33 46 72 65 65 44 65 66 65 72 72 65 64 54  ts3FreeDeferredT
2db0: 6f 6b 65 6e 73 28 46 74 73 33 43 75 72 73 6f 72  okens(Fts3Cursor
2dc0: 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33   *);.int sqlite3
2dd0: 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 46  Fts3DeferToken(F
2de0: 74 73 33 43 75 72 73 6f 72 20 2a 2c 20 46 74 73  ts3Cursor *, Fts
2df0: 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 2c 20  3PhraseToken *, 
2e00: 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  int);.int sqlite
2e10: 33 46 74 73 33 43 61 63 68 65 44 65 66 65 72 72  3Fts3CacheDeferr
2e20: 65 64 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43  edDoclists(Fts3C
2e30: 75 72 73 6f 72 20 2a 29 3b 0a 76 6f 69 64 20 73  ursor *);.void s
2e40: 71 6c 69 74 65 33 46 74 73 33 46 72 65 65 44 65  qlite3Fts3FreeDe
2e50: 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 46  ferredDoclists(F
2e60: 74 73 33 43 75 72 73 6f 72 20 2a 29 3b 0a 63 68  ts3Cursor *);.ch
2e70: 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 33 44  ar *sqlite3Fts3D
2e80: 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 28 46  eferredDoclist(F
2e90: 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
2ea0: 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a 76 6f 69 64   *, int *);.void
2eb0: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d   sqlite3Fts3Segm
2ec0: 65 6e 74 73 43 6c 6f 73 65 28 46 74 73 33 54 61  entsClose(Fts3Ta
2ed0: 62 6c 65 20 2a 29 3b 0a 0a 23 64 65 66 69 6e 65  ble *);..#define
2ee0: 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f   FTS3_SEGCURSOR_
2ef0: 50 45 4e 44 49 4e 47 20 2d 31 0a 23 64 65 66 69  PENDING -1.#defi
2f00: 6e 65 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  ne FTS3_SEGCURSO
2f10: 52 5f 41 4c 4c 20 20 20 20 20 2d 32 0a 0a 69 6e  R_ALL     -2..in
2f20: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
2f30: 52 65 61 64 65 72 53 74 61 72 74 28 46 74 73 33  ReaderStart(Fts3
2f40: 54 61 62 6c 65 2a 2c 20 46 74 73 33 53 65 67 52  Table*, Fts3SegR
2f50: 65 61 64 65 72 43 75 72 73 6f 72 2a 2c 20 46 74  eaderCursor*, Ft
2f60: 73 33 53 65 67 46 69 6c 74 65 72 2a 29 3b 0a 69  s3SegFilter*);.i
2f70: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  nt sqlite3Fts3Se
2f80: 67 52 65 61 64 65 72 53 74 65 70 28 46 74 73 33  gReaderStep(Fts3
2f90: 54 61 62 6c 65 20 2a 2c 20 46 74 73 33 53 65 67  Table *, Fts3Seg
2fa0: 52 65 61 64 65 72 43 75 72 73 6f 72 20 2a 29 3b  ReaderCursor *);
2fb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
2fc0: 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73 68  3SegReaderFinish
2fd0: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  (Fts3SegReaderCu
2fe0: 72 73 6f 72 20 2a 29 3b 0a 69 6e 74 20 73 71 6c  rsor *);.int sql
2ff0: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
3000: 72 43 75 72 73 6f 72 28 0a 20 20 20 20 46 74 73  rCursor(.    Fts
3010: 33 54 61 62 6c 65 20 2a 2c 20 69 6e 74 2c 20 63  3Table *, int, c
3020: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
3030: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 46 74 73 33  , int, int, Fts3
3040: 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 20  SegReaderCursor 
3050: 2a 29 3b 0a 0a 2f 2a 20 46 6c 61 67 73 20 61 6c  *);../* Flags al
3060: 6c 6f 77 65 64 20 61 73 20 70 61 72 74 20 6f 66  lowed as part of
3070: 20 74 68 65 20 34 74 68 20 61 72 67 75 6d 65 6e   the 4th argumen
3080: 74 20 74 6f 20 53 65 67 6d 65 6e 74 52 65 61 64  t to SegmentRead
3090: 65 72 49 74 65 72 61 74 65 28 29 20 2a 2f 0a 23  erIterate() */.#
30a0: 64 65 66 69 6e 65 20 46 54 53 33 5f 53 45 47 4d  define FTS3_SEGM
30b0: 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 20  ENT_REQUIRE_POS 
30c0: 20 20 30 78 30 30 30 30 30 30 30 31 0a 23 64 65    0x00000001.#de
30d0: 66 69 6e 65 20 46 54 53 33 5f 53 45 47 4d 45 4e  fine FTS3_SEGMEN
30e0: 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 20  T_IGNORE_EMPTY  
30f0: 30 78 30 30 30 30 30 30 30 32 0a 23 64 65 66 69  0x00000002.#defi
3100: 6e 65 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f  ne FTS3_SEGMENT_
3110: 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 20 30 78  COLUMN_FILTER 0x
3120: 30 30 30 30 30 30 30 34 0a 23 64 65 66 69 6e 65  00000004.#define
3130: 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52   FTS3_SEGMENT_PR
3140: 45 46 49 58 20 20 20 20 20 20 20 20 30 78 30 30  EFIX        0x00
3150: 30 30 30 30 30 38 0a 23 64 65 66 69 6e 65 20 46  000008.#define F
3160: 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41 4e  TS3_SEGMENT_SCAN
3170: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30            0x0000
3180: 30 30 31 30 0a 0a 2f 2a 20 54 79 70 65 20 70 61  0010../* Type pa
3190: 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75  ssed as 4th argu
31a0: 6d 65 6e 74 20 74 6f 20 53 65 67 6d 65 6e 74 52  ment to SegmentR
31b0: 65 61 64 65 72 49 74 65 72 61 74 65 28 29 20 2a  eaderIterate() *
31c0: 2f 0a 73 74 72 75 63 74 20 46 74 73 33 53 65 67  /.struct Fts3Seg
31d0: 46 69 6c 74 65 72 20 7b 0a 20 20 63 6f 6e 73 74  Filter {.  const
31e0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a 20 20   char *zTerm;.  
31f0: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 6e 74  int nTerm;.  int
3200: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 66 6c 61   iCol;.  int fla
3210: 67 73 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46  gs;.};..struct F
3220: 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
3230: 6f 72 20 7b 0a 20 20 2f 2a 20 55 73 65 64 20 69  or {.  /* Used i
3240: 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 73 71 6c  nternally by sql
3250: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
3260: 72 58 58 58 28 29 20 63 61 6c 6c 73 20 2a 2f 0a  rXXX() calls */.
3270: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
3280: 2a 2a 61 70 53 65 67 6d 65 6e 74 3b 20 20 20 20  **apSegment;    
3290: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 46 74    /* Array of Ft
32a0: 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65  s3SegReader obje
32b0: 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  cts */.  int nSe
32c0: 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  gment;          
32d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
32e0: 20 6f 66 20 61 70 53 65 67 6d 65 6e 74 20 61 72   of apSegment ar
32f0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 64  ray */.  int nAd
3300: 76 61 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  vance;          
3310: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
3320: 6d 61 6e 79 20 73 65 67 2d 72 65 61 64 65 72 73  many seg-readers
3330: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
3340: 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a   Fts3SegFilter *
3350: 70 46 69 6c 74 65 72 3b 20 20 20 20 20 20 20 20  pFilter;        
3360: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66   /* Pointer to f
3370: 69 6c 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ilter object */.
3380: 20 20 63 68 61 72 20 2a 61 42 75 66 66 65 72 3b    char *aBuffer;
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 6d    /* Buffer to m
33b0: 65 72 67 65 20 64 6f 63 6c 69 73 74 73 20 69 6e  erge doclists in
33c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 66 65   */.  int nBuffe
33d0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
33e0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
33f0: 65 64 20 73 69 7a 65 20 6f 66 20 61 42 75 66 66  ed size of aBuff
3400: 65 72 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  er[] in bytes */
3410: 0a 0a 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72  ..  /* Cost of r
3420: 75 6e 6e 69 6e 67 20 74 68 69 73 20 69 74 65 72  unning this iter
3430: 61 74 6f 72 2e 20 55 73 65 64 20 62 79 20 66 74  ator. Used by ft
3440: 73 33 2e 63 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  s3.c only. */.  
3450: 69 6e 74 20 6e 43 6f 73 74 3b 0a 0a 20 20 2f 2a  int nCost;..  /*
3460: 20 4f 75 74 70 75 74 20 76 61 6c 75 65 73 2e 20   Output values. 
3470: 56 61 6c 69 64 20 6f 6e 6c 79 20 61 66 74 65 72  Valid only after
3480: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74   Fts3SegReaderSt
3490: 65 70 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c  ep() returns SQL
34a0: 49 54 45 5f 52 4f 57 2e 20 2a 2f 0a 20 20 63 68  ITE_ROW. */.  ch
34b0: 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20  ar *zTerm;      
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 65 72 6d   Pointer to term
34e0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
34f0: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3510: 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e  Size of zTerm in
3520: 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
3530: 20 2a 61 44 6f 63 6c 69 73 74 3b 20 20 20 20 20   *aDoclist;     
3540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3550: 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
3560: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  t buffer */.  in
3570: 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  t nDoclist;     
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3590: 20 53 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73   Size of aDoclis
35a0: 74 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  t[] in bytes */.
35b0: 7d 3b 0a 0a 2f 2a 20 66 74 73 33 2e 63 20 2a 2f  };../* fts3.c */
35c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
35d0: 50 75 74 56 61 72 69 6e 74 28 63 68 61 72 20 2a  PutVarint(char *
35e0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
35f0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ;.int sqlite3Fts
3600: 33 47 65 74 56 61 72 69 6e 74 28 63 6f 6e 73 74  3GetVarint(const
3610: 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 5f   char *, sqlite_
3620: 69 6e 74 36 34 20 2a 29 3b 0a 69 6e 74 20 73 71  int64 *);.int sq
3630: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
3640: 6e 74 33 32 28 63 6f 6e 73 74 20 63 68 61 72 20  nt32(const char 
3650: 2a 2c 20 69 6e 74 20 2a 29 3b 0a 69 6e 74 20 73  *, int *);.int s
3660: 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
3670: 4c 65 6e 28 73 71 6c 69 74 65 33 5f 75 69 6e 74  Len(sqlite3_uint
3680: 36 34 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  64);.void sqlite
3690: 33 46 74 73 33 44 65 71 75 6f 74 65 28 63 68 61  3Fts3Dequote(cha
36a0: 72 20 2a 29 3b 0a 0a 63 68 61 72 20 2a 73 71 6c  r *);..char *sql
36b0: 69 74 65 33 46 74 73 33 46 69 6e 64 50 6f 73 69  ite3Fts3FindPosi
36c0: 74 69 6f 6e 73 28 46 74 73 33 45 78 70 72 20 2a  tions(Fts3Expr *
36d0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c  , sqlite3_int64,
36e0: 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74   int);.int sqlit
36f0: 65 33 46 74 73 33 45 78 70 72 4c 6f 61 64 44 6f  e3Fts3ExprLoadDo
3700: 63 6c 69 73 74 28 46 74 73 33 43 75 72 73 6f 72  clist(Fts3Cursor
3710: 20 2a 2c 20 46 74 73 33 45 78 70 72 20 2a 29 3b   *, Fts3Expr *);
3720: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
3730: 45 78 70 72 4c 6f 61 64 46 74 44 6f 63 6c 69 73  ExprLoadFtDoclis
3740: 74 28 46 74 73 33 43 75 72 73 6f 72 20 2a 2c 20  t(Fts3Cursor *, 
3750: 46 74 73 33 45 78 70 72 20 2a 2c 20 63 68 61 72  Fts3Expr *, char
3760: 20 2a 2a 2c 20 69 6e 74 20 2a 29 3b 0a 69 6e 74   **, int *);.int
3770: 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
3780: 4e 65 61 72 54 72 69 6d 28 46 74 73 33 45 78 70  NearTrim(Fts3Exp
3790: 72 20 2a 2c 20 46 74 73 33 45 78 70 72 20 2a 2c  r *, Fts3Expr *,
37a0: 20 69 6e 74 29 3b 0a 0a 2f 2a 20 66 74 73 33 5f   int);../* fts3_
37b0: 74 6f 6b 65 6e 69 7a 65 72 2e 63 20 2a 2f 0a 63  tokenizer.c */.c
37c0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
37d0: 65 33 46 74 73 33 4e 65 78 74 54 6f 6b 65 6e 28  e3Fts3NextToken(
37e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
37f0: 74 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  t *);.int sqlite
3800: 33 46 74 73 33 49 6e 69 74 48 61 73 68 54 61 62  3Fts3InitHashTab
3810: 6c 65 28 73 71 6c 69 74 65 33 20 2a 2c 20 46 74  le(sqlite3 *, Ft
3820: 73 33 48 61 73 68 20 2a 2c 20 63 6f 6e 73 74 20  s3Hash *, const 
3830: 63 68 61 72 20 2a 29 3b 0a 69 6e 74 20 73 71 6c  char *);.int sql
3840: 69 74 65 33 46 74 73 33 49 6e 69 74 54 6f 6b 65  ite3Fts3InitToke
3850: 6e 69 7a 65 72 28 46 74 73 33 48 61 73 68 20 2a  nizer(Fts3Hash *
3860: 70 48 61 73 68 2c 20 63 6f 6e 73 74 20 63 68 61  pHash, const cha
3870: 72 20 2a 2c 20 0a 20 20 20 20 73 71 6c 69 74 65  r *, .    sqlite
3880: 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 2a 2c 20  3_tokenizer **, 
3890: 63 68 61 72 20 2a 2a 0a 29 3b 0a 69 6e 74 20 73  char **.);.int s
38a0: 71 6c 69 74 65 33 46 74 73 33 49 73 49 64 43 68  qlite3Fts3IsIdCh
38b0: 61 72 28 63 68 61 72 29 3b 0a 0a 2f 2a 20 66 74  ar(char);../* ft
38c0: 73 33 5f 73 6e 69 70 70 65 74 2e 63 20 2a 2f 0a  s3_snippet.c */.
38d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
38e0: 4f 66 66 73 65 74 73 28 73 71 6c 69 74 65 33 5f  Offsets(sqlite3_
38f0: 63 6f 6e 74 65 78 74 2a 2c 20 46 74 73 33 43 75  context*, Fts3Cu
3900: 72 73 6f 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  rsor*);.void sql
3910: 69 74 65 33 46 74 73 33 53 6e 69 70 70 65 74 28  ite3Fts3Snippet(
3920: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3930: 2a 2c 20 46 74 73 33 43 75 72 73 6f 72 20 2a 2c  *, Fts3Cursor *,
3940: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 0a 20   const char *,. 
3950: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 63   const char *, c
3960: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
3970: 2c 20 69 6e 74 0a 29 3b 0a 76 6f 69 64 20 73 71  , int.);.void sq
3980: 6c 69 74 65 33 46 74 73 33 4d 61 74 63 68 69 6e  lite3Fts3Matchin
3990: 66 6f 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  fo(sqlite3_conte
39a0: 78 74 20 2a 2c 20 46 74 73 33 43 75 72 73 6f 72  xt *, Fts3Cursor
39b0: 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   *, const char *
39c0: 29 3b 0a 0a 2f 2a 20 66 74 73 33 5f 65 78 70 72  );../* fts3_expr
39d0: 2e 63 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .c */.int sqlite
39e0: 33 46 74 73 33 45 78 70 72 50 61 72 73 65 28 73  3Fts3ExprParse(s
39f0: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
3a00: 20 2a 2c 20 0a 20 20 63 68 61 72 20 2a 2a 2c 20   *, .  char **, 
3a10: 69 6e 74 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20  int, int, const 
3a20: 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 46 74 73  char *, int, Fts
3a30: 33 45 78 70 72 20 2a 2a 0a 29 3b 0a 76 6f 69 64  3Expr **.);.void
3a40: 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72   sqlite3Fts3Expr
3a50: 46 72 65 65 28 46 74 73 33 45 78 70 72 20 2a 29  Free(Fts3Expr *)
3a60: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
3a70: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
3a80: 46 74 73 33 45 78 70 72 49 6e 69 74 54 65 73 74  Fts3ExprInitTest
3a90: 49 6e 74 65 72 66 61 63 65 28 73 71 6c 69 74 65  Interface(sqlite
3aa0: 33 20 2a 64 62 29 3b 0a 23 65 6e 64 69 66 0a 0a  3 *db);.#endif..
3ab0: 2f 2a 20 66 74 73 33 5f 61 75 78 2e 63 20 2a 2f  /* fts3_aux.c */
3ac0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
3ad0: 49 6e 69 74 41 75 78 28 73 71 6c 69 74 65 33 20  InitAux(sqlite3 
3ae0: 2a 64 62 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  *db);..#endif /*
3af0: 20 5f 46 54 53 49 4e 54 5f 48 20 2a 2f 0a         _FTSINT_H */.