/ Hex Artifact Content
Login

Artifact 70528ba8c33991699f96ecc64112122833cdbdb5:


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 20 64 65 66 69 6e 65 20 41  e..*/.# define A
08c0: 4c 57 41 59 53 28 78 29 20 28 78 29 0a 23 20 64  LWAYS(x) (x).# d
08d0: 65 66 69 6e 65 20 4e 45 56 45 52 28 58 29 20 20  efine NEVER(X)  
08e0: 28 78 29 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 6e  (x)./*.** Intern
08f0: 61 6c 20 74 79 70 65 73 20 75 73 65 64 20 62 79  al types used by
0900: 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 74 79 70 65   SQLite..*/.type
0910: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61  def unsigned cha
0920: 72 20 75 38 3b 20 20 20 20 20 20 20 20 20 2f 2a  r u8;         /*
0930: 20 31 2d 62 79 74 65 20 28 6f 72 20 6c 61 72 67   1-byte (or larg
0940: 65 72 29 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  er) unsigned int
0950: 65 67 65 72 20 2a 2f 0a 74 79 70 65 64 65 66 20  eger */.typedef 
0960: 73 68 6f 72 74 20 69 6e 74 20 69 31 36 3b 20 20  short int i16;  
0970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 2d 62            /* 2-b
0980: 79 74 65 20 28 6f 72 20 6c 61 72 67 65 72 29 20  yte (or larger) 
0990: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
09a0: 2f 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  /.typedef unsign
09b0: 65 64 20 69 6e 74 20 75 33 32 3b 20 20 20 20 20  ed int u32;     
09c0: 20 20 20 20 2f 2a 20 34 2d 62 79 74 65 20 75 6e      /* 4-byte un
09d0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
09e0: 2f 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65  /.typedef sqlite
09f0: 33 5f 75 69 6e 74 36 34 20 75 36 34 3b 20 20 20  3_uint64 u64;   
0a00: 20 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 75 6e      /* 8-byte un
0a10: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
0a20: 2f 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 75 73  /./*.** Macro us
0a30: 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 63  ed to suppress c
0a40: 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
0a50: 20 66 6f 72 20 75 6e 75 73 65 64 20 70 61 72 61   for unused para
0a60: 6d 65 74 65 72 73 2e 0a 2a 2f 0a 23 64 65 66 69  meters..*/.#defi
0a70: 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ne UNUSED_PARAME
0a80: 54 45 52 28 78 29 20 28 76 6f 69 64 29 28 78 29  TER(x) (void)(x)
0a90: 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64 65 66  .#endif..typedef
0aa0: 20 73 74 72 75 63 74 20 46 74 73 33 54 61 62 6c   struct Fts3Tabl
0ab0: 65 20 46 74 73 33 54 61 62 6c 65 3b 0a 74 79 70  e Fts3Table;.typ
0ac0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 33  edef struct Fts3
0ad0: 43 75 72 73 6f 72 20 46 74 73 33 43 75 72 73 6f  Cursor Fts3Curso
0ae0: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
0af0: 74 20 46 74 73 33 45 78 70 72 20 46 74 73 33 45  t Fts3Expr Fts3E
0b00: 78 70 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  xpr;.typedef str
0b10: 75 63 74 20 46 74 73 33 50 68 72 61 73 65 20 46  uct Fts3Phrase F
0b20: 74 73 33 50 68 72 61 73 65 3b 0a 74 79 70 65 64  ts3Phrase;.typed
0b30: 65 66 20 73 74 72 75 63 74 20 46 74 73 33 53 65  ef struct Fts3Se
0b40: 67 52 65 61 64 65 72 20 46 74 73 33 53 65 67 52  gReader Fts3SegR
0b50: 65 61 64 65 72 3b 0a 74 79 70 65 64 65 66 20 73  eader;.typedef s
0b60: 74 72 75 63 74 20 46 74 73 33 53 65 67 46 69 6c  truct Fts3SegFil
0b70: 74 65 72 20 46 74 73 33 53 65 67 46 69 6c 74 65  ter Fts3SegFilte
0b80: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 6f 6e 6e  r;../*.** A conn
0b90: 65 63 74 69 6f 6e 20 74 6f 20 61 20 66 75 6c 6c  ection to a full
0ba0: 74 65 78 74 20 69 6e 64 65 78 20 69 73 20 61 6e  text index is an
0bb0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0bc0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0bd0: 72 75 63 74 75 72 65 2e 20 54 68 65 20 78 43 72  ructure. The xCr
0be0: 65 61 74 65 20 61 6e 64 20 78 43 6f 6e 6e 65 63  eate and xConnec
0bf0: 74 20 6d 65 74 68 6f 64 73 20 63 72 65 61 74 65  t methods create
0c00: 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20   an instance.** 
0c10: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
0c20: 65 20 61 6e 64 20 78 44 65 73 74 72 6f 79 20 61  e and xDestroy a
0c30: 6e 64 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 66  nd xDisconnect f
0c40: 72 65 65 20 74 68 61 74 20 69 6e 73 74 61 6e 63  ree that instanc
0c50: 65 2e 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  e..** All other 
0c60: 6d 65 74 68 6f 64 73 20 72 65 63 65 69 76 65 20  methods receive 
0c70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0c80: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6f 6e   structure as on
0c90: 65 20 6f 66 20 74 68 65 69 72 0a 2a 2a 20 61 72  e of their.** ar
0ca0: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75  guments..*/.stru
0cb0: 63 74 20 46 74 73 33 54 61 62 6c 65 20 7b 0a 20  ct Fts3Table {. 
0cc0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61   sqlite3_vtab ba
0cd0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
0ce0: 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 75   /* Base class u
0cf0: 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 63 6f  sed by SQLite co
0d00: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  re */.  sqlite3 
0d10: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
0d20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
0d30: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0d40: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
0d50: 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
0d60: 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 69 63          /* logic
0d70: 61 6c 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  al database name
0d80: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0d90: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
0da0: 20 20 20 20 20 20 2f 2a 20 76 69 72 74 75 61 6c        /* virtual
0db0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
0dc0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   int nColumn;   
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6e 61   /* number of na
0df0: 6d 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 76  med columns in v
0e00: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
0e10: 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 75 6d    char **azColum
0e20: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
0e30: 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65    /* column name
0e40: 73 2e 20 20 6d 61 6c 6c 6f 63 65 64 20 2a 2f 0a  s.  malloced */.
0e50: 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
0e60: 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 3b  zer *pTokenizer;
0e70: 20 20 2f 2a 20 74 6f 6b 65 6e 69 7a 65 72 20 66    /* tokenizer f
0e80: 6f 72 20 69 6e 73 65 72 74 73 20 61 6e 64 20 71  or inserts and q
0e90: 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ueries */..  /* 
0ea0: 50 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  Precompiled stat
0eb0: 65 6d 65 6e 74 73 20 75 73 65 64 20 62 79 20 74  ements used by t
0ec0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
0ed0: 6e 2e 20 45 61 63 68 20 6f 66 20 74 68 65 73 65  n. Each of these
0ee0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
0ef0: 73 20 69 73 20 72 75 6e 20 61 6e 64 20 72 65 73  s is run and res
0f00: 65 74 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67  et within a sing
0f10: 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  le virtual table
0f20: 20 41 50 49 20 63 61 6c 6c 2e 20 0a 20 20 2a 2f   API call. .  */
0f30: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
0f40: 2a 61 53 74 6d 74 5b 32 35 5d 3b 0a 0a 20 20 2f  *aStmt[25];..  /
0f50: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72  * Pointer to str
0f60: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
0f70: 68 65 20 53 51 4c 3a 0a 20 20 2a 2a 0a 20 20 2a  he SQL:.  **.  *
0f80: 2a 20 22 53 45 4c 45 43 54 20 62 6c 6f 63 6b 20  * "SELECT block 
0f90: 46 52 4f 4d 20 25 5f 73 65 67 6d 65 6e 74 73 20  FROM %_segments 
0fa0: 57 48 45 52 45 20 62 6c 6f 63 6b 69 64 20 42 45  WHERE blockid BE
0fb0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 0a 20  TWEEN ? AND ? . 
0fc0: 20 2a 2a 20 20 20 20 4f 52 44 45 52 20 42 59 20   **    ORDER BY 
0fd0: 62 6c 6f 63 6b 69 64 22 0a 20 20 2a 2f 0a 20 20  blockid".  */.  
0fe0: 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 4c 65 61  char *zSelectLea
0ff0: 76 65 73 3b 0a 20 20 69 6e 74 20 6e 4c 65 61 76  ves;.  int nLeav
1000: 65 73 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  esStmt;         
1010: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
1020: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 61 4c  statements in aL
1030: 65 61 76 65 73 53 74 6d 74 20 2a 2f 0a 20 20 69  eavesStmt */.  i
1040: 6e 74 20 6e 4c 65 61 76 65 73 54 6f 74 61 6c 3b  nt nLeavesTotal;
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1060: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1070: 66 20 70 72 65 70 61 72 65 64 20 6c 65 61 76 65  f prepared leave
1080: 73 20 73 74 6d 74 73 20 2a 2f 0a 20 20 69 6e 74  s stmts */.  int
1090: 20 6e 4c 65 61 76 65 73 41 6c 6c 6f 63 3b 20 20   nLeavesAlloc;  
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10b0: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
10c0: 66 20 61 4c 65 61 76 65 73 53 74 6d 74 20 2a 2f  f aLeavesStmt */
10d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
10e0: 2a 2a 61 4c 65 61 76 65 73 53 74 6d 74 3b 20 20  **aLeavesStmt;  
10f0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70     /* Array of p
1100: 72 65 70 61 72 65 64 20 7a 53 65 6c 65 63 74 4c  repared zSelectL
1110: 65 61 76 65 73 20 73 74 6d 74 73 20 2a 2f 0a 0a  eaves stmts */..
1120: 20 20 69 6e 74 20 6e 4e 6f 64 65 53 69 7a 65 3b    int nNodeSize;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 20 2f 2a 20 53 6f 66 74 20 6c 69 6d 69 74 20    /* Soft limit 
1150: 66 6f 72 20 6e 6f 64 65 20 73 69 7a 65 20 2a 2f  for node size */
1160: 0a 20 20 75 38 20 62 48 61 73 43 6f 6e 74 65 6e  .  u8 bHasConten
1170: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1180: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 25 5f     /* True if %_
1190: 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 65 78  content table ex
11a0: 69 73 74 73 20 2a 2f 0a 20 20 75 38 20 62 48 61  ists */.  u8 bHa
11b0: 73 44 6f 63 73 69 7a 65 3b 20 20 20 20 20 20 20  sDocsize;       
11c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11d0: 65 20 69 66 20 25 5f 64 6f 63 73 69 7a 65 20 74  e if %_docsize t
11e0: 61 62 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 0a  able exists */..
11f0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1200: 6e 67 20 68 61 73 68 20 74 61 62 6c 65 20 69 73  ng hash table is
1210: 20 75 73 65 64 20 74 6f 20 62 75 66 66 65 72 20   used to buffer 
1220: 70 65 6e 64 69 6e 67 20 69 6e 64 65 78 20 75 70  pending index up
1230: 64 61 74 65 73 20 64 75 72 69 6e 67 0a 20 20 2a  dates during.  *
1240: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  * transactions. 
1250: 56 61 72 69 61 62 6c 65 20 6e 50 65 6e 64 69 6e  Variable nPendin
1260: 67 44 61 74 61 20 65 73 74 69 6d 61 74 65 73 20  gData estimates 
1270: 74 68 65 20 6d 65 6d 6f 72 79 20 73 69 7a 65 20  the memory size 
1280: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 65 6e  of the .  ** pen
1290: 64 69 6e 67 20 64 61 74 61 2c 20 69 6e 63 6c 75  ding data, inclu
12a0: 64 69 6e 67 20 68 61 73 68 20 74 61 62 6c 65 20  ding hash table 
12b0: 6f 76 65 72 68 65 61 64 2c 20 62 75 74 20 6e 6f  overhead, but no
12c0: 74 20 6d 61 6c 6c 6f 63 20 6f 76 65 72 68 65 61  t malloc overhea
12d0: 64 2e 20 0a 20 20 2a 2a 20 57 68 65 6e 20 6e 50  d. .  ** When nP
12e0: 65 6e 64 69 6e 67 44 61 74 61 20 65 78 63 65 65  endingData excee
12f0: 64 73 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  ds nMaxPendingDa
1300: 74 61 2c 20 74 68 65 20 62 75 66 66 65 72 20 69  ta, the buffer i
1310: 73 20 66 6c 75 73 68 65 64 20 0a 20 20 2a 2a 20  s flushed .  ** 
1320: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 56  automatically. V
1330: 61 72 69 61 62 6c 65 20 69 50 72 65 76 44 6f 63  ariable iPrevDoc
1340: 69 64 20 69 73 20 74 68 65 20 64 6f 63 69 64 20  id is the docid 
1350: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
1360: 6e 74 6c 79 0a 20 20 2a 2a 20 69 6e 73 65 72 74  ntly.  ** insert
1370: 65 64 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a  ed record..  */.
1380: 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e    int nMaxPendin
1390: 67 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 50 65  gData;.  int nPe
13a0: 6e 64 69 6e 67 44 61 74 61 3b 0a 20 20 73 71 6c  ndingData;.  sql
13b0: 69 74 65 5f 69 6e 74 36 34 20 69 50 72 65 76 44  ite_int64 iPrevD
13c0: 6f 63 69 64 3b 0a 20 20 46 74 73 33 48 61 73 68  ocid;.  Fts3Hash
13d0: 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 3b 0a 7d   pendingTerms;.}
13e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ;../*.** When th
13f0: 65 20 63 6f 72 65 20 77 61 6e 74 73 20 74 6f 20  e core wants to 
1400: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 76 69  read from the vi
1410: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 74 20  rtual table, it 
1420: 63 72 65 61 74 65 73 20 61 0a 2a 2a 20 76 69 72  creates a.** vir
1430: 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
1440: 72 20 28 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  r (an instance o
1450: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1460: 73 74 72 75 63 74 75 72 65 29 20 75 73 69 6e 67  structure) using
1470: 0a 2a 2a 20 74 68 65 20 78 4f 70 65 6e 20 6d 65  .** the xOpen me
1480: 74 68 6f 64 2e 20 43 75 72 73 6f 72 73 20 61 72  thod. Cursors ar
1490: 65 20 64 65 73 74 72 6f 79 65 64 20 75 73 69 6e  e destroyed usin
14a0: 67 20 74 68 65 20 78 43 6c 6f 73 65 20 6d 65 74  g the xClose met
14b0: 68 6f 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  hod..*/.struct F
14c0: 74 73 33 43 75 72 73 6f 72 20 7b 0a 20 20 73 71  ts3Cursor {.  sq
14d0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
14e0: 72 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a  r base;       /*
14f0: 20 42 61 73 65 20 63 6c 61 73 73 20 75 73 65 64   Base class used
1500: 20 62 79 20 53 51 4c 69 74 65 20 63 6f 72 65 20   by SQLite core 
1510: 2a 2f 0a 20 20 69 31 36 20 65 53 65 61 72 63 68  */.  i16 eSearch
1520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1530: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 73       /* Search s
1540: 74 72 61 74 65 67 79 20 28 73 65 65 20 62 65 6c  trategy (see bel
1550: 6f 77 29 20 2a 2f 0a 20 20 75 38 20 69 73 45 6f  ow) */.  u8 isEo
1560: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1570: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1580: 20 69 66 20 61 74 20 45 6e 64 20 4f 66 20 52 65   if at End Of Re
1590: 73 75 6c 74 73 20 2a 2f 0a 20 20 75 38 20 69 73  sults */.  u8 is
15a0: 52 65 71 75 69 72 65 53 65 65 6b 3b 20 20 20 20  RequireSeek;    
15b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15c0: 75 65 20 69 66 20 6d 75 73 74 20 73 65 65 6b 20  ue if must seek 
15d0: 70 53 74 6d 74 20 74 6f 20 25 5f 63 6f 6e 74 65  pStmt to %_conte
15e0: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 73 71 6c 69  nt row */.  sqli
15f0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1610: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1620: 74 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  t in use by the 
1630: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74 73 33  cursor */.  Fts3
1640: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
1650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1660: 61 72 73 65 64 20 4d 41 54 43 48 20 71 75 65 72  arsed MATCH quer
1670: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71  y string */.  sq
1680: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65  lite3_int64 iPre
1690: 76 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  vId;          /*
16a0: 20 50 72 65 76 69 6f 75 73 20 69 64 20 72 65 61   Previous id rea
16b0: 64 20 66 72 6f 6d 20 61 44 6f 63 6c 69 73 74 20  d from aDoclist 
16c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4e 65 78 74  */.  char *pNext
16d0: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
16e0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16f0: 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
1700: 20 61 44 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 63   aDoclist */.  c
1710: 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 3b 20 20  har *aDoclist;  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1730: 2a 20 4c 69 73 74 20 6f 66 20 64 6f 63 69 64 73  * List of docids
1740: 20 66 6f 72 20 66 75 6c 6c 2d 74 65 78 74 20 71   for full-text q
1750: 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
1760: 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
1770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1780: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74  ize of buffer at
1790: 20 61 44 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69   aDoclist */.  i
17a0: 6e 74 20 69 73 4d 61 74 63 68 69 6e 66 6f 4e 65  nt isMatchinfoNe
17b0: 65 64 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  eded;          /
17c0: 2a 20 54 72 75 65 20 77 68 65 6e 20 61 4d 61 74  * True when aMat
17d0: 63 68 69 6e 66 6f 5b 5d 20 6e 65 65 64 73 20 66  chinfo[] needs f
17e0: 69 6c 6c 69 6e 67 20 69 6e 20 2a 2f 0a 20 20 75  illing in */.  u
17f0: 33 32 20 2a 61 4d 61 74 63 68 69 6e 66 6f 3b 20  32 *aMatchinfo; 
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1810: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1820: 6f 75 74 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  out most recent 
1830: 6d 61 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  match */.};../*.
1840: 2a 2a 20 54 68 65 20 46 74 73 33 43 75 72 73 6f  ** The Fts3Curso
1850: 72 2e 65 53 65 61 72 63 68 20 6d 65 6d 62 65 72  r.eSearch member
1860: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74   is always set t
1870: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  o one of the fol
1880: 6c 6f 77 69 6e 67 2e 0a 2a 2a 20 41 63 74 75 61  lowing..** Actua
1890: 6c 79 2c 20 46 74 73 33 43 75 72 73 6f 72 2e 65  ly, Fts3Cursor.e
18a0: 53 65 61 72 63 68 20 63 61 6e 20 62 65 20 67 72  Search can be gr
18b0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
18c0: 75 61 6c 20 74 6f 0a 2a 2a 20 46 54 53 33 5f 46  ual to.** FTS3_F
18d0: 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 2e 20  ULLTEXT_SEARCH. 
18e0: 20 49 66 20 73 6f 2c 20 74 68 65 6e 20 46 74 73   If so, then Fts
18f0: 33 43 75 72 73 6f 72 2e 65 53 65 61 72 63 68 20  3Cursor.eSearch 
1900: 2d 20 32 20 69 73 20 74 68 65 20 69 6e 64 65 78  - 2 is the index
1910: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  .** of the colum
1920: 6e 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  n to be searched
1930: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
1940: 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45  in.**.**     CRE
1950: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1960: 45 20 65 78 31 20 55 53 49 4e 47 20 66 74 73 33  E ex1 USING fts3
1970: 28 61 2c 62 2c 63 2c 64 29 3b 0a 2a 2a 20 20 20  (a,b,c,d);.**   
1980: 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46    SELECT docid F
1990: 52 4f 4d 20 65 78 31 20 57 48 45 52 45 20 62 20  ROM ex1 WHERE b 
19a0: 4d 41 54 43 48 20 27 6f 6e 65 20 74 77 6f 20 74  MATCH 'one two t
19b0: 68 72 65 65 27 3b 0a 2a 2a 20 0a 2a 2a 20 42 65  hree';.** .** Be
19c0: 63 61 75 73 65 20 74 68 65 20 4c 48 53 20 6f 66  cause the LHS of
19d0: 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61   the MATCH opera
19e0: 74 6f 72 20 69 73 20 32 6e 64 20 63 6f 6c 75 6d  tor is 2nd colum
19f0: 6e 20 22 62 22 2c 0a 2a 2a 20 46 74 73 33 43 75  n "b",.** Fts3Cu
1a00: 72 73 6f 72 2e 65 53 65 61 72 63 68 20 77 69 6c  rsor.eSearch wil
1a10: 6c 20 62 65 20 73 65 74 20 74 6f 20 46 54 53 33  l be set to FTS3
1a20: 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48  _FULLTEXT_SEARCH
1a30: 2b 31 2e 20 20 28 2b 30 20 66 6f 72 20 61 2c 0a  +1.  (+0 for a,.
1a40: 2a 2a 20 2b 31 20 66 6f 72 20 62 2c 20 2b 32 20  ** +1 for b, +2 
1a50: 66 6f 72 20 63 2c 20 2b 33 20 66 6f 72 20 64 2e  for c, +3 for d.
1a60: 29 20 20 49 66 20 74 68 65 20 4c 48 53 20 6f 66  )  If the LHS of
1a70: 20 4d 41 54 43 48 20 77 65 72 65 20 22 65 78 31   MATCH were "ex1
1a80: 22 20 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  " .** indicating
1a90: 20 74 68 61 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e   that all column
1aa0: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 61 72  s should be sear
1ab0: 63 68 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 65 53  ched,.** then eS
1ac0: 65 61 72 63 68 20 77 6f 75 6c 64 20 62 65 20 73  earch would be s
1ad0: 65 74 20 74 6f 20 46 54 53 33 5f 46 55 4c 4c 54  et to FTS3_FULLT
1ae0: 45 58 54 5f 53 45 41 52 43 48 2b 34 2e 0a 2a 2f  EXT_SEARCH+4..*/
1af0: 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 46 55  .#define FTS3_FU
1b00: 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 30 20  LLSCAN_SEARCH 0 
1b10: 20 20 20 2f 2a 20 4c 69 6e 65 61 72 20 73 63 61     /* Linear sca
1b20: 6e 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74 20 74  n of %_content t
1b30: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
1b40: 46 54 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43  FTS3_DOCID_SEARC
1b50: 48 20 20 20 20 31 20 20 20 20 2f 2a 20 4c 6f 6f  H    1    /* Loo
1b60: 6b 75 70 20 62 79 20 72 6f 77 69 64 20 6f 6e 20  kup by rowid on 
1b70: 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  %_content table 
1b80: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f  */.#define FTS3_
1b90: 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 20  FULLTEXT_SEARCH 
1ba0: 32 20 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78  2    /* Full-tex
1bb0: 74 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 2a  t index search *
1bc0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 70 68 72 61  /../*.** A "phra
1bd0: 73 65 22 20 69 73 20 61 20 73 65 71 75 65 6e 63  se" is a sequenc
1be0: 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  e of one or more
1bf0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 6d 75 73   tokens that mus
1c00: 74 20 6d 61 74 63 68 20 69 6e 0a 2a 2a 20 73 65  t match in.** se
1c10: 71 75 65 6e 63 65 2e 20 20 41 20 73 69 6e 67 6c  quence.  A singl
1c20: 65 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 62  e token is the b
1c30: 61 73 65 20 63 61 73 65 20 61 6e 64 20 74 68 65  ase case and the
1c40: 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 63 61 73   most common cas
1c50: 65 2e 0a 2a 2a 20 46 6f 72 20 61 20 73 65 71 75  e..** For a sequ
1c60: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 63  ence of tokens c
1c70: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 22 2e 2e 2e  ontained in "...
1c80: 22 2c 20 6e 54 6f 6b 65 6e 20 77 69 6c 6c 20 62  ", nToken will b
1c90: 65 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  e the number.** 
1ca0: 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65  of tokens in the
1cb0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75   string..*/.stru
1cc0: 63 74 20 46 74 73 33 50 68 72 61 73 65 20 7b 0a  ct Fts3Phrase {.
1cd0: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 20 20 20    int nToken;   
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cf0: 4e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  Number of tokens
1d00: 20 69 6e 20 74 68 65 20 70 68 72 61 73 65 20 2a   in the phrase *
1d10: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b  /.  int iColumn;
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d30: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
1d40: 6e 20 74 68 69 73 20 70 68 72 61 73 65 20 6d 75  n this phrase mu
1d50: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e  st match */.  in
1d60: 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 20 20  t isNot;        
1d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61           /* Phra
1d80: 73 65 20 70 72 65 66 69 78 65 64 20 62 79 20 75  se prefixed by u
1d90: 6e 61 72 79 20 6e 6f 74 20 28 2d 29 20 6f 70 65  nary not (-) ope
1da0: 72 61 74 6f 72 20 2a 2f 0a 20 20 73 74 72 75 63  rator */.  struc
1db0: 74 20 50 68 72 61 73 65 54 6f 6b 65 6e 20 7b 0a  t PhraseToken {.
1dc0: 20 20 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20      char *z;    
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de0: 54 65 78 74 20 6f 66 20 74 68 65 20 74 6f 6b 65  Text of the toke
1df0: 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20  n */.    int n; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1e20: 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 70  ytes in buffer p
1e30: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 20 2a  ointed to by z *
1e40: 2f 0a 20 20 20 20 69 6e 74 20 69 73 50 72 65 66  /.    int isPref
1e50: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ix;            /
1e60: 2a 20 54 72 75 65 20 69 66 20 74 6f 6b 65 6e 20  * True if token 
1e70: 65 6e 64 73 20 69 6e 20 77 69 74 68 20 61 20 22  ends in with a "
1e80: 2a 22 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  *" character */.
1e90: 20 20 7d 20 61 54 6f 6b 65 6e 5b 31 5d 3b 20 20    } aToken[1];  
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb0: 4f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  One entry for ea
1ec0: 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
1ed0: 70 68 72 61 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  phrase */.};../*
1ee0: 0a 2a 2a 20 41 20 74 72 65 65 20 6f 66 20 74 68  .** A tree of th
1ef0: 65 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 6d  ese objects form
1f00: 73 20 74 68 65 20 52 48 53 20 6f 66 20 61 20 4d  s the RHS of a M
1f10: 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ATCH operator..*
1f20: 2a 0a 2a 2a 20 49 66 20 46 74 73 33 45 78 70 72  *.** If Fts3Expr
1f30: 2e 65 54 79 70 65 20 69 73 20 65 69 74 68 65 72  .eType is either
1f40: 20 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 6f   FTSQUERY_NEAR o
1f50: 72 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  r FTSQUERY_PHRAS
1f60: 45 20 61 6e 64 20 69 73 4c 6f 61 64 65 64 0a 2a  E and isLoaded.*
1f70: 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
1f80: 61 44 6f 63 6c 69 73 74 20 70 6f 69 6e 74 73 20  aDoclist points 
1f90: 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75  to a malloced bu
1fa0: 66 66 65 72 2c 20 73 69 7a 65 20 6e 44 6f 63 6c  ffer, size nDocl
1fb0: 69 73 74 20 62 79 74 65 73 2c 20 0a 2a 2a 20 63  ist bytes, .** c
1fc0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
1fd0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 4e 45 41  sults of the NEA
1fe0: 52 20 6f 72 20 70 68 72 61 73 65 20 71 75 65 72  R or phrase quer
1ff0: 79 20 69 6e 20 46 54 53 33 20 64 6f 63 6c 69 73  y in FTS3 doclis
2000: 74 0a 2a 2a 20 66 6f 72 6d 61 74 2e 20 41 73 20  t.** format. As 
2010: 75 73 75 61 6c 2c 20 74 68 65 20 69 6e 69 74 69  usual, the initi
2020: 61 6c 20 22 4c 65 6e 67 74 68 22 20 66 69 65 6c  al "Length" fiel
2030: 64 20 66 6f 75 6e 64 20 69 6e 20 64 6f 63 6c 69  d found in docli
2040: 73 74 73 20 73 74 6f 72 65 64 0a 2a 2a 20 6f 6e  sts stored.** on
2050: 20 64 69 73 6b 20 69 73 20 6f 6d 69 74 74 65 64   disk is omitted
2060: 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65   from this buffe
2070: 72 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  r..**.** Variabl
2080: 65 20 70 43 75 72 72 65 6e 74 20 61 6c 77 61 79  e pCurrent alway
2090: 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  s points to the 
20a0: 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 69 64  start of a docid
20b0: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 0a 2a 2a   field within.**
20c0: 20 61 44 6f 63 6c 69 73 74 2e 20 53 69 6e 63 65   aDoclist. Since
20d0: 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20   the doclist is 
20e0: 75 73 75 61 6c 6c 79 20 73 63 61 6e 6e 65 64 20  usually scanned 
20f0: 69 6e 20 64 6f 63 69 64 20 6f 72 64 65 72 2c 20  in docid order, 
2100: 74 68 69 73 20 63 61 6e 0a 2a 2a 20 62 65 20 75  this can.** be u
2110: 73 65 64 20 74 6f 20 61 63 63 65 6c 65 72 61 74  sed to accelerat
2120: 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
2130: 20 72 65 71 75 69 72 65 64 20 64 6f 63 69 64 20   required docid 
2140: 77 69 74 68 69 6e 20 74 68 65 20 64 6f 63 6c 69  within the docli
2150: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  st..*/.struct Ft
2160: 73 33 45 78 70 72 20 7b 0a 20 20 69 6e 74 20 65  s3Expr {.  int e
2170: 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
2180: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2190: 74 68 65 20 46 54 53 51 55 45 52 59 5f 58 58 58  the FTSQUERY_XXX
21a0: 20 76 61 6c 75 65 73 20 64 65 66 69 6e 65 64 20   values defined 
21b0: 62 65 6c 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 6e  below */.  int n
21c0: 4e 65 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  Near;           
21d0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 69        /* Valid i
21e0: 66 20 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  f eType==FTSQUER
21f0: 59 5f 4e 45 41 52 20 2a 2f 0a 20 20 46 74 73 33  Y_NEAR */.  Fts3
2200: 45 78 70 72 20 2a 70 50 61 72 65 6e 74 3b 20 20  Expr *pParent;  
2210: 20 20 20 20 20 20 20 2f 2a 20 70 50 61 72 65 6e         /* pParen
2220: 74 2d 3e 70 4c 65 66 74 3d 3d 74 68 69 73 20 6f  t->pLeft==this o
2230: 72 20 70 50 61 72 65 6e 74 2d 3e 70 52 69 67 68  r pParent->pRigh
2240: 74 3d 3d 74 68 69 73 20 2a 2f 0a 20 20 46 74 73  t==this */.  Fts
2250: 33 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20  3Expr *pLeft;   
2260: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
2270: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 46 74 73  operand */.  Fts
2280: 33 45 78 70 72 20 2a 70 52 69 67 68 74 3b 20 20  3Expr *pRight;  
2290: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
22a0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 46 74   operand */.  Ft
22b0: 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  s3Phrase *pPhras
22c0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69  e;       /* Vali
22d0: 64 20 69 66 20 65 54 79 70 65 3d 3d 46 54 53 51  d if eType==FTSQ
22e0: 55 45 52 59 5f 50 48 52 41 53 45 20 2a 2f 0a 0a  UERY_PHRASE */..
22f0: 20 20 69 6e 74 20 69 73 4c 6f 61 64 65 64 3b 20    int isLoaded; 
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2310: 54 72 75 65 20 69 66 20 61 44 6f 63 6c 69 73 74  True if aDoclist
2320: 2f 6e 44 6f 63 6c 69 73 74 20 61 72 65 20 69 6e  /nDoclist are in
2330: 69 74 69 61 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20  itialized. */.  
2340: 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 3b 20  char *aDoclist; 
2350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
2360: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2370: 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  doclist */.  int
2380: 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20   nDoclist;      
2390: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23a0: 6f 66 20 61 44 6f 63 6c 69 73 74 20 69 6e 20 62  of aDoclist in b
23b0: 79 74 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74  ytes */..  sqlit
23c0: 65 33 5f 69 6e 74 36 34 20 69 43 75 72 72 65 6e  e3_int64 iCurren
23d0: 74 3b 0a 20 20 63 68 61 72 20 2a 70 43 75 72 72  t;.  char *pCurr
23e0: 65 6e 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ent;.};../*.** C
23f0: 61 6e 64 69 64 61 74 65 20 76 61 6c 75 65 73 20  andidate values 
2400: 66 6f 72 20 46 74 73 33 51 75 65 72 79 2e 65 54  for Fts3Query.eT
2410: 79 70 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  ype. Note that t
2420: 68 65 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20  he order of the 
2430: 66 69 72 73 74 0a 2a 2a 20 66 6f 75 72 20 76 61  first.** four va
2440: 6c 75 65 73 20 69 73 20 69 6e 20 6f 72 64 65 72  lues is in order
2450: 20 6f 66 20 70 72 65 63 65 64 65 6e 63 65 20 77   of precedence w
2460: 68 65 6e 20 70 61 72 73 69 6e 67 20 65 78 70 72  hen parsing expr
2470: 65 73 73 69 6f 6e 73 2e 20 46 6f 72 20 0a 2a 2a  essions. For .**
2480: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f   example, the fo
2490: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
24a0: 20 22 61 20 4f 52 20 62 20 41 4e 44 20 63 20 4e   "a OR b AND c N
24b0: 4f 54 20 64 20 4e 45 41 52 20 65 22 0a 2a 2a 0a  OT d NEAR e".**.
24c0: 2a 2a 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ** is equivalent
24d0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 20   to:.**.**   "a 
24e0: 4f 52 20 28 62 20 41 4e 44 20 28 63 20 4e 4f 54  OR (b AND (c NOT
24f0: 20 28 64 20 4e 45 41 52 20 65 29 29 29 22 0a 2a   (d NEAR e)))".*
2500: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 51 55 45  /.#define FTSQUE
2510: 52 59 5f 4e 45 41 52 20 20 20 31 0a 23 64 65 66  RY_NEAR   1.#def
2520: 69 6e 65 20 46 54 53 51 55 45 52 59 5f 4e 4f 54  ine FTSQUERY_NOT
2530: 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 46 54      2.#define FT
2540: 53 51 55 45 52 59 5f 41 4e 44 20 20 20 20 33 0a  SQUERY_AND    3.
2550: 23 64 65 66 69 6e 65 20 46 54 53 51 55 45 52 59  #define FTSQUERY
2560: 5f 4f 52 20 20 20 20 20 34 0a 23 64 65 66 69 6e  _OR     4.#defin
2570: 65 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  e FTSQUERY_PHRAS
2580: 45 20 35 0a 0a 0a 2f 2a 20 66 74 73 33 5f 69 6e  E 5.../* fts3_in
2590: 69 74 2e 63 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  it.c */.int sqli
25a0: 74 65 33 46 74 73 33 44 65 6c 65 74 65 56 74 61  te3Fts3DeleteVta
25b0: 62 28 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76  b(int, sqlite3_v
25c0: 74 61 62 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69  tab *);.int sqli
25d0: 74 65 33 46 74 73 33 49 6e 69 74 56 74 61 62 28  te3Fts3InitVtab(
25e0: 69 6e 74 2c 20 73 71 6c 69 74 65 33 2a 2c 20 76  int, sqlite3*, v
25f0: 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74  oid*, int, const
2600: 20 63 68 61 72 2a 63 6f 6e 73 74 2a 2c 20 0a 20   char*const*, . 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
2630: 74 61 62 20 2a 2a 2c 20 63 68 61 72 20 2a 2a 29  tab **, char **)
2640: 3b 0a 0a 2f 2a 20 66 74 73 33 5f 77 72 69 74 65  ;../* fts3_write
2650: 2e 63 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .c */.int sqlite
2660: 33 46 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f  3Fts3UpdateMetho
2670: 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 2c  d(sqlite3_vtab*,
2680: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
2690: 65 2a 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  e**,sqlite3_int6
26a0: 34 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  4*);.int sqlite3
26b0: 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
26c0: 46 6c 75 73 68 28 46 74 73 33 54 61 62 6c 65 20  Flush(Fts3Table 
26d0: 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  *);.void sqlite3
26e0: 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
26f0: 43 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65 20  Clear(Fts3Table 
2700: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  *);.int sqlite3F
2710: 74 73 33 4f 70 74 69 6d 69 7a 65 28 46 74 73 33  ts3Optimize(Fts3
2720: 54 61 62 6c 65 20 2a 29 3b 0a 69 6e 74 20 73 71  Table *);.int sq
2730: 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
2740: 65 72 4e 65 77 28 46 74 73 33 54 61 62 6c 65 20  erNew(Fts3Table 
2750: 2a 2c 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69  *,int, sqlite3_i
2760: 6e 74 36 34 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nt64,.  sqlite3_
2770: 69 6e 74 36 34 2c 20 73 71 6c 69 74 65 33 5f 69  int64, sqlite3_i
2780: 6e 74 36 34 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt64, const char
2790: 20 2a 2c 20 69 6e 74 2c 20 46 74 73 33 53 65 67   *, int, Fts3Seg
27a0: 52 65 61 64 65 72 2a 2a 29 3b 0a 69 6e 74 20 73  Reader**);.int s
27b0: 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
27c0: 64 65 72 50 65 6e 64 69 6e 67 28 46 74 73 33 54  derPending(Fts3T
27d0: 61 62 6c 65 2a 2c 63 6f 6e 73 74 20 63 68 61 72  able*,const char
27e0: 2a 2c 69 6e 74 2c 69 6e 74 2c 46 74 73 33 53 65  *,int,int,Fts3Se
27f0: 67 52 65 61 64 65 72 2a 2a 29 3b 0a 76 6f 69 64  gReader**);.void
2800: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
2810: 65 61 64 65 72 46 72 65 65 28 46 74 73 33 54 61  eaderFree(Fts3Ta
2820: 62 6c 65 20 2a 2c 20 46 74 73 33 53 65 67 52 65  ble *, Fts3SegRe
2830: 61 64 65 72 20 2a 29 3b 0a 69 6e 74 20 73 71 6c  ader *);.int sql
2840: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
2850: 72 49 74 65 72 61 74 65 28 0a 20 20 46 74 73 33  rIterate(.  Fts3
2860: 54 61 62 6c 65 20 2a 2c 20 46 74 73 33 53 65 67  Table *, Fts3Seg
2870: 52 65 61 64 65 72 20 2a 2a 2c 20 69 6e 74 2c 20  Reader **, int, 
2880: 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 2c  Fts3SegFilter *,
2890: 0a 20 20 69 6e 74 20 28 2a 29 28 46 74 73 33 54  .  int (*)(Fts3T
28a0: 61 62 6c 65 20 2a 2c 20 76 6f 69 64 20 2a 2c 20  able *, void *, 
28b0: 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 63 68 61  char *, int, cha
28c0: 72 20 2a 2c 20 69 6e 74 29 2c 20 20 76 6f 69 64  r *, int),  void
28d0: 20 2a 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *.);.int sqlite
28e0: 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 46  3Fts3ReadBlock(F
28f0: 74 73 33 54 61 62 6c 65 2a 2c 20 73 71 6c 69 74  ts3Table*, sqlit
2900: 65 33 5f 69 6e 74 36 34 2c 20 63 68 61 72 20 63  e3_int64, char c
2910: 6f 6e 73 74 2a 2a 2c 20 69 6e 74 2a 29 3b 0a 69  onst**, int*);.i
2920: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 41 6c  nt sqlite3Fts3Al
2930: 6c 53 65 67 64 69 72 73 28 46 74 73 33 54 61 62  lSegdirs(Fts3Tab
2940: 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d  le*, sqlite3_stm
2950: 74 20 2a 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  t **);.int sqlit
2960: 65 33 46 74 73 33 4d 61 74 63 68 69 6e 66 6f 44  e3Fts3MatchinfoD
2970: 6f 63 73 69 7a 65 4c 6f 63 61 6c 28 46 74 73 33  ocsizeLocal(Fts3
2980: 43 75 72 73 6f 72 2a 2c 20 75 33 32 2a 29 3b 0a  Cursor*, u32*);.
2990: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
29a0: 61 74 63 68 69 6e 66 6f 44 6f 63 73 69 7a 65 47  atchinfoDocsizeG
29b0: 6c 6f 62 61 6c 28 46 74 73 33 43 75 72 73 6f 72  lobal(Fts3Cursor
29c0: 2a 2c 20 75 33 32 2a 29 3b 0a 0a 2f 2a 20 46 6c  *, u32*);../* Fl
29d0: 61 67 73 20 61 6c 6c 6f 77 65 64 20 61 73 20 70  ags allowed as p
29e0: 61 72 74 20 6f 66 20 74 68 65 20 34 74 68 20 61  art of the 4th a
29f0: 72 67 75 6d 65 6e 74 20 74 6f 20 53 65 67 6d 65  rgument to Segme
2a00: 6e 74 52 65 61 64 65 72 49 74 65 72 61 74 65 28  ntReaderIterate(
2a10: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ) */.#define FTS
2a20: 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52  3_SEGMENT_REQUIR
2a30: 45 5f 50 4f 53 20 20 20 30 78 30 30 30 30 30 30  E_POS   0x000000
2a40: 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f  01.#define FTS3_
2a50: 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45  SEGMENT_IGNORE_E
2a60: 4d 50 54 59 20 20 30 78 30 30 30 30 30 30 30 32  MPTY  0x00000002
2a70: 0a 23 64 65 66 69 6e 65 20 46 54 53 33 5f 53 45  .#define FTS3_SE
2a80: 47 4d 45 4e 54 5f 43 4f 4c 55 4d 4e 5f 46 49 4c  GMENT_COLUMN_FIL
2a90: 54 45 52 20 30 78 30 30 30 30 30 30 30 34 0a 23  TER 0x00000004.#
2aa0: 64 65 66 69 6e 65 20 46 54 53 33 5f 53 45 47 4d  define FTS3_SEGM
2ab0: 45 4e 54 5f 50 52 45 46 49 58 20 20 20 20 20 20  ENT_PREFIX      
2ac0: 20 20 30 78 30 30 30 30 30 30 30 38 0a 0a 2f 2a    0x00000008../*
2ad0: 20 54 79 70 65 20 70 61 73 73 65 64 20 61 73 20   Type passed as 
2ae0: 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
2af0: 53 65 67 6d 65 6e 74 52 65 61 64 65 72 49 74 65  SegmentReaderIte
2b00: 72 61 74 65 28 29 20 2a 2f 0a 73 74 72 75 63 74  rate() */.struct
2b10: 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 7b   Fts3SegFilter {
2b20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b30: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 54 65 72  Term;.  int nTer
2b40: 6d 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  m;.  int iCol;. 
2b50: 20 69 6e 74 20 66 6c 61 67 73 3b 0a 7d 3b 0a 0a   int flags;.};..
2b60: 2f 2a 20 66 74 73 33 2e 63 20 2a 2f 0a 69 6e 74  /* fts3.c */.int
2b70: 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
2b80: 61 72 69 6e 74 28 63 68 61 72 20 2a 2c 20 73 71  arint(char *, sq
2b90: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 69 6e  lite3_int64);.in
2ba0: 74 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  t sqlite3Fts3Get
2bb0: 56 61 72 69 6e 74 28 63 6f 6e 73 74 20 63 68 61  Varint(const cha
2bc0: 72 20 2a 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  r *, sqlite_int6
2bd0: 34 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  4 *);.int sqlite
2be0: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32  3Fts3GetVarint32
2bf0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69  (const char *, i
2c00: 6e 74 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  nt *);.int sqlit
2c10: 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
2c20: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 3b  sqlite3_uint64);
2c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
2c40: 33 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 29  3Dequote(char *)
2c50: 3b 0a 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  ;..char *sqlite3
2c60: 46 74 73 33 46 69 6e 64 50 6f 73 69 74 69 6f 6e  Fts3FindPosition
2c70: 73 28 46 74 73 33 45 78 70 72 20 2a 2c 20 73 71  s(Fts3Expr *, sq
2c80: 6c 69 74 65 33 5f 69 6e 74 36 34 2c 20 69 6e 74  lite3_int64, int
2c90: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  );.int sqlite3Ft
2ca0: 73 33 45 78 70 72 4c 6f 61 64 44 6f 63 6c 69 73  s3ExprLoadDoclis
2cb0: 74 28 46 74 73 33 54 61 62 6c 65 20 2a 2c 20 46  t(Fts3Table *, F
2cc0: 74 73 33 45 78 70 72 20 2a 29 3b 0a 69 6e 74 20  ts3Expr *);.int 
2cd0: 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 4e  sqlite3Fts3ExprN
2ce0: 65 61 72 54 72 69 6d 28 46 74 73 33 45 78 70 72  earTrim(Fts3Expr
2cf0: 20 2a 2c 20 46 74 73 33 45 78 70 72 20 2a 2c 20   *, Fts3Expr *, 
2d00: 69 6e 74 29 3b 0a 0a 2f 2a 20 66 74 73 33 5f 74  int);../* fts3_t
2d10: 6f 6b 65 6e 69 7a 65 72 2e 63 20 2a 2f 0a 63 6f  okenizer.c */.co
2d20: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
2d30: 33 46 74 73 33 4e 65 78 74 54 6f 6b 65 6e 28 63  3Fts3NextToken(c
2d40: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
2d50: 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33   *);.int sqlite3
2d60: 46 74 73 33 49 6e 69 74 48 61 73 68 54 61 62 6c  Fts3InitHashTabl
2d70: 65 28 73 71 6c 69 74 65 33 20 2a 2c 20 46 74 73  e(sqlite3 *, Fts
2d80: 33 48 61 73 68 20 2a 2c 20 63 6f 6e 73 74 20 63  3Hash *, const c
2d90: 68 61 72 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69  har *);.int sqli
2da0: 74 65 33 46 74 73 33 49 6e 69 74 54 6f 6b 65 6e  te3Fts3InitToken
2db0: 69 7a 65 72 28 46 74 73 33 48 61 73 68 20 2a 70  izer(Fts3Hash *p
2dc0: 48 61 73 68 2c 20 0a 20 20 63 6f 6e 73 74 20 63  Hash, .  const c
2dd0: 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 33 5f 74  har *, sqlite3_t
2de0: 6f 6b 65 6e 69 7a 65 72 20 2a 2a 2c 20 63 6f 6e  okenizer **, con
2df0: 73 74 20 63 68 61 72 20 2a 2a 2c 20 63 68 61 72  st char **, char
2e00: 20 2a 2a 0a 29 3b 0a 0a 2f 2a 20 66 74 73 33 5f   **.);../* fts3_
2e10: 73 6e 69 70 70 65 74 2e 63 20 2a 2f 0a 76 6f 69  snippet.c */.voi
2e20: 64 20 73 71 6c 69 74 65 33 46 74 73 33 4f 66 66  d sqlite3Fts3Off
2e30: 73 65 74 73 28 73 71 6c 69 74 65 33 5f 63 6f 6e  sets(sqlite3_con
2e40: 74 65 78 74 2a 2c 20 46 74 73 33 43 75 72 73 6f  text*, Fts3Curso
2e50: 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  r*);.void sqlite
2e60: 33 46 74 73 33 53 6e 69 70 70 65 74 28 73 71 6c  3Fts3Snippet(sql
2e70: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 2c 20  ite3_context *, 
2e80: 46 74 73 33 43 75 72 73 6f 72 20 2a 2c 20 63 6f  Fts3Cursor *, co
2e90: 6e 73 74 20 63 68 61 72 20 2a 2c 0a 20 20 63 6f  nst char *,.  co
2ea0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73  nst char *, cons
2eb0: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 69  t char *, int, i
2ec0: 6e 74 0a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74  nt.);.void sqlit
2ed0: 65 33 46 74 73 33 4d 61 74 63 68 69 6e 66 6f 28  e3Fts3Matchinfo(
2ee0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2ef0: 2a 2c 20 46 74 73 33 43 75 72 73 6f 72 20 2a 29  *, Fts3Cursor *)
2f00: 3b 0a 0a 2f 2a 20 66 74 73 33 5f 65 78 70 72 2e  ;../* fts3_expr.
2f10: 63 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  c */.int sqlite3
2f20: 46 74 73 33 45 78 70 72 50 61 72 73 65 28 73 71  Fts3ExprParse(sq
2f30: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20  lite3_tokenizer 
2f40: 2a 2c 20 0a 20 20 63 68 61 72 20 2a 2a 2c 20 69  *, .  char **, i
2f50: 6e 74 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63  nt, int, const c
2f60: 68 61 72 20 2a 2c 20 69 6e 74 2c 20 46 74 73 33  har *, int, Fts3
2f70: 45 78 70 72 20 2a 2a 0a 29 3b 0a 76 6f 69 64 20  Expr **.);.void 
2f80: 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 46  sqlite3Fts3ExprF
2f90: 72 65 65 28 46 74 73 33 45 78 70 72 20 2a 29 3b  ree(Fts3Expr *);
2fa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2fb0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  EST.int sqlite3F
2fc0: 74 73 33 45 78 70 72 49 6e 69 74 54 65 73 74 49  ts3ExprInitTestI
2fd0: 6e 74 65 72 66 61 63 65 28 73 71 6c 69 74 65 33  nterface(sqlite3
2fe0: 20 2a 64 62 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   *db);.#endif..#
2ff0: 65 6e 64 69 66 20 2f 2a 20 5f 46 54 53 49 4e 54  endif /* _FTSINT
3000: 5f 48 20 2a 2f 0a                                _H */.