/ Hex Artifact Content
Login

Artifact 3578823a9a43fcc77ce46c7f6efddfd155544053:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 23 69 6e  s5Int.h..*/..#in
0280: 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68  clude "fts5Int.h
0290: 22 0a 23 69 6e 63 6c 75 64 65 20 22 66 74 73 33  ".#include "fts3
02a0: 5f 68 61 73 68 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  _hash.h"../*.** 
02b0: 4f 76 65 72 76 69 65 77 3a 0a 2a 2a 0a 2a 2a 20  Overview:.**.** 
02c0: 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  The %_data table
02d0: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 74 68   contains all th
02e0: 65 20 46 54 53 20 69 6e 64 65 78 65 73 20 66 6f  e FTS indexes fo
02f0: 72 20 61 6e 20 46 54 53 35 20 76 69 72 74 75 61  r an FTS5 virtua
0300: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 77  l table..** As w
0310: 65 6c 6c 20 61 73 20 74 68 65 20 6d 61 69 6e 20  ell as the main 
0320: 74 65 72 6d 20 69 6e 64 65 78 2c 20 74 68 65 72  term index, ther
0330: 65 20 6d 61 79 20 62 65 20 75 70 20 74 6f 20 33  e may be up to 3
0340: 31 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  1 prefix indexes
0350: 2e 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  ..** The format 
0360: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 46 54  is similar to FT
0370: 53 33 2f 34 2c 20 65 78 63 65 70 74 20 74 68 61  S3/4, except tha
0380: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 61 6c 6c  t:.**.**   * all
0390: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
03a0: 6c 65 61 66 20 64 61 74 61 20 69 73 20 73 74 6f  leaf data is sto
03b0: 72 65 64 20 69 6e 20 66 69 78 65 64 20 73 69 7a  red in fixed siz
03c0: 65 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 0a  e page records .
03d0: 2a 2a 20 20 20 20 20 28 65 2e 67 2e 20 31 30 30  **     (e.g. 100
03e0: 30 20 62 79 74 65 73 29 2e 20 41 20 73 69 6e 67  0 bytes). A sing
03f0: 6c 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 73  le doclist may s
0400: 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20 70 61 67  pan multiple pag
0410: 65 73 2e 20 43 61 72 65 20 69 73 20 0a 2a 2a 20  es. Care is .** 
0420: 20 20 20 20 74 61 6b 65 6e 20 74 6f 20 65 6e 73      taken to ens
0430: 75 72 65 20 69 74 20 69 73 20 70 6f 73 73 69 62  ure it is possib
0440: 6c 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e  le to iterate in
0450: 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69 6f   either directio
0460: 6e 20 74 68 72 6f 75 67 68 20 0a 2a 2a 20 20 20  n through .**   
0470: 20 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e    the entries in
0480: 20 61 20 64 6f 63 6c 69 73 74 2c 20 6f 72 20 74   a doclist, or t
0490: 6f 20 73 65 65 6b 20 74 6f 20 61 20 73 70 65 63  o seek to a spec
04a0: 69 66 69 63 20 65 6e 74 72 79 20 77 69 74 68 69  ific entry withi
04b0: 6e 20 61 20 0a 2a 2a 20 20 20 20 20 64 6f 63 6c  n a .**     docl
04c0: 69 73 74 2c 20 77 69 74 68 6f 75 74 20 6c 6f 61  ist, without loa
04d0: 64 69 6e 67 20 69 74 20 69 6e 74 6f 20 6d 65 6d  ding it into mem
04e0: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 6c  ory..**.**   * l
04f0: 61 72 67 65 20 64 6f 63 6c 69 73 74 73 20 74 68  arge doclists th
0500: 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 70 61 67  at span many pag
0510: 65 73 20 68 61 76 65 20 61 73 73 6f 63 69 61 74  es have associat
0520: 65 64 20 22 64 6f 63 6c 69 73 74 20 69 6e 64 65  ed "doclist inde
0530: 78 22 0a 2a 2a 20 20 20 20 20 72 65 63 6f 72 64  x".**     record
0540: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61  s that contain a
0550: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72   copy of the fir
0560: 73 74 20 64 6f 63 69 64 20 6f 6e 20 65 61 63 68  st docid on each
0570: 20 70 61 67 65 20 73 70 61 6e 6e 65 64 20 62 79   page spanned by
0580: 0a 2a 2a 20 20 20 20 20 74 68 65 20 64 6f 63 6c  .**     the docl
0590: 69 73 74 2e 20 54 68 69 73 20 69 73 20 75 73 65  ist. This is use
05a0: 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 73 65  d to speed up se
05b0: 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 61  ek operations, a
05c0: 6e 64 20 6d 65 72 67 65 73 20 6f 66 0a 2a 2a 20  nd merges of.** 
05d0: 20 20 20 20 6c 61 72 67 65 20 64 6f 63 6c 69 73      large doclis
05e0: 74 73 20 77 69 74 68 20 76 65 72 79 20 73 6d 61  ts with very sma
05f0: 6c 6c 20 64 6f 63 6c 69 73 74 73 2e 0a 2a 2a 0a  ll doclists..**.
0600: 2a 2a 20 20 20 2a 20 65 78 74 72 61 20 66 69 65  **   * extra fie
0610: 6c 64 73 20 69 6e 20 74 68 65 20 22 73 74 72 75  lds in the "stru
0620: 63 74 75 72 65 20 72 65 63 6f 72 64 22 20 72 65  cture record" re
0630: 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
0640: 66 20 6f 6e 67 6f 69 6e 67 0a 2a 2a 20 20 20 20  f ongoing.**    
0650: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
0660: 67 65 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ge operations..*
0670: 2a 0a 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54  *.*/..#define FT
0680: 53 35 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  S5_DEFAULT_PAGE_
0690: 53 49 5a 45 20 20 20 31 30 30 30 0a 0a 23 64 65  SIZE   1000..#de
06a0: 66 69 6e 65 20 46 54 53 35 5f 57 4f 52 4b 5f 55  fine FTS5_WORK_U
06b0: 4e 49 54 20 20 20 20 20 20 36 34 20 20 20 20 2f  NIT      64    /
06c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
06d0: 20 70 61 67 65 73 20 69 6e 20 75 6e 69 74 20 6f   pages in unit o
06e0: 66 20 77 6f 72 6b 20 2a 2f 0a 23 64 65 66 69 6e  f work */.#defin
06f0: 65 20 46 54 53 35 5f 4d 49 4e 5f 4d 45 52 47 45  e FTS5_MIN_MERGE
0700: 20 20 20 20 20 20 20 34 20 20 20 20 2f 2a 20 4d         4    /* M
0710: 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
0720: 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
0730: 67 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46  ge */..#define F
0740: 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
0750: 5a 45 20 20 34 20 20 20 20 2f 2a 20 41 64 64 20  ZE  4    /* Add 
0760: 64 6c 69 64 78 20 69 66 20 74 68 69 73 20 6d 61  dlidx if this ma
0770: 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73 20 2a  ny empty pages *
0780: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73  /../*.** Details
0790: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  :.**.** The %_da
07a0: 74 61 20 74 61 62 6c 65 20 6d 61 6e 61 67 65 64  ta table managed
07b0: 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c   by this module,
07c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  .**.**     CREAT
07d0: 45 20 54 41 42 4c 45 20 25 5f 64 61 74 61 28 69  E TABLE %_data(i
07e0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
07f0: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f  Y KEY, block BLO
0800: 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74  B);.**.** , cont
0810: 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ains the followi
0820: 6e 67 20 35 20 74 79 70 65 73 20 6f 66 20 72 65  ng 5 types of re
0830: 63 6f 72 64 73 2e 20 53 65 65 20 74 68 65 20 63  cords. See the c
0840: 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64  omments surround
0850: 69 6e 67 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f  ing.** the FTS5_
0860: 2a 5f 52 4f 57 49 44 20 6d 61 63 72 6f 73 20 62  *_ROWID macros b
0870: 65 6c 6f 77 20 66 6f 72 20 61 20 64 65 73 63 72  elow for a descr
0880: 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f  iption of how %_
0890: 64 61 74 61 20 72 6f 77 69 64 73 20 61 72 65 20  data rowids are 
08a0: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 74 6f 20  .** assigned to 
08b0: 65 61 63 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a  each fo them..**
08c0: 0a 2a 2a 20 31 2e 20 53 74 72 75 63 74 75 72 65  .** 1. Structure
08d0: 20 52 65 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20   Records:.**.** 
08e0: 20 20 54 68 65 20 73 65 74 20 6f 66 20 73 65 67    The set of seg
08f0: 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 6b 65 20  ments that make 
0900: 75 70 20 61 6e 20 69 6e 64 65 78 20 2d 20 74 68  up an index - th
0910: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
0920: 65 20 2d 20 61 72 65 0a 2a 2a 20 20 20 72 65 63  e - are.**   rec
0930: 6f 72 64 65 64 20 69 6e 20 61 20 73 69 6e 67 6c  orded in a singl
0940: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0950: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0960: 2e 20 54 68 65 20 72 65 63 6f 72 64 20 69 73 20  . The record is 
0970: 61 20 6c 69 73 74 0a 2a 2a 20 20 20 6f 66 20 53  a list.**   of S
0980: 51 4c 69 74 65 20 76 61 72 69 6e 74 73 2e 20 0a  QLite varints. .
0990: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 65 61 63 68  **.**   For each
09a0: 20 6c 65 76 65 6c 20 66 72 6f 6d 20 30 20 74 6f   level from 0 to
09b0: 20 6e 4d 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   nMax:.**.**    
09c0: 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70   + number of inp
09d0: 75 74 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f  ut segments in o
09e0: 6e 67 6f 69 6e 67 20 6d 65 72 67 65 2e 0a 2a 2a  ngoing merge..**
09f0: 20 20 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d       + total num
0a00: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
0a10: 69 6e 20 6c 65 76 65 6c 2e 0a 2a 2a 20 20 20 20  in level..**    
0a20: 20 2b 20 66 6f 72 20 65 61 63 68 20 73 65 67 6d   + for each segm
0a30: 65 6e 74 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20  ent from oldest 
0a40: 74 6f 20 6e 65 77 65 73 74 3a 0a 2a 2a 20 20 20  to newest:.**   
0a50: 20 20 20 20 20 20 2b 20 73 65 67 6d 65 6e 74 20        + segment 
0a60: 69 64 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a  id (always > 0).
0a70: 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 62 2d 74  **         + b-t
0a80: 72 65 65 20 68 65 69 67 68 74 20 28 31 20 2d 3e  ree height (1 ->
0a90: 20 72 6f 6f 74 20 69 73 20 6c 65 61 66 2c 20 32   root is leaf, 2
0aa0: 20 2d 3e 20 72 6f 6f 74 20 69 73 20 70 61 72 65   -> root is pare
0ab0: 6e 74 20 6f 66 20 6c 65 61 66 20 65 74 63 2e 29  nt of leaf etc.)
0ac0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69  .**         + fi
0ad0: 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  rst leaf page nu
0ae0: 6d 62 65 72 20 28 6f 66 74 65 6e 20 31 29 0a 2a  mber (often 1).*
0af0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0b00: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0b10: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0b20: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0b30: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0b40: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0b50: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0b60: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0b70: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0b80: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0b90: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0ba0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0bb0: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0bc0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0bd0: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0be0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0bf0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0c00: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0c10: 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a 2a 20 20 20  n for all .**   
0c20: 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c  rows of the tabl
0c30: 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d  e..**.** 3. Segm
0c40: 65 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a  ent leaves:.**.*
0c50: 2a 20 20 20 54 45 52 4d 20 44 4f 43 4c 49 53 54  *   TERM DOCLIST
0c60: 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20   FORMAT:.**.**  
0c70: 20 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20     Most of each 
0c80: 73 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20  segment leaf is 
0c90: 74 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d  taken up by term
0ca0: 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54  /doclist data. T
0cb0: 68 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72  he .**     gener
0cc0: 61 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65  al format of the
0cd0: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61   term/doclist da
0ce0: 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ta is:.**.**    
0cf0: 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69       varint : si
0d00: 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  ze of first term
0d10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 6c 6f 62  .**         blob
0d20: 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20  :    first term 
0d30: 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  data.**         
0d40: 64 6f 63 6c 69 73 74 3a 20 66 69 72 73 74 20 64  doclist: first d
0d50: 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20  oclist.**       
0d60: 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b    zero-or-more {
0d70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0d80: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0d90: 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e   bytes in common
0da0: 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 74   with previous t
0db0: 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  erm.**          
0dc0: 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72   varint:  number
0dd0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
0de0: 20 74 65 72 6d 20 64 61 74 61 20 28 6e 4e 65 77   term data (nNew
0df0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 62  ).**           b
0e00: 6c 6f 62 3a 20 20 20 20 6e 4e 65 77 20 62 79 74  lob:    nNew byt
0e10: 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20 64  es of new term d
0e20: 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ata.**          
0e30: 20 64 6f 63 6c 69 73 74 3a 20 6e 65 78 74 20 64   doclist: next d
0e40: 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20  oclist.**       
0e50: 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f    }.**.**     do
0e60: 63 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a  clist format:.**
0e70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69  .**         vari
0e80: 6e 74 3a 20 20 66 69 72 73 74 20 72 6f 77 69 64  nt:  first rowid
0e90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6f 73 6c  .**         posl
0ea0: 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c 69  ist: first posli
0eb0: 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65  st.**         ze
0ec0: 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20  ro-or-more {.** 
0ed0: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
0ee0: 3a 20 20 72 6f 77 69 64 20 64 65 6c 74 61 20 28  :  rowid delta (
0ef0: 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20  always > 0).**  
0f00: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
0f10: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
0f20: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
0f30: 20 20 20 20 20 20 20 20 30 78 30 30 20 62 79 74          0x00 byt
0f40: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 6f 73 6c  e.**.**     posl
0f50: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
0f60: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
0f70: 3a 20 73 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73  : size of poslis
0f80: 74 20 69 6e 20 62 79 74 65 73 2e 20 6e 6f 74 20  t in bytes. not 
0f90: 69 6e 63 6c 75 64 69 6e 67 20 74 68 69 73 20 66  including this f
0fa0: 69 65 6c 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ield..**        
0fb0: 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73   collist: collis
0fc0: 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 30 0a 2a  t for column 0.*
0fd0: 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f  *         zero-o
0fe0: 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20  r-more {.**     
0ff0: 20 20 20 20 20 20 30 78 30 31 20 62 79 74 65 0a        0x01 byte.
1000: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61 72  **           var
1010: 69 6e 74 3a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  int: column numb
1020: 65 72 20 28 49 29 0a 2a 2a 20 20 20 20 20 20 20  er (I).**       
1030: 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c      collist: col
1040: 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
1050: 49 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  I.**         }.*
1060: 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c 69 73 74  *.**     collist
1070: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
1080: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 66         varint: f
1090: 69 72 73 74 20 6f 66 66 73 65 74 20 2b 20 32 0a  irst offset + 2.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 6f         varint: o
10d0: 66 66 73 65 74 20 64 65 6c 74 61 20 2b 20 32 0a  ffset delta + 2.
10e0: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  **         }.**.
10f0: 2a 2a 20 20 20 50 41 47 49 4e 41 54 49 4f 4e 0a  **   PAGINATION.
1100: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 6f  **.**     The fo
1110: 72 6d 61 74 20 64 65 73 63 72 69 62 65 64 20 61  rmat described a
1120: 62 6f 76 65 20 69 73 20 6f 6e 6c 79 20 61 63 63  bove is only acc
1130: 75 72 61 74 65 20 69 66 20 74 68 65 20 65 6e 74  urate if the ent
1140: 69 72 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74  ire term/doclist
1150: 0a 2a 2a 20 20 20 20 20 64 61 74 61 20 66 69 74  .**     data fit
1160: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65  s on a single le
1170: 61 66 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  af page. If this
1180: 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
1190: 2c 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  , the format.** 
11a0: 20 20 20 20 69 73 20 63 68 61 6e 67 65 64 20 69      is changed i
11b0: 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a  n two ways:.**.*
11c0: 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74 68 65  *       + if the
11d0: 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
11e0: 61 20 70 61 67 65 20 6f 63 63 75 72 73 20 62 65  a page occurs be
11f0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 74  fore the first t
1200: 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20 20 20  erm, it.**      
1210: 20 20 20 69 73 20 73 74 6f 72 65 64 20 61 73 20     is stored as 
1220: 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 3a  a literal value:
1230: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1240: 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69 72 73     varint:  firs
1250: 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 20 20  t rowid.**.**   
1260: 20 20 20 20 2b 20 74 68 65 20 66 69 72 73 74 20      + the first 
1270: 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  term on each pag
1280: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
1290: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 74  he same way as t
12a0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 65  he.**         ve
12b0: 72 79 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  ry first term of
12c0: 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a 2a 2a   the segment:.**
12d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12e0: 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20 6f 66  varint : size of
12f0: 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a 20 20   first term.**  
1300: 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a             blob:
1310: 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 64      first term d
1320: 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20 20 45 61  ata.**.**     Ea
1330: 63 68 20 6c 65 61 66 20 70 61 67 65 20 62 65 67  ch leaf page beg
1340: 69 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20  ins with:.**.** 
1350: 20 20 20 20 20 20 2b 20 32 2d 62 79 74 65 20 75        + 2-byte u
1360: 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61 69 6e 69  nsigned containi
1370: 6e 67 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  ng offset to fir
1380: 73 74 20 72 6f 77 69 64 20 28 6f 72 20 30 29 2e  st rowid (or 0).
1390: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79  .**       + 2-by
13a0: 74 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74  te unsigned cont
13b0: 61 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f  aining offset to
13c0: 20 66 69 72 73 74 20 74 65 72 6d 20 28 6f 72 20   first term (or 
13d0: 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 6c 6c  0)..**.**   Foll
13e0: 6f 77 65 64 20 62 79 20 74 65 72 6d 2f 64 6f 63  owed by term/doc
13f0: 6c 69 73 74 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  list data..**.**
1400: 20 34 2e 20 53 65 67 6d 65 6e 74 20 69 6e 74 65   4. Segment inte
1410: 72 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a 2a 0a 2a  rior nodes:.**.*
1420: 2a 20 20 20 54 68 65 20 69 6e 74 65 72 69 6f 72  *   The interior
1430: 20 6e 6f 64 65 73 20 74 75 72 6e 20 74 68 65 20   nodes turn the 
1440: 6c 69 73 74 20 6f 66 20 6c 65 61 76 65 73 20 69  list of leaves i
1450: 6e 74 6f 20 61 20 62 2b 74 72 65 65 2e 20 0a 2a  nto a b+tree. .*
1460: 2a 0a 2a 2a 20 20 20 45 61 63 68 20 69 6e 74 65  *.**   Each inte
1470: 72 69 6f 72 20 6e 6f 64 65 20 62 65 67 69 6e 73  rior node begins
1480: 20 77 69 74 68 20 61 20 76 61 72 69 6e 74 20 2d   with a varint -
1490: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
14a0: 20 6f 66 20 74 68 65 20 6c 65 66 74 0a 2a 2a 20   of the left.** 
14b0: 20 20 6d 6f 73 74 20 63 68 69 6c 64 20 6e 6f 64    most child nod
14c0: 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  e. Following thi
14d0: 73 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66  s, for each leaf
14e0: 20 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65   page except the
14f0: 20 66 69 72 73 74 2c 0a 2a 2a 20 20 20 74 68 65   first,.**   the
1500: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20   interior nodes 
1510: 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20  contain:.**.**  
1520: 20 20 20 61 29 20 49 66 20 74 68 65 20 6c 65 61     a) If the lea
1530: 66 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  f page contains 
1540: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72  at least one ter
1550: 6d 2c 20 74 68 65 6e 20 61 20 74 65 72 6d 2d 70  m, then a term-p
1560: 72 65 66 69 78 20 74 68 61 74 0a 2a 2a 20 20 20  refix that.**   
1570: 20 20 20 20 20 69 73 20 67 72 65 61 74 65 72 20       is greater 
1580: 74 68 61 6e 20 61 6c 6c 20 70 72 65 76 69 6f 75  than all previou
1590: 73 20 74 65 72 6d 73 2c 20 61 6e 64 20 6c 65 73  s terms, and les
15a0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
15b0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
15c0: 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
15d0: 68 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a  he leaf page..**
15e0: 0a 2a 2a 20 20 20 20 20 62 29 20 49 66 20 74 68  .**     b) If th
15f0: 65 20 6c 65 61 66 20 70 61 67 65 20 6e 6f 20 74  e leaf page no t
1600: 65 72 6d 73 2c 20 61 20 72 65 63 6f 72 64 20 69  erms, a record i
1610: 6e 64 69 63 61 74 69 6e 67 20 68 6f 77 20 6d 61  ndicating how ma
1620: 6e 79 20 63 6f 6e 73 65 63 75 74 69 76 65 0a 2a  ny consecutive.*
1630: 2a 20 20 20 20 20 20 20 20 6c 65 61 76 65 73 20  *        leaves 
1640: 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
1650: 2c 20 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72  , and whether or
1660: 20 6e 6f 74 20 74 68 65 72 65 20 69 73 20 61 6e   not there is an
1670: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 20   associated.**  
1680: 20 20 20 20 20 20 62 79 2d 72 6f 77 69 64 20 69        by-rowid i
1690: 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ndex record..**.
16a0: 2a 2a 20 20 20 42 79 20 64 65 66 69 6e 69 74 69  **   By definiti
16b0: 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 65 76  on, there is nev
16c0: 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  er more than one
16d0: 20 74 79 70 65 20 28 62 29 20 72 65 63 6f 72 64   type (b) record
16e0: 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a 20 20 20   in a row..**   
16f0: 54 79 70 65 20 28 62 29 20 72 65 63 6f 72 64 73  Type (b) records
1700: 20 6f 6e 6c 79 20 65 76 65 72 20 61 70 70 65 61   only ever appea
1710: 72 20 6f 6e 20 68 65 69 67 68 74 3d 31 20 70 61  r on height=1 pa
1720: 67 65 73 20 2d 20 69 6d 6d 65 64 69 61 74 65 20  ges - immediate 
1730: 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20  parents.**   of 
1740: 6c 65 61 76 65 73 2e 20 4f 6e 6c 79 20 74 79 70  leaves. Only typ
1750: 65 20 28 61 29 20 72 65 63 6f 72 64 73 20 61 72  e (a) records ar
1760: 65 20 70 75 73 68 65 64 20 74 6f 20 68 69 67 68  e pushed to high
1770: 65 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a 0a 2a 2a  er levels..**.**
1780: 20 20 20 54 65 72 6d 20 66 6f 72 6d 61 74 3a 0a     Term format:.
1790: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62  **.**     * Numb
17a0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  er of bytes in c
17b0: 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69  ommon with previ
17c0: 6f 75 73 20 74 65 72 6d 20 70 6c 75 73 20 32 2c  ous term plus 2,
17d0: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
17e0: 20 20 20 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66       * Number of
17f0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
1800: 72 6d 20 64 61 74 61 2c 20 61 73 20 61 20 76 61  rm data, as a va
1810: 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 6e  rint..**     * n
1820: 65 77 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a  ew term data..**
1830: 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d 20 66 6f  .**   No-term fo
1840: 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rmat:.**.**     
1850: 2a 20 65 69 74 68 65 72 20 61 6e 20 30 78 30 30  * either an 0x00
1860: 20 6f 72 20 30 78 30 31 20 62 79 74 65 2e 20 49   or 0x01 byte. I
1870: 66 20 74 68 65 20 76 61 6c 75 65 20 30 78 30 31  f the value 0x01
1880: 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 74   is used, then t
1890: 68 65 72 65 20 0a 2a 2a 20 20 20 20 20 20 20 69  here .**       i
18a0: 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  s an associated 
18b0: 69 6e 64 65 78 2d 62 79 2d 72 6f 77 69 64 20 72  index-by-rowid r
18c0: 65 63 6f 72 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  ecord..**     * 
18d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65  the number of ze
18e0: 72 6f 2d 74 65 72 6d 20 6c 65 61 76 65 73 20 61  ro-term leaves a
18f0: 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
1900: 2a 20 35 2e 20 53 65 67 6d 65 6e 74 20 64 6f 63  * 5. Segment doc
1910: 6c 69 73 74 20 69 6e 64 65 78 65 73 3a 0a 2a 2a  list indexes:.**
1920: 0a 2a 2a 20 20 20 41 20 6c 69 73 74 20 6f 66 20  .**   A list of 
1930: 76 61 72 69 6e 74 73 20 2d 20 74 68 65 20 66 69  varints - the fi
1940: 72 73 74 20 64 6f 63 69 64 20 6f 6e 20 65 61 63  rst docid on eac
1950: 68 20 70 61 67 65 20 28 73 74 61 72 74 69 6e 67  h page (starting
1960: 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 20 20 66   with the.**   f
1970: 69 72 73 74 20 74 65 72 6d 6c 65 73 73 20 70 61  irst termless pa
1980: 67 65 29 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  ge) of the docli
1990: 73 74 2e 20 46 69 72 73 74 20 65 6c 65 6d 65 6e  st. First elemen
19a0: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73  t in the list is
19b0: 20 61 0a 2a 2a 20 20 20 6c 69 74 65 72 61 6c 20   a.**   literal 
19c0: 64 6f 63 69 64 2e 20 45 61 63 68 20 64 6f 63 69  docid. Each doci
19d0: 64 20 74 68 65 72 65 61 66 74 65 72 20 69 73 20  d thereafter is 
19e0: 61 20 28 6e 65 67 61 74 69 76 65 29 20 64 65 6c  a (negative) del
19f0: 74 61 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ta. If there.** 
1a00: 20 20 61 72 65 20 6e 6f 20 64 6f 63 69 64 73 20    are no docids 
1a10: 61 74 20 61 6c 6c 20 6f 6e 20 61 20 70 61 67 65  at all on a page
1a20: 2c 20 61 20 30 78 30 30 20 62 79 74 65 20 74 61  , a 0x00 byte ta
1a30: 6b 65 73 20 74 68 65 20 70 6c 61 63 65 20 6f 66  kes the place of
1a40: 20 74 68 65 0a 2a 2a 20 20 20 64 65 6c 74 61 20   the.**   delta 
1a50: 76 61 6c 75 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  value..*/../*.**
1a60: 20 52 6f 77 69 64 73 20 66 6f 72 20 74 68 65 20   Rowids for the 
1a70: 61 76 65 72 61 67 65 73 20 61 6e 64 20 73 74 72  averages and str
1a80: 75 63 74 75 72 65 20 72 65 63 6f 72 64 73 20 69  ucture records i
1a90: 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  n the %_data tab
1aa0: 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  le..*/.#define F
1ab0: 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
1ac0: 49 44 20 20 20 20 20 31 20 20 20 20 2f 2a 20 52  ID     1    /* R
1ad0: 6f 77 69 64 20 75 73 65 64 20 66 6f 72 20 74 68  owid used for th
1ae0: 65 20 61 76 65 72 61 67 65 73 20 72 65 63 6f 72  e averages recor
1af0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  d */.#define FTS
1b00: 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
1b10: 44 28 69 49 64 78 29 20 28 31 30 20 2b 20 28 69  D(iIdx) (10 + (i
1b20: 49 64 78 29 29 20 20 20 20 20 2f 2a 20 46 6f 72  Idx))     /* For
1b30: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
1b40: 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  ds */../*.** Mac
1b50: 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ros determining 
1b60: 74 68 65 20 72 6f 77 69 64 73 20 75 73 65 64 20  the rowids used 
1b70: 62 79 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 73  by segment nodes
1b80: 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 69 6e 20 61  . All nodes in a
1b90: 6c 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 66  ll.** segments f
1ba0: 6f 72 20 61 6c 6c 20 69 6e 64 65 78 65 73 20 28  or all indexes (
1bb0: 74 68 65 20 72 65 67 75 6c 61 72 20 46 54 53 20  the regular FTS 
1bc0: 69 6e 64 65 78 20 61 6e 64 20 61 6e 79 20 70 72  index and any pr
1bd0: 65 66 69 78 20 69 6e 64 65 78 65 73 29 0a 2a 2a  efix indexes).**
1be0: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
1bf0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
1c00: 77 69 74 68 20 6c 61 72 67 65 20 70 6f 73 69 74  with large posit
1c10: 69 76 65 20 72 6f 77 69 64 73 2e 0a 2a 2a 0a 2a  ive rowids..**.*
1c20: 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62  * The %_data tab
1c30: 6c 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 75  le may contain u
1c40: 70 20 74 6f 20 28 31 3c 3c 46 54 53 35 5f 53 45  p to (1<<FTS5_SE
1c50: 47 4d 45 4e 54 5f 49 4e 44 45 58 5f 42 49 54 53  GMENT_INDEX_BITS
1c60: 29 20 0a 2a 2a 20 69 6e 64 65 78 65 73 20 2d 20  ) .** indexes - 
1c70: 6f 6e 65 20 72 65 67 75 6c 61 72 20 74 65 72 6d  one regular term
1c80: 20 69 6e 64 65 78 20 61 6e 64 20 7a 65 72 6f 20   index and zero 
1c90: 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20 69  or more prefix i
1ca0: 6e 64 65 78 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  ndexes..**.** Ea
1cb0: 63 68 20 73 65 67 6d 65 6e 74 20 69 6e 20 61 6e  ch segment in an
1cc0: 20 69 6e 64 65 78 20 68 61 73 20 61 20 75 6e 69   index has a uni
1cd0: 71 75 65 20 69 64 20 67 72 65 61 74 65 72 20 74  que id greater t
1ce0: 68 61 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  han zero..**.** 
1cf0: 45 61 63 68 20 6e 6f 64 65 20 69 6e 20 61 20 73  Each node in a s
1d00: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73  egment b-tree is
1d10: 20 61 73 73 69 67 6e 65 64 20 61 20 22 70 61 67   assigned a "pag
1d20: 65 20 6e 75 6d 62 65 72 22 20 74 68 61 74 20 69  e number" that i
1d30: 73 20 75 6e 69 71 75 65 0a 2a 2a 20 77 69 74 68  s unique.** with
1d40: 69 6e 20 6e 6f 64 65 73 20 6f 66 20 69 74 73 20  in nodes of its 
1d50: 68 65 69 67 68 74 20 77 69 74 68 69 6e 20 74 68  height within th
1d60: 65 20 73 65 67 6d 65 6e 74 20 28 6c 65 61 66 20  e segment (leaf 
1d70: 6e 6f 64 65 73 20 68 61 76 65 20 61 20 68 65 69  nodes have a hei
1d80: 67 68 74 20 0a 2a 2a 20 6f 66 20 30 2c 20 70 61  ght .** of 0, pa
1d90: 72 65 6e 74 73 20 31 2c 20 65 74 63 2e 29 2e 20  rents 1, etc.). 
1da0: 50 61 67 65 20 6e 75 6d 62 65 72 73 20 61 72 65  Page numbers are
1db0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 65 71 75 65   allocated seque
1dc0: 6e 74 69 61 6c 6c 79 20 73 6f 20 74 68 61 74 0a  ntially so that.
1dd0: 2a 2a 20 61 20 6e 6f 64 65 73 20 70 61 67 65 20  ** a nodes page 
1de0: 6e 75 6d 62 65 72 20 69 73 20 61 6c 77 61 79 73  number is always
1df0: 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 69   one more than i
1e00: 74 73 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 2e  ts left sibling.
1e10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64  .**.** The rowid
1e20: 20 66 6f 72 20 61 20 6e 6f 64 65 20 69 73 20 74   for a node is t
1e30: 68 65 6e 20 66 6f 75 6e 64 20 75 73 69 6e 67 20  hen found using 
1e40: 74 68 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  the FTS5_SEGMENT
1e50: 5f 52 4f 57 49 44 28 29 20 6d 61 63 72 6f 0a 2a  _ROWID() macro.*
1e60: 2a 20 62 65 6c 6f 77 2e 20 54 68 65 20 46 54 53  * below. The FTS
1e70: 35 5f 53 45 47 4d 45 4e 54 5f 2a 5f 42 49 54 53  5_SEGMENT_*_BITS
1e80: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 74   macros define t
1e90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
1ea0: 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 65 6e 63  s used.** to enc
1eb0: 6f 64 65 20 74 68 65 20 74 68 72 65 65 20 46 54  ode the three FT
1ec0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
1ed0: 28 29 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68  () arguments. Th
1ee0: 69 73 20 6d 6f 64 75 6c 65 20 72 65 74 75 72 6e  is module return
1ef0: 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  s.** SQLITE_FULL
1f00: 20 61 6e 64 20 66 61 69 6c 73 20 74 68 65 20 63   and fails the c
1f10: 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e  urrent operation
1f20: 20 69 66 20 74 68 65 79 20 65 76 65 72 20 70 72   if they ever pr
1f30: 6f 76 65 20 74 6f 6f 20 73 6d 61 6c 6c 2e 0a 2a  ove too small..*
1f40: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  /.#define FTS5_D
1f50: 41 54 41 5f 49 44 58 5f 42 20 20 20 20 20 35 20  ATA_IDX_B     5 
1f60: 20 20 20 20 2f 2a 20 4d 61 78 20 6f 66 20 33 31      /* Max of 31
1f70: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   prefix indexes 
1f80: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
1f90: 44 41 54 41 5f 49 44 5f 42 20 20 20 20 20 31 36  DATA_ID_B     16
1fa0: 20 20 20 20 20 2f 2a 20 4d 61 78 20 73 65 67 20       /* Max seg 
1fb0: 69 64 20 6e 75 6d 62 65 72 20 36 35 35 33 35 20  id number 65535 
1fc0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
1fd0: 44 41 54 41 5f 48 45 49 47 48 54 5f 42 20 20 35  DATA_HEIGHT_B  5
1fe0: 20 20 20 20 20 2f 2a 20 4d 61 78 20 62 2d 74 72       /* Max b-tr
1ff0: 65 65 20 68 65 69 67 68 74 20 6f 66 20 33 32 20  ee height of 32 
2000: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
2010: 44 41 54 41 5f 50 41 47 45 5f 42 20 20 20 33 31  DATA_PAGE_B   31
2020: 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 61 67 65       /* Max page
2030: 20 6e 75 6d 62 65 72 20 6f 66 20 32 31 34 37 34   number of 21474
2040: 38 33 36 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e  83648 */..#defin
2050: 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  e FTS5_SEGMENT_R
2060: 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c  OWID(idx, segid,
2070: 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 28   height, pgno) (
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
20a0: 34 29 28 69 64 78 29 20 20 20 20 3c 3c 20 28 46  4)(idx)    << (F
20b0: 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 2b 20  TS5_DATA_ID_B + 
20c0: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
20d0: 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49   + FTS5_DATA_HEI
20e0: 47 48 54 5f 42 29 29 20 2b 20 5c 0a 20 28 28 69  GHT_B)) + \. ((i
20f0: 36 34 29 28 73 65 67 69 64 29 20 20 3c 3c 20 28  64)(segid)  << (
2100: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
2110: 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49   + FTS5_DATA_HEI
2120: 47 48 54 5f 42 29 29 20 2b 20 20 20 20 20 20 20  GHT_B)) +       
2130: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28             \. ((
2140: 69 36 34 29 28 68 65 69 67 68 74 29 20 3c 3c 20  i64)(height) << 
2150: 28 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f  (FTS5_DATA_PAGE_
2160: 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  B)) +           
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28              \. (
2190: 28 69 36 34 29 28 70 67 6e 6f 29 29 20 20 20 20  (i64)(pgno))    
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 29               \.)
21e0: 0a 0a 23 69 66 20 46 54 53 35 5f 4d 41 58 5f 50  ..#if FTS5_MAX_P
21f0: 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20 3e 20  REFIX_INDEXES > 
2200: 28 28 31 3c 3c 46 54 53 35 5f 44 41 54 41 5f 49  ((1<<FTS5_DATA_I
2210: 44 58 5f 42 29 2d 31 29 20 0a 23 20 65 72 72 6f  DX_B)-1) .# erro
2220: 72 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46  r "FTS5_MAX_PREF
2230: 49 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f  IX_INDEXES is to
2240: 6f 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a  o large".#endif.
2250: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 69 67 68  ./*.** The heigh
2260: 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d 74  t of segment b-t
2270: 72 65 65 73 20 69 73 20 61 63 74 75 61 6c 6c 79  rees is actually
2280: 20 6c 69 6d 69 74 65 64 20 74 6f 20 6f 6e 65 20   limited to one 
2290: 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 28 31  less than .** (1
22a0: 3c 3c 48 45 49 47 48 54 5f 42 49 54 53 29 2e 20  <<HEIGHT_BITS). 
22b0: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
22c0: 74 68 65 20 72 6f 77 69 64 20 61 64 64 72 65 73  the rowid addres
22d0: 73 20 73 70 61 63 65 20 66 6f 72 20 6e 6f 64 65  s space for node
22e0: 73 0a 2a 2a 20 77 69 74 68 20 73 75 63 68 20 61  s.** with such a
22f0: 20 68 65 69 67 68 74 20 69 73 20 75 73 65 64 20   height is used 
2300: 62 79 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  by doclist index
2310: 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  es..*/.#define F
2320: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f  TS5_SEGMENT_MAX_
2330: 48 45 49 47 48 54 20 28 28 31 20 3c 3c 20 46 54  HEIGHT ((1 << FT
2340: 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
2350: 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )-1)../*.** The 
2360: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 64 6f  rowid for the do
2370: 63 6c 69 73 74 20 69 6e 64 65 78 20 61 73 73 6f  clist index asso
2380: 63 69 61 74 65 64 20 77 69 74 68 20 6c 65 61 66  ciated with leaf
2390: 20 70 61 67 65 20 70 67 6e 6f 20 6f 66 20 73 65   page pgno of se
23a0: 67 6d 65 6e 74 0a 2a 2a 20 73 65 67 69 64 20 69  gment.** segid i
23b0: 6e 20 69 6e 64 65 78 20 69 64 78 2e 0a 2a 2f 0a  n index idx..*/.
23c0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 4f 43  #define FTS5_DOC
23d0: 4c 49 53 54 5f 49 44 58 5f 52 4f 57 49 44 28 69  LIST_IDX_ROWID(i
23e0: 64 78 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29  dx, segid, pgno)
23f0: 20 5c 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f   \.        FTS5_
2400: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 64  SEGMENT_ROWID(id
2410: 78 2c 20 73 65 67 69 64 2c 20 46 54 53 35 5f 53  x, segid, FTS5_S
2420: 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48  EGMENT_MAX_HEIGH
2430: 54 2c 20 70 67 6e 6f 29 0a 0a 23 69 66 64 65 66  T, pgno)..#ifdef
2440: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
2450: 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f 72  atic int fts5Cor
2460: 72 75 70 74 28 29 20 7b 20 72 65 74 75 72 6e 20  rupt() { return 
2470: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
2480: 54 41 42 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  TAB; }.# define 
2490: 46 54 53 35 5f 43 4f 52 52 55 50 54 20 66 74 73  FTS5_CORRUPT fts
24a0: 35 43 6f 72 72 75 70 74 28 29 0a 23 65 6c 73 65  5Corrupt().#else
24b0: 0a 23 20 64 65 66 69 6e 65 20 46 54 53 35 5f 43  .# define FTS5_C
24c0: 4f 52 52 55 50 54 20 53 51 4c 49 54 45 5f 43 4f  ORRUPT SQLITE_CO
24d0: 52 52 55 50 54 5f 56 54 41 42 0a 23 65 6e 64 69  RRUPT_VTAB.#endi
24e0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
24f0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
2500: 74 20 66 74 73 35 4d 69 73 73 69 6e 67 44 61 74  t fts5MissingDat
2510: 61 28 29 20 7b 20 72 65 74 75 72 6e 20 30 3b 20  a() { return 0; 
2520: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
2530: 20 66 74 73 35 4d 69 73 73 69 6e 67 44 61 74 61   fts5MissingData
2540: 28 29 20 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70  () .#endif...typ
2550: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2560: 42 74 72 65 65 49 74 65 72 20 46 74 73 35 42 74  BtreeIter Fts5Bt
2570: 72 65 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66  reeIter;.typedef
2580: 20 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65   struct Fts5Btre
2590: 65 49 74 65 72 4c 65 76 65 6c 20 46 74 73 35 42  eIterLevel Fts5B
25a0: 74 72 65 65 49 74 65 72 4c 65 76 65 6c 3b 0a 74  treeIterLevel;.t
25b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
25c0: 73 35 43 68 75 6e 6b 49 74 65 72 20 46 74 73 35  s5ChunkIter Fts5
25d0: 43 68 75 6e 6b 49 74 65 72 3b 0a 74 79 70 65 64  ChunkIter;.typed
25e0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44 61  ef struct Fts5Da
25f0: 74 61 20 46 74 73 35 44 61 74 61 3b 0a 74 79 70  ta Fts5Data;.typ
2600: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2610: 44 6c 69 64 78 49 74 65 72 20 46 74 73 35 44 6c  DlidxIter Fts5Dl
2620: 69 64 78 49 74 65 72 3b 0a 74 79 70 65 64 65 66  idxIter;.typedef
2630: 20 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c 74   struct Fts5Mult
2640: 69 53 65 67 49 74 65 72 20 46 74 73 35 4d 75 6c  iSegIter Fts5Mul
2650: 74 69 53 65 67 49 74 65 72 3b 0a 74 79 70 65 64  tiSegIter;.typed
2660: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 4e 6f  ef struct Fts5No
2670: 64 65 49 74 65 72 20 46 74 73 35 4e 6f 64 65 49  deIter Fts5NodeI
2680: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2690: 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69 74  uct Fts5PageWrit
26a0: 65 72 20 46 74 73 35 50 61 67 65 57 72 69 74 65  er Fts5PageWrite
26b0: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
26c0: 74 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63  t Fts5PendingDoc
26d0: 6c 69 73 74 20 46 74 73 35 50 65 6e 64 69 6e 67  list Fts5Pending
26e0: 44 6f 63 6c 69 73 74 3b 0a 74 79 70 65 64 65 66  Doclist;.typedef
26f0: 20 73 74 72 75 63 74 20 46 74 73 35 50 65 6e 64   struct Fts5Pend
2700: 69 6e 67 50 6f 73 6c 69 73 74 20 46 74 73 35 50  ingPoslist Fts5P
2710: 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 3b 0a 74  endingPoslist;.t
2720: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2730: 73 35 50 6f 73 49 74 65 72 20 46 74 73 35 50 6f  s5PosIter Fts5Po
2740: 73 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  sIter;.typedef s
2750: 74 72 75 63 74 20 46 74 73 35 53 65 67 49 74 65  truct Fts5SegIte
2760: 72 20 46 74 73 35 53 65 67 49 74 65 72 3b 0a 74  r Fts5SegIter;.t
2770: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2780: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 46 74  s5DoclistIter Ft
2790: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74  s5DoclistIter;.t
27a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
27b0: 73 35 53 65 67 57 72 69 74 65 72 20 46 74 73 35  s5SegWriter Fts5
27c0: 53 65 67 57 72 69 74 65 72 3b 0a 74 79 70 65 64  SegWriter;.typed
27d0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
27e0: 72 75 63 74 75 72 65 20 46 74 73 35 53 74 72 75  ructure Fts5Stru
27f0: 63 74 75 72 65 3b 0a 74 79 70 65 64 65 66 20 73  cture;.typedef s
2800: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2810: 75 72 65 4c 65 76 65 6c 20 46 74 73 35 53 74 72  ureLevel Fts5Str
2820: 75 63 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70  uctureLevel;.typ
2830: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2840: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2850: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2860: 67 6d 65 6e 74 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  gment;../*.** On
2870: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2880: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2890: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
28a0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
28b0: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
28c0: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
28d0: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
28e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
28f0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
2900: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2910: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
2920: 2f 0a 20 20 69 6e 74 20 70 67 73 7a 3b 20 20 20  /.  int pgsz;   
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 2f 2a 20 54 61 72 67 65 74 20 70 61      /* Target pa
2950: 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  ge size for this
2960: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
2970: 6e 4d 69 6e 4d 65 72 67 65 3b 20 20 20 20 20 20  nMinMerge;      
2980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2990: 69 6e 69 6d 75 6d 20 69 6e 70 75 74 20 73 65 67  inimum input seg
29a0: 6d 65 6e 74 73 20 69 6e 20 61 20 6d 65 72 67 65  ments in a merge
29b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55   */.  int nWorkU
29c0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
29d0: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61        /* Leaf pa
29e0: 67 65 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20  ges in a "unit" 
29f0: 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a  of work */..  /*
2a00: 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20  .  ** Variables 
2a10: 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61  related to the a
2a20: 63 63 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74  ccumulation of t
2a30: 6f 6b 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73  okens and doclis
2a40: 74 73 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20  ts within the.  
2a50: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  ** in-memory has
2a60: 68 20 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20  h tables before 
2a70: 74 68 65 79 20 61 72 65 20 66 6c 75 73 68 65 64  they are flushed
2a80: 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   to disk..  */. 
2a90: 20 46 74 73 33 48 61 73 68 20 2a 61 48 61 73 68   Fts3Hash *aHash
2aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ab0: 20 2f 2a 20 4f 6e 65 20 68 61 73 68 20 66 6f 72   /* One hash for
2ac0: 20 74 65 72 6d 73 2c 20 6f 6e 65 20 66 6f 72 20   terms, one for 
2ad0: 65 61 63 68 20 70 72 65 66 69 78 20 2a 2f 0a 20  each prefix */. 
2ae0: 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67   int nMaxPending
2af0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2b00: 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20   /* Max pending 
2b10: 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73  data before flus
2b20: 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  h to disk */.  i
2b30: 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b  nt nPendingData;
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b50: 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 73 20  * Current bytes 
2b60: 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20  of pending data 
2b70: 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74 65 52  */.  i64 iWriteR
2b80: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2b90: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
2ba0: 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20 62 65  r current doc be
2bb0: 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a  ing written */..
2bc0: 20 20 2f 2a 20 45 72 72 6f 72 20 73 74 61 74 65    /* Error state
2bd0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2c00: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  t error code */.
2c10: 0a 20 20 2f 2a 20 53 74 61 74 65 20 75 73 65 64  .  /* State used
2c20: 20 62 79 20 74 68 65 20 66 74 73 35 44 61 74 61   by the fts5Data
2c30: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  XXX() functions.
2c40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c   */.  sqlite3_bl
2c50: 6f 62 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20  ob *pReader;    
2c60: 20 20 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63 72        /* RO incr
2c70: 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25 5f  -blob open on %_
2c80: 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
2c90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57  sqlite3_stmt *pW
2ca0: 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
2cb0: 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25  /* "INSERT ... %
2cc0: 5f 64 61 74 61 20 56 41 4c 55 45 53 28 3f 2c 3f  _data VALUES(?,?
2cd0: 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  )" */.  sqlite3_
2ce0: 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b 20  stmt *pDeleter; 
2cf0: 20 20 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45          /* "DELE
2d00: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 2e  TE FROM %_data .
2d10: 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c  .. id>=? AND id<
2d20: 3d 3f 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  =?" */.  int nRe
2d30: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
2d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2d50: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63  l number of bloc
2d60: 6b 73 20 72 65 61 64 20 2a 2f 0a 7d 3b 0a 0a 73  ks read */.};..s
2d70: 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73  truct Fts5Doclis
2d80: 74 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 62 41  tIter {.  int bA
2d90: 73 63 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69  sc;.  u8 *a;.  i
2da0: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  nt n;.  int i;..
2db0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
2dc0: 61 62 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d  ables. aPoslist=
2dd0: 3d 30 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69  =0 at EOF */.  i
2de0: 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20  64 iRowid;.  u8 
2df0: 2a 61 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74  *aPoslist;.  int
2e00: 20 6e 50 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f   nPoslist;.};../
2e10: 2a 0a 2a 2a 20 45 61 63 68 20 69 74 65 72 61 74  *.** Each iterat
2e20: 6f 72 20 75 73 65 64 20 62 79 20 65 78 74 65 72  or used by exter
2e30: 6e 61 6c 20 6d 6f 64 75 6c 65 73 20 69 73 20 61  nal modules is a
2e40: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2e50: 69 73 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75  is type..*/.stru
2e60: 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ct Fts5IndexIter
2e70: 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a   {.  Fts5Index *
2e80: 70 49 6e 64 65 78 3b 0a 20 20 46 74 73 35 53 74  pIndex;.  Fts5St
2e90: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
2ea0: 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  ;.  Fts5MultiSeg
2eb0: 49 74 65 72 20 2a 70 4d 75 6c 74 69 3b 0a 20 20  Iter *pMulti;.  
2ec0: 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
2ed0: 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 46 74 73  *pDoclist;.  Fts
2ee0: 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 3b  5Buffer poslist;
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f00: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
2f10: 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69 73  g current poslis
2f20: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
2f30: 20 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 72   single record r
2f40: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2f50: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2f60: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2f70: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2fa0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2fb0: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2fc0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fe0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
2ff0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
3000: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3020: 20 52 65 66 20 63 6f 75 6e 74 20 2a 2f 0a 7d 3b   Ref count */.};
3030: 0a 0a 2f 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 69  ../*.** Before i
3040: 74 20 69 73 20 66 6c 75 73 68 65 64 20 74 6f 20  t is flushed to 
3050: 61 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e  a level-0 segmen
3060: 74 2c 20 74 65 72 6d 20 64 61 74 61 20 69 73 20  t, term data is 
3070: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 0a 2a 2a 20  collected in.** 
3080: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
3090: 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  in the Fts5Index
30a0: 2e 61 48 61 73 68 5b 5d 20 61 72 72 61 79 2e 20  .aHash[] array. 
30b0: 48 61 73 68 20 74 61 62 6c 65 20 6b 65 79 73 20  Hash table keys 
30c0: 61 72 65 0a 2a 2a 20 74 65 72 6d 73 20 28 6f 72  are.** terms (or
30d0: 2c 20 66 6f 72 20 70 72 65 66 69 78 20 69 6e 64  , for prefix ind
30e0: 65 78 65 73 2c 20 74 65 72 6d 20 70 72 65 66 69  exes, term prefi
30f0: 78 65 73 29 20 61 6e 64 20 76 61 6c 75 65 73 20  xes) and values 
3100: 61 72 65 20 69 6e 73 74 61 6e 63 65 73 0a 2a 2a  are instances.**
3110: 20 6f 66 20 74 79 70 65 20 46 74 73 35 50 65 6e   of type Fts5Pen
3120: 64 69 6e 67 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  dingDoclist..*/.
3130: 73 74 72 75 63 74 20 46 74 73 35 50 65 6e 64 69  struct Fts5Pendi
3140: 6e 67 44 6f 63 6c 69 73 74 20 7b 0a 20 20 75 38  ngDoclist {.  u8
3150: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3170: 20 54 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65   Term for this e
3180: 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ntry */.  int nT
3190: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
31a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
31b0: 65 73 20 6f 66 20 64 61 74 61 20 61 74 20 70 54  es of data at pT
31c0: 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 65 6e  erm */.  Fts5Pen
31d0: 64 69 6e 67 50 6f 73 6c 69 73 74 20 2a 70 50 6f  dingPoslist *pPo
31e0: 73 6c 69 73 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b  slist;   /* Link
31f0: 65 64 20 6c 69 73 74 20 6f 66 20 70 6f 73 69 74  ed list of posit
3200: 69 6f 6e 20 6c 69 73 74 73 20 2a 2f 0a 20 20 69  ion lists */.  i
3210: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3230: 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 6c 61 73  * Column for las
3240: 74 20 65 6e 74 72 79 20 69 6e 20 70 50 65 6e 64  t entry in pPend
3250: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f  ing */.  int iPo
3260: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
3270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 20           /* Pos 
3280: 76 61 6c 75 65 20 66 6f 72 20 6c 61 73 74 20 65  value for last e
3290: 6e 74 72 79 20 69 6e 20 70 50 65 6e 64 69 6e 67  ntry in pPending
32a0: 20 2a 2f 0a 20 20 46 74 73 35 50 65 6e 64 69 6e   */.  Fts5Pendin
32b0: 67 44 6f 63 6c 69 73 74 20 2a 70 4e 65 78 74 3b  gDoclist *pNext;
32c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 64 75        /* Used du
32d0: 72 69 6e 67 20 6d 65 72 67 65 20 73 6f 72 74 20  ring merge sort 
32e0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
32f0: 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20  5PendingPoslist 
3300: 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  {.  i64 iRowid; 
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
3330: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 20 65 6e   this doclist en
3340: 74 72 79 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  try */.  Fts5Buf
3350: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
3360: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
3370: 65 6e 74 20 64 6f 63 6c 69 73 74 20 63 6f 6e 74  ent doclist cont
3380: 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 50 65  ents */.  Fts5Pe
3390: 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20 2a 70 4e  ndingPoslist *pN
33a0: 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 50 72 65  ext;      /* Pre
33b0: 76 69 6f 75 73 20 70 6f 73 6c 69 73 74 20 66 6f  vious poslist fo
33c0: 72 20 73 61 6d 65 20 74 65 72 6d 20 2a 2f 0a 7d  r same term */.}
33d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  ;../*.** The con
33e0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73 74  tents of the "st
33f0: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20  ructure" record 
3400: 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 61  for each index a
3410: 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a 2a  re represented.*
3420: 2a 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35 53  * using an Fts5S
3430: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
3440: 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63 68  in memory. Which
3450: 20 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73 20   uses instances 
3460: 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65 72  of the .** other
3470: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 58 58   Fts5StructureXX
3480: 58 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70 6f  X types as compo
3490: 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  nents..*/.struct
34a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
34b0: 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69 53  gment {.  int iS
34c0: 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  egid;           
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
34e0: 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74  ment id */.  int
34f0: 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20   nHeight;       
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3510: 48 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e  Height of segmen
3520: 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  t b-tree */.  in
3530: 74 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20 20  t pgnoFirst;    
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3550: 20 46 69 72 73 74 20 6c 65 61 66 20 70 61 67 65   First leaf page
3560: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
3570: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f  nt */.  int pgno
3580: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
3590: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
35a0: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
35b0: 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d   in segment */.}
35c0: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  ;.struct Fts5Str
35d0: 75 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20 20  uctureLevel {.  
35e0: 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20 20  int nMerge;     
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
3610: 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d 65  ments in incr-me
3620: 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  rge */.  int nSe
3630: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
3640: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
3650: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
3660: 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f  ents on level */
3670: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3680: 53 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20 20  Segment *aSeg;  
3690: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
36a0: 65 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30 5d  egments. aSeg[0]
36b0: 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d   is oldest. */.}
36c0: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  ;.struct Fts5Str
36d0: 75 63 74 75 72 65 20 7b 0a 20 20 75 36 34 20 6e  ucture {.  u64 n
36e0: 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20 20  WriteCounter;   
36f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
3700: 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74 74  tal leaves writt
3710: 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f  en to level 0 */
3720: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20  .  int nLevel;  
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3750: 6c 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69  levels in this i
3760: 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74  ndex */.  Fts5St
3770: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65  ructureLevel aLe
3780: 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20 41 72 72  vel[0];   /* Arr
3790: 61 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76  ay of nLevel lev
37a0: 65 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b  el objects */.};
37b0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63  ../*.** An objec
37c0: 74 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65  t of type Fts5Se
37d0: 67 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20  gWriter is used 
37e0: 74 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d  to write to segm
37f0: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ents..*/.struct 
3800: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b  Fts5PageWriter {
3810: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
3840: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3850: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3860: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
3870: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
3880: 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64  ontaining page d
3890: 61 74 61 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ata */.  Fts5Buf
38a0: 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
38b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
38c0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72  er containing pr
38d0: 65 76 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70  evious term on p
38e0: 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74  age */.};.struct
38f0: 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 7b   Fts5SegWriter {
3900: 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20  .  int iIdx;    
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
3930: 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
3940: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3960: 53 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74  Segid to write t
3970: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74  o */.  int nWrit
3980: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3990: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
39a0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
39b0: 57 72 69 74 65 72 20 2a 2f 0a 20 20 46 74 73 35  Writer */.  Fts5
39c0: 50 61 67 65 57 72 69 74 65 72 20 2a 61 57 72 69  PageWriter *aWri
39d0: 74 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ter;        /* A
39e0: 72 72 61 79 20 6f 66 20 50 61 67 65 57 72 69 74  rray of PageWrit
39f0: 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  er objects */.  
3a00: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69  /* Previous doci
3a30: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3a40: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
3a50: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
3a60: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
3a70: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
3a80: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
3a90: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
3aa0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3ab0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3ac0: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3ad0: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3ae0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  page */.  int nL
3af0: 65 61 66 57 72 69 74 74 65 6e 3b 20 20 20 20 20  eafWritten;     
3b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3b10: 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
3b20: 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  s written */.  i
3b30: 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20  nt nEmpty;      
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74  * Number of cont
3b60: 69 67 75 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73  iguous term-less
3b70: 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 46 74 73 35   nodes */.  Fts5
3b80: 42 75 66 66 65 72 20 64 6c 69 64 78 3b 20 20 20  Buffer dlidx;   
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ba0: 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
3bb0: 20 20 69 36 34 20 69 44 6c 69 64 78 50 72 65 76    i64 iDlidxPrev
3bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3bd0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
3be0: 77 69 64 20 61 70 70 65 6e 64 65 64 20 74 6f 20  wid appended to 
3bf0: 64 6c 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  dlidx */.  int b
3c00: 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 3b 20  DlidxPrevValid; 
3c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3c20: 75 65 20 69 66 20 69 44 6c 69 64 78 50 72 65 76  ue if iDlidxPrev
3c30: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a   is valid */.};.
3c40: 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f  ./*.** Object fo
3c50: 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
3c60: 75 67 68 20 74 68 65 20 6d 65 72 67 65 64 20 72  ugh the merged r
3c70: 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72  esults of one or
3c80: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a   more segments,.
3c90: 2a 2a 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  ** visiting each
3ca0: 20 74 65 72 6d 2f 64 6f 63 69 64 20 70 61 69 72   term/docid pair
3cb0: 20 69 6e 20 74 68 65 20 6d 65 72 67 65 64 20 64   in the merged d
3cc0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20  ata..**.** nSeg 
3cd0: 69 73 20 61 6c 77 61 79 73 20 61 20 70 6f 77 65  is always a powe
3ce0: 72 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  r of two greater
3cf0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
3d00: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3d10: 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  ** segments that
3d20: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
3d30: 6d 65 72 67 69 6e 67 20 64 61 74 61 20 66 72 6f  merging data fro
3d40: 6d 2e 20 42 6f 74 68 20 74 68 65 20 61 53 65 67  m. Both the aSeg
3d50: 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74  [] and.** aFirst
3d60: 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20 73 69  [] arrays are si
3d70: 7a 65 64 20 61 74 20 6e 53 65 67 20 65 6e 74 72  zed at nSeg entr
3d80: 69 65 73 2e 20 54 68 65 20 61 53 65 67 5b 5d 20  ies. The aSeg[] 
3d90: 61 72 72 61 79 20 69 73 20 70 61 64 64 65 64 0a  array is padded.
3da0: 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65 64 20 6f  ** with zeroed o
3db0: 62 6a 65 63 74 73 20 2d 20 74 68 65 73 65 20 61  bjects - these a
3dc0: 72 65 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  re handled as if
3dd0: 20 74 68 65 79 20 77 65 72 65 20 69 74 65 72 61   they were itera
3de0: 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  tors opened.** o
3df0: 6e 20 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73  n empty segments
3e00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
3e10: 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
3e20: 20 73 65 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e   segments aSeg[N
3e30: 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c  ] and aSeg[N+1],
3e40: 20 77 68 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a   where N is an.*
3e50: 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69  * even number, i
3e60: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 46 69 72  s stored in aFir
3e70: 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20  st[(nSeg+N)/2]. 
3e80: 54 68 65 20 22 72 65 73 75 6c 74 22 20 6f 66 20  The "result" of 
3e90: 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73  the .** comparis
3ea0: 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65  on in this conte
3eb0: 78 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  xt is the index 
3ec0: 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  of the iterator 
3ed0: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a  that currently.*
3ee0: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
3ef0: 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77  smaller term/row
3f00: 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  id combination. 
3f10: 49 74 65 72 61 74 6f 72 73 20 61 74 20 45 4f 46  Iterators at EOF
3f20: 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   are.** consider
3f30: 65 64 20 74 6f 20 62 65 20 67 72 65 61 74 65 72  ed to be greater
3f40: 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20   than all other 
3f50: 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a  iterators..**.**
3f60: 20 61 46 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61   aFirst[1] conta
3f70: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ins the index in
3f80: 20 61 53 65 67 5b 5d 20 6f 66 20 74 68 65 20 69   aSeg[] of the i
3f90: 74 65 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69  terator that poi
3fa0: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d  nts to.** the sm
3fb0: 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76 65 72 61  allest key overa
3fc0: 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d 20 69 73  ll. aFirst[0] is
3fd0: 20 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a 73 74 72   unused. .*/.str
3fe0: 75 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67  uct Fts5MultiSeg
3ff0: 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65  Iter {.  int nSe
4000: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4020: 20 6f 66 20 61 53 65 67 5b 5d 20 61 72 72 61 79   of aSeg[] array
4030: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4060: 20 69 74 65 72 61 74 65 20 69 6e 20 72 65 76 65   iterate in reve
4070: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46  rse order */.  F
4080: 74 73 35 53 65 67 49 74 65 72 20 2a 61 53 65 67  ts5SegIter *aSeg
4090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
40a0: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d 65  * Array of segme
40b0: 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a  nt iterators */.
40c0: 20 20 75 31 36 20 2a 61 46 69 72 73 74 3b 20 20    u16 *aFirst;  
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65 72    /* Current mer
40f0: 67 65 20 73 74 61 74 65 20 28 73 65 65 20 61 62  ge state (see ab
4100: 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ove) */.};../*.*
4110: 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65  * Object for ite
4120: 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
4130: 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2c   single segment,
4140: 20 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74   visiting each t
4150: 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a 20 70 61 69  erm/docid.** pai
4160: 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  r in the segment
4170: 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a 2a 2a  ..**.** pSeg:.**
4180: 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74 20 74     The segment t
4190: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
41a0: 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 50 67  h..**.** iLeafPg
41b0: 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65 6e 74  no:.**   Current
41c0: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
41d0: 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74  r within segment
41e0: 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f 66 66  ..**.** iLeafOff
41f0: 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65 20 6f  set:.**   Byte o
4200: 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65  ffset within the
4210: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 74 68   current leaf th
4220: 61 74 20 69 73 20 6f 6e 65 20 62 79 74 65 20 70  at is one byte p
4230: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
4240: 68 65 0a 2a 2a 20 20 20 72 6f 77 69 64 20 66 69  he.**   rowid fi
4250: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  eld of the curre
4260: 6e 74 20 65 6e 74 72 79 2e 20 55 73 75 61 6c 6c  nt entry. Usuall
4270: 79 20 74 68 69 73 20 69 73 20 74 68 65 20 73 69  y this is the si
4280: 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  ze field of the.
4290: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
42a0: 73 74 20 64 61 74 61 2e 20 54 68 65 20 65 78 63  st data. The exc
42b0: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
42c0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
42d0: 75 72 72 65 6e 74 20 65 6e 74 72 79 20 0a 2a 2a  urrent entry .**
42e0: 20 20 20 69 73 20 74 68 65 20 6c 61 73 74 20 74     is the last t
42f0: 68 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 61 66  hing on the leaf
4300: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 4c 65   page..**.** pLe
4310: 61 66 3a 0a 2a 2a 20 20 20 42 75 66 66 65 72 20  af:.**   Buffer 
4320: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65  containing curre
4330: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 64 61 74  nt leaf page dat
4340: 61 2e 20 53 65 74 20 74 6f 20 4e 55 4c 4c 20 61  a. Set to NULL a
4350: 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 54 65  t EOF..**.** iTe
4360: 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 69 54 65 72  rmLeafPgno, iTer
4370: 6d 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20  mLeafOffset:.** 
4380: 20 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62    Leaf page numb
4390: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
43a0: 65 20 6c 61 73 74 20 74 65 72 6d 20 72 65 61 64  e last term read
43b0: 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e   from the segmen
43c0: 74 2e 20 41 6e 64 0a 2a 2a 20 20 20 74 68 65 20  t. And.**   the 
43d0: 6f 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74 65  offset immediate
43e0: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
43f0: 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a 2a   term data..**.*
4400: 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20 20 20 4d 61  * flags:.**   Ma
4410: 73 6b 20 6f 66 20 46 54 53 35 5f 53 45 47 49 54  sk of FTS5_SEGIT
4420: 45 52 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49  ER_XXX values. I
4430: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
4440: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46  llows:.**.**   F
4450: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
4460: 45 52 4d 3a 0a 2a 2a 20 20 20 20 20 49 66 20 73  ERM:.**     If s
4470: 65 74 2c 20 73 65 74 20 74 68 65 20 69 74 65 72  et, set the iter
4480: 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ator to point to
4490: 20 45 4f 46 20 61 66 74 65 72 20 74 68 65 20 63   EOF after the c
44a0: 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 0a  urrent doclist .
44b0: 2a 2a 20 20 20 20 20 68 61 73 20 62 65 65 6e 20  **     has been 
44c0: 65 78 68 61 75 73 74 65 64 2e 20 44 6f 20 6e 6f  exhausted. Do no
44d0: 74 20 70 72 6f 63 65 65 64 20 74 6f 20 74 68 65  t proceed to the
44e0: 20 6e 65 78 74 20 74 65 72 6d 20 69 6e 20 74 68   next term in th
44f0: 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  e segment..**.**
4500: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
4510: 52 45 56 45 52 53 45 3a 0a 2a 2a 20 20 20 20 20  REVERSE:.**     
4520: 54 68 69 73 20 66 6c 61 67 20 69 73 20 6f 6e 6c  This flag is onl
4530: 79 20 65 76 65 72 20 73 65 74 20 69 66 20 46 54  y ever set if FT
4540: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
4550: 52 4d 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20  RM is also set. 
4560: 49 66 0a 2a 2a 20 20 20 20 20 69 74 20 69 73 20  If.**     it is 
4570: 73 65 74 2c 20 69 74 65 72 61 74 65 20 74 68 72  set, iterate thr
4580: 6f 75 67 68 20 64 6f 63 69 64 73 20 69 6e 20 61  ough docids in a
4590: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 69  scending order i
45a0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 0a 2a 2a  nstead of the.**
45b0: 20 20 20 20 20 64 65 66 61 75 6c 74 20 64 65 73       default des
45c0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
45d0: 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66 66 73 65  *.** iRowidOffse
45e0: 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65 74 2f 61  t/nRowidOffset/a
45f0: 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a 2a 2a 20  RowidOffset:.** 
4600: 20 20 20 20 54 68 65 73 65 20 61 72 65 20 75 73      These are us
4610: 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53  ed if the FTS5_S
4620: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66  EGITER_REVERSE f
4630: 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  lag is set..**.*
4640: 2a 20 20 20 20 20 45 61 63 68 20 74 69 6d 65 20  *     Each time 
4650: 61 20 6e 65 77 20 70 61 67 65 20 69 73 20 6c 6f  a new page is lo
4660: 61 64 65 64 2c 20 74 68 65 20 69 74 65 72 61 74  aded, the iterat
4670: 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
4680: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  nt to the.**    
4690: 20 66 69 6e 61 6c 20 72 6f 77 69 64 2e 20 41 64   final rowid. Ad
46a0: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
46b0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
46c0: 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65  rray is populate
46d0: 64 20 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  d .**     with t
46e0: 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 73 20  he byte offsets 
46f0: 6f 66 20 61 6c 6c 20 72 65 6c 65 76 61 6e 74 20  of all relevant 
4700: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 6f 6e 20  rowid fields on 
4710: 74 68 65 20 70 61 67 65 2e 20 0a 2a 2f 0a 73 74  the page. .*/.st
4720: 72 75 63 74 20 46 74 73 35 53 65 67 49 74 65 72  ruct Fts5SegIter
4730: 20 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75   {.  Fts5Structu
4740: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
4750: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
4760: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
4770: 67 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  gh */.  int iIdx
4780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4790: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
47a0: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 63 75  offset within cu
47b0: 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20  rrent leaf */.  
47c0: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e 66 69  /* Mask of confi
47f0: 67 75 72 61 74 69 6f 6e 20 66 6c 61 67 73 20 2a  guration flags *
4800: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
4810: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
4820: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
4830: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
4840: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
4850: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
4860: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4870: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 69  leaf data */.  i
4880: 6e 74 20 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  nt iLeafOffset; 
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48a0: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69  * Byte offset wi
48b0: 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61  thin current lea
48c0: 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 70  f */..  /* The p
48d0: 61 67 65 20 61 6e 64 20 6f 66 66 73 65 74 20 66  age and offset f
48e0: 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20 63 75  rom which the cu
48f0: 72 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 72  rrent term was r
4900: 65 61 64 2e 20 54 68 65 20 6f 66 66 73 65 74 20  ead. The offset 
4910: 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 66 66  .  ** is the off
4920: 73 65 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  set of the first
4930: 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 63 75   rowid in the cu
4940: 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e 20 20  rrent doclist.  
4950: 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65  */.  int iTermLe
4960: 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 54  afPgno;.  int iT
4970: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ermLeafOffset;..
4980: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
4990: 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64  ng are only used
49a0: 20 69 66 20 74 68 65 20 46 54 53 35 5f 53 45 47   if the FTS5_SEG
49b0: 49 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c 61  ITER_REVERSE fla
49c0: 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69  g is set. */.  i
49d0: 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b  nt iRowidOffset;
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
49f0: 2a 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20  * Current entry 
4a00: 69 6e 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  in aRowidOffset[
4a10: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69  ] */.  int nRowi
4a20: 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  dOffset;        
4a30: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
4a40: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 77  ted size of aRow
4a50: 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79  idOffset[] array
4a60: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69   */.  int *aRowi
4a70: 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  dOffset;        
4a80: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
4a90: 66 20 6f 66 66 73 65 74 20 74 6f 20 72 6f 77 69  f offset to rowi
4aa0: 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46  d fields */..  F
4ab0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
4ac0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f  lidx;          /
4ad0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
4ae0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f  doclist-index */
4af0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
4b00: 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64   populated based
4b10: 20 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72   on current entr
4b20: 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  y. */.  Fts5Buff
4b30: 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
4b40: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4b50: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34  nt term */.  i64
4b60: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b80: 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f  Current rowid */
4b90: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53  .};..#define FTS
4ba0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
4bb0: 4d 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46  M 0x01.#define F
4bc0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4bd0: 52 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a  RSE 0x02.../*.**
4be0: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
4bf0: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 70 61  ating through pa
4c00: 67 69 6e 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f  ginated data..*/
4c10: 0a 73 74 72 75 63 74 20 46 74 73 35 43 68 75 6e  .struct Fts5Chun
4c20: 6b 49 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61  kIter {.  Fts5Da
4c30: 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
4c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4c50: 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 2e 20  rent leaf data. 
4c60: 4e 55 4c 4c 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a  NULL -> EOF. */.
4c70: 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64    i64 iLeafRowid
4c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c90: 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 72 6f    /* Absolute ro
4ca0: 77 69 64 20 6f 66 20 63 75 72 72 65 6e 74 20 6c  wid of current l
4cb0: 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eaf */.  int nRe
4cc0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61           /* Rema
4ce0: 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64  ining bytes of d
4cf0: 61 74 61 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a  ata to read */..
4d00: 20 20 2f 2a 20 4f 75 74 70 75 74 20 70 61 72 61    /* Output para
4d10: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 75 38 20 2a  meters */.  u8 *
4d20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4d40: 6f 69 6e 74 65 72 20 74 6f 20 63 68 75 6e 6b 20  ointer to chunk 
4d50: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  of data */.  int
4d60: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d80: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
4d90: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a   in bytes */.};.
4da0: 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f  ./*.** Object fo
4db0: 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
4dc0: 75 67 68 20 61 20 73 69 6e 67 6c 65 20 70 6f 73  ugh a single pos
4dd0: 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69  ition list on di
4de0: 73 6b 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  sk..*/.struct Ft
4df0: 73 35 50 6f 73 49 74 65 72 20 7b 0a 20 20 46 74  s5PosIter {.  Ft
4e00: 73 35 43 68 75 6e 6b 49 74 65 72 20 63 68 75 6e  s5ChunkIter chun
4e10: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
4e20: 20 43 75 72 72 65 6e 74 20 63 68 75 6e 6b 20 6f   Current chunk o
4e30: 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  f data */.  int 
4e40: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4e60: 66 66 73 65 74 20 77 69 74 68 69 6e 20 63 68 75  ffset within chu
4e70: 6e 6b 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 6e  nk data */..  in
4e80: 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 50  t iCol;.  int iP
4e90: 6f 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62  os;.};../*.** Ob
4ea0: 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69  ject for iterati
4eb0: 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  ng through the c
4ec0: 6f 6e 65 6e 74 73 20 6f 66 20 61 20 73 69 6e 67  onents of a sing
4ed0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
4ee0: 20 69 6e 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a   in .** memory..
4ef0: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4e 6f  */.struct Fts5No
4f00: 64 65 49 74 65 72 20 7b 0a 20 20 2f 2a 20 49 6e  deIter {.  /* In
4f10: 74 65 72 6e 61 6c 2e 20 53 65 74 20 61 6e 64 20  ternal. Set and 
4f20: 6d 61 6e 61 67 65 64 20 62 79 20 66 74 73 35 4e  managed by fts5N
4f30: 6f 64 65 49 74 65 72 58 58 58 28 29 20 66 75 6e  odeIterXXX() fun
4f40: 63 74 69 6f 6e 73 2e 20 45 78 63 65 70 74 2c 20  ctions. Except, 
4f50: 0a 20 20 2a 2a 20 74 68 65 20 45 4f 46 20 74 65  .  ** the EOF te
4f60: 73 74 20 66 6f 72 20 74 68 65 20 69 74 65 72 61  st for the itera
4f70: 74 6f 72 20 69 73 20 28 46 74 73 35 4e 6f 64 65  tor is (Fts5Node
4f80: 49 74 65 72 2e 61 44 61 74 61 3d 3d 30 29 2e 20  Iter.aData==0). 
4f90: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
4fa0: 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61  aData;.  int nDa
4fb0: 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ta;.  int iOff;.
4fc0: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
4fd0: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35  iables */.  Fts5
4fe0: 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69  Buffer term;.  i
4ff0: 6e 74 20 6e 45 6d 70 74 79 3b 0a 20 20 69 6e 74  nt nEmpty;.  int
5000: 20 69 43 68 69 6c 64 3b 0a 20 20 69 6e 74 20 62   iChild;.  int b
5010: 44 6c 69 64 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Dlidx;.};../*.**
5020: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5030: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  the following ty
5040: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  pe is used to it
5050: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
5060: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
5070: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
5080: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70   record..**.** p
5090: 44 61 74 61 3a 0a 2a 2a 20 20 20 41 20 72 65 66  Data:.**   A ref
50a0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 6c  erence to the dl
50b0: 69 64 78 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 73  idx record..*/.s
50c0: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
50d0: 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61  ter {.  Fts5Data
50e0: 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
50f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
5100: 72 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 2c  r doclist index,
5110: 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
5120: 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
5130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
5140: 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74  rrent offset int
5150: 6f 20 70 44 6c 69 64 78 20 2a 2f 0a 20 20 69 6e  o pDlidx */.  in
5160: 74 20 62 52 6f 77 69 64 56 61 6c 69 64 3b 20 20  t bRowidValid;  
5170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
5180: 52 6f 77 69 64 20 69 73 20 76 61 6c 69 64 20 2a  Rowid is valid *
5190: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
51c0: 61 64 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ady */..  /* Out
51d0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
51e0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
51f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5200: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
5210: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5220: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 5a  page */.  int bZ
5230: 65 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ero;            
5240: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5250: 69 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  if current leaf 
5260: 68 61 73 20 6e 6f 20 72 6f 77 69 64 73 20 2a 2f  has no rowids */
5270: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 2f 2a 20 49 66 20 62 5a 65 72 6f 3d 3d 30 2c   /* If bZero==0,
52a0: 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
52b0: 6c 65 61 66 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a  leaf */.};.../*.
52c0: 2a 2a 20 41 6e 20 46 74 73 35 42 74 72 65 65 49  ** An Fts5BtreeI
52d0: 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20 75 73  ter object is us
52e0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
52f0: 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72 69 65  rough all entrie
5300: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72  s in the.** b-tr
5310: 65 65 20 68 69 65 72 61 72 63 68 79 20 62 65 6c  ee hierarchy bel
5320: 6f 6e 67 69 6e 67 20 74 6f 20 61 20 73 69 6e 67  onging to a sing
5330: 6c 65 20 66 74 73 35 20 73 65 67 6d 65 6e 74 2e  le fts5 segment.
5340: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5350: 65 0a 2a 2a 20 22 62 2d 74 72 65 65 20 68 69 65  e.** "b-tree hie
5360: 72 61 72 63 68 79 22 20 69 73 20 61 6c 6c 20 62  rarchy" is all b
5370: 2d 74 72 65 65 20 6e 6f 64 65 73 20 65 78 63 65  -tree nodes exce
5380: 70 74 20 6c 65 61 76 65 73 2e 20 45 61 63 68 20  pt leaves. Each 
5390: 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
53a0: 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
53b0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
53c0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
53d0: 2a 20 20 20 69 4c 65 61 66 3a 20 20 54 68 65 20  *   iLeaf:  The 
53e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
53f0: 68 65 20 6c 65 61 66 20 70 61 67 65 20 74 68 65  he leaf page the
5400: 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20 74 6f   entry points to
5410: 2e 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20  ..**.**   term: 
5420: 20 20 41 20 73 70 6c 69 74 2d 6b 65 79 20 74 68    A split-key th
5430: 61 74 20 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20  at all terms on 
5440: 6c 65 61 66 20 70 61 67 65 20 24 69 4c 65 61 66  leaf page $iLeaf
5450: 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
5460: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 68  .**           th
5470: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20  an or equal to. 
5480: 54 68 65 20 22 74 65 72 6d 22 20 61 73 73 6f 63  The "term" assoc
5490: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
54a0: 69 72 73 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20  irst b-tree.**  
54b0: 20 20 20 20 20 20 20 20 20 68 69 65 72 61 72 63           hierarc
54c0: 68 79 20 65 6e 74 72 79 20 28 74 68 65 20 6f 6e  hy entry (the on
54d0: 65 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  e that points to
54e0: 20 6c 65 61 66 20 70 61 67 65 20 31 29 20 69 73   leaf page 1) is
54f0: 20 61 6c 77 61 79 73 20 0a 2a 2a 20 20 20 20 20   always .**     
5500: 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73        an empty s
5510: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e  tring..**.**   n
5520: 45 6d 70 74 79 3a 20 54 68 65 20 6e 75 6d 62 65  Empty: The numbe
5530: 72 20 6f 66 20 65 6d 70 74 79 20 28 74 65 72 6d  r of empty (term
5540: 6c 65 73 73 29 20 6c 65 61 66 20 70 61 67 65 73  less) leaf pages
5550: 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
5560: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 66  y.**           f
5570: 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a  ollowing iLeaf..
5580: 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 42 74  **.** The Fts5Bt
5590: 72 65 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69  reeIter object i
55a0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
55b0: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 74 65 67  art of the integ
55c0: 72 69 74 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e  rity-check code.
55d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 42  .*/.struct Fts5B
55e0: 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a  treeIterLevel {.
55f0: 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73    Fts5NodeIter s
5600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5610: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
5620: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  r the current no
5630: 64 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  de */.  Fts5Data
5640: 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
5650: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
5660: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
5670: 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  node */.};.struc
5680: 74 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20  t Fts5BtreeIter 
5690: 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
56a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56b0: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
56c0: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
56d0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
56e0: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
56f0: 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
5700: 67 68 20 74 68 69 73 20 73 65 67 6d 65 6e 74 27  gh this segment'
5710: 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  s b-tree */.  in
5720: 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5740: 20 49 6e 64 65 78 20 70 53 65 67 20 62 65 6c 6f   Index pSeg belo
5750: 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ngs to */.  int 
5760: 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nLvl;           
5770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5780: 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20 61 72  ize of aLvl[] ar
5790: 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 42 74 72  ray */.  Fts5Btr
57a0: 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 61 4c 76  eeIterLevel *aLv
57b0: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65  l;       /* Leve
57c0: 6c 20 66 6f 72 20 65 61 63 68 20 74 69 65 72 20  l for each tier 
57d0: 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  of b-tree */..  
57e0: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
57f0: 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  les */.  Fts5Buf
5800: 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
5810: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
5820: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ent term */.  in
5830: 74 20 69 4c 65 61 66 3b 20 20 20 20 20 20 20 20  t iLeaf;        
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5850: 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69 6e 67   Leaf containing
5860: 20 74 65 72 6d 73 20 3e 3d 20 63 75 72 72 65 6e   terms >= curren
5870: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  t term */.  int 
5880: 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20  nEmpty;         
5890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
58a0: 75 6d 62 65 72 20 6f 66 20 22 65 6d 70 74 79 22  umber of "empty"
58b0: 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e   leaves followin
58c0: 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69 6e 74  g iLeaf */.  int
58d0: 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20   bEof;          
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
58f0: 53 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 45  Set to true at E
5900: 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6c 69  OF */.  int bDli
5910: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
5920: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5930: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
5940: 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a 0a 0a  a dlidx */.};...
5950: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73  /*.** Decode a s
5960: 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69  egment-data rowi
5970: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
5980: 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  a table. This fu
5990: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65  nction is.** the
59a0: 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63   opposite of mac
59b0: 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ro FTS5_SEGMENT_
59c0: 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74  ROWID()..*/.stat
59d0: 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
59e0: 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69  deRowid(.  i64 i
59f0: 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
5a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
5a10: 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20  wid from %_data 
5a20: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  table */.  int *
5a30: 70 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  piIdx,          
5a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
5a50: 54 3a 20 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  T: Index */.  in
5a60: 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20  t *piSegid,     
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a80: 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64   OUT: Segment id
5a90: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69   */.  int *piHei
5aa0: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
5ab0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65        /* OUT: He
5ac0: 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ight */.  int *p
5ad0: 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20  iPgno           
5ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
5af0: 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  : Page number */
5b00: 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20  .){.  *piPgno = 
5b10: 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
5b20: 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
5b30: 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31  DATA_PAGE_B) - 1
5b40: 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
5b50: 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
5b60: 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20  B;..  *piHeight 
5b70: 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
5b80: 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
5b90: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29  5_DATA_HEIGHT_B)
5ba0: 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
5bb0: 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48   >>= FTS5_DATA_H
5bc0: 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 69 53  EIGHT_B;..  *piS
5bd0: 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f  egid = (int)(iRo
5be0: 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
5bf0: 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  < FTS5_DATA_ID_B
5c00: 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69  ) - 1));.  iRowi
5c10: 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
5c20: 49 44 5f 42 3b 0a 0a 20 20 2a 70 69 49 64 78 20  ID_B;..  *piIdx 
5c30: 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
5c40: 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
5c50: 35 5f 44 41 54 41 5f 49 44 58 5f 42 29 20 2d 20  5_DATA_IDX_B) - 
5c60: 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  1));.}..static v
5c70: 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77  oid fts5DebugRow
5c80: 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  id(int *pRc, Fts
5c90: 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
5ca0: 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20  64 iKey){.  int 
5cb0: 69 49 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69  iIdx,iSegid,iHei
5cc0: 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52  ght,iPgno;  /* R
5cd0: 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20  owid compenents 
5ce0: 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52  */.  fts5DecodeR
5cf0: 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 49 64 78  owid(iKey, &iIdx
5d00: 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65 69  , &iSegid, &iHei
5d10: 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
5d20: 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
5d30: 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d  {.    if( iKey==
5d40: 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
5d50: 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  WID ){.      sql
5d60: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
5d70: 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
5d80: 70 42 75 66 2c 20 22 28 61 76 65 72 61 67 65 73  pBuf, "(averages
5d90: 29 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ) ");.    }else{
5da0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
5db0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
5dc0: 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
5dd0: 0a 20 20 20 20 20 20 20 20 20 20 22 28 73 74 72  .          "(str
5de0: 75 63 74 75 72 65 20 69 64 78 3d 25 64 29 22 2c  ucture idx=%d)",
5df0: 20 28 69 6e 74 29 28 69 4b 65 79 2d 31 30 29 0a   (int)(iKey-10).
5e00: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
5e10: 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 69 48   }.  else if( iH
5e20: 65 69 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d  eight==FTS5_SEGM
5e30: 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29  ENT_MAX_HEIGHT )
5e40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
5e50: 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
5e60: 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
5e70: 28 64 6c 69 64 78 20 69 64 78 3d 25 64 20 73 65  (dlidx idx=%d se
5e80: 67 69 64 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22  gid=%d pgno=%d)"
5e90: 2c 0a 20 20 20 20 20 20 20 20 69 49 64 78 2c 20  ,.        iIdx, 
5ea0: 69 53 65 67 69 64 2c 20 69 50 67 6e 6f 0a 20 20  iSegid, iPgno.  
5eb0: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
5ec0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
5ed0: 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
5ee0: 70 52 63 2c 20 70 42 75 66 2c 20 22 28 69 64 78  pRc, pBuf, "(idx
5ef0: 3d 25 64 20 73 65 67 69 64 3d 25 64 20 68 3d 25  =%d segid=%d h=%
5f00: 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20  d pgno=%d)",.   
5f10: 20 20 20 20 20 69 49 64 78 2c 20 69 53 65 67 69       iIdx, iSegi
5f20: 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
5f30: 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
5f40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
5f50: 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74  5PutU16(u8 *aOut
5f60: 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61  , u16 iVal){.  a
5f70: 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e  Out[0] = (iVal>>
5f80: 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20  8);.  aOut[1] = 
5f90: 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a  (iVal&0xFF);.}..
5fa0: 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35 47  static u16 fts5G
5fb0: 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a  etU16(const u8 *
5fc0: 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  aIn){.  return (
5fd0: 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38  (u16)aIn[0] << 8
5fe0: 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a 2f  ) + aIn[1];.}../
5ff0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
6000: 64 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65  d return a buffe
6010: 72 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65  r at least nByte
6020: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
6030: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
6040: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
6050: 65 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ered, return NUL
6060: 4c 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72  L and set the er
6070: 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74  ror code in.** t
6080: 68 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  he Fts5Index han
6090: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
60a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
60b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
60c0: 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28   *fts5IdxMalloc(
60d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
60e0: 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64  t nByte){.  void
60f0: 20 2a 70 52 65 74 3b 0a 20 20 61 73 73 65 72 74   *pRet;.  assert
6100: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6110: 4f 4b 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 73  OK );.  pRet = s
6120: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
6130: 79 74 65 29 3b 0a 20 20 69 66 28 20 70 52 65 74  yte);.  if( pRet
6140: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ==0 ){.    p->rc
6150: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6160: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
6170: 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42  mset(pRet, 0, nB
6180: 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
6190: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pRet;.}.../*.
61a0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63  ** Compare the c
61b0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
61c0: 4c 65 66 74 20 62 75 66 66 65 72 20 77 69 74 68  Left buffer with
61d0: 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67   the pRight/nRig
61e0: 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52  ht blob..**.** R
61f0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
6200: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
6210: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
6220: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
6230: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
6240: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
6250: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
6260: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
6270: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
6280: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
6290: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
62a0: 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a  ferCompareBlob(.
62b0: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c    Fts5Buffer *pL
62c0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
62d0: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73    /* Left hand s
62e0: 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ide of compariso
62f0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
6300: 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69  *pRight, int nRi
6310: 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ght    /* Right 
6320: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d  hand side of com
6330: 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  parison */.){.  
6340: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
6350: 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29  Left->n, nRight)
6360: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
6370: 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70  mcmp(pLeft->p, p
6380: 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20  Right, nCmp);.  
6390: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
63a0: 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69   (pLeft->n - nRi
63b0: 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a  ght) : res);.}..
63c0: 23 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74  #if 0.static int
63d0: 20 66 74 73 35 43 6f 6d 70 61 72 65 42 6c 6f 62   fts5CompareBlob
63e0: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c  (.  const u8 *pL
63f0: 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 0a  eft, int nLeft,.
6400: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67    const u8 *pRig
6410: 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29  ht, int nRight.)
6420: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
6430: 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74  IN(nLeft, nRight
6440: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
6450: 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69  emcmp(pLeft, pRi
6460: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
6470: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
6480: 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20  nLeft - nRight) 
6490: 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66  : res);.}.#endif
64a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
64b0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
64c0: 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20  the two buffers 
64d0: 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
64e0: 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a  If one buffer.**
64f0: 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
6500: 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73  the other, it is
6510: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20   considered the 
6520: 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  lesser..**.** Re
6530: 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66  turn -ve if pLef
6540: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
6550: 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74  n pRight, 0 if t
6560: 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72  hey are equal or
6570: 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68  .** +ve if pRigh
6580: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
6590: 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65  n pLeft. In othe
65a0: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  r words:.**.**  
65b0: 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20     res = *pLeft 
65c0: 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61  - *pRight.*/.sta
65d0: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
65e0: 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75  erCompare(Fts5Bu
65f0: 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73  ffer *pLeft, Fts
6600: 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74 29  5Buffer *pRight)
6610: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
6620: 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69  IN(pLeft->n, pRi
6630: 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72  ght->n);.  int r
6640: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66  es = memcmp(pLef
6650: 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c  t->p, pRight->p,
6660: 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e   nCmp);.  return
6670: 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66   (res==0 ? (pLef
6680: 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e  t->n - pRight->n
6690: 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a  ) : res);.}.../*
66a0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
66b0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
66c0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
66d0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
66e0: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
66f0: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
6700: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
6710: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
6720: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e  3_blob_close(p->
6730: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 70 2d  pReader);.    p-
6740: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
6750: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35  }.}..static Fts5
6760: 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52 65  Data *fts5DataRe
6770: 61 64 4f 72 42 75 66 66 65 72 28 0a 20 20 46 74  adOrBuffer(.  Ft
6780: 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
6790: 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
67a0: 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29   .  i64 iRowid.)
67b0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52  {.  Fts5Data *pR
67c0: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  et = 0;.  if( p-
67d0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
67e0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  {.    int rc = S
67f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30  QLITE_OK;..#if 0
6800: 0a 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20  .Fts5Buffer buf 
6810: 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 66 74 73 35 44  = {0,0,0};.fts5D
6820: 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26  ebugRowid(&rc, &
6830: 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 66 70  buf, iRowid);.fp
6840: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72  rintf(stdout, "r
6850: 65 61 64 3a 20 25 73 5c 6e 22 2c 20 62 75 66 2e  ead: %s\n", buf.
6860: 70 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75  p);.fflush(stdou
6870: 74 29 3b 0a 73 71 6c 69 74 65 33 5f 66 72 65 65  t);.sqlite3_free
6880: 28 62 75 66 2e 70 29 3b 0a 23 65 6e 64 69 66 0a  (buf.p);.#endif.
6890: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62  .    /* If the b
68a0: 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f  lob handle is no
68b0: 74 20 79 65 74 20 6f 70 65 6e 2c 20 6f 70 65 6e  t yet open, open
68c0: 20 61 6e 64 20 73 65 65 6b 20 69 74 2e 20 4f 74   and seek it. Ot
68d0: 68 65 72 77 69 73 65 2c 20 75 73 65 0a 20 20 20  herwise, use.   
68e0: 20 2a 2a 20 74 68 65 20 62 6c 6f 62 5f 72 65 6f   ** the blob_reo
68f0: 70 65 6e 28 29 20 41 50 49 20 74 6f 20 72 65 73  pen() API to res
6900: 65 65 6b 20 74 68 65 20 65 78 69 73 74 69 6e 67  eek the existing
6910: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 20 20 2a   blob handle.  *
6920: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65  /.    if( p->pRe
6930: 61 64 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ader==0 ){.     
6940: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
6950: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
6960: 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  g;.      rc = sq
6970: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
6980: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20  pConfig->db, .  
6990: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
69a0: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
69b0: 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77  l, "block", iRow
69c0: 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64  id, 0, &p->pRead
69d0: 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  er.      );.    
69e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
69f0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
6a00: 65 6f 70 65 6e 28 70 2d 3e 70 52 65 61 64 65 72  eopen(p->pReader
6a10: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
6a20: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 66  ..    if( rc ) f
6a30: 74 73 35 4d 69 73 73 69 6e 67 44 61 74 61 28 29  ts5MissingData()
6a40: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
6a50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6a60: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71    int nByte = sq
6a70: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
6a80: 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20  (p->pReader);.  
6a90: 20 20 20 20 69 66 28 20 70 42 75 66 20 29 7b 0a      if( pBuf ){.
6aa0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
6ab0: 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
6ac0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
6ad0: 47 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20  Grow(&rc, pBuf, 
6ae0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
6af0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
6b00: 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65  b_read(p->pReade
6b10: 72 2c 20 70 42 75 66 2d 3e 70 2c 20 6e 42 79 74  r, pBuf->p, nByt
6b20: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
6b30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6b40: 20 29 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79   ) pBuf->n = nBy
6b50: 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  te;.      }else{
6b60: 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
6b70: 28 46 74 73 35 44 61 74 61 2a 29 66 74 73 35 49  (Fts5Data*)fts5I
6b80: 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
6b90: 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e  of(Fts5Data) + n
6ba0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
6bb0: 66 28 20 21 70 52 65 74 20 29 20 72 65 74 75 72  f( !pRet ) retur
6bc0: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 70 52  n 0;..        pR
6bd0: 65 74 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  et->n = nByte;. 
6be0: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 20 3d         pRet->p =
6bf0: 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a   (u8*)&pRet[1];.
6c00: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52          pRet->nR
6c10: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ef = 1;.        
6c20: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
6c30: 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65  b_read(p->pReade
6c40: 72 2c 20 70 52 65 74 2d 3e 70 2c 20 6e 42 79 74  r, pRet->p, nByt
6c50: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
6c60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6c80: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
6c90: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  ;.          pRet
6ca0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
6cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6cc0: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
6cd0: 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20    p->nRead++;.  
6ce0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
6cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
6d00: 65 76 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  eve a record fro
6d10: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
6d20: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
6d30: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
6d40: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
6d50: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74  nd an error left
6d60: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73 35   in the .** Fts5
6d70: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Index object..*/
6d80: 0a 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61  .static Fts5Data
6d90: 20 2a 66 74 73 35 44 61 74 61 52 65 61 64 28 46   *fts5DataRead(F
6da0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
6db0: 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74 73 35   iRowid){.  Fts5
6dc0: 44 61 74 61 20 2a 70 52 65 74 20 3d 20 66 74 73  Data *pRet = fts
6dd0: 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65  5DataReadOrBuffe
6de0: 72 28 70 2c 20 30 2c 20 69 52 6f 77 69 64 29 3b  r(p, 0, iRowid);
6df0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74  .  assert( (pRet
6e00: 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51  ==0)==(p->rc!=SQ
6e10: 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65  LITE_OK) );.  re
6e20: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
6e30: 0a 2a 2a 20 52 65 61 64 20 61 20 72 65 63 6f 72  .** Read a recor
6e40: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
6e50: 61 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65  a table into the
6e60: 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64   buffer supplied
6e70: 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e   as the.** secon
6e80: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
6e90: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6ea0: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 69  curs, an error i
6eb0: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 46 74  s left in the Ft
6ec0: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20  s5Index object. 
6ed0: 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68  If an.** error h
6ee0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
6ef0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
6f00: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6f10: 2c 20 69 74 20 69 73 20 61 20 0a 2a 2a 20 6e 6f  , it is a .** no
6f20: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
6f30: 6f 69 64 20 66 74 73 35 44 61 74 61 42 75 66 66  oid fts5DataBuff
6f40: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  er(Fts5Index *p,
6f50: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
6f60: 66 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  f, i64 iRowid){.
6f70: 20 20 28 76 6f 69 64 29 66 74 73 35 44 61 74 61    (void)fts5Data
6f80: 52 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20  ReadOrBuffer(p, 
6f90: 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 7d  pBuf, iRowid);.}
6fa0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
6fb0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64  a reference to d
6fc0: 61 74 61 20 72 65 63 6f 72 64 20 72 65 74 75 72  ata record retur
6fd0: 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
6fe0: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73  r call to.** fts
6ff0: 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a  5DataRead()..*/.
7000: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7010: 44 61 74 61 52 65 6c 65 61 73 65 28 46 74 73 35  DataRelease(Fts5
7020: 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20  Data *pData){.  
7030: 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
7040: 20 61 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e   assert( pData->
7050: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 44  nRef>0 );.    pD
7060: 61 74 61 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ata->nRef--;.   
7070: 20 69 66 28 20 70 44 61 74 61 2d 3e 6e 52 65 66   if( pData->nRef
7080: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72  ==0 ) sqlite3_fr
7090: 65 65 28 70 44 61 74 61 29 3b 0a 20 20 7d 0a 7d  ee(pData);.  }.}
70a0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
70b0: 73 35 44 61 74 61 52 65 66 65 72 65 6e 63 65 28  s5DataReference(
70c0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29  Fts5Data *pData)
70d0: 7b 0a 20 20 70 44 61 74 61 2d 3e 6e 52 65 66 2b  {.  pData->nRef+
70e0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45  +;.}../*.** INSE
70f0: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20  RT OR REPLACE a 
7100: 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
7110: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f  %_data table..*/
7120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7130: 35 44 61 74 61 57 72 69 74 65 28 46 74 73 35 49  5DataWrite(Fts5I
7140: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
7150: 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  wid, const u8 *p
7160: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
7170: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  {.  if( p->rc!=S
7180: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
7190: 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72  n;..  if( p->pWr
71a0: 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iter==0 ){.    i
71b0: 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43  nt rc;.    Fts5C
71c0: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
71d0: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
71e0: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
71f0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
7200: 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20         "REPLACE 
7210: 49 4e 54 4f 20 27 25 71 27 2e 25 51 28 69 64 2c  INTO '%q'.%Q(id,
7220: 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f   block) VALUES(?
7230: 2c 3f 29 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  ,?)", pConfig->z
7240: 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a  Db, p->zDataTbl.
7250: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a      );.    if( z
7260: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
7270: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7280: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
7290: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
72a0: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e  _prepare_v2(pCon
72b0: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
72c0: 31 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20  1, &p->pWriter, 
72d0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
72e0: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
72f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
7300: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7310: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
7320: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7330: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
7340: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
7350: 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77  pWriter, 1, iRow
7360: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  id);.  sqlite3_b
7370: 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69  ind_blob(p->pWri
7380: 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e  ter, 2, pData, n
7390: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41  Data, SQLITE_STA
73a0: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
73b0: 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29  step(p->pWriter)
73c0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
73d0: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72  te3_reset(p->pWr
73e0: 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iter);.}../*.** 
73f0: 45 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c  Execute the foll
7400: 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a  owing SQL:.**.**
7410: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
7420: 20 25 5f 64 61 74 61 20 57 48 45 52 45 20 69 64   %_data WHERE id
7430: 20 42 45 54 57 45 45 4e 20 24 69 46 69 72 73 74   BETWEEN $iFirst
7440: 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73   AND $iLast.*/.s
7450: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
7460: 61 74 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e  ataDelete(Fts5In
7470: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72  dex *p, i64 iFir
7480: 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a  st, i64 iLast){.
7490: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
74a0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
74b0: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65  ..  if( p->pDele
74c0: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ter==0 ){.    in
74d0: 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f  t rc;.    Fts5Co
74e0: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
74f0: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
7500: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
7510: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
7520: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
7530: 4f 4d 20 27 25 71 27 2e 25 51 20 57 48 45 52 45  OM '%q'.%Q WHERE
7540: 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f   id>=? AND id<=?
7550: 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c  ", pConfig->zDb,
7560: 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20   p->zDataTbl.   
7570: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
7580: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
7590: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
75a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
75b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
75c0: 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67  epare_v2(pConfig
75d0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
75e0: 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30 29  &p->pDeleter, 0)
75f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
7600: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
7610: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
7620: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7630: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
7640: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7650: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
7660: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44  bind_int64(p->pD
7670: 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72 73  eleter, 1, iFirs
7680: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  t);.  sqlite3_bi
7690: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c  nd_int64(p->pDel
76a0: 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b  eter, 2, iLast);
76b0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
76c0: 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20  p->pDeleter);.  
76d0: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
76e0: 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74 65  reset(p->pDelete
76f0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  r);.}../*.** Clo
7700: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  se the sqlite3_b
7710: 6c 6f 62 20 68 61 6e 64 6c 65 20 75 73 65 64 20  lob handle used 
7720: 74 6f 20 72 65 61 64 20 72 65 63 6f 72 64 73 20  to read records 
7730: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
7740: 74 61 62 6c 65 2e 0a 2a 2a 20 41 6e 64 20 64 69  table..** And di
7750: 73 63 61 72 64 20 61 6e 79 20 63 61 63 68 65 64  scard any cached
7760: 20 72 65 61 64 73 2e 20 54 68 69 73 20 66 75 6e   reads. This fun
7770: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
7780: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  at the end of.**
7790: 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
77a0: 69 6f 6e 20 6f 72 20 77 68 65 6e 20 61 6e 79 20  ion or when any 
77b0: 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
77c0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
77d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
77e0: 74 73 35 44 61 74 61 52 65 73 65 74 28 46 74 73  ts5DataReset(Fts
77f0: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
7800: 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a  ( p->pReader ){.
7810: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
7820: 5f 63 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65  _close(p->pReade
7830: 72 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64  r);.    p->pRead
7840: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  er = 0;.  }.}../
7850: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
7860: 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74  records associat
7870: 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20  ed with segment 
7880: 69 53 65 67 69 64 20 69 6e 20 69 6e 64 65 78 20  iSegid in index 
7890: 69 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iIdx..*/.static 
78a0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6d  void fts5DataRem
78b0: 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49  oveSegment(Fts5I
78c0: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64  ndex *p, int iId
78d0: 78 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b 0a  x, int iSegid){.
78e0: 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 46    i64 iFirst = F
78f0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
7900: 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
7910: 30 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61  0, 0);.  i64 iLa
7920: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
7930: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53  T_ROWID(iIdx, iS
7940: 65 67 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31 3b  egid+1, 0, 0)-1;
7950: 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  .  fts5DataDelet
7960: 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61  e(p, iFirst, iLa
7970: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  st);.}../*.** De
7980: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
7990: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
79a0: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
79b0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
79c0: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
79d0: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
79e0: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
79f0: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
7a00: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
7a10: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
7a20: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
7a30: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
7a40: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
7a50: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
7a60: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
7a70: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
7a80: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
7a90: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
7aa0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7ab0: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
7ac0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
7ad0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
7ae0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7af0: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7b00: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7b10: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7b20: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7b30: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7b50: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7b60: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
7b70: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7b80: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
7b90: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
7ba0: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
7bb0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
7be0: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7bf0: 65 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  es */.  Fts5Stru
7c00: 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20 20 20  cture **ppOut   
7c10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
7c20: 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a  Deserialized obj
7c30: 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
7c40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
7c50: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
7c60: 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e  nt iLvl;.  int n
7c70: 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  Level = 0;.  int
7c80: 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20   nSegment = 0;. 
7c90: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
7cc0: 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
7cd0: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
7ce0: 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a 20 20  e *pRet = 0;..  
7cf0: 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61  /* Read the tota
7d00: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  l number of leve
7d10: 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20  ls and segments 
7d20: 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
7d30: 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63  f the.  ** struc
7d40: 74 75 72 65 20 72 65 63 6f 72 64 2e 20 55 73 65  ture record. Use
7d50: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
7d60: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
7d70: 66 6f 72 20 74 68 65 20 64 65 73 65 72 69 61 6c  for the deserial
7d80: 69 7a 65 64 0a 20 20 2a 2a 20 76 65 72 73 69 6f  ized.  ** versio
7d90: 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e  n of the record.
7da0: 20 2a 2f 0a 20 20 69 20 3d 20 67 65 74 56 61 72   */.  i = getVar
7db0: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7dc0: 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d   nLevel);.  i +=
7dd0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44   getVarint32(&pD
7de0: 61 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74  ata[i], nSegment
7df0: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20  );.  nByte = (. 
7e00: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7e10: 53 74 72 75 63 74 75 72 65 29 20 2b 20 0a 20 20  Structure) + .  
7e20: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7e30: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
7e40: 20 28 6e 4c 65 76 65 6c 2b 31 29 20 2b 0a 20 20   (nLevel+1) +.  
7e50: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7e60: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
7e70: 20 2a 20 28 6e 53 65 67 6d 65 6e 74 2b 6e 4c 65   * (nSegment+nLe
7e80: 76 65 6c 2b 31 29 0a 20 20 29 3b 0a 20 20 70 52  vel+1).  );.  pR
7e90: 65 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  et = (Fts5Struct
7ea0: 75 72 65 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ure*)sqlite3_mal
7eb0: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 0a 20 20 69  loc(nByte);..  i
7ec0: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 75  f( pRet ){.    u
7ed0: 38 20 2a 70 53 70 61 63 65 20 3d 20 28 75 38 2a  8 *pSpace = (u8*
7ee0: 29 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 6e  )&pRet->aLevel[n
7ef0: 4c 65 76 65 6c 2b 31 5d 3b 0a 20 20 20 20 6d 65  Level+1];.    me
7f00: 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42  mset(pRet, 0, nB
7f10: 79 74 65 29 3b 0a 20 20 20 20 70 52 65 74 2d 3e  yte);.    pRet->
7f20: 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b  nLevel = nLevel;
7f30: 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
7f40: 33 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  3GetVarint(&pDat
7f50: 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72  a[i], &pRet->nWr
7f60: 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20  iteCounter);.   
7f70: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
7f80: 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  l<nLevel; iLvl++
7f90: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
7fa0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
7fb0: 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76 65  l = &pRet->aLeve
7fc0: 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iLvl];.      i
7fd0: 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20  nt nTotal;.     
7fe0: 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20 20   int iSeg;..    
7ff0: 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
8000: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
8010: 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20  vl->nMerge);.   
8020: 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e     i += getVarin
8030: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
8040: 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73  Total);.      as
8050: 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c  sert( nTotal>=pL
8060: 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20  vl->nMerge );.  
8070: 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d      pLvl->nSeg =
8080: 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 70   nTotal;.      p
8090: 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  Lvl->aSeg = (Fts
80a0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
80b0: 74 2a 29 70 53 70 61 63 65 3b 0a 20 20 20 20 20  t*)pSpace;.     
80c0: 20 70 53 70 61 63 65 20 2b 3d 20 28 28 6e 54 6f   pSpace += ((nTo
80d0: 74 61 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28  tal+1) * sizeof(
80e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
80f0: 6d 65 6e 74 29 29 3b 0a 0a 20 20 20 20 20 20 66  ment));..      f
8100: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
8110: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
8120: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 67 65  .        i += ge
8130: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
8140: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  [i], pLvl->aSeg[
8150: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
8160: 20 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56         i += getV
8170: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8180: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
8190: 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20  eg].nHeight);.  
81a0: 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61        i += getVa
81b0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
81c0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
81d0: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
81e0: 20 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56         i += getV
81f0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8200: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
8210: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
8220: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8230: 20 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c   pRet->aLevel[nL
8240: 65 76 65 6c 5d 2e 61 53 65 67 20 3d 20 28 46 74  evel].aSeg = (Ft
8250: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8260: 6e 74 2a 29 70 53 70 61 63 65 3b 0a 20 20 7d 65  nt*)pSpace;.  }e
8270: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
8280: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8290: 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74  .  *ppOut = pRet
82a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
82b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65  ../*.** Read, de
82c0: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
82d0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
82e0: 72 65 20 72 65 63 6f 72 64 20 66 6f 72 20 69 6e  re record for in
82f0: 64 65 78 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex iIdx..**.** 
8300: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
8310: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
8320: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
8330: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
8340: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
8350: 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73  allocated as des
8360: 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74  cribed for funct
8370: 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75 72  ion fts5Structur
8380: 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62  eDecode() .** ab
8390: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ove..**.** If an
83a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
83b0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
83c0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
83d0: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a  e left in the.**
83e0: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
83f0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
8400: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
8410: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
8420: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
8430: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
8440: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  op..*/.static Ft
8450: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
8460: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 46  5StructureRead(F
8470: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
8480: 20 69 49 64 78 29 7b 0a 20 20 46 74 73 35 43 6f   iIdx){.  Fts5Co
8490: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
84a0: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74  p->pConfig;.  Ft
84b0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65  s5Structure *pRe
84c0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
84d0: 20 4f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   Object to retur
84e0: 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  n */.  Fts5Data 
84f0: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
8500: 20 20 20 20 20 20 20 2f 2a 20 25 5f 64 61 74 61         /* %_data
8510: 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e 69 6e   entry containin
8520: 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  g structure reco
8530: 72 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rd */..  assert(
8540: 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
8550: 6e 50 72 65 66 69 78 20 29 3b 0a 20 20 70 44 61  nPrefix );.  pDa
8560: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
8570: 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54  d(p, FTS5_STRUCT
8580: 55 52 45 5f 52 4f 57 49 44 28 69 49 64 78 29 29  URE_ROWID(iIdx))
8590: 3b 0a 20 20 69 66 28 20 21 70 44 61 74 61 20 29  ;.  if( !pData )
85a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e   return 0;.  p->
85b0: 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
85c0: 72 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e  reDecode(pData->
85d0: 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26 70 52  p, pData->n, &pR
85e0: 65 74 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61  et);..  fts5Data
85f0: 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
8600: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
8610: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
8620: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
8630: 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  n Fts5Structure 
8640: 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20  object returned 
8650: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a  by an earlier .*
8660: 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74  * call to fts5St
8670: 72 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72  ructureRead() or
8680: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
8690: 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  code()..*/.stati
86a0: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
86b0: 74 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35  tureRelease(Fts5
86c0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
86d0: 63 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ct){.  sqlite3_f
86e0: 72 65 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a  ree(pStruct);.}.
86f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8700: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8710: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
8720: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53  dex structure pS
8730: 74 72 75 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  truct..*/.static
8740: 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75   int fts5Structu
8750: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
8760: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8770: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e  Struct){.  int n
8780: 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20  Segment = 0;    
8790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
87a0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
87b0: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  gments */.  int 
87c0: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
87e0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
87f0: 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
8800: 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20  ..  for(iLvl=0; 
8810: 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
8820: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
8830: 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70     nSegment += p
8840: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8850: 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 7d 0a 0a  Lvl].nSeg;.  }..
8860: 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e    return nSegmen
8870: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69  t;.}../*.** Seri
8880: 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20  alize and store 
8890: 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20  the "structure" 
88a0: 72 65 63 6f 72 64 20 66 6f 72 20 69 6e 64 65 78  record for index
88b0: 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iIdx..**.** If 
88c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
88d0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
88e0: 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35  code in the Fts5
88f0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66  Index object. If
8900: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73   an.** error has
8910: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
8920: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
8930: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
8940: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
8950: 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46  StructureWrite(F
8960: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
8970: 20 69 49 64 78 2c 20 46 74 73 35 53 74 72 75 63   iIdx, Fts5Struc
8980: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
8990: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20    int nSegment; 
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
89c0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  r of segments */
89d0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
89e0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
89f0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
8a00: 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64  serialize record
8a10: 20 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69   into */.  int i
8a20: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
8a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
8a40: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
8a50: 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
8a60: 0a 20 20 6e 53 65 67 6d 65 6e 74 20 3d 20 66 74  .  nSegment = ft
8a70: 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
8a80: 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74  Segments(pStruct
8a90: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66  );.  memset(&buf
8aa0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
8ab0: 42 75 66 66 65 72 29 29 3b 0a 20 20 66 74 73 35  Buffer));.  fts5
8ac0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8ad0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8ae0: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
8af0: 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
8b00: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8b10: 72 63 2c 20 26 62 75 66 2c 20 6e 53 65 67 6d 65  rc, &buf, nSegme
8b20: 6e 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  nt);.  fts5Buffe
8b30: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8b40: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36 34  ->rc, &buf, (i64
8b50: 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65  )pStruct->nWrite
8b60: 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 66 6f 72  Counter);..  for
8b70: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
8b80: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
8b90: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  Lvl++){.    int 
8ba0: 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
8bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8bc0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8bd0: 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
8be0: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
8bf0: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
8c00: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
8c10: 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 66 74 73 35  [iLvl];.    fts5
8c20: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8c30: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8c40: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a   pLvl->nMerge);.
8c50: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
8c60: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
8c70: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
8c80: 53 65 67 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Seg);..    for(i
8c90: 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c  Seg=0; iSeg<pLvl
8ca0: 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ->nSeg; iSeg++){
8cb0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
8cc0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8cd0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8ce0: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
8cf0: 67 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  gid);.      fts5
8d00: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8d10: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8d20: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
8d30: 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20  ].nHeight);.    
8d40: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8d50: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8d60: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
8d70: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
8d80: 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  t);.      fts5Bu
8d90: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8da0: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8db0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8dc0: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 7d  pgnoLast);.    }
8dd0: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
8de0: 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54  Write(p, FTS5_ST
8df0: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69 49  RUCTURE_ROWID(iI
8e00: 64 78 29 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  dx), buf.p, buf.
8e10: 6e 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  n);.  fts5Buffer
8e20: 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 0a  Free(&buf);.}...
8e30: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 49 74  /*.** If the pIt
8e40: 65 72 2d 3e 69 4f 66 66 20 6f 66 66 73 65 74 20  er->iOff offset 
8e50: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
8e60: 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 69 6e 64   to an entry ind
8e70: 69 63 61 74 69 6e 67 20 6f 6e 65 0a 2a 2a 20 6f  icating one.** o
8e80: 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6c 65 73 73  r more term-less
8e90: 20 6e 6f 64 65 73 2c 20 61 64 76 61 6e 63 65 20   nodes, advance 
8ea0: 70 61 73 74 20 69 74 20 61 6e 64 20 73 65 74 20  past it and set 
8eb0: 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 74 6f  pIter->nEmpty to
8ec0: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
8ed0: 66 20 65 6d 70 74 79 20 63 68 69 6c 64 20 6e 6f  f empty child no
8ee0: 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  des..*/.static v
8ef0: 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72  oid fts5NodeIter
8f00: 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 46 74 73  GobbleNEmpty(Fts
8f10: 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72  5NodeIter *pIter
8f20: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ){.  if( pIter->
8f30: 69 4f 66 66 3c 70 49 74 65 72 2d 3e 6e 44 61 74  iOff<pIter->nDat
8f40: 61 20 26 26 20 30 3d 3d 28 70 49 74 65 72 2d 3e  a && 0==(pIter->
8f50: 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66  aData[pIter->iOf
8f60: 66 5d 20 26 20 30 78 66 65 29 20 29 7b 0a 20 20  f] & 0xfe) ){.  
8f70: 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
8f80: 3d 20 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70  = pIter->aData[p
8f90: 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78  Iter->iOff] & 0x
8fa0: 30 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  01;.    pIter->i
8fb0: 4f 66 66 2b 2b 3b 0a 20 20 20 20 70 49 74 65 72  Off++;.    pIter
8fc0: 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72  ->iOff += getVar
8fd0: 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44  int32(&pIter->aD
8fe0: 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d  ata[pIter->iOff]
8ff0: 2c 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29  , pIter->nEmpty)
9000: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9010: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30  Iter->nEmpty = 0
9020: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c  ;.    pIter->bDl
9030: 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  idx = 0;.  }.}..
9040: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f  /*.** Advance to
9050: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
9060: 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 2e  within the node.
9070: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9080: 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74  fts5NodeIterNext
9090: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 4e  (int *pRc, Fts5N
90a0: 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b  odeIter *pIter){
90b0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f  .  if( pIter->iO
90c0: 66 66 3e 3d 70 49 74 65 72 2d 3e 6e 44 61 74 61  ff>=pIter->nData
90d0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   ){.    pIter->a
90e0: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 49  Data = 0;.    pI
90f0: 74 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 70  ter->iChild += p
9100: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20  Iter->nEmpty;.  
9110: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
9120: 50 72 65 2c 20 6e 4e 65 77 3b 0a 20 20 20 20 70  Pre, nNew;.    p
9130: 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65  Iter->iOff += ge
9140: 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
9150: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
9160: 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  Off], nPre);.   
9170: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20   pIter->iOff += 
9180: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  getVarint32(&pIt
9190: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
91a0: 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20  >iOff], nNew);. 
91b0: 20 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e     pIter->term.n
91c0: 20 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20 66   = nPre-2;.    f
91d0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
91e0: 6c 6f 62 28 70 52 63 2c 20 26 70 49 74 65 72 2d  lob(pRc, &pIter-
91f0: 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49 74  >term, nNew, pIt
9200: 65 72 2d 3e 61 44 61 74 61 2b 70 49 74 65 72 2d  er->aData+pIter-
9210: 3e 69 4f 66 66 29 3b 0a 20 20 20 20 70 49 74 65  >iOff);.    pIte
9220: 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  r->iOff += nNew;
9230: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69  .    pIter->iChi
9240: 6c 64 20 2b 3d 20 28 31 20 2b 20 70 49 74 65 72  ld += (1 + pIter
9250: 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 66  ->nEmpty);.    f
9260: 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c  ts5NodeIterGobbl
9270: 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a  eNEmpty(pIter);.
9280: 20 20 20 20 69 66 28 20 2a 70 52 63 20 29 20 70      if( *pRc ) p
9290: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b  Iter->aData = 0;
92a0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
92b0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74  nitialize the it
92c0: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49  erator object pI
92d0: 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  ter to iterate t
92e0: 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
92f0: 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6e  nal.** segment n
9300: 6f 64 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a 2f  ode in pData..*/
9310: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9320: 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 63 6f  5NodeIterInit(co
9330: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 69  nst u8 *aData, i
9340: 6e 74 20 6e 44 61 74 61 2c 20 46 74 73 35 4e 6f  nt nData, Fts5No
9350: 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  deIter *pIter){.
9360: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
9370: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
9380: 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44 61  ));.  pIter->aDa
9390: 74 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 49  ta = aData;.  pI
93a0: 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61  ter->nData = nDa
93b0: 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f 66  ta;.  pIter->iOf
93c0: 66 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  f = getVarint32(
93d0: 61 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 69 43  aData, pIter->iC
93e0: 68 69 6c 64 29 3b 0a 20 20 66 74 73 35 4e 6f 64  hild);.  fts5Nod
93f0: 65 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74  eIterGobbleNEmpt
9400: 79 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  y(pIter);.}../*.
9410: 2a 2a 20 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f  ** Free any memo
9420: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ry allocated by 
9430: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
9440: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
9450: 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72  oid fts5NodeIter
9460: 46 72 65 65 28 46 74 73 35 4e 6f 64 65 49 74 65  Free(Fts5NodeIte
9470: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73  r *pIter){.  fts
9480: 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
9490: 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a  er->term);.}../*
94a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
94b0: 65 72 6f 20 69 66 20 45 4f 46 20 69 73 20 72 65  ero if EOF is re
94c0: 61 63 68 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ached..*/.static
94d0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
94e0: 65 72 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78  erNext(Fts5Dlidx
94f0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
9500: 20 62 52 65 76 29 7b 0a 20 20 69 66 28 20 62 52   bRev){.  if( bR
9510: 65 76 20 29 7b 0a 20 20 20 20 69 36 34 20 69 56  ev ){.    i64 iV
9520: 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  al;.    int iOff
9530: 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66 66 3b 0a   = pIter->iOff;.
9540: 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a      int iLimit;.
9550: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65      u8 *a = pIte
9560: 72 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 0a 20 20  r->pData->p;..  
9570: 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 69    /* Currently i
9580: 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  Off points to th
9590: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
95a0: 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 62  a varint. This b
95b0: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63  lock .    ** dec
95c0: 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e 74  rements iOff unt
95d0: 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
95e0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
95f0: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a  f the previous .
9600: 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
9610: 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74  aking care not t
9620: 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72  o read any memor
9630: 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74  y locations that
9640: 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62 65   occur.    ** be
9650: 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  fore the buffer 
9660: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20  in memory.  */. 
9670: 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66     iLimit = (iOf
9680: 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30  f>9 ? iOff-9 : 0
9690: 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 2d  );.    for(iOff-
96a0: 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20  -; iOff>iLimit; 
96b0: 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69  iOff--){.      i
96c0: 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20  f( (a[iOff-1] & 
96d0: 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61 6b  0x80)==0 ) break
96e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
96f0: 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  r->iOff = iOff;.
9700: 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 3d 30  .    if( iOff<=0
9710: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
9720: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20  >bEof = 1;.     
9730: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
9740: 0a 0a 20 20 20 20 67 65 74 56 61 72 69 6e 74 28  ..    getVarint(
9750: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
9760: 26 69 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  &iVal);.    if( 
9770: 69 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iVal==0 ){.     
9780: 20 70 49 74 65 72 2d 3e 62 5a 65 72 6f 20 3d 20   pIter->bZero = 
9790: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
97a0: 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20   iOff==0 ){.    
97b0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
97c0: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 7d 65 6c 73  = iVal;.    }els
97d0: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
97e0: 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
97f0: 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d      }.    pIter-
9800: 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20  >iLeafPgno--;.  
9810: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 69  }else{.    i64 i
9820: 56 61 6c 3b 0a 20 20 20 20 69 66 28 20 70 49 74  Val;.    if( pIt
9830: 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72 2d  er->iOff>=pIter-
9840: 3e 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20  >pData->n ){.   
9850: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
9860: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
9870: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49   1;.    }.    pI
9880: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74  ter->iOff += get
9890: 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 70  Varint(&pIter->p
98a0: 44 61 74 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69  Data->p[pIter->i
98b0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  Off], (u64*)&iVa
98c0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 56 61 6c  l);.    if( iVal
98d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ==0 ){.      pIt
98e0: 65 72 2d 3e 62 5a 65 72 6f 20 3d 20 31 3b 0a 20  er->bZero = 1;. 
98f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9900: 70 49 74 65 72 2d 3e 62 5a 65 72 6f 20 3d 20 30  pIter->bZero = 0
9910: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
9920: 72 2d 3e 62 52 6f 77 69 64 56 61 6c 69 64 20 29  r->bRowidValid )
9930: 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
9940: 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b  >iRowid -= iVal;
9950: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9960: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 52 6f        pIter->bRo
9970: 77 69 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  widValid = 1;.  
9980: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
9990: 77 69 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20  wid = iVal;.    
99a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49    }.    }.    pI
99b0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b  ter->iLeafPgno++
99c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
99d0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
99e0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
99f0: 73 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  st(Fts5DlidxIter
9a00: 20 2a 70 49 74 65 72 29 7b 0a 20 20 77 68 69 6c   *pIter){.  whil
9a10: 65 28 20 30 3d 3d 66 74 73 35 44 6c 69 64 78 49  e( 0==fts5DlidxI
9a20: 74 65 72 4e 65 78 74 28 70 49 74 65 72 2c 20 30  terNext(pIter, 0
9a30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9a40: 49 74 65 72 2d 3e 69 4f 66 66 3d 3d 70 49 74 65  Iter->iOff==pIte
9a50: 72 2d 3e 70 44 61 74 61 2d 3e 6e 20 26 26 20 70  r->pData->n && p
9a60: 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 31 20 29 3b  Iter->bEof==1 );
9a70: 0a 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d  .  pIter->bEof =
9a80: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   0;.}..static in
9a90: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  t fts5DlidxIterE
9aa0: 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
9ab0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
9ac0: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
9ad0: 20 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f   (p->rc!=SQLITE_
9ae0: 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f  OK || pIter->bEo
9af0: 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  f);.}..static vo
9b00: 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  id fts5DlidxIter
9b10: 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
9b20: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
9b30: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20          /* Fts5 
9b40: 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  Backend to itera
9b50: 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
9b60: 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b80: 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52  * True for ORDER
9b90: 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74   BY ASC */.  int
9ba0: 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65 67 69   iIdx, int iSegi
9bb0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
9bc0: 53 65 67 6d 65 6e 74 20 69 53 65 67 69 64 20 77  Segment iSegid w
9bd0: 69 74 68 69 6e 20 69 6e 64 65 78 20 69 49 64 78  ithin index iIdx
9be0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
9bf0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
9c00: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61        /* Leaf pa
9c10: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61  ge number to loa
9c20: 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 20  d dlidx for */. 
9c30: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
9c40: 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
9c50: 20 2f 2a 20 4f 55 54 3a 20 50 6f 70 75 6c 61 74   /* OUT: Populat
9c60: 65 64 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29  ed iterator */.)
9c70: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
9c80: 72 20 2a 70 49 74 65 72 20 3d 20 2a 70 70 49 74  r *pIter = *ppIt
9c90: 65 72 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  er;.  Fts5Data *
9ca0: 70 44 6c 69 64 78 3b 0a 0a 20 20 70 44 6c 69 64  pDlidx;..  pDlid
9cb0: 78 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  x = fts5DataRead
9cc0: 28 70 2c 20 46 54 53 35 5f 44 4f 43 4c 49 53 54  (p, FTS5_DOCLIST
9cd0: 5f 49 44 58 5f 52 4f 57 49 44 28 69 49 64 78 2c  _IDX_ROWID(iIdx,
9ce0: 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 50 67   iSegid, iLeafPg
9cf0: 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 44 6c 69  no));.  if( pDli
9d00: 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  dx==0 ) return;.
9d10: 20 20 69 66 28 20 70 49 74 65 72 3d 3d 30 20 29    if( pIter==0 )
9d20: 7b 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20  {.    *ppIter = 
9d30: 70 49 74 65 72 20 3d 20 28 46 74 73 35 44 6c 69  pIter = (Fts5Dli
9d40: 64 78 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d  dxIter*)fts5IdxM
9d50: 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
9d60: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b  Fts5DlidxIter));
9d70: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 3d 3d  .    if( pIter==
9d80: 30 20 29 7b 20 0a 20 20 20 20 20 20 66 74 73 35  0 ){ .      fts5
9d90: 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 6c 69  DataRelease(pDli
9da0: 64 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  dx);.      retur
9db0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
9dc0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  {.    memset(pIt
9dd0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
9de0: 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a 20  s5DlidxIter));. 
9df0: 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 61   }..  pIter->pDa
9e00: 74 61 20 3d 20 70 44 6c 69 64 78 3b 0a 0a 20 20  ta = pDlidx;..  
9e10: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
9e20: 20 3d 20 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20   = iLeafPgno;.  
9e30: 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
9e40: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
9e50: 4e 65 78 74 28 70 49 74 65 72 2c 20 30 29 3b 0a  Next(pIter, 0);.
9e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
9e70: 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70  5DlidxIterLast(p
9e80: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Iter);.  }.}../*
9e90: 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69  .** Free a docli
9ea0: 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f  st-index iterato
9eb0: 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74  r object allocat
9ec0: 65 64 20 62 79 20 66 74 73 35 44 6c 69 64 78 49  ed by fts5DlidxI
9ed0: 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  terInit()..*/.st
9ee0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
9ef0: 69 64 78 49 74 65 72 46 72 65 65 28 46 74 73 35  idxIterFree(Fts5
9f00: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
9f10: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
9f20: 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
9f30: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 44 61  lease(pIter->pDa
9f40: 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
9f50: 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
9f60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  }.}../*.** Load 
9f70: 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61  the next leaf pa
9f80: 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d  ge into the segm
9f90: 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f  ent iterator..*/
9fa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9fb0: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
9fc0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
9fd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9fe0: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
9ff0: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
a000: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
a010: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
a020: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
a030: 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70  dvance to next p
a040: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  age */.){.  Fts5
a050: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
a060: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
a070: 70 53 65 67 3b 0a 20 20 69 66 28 20 70 49 74 65  pSeg;.  if( pIte
a080: 72 2d 3e 70 4c 65 61 66 20 29 20 66 74 73 35 44  r->pLeaf ) fts5D
a090: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
a0a0: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65  ->pLeaf);.  pIte
a0b0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a  r->iLeafPgno++;.
a0c0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65    if( pIter->iLe
a0d0: 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67  afPgno<=pSeg->pg
a0e0: 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49  noLast ){.    pI
a0f0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73  ter->pLeaf = fts
a100: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
a110: 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45        FTS5_SEGME
a120: 4e 54 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e  NT_ROWID(pIter->
a130: 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67  iIdx, pSeg->iSeg
a140: 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c  id, 0, pIter->iL
a150: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a  eafPgno).    );.
a160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
a170: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
a180: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 65 61 76   }.}../*.** Leav
a190: 65 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  e pIter->iLeafOf
a1a0: 66 73 65 74 20 61 73 20 74 68 65 20 6f 66 66 73  fset as the offs
a1b0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 66  et to the size f
a1c0: 69 65 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73  ield of the firs
a1d0: 74 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69  t.** position li
a1e0: 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e  st. The position
a1f0: 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20   list belonging 
a200: 74 6f 20 64 6f 63 75 6d 65 6e 74 20 70 49 74 65  to document pIte
a210: 72 2d 3e 69 52 6f 77 69 64 2e 0a 2a 2f 0a 73 74  r->iRowid..*/.st
a220: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
a230: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74  gIterLoadTerm(Ft
a240: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a250: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
a260: 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38  int nKeep){.  u8
a270: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
a280: 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a  af->p;        /*
a290: 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20   Buffer to read 
a2a0: 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  data from */.  i
a2b0: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
a2c0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f  >iLeafOffset;  /
a2d0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64  * Offset to read
a2e0: 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65   at */.  int nNe
a2f0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
a300: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
a310: 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f  s of new data */
a320: 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56  ..  iOff += getV
a330: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
a340: 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74 65 72  , nNew);.  pIter
a350: 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70  ->term.n = nKeep
a360: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
a370: 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
a380: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
a390: 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  New, &a[iOff]);.
a3a0: 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a    iOff += nNew;.
a3b0: 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
a3c0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
a3d0: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
a3e0: 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
a3f0: 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 66  >iLeafPgno;.  if
a400: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  ( iOff>=pIter->p
a410: 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 66  Leaf->n ){.    f
a420: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
a430: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
a440: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
a450: 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  af==0 ){.      i
a460: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
a470: 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  _OK ) p->rc = FT
a480: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
a490: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
a4a0: 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20      iOff = 4;.  
a4b0: 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65    a = pIter->pLe
a4c0: 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66  af->p;.  }.  iOf
a4d0: 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  f += sqlite3GetV
a4e0: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
a4f0: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
a500: 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e  owid);.  pIter->
a510: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
a520: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ff;.}../*.** Ini
a530: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72  tialize the iter
a540: 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65  ator object pIte
a550: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
a560: 6f 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73  ough the entries
a570: 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70   in.** segment p
a580: 53 65 67 20 77 69 74 68 69 6e 20 69 6e 64 65 78  Seg within index
a590: 20 69 49 64 78 2e 20 54 68 65 20 69 74 65 72 61   iIdx. The itera
a5a0: 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
a5b0: 74 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20  ting to the .** 
a5c0: 66 69 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e  first entry when
a5d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
a5e0: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  eturns..**.** If
a5f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a600: 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69  , Fts5Index.rc i
a610: 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72  s set to an appr
a620: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
a630: 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  de. If .** an er
a640: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
a650: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
a660: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
a670: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
a680: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
a690: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
a6a0: 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
a6b0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 0a  x *p,          .
a6c0: 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73    /* Config.aHas
a6f0: 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46 54 53  h[] index of FTS
a700: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35   index */.  Fts5
a710: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
a720: 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
a730: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
a740: 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
a750: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
a760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
a770: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
a780: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65   */.){.  if( pSe
a790: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
a7a0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
a7b0: 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65  appens if the se
a7c0: 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75  gment is being u
a7d0: 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20  sed as an input 
a7e0: 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  to an incrementa
a7f0: 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61  l.    ** merge a
a800: 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  nd all data has 
a810: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72  already been "tr
a820: 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63  immed". See func
a830: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35  tion.    ** fts5
a840: 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66  TrimSegments() f
a850: 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74  or details. In t
a860: 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74  his case leave t
a870: 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74  he iterator empt
a880: 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  y..    ** The ca
a890: 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68  ller will see th
a8a0: 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  e (pIter->pLeaf=
a8b0: 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74  =0) and assume t
a8c0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20  he iterator is. 
a8d0: 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72     ** at EOF alr
a8e0: 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  eady. */.    ass
a8f0: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
a900: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  f==0 );.    retu
a910: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
a920: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a930: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ){.    memset(pI
a940: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
a950: 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70 49 74  pIter));.    pIt
a960: 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  er->pSeg = pSeg;
a970: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78  .    pIter->iIdx
a980: 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 70 49 74   = iIdx;.    pIt
a990: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
a9a0: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d  pSeg->pgnoFirst-
a9b0: 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  1;.    fts5SegIt
a9c0: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
a9d0: 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ter);.  }..  if(
a9e0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
a9f0: 4b 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d  K ){.    u8 *a =
aa00: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
aa10: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
aa20: 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
aa30: 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20  etU16(&a[2]);.  
aa40: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
aa50: 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20  dTerm(p, pIter, 
aa60: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  0);.  }.}..stati
aa70: 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66 48  c void fts5LeafH
aa80: 65 61 64 65 72 28 46 74 73 35 44 61 74 61 20 2a  eader(Fts5Data *
aa90: 70 4c 65 61 66 2c 20 69 6e 74 20 2a 70 69 52 6f  pLeaf, int *piRo
aaa0: 77 69 64 2c 20 69 6e 74 20 2a 70 69 54 65 72 6d  wid, int *piTerm
aab0: 29 7b 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20  ){.  *piRowid = 
aac0: 28 69 6e 74 29 66 74 73 35 47 65 74 55 31 36 28  (int)fts5GetU16(
aad0: 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
aae0: 20 2a 70 69 54 65 72 6d 20 3d 20 28 69 6e 74 29   *piTerm = (int)
aaf0: 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
ab00: 66 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  f->p[2]);.}../*.
ab10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ab20: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
ab30: 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72  lled on iterator
ab40: 73 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  s created by cal
ab50: 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64  ls to.** Fts5Ind
ab60: 65 78 51 75 65 72 79 28 29 20 77 69 74 68 20 74  exQuery() with t
ab70: 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  he FTS5INDEX_QUE
ab80: 52 59 5f 41 53 43 20 66 6c 61 67 20 73 65 74 2e  RY_ASC flag set.
ab90: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
aba0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
abb0: 6c 65 64 2c 20 69 74 65 72 61 74 6f 72 20 70 49  led, iterator pI
abc0: 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
abd0: 65 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a  e first rowid.**
abe0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
abf0: 6c 65 61 66 20 61 73 73 6f 63 69 61 74 65 64 20  leaf associated 
ac00: 77 69 74 68 20 74 68 65 20 74 65 72 6d 20 62 65  with the term be
ac10: 69 6e 67 20 71 75 65 72 69 65 64 2e 20 54 68 69  ing queried. Thi
ac20: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 64  s function.** ad
ac30: 76 61 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69  vances it to poi
ac40: 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73  nt to the last s
ac50: 75 63 68 20 72 6f 77 69 64 20 61 6e 64 2c 20 69  uch rowid and, i
ac60: 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69  f necessary, ini
ac70: 74 69 61 6c 69 7a 65 73 0a 2a 2a 20 74 68 65 20  tializes.** the 
ac80: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
ac90: 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20  nd iRowidOffset 
aca0: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  variables..*/.st
acb0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
acc0: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
acd0: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
ace0: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
acf0: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  pIter){.  int n 
ad00: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
ad10: 6e 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 74  n;.  int i = pIt
ad20: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
ad30: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
ad40: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e  ->pLeaf->p;.  in
ad50: 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  t iRowidOffset =
ad60: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d   0;..  while( p-
ad70: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
ad80: 26 20 69 3c 6e 20 29 7b 0a 20 20 20 20 69 36 34  & i<n ){.    i64
ad90: 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20   iDelta = 0;.   
ada0: 20 69 6e 74 20 6e 50 6f 73 3b 0a 0a 20 20 20 20   int nPos;..    
adb0: 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
adc0: 28 26 61 5b 69 5d 2c 20 6e 50 6f 73 29 3b 0a 20  (&a[i], nPos);. 
add0: 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20     i += nPos;.  
ade0: 20 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65    if( i>=n ) bre
adf0: 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 67 65 74  ak;.    i += get
ae00: 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
ae10: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
ae20: 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
ae30: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74  ) break;.    pIt
ae40: 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44  er->iRowid -= iD
ae50: 65 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20 69  elta;..    if( i
ae60: 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74  RowidOffset>=pIt
ae70: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
ae80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
ae90: 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77  ew = pIter->nRow
aea0: 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20  idOffset + 8;.  
aeb0: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20      int *aNew = 
aec0: 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
aed0: 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f  alloc(pIter->aRo
aee0: 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a  widOffset, nNew*
aef0: 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
af00: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
af10: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
af20: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
af30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
af40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
af50: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
af60: 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  t = aNew;.      
af70: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
af80: 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  set = nNew;.    
af90: 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52  }..    pIter->aR
afa0: 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69  owidOffset[iRowi
afb0: 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74  dOffset++] = pIt
afc0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
afd0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
afe0: 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d  fOffset = i;.  }
aff0: 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  .  pIter->iRowid
b000: 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f  Offset = iRowidO
b010: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  ffset;.}../*.**.
b020: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
b030: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
b040: 65 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64  eNewPage(Fts5Ind
b050: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
b060: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
b070: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
b080: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
b090: 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61  R_REVERSE );.  a
b0a0: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
b0b0: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
b0c0: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20  ER_ONETERM );.. 
b0d0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
b0e0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
b0f0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
b100: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   0;.  while( p->
b110: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
b120: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b130: 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  o>pIter->iTermLe
b140: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74  afPgno ){.    Ft
b150: 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20  s5Data *pNew;.  
b160: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
b170: 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d  no--;.    pNew =
b180: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
b190: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
b1a0: 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
b1b0: 49 74 65 72 2d 3e 69 49 64 78 2c 20 70 49 74 65  Iter->iIdx, pIte
b1c0: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  r->pSeg->iSegid,
b1d0: 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   0, pIter->iLeaf
b1e0: 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20  Pgno.    ));.   
b1f0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
b200: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c     if( pIter->iL
b210: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
b220: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
b230: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
b240: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
b250: 73 65 74 3c 70 4e 65 77 2d 3e 6e 20 29 7b 0a 20  set<pNew->n ){. 
b260: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
b270: 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20  pLeaf = pNew;.  
b280: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
b290: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74  LeafOffset = pIt
b2a0: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
b2b0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  set;.        }. 
b2c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b2d0: 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
b2e0: 66 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  f, dummy;.      
b2f0: 20 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72    fts5LeafHeader
b300: 28 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 4f 66  (pNew, &iRowidOf
b310: 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  f, &dummy);.    
b320: 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
b330: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
b340: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
b350: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
b360: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
b370: 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20   = iRowidOff;.  
b380: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b390: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
b3a0: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
b3b0: 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65     u8 *a = &pIte
b3c0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65  r->pLeaf->p[pIte
b3d0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  r->iLeafOffset];
b3e0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
b3f0: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 67  iLeafOffset += g
b400: 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34  etVarint(a, (u64
b410: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
b420: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
b430: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b440: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
b450: 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
b460: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b470: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
b480: 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53  eaf ){.    fts5S
b490: 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
b4a0: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
b4b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
b4c0: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
b4d0: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
b4e0: 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49   entry. .**.** I
b4f0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
b500: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
b510: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
b520: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
b530: 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e  ode. It .** is n
b540: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
b550: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69 74   error if the it
b560: 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45  erator reaches E
b570: 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  OF. If an error 
b580: 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
b590: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
b5a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
b5b0: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
b5c0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
b5d0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
b5e0: 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Next(.  Fts5Inde
b5f0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
b600: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
b610: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
b620: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
b630: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
b640: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
b650: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b  to advance */.){
b660: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
b670: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
b680: 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  f( pIter->flags 
b690: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
b6a0: 45 56 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20  EVERSE ){.      
b6b0: 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  if( pIter->iRowi
b6c0: 64 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  dOffset>0 ){.   
b6d0: 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74       u8 *a = pIt
b6e0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
b6f0: 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
b700: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
b710: 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44  ;.        i64 iD
b720: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 70 49  elta;.        pI
b730: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
b740: 74 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20 70 49  t--;..        pI
b750: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
b760: 20 3d 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d   = iOff = pIter-
b770: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49  >aRowidOffset[pI
b780: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
b790: 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  t];.        iOff
b7a0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
b7b0: 26 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b  &a[iOff], nPos);
b7c0: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
b7d0: 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 67   nPos;.        g
b7e0: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
b7f0: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
b800: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
b810: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
b820: 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ta;.      }else{
b830: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
b840: 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61  IterReverseNewPa
b850: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 23 69  ge(p, pIter);.#i
b860: 66 20 30 0a 20 20 20 20 20 20 20 20 66 74 73 35  f 0.        fts5
b870: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
b880: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
b890: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
b8a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = 0;.        whi
b8b0: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
b8c0: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69  E_OK && pIter->i
b8d0: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
b8e0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
b8f0: 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35 44  .          Fts5D
b900: 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  ata *pNew;.     
b910: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
b920: 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 20  fPgno--;.       
b930: 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61     pNew = fts5Da
b940: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
b950: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20  EGMENT_ROWID(.  
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
b970: 74 65 72 2d 3e 69 49 64 78 2c 20 70 49 74 65 72  ter->iIdx, pIter
b980: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
b990: 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  0, pIter->iLeafP
b9a0: 67 6e 6f 0a 20 20 20 20 20 20 20 20 20 20 29 29  gno.          ))
b9b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
b9c0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
b9d0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
b9e0: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
b9f0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
ba00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ba10: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
ba20: 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d  LeafOffset<pNew-
ba30: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
ba40: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
ba50: 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  af = pNew;.     
ba60: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
ba70: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
ba80: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
ba90: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
baa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bab0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bac0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f           int iRo
bad0: 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a 20  widOff, dummy;. 
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
baf0: 35 4c 65 61 66 48 65 61 64 65 72 28 70 4e 65 77  5LeafHeader(pNew
bb00: 2c 20 26 69 52 6f 77 69 64 4f 66 66 2c 20 26 64  , &iRowidOff, &d
bb10: 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20  ummy);.         
bb20: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
bb30: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
bb40: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
bb50: 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  af = pNew;.     
bb60: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
bb70: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
bb80: 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
bb90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
bba0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
bbb0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
bbc0: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
bbd0: 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20          u8 *a = 
bbe0: 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
bbf0: 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66  [pIter->iLeafOff
bc00: 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  set];.          
bc10: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
bc20: 4f 66 66 73 65 74 20 2b 3d 20 67 65 74 56 61 72  Offset += getVar
bc30: 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 70 49  int(a, (u64*)&pI
bc40: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bc60: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
bc70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bc80: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
bc90: 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ase(pNew);.     
bca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bcb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
bcc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
bcd0: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
bce0: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
bcf0: 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
bd00: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
bd10: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
bd20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
bd30: 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
bd40: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
bd50: 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
bd60: 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  iOff;.      int 
bd70: 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
bd80: 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
bd90: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 61  0;..      /* Sea
bda0: 72 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20  rch for the end 
bdb0: 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
bdc0: 6c 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20  list within the 
bdd0: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f  current page. */
bde0: 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70  .      u8 *a = p
bdf0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
be00: 6e 74 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 6e 3b  nt n = pLeaf->n;
be10: 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 70  ..      iOff = p
be20: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
be30: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  t;.      if( iOf
be40: 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  f<n ){.        i
be50: 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20  nt nPoslist;.   
be60: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74       iOff += get
be70: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
be80: 5d 2c 20 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20  ], nPoslist);.  
be90: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50        iOff += nP
bea0: 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  oslist;.      }.
beb0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
bec0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  n ){.        /* 
bed0: 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  The next entry i
bee0: 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
bef0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
bf00: 20 75 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   u64 iDelta;.   
bf10: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
bf20: 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
bf30: 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29  [iOff], &iDelta)
bf40: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
bf50: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
bf60: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Off;.        if(
bf70: 20 69 44 65 6c 74 61 3d 3d 30 20 29 7b 0a 20 20   iDelta==0 ){.  
bf80: 20 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d          bNewTerm
bf90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
bfa0: 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20  if( iOff>=n ){. 
bfb0: 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
bfc0: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
bfd0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
bfe0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
bff0: 61 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20  afOffset = 4;.  
c000: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c010: 28 20 69 4f 66 66 21 3d 66 74 73 35 47 65 74 55  ( iOff!=fts5GetU
c020: 31 36 28 26 61 5b 32 5d 29 20 29 7b 0a 20 20 20  16(&a[2]) ){.   
c030: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
c040: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 67  iLeafOffset += g
c050: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
c060: 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
c070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c090: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
c0a0: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  -= iDelta;.     
c0b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
c0c0: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  {.        iOff =
c0d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;.        /* N
c0e0: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  ext entry is not
c0f0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
c100: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
c110: 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29  while( iOff==0 )
c120: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
c130: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
c140: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
c150: 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74       pLeaf = pIt
c160: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
c170: 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d       if( pLeaf==
c180: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
c190: 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d       if( (iOff =
c1a0: 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
c1b0: 61 66 2d 3e 70 5b 30 5d 29 29 20 29 7b 0a 20 20  af->p[0])) ){.  
c1c0: 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
c1d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
c1e0: 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  nt(&pLeaf->p[iOf
c1f0: 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
c200: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
c210: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
c220: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
c230: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c240: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
c250: 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74   (iOff = fts5Get
c260: 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d  U16(&pLeaf->p[2]
c270: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
c280: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
c290: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
c2a0: 20 20 20 20 20 20 20 20 20 62 4e 65 77 54 65 72           bNewTer
c2b0: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
c2c0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
c2d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
c2e0: 68 65 63 6b 20 69 66 20 74 68 65 20 69 74 65 72  heck if the iter
c2f0: 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45  ator is now at E
c300: 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72  OF. If so, retur
c310: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20  n early. */.    
c320: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
c330: 61 66 20 26 26 20 62 4e 65 77 54 65 72 6d 20 29  af && bNewTerm )
c340: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
c350: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
c360: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
c370: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  M ){.          f
c380: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
c390: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
c3a0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
c3b0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
c3c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c3d0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
c3e0: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
c3f0: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20   nKeep);.       
c400: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c410: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  .  }.}../*.** It
c420: 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
c430: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
c440: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
c450: 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   in a doclist. T
c460: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
c470: 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74 6f  sets the iterato
c480: 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 65  r up so that ite
c490: 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73 65  rates in reverse
c4a0: 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a   order through.*
c4b0: 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a  * the doclist..*
c4c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
c4d0: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
c4e0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
c4f0: 6e 74 20 69 49 64 78 2c 20 46 74 73 35 53 65 67  nt iIdx, Fts5Seg
c500: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
c510: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
c540: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  data */.  int iO
c550: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
c560: 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 42 79 74  fOffset;  /* Byt
c570: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
c580: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
c590: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73    Fts5Data *pLas
c5a0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e  t = 0;.  int pgn
c5b0: 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oLast = 0;..  /*
c5c0: 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 70 61 67   Move to the pag
c5d0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
c5e0: 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  the last rowid i
c5f0: 6e 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2e 20  n this doclist. 
c600: 2a 2f 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74  */.  pLeaf = pIt
c610: 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 77 68  er->pLeaf;..  wh
c620: 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ile( iOff<pLeaf-
c630: 3e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50  >n ){.    int nP
c640: 6f 73 3b 0a 20 20 20 20 69 36 34 20 69 44 65 6c  os;.    i64 iDel
c650: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 73 69  ta;..    /* Posi
c660: 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 69  tion list size i
c670: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
c680: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
c690: 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
c6a0: 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 69  f], nPos);.    i
c6b0: 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
c6c0: 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66   if( iOff>=pLeaf
c6d0: 2d 3e 6e 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ->n ) break;..  
c6e0: 20 20 2f 2a 20 52 6f 77 69 64 20 64 65 6c 74 61    /* Rowid delta
c6f0: 2e 20 4f 72 2c 20 69 66 20 30 78 30 30 2c 20 74  . Or, if 0x00, t
c700: 68 65 20 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73  he end of doclis
c710: 74 20 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20 20 20  t marker. */.   
c720: 20 6e 50 6f 73 20 3d 20 67 65 74 56 61 72 69 6e   nPos = getVarin
c730: 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  t(&pLeaf->p[iOff
c740: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
c750: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c 74  );.    if( iDelt
c760: 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  a==0 ) break;.  
c770: 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
c780: 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3e    }..  if( iOff>
c790: 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  =pLeaf->n ){.   
c7a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
c7b0: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
c7c0: 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 20 20 69  ter->pSeg;.    i
c7d0: 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53  64 iAbs = FTS5_S
c7e0: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
c7f0: 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  x, pSeg->iSegid,
c800: 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   0, pIter->iLeaf
c810: 50 67 6e 6f 29 3b 0a 20 20 20 20 69 36 34 20 69  Pgno);.    i64 i
c820: 4c 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d  Last = FTS5_SEGM
c830: 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20  ENT_ROWID(iIdx, 
c840: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c  pSeg->iSegid, 0,
c850: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29   pSeg->pgnoLast)
c860: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 61  ;..    /* The la
c870: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
c880: 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20  doclist may not 
c890: 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  be on the curren
c8a0: 74 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20  t page. Search. 
c8b0: 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f     ** forward to
c8c0: 20 66 69 6e 64 20 74 68 65 20 70 61 67 65 20 63   find the page c
c8d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61  ontaining the la
c8e0: 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20  st rowid.  */.  
c8f0: 20 20 66 6f 72 28 69 41 62 73 2b 2b 3b 20 70 2d    for(iAbs++; p-
c900: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
c910: 26 20 69 41 62 73 3c 3d 69 4c 61 73 74 3b 20 69  & iAbs<=iLast; i
c920: 41 62 73 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Abs++){.      Ft
c930: 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
c940: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
c950: 41 62 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Abs);.      if( 
c960: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
c970: 69 6e 74 20 69 52 6f 77 69 64 2c 20 69 54 65 72  int iRowid, iTer
c980: 6d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4c  m;.        fts5L
c990: 65 61 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20  eafHeader(pNew, 
c9a0: 26 69 52 6f 77 69 64 2c 20 26 69 54 65 72 6d 29  &iRowid, &iTerm)
c9b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52  ;.        if( iR
c9c0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
c9d0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 54 6d 70    Fts5Data *pTmp
c9e0: 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 20 20   = pLast;.      
c9f0: 20 20 20 20 70 4c 61 73 74 20 3d 20 70 4e 65 77      pLast = pNew
ca00: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
ca10: 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 20 20 20   = pTmp;.       
ca20: 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 69 41     pgnoLast = iA
ca30: 62 73 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  bs & (((i64)1 <<
ca40: 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
ca50: 42 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20  B) - 1);.       
ca60: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
ca70: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
ca80: 20 20 69 41 62 73 20 3d 20 69 4c 61 73 74 3b 0a    iAbs = iLast;.
ca90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
caa0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
cab0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  e(pNew);.      }
cac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
cad0: 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c   If pLast is NUL
cae0: 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
caf0: 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
cb00: 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f  owid for this do
cb10: 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20  clist.  ** lies 
cb20: 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75 72 72  on the page curr
cb30: 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20  ently indicated 
cb40: 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e  by the iterator.
cb50: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20   In this case . 
cb60: 20 2a 2a 20 69 4c 61 73 74 4f 66 66 20 69 73 20   ** iLastOff is 
cb70: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
cb80: 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 4c 65   that pIter->iLe
cb90: 61 66 4f 66 66 73 65 74 20 77 69 6c 6c 20 74 61  afOffset will ta
cba0: 6b 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  ke when.  ** the
cbb0: 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
cbc0: 20 74 6f 20 74 68 61 74 20 72 6f 77 69 64 2e 0a   to that rowid..
cbd0: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66    **.  ** Or, if
cbe0: 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55   pLast is non-NU
cbf0: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  LL, then it is t
cc00: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
cc10: 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20  tains the last. 
cc20: 20 2a 2a 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a   ** rowid..  */.
cc30: 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20    if( pLast ){. 
cc40: 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20     int dummy;.  
cc50: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
cc60: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
cc70: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
cc80: 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70  f = pLast;.    p
cc90: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
cca0: 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
ccb0: 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 70  fts5LeafHeader(p
ccc0: 4c 61 73 74 2c 20 26 69 4f 66 66 2c 20 26 64 75  Last, &iOff, &du
ccd0: 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  mmy);.    iOff +
cce0: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 61  = getVarint(&pLa
ccf0: 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  st->p[iOff], (u6
cd00: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
cd10: 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  d);.    pIter->i
cd20: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
cd30: 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65  f;.  }..  fts5Se
cd40: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
cd50: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
cd60: 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
cd70: 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
cd80: 45 56 45 52 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  EVERSE;.}../*.**
cd90: 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
cda0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
cdb0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
cdc0: 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  wid of a doclist
cdd0: 20 77 69 74 68 69 6e 0a 2a 2a 20 69 6e 64 65 78   within.** index
cde0: 20 69 49 64 78 2e 20 54 68 65 72 65 20 69 73 20   iIdx. There is 
cdf0: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
ce00: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ce10: 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f  the final term o
ce20: 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
ce30: 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 63 75   page. If the cu
ce40: 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74 68  rrent term is th
ce50: 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74  e last term on t
ce60: 68 65 20 70 61 67 65 2c 20 0a 2a 2a 20 6c 6f 61  he page, .** loa
ce70: 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  d the doclist-in
ce80: 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e  dex from disk an
ce90: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  d initialize an 
cea0: 69 74 65 72 61 74 6f 72 20 61 74 20 0a 2a 2a 20  iterator at .** 
ceb0: 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e  (pIter->pDlidx).
cec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ced0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
cee0: 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
cef0: 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74 73  p, int iIdx, Fts
cf00: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
cf10: 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d  {.  int iSegid =
cf20: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
cf30: 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76  egid;.  int bRev
cf40: 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73   = (pIter->flags
cf50: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
cf60: 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35  REVERSE);.  Fts5
cf70: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
cf80: 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43  ter->pLeaf; /* C
cf90: 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61  urrent leaf data
cfa0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d   */.  int iOff =
cfb0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
cfc0: 73 65 74 3b 20 20 2f 2a 20 42 79 74 65 20 6f 66  set;  /* Byte of
cfd0: 66 73 65 74 20 77 69 74 68 69 6e 20 63 75 72 72  fset within curr
cfe0: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 61  ent leaf */..  a
cff0: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
d000: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d010: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20  ER_ONETERM );.  
d020: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
d030: 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Dlidx==0 );..  /
d040: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63  * Check if the c
d050: 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65  urrent doclist e
d060: 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  nds on this page
d070: 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65  . If it does, re
d080: 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20  turn.  ** early 
d090: 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20  without loading 
d0a0: 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
d0b0: 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73  x (as it belongs
d0c0: 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a   to a different.
d0d0: 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20    ** term. */.  
d0e0: 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61  while( iOff<pLea
d0f0: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20  f->n ){.    i64 
d100: 69 44 65 6c 74 61 3b 0a 20 20 20 20 69 6e 74 20  iDelta;.    int 
d110: 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 2f  nPoslist;..    /
d120: 2a 20 69 4f 66 66 20 69 73 20 63 75 72 72 65 6e  * iOff is curren
d130: 74 6c 79 20 74 68 65 20 6f 66 66 73 65 74 20 6f  tly the offset o
d140: 66 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64  f the size field
d150: 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c   of a position l
d160: 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 4f 66 66  ist. */.    iOff
d170: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
d180: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
d190: 20 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   nPoslist);.    
d1a0: 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 6c 69 73 74  iOff += nPoslist
d1b0: 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c  ;..    if( iOff<
d1c0: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
d1d0: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
d1e0: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
d1f0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
d200: 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ta);.      if( i
d210: 44 65 6c 74 61 3d 3d 30 20 29 20 72 65 74 75 72  Delta==0 ) retur
d220: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
d230: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
d240: 74 28 70 2c 20 62 52 65 76 2c 20 69 49 64 78 2c  t(p, bRev, iIdx,
d250: 20 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e   iSegid, pIter->
d260: 69 4c 65 61 66 50 67 6e 6f 2c 20 26 70 49 74 65  iLeafPgno, &pIte
d270: 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 7d 0a 0a 2f  r->pDlidx);.}../
d280: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
d290: 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72  the object pIter
d2a0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72   to point to ter
d2b0: 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69  m pTerm/nTerm wi
d2c0: 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20  thin segment.** 
d2d0: 70 53 65 67 2c 20 69 6e 64 65 78 20 69 49 64 78  pSeg, index iIdx
d2e0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
d2f0: 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68   such term in th
d300: 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65  e index, the ite
d310: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 73 65 74 20  rator.** is set 
d320: 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66  to EOF..**.** If
d330: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
d340: 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69  , Fts5Index.rc i
d350: 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72  s set to an appr
d360: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
d370: 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  de. If .** an er
d380: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
d390: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
d3a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d3b0: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
d3c0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
d3d0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d3e0: 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74 73 35  SeekInit(.  Fts5
d3f0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
d400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d410: 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20  TS5 backend */. 
d420: 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68   /* Config.aHash
d450: 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20  [] index of FTS 
d460: 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
d470: 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
d480: 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
d490: 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
d4a0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
d4d0: 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
d4e0: 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  s */.  Fts5Struc
d4f0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
d500: 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  g,     /* Descri
d510: 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74  ption of segment
d520: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
d530: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
d540: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
d550: 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
d560: 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b  {.  int iPg = 1;
d570: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
d580: 62 47 65 20 3d 20 28 28 66 6c 61 67 73 20 26 20  bGe = ((flags & 
d590: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
d5a0: 50 52 45 46 49 58 29 20 26 26 20 69 49 64 78 3d  PREFIX) && iIdx=
d5b0: 3d 30 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  =0);.  int bDlid
d5c0: 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
d5d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
d5e0: 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
d5f0: 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
d600: 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20   assert( bGe==0 
d610: 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
d620: 49 4e 44 45 58 5f 51 55 45 52 59 5f 41 53 43 29  INDEX_QUERY_ASC)
d630: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
d640: 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20   pTerm && nTerm 
d650: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  );.  memset(pIte
d660: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
d670: 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
d680: 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 70  pSeg = pSeg;.  p
d690: 49 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64  Iter->iIdx = iId
d6a0: 78 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  x;..  /* This bl
d6b0: 6f 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76  ock sets stack v
d6c0: 61 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74  ariable iPg to t
d6d0: 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  he leaf page num
d6e0: 62 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a  ber that may.  *
d6f0: 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28  * contain term (
d700: 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66  pTerm/nTerm), if
d710: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 69   it is present i
d720: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a  n the segment. *
d730: 2f 0a 20 20 66 6f 72 28 68 3d 70 53 65 67 2d 3e  /.  for(h=pSeg->
d740: 6e 48 65 69 67 68 74 2d 31 3b 20 68 3e 30 3b 20  nHeight-1; h>0; 
d750: 68 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 4e 6f  h--){.    Fts5No
d760: 64 65 49 74 65 72 20 6e 6f 64 65 3b 20 20 20 20  deIter node;    
d770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
d780: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
d790: 67 68 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  gh internal node
d7a0: 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f  s */.    i64 iRo
d7b0: 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
d7c0: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
d7d0: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 68 2c 20  Seg->iSegid, h, 
d7e0: 69 50 67 29 3b 0a 20 20 20 20 46 74 73 35 44 61  iPg);.    Fts5Da
d7f0: 74 61 20 2a 70 4e 6f 64 65 20 3d 20 66 74 73 35  ta *pNode = fts5
d800: 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
d810: 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f  id);.    if( pNo
d820: 64 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  de==0 ) break;..
d830: 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
d840: 49 6e 69 74 28 70 4e 6f 64 65 2d 3e 70 2c 20 70  Init(pNode->p, p
d850: 4e 6f 64 65 2d 3e 6e 2c 20 26 6e 6f 64 65 29 3b  Node->n, &node);
d860: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 6f 64  .    assert( nod
d870: 65 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 0a  e.term.n==0 );..
d880: 20 20 20 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69      iPg = node.i
d890: 43 68 69 6c 64 3b 0a 20 20 20 20 62 44 6c 69 64  Child;.    bDlid
d8a0: 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b  x = node.bDlidx;
d8b0: 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4e 6f 64  .    for(fts5Nod
d8c0: 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
d8d0: 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  , &node);.      
d8e0: 20 20 6e 6f 64 65 2e 61 44 61 74 61 20 26 26 20    node.aData && 
d8f0: 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
d900: 65 42 6c 6f 62 28 26 6e 6f 64 65 2e 74 65 72 6d  eBlob(&node.term
d910: 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3c  , pTerm, nTerm)<
d920: 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
d930: 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
d940: 3e 72 63 2c 20 26 6e 6f 64 65 29 0a 20 20 20 20  >rc, &node).    
d950: 29 7b 0a 20 20 20 20 20 20 69 50 67 20 3d 20 6e  ){.      iPg = n
d960: 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20  ode.iChild;.    
d970: 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e    bDlidx = node.
d980: 62 44 6c 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  bDlidx;.    }.  
d990: 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72    fts5NodeIterFr
d9a0: 65 65 28 26 6e 6f 64 65 29 3b 0a 20 20 20 20 66  ee(&node);.    f
d9b0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
d9c0: 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Node);.  }..  if
d9d0: 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f  ( iPg<pSeg->pgno
d9e0: 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67  First ){.    iPg
d9f0: 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
da00: 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d  st;.    bDlidx =
da10: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72   0;.  }..  pIter
da20: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  ->iLeafPgno = iP
da30: 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67  g - 1;.  fts5Seg
da40: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
da50: 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  pIter);..  if( p
da60: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
da70: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
da80: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
da90: 65 74 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  et = fts5GetU16(
daa0: 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
dab0: 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73 35 53 65  [2]);.    fts5Se
dac0: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
dad0: 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
dae0: 64 6f 20 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  do {.      res =
daf0: 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
db00: 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
db10: 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
db20: 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  m);.      if( re
db30: 73 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s>=0 ) break;.  
db40: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
db50: 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
db60: 20 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72     }while( pIter
db70: 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20  ->pLeaf );..    
db80: 69 66 28 20 62 47 65 3d 3d 30 20 26 26 20 72 65  if( bGe==0 && re
db90: 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  s ){.      /* Se
dba0: 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  t iterator to po
dbb0: 69 6e 74 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20  int to EOF */.  
dbc0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
dbd0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
dbe0: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
dbf0: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d  pLeaf = 0;.    }
dc00: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 47 65 3d  .  }..  if( bGe=
dc10: 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =0 ){.    pIter-
dc20: 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
dc30: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
dc40: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
dc50: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  Leaf ){.      if
dc60: 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( bDlidx ){.    
dc70: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
dc80: 6f 61 64 44 6c 69 64 78 28 70 2c 20 69 49 64 78  oadDlidx(p, iIdx
dc90: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
dca0: 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  }.      if( flag
dcb0: 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
dcc0: 45 52 59 5f 41 53 43 20 29 7b 0a 20 20 20 20 20  ERY_ASC ){.     
dcd0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
dce0: 76 65 72 73 65 28 70 2c 20 69 49 64 78 2c 20 70  verse(p, iIdx, p
dcf0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
dd00: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
dd10: 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61  * Zero the itera
dd20: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
dd30: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
dd40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dd50: 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
dd60: 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49  (Fts5SegIter *pI
dd70: 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66  ter){.  fts5Buff
dd80: 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74  erFree(&pIter->t
dd90: 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61  erm);.  fts5Data
dda0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
ddb0: 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69  Leaf);.  fts5Dli
ddc0: 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72  dxIterFree(pIter
ddd0: 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c  ->pDlidx);.  sql
dde0: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
ddf0: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a  >aRowidOffset);.
de00: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
de10: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
de20: 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gIter));.}../*.*
de30: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
de40: 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f  son necessary to
de50: 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d   populate pIter-
de60: 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a  >aFirst[iOut]..*
de70: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75  *.** If the retu
de80: 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f  rned value is no
de90: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
dea0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
deb0: 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74  an entry.** in t
dec0: 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d  he pIter->aSeg[]
ded0: 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20 28   array that is (
dee0: 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61  a) not at EOF, a
def0: 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a  nd (b) pointing.
df00: 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74  ** to a key that
df10: 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
df20: 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68  of another, high
df30: 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a  er priority, .**
df40: 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f   segment-iterato
df50: 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61  r in the pSeg->a
df60: 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Seg[] array..*/.
df70: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
df80: 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72  ultiIterDoCompar
df90: 65 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  e(Fts5MultiSegIt
dfa0: 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69  er *pIter, int i
dfb0: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20  Out){.  int i1; 
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
dfe0: 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74   of left-hand Ft
dff0: 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
e000: 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20  nt i2;          
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e020: 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
e030: 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
e040: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b  r */.  int iRes;
e050: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
e060: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
e070: 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
e080: 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
e090: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
e0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e0b0: 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46   /* Right-hand F
e0c0: 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 0a 20  ts5SegIter */.. 
e0d0: 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49   assert( iOut<pI
e0e0: 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75  ter->nSeg && iOu
e0f0: 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
e100: 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20   pIter->bRev==0 
e110: 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  || pIter->bRev==
e120: 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74  1 );..  if( iOut
e130: 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32  >=(pIter->nSeg/2
e140: 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69  ) ){.    i1 = (i
e150: 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65  Out - pIter->nSe
e160: 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32  g/2) * 2;.    i2
e170: 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c   = i1 + 1;.  }el
e180: 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74  se{.    i1 = pIt
e190: 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
e1a0: 32 5d 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74  2];.    i2 = pIt
e1b0: 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
e1c0: 32 2b 31 5d 3b 0a 20 20 7d 0a 20 20 70 31 20 3d  2+1];.  }.  p1 =
e1d0: 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31   &pIter->aSeg[i1
e1e0: 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72  ];.  p2 = &pIter
e1f0: 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 69  ->aSeg[i2];..  i
e200: 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p1->pLeaf==0 
e210: 29 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){           /* 
e220: 49 66 20 70 31 20 69 73 20 61 74 20 45 4f 46 20  If p1 is at EOF 
e230: 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32  */.    iRes = i2
e240: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32  ;.  }else if( p2
e250: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20  ->pLeaf==0 ){   
e260: 20 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74    /* If p2 is at
e270: 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
e280: 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = i1;.  }else{.
e290: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74      int res = ft
e2a0: 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
e2b0: 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e  &p1->term, &p2->
e2c0: 74 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  term);.    if( r
e2d0: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  es==0 ){.      a
e2e0: 73 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a  ssert( i2>i1 );.
e2f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
e300: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
e310: 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d   p1->iRowid==p2-
e320: 3e 69 52 6f 77 69 64 20 29 20 72 65 74 75 72 6e  >iRowid ) return
e330: 20 69 32 3b 0a 20 20 20 20 20 20 72 65 73 20 3d   i2;.      res =
e340: 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3c 20   ((p1->iRowid < 
e350: 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74  p2->iRowid)==pIt
e360: 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a  er->bRev) ? -1 :
e370: 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   +1;.    }.    a
e380: 73 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b  ssert( res!=0 );
e390: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
e3a0: 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
e3b0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
e3c0: 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
e3d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65     }.  }..  pIte
e3e0: 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 20  r->aFirst[iOut] 
e3f0: 3d 20 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e  = iRes;.  return
e400: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   0;.}../*.** Fre
e410: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
e420: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
e430: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
e440: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
e450: 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
e460: 72 46 72 65 65 28 46 74 73 35 49 6e 64 65 78 20  rFree(Fts5Index 
e470: 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
e480: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
e490: 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
e4a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
e4b0: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
e4c0: 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
e4d0: 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
e4e0: 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d  (&pIter->aSeg[i]
e4f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
e500: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
e510: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
e520: 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
e530: 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74  erAdvanced(.  Ft
e540: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e560: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
e570: 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
e580: 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
e590: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
e5a0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
e5b0: 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73   to update aFirs
e5c0: 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f  t[] array for */
e5d0: 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c  .  int iChanged,
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
e600: 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74  ub-iterator just
e610: 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69   advanced */.  i
e620: 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20  nt iMinset      
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e640: 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20  * Minimum entry 
e650: 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73  in aFirst[] to s
e660: 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  et */.){.  int i
e670: 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72  ;.  for(i=(pIter
e680: 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29  ->nSeg+iChanged)
e690: 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26  /2; i>=iMinset &
e6a0: 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
e6b0: 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20  OK; i=i/2){.    
e6c0: 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28  int iEq;.    if(
e6d0: 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
e6e0: 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
e6f0: 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20  Iter, i)) ){.   
e700: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
e710: 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53  xt(p, &pIter->aS
e720: 65 67 5b 69 45 71 5d 29 3b 0a 20 20 20 20 20 20  eg[iEq]);.      
e730: 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
e740: 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
e750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
e760: 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74  he seg-iter so t
e770: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
e780: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
e790: 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67   on page iLeafPg
e7a0: 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  no..** It is an 
e7b0: 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c  error if leaf iL
e7c0: 65 61 66 50 67 6e 6f 20 63 6f 6e 74 61 69 6e 73  eafPgno contains
e7d0: 20 6e 6f 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74   no rowid..*/.st
e7e0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
e7f0: 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20  gIterGotoPage(. 
e800: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
e830: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
e840: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e860: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
e870: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  nce */.  int iLe
e880: 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65  afPgno.){.  asse
e890: 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  rt( iLeafPgno>pI
e8a0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
e8b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
e8c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e8d0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
e8e0: 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a   = iLeafPgno-1;.
e8f0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
e900: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
e910: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e920: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
e930: 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  || pIter->iLeafP
e940: 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29  gno==iLeafPgno )
e950: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
e960: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e970: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
e980: 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
e990: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
e9a0: 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70  int n = pIter->p
e9b0: 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20 69 4f  Leaf->n;..    iO
e9c0: 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
e9d0: 26 61 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  &a[0]);.    if( 
e9e0: 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d  iOff<4 || iOff>=
e9f0: 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  n ){.      p->rc
ea00: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
ea10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ea20: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
ea30: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
ea40: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
ea50: 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  id);.      pIter
ea60: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
ea70: 69 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iOff;.    }.  }.
ea80: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
ea90: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
eaa0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
eab0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69  nd argument unti
eac0: 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a  l it is at or .*
ead0: 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72  * past rowid iFr
eae0: 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  om. Regardless o
eaf0: 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  f the value of i
eb00: 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74  From, the iterat
eb10: 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  or is.** always 
eb20: 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73  advanced at leas
eb30: 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  t once..*/.stati
eb40: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
eb50: 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
eb60: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eb80: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
eb90: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
eba0: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
ebb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
ebc0: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
ebd0: 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68   */.  i64 iMatch
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
ec00: 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61   iterator at lea
ec10: 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29  st this far */.)
ec20: 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  {.  int bRev = (
ec30: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
ec40: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
ec50: 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64  RSE);.  Fts5Dlid
ec60: 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
ec70: 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
ec80: 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d   int iLeafPgno =
ec90: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
eca0: 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  o;..  assert( pI
ecb0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
ecc0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
ecd0: 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
ece0: 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a  Iter->pDlidx );.
ecf0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
ed00: 3e 70 4c 65 61 66 20 29 3b 0a 0a 0a 20 20 69 66  >pLeaf );...  if
ed10: 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
ed20: 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
ed30: 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
ed40: 64 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68  dx)==0 && iMatch
ed50: 3c 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  <pDlidx->iRowid 
ed60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 6c  ){.      if( pDl
ed70: 69 64 78 2d 3e 62 5a 65 72 6f 3d 3d 30 20 29 20  idx->bZero==0 ) 
ed80: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69  iLeafPgno = pDli
ed90: 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  dx->iLeafPgno;. 
eda0: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
edb0: 65 72 4e 65 78 74 28 70 44 6c 69 64 78 2c 20 30  erNext(pDlidx, 0
edc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
edd0: 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d  ert( iLeafPgno>=
ede0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
edf0: 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20   || p->rc );.   
ee00: 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70   if( iLeafPgno>p
ee10: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
ee20: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
ee30: 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20  IterGotoPage(p, 
ee40: 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f  pIter, iLeafPgno
ee50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
ee60: 20 69 66 28 20 30 20 29 7b 0a 20 20 20 20 77 68   if( 0 ){.    wh
ee70: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 49 74  ile( fts5DlidxIt
ee80: 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
ee90: 3d 3d 30 20 26 26 20 69 4d 61 74 63 68 3e 70 44  ==0 && iMatch>pD
eea0: 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  lidx->iRowid ){.
eeb0: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
eec0: 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78 2c 20  terNext(pDlidx, 
eed0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
eee0: 6c 69 64 78 2d 3e 62 5a 65 72 6f 3d 3d 30 20 29  lidx->bZero==0 )
eef0: 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c   iLeafPgno = pDl
ef00: 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  idx->iLeafPgno;.
ef10: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
ef20: 28 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74  ( iLeafPgno<=pIt
ef30: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c  er->iLeafPgno ||
ef40: 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66   p->rc );.    if
ef50: 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65  ( iLeafPgno<pIte
ef60: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
ef70: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
ef80: 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74  rGotoPage(p, pIt
ef90: 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a  er, iLeafPgno);.
efa0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69      }.  }..  whi
efb0: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 66 74 73  le( 1 ){.    fts
efc0: 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
efd0: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
efe0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
eff0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
f000: 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65   bRev==0 && pIte
f010: 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63  r->iRowid<=iMatc
f020: 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
f030: 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49  f( bRev!=0 && pI
f040: 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61  ter->iRowid>=iMa
f050: 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  tch ) break;.  }
f060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
f070: 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
f080: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a  he next entry. .
f090: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
f0a0: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
f0b0: 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
f0c0: 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e  in Fts5Index.rc.
f0d0: 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63   It is not .** c
f0e0: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
f0f0: 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
f100: 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20  or reaches EOF, 
f110: 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  or if it is alre
f120: 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77  ady at .** EOF w
f130: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
f140: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
f150: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
f160: 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20  MultiIterNext(. 
f170: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
f180: 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
f190: 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74  er *pIter,.  int
f1a0: 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   bFrom,         
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f1c0: 54 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74  True if argument
f1d0: 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20   iFrom is valid 
f1e0: 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20  */.  i64 iFrom  
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20       /* Advance 
f210: 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20  at least as far 
f220: 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20  as this */.){.  
f230: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
f240: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
f250: 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e  iFirst = pIter->
f260: 61 46 69 72 73 74 5b 31 5d 3b 0a 20 20 20 20 46  aFirst[1];.    F
f270: 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
f280: 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
f290: 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 69 66 28  iFirst];.    if(
f2a0: 20 62 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e   bFrom && pSeg->
f2b0: 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  pDlidx ){.      
f2c0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
f2d0: 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72  rom(p, pSeg, iFr
f2e0: 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  om);.    }else{.
f2f0: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
f300: 72 4e 65 78 74 28 70 2c 20 70 53 65 67 29 3b 0a  rNext(p, pSeg);.
f310: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75      }.    fts5Mu
f320: 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
f330: 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
f340: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
f350: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
f360: 77 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  w Fts5MultiSegIt
f370: 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  er object..**.**
f380: 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
f390: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
f3a0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
f3b0: 64 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72  data in structur
f3c0: 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66  e pStruct..** If
f3d0: 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20   iLevel is -ve, 
f3e0: 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e  then all data in
f3f0: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73   all segments is
f400: 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20   merged. Or, if 
f410: 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72  iLevel.** is zer
f420: 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61  o or greater, da
f430: 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  ta from the firs
f440: 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65  t nSegment segme
f450: 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65  nts on level iLe
f460: 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64  vel.** is merged
f470: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ..**.** The iter
f480: 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70  ator initially p
f490: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
f4a0: 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e  st term/rowid en
f4b0: 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69  try in the .** i
f4c0: 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f  terated data..*/
f4d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
f4e0: 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20  5MultiIterNew(. 
f4f0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
f520: 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
f530: 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  in */.  Fts5Stru
f540: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20  cture *pStruct, 
f550: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63          /* Struc
f560: 74 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63  ture of specific
f570: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
f580: 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
f590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
f5a0: 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e  onfig.aHash[] in
f5b0: 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78  dex of FTS index
f5c0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
f5f0: 72 20 3e 3d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  r >= */.  const 
f600: 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
f610: 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
f620: 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72  m to seek to (or
f630: 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e   NULL/0) */.  in
f640: 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f660: 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74   Level to iterat
f670: 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a  e (-1 for all) *
f680: 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  /.  int nSegment
f690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f6a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f6b0: 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
f6c0: 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a  ge (iLevel>=0) *
f6d0: 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  /.  Fts5MultiSeg
f6e0: 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20  Iter **ppOut    
f6f0: 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
f700: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53  t */.){.  int nS
f710: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
f720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f730: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
f740: 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  merged */.  int 
f750: 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
f760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f770: 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e  ower of two >= n
f780: 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74  Seg */.  int iIt
f790: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
f7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20           /* */. 
f7b0: 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20   int iSeg;      
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
f7e0: 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d  ate through segm
f7f0: 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 74  ents */.  Fts5St
f800: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
f810: 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  vl;.  Fts5MultiS
f820: 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20  egIter *pNew;.. 
f830: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d   assert( (pTerm=
f840: 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20  =0 && nTerm==0) 
f850: 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a  || iLevel<0 );..
f860: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
f870: 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
f880: 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74  multi-seg-iterat
f890: 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65  or. */.  if( iLe
f8a0: 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 6e 53 65  vel<0 ){.    nSe
f8b0: 67 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  g = fts5Structur
f8c0: 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70  eCountSegments(p
f8d0: 53 74 72 75 63 74 29 3b 0a 20 20 7d 65 6c 73 65  Struct);.  }else
f8e0: 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e  {.    nSeg = MIN
f8f0: 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
f900: 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e  [iLevel].nSeg, n
f910: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  Segment);.  }.  
f920: 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c  for(nSlot=2; nSl
f930: 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e  ot<nSeg; nSlot=n
f940: 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70 70 4f 75  Slot*2);.  *ppOu
f950: 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35 49  t = pNew = fts5I
f960: 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20  dxMalloc(p, .   
f970: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 4d 75     sizeof(Fts5Mu
f980: 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20 20 20  ltiSegIter) +   
f990: 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a         /* pNew *
f9a0: 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
f9b0: 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 6e 53  ts5SegIter) * nS
f9c0: 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a 20 70  lot +       /* p
f9d0: 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20  New->aSeg[] */. 
f9e0: 20 20 20 20 20 73 69 7a 65 6f 66 28 75 31 36 29       sizeof(u16)
f9f0: 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20   * nSlot        
fa00: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
fa10: 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20  ->aFirst[] */.  
fa20: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
fa30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65   ) return;.  pNe
fa40: 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b  w->nSeg = nSlot;
fa50: 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20 3d 20  .  pNew->aSeg = 
fa60: 28 46 74 73 35 53 65 67 49 74 65 72 2a 29 26 70  (Fts5SegIter*)&p
fa70: 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d 3e  New[1];.  pNew->
fa80: 61 46 69 72 73 74 20 3d 20 28 75 31 36 2a 29 26  aFirst = (u16*)&
fa90: 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74  pNew->aSeg[nSlot
faa0: 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20  ];.  pNew->bRev 
fab0: 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46  = (0!=(flags & F
fac0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 41  TS5INDEX_QUERY_A
fad0: 53 43 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  SC));..  /* Init
fae0: 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74  ialize each of t
faf0: 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67  he component seg
fb00: 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20  ment iterators. 
fb10: 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c  */.  if( iLevel<
fb20: 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
fb30: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e  uctureLevel *pEn
fb40: 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  d = &pStruct->aL
fb50: 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c  evel[pStruct->nL
fb60: 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 70  evel];.    for(p
fb70: 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c  Lvl=&pStruct->aL
fb80: 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45  evel[0]; pLvl<pE
fb90: 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20  nd; pLvl++){.   
fba0: 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c     for(iSeg=pLvl
fbb0: 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  ->nSeg-1; iSeg>=
fbc0: 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
fbd0: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
fbe0: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
fbf0: 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
fc00: 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  g];.        Fts5
fc10: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
fc20: 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
fc30: 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 69  er++];.        i
fc40: 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
fc50: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
fc60: 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78  IterInit(p, iIdx
fc70: 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
fc80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fc90: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
fca0: 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20  IterSeekInit(p, 
fcb0: 69 49 64 78 2c 20 70 54 65 72 6d 2c 20 6e 54 65  iIdx, pTerm, nTe
fcc0: 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
fcd0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
fce0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
fcf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
fd00: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
fd10: 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20  Level[iLevel];. 
fd20: 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67     for(iSeg=nSeg
fd30: 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
fd40: 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35  g--){.      fts5
fd50: 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69  SegIterInit(p, i
fd60: 49 64 78 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Idx, &pLvl->aSeg
fd70: 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61  [iSeg], &pNew->a
fd80: 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20  Seg[iIter++]);. 
fd90: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
fda0: 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29  t( iIter==nSeg )
fdb0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  ;..  /* If the a
fdc0: 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73  bove was success
fdd0: 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  ful, each compon
fde0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f  ent iterators no
fdf0: 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74  w points .  ** t
fe00: 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
fe10: 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74  y in its segment
fe20: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
fe30: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20  nitialize the . 
fe40: 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72   ** aFirst[] arr
fe50: 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ay. Or, if an er
fe60: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
fe70: 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61  , free the itera
fe80: 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  tor.  ** object 
fe90: 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70  and set the outp
fea0: 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
feb0: 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
fec0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
fed0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72  ){.    for(iIter
fee0: 3d 6e 53 6c 6f 74 2d 31 3b 20 69 49 74 65 72 3e  =nSlot-1; iIter>
fef0: 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20  0; iIter--){.   
ff00: 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20     int iEq;.    
ff10: 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
ff20: 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
ff30: 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29  are(pNew, iIter)
ff40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ) ){.        fts
ff50: 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
ff60: 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d  &pNew->aSeg[iEq]
ff70: 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
ff80: 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
ff90: 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69  (p, pNew, iEq, i
ffa0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
ffb0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ffc0: 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
ffd0: 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ree(p, pNew);.  
ffe0: 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20    *ppOut = 0;.  
fff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
10000 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
10010 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46  erator is at EOF
10020 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
10030 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a  has occurred. .*
10040 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73  * False otherwis
10050 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10060 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
10070 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  f(Fts5Index *p, 
10080 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
10090 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
100a0 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74  rn (p->rc || pIt
100b0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
100c0 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 70 4c 65  >aFirst[1] ].pLe
100d0 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  af==0);.}../*.**
100e0 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
100f0 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
10100 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
10110 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
10120 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
10130 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
10140 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
10150 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
10160 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
10170 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
10180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
10190 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
101a0 69 64 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49  id(Fts5MultiSegI
101b0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61  ter *pIter){.  a
101c0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53  ssert( pIter->aS
101d0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
101e0 74 5b 31 5d 20 5d 2e 70 4c 65 61 66 20 29 3b 0a  t[1] ].pLeaf );.
101f0 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
10200 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
10210 72 73 74 5b 31 5d 20 5d 2e 69 52 6f 77 69 64 3b  rst[1] ].iRowid;
10220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
10230 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
10240 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74  he next entry at
10250 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d   or following iM
10260 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  atch..*/.static 
10270 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
10280 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
10290 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
102a0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
102b0 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69  *pIter, .  i64 i
102c0 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65  Match.){.  while
102d0 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ( 1 ){.    i64 i
102e0 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d  Rowid;.    fts5M
102f0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
10300 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68  pIter, 1, iMatch
10310 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d  );.    if( fts5M
10320 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
10330 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20  Iter) ) break;. 
10340 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35     iRowid = fts5
10350 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
10360 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
10370 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26  Iter->bRev==0 &&
10380 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
10390 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
103a0 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20   pIter->bRev!=0 
103b0 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  && iRowid>=iMatc
103c0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d  h ) break;.  }.}
103d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
103e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
103f0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
10400 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61  the term associa
10410 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  ted with the .**
10420 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
10430 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
10440 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  ly points to..*/
10450 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
10460 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54   *fts5MultiIterT
10470 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53 65 67  erm(Fts5MultiSeg
10480 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
10490 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67   *pn){.  Fts5Seg
104a0 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72  Iter *p = &pIter
104b0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
104c0 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20 2a 70  First[1] ];.  *p
104d0 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20  n = p->term.n;. 
104e0 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e   return p->term.
104f0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
10500 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63  rn true if the c
10510 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 70 61  hunk iterator pa
10520 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
10530 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a  nd argument is.*
10540 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20  * at EOF. Or if 
10550 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
10560 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f  eady occurred. O
10570 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
10580 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
10590 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e 6b 49  c int fts5ChunkI
105a0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
105b0 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b 49 74   *p, Fts5ChunkIt
105c0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
105d0 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
105e0 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 3b  Iter->pLeaf==0);
105f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
10600 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74 65 72  e the chunk-iter
10610 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
10620 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61 20 74   chunk of data t
10630 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69  o read..*/.stati
10640 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
10650 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
10660 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b  ex *p, Fts5Chunk
10670 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
10680 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 6e  assert( pIter->n
10690 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20 29 3b  Rem>=pIter->n );
106a0 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20 2d  .  pIter->nRem -
106b0 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20 66 74  = pIter->n;.  ft
106c0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
106d0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
106e0 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
106f0 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 30 3b  .  pIter->p = 0;
10700 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 52  .  if( pIter->nR
10710 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  em>0 ){.    Fts5
10720 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
10730 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
10740 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66 20  id++;.    pLeaf 
10750 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d  = pIter->pLeaf =
10760 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
10770 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
10780 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  id);.    if( pLe
10790 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  af ){.      pIte
107a0 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74 65 72  r->n = MIN(pIter
107b0 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d 3e 6e  ->nRem, pLeaf->n
107c0 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  -4);.      pIter
107d0 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 2b 34  ->p = pLeaf->p+4
107e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
107f0 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65 20 74  *.** Intialize t
10800 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f  he chunk iterato
10810 72 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 6f  r to read the po
10820 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61  sition list data
10830 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a 20 74   for which .** t
10840 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 69 73  he size field is
10850 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66 20   at offset iOff 
10860 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e 20 0a  of leaf pLeaf. .
10870 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10880 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74  ts5ChunkIterInit
10890 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
108a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
108b0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
108c0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
108d0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
108e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
108f0 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65 72 61  /* Segment itera
10900 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73 6c  tor to read posl
10910 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74  ist from */.  Ft
10920 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
10930 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er            /*
10940 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
10950 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
10960 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e  int iId = pSeg->
10970 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
10980 69 36 34 20 72 6f 77 69 64 20 3d 20 46 54 53 35  i64 rowid = FTS5
10990 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
109a0 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20  Seg->iIdx, iId, 
109b0 30 2c 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67  0, pSeg->iLeafPg
109c0 6e 6f 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20  no);.  Fts5Data 
109d0 2a 70 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  *pLeaf = pSeg->p
109e0 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Leaf;.  int iOff
109f0 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66   = pSeg->iLeafOf
10a00 66 73 65 74 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  fset;..  memset(
10a10 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
10a20 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
10a30 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 20 3d  er->iLeafRowid =
10a40 20 72 6f 77 69 64 3b 0a 20 20 69 66 28 20 69 4f   rowid;.  if( iO
10a50 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  ff<pLeaf->n ){. 
10a60 20 20 20 66 74 73 35 44 61 74 61 52 65 66 65 72     fts5DataRefer
10a70 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ence(pLeaf);.   
10a80 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
10a90 70 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeaf;.  }else{.
10aa0 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20      pIter->nRem 
10ab0 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 43 68 75  = 1;.    fts5Chu
10ac0 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  nkIterNext(p, pI
10ad0 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ter);.    if( p-
10ae0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
10af0 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20    iOff = 4;.    
10b00 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
10b10 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 69 4f 66  Leaf;.  }..  iOf
10b20 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
10b30 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
10b40 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b 0a  , pIter->nRem);.
10b50 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e    pIter->n = MIN
10b60 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f 66 66  (pLeaf->n - iOff
10b70 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b 0a  , pIter->nRem);.
10b80 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 4c 65    pIter->p = pLe
10b90 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a 0a 20  af->p + iOff;.. 
10ba0 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d 3d 30   if( pIter->n==0
10bb0 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68 75 6e   ){.    fts5Chun
10bc0 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  kIterNext(p, pIt
10bd0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
10be0 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e  ic void fts5Chun
10bf0 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46 74 73  kIterRelease(Fts
10c00 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65  5ChunkIter *pIte
10c10 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61 52 65  r){.  fts5DataRe
10c20 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
10c30 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c  af);.  pIter->pL
10c40 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eaf = 0;.}../*.*
10c50 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74 75 72  * Read and retur
10c60 6e 20 74 68 65 20 6e 65 78 74 20 33 32 2d 62 69  n the next 32-bi
10c70 74 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 74 68  t varint from th
10c80 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
10c90 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70 61 73  iterator .** pas
10ca0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
10cb0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
10cc0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
10cd0 63 75 72 73 2c 20 7a 65 72 6f 20 69 73 20 72 65  curs, zero is re
10ce0 74 75 72 6e 65 64 20 61 6e 20 61 6e 20 65 72 72  turned an an err
10cf0 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20  or code left in 
10d00 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 2e 72 63  .** Fts5Index.rc
10d10 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
10d20 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
10d30 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
10d40 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
10d50 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
10d60 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
10d70 20 66 74 73 35 50 6f 73 49 74 65 72 52 65 61 64   fts5PosIterRead
10d80 56 61 72 69 6e 74 28 46 74 73 35 49 6e 64 65 78  Varint(Fts5Index
10d90 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74 65 72   *p, Fts5PosIter
10da0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
10db0 69 56 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  iVal = 0;.  if( 
10dc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10dd0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65   ){.    if( pIte
10de0 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  r->iOff>=pIter->
10df0 63 68 75 6e 6b 2e 6e 20 29 7b 0a 20 20 20 20 20  chunk.n ){.     
10e00 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65   fts5ChunkIterNe
10e10 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68  xt(p, &pIter->ch
10e20 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unk);.      if( 
10e30 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
10e40 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e  (p, &pIter->chun
10e50 6b 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  k) ) return 0;. 
10e60 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66       pIter->iOff
10e70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
10e80 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67  pIter->iOff += g
10e90 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
10ea0 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74 65 72  r->chunk.p[pIter
10eb0 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a  ->iOff], iVal);.
10ec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 56 61    }.  return iVa
10ed0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  l;.}../*.** Adva
10ee0 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  nce the position
10ef0 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72 20 74   list iterator t
10f00 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
10f10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10f20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74   fts5PosIterNext
10f30 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
10f40 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74 65  ts5PosIter *pIte
10f50 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a  r){.  int iVal;.
10f60 20 20 61 73 73 65 72 74 28 20 66 74 73 35 43 68    assert( fts5Ch
10f70 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70  unkIterEof(p, &p
10f80 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30 20  Iter->chunk)==0 
10f90 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74 73 35  );.  iVal = fts5
10fa0 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e  PosIterReadVarin
10fb0 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 69  t(p, pIter);.  i
10fc0 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  f( fts5ChunkIter
10fd0 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63  Eof(p, &pIter->c
10fe0 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hunk)==0 ){.    
10ff0 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20  if( iVal==1 ){. 
11000 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43 6f 6c       pIter->iCol
11010 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52 65   = fts5PosIterRe
11020 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74 65  adVarint(p, pIte
11030 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  r);.      pIter-
11040 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f 73 49  >iPos = fts5PosI
11050 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 70 2c  terReadVarint(p,
11060 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20 20 20   pIter) - 2;.   
11070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
11080 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 69 56  ter->iPos += (iV
11090 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d 0a 20  al - 2);.    }. 
110a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
110b0 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73 35 50  ialize the Fts5P
110c0 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20 70 61  osIter object pa
110d0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 6e 61  ssed as the fina
110e0 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  l argument to it
110f0 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
11100 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
11110 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  st associated wi
11120 74 68 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  th the index ent
11130 72 79 20 74 68 61 74 20 69 74 65 72 61 74 6f 72  ry that iterator
11140 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75 72 72   .** pMulti curr
11150 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
11160 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11170 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74 28  fts5PosIterInit(
11180 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
111b0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
111c0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
111d0 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20 20 2f  *pMulti,       /
111e0 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74 65 72  * Multi-seg iter
111f0 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73  ator to read pos
11200 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  -list from */.  
11210 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74  Fts5PosIter *pIt
11220 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
11230 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
11240 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
11250 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
11270 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
11280 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
11290 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
112a0 31 5d 20 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  1] ];.    memset
112b0 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
112c0 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20  f(*pIter));.    
112d0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69  fts5ChunkIterIni
112e0 74 28 70 2c 20 70 53 65 67 2c 20 26 70 49 74 65  t(p, pSeg, &pIte
112f0 72 2d 3e 63 68 75 6e 6b 29 3b 0a 20 20 20 20 69  r->chunk);.    i
11300 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  f( fts5ChunkIter
11310 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63  Eof(p, &pIter->c
11320 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hunk)==0 ){.    
11330 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78    fts5PosIterNex
11340 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
11350 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11360 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
11370 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 65 72  he position iter
11380 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
11390 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
113a0 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f 46 2e  nt is.** at EOF.
113b0 20 4f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   Or if an error 
113c0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
113d0 72 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rred. Otherwise,
113e0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a   return false..*
113f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
11400 35 50 6f 73 49 74 65 72 45 6f 66 28 46 74 73 35  5PosIterEof(Fts5
11410 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 50 6f  Index *p, Fts5Po
11420 73 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  sIter *pIter){. 
11430 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c   return (p->rc |
11440 7c 20 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e 70  | pIter->chunk.p
11450 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Leaf==0);.}.../*
11460 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d  .** Allocate mem
11470 6f 72 79 2e 20 54 68 65 20 64 69 66 66 65 72 65  ory. The differe
11480 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
11490 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 66 74   function and ft
114a0 73 35 49 64 78 4d 61 6c 6c 6f 63 28 29 0a 2a 2a  s5IdxMalloc().**
114b0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 69 6e   is that this in
114c0 63 72 65 6d 65 6e 74 73 20 74 68 65 20 46 74 73  crements the Fts
114d0 35 49 6e 64 65 78 2e 6e 50 65 6e 64 69 6e 67 44  5Index.nPendingD
114e0 61 74 61 20 76 61 72 69 61 62 6c 65 20 62 79 20  ata variable by 
114f0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
11500 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
11510 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75  . It should be u
11520 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 6c 6c 6f  sed for all allo
11530 63 61 74 69 6f 6e 73 20 75 73 65 64 0a 2a 2a 20  cations used.** 
11540 74 6f 20 73 74 6f 72 65 20 70 65 6e 64 69 6e 67  to store pending
11550 2d 64 61 74 61 20 77 69 74 68 69 6e 20 74 68 65  -data within the
11560 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
11570 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
11580 63 20 76 6f 69 64 20 2a 66 74 73 35 50 65 6e 64  c void *fts5Pend
11590 69 6e 67 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e  ingMalloc(Fts5In
115a0 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  dex *p, int nByt
115b0 65 29 7b 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e  e){.  p->nPendin
115c0 67 44 61 74 61 20 2b 3d 20 6e 42 79 74 65 3b 0a  gData += nByte;.
115d0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 64 78    return fts5Idx
115e0 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
115f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
11600 6e 20 65 6e 74 72 79 20 66 6f 72 20 28 69 52 6f  n entry for (iRo
11610 77 69 64 2f 69 43 6f 6c 2f 69 50 6f 73 29 20 74  wid/iCol/iPos) t
11620 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  o the doclist fo
11630 72 20 28 70 54 6f 6b 65 6e 2f 6e 54 6f 6b 65 6e  r (pToken/nToken
11640 29 0a 2a 2a 20 69 6e 20 68 61 73 68 20 74 61 62  ).** in hash tab
11650 6c 65 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64  le for index iId
11660 78 2e 20 49 66 20 69 49 64 78 20 69 73 20 7a 65  x. If iIdx is ze
11670 72 6f 2c 20 74 68 69 73 20 69 73 20 74 68 65 20  ro, this is the 
11680 6d 61 69 6e 20 74 65 72 6d 73 20 0a 2a 2a 20 69  main terms .** i
11690 6e 64 65 78 2e 20 56 61 6c 75 65 73 20 6f 66 20  ndex. Values of 
116a0 31 20 61 6e 64 20 67 72 65 61 74 65 72 20 66 6f  1 and greater fo
116b0 72 20 69 49 64 78 20 61 72 65 20 70 72 65 66 69  r iIdx are prefi
116c0 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a 2a 2a  x indexes..**.**
116d0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
116e0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
116f0 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
11700 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
11710 20 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79   .** accordingly
11720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11730 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48 61   fts5AddTermToHa
11740 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  sh(.  Fts5Index 
11750 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11760 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
11770 62 6a 65 63 74 20 74 6f 20 77 72 69 74 65 20 74  bject to write t
11780 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  o */.  int iIdx,
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72 79 20         /* Entry 
117b0 69 6e 20 70 2d 3e 61 48 61 73 68 5b 5d 20 74 6f  in p->aHash[] to
117c0 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 69 6e 74   update */.  int
117d0 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
117f0 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
11800 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
11810 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
11820 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11840 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
11850 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
11860 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11870 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
11880 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
11890 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
118a0 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
118b0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  */.){.  Fts5Conf
118c0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
118d0 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 33  >pConfig;.  Fts3
118e0 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 46  Hash *pHash;.  F
118f0 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
11900 74 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 46  t *pDoclist;.  F
11910 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73  ts5PendingPoslis
11920 74 20 2a 70 50 6f 73 6c 69 73 74 3b 0a 20 20 69  t *pPoslist;.  i
11930 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 69  64 iRowid = p->i
11940 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
11950 2f 2a 20 52 6f 77 69 64 20 61 73 73 6f 63 69 61  /* Rowid associa
11960 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 74  ted with these t
11970 6f 6b 65 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49  okens */..  /* I
11980 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
11990 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64 20 74  lready occured t
119a0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
119b0 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  -op. */.  if( p-
119c0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
119d0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46   return;..  /* F
119e0 69 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  ind the hash tab
119f0 6c 65 20 74 6f 20 75 73 65 2e 20 49 74 20 68 61  le to use. It ha
11a00 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
11a10 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 61  llocated. */.  a
11a20 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43 6f  ssert( iIdx<=pCo
11a30 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 3b  nfig->nPrefix );
11a40 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3d  .  assert( iIdx=
11a50 3d 30 20 7c 7c 20 6e 54 6f 6b 65 6e 3d 3d 70 43  =0 || nToken==pC
11a60 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
11a70 49 64 78 2d 31 5d 20 29 3b 0a 20 20 70 48 61 73  Idx-1] );.  pHas
11a80 68 20 3d 20 26 70 2d 3e 61 48 61 73 68 5b 69 49  h = &p->aHash[iI
11a90 64 78 5d 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  dx];..  /* Find 
11aa0 74 68 65 20 64 6f 63 6c 69 73 74 20 74 6f 20 61  the doclist to a
11ab0 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c 6f 63 61  ppend to. Alloca
11ac0 74 65 20 61 20 6e 65 77 20 64 6f 63 6c 69 73 74  te a new doclist
11ad0 20 6f 62 6a 65 63 74 20 69 66 0a 20 20 2a 2a 20   object if.  ** 
11ae0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 70  required. */.  p
11af0 44 6f 63 6c 69 73 74 20 3d 20 28 46 74 73 35 50  Doclist = (Fts5P
11b00 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 2a 29 66  endingDoclist*)f
11b10 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61 73  ts3HashFind(pHas
11b20 68 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  h, pToken, nToke
11b30 6e 29 3b 0a 20 20 69 66 28 20 70 44 6f 63 6c 69  n);.  if( pDocli
11b40 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  st==0 ){.    Fts
11b50 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20  5PendingDoclist 
11b60 2a 70 44 65 6c 3b 0a 20 20 20 20 70 44 6f 63 6c  *pDel;.    pDocl
11b70 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e  ist = fts5Pendin
11b80 67 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  gMalloc(p, sizeo
11b90 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63  f(Fts5PendingDoc
11ba0 6c 69 73 74 29 20 2b 20 6e 54 6f 6b 65 6e 29 3b  list) + nToken);
11bb0 0a 20 20 20 20 69 66 28 20 70 44 6f 63 6c 69 73  .    if( pDoclis
11bc0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
11bd0 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 70 54 65     pDoclist->pTe
11be0 72 6d 20 3d 20 28 75 38 2a 29 26 70 44 6f 63 6c  rm = (u8*)&pDocl
11bf0 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 44 6f 63  ist[1];.    pDoc
11c00 6c 69 73 74 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54  list->nTerm = nT
11c10 6f 6b 65 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  oken;.    memcpy
11c20 28 70 44 6f 63 6c 69 73 74 2d 3e 70 54 65 72 6d  (pDoclist->pTerm
11c30 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
11c40 29 3b 0a 20 20 20 20 70 44 65 6c 20 3d 20 66 74  );.    pDel = ft
11c50 73 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  s3HashInsert(pHa
11c60 73 68 2c 20 70 44 6f 63 6c 69 73 74 2d 3e 70 54  sh, pDoclist->pT
11c70 65 72 6d 2c 20 6e 54 6f 6b 65 6e 2c 20 70 44 6f  erm, nToken, pDo
11c80 63 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  clist);.    if( 
11c90 70 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 61 73  pDel ){.      as
11ca0 73 65 72 74 28 20 70 44 6f 63 6c 69 73 74 3d 3d  sert( pDoclist==
11cb0 70 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  pDel );.      sq
11cc0 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65 6c 29  lite3_free(pDel)
11cd0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
11ce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11cf0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  }.  }..  /* Find
11d10 20 74 68 65 20 70 6f 73 6c 69 73 74 20 74 6f 20   the poslist to 
11d20 61 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c 6f 63  append to. Alloc
11d30 61 74 65 20 61 20 6e 65 77 20 6f 62 6a 65 63 74  ate a new object
11d40 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
11d50 0a 20 20 70 50 6f 73 6c 69 73 74 20 3d 20 70 44  .  pPoslist = pD
11d60 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69 73 74  oclist->pPoslist
11d70 3b 0a 20 20 69 66 28 20 70 50 6f 73 6c 69 73 74  ;.  if( pPoslist
11d80 3d 3d 30 20 7c 7c 20 70 50 6f 73 6c 69 73 74 2d  ==0 || pPoslist-
11d90 3e 69 52 6f 77 69 64 21 3d 69 52 6f 77 69 64 20  >iRowid!=iRowid 
11da0 29 7b 0a 20 20 20 20 70 50 6f 73 6c 69 73 74 20  ){.    pPoslist 
11db0 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4d 61 6c  = fts5PendingMal
11dc0 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
11dd0 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74  s5PendingPoslist
11de0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6f 73  ));.    if( pPos
11df0 6c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  list==0 ) return
11e00 3b 0a 20 20 20 20 70 50 6f 73 6c 69 73 74 2d 3e  ;.    pPoslist->
11e10 70 4e 65 78 74 20 3d 20 70 44 6f 63 6c 69 73 74  pNext = pDoclist
11e20 2d 3e 70 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  ->pPoslist;.    
11e30 70 50 6f 73 6c 69 73 74 2d 3e 69 52 6f 77 69 64  pPoslist->iRowid
11e40 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 70   = iRowid;.    p
11e50 44 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69 73  Doclist->pPoslis
11e60 74 20 3d 20 70 50 6f 73 6c 69 73 74 3b 0a 20 20  t = pPoslist;.  
11e70 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 43 6f 6c    pDoclist->iCol
11e80 20 3d 20 30 3b 0a 20 20 20 20 70 44 6f 63 6c 69   = 0;.    pDocli
11e90 73 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a 20 20  st->iPos = 0;.  
11ea0 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
11eb0 68 65 20 76 61 6c 75 65 73 20 74 6f 20 74 68 65  he values to the
11ec0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20   position list. 
11ed0 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  */.  if( iCol>=0
11ee0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64   ){.    p->nPend
11ef0 69 6e 67 44 61 74 61 20 2d 3d 20 70 50 6f 73 6c  ingData -= pPosl
11f00 69 73 74 2d 3e 62 75 66 2e 6e 53 70 61 63 65 3b  ist->buf.nSpace;
11f10 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 21 3d 70  .    if( iCol!=p
11f20 44 6f 63 6c 69 73 74 2d 3e 69 43 6f 6c 20 29 7b  Doclist->iCol ){
11f30 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
11f40 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
11f50 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73 74 2d  ->rc, &pPoslist-
11f60 3e 62 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  >buf, 1);.      
11f70 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
11f80 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
11f90 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2c 20 69  pPoslist->buf, i
11fa0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 44 6f 63  Col);.      pDoc
11fb0 6c 69 73 74 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f  list->iCol = iCo
11fc0 6c 3b 0a 20 20 20 20 20 20 70 44 6f 63 6c 69 73  l;.      pDoclis
11fd0 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20  t->iPos = 0;.   
11fe0 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
11ff0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
12000 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73 74 2d  ->rc, &pPoslist-
12010 3e 62 75 66 2c 20 69 50 6f 73 20 2b 20 32 20 2d  >buf, iPos + 2 -
12020 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50 6f 73 29   pDoclist->iPos)
12030 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e  ;.    p->nPendin
12040 67 44 61 74 61 20 2b 3d 20 70 50 6f 73 6c 69 73  gData += pPoslis
12050 74 2d 3e 62 75 66 2e 6e 53 70 61 63 65 3b 0a 20  t->buf.nSpace;. 
12060 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50 6f     pDoclist->iPo
12070 73 20 3d 20 69 50 6f 73 3b 0a 20 20 7d 0a 7d 0a  s = iPos;.  }.}.
12080 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
12090 70 65 6e 64 69 6e 67 2d 64 6f 63 6c 69 73 74 20  pending-doclist 
120a0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
120b0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
120c0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
120d0 69 64 20 66 74 73 35 46 72 65 65 50 65 6e 64 69  id fts5FreePendi
120e0 6e 67 44 6f 63 6c 69 73 74 28 46 74 73 35 50 65  ngDoclist(Fts5Pe
120f0 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70 29  ndingDoclist *p)
12100 7b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 50  {.  Fts5PendingP
12110 6f 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69 73 74  oslist *pPoslist
12120 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 50  ;.  Fts5PendingP
12130 6f 73 6c 69 73 74 20 2a 70 4e 65 78 74 3b 0a 20  oslist *pNext;. 
12140 20 66 6f 72 28 70 50 6f 73 6c 69 73 74 3d 70 2d   for(pPoslist=p-
12150 3e 70 50 6f 73 6c 69 73 74 3b 20 70 50 6f 73 6c  >pPoslist; pPosl
12160 69 73 74 3b 20 70 50 6f 73 6c 69 73 74 3d 70 4e  ist; pPoslist=pN
12170 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
12180 3d 20 70 50 6f 73 6c 69 73 74 2d 3e 70 4e 65 78  = pPoslist->pNex
12190 74 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  t;.    fts5Buffe
121a0 72 46 72 65 65 28 26 70 50 6f 73 6c 69 73 74 2d  rFree(&pPoslist-
121b0 3e 62 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  >buf);.    sqlit
121c0 65 33 5f 66 72 65 65 28 70 50 6f 73 6c 69 73 74  e3_free(pPoslist
121d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
121e0 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
121f0 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d  ** Insert or rem
12200 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66  ove data to or f
12210 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45  rom the index. E
12220 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d  ach time a docum
12230 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64  ent is .** added
12240 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66   to or removed f
12250 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74  rom the index, t
12260 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12270 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  called one or mo
12280 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a  re.** times..**.
12290 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74  ** For an insert
122a0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
122b0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
122c0 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e  h token in the n
122d0 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20  ew document..** 
122e0 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
122f0 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74   is a delete, it
12300 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
12310 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20  (at least) once 
12320 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71  for each.** uniq
12330 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ue token in the 
12340 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  document with an
12350 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73   iCol value less
12360 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20   than zero. The 
12370 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iPos.** argument
12380 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
12390 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  a delete..*/.voi
123a0 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  d sqlite3Fts5Ind
123b0 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
123c0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
123d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
123e0 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
123f0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
12400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12410 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
12420 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
12430 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
12440 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
12470 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
12480 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
12490 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
124a0 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
124b0 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
124c0 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
124d0 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
124e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
12510 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
12520 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  es */.  Fts5Conf
12530 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
12540 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 2f 2a 20  >pConfig;..  /* 
12550 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
12560 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64 20  already occured 
12570 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
12580 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70  o-op. */.  if( p
12590 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
125a0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
125b0 41 6c 6c 6f 63 61 74 65 20 68 61 73 68 20 74 61  Allocate hash ta
125c0 62 6c 65 73 20 69 66 20 74 68 65 79 20 68 61 76  bles if they hav
125d0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  e not already be
125e0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
125f0 20 20 69 66 28 20 70 2d 3e 61 48 61 73 68 3d 3d    if( p->aHash==
12600 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 48 61  0 ){.    int nHa
12610 73 68 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 6e 50  sh = pConfig->nP
12620 72 65 66 69 78 20 2b 20 31 3b 0a 20 20 20 20 70  refix + 1;.    p
12630 2d 3e 61 48 61 73 68 20 3d 20 28 46 74 73 33 48  ->aHash = (Fts3H
12640 61 73 68 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ash*)sqlite3_mal
12650 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 48  loc(sizeof(Fts3H
12660 61 73 68 29 20 2a 20 6e 48 61 73 68 29 3b 0a 20  ash) * nHash);. 
12670 20 20 20 69 66 28 20 70 2d 3e 61 48 61 73 68 3d     if( p->aHash=
12680 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
12690 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
126a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
126b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 48     for(i=0; i<nH
126c0 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ash; i++){.     
126d0 20 20 20 66 74 73 33 48 61 73 68 49 6e 69 74 28     fts3HashInit(
126e0 26 70 2d 3e 61 48 61 73 68 5b 69 5d 2c 20 46 54  &p->aHash[i], FT
126f0 53 33 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  S3_HASH_STRING, 
12700 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
12710 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  }.  }..  /* Add 
12720 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20 74 6f  the new token to
12730 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20   the main terms 
12740 68 61 73 68 20 74 61 62 6c 65 2e 20 41 6e 64 20  hash table. And 
12750 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 20  to each of the. 
12760 20 2a 2a 20 70 72 65 66 69 78 20 68 61 73 68 20   ** prefix hash 
12770 74 61 62 6c 65 73 20 74 68 61 74 20 69 74 20 69  tables that it i
12780 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
12790 6f 72 2e 20 2a 2f 0a 20 20 66 74 73 35 41 64 64  or. */.  fts5Add
127a0 54 65 72 6d 54 6f 48 61 73 68 28 70 2c 20 30 2c  TermToHash(p, 0,
127b0 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 6f   iCol, iPos, pTo
127c0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
127d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66  for(i=0; i<pConf
127e0 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b  ig->nPrefix; i++
127f0 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  ){.    if( nToke
12800 6e 3e 3d 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  n>=pConfig->aPre
12810 66 69 78 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  fix[i] ){.      
12820 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48 61 73  fts5AddTermToHas
12830 68 28 70 2c 20 69 2b 31 2c 20 69 43 6f 6c 2c 20  h(p, i+1, iCol, 
12840 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 70 43  iPos, pToken, pC
12850 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
12860 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ]);.    }.  }.}.
12870 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
12880 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
12890 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
128a0 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 0a 2a  re pStruct..**.*
128b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
128c0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
128d0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
128e0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20  n is a no-op. 0 
128f0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
12900 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
12910 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
12920 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46 74  AllocateSegid(Ft
12930 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
12940 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
12950 63 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ct){.  int i;.  
12960 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
12970 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 30 3b  E_OK ) return 0;
12980 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  ..  for(i=0; i<1
12990 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  00; i++){.    in
129a0 74 20 69 53 65 67 69 64 3b 0a 20 20 20 20 73 71  t iSegid;.    sq
129b0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
129c0 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20 28 76  (sizeof(int), (v
129d0 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20  oid*)&iSegid);. 
129e0 20 20 20 69 53 65 67 69 64 20 3d 20 69 53 65 67     iSegid = iSeg
129f0 69 64 20 26 20 28 28 31 20 3c 3c 20 46 54 53 35  id & ((1 << FTS5
12a00 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31 29 3b 0a  _DATA_ID_B)-1);.
12a10 20 20 20 20 69 66 28 20 69 53 65 67 69 64 20 29      if( iSegid )
12a20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
12a30 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 66 6f  , iSeg;.      fo
12a40 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
12a50 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
12a60 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
12a70 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
12a80 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
12a90 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
12aa0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
12ab0 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70 53 74   if( iSegid==pSt
12ac0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
12ad0 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
12ae0 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  egid ){.        
12af0 20 20 20 20 69 53 65 67 69 64 20 3d 20 30 3b 0a      iSegid = 0;.
12b00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12b10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12b20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 53 65 67    }.    if( iSeg
12b30 69 64 20 29 20 72 65 74 75 72 6e 20 69 53 65 67  id ) return iSeg
12b40 69 64 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63  id;.  }..  p->rc
12b50 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
12b60 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12b70 73 74 61 74 69 63 20 46 74 73 35 50 65 6e 64 69  static Fts5Pendi
12b80 6e 67 44 6f 63 6c 69 73 74 20 2a 66 74 73 35 50  ngDoclist *fts5P
12b90 65 6e 64 69 6e 67 4d 65 72 67 65 28 0a 20 20 46  endingMerge(.  F
12ba0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
12bb0 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69  Fts5PendingDocli
12bc0 73 74 20 2a 70 4c 65 66 74 2c 0a 20 20 46 74 73  st *pLeft,.  Fts
12bd0 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20  5PendingDoclist 
12be0 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 46 74 73  *pRight.){.  Fts
12bf0 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20  5PendingDoclist 
12c00 2a 70 31 20 3d 20 70 4c 65 66 74 3b 0a 20 20 46  *p1 = pLeft;.  F
12c10 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
12c20 74 20 2a 70 32 20 3d 20 70 52 69 67 68 74 3b 0a  t *p2 = pRight;.
12c30 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63    Fts5PendingDoc
12c40 6c 69 73 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a  list *pRet = 0;.
12c50 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63    Fts5PendingDoc
12c60 6c 69 73 74 20 2a 2a 70 70 4f 75 74 20 3d 20 26  list **ppOut = &
12c70 70 52 65 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20  pRet;..  while( 
12c80 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20  p1 || p2 ){.    
12c90 69 66 28 20 70 31 3d 3d 30 20 29 7b 0a 20 20 20  if( p1==0 ){.   
12ca0 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 32 3b 0a     *ppOut = p2;.
12cb0 20 20 20 20 20 20 70 32 20 3d 20 30 3b 0a 20 20        p2 = 0;.  
12cc0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 3d 3d    }else if( p2==
12cd0 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 75  0 ){.      *ppOu
12ce0 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31  t = p1;.      p1
12cf0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
12d00 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20  .      int nCmp 
12d10 3d 20 4d 49 4e 28 70 31 2d 3e 6e 54 65 72 6d 2c  = MIN(p1->nTerm,
12d20 20 70 32 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20   p2->nTerm);.   
12d30 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d     int res = mem
12d40 63 6d 70 28 70 31 2d 3e 70 54 65 72 6d 2c 20 70  cmp(p1->pTerm, p
12d50 32 2d 3e 70 54 65 72 6d 2c 20 6e 43 6d 70 29 3b  2->pTerm, nCmp);
12d60 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
12d70 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 6e 54  0 ) res = p1->nT
12d80 65 72 6d 20 2d 20 70 32 2d 3e 6e 54 65 72 6d 3b  erm - p2->nTerm;
12d90 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3e  ..      if( res>
12da0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
12db0 70 32 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f  p2 is smaller */
12dc0 0a 20 20 20 20 20 20 20 20 2a 70 70 4f 75 74 20  .        *ppOut 
12dd0 3d 20 70 32 3b 0a 20 20 20 20 20 20 20 20 70 70  = p2;.        pp
12de0 4f 75 74 20 3d 20 26 70 32 2d 3e 70 4e 65 78 74  Out = &p2->pNext
12df0 3b 0a 20 20 20 20 20 20 20 20 70 32 20 3d 20 70  ;.        p2 = p
12e00 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  2->pNext;.      
12e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
12e20 2a 20 70 31 20 69 73 20 73 6d 61 6c 6c 65 72 20  * p1 is smaller 
12e30 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 70 4f 75  */.        *ppOu
12e40 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20 20 20  t = p1;.        
12e50 70 70 4f 75 74 20 3d 20 26 70 31 2d 3e 70 4e 65  ppOut = &p1->pNe
12e60 78 74 3b 0a 20 20 20 20 20 20 20 20 70 31 20 3d  xt;.        p1 =
12e70 20 70 31 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   p1->pNext;.    
12e80 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 4f 75 74    }.      *ppOut
12e90 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12ea0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
12eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  }../*.** Extract
12ec0 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 66 72 6f 6d   all tokens from
12ed0 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73   hash table iHas
12ee0 68 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 6d 20  h and link them 
12ef0 69 6e 74 6f 20 61 20 6c 69 73 74 0a 2a 2a 20 69  into a list.** i
12f00 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  n sorted order. 
12f10 54 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69  The hash table i
12f20 73 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  s cleared before
12f30 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74 20 69   returning. It i
12f40 73 0a 2a 2a 20 74 68 65 20 72 65 73 70 6f 6e 73  s.** the respons
12f50 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
12f60 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
12f70 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
12f80 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 6c 69  e returned.** li
12f90 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  st..**.** If an 
12fa0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
12fb0 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
12fc0 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
12fd0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
12fe0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
12ff0 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
13000 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
13010 2f 0a 73 74 61 74 69 63 20 46 74 73 35 50 65 6e  /.static Fts5Pen
13020 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 66 74 73  dingDoclist *fts
13030 35 50 65 6e 64 69 6e 67 4c 69 73 74 28 46 74 73  5PendingList(Fts
13040 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
13050 48 61 73 68 29 7b 0a 20 20 63 6f 6e 73 74 20 69  Hash){.  const i
13060 6e 74 20 6e 4d 65 72 67 65 53 6c 6f 74 20 3d 20  nt nMergeSlot = 
13070 33 32 3b 0a 20 20 46 74 73 33 48 61 73 68 20 2a  32;.  Fts3Hash *
13080 70 48 61 73 68 3b 0a 20 20 46 74 73 33 48 61 73  pHash;.  Fts3Has
13090 68 45 6c 65 6d 20 2a 70 45 3b 20 20 20 20 20 20  hElem *pE;      
130a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
130b0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
130c0 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  .  Fts5PendingDo
130d0 63 6c 69 73 74 20 2a 2a 61 70 3b 0a 20 20 46 74  clist **ap;.  Ft
130e0 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  s5PendingDoclist
130f0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 69   *pList;.  int i
13100 3b 0a 0a 20 20 61 70 20 3d 20 66 74 73 35 49 64  ;..  ap = fts5Id
13110 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
13120 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63  f(Fts5PendingDoc
13130 6c 69 73 74 2a 29 20 2a 20 6e 4d 65 72 67 65 53  list*) * nMergeS
13140 6c 6f 74 29 3b 0a 20 20 69 66 28 20 21 61 70 20  lot);.  if( !ap 
13150 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 70  ) return 0;..  p
13160 48 61 73 68 20 3d 20 26 70 2d 3e 61 48 61 73 68  Hash = &p->aHash
13170 5b 69 48 61 73 68 5d 3b 0a 20 20 66 6f 72 28 70  [iHash];.  for(p
13180 45 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28  E=fts3HashFirst(
13190 70 48 61 73 68 29 3b 20 70 45 3b 20 70 45 3d 66  pHash); pE; pE=f
131a0 74 73 33 48 61 73 68 4e 65 78 74 28 70 45 29 29  ts3HashNext(pE))
131b0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
131c0 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
131d0 69 73 74 20 2a 70 44 6f 63 6c 69 73 74 20 3d 20  ist *pDoclist = 
131e0 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c  (Fts5PendingDocl
131f0 69 73 74 2a 29 66 74 73 33 48 61 73 68 44 61 74  ist*)fts3HashDat
13200 61 28 70 45 29 3b 0a 20 20 20 20 61 73 73 65 72  a(pE);.    asser
13210 74 28 20 70 44 6f 63 6c 69 73 74 2d 3e 70 4e 65  t( pDoclist->pNe
13220 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  xt==0 );.    for
13230 28 69 3d 30 3b 20 61 70 5b 69 5d 3b 20 69 2b 2b  (i=0; ap[i]; i++
13240 29 7b 0a 20 20 20 20 20 20 70 44 6f 63 6c 69 73  ){.      pDoclis
13250 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4d  t = fts5PendingM
13260 65 72 67 65 28 70 2c 20 70 44 6f 63 6c 69 73 74  erge(p, pDoclist
13270 2c 20 61 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ap[i]);.      
13280 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ap[i] = 0;.    }
13290 0a 20 20 20 20 61 70 5b 69 5d 20 3d 20 70 44 6f  .    ap[i] = pDo
132a0 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 70 4c  clist;.  }..  pL
132b0 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ist = 0;.  for(i
132c0 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 53 6c 6f 74  =0; i<nMergeSlot
132d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73  ; i++){.    pLis
132e0 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4d  t = fts5PendingM
132f0 65 72 67 65 28 70 2c 20 70 4c 69 73 74 2c 20 61  erge(p, pList, a
13300 70 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  p[i]);.  }..  sq
13310 6c 69 74 65 33 5f 66 72 65 65 28 61 70 29 3b 0a  lite3_free(ap);.
13320 20 20 66 74 73 33 48 61 73 68 43 6c 65 61 72 28    fts3HashClear(
13330 70 48 61 73 68 29 3b 0a 20 20 72 65 74 75 72 6e  pHash);.  return
13340 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
13350 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
13360 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c 20   of the prefix, 
13370 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20 62  in bytes, that b
13380 75 66 66 65 72 20 28 6e 4e 65 77 2f 70 4e 65 77  uffer (nNew/pNew
13390 29 20 73 68 61 72 65 73 0a 2a 2a 20 77 69 74 68  ) shares.** with
133a0 20 62 75 66 66 65 72 20 28 6e 4f 6c 64 2f 70 4f   buffer (nOld/pO
133b0 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ld)..*/.static i
133c0 6e 74 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d  nt fts5PrefixCom
133d0 70 72 65 73 73 28 0a 20 20 69 6e 74 20 6e 4f 6c  press(.  int nOl
133e0 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c  d, const u8 *pOl
133f0 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 63  d,.  int nNew, c
13400 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77 0a 29 7b  onst u8 *pNew.){
13410 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
13420 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20 69  i=0; i<nNew && i
13430 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
13440 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e   if( pOld[i]!=pN
13450 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ew[i] ) break;. 
13460 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
13470 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 22 6e  ../*.** If an "n
13480 45 6d 70 74 79 22 20 72 65 63 6f 72 64 20 6d 75  Empty" record mu
13490 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
134a0 20 74 68 65 20 62 2d 74 72 65 65 20 62 65 66 6f   the b-tree befo
134b0 72 65 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 74  re the next.** t
134c0 65 72 6d 2c 20 77 72 69 74 65 20 69 74 20 6e 6f  erm, write it no
134d0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
134e0 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
134f0 4e 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78  NEmpty(Fts5Index
13500 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
13510 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
13520 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  if( pWriter->nEm
13530 70 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  pty ){.    int b
13540 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 46 74  Flag = 0;.    Ft
13550 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
13560 67 3b 0a 20 20 20 20 70 50 67 20 3d 20 26 70 57  g;.    pPg = &pW
13570 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 31  riter->aWriter[1
13580 5d 3b 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  ];.    if( pWrit
13590 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35  er->nEmpty>=FTS5
135a0 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
135b0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65  ){.      i64 iKe
135c0 79 20 3d 20 46 54 53 35 5f 44 4f 43 4c 49 53 54  y = FTS5_DOCLIST
135d0 5f 49 44 58 5f 52 4f 57 49 44 28 0a 20 20 20 20  _IDX_ROWID(.    
135e0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
135f0 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  Idx, pWriter->iS
13600 65 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  egid, .         
13610 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
13620 72 5b 30 5d 2e 70 67 6e 6f 20 2d 20 31 20 2d 20  r[0].pgno - 1 - 
13630 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 0a  pWriter->nEmpty.
13640 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
13650 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
13660 64 6c 69 64 78 2e 6e 3e 30 20 29 3b 0a 20 20 20  dlidx.n>0 );.   
13670 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
13680 28 70 2c 20 69 4b 65 79 2c 20 70 57 72 69 74 65  (p, iKey, pWrite
13690 72 2d 3e 64 6c 69 64 78 2e 70 2c 20 70 57 72 69  r->dlidx.p, pWri
136a0 74 65 72 2d 3e 64 6c 69 64 78 2e 6e 29 3b 0a 20  ter->dlidx.n);. 
136b0 20 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a       bFlag = 1;.
136c0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
136d0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
136e0 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62  (&p->rc, &pPg->b
136f0 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20 20 20 20  uf, bFlag);.    
13700 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
13710 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
13720 70 50 67 2d 3e 62 75 66 2c 20 70 57 72 69 74 65  pPg->buf, pWrite
13730 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20  r->nEmpty);.    
13740 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
13750 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  = 0;.  }..  /* W
13760 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74  hether or not it
13770 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
13780 64 69 73 6b 2c 20 7a 65 72 6f 20 74 68 65 20 64  disk, zero the d
13790 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 61 74 20  oclist index at 
137a0 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 20  this.  ** point 
137b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  */.  sqlite3Fts5
137c0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 57 72 69  BufferZero(&pWri
137d0 74 65 72 2d 3e 64 6c 69 64 78 29 3b 0a 20 20 70  ter->dlidx);.  p
137e0 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72  Writer->bDlidxPr
137f0 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 7d 0a 0a  evValid = 0;.}..
13800 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
13810 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 46  WriteBtreeGrow(F
13820 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
13830 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
13840 74 65 72 29 7b 0a 20 20 46 74 73 35 50 61 67 65  ter){.  Fts5Page
13850 57 72 69 74 65 72 20 2a 61 4e 65 77 3b 0a 20 20  Writer *aNew;.  
13860 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
13870 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 65 77  pNew;.  int nNew
13880 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61   = sizeof(Fts5Pa
13890 67 65 57 72 69 74 65 72 29 20 2a 20 28 70 57 72  geWriter) * (pWr
138a0 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b 31 29  iter->nWriter+1)
138b0 3b 0a 0a 20 20 61 4e 65 77 20 3d 20 28 46 74 73  ;..  aNew = (Fts
138c0 35 50 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c  5PageWriter*)sql
138d0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72  ite3_realloc(pWr
138e0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e  iter->aWriter, n
138f0 4e 65 77 29 3b 0a 20 20 69 66 28 20 61 4e 65 77  New);.  if( aNew
13900 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
13910 20 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 57   pNew = &aNew[pW
13920 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 5d 3b  riter->nWriter];
13930 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
13940 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61  0, sizeof(Fts5Pa
13950 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20 70 4e  geWriter));.  pN
13960 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ew->pgno = 1;.  
13970 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
13980 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
13990 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29 3b 0a 0a  pNew->buf, 1);..
139a0 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74    pWriter->nWrit
139b0 65 72 2b 2b 3b 0a 20 20 70 57 72 69 74 65 72 2d  er++;.  pWriter-
139c0 3e 61 57 72 69 74 65 72 20 3d 20 61 4e 65 77 3b  >aWriter = aNew;
139d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
139e0 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  s called once fo
139f0 72 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65  r each leaf page
13a00 20 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73   except the firs
13a10 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  t that contains.
13a20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
13a30 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28  term. Argument (
13a40 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20  nTerm/pTerm) is 
13a50 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20  the split-key - 
13a60 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69  a term that.** i
13a70 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c  s larger than al
13a80 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20  l terms written 
13a90 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65  to earlier leave
13aa0 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20  s, and equal to 
13ab0 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68  or.** smaller th
13ac0 61 6e 20 74 68 65 20 66 69 72 73 74 20 74 65 72  an the first ter
13ad0 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61  m on the new lea
13ae0 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  f..**.** If an e
13af0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
13b00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
13b10 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e  ft in Fts5Index.
13b20 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a  rc. If an error.
13b30 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  ** has already o
13b40 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
13b50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13b60 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
13b70 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
13b80 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
13b90 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  eeTerm(.  Fts5In
13ba0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
13bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
13bc0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
13bd0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
13be0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
13bf0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
13c00 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
13c10 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20  nTerm, const u8 
13c20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46  *pTerm      /* F
13c30 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77  irst term on new
13c40 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
13c50 74 20 69 48 65 69 67 68 74 3b 0a 20 20 66 6f 72  t iHeight;.  for
13c60 28 69 48 65 69 67 68 74 3d 31 3b 20 31 3b 20 69  (iHeight=1; 1; i
13c70 48 65 69 67 68 74 2b 2b 29 7b 0a 20 20 20 20 46  Height++){.    F
13c80 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
13c90 50 61 67 65 3b 0a 0a 20 20 20 20 69 66 28 20 69  Page;..    if( i
13ca0 48 65 69 67 68 74 3e 3d 70 57 72 69 74 65 72 2d  Height>=pWriter-
13cb0 3e 6e 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20  >nWriter ){.    
13cc0 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
13cd0 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29  Grow(p, pWriter)
13ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
13cf0 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  c ) return;.    
13d00 7d 0a 20 20 20 20 70 50 61 67 65 20 3d 20 26 70  }.    pPage = &p
13d10 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
13d20 69 48 65 69 67 68 74 5d 3b 0a 0a 20 20 20 20 66  iHeight];..    f
13d30 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d  ts5WriteBtreeNEm
13d40 70 74 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b  pty(p, pWriter);
13d50 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ..    if( pPage-
13d60 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73 7a 20  >buf.n>=p->pgsz 
13d70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
13d80 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  e will be writte
13d90 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 74  n to disk. The t
13da0 65 72 6d 20 77 69 6c 6c 20 62 65 20 77 72 69 74  erm will be writ
13db0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ten into the.   
13dc0 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6f 66 20     ** parent of 
13dd0 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20  pPage.  */.     
13de0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54   i64 iRowid = FT
13df0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
13e00 28 0a 20 20 20 20 20 20 20 20 20 20 70 57 72 69  (.          pWri
13e10 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74  ter->iIdx, pWrit
13e20 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 48 65 69  er->iSegid, iHei
13e30 67 68 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ght, pPage->pgno
13e40 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
13e50 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
13e60 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e   iRowid, pPage->
13e70 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75  buf.p, pPage->bu
13e80 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  f.n);.      fts5
13e90 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
13ea0 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 66  e->buf);.      f
13eb0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
13ec0 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20 20 20  Page->term);.   
13ed0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
13ee0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
13ef0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70  , &pPage->buf, p
13f00 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a  Page[-1].pgno);.
13f10 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
13f20 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o++;.    }else{.
13f30 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d        int nPre =
13f40 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
13f50 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e  ess(pPage->term.
13f60 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
13f70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
13f80 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
13f90 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
13fa0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
13fb0 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20 20 20 20  f, nPre+2);.    
13fc0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
13fd0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
13fe0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
13ff0 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20 20 20 20  erm-nPre);.     
14000 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
14010 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
14020 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
14030 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b 6e 50 72  -nPre, pTerm+nPr
14040 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  e);.      fts5Bu
14050 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
14060 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54  &pPage->term, nT
14070 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
14080 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14090 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
140a0 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
140b0 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49  eNoTerm(.  Fts5I
140c0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
140d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
140e0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
140f0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
14100 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20  iter *pWriter   
14110 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
14120 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
14130 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
14140 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
14150 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72 6f 77 69  {.    /* No rowi
14160 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  ds on this page.
14170 20 41 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20   Append an 0x00 
14180 62 79 74 65 20 74 6f 20 74 68 65 20 63 75 72 72  byte to the curr
14190 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64 6f 63 6c  ent .    ** docl
141a0 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist-index */.   
141b0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
141c0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
141d0 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
141e0 3e 64 6c 69 64 78 2c 20 30 29 3b 0a 20 20 7d 0a  >dlidx, 0);.  }.
141f0 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74    pWriter->nEmpt
14200 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  y++;.}../*.** Ro
14210 77 69 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a  wid iRowid has j
14220 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ust been appende
14230 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
14240 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73 20 69   leaf page. As i
14250 74 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  t is.** the firs
14260 74 20 6f 6e 20 69 74 73 20 70 61 67 65 2c 20 61  t on its page, a
14270 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79 20 74  ppend an entry t
14280 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  o the current do
14290 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a  clist-index..*/.
142a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
142b0 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
142c0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
142d0 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
142e0 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20  er *pWriter, .  
142f0 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20  i64 iRowid.){.  
14300 69 36 34 20 69 56 61 6c 3b 0a 20 20 69 66 28 20  i64 iVal;.  if( 
14310 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50  pWriter->bDlidxP
14320 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  revValid ){.    
14330 69 56 61 6c 20 3d 20 70 57 72 69 74 65 72 2d 3e  iVal = pWriter->
14340 69 44 6c 69 64 78 50 72 65 76 20 2d 20 69 52 6f  iDlidxPrev - iRo
14350 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
14360 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b    iVal = iRowid;
14370 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
14380 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
14390 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57  rint(&p->rc, &pW
143a0 72 69 74 65 72 2d 3e 64 6c 69 64 78 2c 20 69 56  riter->dlidx, iV
143b0 61 6c 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  al);.  pWriter->
143c0 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 20  bDlidxPrevValid 
143d0 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
143e0 69 44 6c 69 64 78 50 72 65 76 20 3d 20 69 52 6f  iDlidxPrev = iRo
143f0 77 69 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  wid;.}..static v
14400 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75  oid fts5WriteFlu
14410 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78  shLeaf(Fts5Index
14420 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
14430 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
14440 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
14450 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
14460 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
14470 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57  0 };.  Fts5PageW
14480 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
14490 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
144a0 5b 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  [0];.  i64 iRowi
144b0 64 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  d;..  if( pPage-
144c0 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  >term.n==0 ){.  
144d0 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73    /* No term was
144e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
144f0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
14500 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74  sert( 0==fts5Get
14510 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
14520 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66 74 73  p[2]) );.    fts
14530 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72  5WriteBtreeNoTer
14540 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  m(p, pWriter);. 
14550 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
14560 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
14570 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a 20 20  to the db. */.  
14580 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
14590 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
145a0 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74  ter->iIdx, pWrit
145b0 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  er->iSegid, 0, p
145c0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66  Page->pgno);.  f
145d0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
145e0 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62  iRowid, pPage->b
145f0 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66  uf.p, pPage->buf
14600 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .n);..  /* Initi
14610 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70  alize the next p
14620 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
14630 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
14640 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
14650 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e  ferZero(&pPage->
14660 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66  term);.  fts5Buf
14670 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
14680 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
14690 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70  f, 4, zero);.  p
146a0 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20  Page->pgno++;.. 
146b0 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
146c0 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
146d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72  counter */.  pWr
146e0 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74  iter->nLeafWritt
146f0 65 6e 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  en++;.}../*.** A
14700 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d  ppend term pTerm
14710 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65  /nTerm to the se
14720 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
14730 74 65 6e 20 62 79 20 74 68 65 20 77 72 69 74 65  ten by the write
14740 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
14750 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14760 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
14770 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
14780 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
14790 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
147a0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
147b0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
147c0 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
147d0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
147e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
147f0 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
14800 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
14810 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
14820 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
14830 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74  int nTerm, const
14840 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20   u8 *pTerm .){. 
14850 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65   /* Bytes of pre
14880 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  fix compression 
14890 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74  for term */.  Ft
148a0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
148b0 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
148c0 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 61  aWriter[0];..  a
148d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
148e0 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  f.n==0 || pPage-
148f0 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20 69 66  >buf.n>4 );.  if
14900 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d  ( pPage->buf.n==
14910 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f  0 ){.    /* Zero
14920 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
14930 61 6e 64 20 66 69 72 73 74 20 64 6f 63 69 64 20  and first docid 
14940 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74  fields */.    st
14950 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
14960 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30  ro[] = { 0x00, 0
14970 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
14980 7d 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  };.    fts5Buffe
14990 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
149a0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
149b0 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61   4, zero);.    a
149c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 74 65  ssert( pPage->te
149d0 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  rm.n==0 );.  }. 
149e0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
149f0 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28 20 70 50  urn;.  .  if( pP
14a00 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29  age->term.n==0 )
14a10 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  {.    /* Update 
14a20 74 68 65 20 22 66 69 72 73 74 20 74 65 72 6d 22  the "first term"
14a30 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
14a40 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  ge header. */.  
14a50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
14a60 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20  >buf.p[2]==0 && 
14a70 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d  pPage->buf.p[3]=
14a80 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75  =0 );.    fts5Pu
14a90 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
14aa0 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75  .p[2], pPage->bu
14ab0 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66 69  f.n);.    nPrefi
14ac0 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
14ad0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
14ae0 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20  0].pgno!=1 ){.  
14af0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
14b00 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  eeTerm(p, pWrite
14b10 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  r, nTerm, pTerm)
14b20 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
14b30 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
14b40 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  r[0];.    }.  }e
14b50 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78  lse{.    nPrefix
14b60 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
14b70 70 72 65 73 73 28 0a 20 20 20 20 20 20 20 20 70  press(.        p
14b80 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50  Page->term.n, pP
14b90 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65  age->term.p, nTe
14ba0 72 6d 2c 20 70 54 65 72 6d 0a 20 20 20 20 29 3b  rm, pTerm.    );
14bb0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
14bc0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
14bd0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
14be0 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a   nPrefix);.  }..
14bf0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
14c00 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
14c10 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65  of new data, the
14c20 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20  n the term data 
14c30 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74  itself.  ** to t
14c40 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  he page. */.  ft
14c50 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
14c60 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
14c70 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
14c80 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74  - nPrefix);.  ft
14c90 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
14ca0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
14cb0 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
14cc0 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b  nPrefix, &pTerm[
14cd0 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a  nPrefix]);..  /*
14ce0 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
14cf0 50 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20  PageWriter.term 
14d00 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35  field. */.  fts5
14d10 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
14d20 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
14d30 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 0a  nTerm, pTerm);..
14d40 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
14d50 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
14d60 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
14d70 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
14d80 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 1;..  /* If 
14d90 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
14da0 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66   page is full, f
14db0 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e  lush it to disk.
14dc0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
14dd0 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73 7a 20  >buf.n>=p->pgsz 
14de0 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ){.    fts5Write
14df0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
14e00 69 74 65 72 29 3b 0a 20 20 20 20 70 57 72 69 74  iter);.    pWrit
14e10 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
14e20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d  nPage = 1;.  }.}
14e30 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
14e40 20 64 6f 63 69 64 20 74 6f 20 74 68 65 20 77 72   docid to the wr
14e50 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a  iters output. .*
14e60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14e70 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
14e80 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  id(.  Fts5Index 
14e90 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
14ea0 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
14eb0 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20   i64 iRowid.){. 
14ec0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
14ed0 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
14ee0 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a  r->aWriter[0];..
14ef0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
14f00 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
14f10 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
14f20 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
14f30 68 65 20 0a 20 20 2a 2a 20 64 6f 63 69 64 2d 70  he .  ** docid-p
14f40 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
14f50 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20  ge-header. Also 
14f60 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74  append a value t
14f70 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20 2a 2a  o the dlidx.  **
14f80 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65   buffer, in case
14f90 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
14fa0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
14fb0 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
14fc0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
14fd0 67 65 20 29 7b 0a 20 20 20 20 66 74 73 35 50 75  ge ){.    fts5Pu
14fe0 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e  tU16(pPage->buf.
14ff0 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->buf.n)
15000 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 44  ;.    fts5WriteD
15010 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57  lidxAppend(p, pW
15020 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a  riter, iRowid);.
15030 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
15040 74 68 65 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20  the docid. */.  
15050 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
15060 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
15070 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  t || pWriter->bF
15080 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
15090 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
150a0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
150b0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
150c0 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65  f, iRowid);.  }e
150d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
150e0 20 69 52 6f 77 69 64 3c 70 57 72 69 74 65 72 2d   iRowid<pWriter-
150f0 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20  >iPrevRowid );. 
15100 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
15110 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
15120 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70  , &pPage->buf, p
15130 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
15140 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20  id - iRowid);.  
15150 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72  }.  pWriter->iPr
15160 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  evRowid = iRowid
15170 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
15180 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
15190 74 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72  t = 0;.  pWriter
151a0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
151b0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  age = 0;..  if( 
151c0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d  pPage->buf.n>=p-
151d0 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66 74 73  >pgsz ){.    fts
151e0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
151f0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
15200 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
15210 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
15220 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
15230 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
15240 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 0a 20  endPoslistInt(. 
15250 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
15260 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
15270 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
15280 69 56 61 6c 0a 29 7b 0a 20 20 46 74 73 35 50 61  iVal.){.  Fts5Pa
15290 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
152a0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
152b0 74 65 72 5b 30 5d 3b 0a 20 20 66 74 73 35 42 75  ter[0];.  fts5Bu
152c0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
152d0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
152e0 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 69  >buf, iVal);.  i
152f0 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
15300 3d 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  =p->pgsz ){.    
15310 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
15320 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
15330 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
15340 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
15350 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   1;.  }.}..stati
15360 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
15370 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 46  AppendZerobyte(F
15380 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
15390 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
153a0 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66  ter){.  fts5Buff
153b0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
153c0 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
153d0 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 2c  >aWriter[0].buf,
153e0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   0);.}../*.** Wr
153f0 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
15400 20 6f 66 20 70 65 6e 64 69 6e 67 2d 64 6f 63 6c   of pending-docl
15410 69 73 74 20 6f 62 6a 65 63 74 20 70 44 6f 63 6c  ist object pDocl
15420 69 73 74 20 74 6f 20 77 72 69 74 65 72 20 70 57  ist to writer pW
15430 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  riter..**.** If 
15440 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
15450 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
15460 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
15470 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
15480 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
15490 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
154a0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
154b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
154c0 20 66 74 73 35 57 72 69 74 65 50 65 6e 64 69 6e   fts5WritePendin
154d0 67 44 6f 63 6c 69 73 74 28 0a 20 20 46 74 73 35  gDoclist(.  Fts5
154e0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
154f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15500 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
15510 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
15520 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
15530 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
15540 20 74 6f 20 74 68 69 73 20 77 72 69 74 65 72 20   to this writer 
15550 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
15560 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a  PendingDoclist *
15570 70 44 6f 63 6c 69 73 74 20 20 20 20 2f 2a 20 44  pDoclist    /* D
15580 6f 63 6c 69 73 74 20 74 6f 20 77 72 69 74 65 20  oclist to write 
15590 74 6f 20 70 57 72 69 74 65 72 20 2a 2f 0a 29 7b  to pWriter */.){
155a0 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 50 6f  .  Fts5PendingPo
155b0 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69 73 74 3b  slist *pPoslist;
155c0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
155d0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
155e0 65 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20  e doclist */..  
155f0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 65  /* Append the te
15600 72 6d 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74  rm */.  fts5Writ
15610 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 70  eAppendTerm(p, p
15620 57 72 69 74 65 72 2c 20 70 44 6f 63 6c 69 73 74  Writer, pDoclist
15630 2d 3e 6e 54 65 72 6d 2c 20 70 44 6f 63 6c 69 73  ->nTerm, pDoclis
15640 74 2d 3e 70 54 65 72 6d 29 3b 0a 0a 20 20 2f 2a  t->pTerm);..  /*
15650 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69   Append the posi
15660 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 65 61  tion list for ea
15670 63 68 20 72 6f 77 69 64 20 2a 2f 0a 20 20 66 6f  ch rowid */.  fo
15680 72 28 70 50 6f 73 6c 69 73 74 3d 70 44 6f 63 6c  r(pPoslist=pDocl
15690 69 73 74 2d 3e 70 50 6f 73 6c 69 73 74 3b 20 70  ist->pPoslist; p
156a0 50 6f 73 6c 69 73 74 3b 20 70 50 6f 73 6c 69 73  Poslist; pPoslis
156b0 74 3d 70 50 6f 73 6c 69 73 74 2d 3e 70 4e 65 78  t=pPoslist->pNex
156c0 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20  t){.    int i = 
156d0 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  0;..    /* Appen
156e0 64 20 74 68 65 20 72 6f 77 69 64 20 69 74 73 65  d the rowid itse
156f0 6c 66 20 2a 2f 0a 20 20 20 20 66 74 73 35 57 72  lf */.    fts5Wr
15700 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70  iteAppendRowid(p
15710 2c 20 70 57 72 69 74 65 72 2c 20 70 50 6f 73 6c  , pWriter, pPosl
15720 69 73 74 2d 3e 69 52 6f 77 69 64 29 3b 0a 0a 20  ist->iRowid);.. 
15730 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
15740 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 6f 73   size of the pos
15750 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62 79  ition list in by
15760 74 65 73 20 2a 2f 0a 20 20 20 20 66 74 73 35 57  tes */.    fts5W
15770 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
15780 74 49 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2c  tInt(p, pWriter,
15790 20 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2e 6e   pPoslist->buf.n
157a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  );..    /* Copy 
157b0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
157c0 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  t to the output 
157d0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 77  segment */.    w
157e0 68 69 6c 65 28 20 69 3c 70 50 6f 73 6c 69 73 74  hile( i<pPoslist
157f0 2d 3e 62 75 66 2e 6e 29 7b 0a 20 20 20 20 20 20  ->buf.n){.      
15800 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  int iVal;.      
15810 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
15820 28 26 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2e  (&pPoslist->buf.
15830 70 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  p[i], iVal);.   
15840 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
15850 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 70 2c 20  ndPoslistInt(p, 
15860 70 57 72 69 74 65 72 2c 20 69 56 61 6c 29 3b 0a  pWriter, iVal);.
15870 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15880 57 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73  Write the doclis
15890 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  t terminator */.
158a0 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
158b0 64 5a 65 72 6f 62 79 74 65 28 70 2c 20 70 57 72  dZerobyte(p, pWr
158c0 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iter);.}../*.** 
158d0 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63  Flush any data c
158e0 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69  ached by the wri
158f0 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ter object to th
15900 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65  e database. Free
15910 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   any.** allocati
15920 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
15930 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a  ith the writer..
15940 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15950 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a  ts5WriteFinish(.
15960 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
15970 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
15980 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
15990 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
159a0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ect */.  int *pn
159b0 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
159c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
159d0 20 48 65 69 67 68 74 20 6f 66 20 74 68 65 20 62   Height of the b
159e0 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  -tree */.  int *
159f0 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20  pnLeaf          
15a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15a10 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  T: Number of lea
15a20 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65  f pages in b-tre
15a30 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
15a40 0a 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 57 72  .  *pnLeaf = pWr
15a50 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
15a60 2e 70 67 6e 6f 3b 0a 20 20 66 74 73 35 57 72 69  .pgno;.  fts5Wri
15a70 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
15a80 57 72 69 74 65 72 29 3b 0a 20 20 69 66 28 20 70  Writer);.  if( p
15a90 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3d  Writer->nWriter=
15aa0 3d 31 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e  =1 && pWriter->n
15ab0 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f  Empty>=FTS5_MIN_
15ac0 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20  DLIDX_SIZE ){.  
15ad0 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
15ae0 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29  Grow(p, pWriter)
15af0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 72 69  ;.  }.  if( pWri
15b00 74 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31 20 29  ter->nWriter>1 )
15b10 7b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42  {.    fts5WriteB
15b20 74 72 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57  treeNEmpty(p, pW
15b30 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 2a 70  riter);.  }.  *p
15b40 6e 48 65 69 67 68 74 20 3d 20 70 57 72 69 74 65  nHeight = pWrite
15b50 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a 20 20 66  r->nWriter;..  f
15b60 6f 72 28 69 3d 31 3b 20 69 3c 70 57 72 69 74 65  or(i=1; i<pWrite
15b70 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29  r->nWriter; i++)
15b80 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
15b90 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72  iter *pPg = &pWr
15ba0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d  iter->aWriter[i]
15bb0 3b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 20 3d  ;.    i64 iRow =
15bc0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
15bd0 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64  WID(pWriter->iId
15be0 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
15bf0 69 64 2c 20 69 2c 20 70 50 67 2d 3e 70 67 6e 6f  id, i, pPg->pgno
15c00 29 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 57  );.    fts5DataW
15c10 72 69 74 65 28 70 2c 20 69 52 6f 77 2c 20 70 50  rite(p, iRow, pP
15c20 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62  g->buf.p, pPg->b
15c30 75 66 2e 6e 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  uf.n);.  }.  for
15c40 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d  (i=0; i<pWriter-
15c50 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a  >nWriter; i++){.
15c60 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
15c70 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74  er *pPg = &pWrit
15c80 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a  er->aWriter[i];.
15c90 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
15ca0 65 65 28 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a  ee(&pPg->term);.
15cb0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
15cc0 65 65 28 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20  ee(&pPg->buf);. 
15cd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
15ce0 65 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74  e(pWriter->aWrit
15cf0 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  er);.  sqlite3Ft
15d00 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
15d10 72 69 74 65 72 2d 3e 64 6c 69 64 78 29 3b 0a 7d  riter->dlidx);.}
15d20 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
15d30 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46  s5WriteInit(.  F
15d40 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
15d50 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
15d60 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69  Writer, .  int i
15d70 49 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64 0a  Idx, int iSegid.
15d80 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69  ){.  memset(pWri
15d90 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
15da0 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
15db0 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20    pWriter->iIdx 
15dc0 3d 20 69 49 64 78 3b 0a 20 20 70 57 72 69 74 65  = iIdx;.  pWrite
15dd0 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  r->iSegid = iSeg
15de0 69 64 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e  id;..  pWriter->
15df0 61 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 50  aWriter = (Fts5P
15e00 61 67 65 57 72 69 74 65 72 2a 29 66 74 73 35 49  ageWriter*)fts5I
15e10 64 78 4d 61 6c 6c 6f 63 28 70 2c 73 69 7a 65 6f  dxMalloc(p,sizeo
15e20 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72  f(Fts5PageWriter
15e30 29 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65  ));.  if( pWrite
15e40 72 2d 3e 61 57 72 69 74 65 72 3d 3d 30 20 29 20  r->aWriter==0 ) 
15e50 72 65 74 75 72 6e 3b 0a 20 20 70 57 72 69 74 65  return;.  pWrite
15e60 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20 31 3b 0a  r->nWriter = 1;.
15e70 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74    pWriter->aWrit
15e80 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 31 3b 0a  er[0].pgno = 1;.
15e90 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
15ea0 74 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41  ts5WriteInitForA
15eb0 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64  ppend(.  Fts5Ind
15ec0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
15ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
15ee0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
15ef0 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
15f00 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
15f10 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 74       /* Writer t
15f20 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a  o initialize */.
15f30 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
15f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f50 20 20 2f 2a 20 49 6e 64 65 78 20 73 65 67 6d 65    /* Index segme
15f60 6e 74 20 69 73 20 61 20 70 61 72 74 20 6f 66 20  nt is a part of 
15f70 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
15f80 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
15f90 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
15fa0 6f 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e 64  object to append
15fb0 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   to */.){.  int 
15fc0 6e 42 79 74 65 20 3d 20 70 53 65 67 2d 3e 6e 48  nByte = pSeg->nH
15fd0 65 69 67 68 74 20 2a 20 73 69 7a 65 6f 66 28 46  eight * sizeof(F
15fe0 74 73 35 50 61 67 65 57 72 69 74 65 72 29 3b 0a  ts5PageWriter);.
15ff0 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72    memset(pWriter
16000 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
16010 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70  SegWriter));.  p
16020 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69  Writer->iIdx = i
16030 49 64 78 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  Idx;.  pWriter->
16040 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
16050 53 65 67 69 64 3b 0a 20 20 70 57 72 69 74 65 72  Segid;.  pWriter
16060 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74 73  ->aWriter = (Fts
16070 35 50 61 67 65 57 72 69 74 65 72 2a 29 66 74 73  5PageWriter*)fts
16080 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42  5IdxMalloc(p, nB
16090 79 74 65 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  yte);.  pWriter-
160a0 3e 6e 57 72 69 74 65 72 20 3d 20 70 53 65 67 2d  >nWriter = pSeg-
160b0 3e 6e 48 65 69 67 68 74 3b 0a 0a 20 20 69 66 28  >nHeight;..  if(
160c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
160d0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 67 6e  K ){.    int pgn
160e0 6f 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69  o = 1;.    int i
160f0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61  ;.    pWriter->a
16100 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d  Writer[0].pgno =
16110 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b   pSeg->pgnoLast+
16120 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 65  1;.    for(i=pSe
16130 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 69 3e  g->nHeight-1; i>
16140 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  0; i--){.      i
16150 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
16160 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
16170 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
16180 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
16190 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 46  , pgno);.      F
161a0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
161b0 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  Pg = &pWriter->a
161c0 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20  Writer[i];.     
161d0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
161e0 6f 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  o;.      fts5Dat
161f0 61 42 75 66 66 65 72 28 70 2c 20 26 70 50 67 2d  aBuffer(p, &pPg-
16200 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  >buf, iRowid);. 
16210 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
16220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16230 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65       Fts5NodeIte
16240 72 20 73 73 3b 0a 20 20 20 20 20 20 20 20 66 74  r ss;.        ft
16250 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
16260 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e  Pg->buf.p, pPg->
16270 62 75 66 2e 6e 2c 20 26 73 73 29 3b 0a 20 20 20  buf.n, &ss);.   
16280 20 20 20 20 20 77 68 69 6c 65 28 20 73 73 2e 61       while( ss.a
16290 44 61 74 61 20 29 20 66 74 73 35 4e 6f 64 65 49  Data ) fts5NodeI
162a0 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20  terNext(&p->rc, 
162b0 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &ss);.        ft
162c0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
162d0 72 63 2c 20 26 70 50 67 2d 3e 74 65 72 6d 2c 20  rc, &pPg->term, 
162e0 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65  ss.term.n, ss.te
162f0 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 70  rm.p);.        p
16300 67 6e 6f 20 3d 20 73 73 2e 69 43 68 69 6c 64 3b  gno = ss.iChild;
16310 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64  .        fts5Nod
16320 65 49 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a  eIterFree(&ss);.
16330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16340 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 48 65 69    if( pSeg->nHei
16350 67 68 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ght==1 ){.      
16360 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
16370 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
16380 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  -1;.    }.    as
16390 73 65 72 74 28 20 28 70 67 6e 6f 2b 70 57 72 69  sert( (pgno+pWri
163a0 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d 70 53  ter->nEmpty)==pS
163b0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a  eg->pgnoLast );.
163c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    }.}../*.** Ite
163d0 72 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20  rator pIter was 
163e0 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
163f0 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75  through the inpu
16400 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e  t segments of on
16410 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   an.** increment
16420 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69  al merge operati
16430 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
16440 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74  n is called if t
16450 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a  he incremental.*
16460 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73  * merge step has
16470 20 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68   finished but th
16480 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20  e input has not 
16490 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20  been completely 
164a0 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74  exhausted..*/.st
164b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72  atic void fts5Tr
164c0 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49  imSegments(Fts5I
164d0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c  ndex *p, Fts5Mul
164e0 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
164f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
16500 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20  s5Buffer buf;.  
16510 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
16520 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
16530 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  r));.  for(i=0; 
16540 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
16550 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  ++){.    Fts5Seg
16560 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
16570 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
16580 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67    if( pSeg->pSeg
16590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
165a0 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c  no-op */.    }el
165b0 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65  se if( pSeg->pLe
165c0 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  af==0 ){.      p
165d0 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c  Seg->pSeg->pgnoL
165e0 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ast = 0;.      p
165f0 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46  Seg->pSeg->pgnoF
16600 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  irst = 0;.    }e
16610 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
16620 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  Off = pSeg->iTer
16630 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20  mLeafOffset;    
16640 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65   /* Offset on ne
16650 77 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67  w first leaf pag
16660 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
16670 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20  LeafRowid;.     
16680 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
16690 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 20  ;.      int iId 
166a0 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53  = pSeg->pSeg->iS
166b0 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61  egid;.      u8 a
166c0 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20  Hdr[4] = {0x00, 
166d0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 34  0x00, 0x00, 0x04
166e0 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52  };..      iLeafR
166f0 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
16700 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
16710 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 70 53  iIdx, iId, 0, pS
16720 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  eg->iTermLeafPgn
16730 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  o);.      pData 
16740 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
16750 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  , iLeafRowid);. 
16760 20 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29       if( pData )
16770 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
16780 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a  fferZero(&buf);.
16790 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
167a0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
167b0 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f  >rc, &buf, sizeo
167c0 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a  f(aHdr), aHdr);.
167d0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
167e0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
167f0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
16800 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  g->term.n);.    
16810 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
16820 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
16830 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
16840 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  m.n, pSeg->term.
16850 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
16860 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
16870 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
16880 44 61 74 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20  Data->n - iOff, 
16890 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29  &pData->p[iOff])
168a0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
168b0 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
168c0 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e  ;.        pSeg->
168d0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
168e0 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  = pSeg->iTermLea
168f0 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66  fPgno;.        f
16900 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c  ts5DataDelete(p,
16910 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
16920 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c 20  WID(pSeg->iIdx, 
16930 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65 61 66  iId, 0, 1),iLeaf
16940 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
16950 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
16960 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75 66   iLeafRowid, buf
16970 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20  .p, buf.n);.    
16980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
16990 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
169a0 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  buf);.}../*.**.*
169b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
169c0 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
169d0 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  l(.  Fts5Index *
169e0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
169f0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
16a00 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
16a10 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72   /* Index to wor
16a40 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74  k on */.  Fts5St
16a50 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
16a60 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 75  ,         /* Stu
16a70 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 69  cture of index i
16a80 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76  Idx */.  int iLv
16a90 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
16ab0 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
16ac0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
16ad0 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  nRem            
16ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
16af0 74 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61  te up to this ma
16b00 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73  ny output leaves
16b10 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72   */.){.  Fts5Str
16b20 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
16b30 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
16b40 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74  evel[iLvl];.  Ft
16b50 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
16b60 20 2a 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74   *pLvlOut = &pSt
16b70 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
16b80 6c 2b 31 5d 3b 0a 20 20 46 74 73 35 4d 75 6c 74  l+1];.  Fts5Mult
16b90 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  iSegIter *pIter 
16ba0 3d 20 30 3b 20 20 20 20 2f 2a 20 49 74 65 72 61  = 0;    /* Itera
16bb0 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75  tor to read inpu
16bc0 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  t data */.  int 
16bd0 6e 52 65 6d 20 3d 20 2a 70 6e 52 65 6d 3b 20 20  nRem = *pnRem;  
16be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16bf0 75 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73  utput leaf pages
16c00 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a   left to write *
16c10 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20  /.  int nInput; 
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16c40 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
16c50 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
16c60 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20  er writer;      
16c70 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
16c80 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
16c90 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
16ca0 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75  *pSeg;     /* Ou
16cb0 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  tput segment */.
16cc0 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
16cd0 6d 3b 0a 20 20 69 6e 74 20 62 52 65 71 75 69 72  m;.  int bRequir
16ce0 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 30  eDoclistTerm = 0
16cf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
16d00 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
16d10 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
16d20 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
16d30 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65  l->nSeg );..  me
16d40 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
16d50 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
16d60 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  riter));.  memse
16d70 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65  t(&term, 0, size
16d80 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
16d90 0a 20 20 77 72 69 74 65 72 2e 69 49 64 78 20 3d  .  writer.iIdx =
16da0 20 69 49 64 78 3b 0a 20 20 69 66 28 20 70 4c 76   iIdx;.  if( pLv
16db0 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
16dc0 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74   assert( pLvlOut
16dd0 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20  ->nSeg>0 );.    
16de0 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
16df0 4d 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35 57  Merge;.    fts5W
16e00 72 69 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e  riteInitForAppen
16e10 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 49  d(p, &writer, iI
16e20 64 78 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  dx, &pLvlOut->aS
16e30 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
16e40 2d 31 5d 29 3b 0a 20 20 20 20 70 53 65 67 20 3d  -1]);.    pSeg =
16e50 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
16e60 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d  pLvlOut->nSeg-1]
16e70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16e80 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74 73 35  nt iSegid = fts5
16e90 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c  AllocateSegid(p,
16ea0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 66   pStruct);.    f
16eb0 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
16ec0 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c 20 69  &writer, iIdx, i
16ed0 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  Segid);..    /* 
16ee0 41 64 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d  Add the new segm
16ef0 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ent to the outpu
16f00 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  t level */.    i
16f10 66 28 20 69 4c 76 6c 2b 31 3d 3d 70 53 74 72 75  f( iLvl+1==pStru
16f20 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 20 70 53 74  ct->nLevel ) pSt
16f30 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a  ruct->nLevel++;.
16f40 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
16f50 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
16f60 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c  t->nSeg];.    pL
16f70 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20  vlOut->nSeg++;. 
16f80 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
16f90 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67  st = 1;.    pSeg
16fa0 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
16fb0 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  d;..    /* Read 
16fc0 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73  input from all s
16fd0 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  egments in the i
16fe0 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  nput level */.  
16ff0 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d    nInput = pLvl-
17000 3e 6e 53 65 67 3b 0a 20 20 7d 0a 23 69 66 20 30  >nSeg;.  }.#if 0
17010 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  .fprintf(stdout,
17020 20 22 6d 65 72 67 69 6e 67 20 25 64 20 73 65 67   "merging %d seg
17030 6d 65 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65 6c  ments from level
17040 20 25 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20 69   %d!", nInput, i
17050 4c 76 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74 64  Lvl);.fflush(std
17060 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  out);.#endif..  
17070 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
17080 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
17090 20 69 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20   iIdx, 0, 0, 0, 
170a0 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70  iLvl, nInput, &p
170b0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
170c0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
170d0 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
170e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
170f0 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
17100 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73   0).  ){.    Fts
17110 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
17120 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
17130 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20  Iter->aFirst[1] 
17140 5d 3b 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b  ];.    Fts5Chunk
17150 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20  Iter sPos;      
17160 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
17170 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
17180 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
17190 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  .    int nTerm;.
171a0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54      const u8 *pT
171b0 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  erm = fts5MultiI
171c0 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
171d0 6e 54 65 72 6d 29 3b 0a 0a 20 20 20 20 69 66 28  nTerm);..    if(
171e0 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c   nTerm!=term.n |
171f0 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20  | memcmp(pTerm, 
17200 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29  term.p, nTerm) )
17210 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  {.      if( writ
17220 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e  er.nLeafWritten>
17230 6e 52 65 6d 20 29 20 62 72 65 61 6b 3b 0a 0a 20  nRem ) break;.. 
17240 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
17250 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
17260 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
17270 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
17280 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52   */.      if( bR
17290 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72  equireDoclistTer
172a0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  m ){.        fts
172b0 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f  5WriteAppendZero
172c0 62 79 74 65 28 70 2c 20 26 77 72 69 74 65 72 29  byte(p, &writer)
172d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
172e0 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
172f0 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20  erm(p, &writer, 
17300 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
17310 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
17320 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d  et(&p->rc, &term
17330 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
17340 0a 20 20 20 20 20 20 62 52 65 71 75 69 72 65 44  .      bRequireD
17350 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 31 3b 0a  oclistTerm = 1;.
17360 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70      }..    /* Ap
17370 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74  pend the rowid t
17380 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
17390 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
173a0 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69  endRowid(p, &wri
173b0 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74  ter, fts5MultiIt
173c0 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b  erRowid(pIter));
173d0 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
173e0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
173f0 66 72 6f 6d 20 69 6e 70 75 74 20 74 6f 20 6f 75  from input to ou
17400 74 70 75 74 20 2a 2f 0a 20 20 20 20 66 74 73 35  tput */.    fts5
17410 43 68 75 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c  ChunkIterInit(p,
17420 20 70 53 65 67 2c 20 26 73 50 6f 73 29 3b 0a 20   pSeg, &sPos);. 
17430 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
17440 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 70 2c 20  ndPoslistInt(p, 
17450 26 77 72 69 74 65 72 2c 20 73 50 6f 73 2e 6e 52  &writer, sPos.nR
17460 65 6d 29 3b 0a 20 20 20 20 66 6f 72 28 2f 2a 20  em);.    for(/* 
17470 6e 6f 6f 70 20 2a 2f 3b 20 66 74 73 35 43 68 75  noop */; fts5Chu
17480 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50  nkIterEof(p, &sP
17490 6f 73 29 3d 3d 30 3b 20 66 74 73 35 43 68 75 6e  os)==0; fts5Chun
174a0 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26 73 50  kIterNext(p, &sP
174b0 6f 73 29 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  os)){.      int 
174c0 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  iOff = 0;.      
174d0 77 68 69 6c 65 28 20 69 4f 66 66 3c 73 50 6f 73  while( iOff<sPos
174e0 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  .n ){.        in
174f0 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  t iVal;.        
17500 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
17510 74 33 32 28 26 73 50 6f 73 2e 70 5b 69 4f 66 66  t32(&sPos.p[iOff
17520 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  ], iVal);.      
17530 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
17540 64 50 6f 73 6c 69 73 74 49 6e 74 28 70 2c 20 26  dPoslistInt(p, &
17550 77 72 69 74 65 72 2c 20 69 56 61 6c 29 3b 0a 20  writer, iVal);. 
17560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17570 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
17580 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
17590 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65  to disk. Set the
175a0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
175b0 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20  b-tree height.  
175c0 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66  ** and last leaf
175d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20   page number at 
175e0 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
175f0 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69  */.  fts5WriteFi
17600 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
17610 20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c   &pSeg->nHeight,
17620 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74   &pSeg->pgnoLast
17630 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75  );..  if( fts5Mu
17640 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
17650 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ter) ){.    int 
17660 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  i;..    /* Remov
17670 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
17680 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
17690 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  e %_data table *
176a0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
176b0 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20  <nInput; i++){. 
176c0 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d       fts5DataRem
176d0 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 49  oveSegment(p, iI
176e0 64 78 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  dx, pLvl->aSeg[i
176f0 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d  ].iSegid);.    }
17700 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
17710 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65  the redundant se
17720 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
17730 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  input level */. 
17740 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65     if( pLvl->nSe
17750 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20  g!=nInput ){.   
17760 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28     int nMove = (
17770 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e  pLvl->nSeg - nIn
17780 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  put) * sizeof(Ft
17790 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
177a0 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f  nt);.      memmo
177b0 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26  ve(pLvl->aSeg, &
177c0 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75  pLvl->aSeg[nInpu
177d0 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  t], nMove);.    
177e0 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67  }.    pLvl->nSeg
177f0 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20   -= nInput;.    
17800 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30  pLvl->nMerge = 0
17810 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
17820 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
17830 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70  p, pIter);.    p
17840 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49  Lvl->nMerge = nI
17850 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  nput;.  }..  fts
17860 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
17870 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  , pIter);.  fts5
17880 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
17890 29 3b 0a 20 20 2a 70 6e 52 65 6d 20 2d 3d 20 77  );.  *pnRem -= w
178a0 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74  riter.nLeafWritt
178b0 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74  en;.}../*.** A t
178c0 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65  otal of nLeaf le
178d0 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61  af pages of data
178e0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66   has just been f
178f0 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65  lushed to a leve
17900 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20  l-0.** segments 
17910 69 6e 20 69 6e 64 65 78 20 69 49 64 78 20 77 69  in index iIdx wi
17920 74 68 20 73 74 72 75 63 74 75 72 65 20 70 53 74  th structure pSt
17930 72 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ruct. This funct
17940 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 0a  ion updates the.
17950 2a 2a 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  ** write-counter
17960 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64   accordingly and
17970 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
17980 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65  performs increme
17990 6e 74 61 6c 20 6d 65 72 67 65 0a 2a 2a 20 77 6f  ntal merge.** wo
179a0 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rk..**.** If an 
179b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
179c0 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
179d0 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
179e0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
179f0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
17a00 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
17a10 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
17a20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17a30 73 35 49 6e 64 65 78 57 6f 72 6b 28 0a 20 20 46  s5IndexWork(.  F
17a40 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17a60 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
17a70 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
17a80 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
17a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17aa0 64 65 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a  dex to work on *
17ab0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
17ac0 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20  e *pStruct,     
17ad0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
17ae0 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
17af0 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  x */.  int nLeaf
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17b20 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65   of output leave
17b30 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  s just written *
17b40 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 57 72 69 74  /.){.  i64 nWrit
17b50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
17b60 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
17b70 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65  l value of write
17b80 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e  -counter */.  in
17b90 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20  t nWork;        
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17bb0 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d   Number of work-
17bc0 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72  quanta to perfor
17bd0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 3b  m */.  int nRem;
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17c00 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c   of leaf pages l
17c10 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
17c20 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
17c30 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20   write-counter. 
17c40 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20  While doing so, 
17c50 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20  set nWork. */.  
17c60 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75 63 74  nWrite = pStruct
17c70 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  ->nWriteCounter;
17c80 0a 20 20 6e 57 6f 72 6b 20 3d 20 28 28 6e 57 72  .  nWork = ((nWr
17c90 69 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70  ite + nLeaf) / p
17ca0 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28  ->nWorkUnit) - (
17cb0 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72  nWrite / p->nWor
17cc0 6b 55 6e 69 74 29 3b 0a 20 20 70 53 74 72 75 63  kUnit);.  pStruc
17cd0 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
17ce0 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 6e 52 65   += nLeaf;.  nRe
17cf0 6d 20 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  m = p->nWorkUnit
17d00 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75   * nWork * pStru
17d10 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20 20 77  ct->nLevel;..  w
17d20 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
17d30 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68  /* To iterate th
17d60 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
17d70 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c      int iBestLvl
17d80 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
17d90 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e  /* Level offerin
17da0 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74  g the most input
17db0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
17dc0 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20   int nBest = 0; 
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17de0 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
17df0 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74  segments on best
17e00 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f   level */..    /
17e10 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74  * Set iBestLvl t
17e20 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72  o the level to r
17e30 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ead input segmen
17e40 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20  ts from. */.    
17e50 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
17e60 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
17e70 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
17e80 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
17e90 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
17ea0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
17eb0 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  l];.      if( pL
17ec0 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20  vl->nMerge ){.  
17ed0 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
17ee0 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a  nMerge>nBest ){.
17ef0 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74 4c            iBestL
17f00 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  vl = iLvl;.     
17f10 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76       nBest = pLv
17f20 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20  l->nMerge;.     
17f30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
17f40 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17f50 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
17f60 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nBest ){.      
17f70 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
17f80 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42  nSeg;.        iB
17f90 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20  estLvl = iLvl;. 
17fa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17fb0 20 61 73 73 65 72 74 28 20 69 42 65 73 74 4c 76   assert( iBestLv
17fc0 6c 3e 3d 30 20 26 26 20 6e 42 65 73 74 3e 30 20  l>=0 && nBest>0 
17fd0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73  );..    if( nBes
17fe0 74 3c 70 2d 3e 6e 4d 69 6e 4d 65 72 67 65 20 26  t<p->nMinMerge &
17ff0 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
18000 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
18010 67 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ge==0 ) break;. 
18020 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
18030 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78 2c 20  eLevel(p, iIdx, 
18040 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c 76  pStruct, iBestLv
18050 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 61  l, &nRem);.    a
18060 73 73 65 72 74 28 20 6e 52 65 6d 3d 3d 30 20 7c  ssert( nRem==0 |
18070 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
18080 4f 4b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  OK );.  }.}../*.
18090 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e  ** Flush the con
180a0 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f  tents of in-memo
180b0 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69 48  ry hash table iH
180c0 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76  ash to a new lev
180d0 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  el-0 .** segment
180e0 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75   on disk. Also u
180f0 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65 73  pdate the corres
18100 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72  ponding structur
18110 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  e record..**.** 
18120 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
18130 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
18140 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
18150 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
18160 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
18170 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
18180 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
18190 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
181a0 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65  oid fts5FlushOne
181b0 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a  Hash(Fts5Index *
181c0 70 2c 20 69 6e 74 20 69 48 61 73 68 2c 20 69 6e  p, int iHash, in
181d0 74 20 2a 70 6e 4c 65 61 66 29 7b 0a 20 20 46 74  t *pnLeaf){.  Ft
181e0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
181f0 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67  ruct;.  int iSeg
18200 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61  id;.  int pgnoLa
18210 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
18220 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
18230 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
18240 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a   in segment */..
18250 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65    /* Obtain a re
18260 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
18270 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61  ndex structure a
18280 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
18290 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a  w segment-id.  *
182a0 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65  * for the new le
182b0 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20  vel-0 segment.  
182c0 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  */.  pStruct = f
182d0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
182e0 28 70 2c 20 69 48 61 73 68 29 3b 0a 20 20 69 53  (p, iHash);.  iS
182f0 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
18300 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
18310 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  uct);..  if( iSe
18320 67 69 64 20 29 7b 0a 20 20 20 20 46 74 73 35 53  gid ){.    Fts5S
18330 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
18340 0a 20 20 20 20 46 74 73 35 50 65 6e 64 69 6e 67  .    Fts5Pending
18350 44 6f 63 6c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  Doclist *pList;.
18360 20 20 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44      Fts5PendingD
18370 6f 63 6c 69 73 74 20 2a 70 49 74 65 72 3b 0a 20  oclist *pIter;. 
18380 20 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f     Fts5PendingDo
18390 63 6c 69 73 74 20 2a 70 4e 65 78 74 3b 0a 0a 20  clist *pNext;.. 
183a0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
183b0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
183c0 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20   /* New segment 
183d0 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a  within pStruct *
183e0 2f 0a 20 20 20 20 69 6e 74 20 6e 48 65 69 67 68  /.    int nHeigh
183f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18400 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66      /* Height of
18410 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 62 2d 74   new segment b-t
18420 72 65 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 69 73  ree */..    pLis
18430 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4c  t = fts5PendingL
18440 69 73 74 28 70 2c 20 69 48 61 73 68 29 3b 0a 20  ist(p, iHash);. 
18450 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
18460 21 3d 30 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51  !=0 || p->rc!=SQ
18470 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 66  LITE_OK );.    f
18480 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
18490 26 77 72 69 74 65 72 2c 20 69 48 61 73 68 2c 20  &writer, iHash, 
184a0 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 66 6f  iSegid);..    fo
184b0 72 28 70 49 74 65 72 3d 70 4c 69 73 74 3b 20 70  r(pIter=pList; p
184c0 49 74 65 72 3b 20 70 49 74 65 72 3d 70 4e 65 78  Iter; pIter=pNex
184d0 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
184e0 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 3b 0a  = pIter->pNext;.
184f0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 50        fts5WriteP
18500 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 28 70 2c  endingDoclist(p,
18510 20 26 77 72 69 74 65 72 2c 20 70 49 74 65 72 29   &writer, pIter)
18520 3b 0a 20 20 20 20 20 20 66 74 73 35 46 72 65 65  ;.      fts5Free
18530 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 28 70  PendingDoclist(p
18540 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
18550 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
18560 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 6e 48  (p, &writer, &nH
18570 65 69 67 68 74 2c 20 26 70 67 6e 6f 4c 61 73 74  eight, &pgnoLast
18580 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 64 69 74 20  );..    /* Edit 
18590 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  the Fts5Structur
185a0 65 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  e and write it b
185b0 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
185c0 61 73 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ase. */.    if( 
185d0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d  pStruct->nLevel=
185e0 3d 30 20 29 20 70 53 74 72 75 63 74 2d 3e 6e 4c  =0 ) pStruct->nL
185f0 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 70 53  evel = 1;.    pS
18600 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
18610 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70  Level[0].aSeg[ p
18620 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
18630 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20  ].nSeg++ ];.    
18640 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
18650 53 65 67 69 64 3b 0a 20 20 20 20 70 53 65 67 2d  Segid;.    pSeg-
18660 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67  >nHeight = nHeig
18670 68 74 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67  ht;.    pSeg->pg
18680 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
18690 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
186a0 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 0a  = pgnoLast;.  }.
186b0 0a 20 20 66 74 73 35 49 6e 64 65 78 57 6f 72 6b  .  fts5IndexWork
186c0 28 70 2c 20 69 48 61 73 68 2c 20 70 53 74 72 75  (p, iHash, pStru
186d0 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  ct, pgnoLast);. 
186e0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
186f0 69 74 65 28 70 2c 20 69 48 61 73 68 2c 20 70 53  ite(p, iHash, pS
18700 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74  truct);.  fts5St
18710 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
18720 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Struct);.}../*.*
18730 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
18740 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63  all subsequent c
18750 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46  alls to sqlite3F
18760 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20  ts5IndexWrite() 
18770 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68  pertain.** to th
18780 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
18790 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f  rowid iRowid..*/
187a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
187b0 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65  5IndexBeginWrite
187c0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
187d0 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 69 66  64 iRowid){.  if
187e0 28 20 69 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72  ( iRowid<=p->iWr
187f0 69 74 65 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  iteRowid ){.    
18800 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
18810 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20  Flush(p);.  }.  
18820 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
18830 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a   iRowid;.}../*.*
18840 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61  * Flush any data
18850 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
18860 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
18870 62 6c 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  bles to the data
18880 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
18890 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 46 6c  lite3Fts5IndexFl
188a0 75 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ush(Fts5Index *p
188b0 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
188c0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
188d0 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b 20  onfig;.  int i; 
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
18900 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
18910 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ugh indexes */. 
18920 20 69 6e 74 20 6e 4c 65 61 66 20 3d 20 30 3b 20   int nLeaf = 0; 
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
18950 61 76 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  aves written */.
18960 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
18970 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
18980 63 75 72 65 64 20 74 68 69 73 20 63 61 6c 6c 20  cured this call 
18990 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
189a0 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
189b0 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 6e 50 65 6e  TE_OK || p->nPen
189c0 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 20 72 65  dingData==0 ) re
189d0 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
189e0 70 2d 3e 61 48 61 73 68 20 29 3b 0a 0a 20 20 2f  p->aHash );..  /
189f0 2a 20 46 6c 75 73 68 20 74 68 65 20 74 65 72 6d  * Flush the term
18a00 73 20 61 6e 64 20 65 61 63 68 20 70 72 65 66 69  s and each prefi
18a10 78 20 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 20  x index to disk 
18a20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
18a30 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  =pConfig->nPrefi
18a40 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73  x; i++){.    fts
18a50 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 2c  5FlushOneHash(p,
18a60 20 69 2c 20 26 6e 4c 65 61 66 29 3b 0a 20 20 7d   i, &nLeaf);.  }
18a70 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  .  p->nPendingDa
18a80 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta = 0;.}../*.**
18a90 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20   Commit data to 
18aa0 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
18ab0 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e  ite3Fts5IndexSyn
18ac0 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  c(Fts5Index *p){
18ad0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  .  sqlite3Fts5In
18ae0 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 66  dexFlush(p);.  f
18af0 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
18b00 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  );.  return p->r
18b10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  c;.}../*.** Disc
18b20 61 72 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ard any data sto
18b30 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
18b40 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
18b50 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69  . Do not write i
18b60 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  t.** to the data
18b70 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
18b80 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ly, assume that 
18b90 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
18ba0 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61  the %_data.** ta
18bb0 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68 61  ble may have cha
18bc0 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  nged on disk. So
18bd0 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   any in-memory c
18be0 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20  aches of %_data 
18bf0 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74  .** records must
18c00 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e   be invalidated.
18c10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
18c20 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b  ts5IndexRollback
18c30 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
18c40 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
18c50 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  r(p);.  return S
18c60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18c70 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74  ** Open a new Ft
18c80 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
18c90 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20 61  If the bCreate a
18ca0 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
18cb0 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69   create.** and i
18cc0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e  nitialize the un
18cd0 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20  derlying %_data 
18ce0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
18cf0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
18d00 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  *pp to point to 
18d10 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  the new object a
18d20 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
18d30 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  _OK..** Otherwis
18d40 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  e, set *pp to NU
18d50 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  LL and return an
18d60 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
18d70 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
18d80 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
18d90 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
18da0 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62  Config, .  int b
18db0 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49  Create, .  Fts5I
18dc0 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61  ndex **pp,.  cha
18dd0 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69  r **pzErr.){.  i
18de0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18df0 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  K;.  Fts5Index *
18e00 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
18e10 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
18e20 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70  ct */..  *pp = p
18e30 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73   = (Fts5Index*)s
18e40 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
18e50 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29  zeof(Fts5Index))
18e60 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
18e70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
18e80 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ;..  memset(p, 0
18e90 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  , sizeof(Fts5Ind
18ea0 65 78 29 29 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66  ex));.  p->pConf
18eb0 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20  ig = pConfig;.  
18ec0 70 2d 3e 70 67 73 7a 20 3d 20 31 30 30 30 3b 0a  p->pgsz = 1000;.
18ed0 20 20 70 2d 3e 6e 4d 69 6e 4d 65 72 67 65 20 3d    p->nMinMerge =
18ee0 20 46 54 53 35 5f 4d 49 4e 5f 4d 45 52 47 45 3b   FTS5_MIN_MERGE;
18ef0 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20  .  p->nWorkUnit 
18f00 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  = FTS5_WORK_UNIT
18f10 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69  ;.  p->nMaxPendi
18f20 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31 30  ngData = 1024*10
18f30 32 34 3b 0a 20 20 70 2d 3e 7a 44 61 74 61 54 62  24;.  p->zDataTb
18f40 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
18f50 6e 74 66 28 22 25 73 5f 64 61 74 61 22 2c 20 70  ntf("%s_data", p
18f60 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a  Config->zName);.
18f70 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62    if( p->zDataTb
18f80 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
18f90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18fa0 20 7d 65 6c 73 65 20 69 66 28 20 62 43 72 65 61   }else if( bCrea
18fb0 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  te ){.    int i;
18fc0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
18fd0 72 65 20 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  re s;.    rc = s
18fe0 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
18ff0 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 70  Table(.        p
19000 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20  Config, "data", 
19010 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  "id INTEGER PRIM
19020 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
19030 4c 4f 42 22 2c 20 70 7a 45 72 72 0a 20 20 20 20  LOB", pzErr.    
19040 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19060 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20    memset(&s, 0, 
19070 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
19080 74 75 72 65 29 29 3b 0a 20 20 20 20 20 20 66 6f  ture));.      fo
19090 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
190a0 2d 3e 6e 50 72 65 66 69 78 2b 31 3b 20 69 2b 2b  ->nPrefix+1; i++
190b0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
190c0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
190d0 20 69 2c 20 26 73 29 3b 0a 20 20 20 20 20 20 7d   i, &s);.      }
190e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 72  .      rc = p->r
190f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  c;.    }.    sql
19100 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
19110 41 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f 6e  Averages(p, (con
19120 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20  st u8*)"", 0);. 
19130 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   }..  if( rc ){.
19140 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
19150 6e 64 65 78 43 6c 6f 73 65 28 70 2c 20 30 29 3b  ndexClose(p, 0);
19160 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
19170 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19180 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
19190 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79  handle opened by
191a0 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
191b0 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
191c0 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  ndexOpen()..*/.i
191d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
191e0 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64  dexClose(Fts5Ind
191f0 65 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 73 74  ex *p, int bDest
19200 72 6f 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  roy){.  int rc =
19210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
19220 28 20 62 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( bDestroy ){.  
19230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
19240 73 35 44 72 6f 70 54 61 62 6c 65 28 70 2d 3e 70  s5DropTable(p->p
19250 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 29 3b  Config, "data");
19260 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
19270 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a  ->pReader==0 );.
19280 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
19290 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  ze(p->pWriter);.
192a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
192b0 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ze(p->pDeleter);
192c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
192d0 70 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  p->aHash);.  sql
192e0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61  ite3_free(p->zDa
192f0 74 61 54 62 6c 29 3b 0a 20 20 73 71 6c 69 74 65  taTbl);.  sqlite
19300 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
19310 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19320 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65   Return a simple
19330 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
19340 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67  based on the arg
19350 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  uments..*/.stati
19360 63 20 75 36 34 20 66 74 73 35 49 6e 64 65 78 45  c u64 fts5IndexE
19370 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34  ntryCksum(.  i64
19380 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20   iRowid, .  int 
19390 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f  iCol, .  int iPo
193a0 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
193b0 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69 6e 74 20   *pTerm, .  int 
193c0 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69  nTerm.){.  int i
193d0 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52  ;.  u64 ret = iR
193e0 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  owid;.  ret += (
193f0 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a  ret<<3) + iCol;.
19400 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
19410 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f 72 28  ) + iPos;.  for(
19420 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
19430 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  +) ret += (ret<<
19440 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20  3) + pTerm[i];. 
19450 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
19460 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65 20  /*.** Calculate 
19470 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
19480 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20 74 68  cksum that is th
19490 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69 6e 64  e XOR of the ind
194a0 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68 65 63  ex entry.** chec
194b0 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72  ksum of all entr
194c0 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ies that would b
194d0 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
194e0 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69 66 69  he token specifi
194f0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 69 6e  ed.** by the fin
19500 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73 2e 0a  al 5 arguments..
19510 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74  */.u64 sqlite3Ft
19520 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a 20 20  s5IndexCksum(.  
19530 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
19540 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  fig,            
19550 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
19560 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34   object */.  i64
19570 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19590 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20 61 70  Document term ap
195a0 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e  pears in */.  in
195b0 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
195d0 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61 70 70   Column term app
195e0 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  ears in */.  int
195f0 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19610 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20 61 70  Position term ap
19620 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 63 6f  pears in */.  co
19630 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
19640 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 2f 2a   int nTerm    /*
19650 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20 2a 2f   Term at iPos */
19660 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20 3d 20  .){.  u64 ret = 
19670 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19680 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
19690 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
196a0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
196b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
196c0 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
196d0 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 0a  ugh indexes */..
196e0 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49    for(iIdx=0; iI
196f0 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
19700 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
19710 20 20 20 69 6e 74 20 6e 20 3d 20 28 28 69 49 64     int n = ((iId
19720 78 3d 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x==pConfig->nPre
19730 66 69 78 29 20 3f 20 6e 54 65 72 6d 20 3a 20 70  fix) ? nTerm : p
19740 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
19750 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20  iIdx]);.    if( 
19760 6e 3c 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  n<=nTerm ){.    
19770 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64    ret ^= fts5Ind
19780 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
19790 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
197a0 20 70 54 65 72 6d 2c 20 6e 29 3b 0a 20 20 20 20   pTerm, n);.    
197b0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
197c0 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ret;.}..static v
197d0 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65  oid fts5BtreeIte
197e0 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
197f0 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49  ex *p, .  int iI
19800 64 78 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  dx,.  Fts5Struct
19810 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
19820 2c 20 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  , .  Fts5BtreeIt
19830 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69  er *pIter.){.  i
19840 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
19850 69 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  i;.  nByte = siz
19860 65 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  eof(pIter->aLvl[
19870 30 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65  0]) * (pSeg->nHe
19880 69 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65  ight-1);.  memse
19890 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
198a0 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
198b0 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65  Iter->nLvl = pSe
198c0 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20  g->nHeight-1;.  
198d0 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49  pIter->iIdx = iI
198e0 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d  dx;.  pIter->p =
198f0 20 70 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65   p;.  pIter->pSe
19900 67 20 3d 20 70 53 65 67 3b 0a 20 20 69 66 28 20  g = pSeg;.  if( 
19910 6e 42 79 74 65 20 26 26 20 70 2d 3e 72 63 3d 3d  nByte && p->rc==
19920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19930 20 70 49 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28   pIter->aLvl = (
19940 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
19950 65 6c 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  el*)fts5IdxMallo
19960 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  c(p, nByte);.  }
19970 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
19980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19990 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
199a0 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  ++){.    i64 iRo
199b0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
199c0 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
199d0 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 2b 31  Seg->iSegid, i+1
199e0 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35 44 61  , 1);.    Fts5Da
199f0 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  ta *pData;.    p
19a00 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44  Iter->aLvl[i].pD
19a10 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20 66 74  ata = pData = ft
19a20 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
19a30 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70  owid);.    if( p
19a40 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74  Data ){.      ft
19a50 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
19a60 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
19a70 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  n, &pIter->aLvl[
19a80 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  i].s);.    }.  }
19a90 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e  ..  if( pIter->n
19aa0 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20  Lvl==0 || p->rc 
19ab0 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  ){.    pIter->bE
19ac0 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 74 65  of = 1;.    pIte
19ad0 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65 67 2d  r->iLeaf = pSeg-
19ae0 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c  >pgnoLast;.  }el
19af0 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e  se{.    pIter->n
19b00 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61  Empty = pIter->a
19b10 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b  Lvl[0].s.nEmpty;
19b20 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
19b30 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
19b40 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20  0].s.iChild;.   
19b50 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d   pIter->bDlidx =
19b60 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
19b70 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a  s.bDlidx;.  }.}.
19b80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19b90 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28 46  5BtreeIterNext(F
19ba0 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70 49  ts5BtreeIter *pI
19bb0 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  ter){.  Fts5Inde
19bc0 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 3b  x *p = pIter->p;
19bd0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
19be0 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f 66  ert( pIter->bEof
19bf0 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61 4c  ==0 && pIter->aL
19c00 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20 29 3b  vl[0].s.aData );
19c10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
19c20 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e  ter->nLvl && p->
19c30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
19c40 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72  ++){.    Fts5Btr
19c50 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
19c60 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
19c70 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64  [i];.    fts5Nod
19c80 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
19c90 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  , &pLvl->s);.   
19ca0 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61 44 61   if( pLvl->s.aDa
19cb0 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ta ){.      fts5
19cc0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
19cd0 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
19ce0 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20  pLvl->s.term.n, 
19cf0 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b  pLvl->s.term.p);
19d00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
19d20 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
19d30 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20  &pLvl->s);.     
19d40 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
19d50 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
19d60 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
19d70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
19d80 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e    if( i==pIter->
19d90 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20 29 7b  nLvl || p->rc ){
19da0 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
19db0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
19dc0 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
19dd0 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
19de0 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69 2d 2d  gid;.    for(i--
19df0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
19e00 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65      Fts5BtreeIte
19e10 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  rLevel *pLvl = &
19e20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
19e30 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
19e40 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
19e50 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64  ROWID(pIter->iId
19e60 78 2c 69 53 65 67 69 64 2c 69 2b 31 2c 70 4c 76  x,iSegid,i+1,pLv
19e70 6c 5b 31 5d 2e 73 2e 69 43 68 69 6c 64 29 3b 0a  l[1].s.iChild);.
19e80 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
19e90 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
19ea0 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  (p, iRowid);.   
19eb0 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61     if( pLvl->pDa
19ec0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ta ){.        ft
19ed0 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
19ee0 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 2c 20 70  Lvl->pData->p, p
19ef0 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 6e 2c 20 26  Lvl->pData->n, &
19f00 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20  pLvl->s);.      
19f10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
19f20 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70  Iter->nEmpty = p
19f30 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
19f40 6e 45 6d 70 74 79 3b 0a 20 20 70 49 74 65 72 2d  nEmpty;.  pIter-
19f50 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
19f60 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64  >aLvl[0].s.bDlid
19f70 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  x;.  pIter->iLea
19f80 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
19f90 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 61  0].s.iChild;.  a
19fa0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
19fb0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
19fc0 2d 3e 62 45 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61  ->bEof );.}..sta
19fd0 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
19fe0 65 65 49 74 65 72 46 72 65 65 28 46 74 73 35 42  eeIterFree(Fts5B
19ff0 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29  treeIter *pIter)
1a000 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1a010 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
1a020 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Lvl; i++){.    F
1a030 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
1a040 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
1a050 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66  ->aLvl[i];.    f
1a060 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
1a070 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69  &pLvl->s);.    i
1a080 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
1a090 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
1a0a0 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44  Release(pLvl->pD
1a0b0 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  ata);.      pLvl
1a0c0 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->pData = 0;.   
1a0d0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1a0e0 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 4c 76  _free(pIter->aLv
1a0f0 6c 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  l);.  fts5Buffer
1a100 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72  Free(&pIter->ter
1a110 6d 29 3b 0a 7d 0a 0a 0a 0a 73 74 61 74 69 63 20  m);.}....static 
1a120 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e  void fts5IndexIn
1a130 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
1a140 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ent(.  Fts5Index
1a150 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1a160 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1a170 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1a180 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74     /* Index that
1a1b0 20 70 53 65 67 20 69 73 20 61 20 70 61 72 74 20   pSeg is a part 
1a1c0 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  of */.  Fts5Stru
1a1d0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
1a1e0 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg      /* Segme
1a1f0 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
1a200 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
1a210 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 42 74 72   */.){.  Fts5Btr
1a220 65 65 49 74 65 72 20 69 74 65 72 3b 20 20 20 20  eeIter iter;    
1a230 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1a240 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1a250 75 67 68 20 62 2d 74 72 65 65 20 68 69 65 72 61  ugh b-tree hiera
1a260 72 63 68 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74  rchy */..  /* It
1a270 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
1a280 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  e b-tree hierarc
1a290 68 79 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74  hy.  */.  for(ft
1a2a0 73 35 42 74 72 65 65 49 74 65 72 49 6e 69 74 28  s5BtreeIterInit(
1a2b0 70 2c 20 69 49 64 78 2c 20 70 53 65 67 2c 20 26  p, iIdx, pSeg, &
1a2c0 69 74 65 72 29 3b 0a 20 20 20 20 20 20 69 74 65  iter);.      ite
1a2d0 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20  r.bEof==0;.     
1a2e0 20 66 74 73 35 42 74 72 65 65 49 74 65 72 4e 65   fts5BtreeIterNe
1a2f0 78 74 28 26 69 74 65 72 29 0a 20 20 29 7b 0a 20  xt(&iter).  ){. 
1a300 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20     i64 iRow;    
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a320 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68   /* Rowid for th
1a330 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46  is leaf */.    F
1a340 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20  ts5Data *pLeaf; 
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a360 44 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65  Data for this le
1a370 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  af */.    int iO
1a380 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1a390 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1a3a0 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20  t of first term 
1a3b0 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69  on leaf */.    i
1a3c0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a3e0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
1a3f0 74 68 72 6f 75 67 68 20 65 6d 70 74 79 20 6c 65  through empty le
1a400 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  aves */..    /* 
1a410 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71  If the leaf in q
1a420 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  uestion has alre
1a430 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64  ady been trimmed
1a440 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e   from the segmen
1a450 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72  t, .    ** ignor
1a460 65 20 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e  e this b-tree en
1a470 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  try. Otherwise, 
1a480 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d  load it into mem
1a490 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ory. */.    if( 
1a4a0 69 74 65 72 2e 69 4c 65 61 66 3c 70 53 65 67 2d  iter.iLeaf<pSeg-
1a4b0 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e  >pgnoFirst ) con
1a4c0 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77 20  tinue;.    iRow 
1a4d0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1a4e0 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d  OWID(iIdx, pSeg-
1a4f0 3e 69 53 65 67 69 64 2c 20 30 2c 20 69 74 65 72  >iSegid, 0, iter
1a500 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65  .iLeaf);.    pLe
1a510 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
1a520 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20  d(p, iRow);.    
1a530 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62  if( pLeaf==0 ) b
1a540 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  reak;..    /* Ch
1a550 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61  eck that the lea
1a560 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  f contains at le
1a570 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e  ast one term, an
1a580 64 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75  d that it is equ
1a590 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20  al.    ** to or 
1a5a0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1a5b0 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 69 74 65  split-key in ite
1a5c0 72 2e 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  r.term.  */.    
1a5d0 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  iOff = fts5GetU1
1a5e0 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b  6(&pLeaf->p[2]);
1a5f0 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3d 3d 30  .    if( iOff==0
1a600 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
1a610 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
1a620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a630 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a650 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20  Size of term on 
1a660 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20 2a 2f  leaf in bytes */
1a670 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20  .      int res; 
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
1a6a0 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73 70 6c   of term and spl
1a6b0 69 74 2d 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  it-key */.      
1a6c0 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
1a6d0 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
1a6e0 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  ff], nTerm);.   
1a6f0 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
1a700 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
1a710 20 69 74 65 72 2e 74 65 72 6d 2e 70 2c 20 4d 49   iter.term.p, MI
1a720 4e 28 6e 54 65 72 6d 2c 20 69 74 65 72 2e 74 65  N(nTerm, iter.te
1a730 72 6d 2e 6e 29 29 3b 0a 20 20 20 20 20 20 69 66  rm.n));.      if
1a740 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
1a750 20 6e 54 65 72 6d 20 2d 20 69 74 65 72 2e 74 65   nTerm - iter.te
1a760 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  rm.n;.      if( 
1a770 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
1a780 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1a790 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
1a7a0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
1a7b0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
1a7c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
1a7d0 20 62 72 65 61 6b 3b 0a 0a 0a 20 20 20 20 2f 2a   break;...    /*
1a7e0 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
1a7f0 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20  the iter.nEmpty 
1a800 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67  leaves following
1a810 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1a820 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69  f.    ** (a) exi
1a830 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  st and (b) conta
1a840 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a  in no terms. */.
1a850 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 70 2d 3e      for(i=1; p->
1a860 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a870 20 69 3c 3d 69 74 65 72 2e 6e 45 6d 70 74 79 3b   i<=iter.nEmpty;
1a880 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4c 65   i++){.      pLe
1a890 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
1a8a0 64 28 70 2c 20 69 52 6f 77 2b 69 29 3b 0a 20 20  d(p, iRow+i);.  
1a8b0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 26 26      if( pLeaf &&
1a8c0 20 30 21 3d 66 74 73 35 47 65 74 55 31 36 28 26   0!=fts5GetU16(&
1a8d0 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 20 29 7b 0a  pLeaf->p[2]) ){.
1a8e0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1a8f0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
1a900 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
1a910 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
1a920 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  f);.    }..    /
1a930 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1a940 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63  doclist-index, c
1a950 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f  heck that it loo
1a960 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ks right. */.   
1a970 20 69 66 28 20 69 74 65 72 2e 62 44 6c 69 64 78   if( iter.bDlidx
1a980 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c   ){.      Fts5Dl
1a990 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
1a9a0 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65  = 0;  /* For ite
1a9b0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64  rating through d
1a9c0 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
1a9d0 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79        int nEntry
1a9e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
1a9f0 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
1aa00 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Segid;.      int
1aa10 20 62 52 65 76 20 3d 20 30 3b 0a 0a 20 20 20 20   bRev = 0;..    
1aa20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49    for(fts5DlidxI
1aa30 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c  terInit(p, bRev,
1aa40 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69   iIdx, iSegid, i
1aa50 74 65 72 2e 69 4c 65 61 66 2c 20 26 70 44 6c 69  ter.iLeaf, &pDli
1aa60 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  dx);.          f
1aa70 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
1aa80 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
1aa90 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
1aaa0 64 78 49 74 65 72 4e 65 78 74 28 70 44 6c 69 64  dxIterNext(pDlid
1aab0 78 2c 20 62 52 65 76 29 0a 20 20 20 20 20 20 29  x, bRev).      )
1aac0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4b  {.        i64 iK
1aad0 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ey = FTS5_SEGMEN
1aae0 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53  T_ROWID(iIdx, iS
1aaf0 65 67 69 64 2c 20 30 2c 20 70 44 6c 69 64 78 2d  egid, 0, pDlidx-
1ab00 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20  >iLeafPgno);.   
1ab10 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
1ab20 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
1ab30 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
1ab40 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
1ab50 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
1ab60 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
1ab70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20  Leaf->p[0]);.   
1ab80 20 20 20 20 20 20 20 69 66 28 20 70 44 6c 69 64         if( pDlid
1ab90 78 2d 3e 62 5a 65 72 6f 20 29 7b 0a 20 20 20 20  x->bZero ){.    
1aba0 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
1abb0 69 64 4f 66 66 21 3d 30 20 29 20 70 2d 3e 72 63  idOff!=0 ) p->rc
1abc0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
1abd0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1abe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 36  {.            i6
1abf0 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  4 iRowid;.      
1ac00 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
1ac10 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64  &pLeaf->p[iRowid
1ac20 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  Off], (u64*)&iRo
1ac30 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
1ac40 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70 44    if( iRowid!=pD
1ac50 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20 70  lidx->iRowid ) p
1ac60 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
1ac70 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UPT;.          }
1ac80 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
1ac90 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
1aca0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1acb0 20 20 20 20 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20       nEntry++;. 
1acc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1acd0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
1ace0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 77 61  doclist-index wa
1acf0 73 20 74 68 65 20 72 69 67 68 74 20 6c 65 6e 67  s the right leng
1ad00 74 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  th */.      if( 
1ad10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ad20 20 26 26 20 6e 45 6e 74 72 79 21 3d 69 74 65 72   && nEntry!=iter
1ad30 2e 6e 45 6d 70 74 79 20 26 26 20 6e 45 6e 74 72  .nEmpty && nEntr
1ad40 79 21 3d 69 74 65 72 2e 6e 45 6d 70 74 79 2b 31  y!=iter.nEmpty+1
1ad50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
1ad60 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
1ad70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ad80 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
1ad90 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d  e(pDlidx);.    }
1ada0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
1adb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1adc0 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67  iter.iLeaf!=pSeg
1add0 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
1ade0 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
1adf0 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66  ORRUPT;.  }..  f
1ae00 74 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65  ts5BtreeIterFree
1ae10 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (&iter);.}../*.*
1ae20 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63  * Run internal c
1ae30 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20  hecks to ensure 
1ae40 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64  that the FTS ind
1ae50 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e  ex (a) is intern
1ae60 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74  ally .** consist
1ae70 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ent and (b) cont
1ae80 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
1ae90 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f   which the XOR o
1aea0 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a  f the checksums.
1aeb0 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64  ** as calculated
1aec0 20 62 79 20 66 74 73 35 49 6e 64 65 78 45 6e 74   by fts5IndexEnt
1aed0 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73  ryCksum() is cks
1aee0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  um..**.** Return
1aef0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1af00 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e  if any of the in
1af10 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61  ternal checks fa
1af20 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a  il, or if the.**
1af30 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e   checksum does n
1af40 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e  ot match. Return
1af50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
1af60 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20 77 69  l checks pass wi
1af70 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20  thout.** error, 
1af80 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51  or some other SQ
1af90 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1afa0 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72  if another error
1afb0 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f   (e.g. OOM).** o
1afc0 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
1afd0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
1afe0 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73  tegrityCheck(Fts
1aff0 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63  5Index *p, u64 c
1b000 6b 73 75 6d 29 7b 0a 20 20 46 74 73 35 43 6f 6e  ksum){.  Fts5Con
1b010 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
1b020 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74  ->pConfig;.  int
1b030 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b050 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
1b060 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20  through indexes 
1b070 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b090 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1b0a0 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  ode */.  u64 cks
1b0b0 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um2 = 0;        
1b0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
1b0d0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
1b0e0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
1b0f0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
1b100 20 74 68 61 74 20 74 68 65 20 63 68 65 63 6b 73   that the checks
1b110 75 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  um of the index 
1b120 6d 61 74 63 68 65 73 20 74 68 65 20 61 72 67 75  matches the argu
1b130 6d 65 6e 74 20 63 68 65 63 6b 73 75 6d 20 2a 2f  ment checksum */
1b140 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69  .  for(iIdx=0; i
1b150 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
1b160 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
1b170 20 20 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67      Fts5MultiSeg
1b180 49 74 65 72 20 2a 70 49 74 65 72 3b 0a 20 20 20  Iter *pIter;.   
1b190 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1b1a0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1b1b0 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69  ructureRead(p, i
1b1c0 49 64 78 29 3b 0a 20 20 20 20 66 6f 72 28 66 74  Idx);.    for(ft
1b1d0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
1b1e0 2c 20 70 53 74 72 75 63 74 2c 20 69 49 64 78 2c  , pStruct, iIdx,
1b1f0 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c   0, 0, 0, -1, 0,
1b200 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20   &pIter);.      
1b210 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
1b220 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
1b230 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
1b240 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
1b250 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 20 20 29  ter, 0, 0).    )
1b260 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 49  {.      Fts5PosI
1b270 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20  ter sPos;       
1b280 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
1b290 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70  terate through p
1b2a0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
1b2b0 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
1b2e0 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
1b2f0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
1b300 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
1b310 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20  wid(pIter);.    
1b320 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
1b330 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
1b340 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
1b350 0a 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35  ..      for(fts5
1b360 50 6f 73 49 74 65 72 49 6e 69 74 28 70 2c 20 70  PosIterInit(p, p
1b370 49 74 65 72 2c 20 26 73 50 6f 73 29 3b 0a 20 20  Iter, &sPos);.  
1b380 20 20 20 20 20 20 20 20 66 74 73 35 50 6f 73 49          fts5PosI
1b390 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73 29  terEof(p, &sPos)
1b3a0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ==0;.          f
1b3b0 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28 70  ts5PosIterNext(p
1b3c0 2c 20 26 73 50 6f 73 29 0a 20 20 20 20 20 20 29  , &sPos).      )
1b3d0 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32  {.        cksum2
1b3e0 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74   ^= fts5IndexEnt
1b3f0 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
1b400 73 50 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f 73 2e  sPos.iCol, sPos.
1b410 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 23 69 66  iPos, z, n);.#if
1b420 20 30 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   0.        fprin
1b430 74 66 28 73 74 64 6f 75 74 2c 20 22 72 6f 77 69  tf(stdout, "rowi
1b440 64 3d 25 64 20 22 2c 20 28 69 6e 74 29 69 52 6f  d=%d ", (int)iRo
1b450 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 70  wid);.        fp
1b460 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74  rintf(stdout, "t
1b470 65 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e 2c 20 7a  erm=%.*s ", n, z
1b480 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
1b490 74 66 28 73 74 64 6f 75 74 2c 20 22 63 6f 6c 3d  tf(stdout, "col=
1b4a0 25 64 20 22 2c 20 73 50 6f 73 2e 69 43 6f 6c 29  %d ", sPos.iCol)
1b4b0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
1b4c0 66 28 73 74 64 6f 75 74 2c 20 22 6f 66 66 3d 25  f(stdout, "off=%
1b4d0 64 5c 6e 22 2c 20 73 50 6f 73 2e 69 50 6f 73 29  d\n", sPos.iPos)
1b4e0 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68  ;.        fflush
1b4f0 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66  (stdout);.#endif
1b500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b510 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1b520 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Free(p, pIter);.
1b530 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1b540 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1b550 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 2d  );.  }.  rc = p-
1b560 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  >rc;.  if( rc==S
1b570 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
1b580 6d 21 3d 63 6b 73 75 6d 32 20 29 20 72 63 20 3d  m!=cksum2 ) rc =
1b590 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
1b5a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1b5b0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
1b5c0 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  es of each segme
1b5d0 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61  nt match the lea
1b5e0 76 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64  ves */.  for(iId
1b5f0 78 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  x=0; rc==SQLITE_
1b600 4f 4b 20 26 26 20 69 49 64 78 3c 3d 70 43 6f 6e  OK && iIdx<=pCon
1b610 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
1b620 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53  dx++){.    Fts5S
1b630 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1b640 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
1b650 65 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a  eRead(p, iIdx);.
1b660 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20      if( pStruct 
1b670 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76  ){.      int iLv
1b680 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 66  l, iSeg;.      f
1b690 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
1b6a0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1b6b0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
1b6c0 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
1b6d0 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
1b6e0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
1b6f0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
1b700 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1b710 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
1b720 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1b730 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d  iLvl].aSeg[iSeg]
1b740 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1b750 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
1b760 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 69 49  eckSegment(p, iI
1b770 64 78 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  dx, pSeg);.     
1b780 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b790 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
1b7a0 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1b7b0 75 63 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  uct);.    rc = p
1b7c0 2d 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ->rc;.  }..  ret
1b7d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2f  urn rc;.}../*.*/
1b7e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b7f0 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65  5DecodeStructure
1b800 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
1b830 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
1b840 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
1b850 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c  .  const u8 *pBl
1b860 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ob, int nBlob.){
1b870 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1b8a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  e */.  int iLvl,
1b8b0 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
1b8c0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
1b8d0 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
1b8e0 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  , segments */.  
1b8f0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1b900 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b910 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63  /* Decoded struc
1b920 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  ture object */..
1b930 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63    rc = fts5Struc
1b940 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62  tureDecode(pBlob
1b950 2c 20 6e 42 6c 6f 62 2c 20 26 70 29 3b 0a 20 20  , nBlob, &p);.  
1b960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b970 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  K ){.    *pRc = 
1b980 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
1b990 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d    }..  for(iLvl=
1b9a0 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65  0; iLvl<p->nLeve
1b9b0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1b9c0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1b9d0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61  el *pLvl = &p->a
1b9e0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
1b9f0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1ba00 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
1ba10 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20  Rc, pBuf, .     
1ba20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65     " {lvl=%d nMe
1ba30 72 67 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70  rge=%d", iLvl, p
1ba40 4c 76 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20 20  Lvl->nMerge.    
1ba50 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d  );.    for(iSeg=
1ba60 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53  0; iSeg<pLvl->nS
1ba70 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
1ba80 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1ba90 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
1baa0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
1bab0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
1bac0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1bad0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
1bae0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 7b  , .          " {
1baf0 69 64 3d 25 64 20 68 3d 25 64 20 6c 65 61 76 65  id=%d h=%d leave
1bb00 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67  s=%d..%d}", pSeg
1bb10 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e  ->iSegid, pSeg->
1bb20 6e 48 65 69 67 68 74 2c 20 0a 20 20 20 20 20 20  nHeight, .      
1bb30 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
1bb40 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  rst, pSeg->pgnoL
1bb50 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ast.      );.   
1bb60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
1bb70 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
1bb80 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
1bb90 22 7d 22 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  "}");.  }..  fts
1bba0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1bbb0 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  e(p);.}../*.** B
1bbc0 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61  uffer (a/n) is a
1bbd0 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
1bbe0 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69  n a list of seri
1bbf0 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20  alized varints. 
1bc00 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72  Read.** each var
1bc10 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
1bc20 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ts string repres
1bc30 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66  entation to buff
1bc40 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a  er pBuf. Return.
1bc50 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20  ** after either 
1bc60 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
1bc70 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72   is exhausted or
1bc80 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65   a 0 value is re
1bc90 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ad..**.** The re
1bca0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1bcb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1bcc0 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
1bcd0 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
1bce0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1bcf0 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e  DecodePoslist(in
1bd00 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
1bd10 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
1bd20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
1bd30 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
1bd40 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
1bd50 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a  {.    int iVal;.
1bd60 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56      iOff += getV
1bd70 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
1bd80 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  , iVal);.    sql
1bd90 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1bda0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
1bdb0 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61  pBuf, " %d", iVa
1bdc0 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
1bdd0 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
1bde0 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66  The start of buf
1bdf0 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69  fer (a/n) contai
1be00 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ns the start of 
1be10 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64  a doclist. The d
1be20 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72  oclist.** may or
1be30 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20   may not finish 
1be40 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65  within the buffe
1be50 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1be60 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a   appends a text.
1be70 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ** representatio
1be80 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66  n of the part of
1be90 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61   the doclist tha
1bea0 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20  t is present to 
1beb0 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20  buffer.** pBuf. 
1bec0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
1bed0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
1bee0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1bef0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
1bf00 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
1bf10 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
1bf20 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a  odeDoclist(int *
1bf30 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
1bf40 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
1bf50 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36  *a, int n){.  i6
1bf60 34 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20  4 iDocid;.  int 
1bf70 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iOff = 0;..  if(
1bf80 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
1bf90 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
1bfa0 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
1bfb0 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29  , (u64*)&iDocid)
1bfc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
1bfd0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
1bfe0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
1bff0 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44   rowid=%lld", iD
1c000 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69  ocid);.  }.  whi
1c010 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  le( iOff<n ){.  
1c020 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
1c030 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
1c040 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 50  t32(&a[iOff], nP
1c050 6f 73 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  os);.    iOff +=
1c060 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
1c070 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61  st(pRc, pBuf, &a
1c080 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f  [iOff], MIN(n-iO
1c090 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20  ff, nPos));.    
1c0a0 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
1c0b0 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
1c0c0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
1c0d0 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26  lite3GetVarint(&
1c0e0 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
1c0f0 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69  iDelta);.      i
1c100 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72  f( iDelta==0 ) r
1c110 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20  eturn iOff;.    
1c120 20 20 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c    iDocid -= iDel
1c130 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ta;.      sqlite
1c140 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1c150 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
1c160 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22  f, " rowid=%lld"
1c170 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d  , iDocid);.    }
1c180 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69  .  }..  return i
1c190 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
1c1a0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1c1b0 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
1c1c0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
1c1d0 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a   fts5_decode()..
1c1e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1c1f0 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
1c200 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
1c210 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
1c220 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
1c230 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f   call context */
1c240 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c260 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c270 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20  args (always 2) 
1c280 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1c290 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
1c2a0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
1c2b0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
1c2c0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
1c2f0 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
1c300 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  oded */.  int iI
1c310 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68  dx,iSegid,iHeigh
1c320 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77  t,iPgno;  /* Row
1c330 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f  id components */
1c340 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20  .  const u8 *a; 
1c350 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
1c360 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20     /* Record to 
1c370 64 65 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  decode */.  Fts5
1c380 42 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20  Buffer s;       
1c390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1c3a0 75 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20  uild up text to 
1c3b0 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20  return here */. 
1c3c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c3d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1c3e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1c3f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41  */..  assert( nA
1c400 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65  rg==2 );.  memse
1c410 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&s, 0, sizeof(
1c420 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
1c430 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
1c440 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56  _value_int64(apV
1c450 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71  al[0]);.  n = sq
1c460 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1c470 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61  s(apVal[1]);.  a
1c480 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1c490 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b  _blob(apVal[1]);
1c4a0 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
1c4b0 69 64 28 69 52 6f 77 69 64 2c 20 26 69 49 64 78  id(iRowid, &iIdx
1c4c0 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65 69  , &iSegid, &iHei
1c4d0 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
1c4e0 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
1c4f0 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29  &rc, &s, iRowid)
1c500 3b 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3d  ;.  if( iHeight=
1c510 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41  =FTS5_SEGMENT_MA
1c520 58 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20 20  X_HEIGHT ){.    
1c530 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69  int i = 0;.    i
1c540 36 34 20 69 50 72 65 76 3b 0a 20 20 20 20 69 66  64 iPrev;.    if
1c550 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ( n>0 ){.      i
1c560 20 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b   = getVarint(&a[
1c570 69 5d 2c 20 28 75 36 34 2a 29 26 69 50 72 65 76  i], (u64*)&iPrev
1c580 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c590 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1c5a0 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
1c5b0 22 20 25 6c 6c 64 22 2c 20 69 50 72 65 76 29 3b  " %lld", iPrev);
1c5c0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1c5d0 28 20 69 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69  ( i<n ){.      i
1c5e0 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69  64 iVal;.      i
1c5f0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61   += getVarint(&a
1c600 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  [i], (u64*)&iVal
1c610 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 56 61  );.      if( iVa
1c620 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
1c630 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1c640 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
1c650 63 2c 20 26 73 2c 20 22 20 78 22 29 3b 0a 20 20  c, &s, " x");.  
1c660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c670 20 20 20 69 50 72 65 76 20 3d 20 69 50 72 65 76     iPrev = iPrev
1c680 20 2d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20   - iVal;.       
1c690 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1c6a0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
1c6b0 72 63 2c 20 26 73 2c 20 22 20 25 6c 6c 64 22 2c  rc, &s, " %lld",
1c6c0 20 69 50 72 65 76 29 3b 0a 20 20 20 20 20 20 7d   iPrev);.      }
1c6d0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 0a  .    }..  }else.
1c6e0 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20    if( iSegid==0 
1c6f0 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  ){.    if( iRowi
1c700 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  d==FTS5_AVERAGES
1c710 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
1c720 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 7d  /* todo */.    }
1c730 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
1c740 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
1c750 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
1c760 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a      }.  }else{..
1c770 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
1c780 65 72 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  erm;.    memset(
1c790 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
1c7a0 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
1c7b0 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3d      if( iHeight=
1c7c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1c7d0 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
1c7e0 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
1c7f0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  f = 0;.      int
1c800 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74   iOff;.      int
1c810 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20   nKeep = 0;..   
1c820 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
1c830 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29  ts5GetU16(&a[0])
1c840 3b 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66  ;.      iTermOff
1c850 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
1c860 5b 32 5d 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  [2]);..      if(
1c870 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
1c880 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f        iOff = iRo
1c890 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65  widOff;.      }e
1c8a0 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
1c8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
1c8c0 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
1c8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c8e0 20 20 69 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20    iOff = n;.    
1c8f0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44 65    }.      fts5De
1c900 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c  codePoslist(&rc,
1c910 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66   &s, &a[4], iOff
1c920 2d 34 29 3b 0a 0a 0a 20 20 20 20 20 20 61 73 73  -4);...      ass
1c930 65 72 74 28 20 69 52 6f 77 69 64 4f 66 66 3d 3d  ert( iRowidOff==
1c940 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77 69  0 || iOff==iRowi
1c950 64 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66  dOff );.      if
1c960 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20  ( iRowidOff ){. 
1c970 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
1c980 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
1c990 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
1c9a0 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20  f], n-iOff);.   
1c9b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
1c9c0 72 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30 20  rt( iTermOff==0 
1c9d0 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f 66  || iOff==iTermOf
1c9e0 66 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  f );.      while
1c9f0 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
1ca00 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
1ca10 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67         iOff += g
1ca20 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
1ca30 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
1ca40 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65       term.n= nKe
1ca50 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ep;.        fts5
1ca60 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1ca70 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79  (&rc, &term, nBy
1ca80 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  te, &a[iOff]);. 
1ca90 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
1caa0 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 73  Byte;..        s
1cab0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1cac0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20  AppendPrintf(.  
1cad0 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
1cae0 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
1caf0 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
1cb00 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
1cb10 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1cb20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
1cb30 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
1cb40 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69  s, &a[iOff], n-i
1cb50 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
1cb60 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
1cb70 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65        iOff += ge
1cb80 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
1cb90 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
1cba0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1cbb0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
1cbc0 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20 7d  ee(&term);.    }
1cbd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
1cbe0 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20  NodeIter ss;.   
1cbf0 20 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49     for(fts5NodeI
1cc00 74 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 73  terInit(a, n, &s
1cc10 73 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66 74  s); ss.aData; ft
1cc20 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
1cc30 72 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20 20  rc, &ss)){.     
1cc40 20 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e 6e     if( ss.term.n
1cc50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1cc60 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1cc70 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
1cc80 72 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d 25  rc, &s, " left=%
1cc90 64 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b 0a  d", ss.iChild);.
1cca0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ccb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ccc0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1ccd0 50 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20 22  Printf(&rc,&s, "
1cce0 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20 20   \"%.*s\"", .   
1ccf0 20 20 20 20 20 20 20 20 20 20 20 73 73 2e 74 65             ss.te
1cd00 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 0a  rm.n, ss.term.p.
1cd10 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1cd20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1cd30 66 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b 0a  f( ss.nEmpty ){.
1cd40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1cd50 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1cd60 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
1cd70 20 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c 20   " empty=%d%s", 
1cd80 73 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20 20  ss.nEmpty,.     
1cd90 20 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c 69           ss.bDli
1cda0 64 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20 20  dx ? "*" : "".  
1cdb0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1cdc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cdd0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46     fts5NodeIterF
1cde0 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d 0a  ree(&ss);.    }.
1cdf0 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
1ce00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ce10 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1ce20 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e  _text(pCtx, (con
1ce30 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e  st char*)s.p, s.
1ce40 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
1ce50 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ENT);.  }else{. 
1ce60 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1ce70 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74  t_error_code(pCt
1ce80 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74  x, rc);.  }.  ft
1ce90 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29  s5BufferFree(&s)
1cea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ceb0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1cec0 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67  t of registering
1ced0 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65   the FTS5 module
1cee0 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a   with database.*
1cef0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
1cf00 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65   It registers se
1cf10 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e  veral user-defin
1cf20 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
1cf30 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69  ons useful.** wi
1cf40 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49  th FTS5..**.** I
1cf50 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
1cf60 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1cf70 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
1cf80 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74   occurs, some ot
1cf90 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72  her.** SQLite er
1cfa0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1cfb0 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  rned instead..*/
1cfc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1cfd0 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65  IndexInit(sqlite
1cfe0 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
1cff0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1d000 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
1d010 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f    db, "fts5_deco
1d020 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  de", 2, SQLITE_U
1d030 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f  TF8, 0, fts5Deco
1d040 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  deFunction, 0, 0
1d050 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
1d060 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
1d070 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
1d080 73 69 7a 65 20 66 6f 72 20 74 68 65 20 69 6e 64  size for the ind
1d090 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  ex object..*/.vo
1d0a0 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  id sqlite3Fts5In
1d0b0 64 65 78 50 67 73 7a 28 46 74 73 35 49 6e 64 65  dexPgsz(Fts5Inde
1d0c0 78 20 2a 70 2c 20 69 6e 74 20 70 67 73 7a 29 7b  x *p, int pgsz){
1d0d0 0a 20 20 70 2d 3e 70 67 73 7a 20 3d 20 70 67 73  .  p->pgsz = pgs
1d0e0 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  z;.}../*.** Iter
1d0f0 61 74 6f 72 20 70 4d 75 6c 74 69 20 63 75 72 72  ator pMulti curr
1d100 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
1d110 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e  a valid entry (n
1d120 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a  ot EOF). This.**
1d130 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
1d140 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
1d150 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 6f 66  position-list of
1d160 20 74 68 65 20 65 6e 74 72 79 20 70 4d 75 6c 74   the entry pMult
1d170 69 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  i .** currently 
1d180 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 62 75 66  points to to buf
1d190 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
1d1a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1d1b0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1d1c0 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e  e is left in p->
1d1d0 72 63 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  rc. It is assume
1d1e0 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 68 61  d.** no error ha
1d1f0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
1d200 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
1d210 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1d220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d230 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73  fts5MultiIterPos
1d240 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65  list(.  Fts5Inde
1d250 78 20 2a 70 2c 0a 20 20 46 74 73 35 4d 75 6c 74  x *p,.  Fts5Mult
1d260 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69  iSegIter *pMulti
1d270 2c 0a 20 20 69 6e 74 20 62 53 7a 2c 0a 20 20 46  ,.  int bSz,.  F
1d280 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
1d290 29 7b 0a 20 20 46 74 73 35 43 68 75 6e 6b 49 74  ){.  Fts5ChunkIt
1d2a0 65 72 20 69 74 65 72 3b 0a 20 20 46 74 73 35 53  er iter;.  Fts5S
1d2b0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
1d2c0 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d  pMulti->aSeg[ pM
1d2d0 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 20  ulti->aFirst[1] 
1d2e0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74 73  ];.  assert( fts
1d2f0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
1d300 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 20   pMulti)==0 );. 
1d310 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e   fts5ChunkIterIn
1d320 69 74 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65  it(p, pSeg, &ite
1d330 72 29 3b 0a 20 20 69 66 28 20 66 74 73 35 43 68  r);.  if( fts5Ch
1d340 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 69  unkIterEof(p, &i
1d350 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ter)==0 ){.    i
1d360 66 28 20 62 53 7a 20 29 7b 0a 20 20 20 20 20 20  f( bSz ){.      
1d370 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1d380 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70  Varint(&p->rc, p
1d390 42 75 66 2c 20 69 74 65 72 2e 6e 52 65 6d 29 3b  Buf, iter.nRem);
1d3a0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1d3b0 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45  ( fts5ChunkIterE
1d3c0 6f 66 28 70 2c 20 26 69 74 65 72 29 3d 3d 30 20  of(p, &iter)==0 
1d3d0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
1d3e0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1d3f0 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72  ->rc, pBuf, iter
1d400 2e 6e 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20 20  .n, iter.p);.   
1d410 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1d420 4e 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b 0a  Next(p, &iter);.
1d430 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
1d440 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65  ChunkIterRelease
1d450 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74  (&iter);.}..stat
1d460 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
1d470 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35  istIterNext(Fts5
1d480 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
1d490 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
1d4a0 2d 3e 69 3c 70 49 74 65 72 2d 3e 6e 20 29 7b 0a  ->i<pIter->n ){.
1d4b0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
1d4c0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44   ){.      i64 iD
1d4d0 65 6c 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65  elta;.      pIte
1d4e0 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69 6e  r->i += getVarin
1d4f0 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  t(&pIter->a[pIte
1d500 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 69 44  r->i], (u64*)&iD
1d510 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  elta);.      if(
1d520 20 70 49 74 65 72 2d 3e 62 41 73 63 20 29 7b 0a   pIter->bAsc ){.
1d530 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
1d540 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
1d550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d560 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
1d570 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20  wid -= iDelta;. 
1d580 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1d590 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
1d5a0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
1d5b0 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69  Iter->a[pIter->i
1d5c0 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
1d5d0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  >iRowid);.    }.
1d5e0 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20      pIter->i += 
1d5f0 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  getVarint32(&pIt
1d600 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c  er->a[pIter->i],
1d610 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
1d620 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  );.    pIter->aP
1d630 6f 73 6c 69 73 74 20 3d 20 26 70 49 74 65 72 2d  oslist = &pIter-
1d640 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 3b 0a 20 20  >a[pIter->i];.  
1d650 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 70 49    pIter->i += pI
1d660 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20  ter->nPoslist;. 
1d670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
1d680 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b  r->aPoslist = 0;
1d690 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
1d6a0 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49  oid fts5DoclistI
1d6b0 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42  terInit(.  Fts5B
1d6c0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20  uffer *pBuf, .  
1d6d0 69 6e 74 20 62 41 73 63 2c 20 0a 20 20 46 74 73  int bAsc, .  Fts
1d6e0 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
1d6f0 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28  ter.){.  memset(
1d700 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
1d710 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
1d720 65 72 2d 3e 61 20 3d 20 70 42 75 66 2d 3e 70 3b  er->a = pBuf->p;
1d730 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 70 42  .  pIter->n = pB
1d740 75 66 2d 3e 6e 3b 0a 20 20 70 49 74 65 72 2d 3e  uf->n;.  pIter->
1d750 62 41 73 63 20 3d 20 62 41 73 63 3b 0a 20 20 66  bAsc = bAsc;.  f
1d760 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1d770 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  xt(pIter);.}../*
1d780 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
1d790 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70  list to buffer p
1d7a0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Buf..*/.static v
1d7b0 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70  oid fts5MergeApp
1d7c0 65 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20  endDocid(.  int 
1d7d0 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d7f0 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
1d800 65 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63 2c  e */.  int bAsc,
1d810 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1d820 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1d830 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
1d840 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36  write to */.  i6
1d850 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20  4 *piLastRowid, 
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d870 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75   IN/OUT: Previou
1d880 73 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20  s rowid written 
1d890 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36  (if any) */.  i6
1d8a0 34 20 69 52 6f 77 69 64 20 20 20 20 20 20 20 20  4 iRowid        
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d8c0 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64   Rowid to append
1d8d0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42 75   */.){.  if( pBu
1d8e0 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f->n==0 ){.    f
1d8f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d900 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c  arint(pRc, pBuf,
1d910 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73   iRowid);.  }els
1d920 65 20 69 66 28 20 62 41 73 63 3d 3d 30 20 29 7b  e if( bAsc==0 ){
1d930 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1d940 70 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c  ppendVarint(pRc,
1d950 20 70 42 75 66 2c 20 2a 70 69 4c 61 73 74 52 6f   pBuf, *piLastRo
1d960 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20  wid - iRowid);. 
1d970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
1d980 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d990 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52  nt(pRc, pBuf, iR
1d9a0 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f  owid - *piLastRo
1d9b0 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c  wid);.  }.  *piL
1d9c0 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  astRowid = iRowi
1d9d0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  d;.}../*.** Buff
1d9e0 65 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f  ers p1 and p2 co
1d9f0 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20  ntain doclists. 
1da00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65  This function me
1da10 72 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  rges the content
1da20 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64  .** of the two d
1da30 6f 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72  oclists together
1da40 20 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72   and sets buffer
1da50 20 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c   p1 to the resul
1da60 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  t before.** retu
1da70 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
1da80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1da90 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1daa0 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e  s left in p->rc.
1dab0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1dac0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
1dad0 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
1dae0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1daf0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1db00 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
1db10 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sts(.  Fts5Index
1db20 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1db30 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1db40 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1db50 0a 20 20 69 6e 74 20 62 41 73 63 2c 0a 20 20 46  .  int bAsc,.  F
1db60 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20  ts5Buffer *p1,  
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db80 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20  * First list to 
1db90 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42  merge */.  Fts5B
1dba0 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20  uffer *p2       
1dbb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1dbc0 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72  cond list to mer
1dbd0 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ge */.){.  if( p
1dbe0 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20  2->n ){.    i64 
1dbf0 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
1dc00 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
1dc10 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35  ter i1;.    Fts5
1dc20 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a  DoclistIter i2;.
1dc30 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f      Fts5Buffer o
1dc40 75 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  ut;.    Fts5Buff
1dc50 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73  er tmp;.    mems
1dc60 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65  et(&out, 0, size
1dc70 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65  of(out));.    me
1dc80 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69  mset(&tmp, 0, si
1dc90 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20  zeof(tmp));..   
1dca0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
1dcb0 49 6e 69 74 28 70 31 2c 20 62 41 73 63 2c 20 26  Init(p1, bAsc, &
1dcc0 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  i1);.    fts5Doc
1dcd0 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c  listIterInit(p2,
1dce0 20 62 41 73 63 2c 20 26 69 32 29 3b 0a 20 20 20   bAsc, &i2);.   
1dcf0 20 77 68 69 6c 65 28 20 69 31 2e 61 50 6f 73 6c   while( i1.aPosl
1dd00 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50 6f  ist!=0 || i2.aPo
1dd10 73 6c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20  slist!=0 ){.    
1dd20 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73    if( i2.aPoslis
1dd30 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73  t==0 || (i1.aPos
1dd40 6c 69 73 74 20 26 26 20 0a 20 20 20 20 20 20 20  list && .       
1dd50 20 20 20 20 28 20 28 21 62 41 73 63 20 26 26 20      ( (!bAsc && 
1dd60 69 31 2e 69 52 6f 77 69 64 3e 69 32 2e 69 52 6f  i1.iRowid>i2.iRo
1dd70 77 69 64 29 20 7c 7c 20 28 62 41 73 63 20 26 26  wid) || (bAsc &&
1dd80 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52   i1.iRowid<i2.iR
1dd90 6f 77 69 64 29 20 29 0a 20 20 20 20 20 20 29 29  owid) ).      ))
1dda0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  {.        /* Cop
1ddb0 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20  y entry from i1 
1ddc0 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  */.        fts5M
1ddd0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
1dde0 26 70 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f  &p->rc, bAsc, &o
1ddf0 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c  ut, &iLastRowid,
1de00 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i1.iRowid);.   
1de10 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1de20 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1de30 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f  rc, &out, i1.nPo
1de40 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  slist);.        
1de50 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1de60 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75  Blob(&p->rc, &ou
1de70 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i1.nPoslist, 
1de80 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i1.aPoslist);.  
1de90 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
1dea0 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a  tIterNext(&i1);.
1deb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
1dec0 73 65 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69  se if( i1.aPosli
1ded0 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77  st==0 || i2.iRow
1dee0 69 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b  id!=i1.iRowid ){
1def0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
1df00 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a   entry from i2 *
1df10 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
1df20 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
1df30 70 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75  p->rc, bAsc, &ou
1df40 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20  t, &iLastRowid, 
1df50 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
1df60 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1df70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1df80 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73  c, &out, i2.nPos
1df90 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  list);.        f
1dfa0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1dfb0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  lob(&p->rc, &out
1dfc0 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69  , i2.nPoslist, i
1dfd0 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.aPoslist);.   
1dfe0 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
1dff0 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
1e000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
1e010 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  e{.        Fts5P
1e020 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b  oslistReader r1;
1e030 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
1e040 6c 69 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20  listReader r2;. 
1e050 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69         Fts5Posli
1e060 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  stWriter writer;
1e070 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ..        memset
1e080 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
1e090 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20  eof(writer));.. 
1e0a0 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20         /* Merge 
1e0b0 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e  the two position
1e0c0 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20   lists. */ .    
1e0d0 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
1e0e0 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c  endDocid(&p->rc,
1e0f0 20 62 41 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c   bAsc, &out, &iL
1e100 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
1e110 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
1e120 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d  s5BufferZero(&tm
1e130 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
1e140 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
1e150 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e  aderInit(-1, i1.
1e160 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
1e170 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20  slist, &r1);.   
1e180 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1e190 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
1e1a0 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73  t(-1, i2.aPoslis
1e1b0 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i2.nPoslist, 
1e1c0 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68  &r2);.        wh
1e1d0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1e1e0 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f  TE_OK && (r1.bEo
1e1f0 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d  f==0 || r2.bEof=
1e200 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
1e210 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20   i64 iNew;.     
1e220 20 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66       if( r2.bEof
1e230 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20   || (r1.bEof==0 
1e240 26 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50  && r1.iPos<r2.iP
1e250 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os) ){.         
1e260 20 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f     iNew = r1.iPo
1e270 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  s;.            s
1e280 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1e290 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29  tReaderNext(&r1)
1e2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1e2b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
1e2c0 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20  New = r2.iPos;. 
1e2d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e2e0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1e2f0 64 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20  derNext(&r2);.  
1e300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
1e310 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29  .iPos==r2.iPos )
1e320 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1e330 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72  istReaderNext(&r
1e340 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  1);.          }.
1e350 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1e360 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  = sqlite3Fts5Pos
1e370 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
1e380 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20  (&tmp, &writer, 
1e390 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  iNew);.        }
1e3a0 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ..        fts5Bu
1e3b0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1e3c0 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74  (&p->rc, &out, t
1e3d0 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  mp.n);.        f
1e3e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1e3f0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  lob(&p->rc, &out
1e400 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70 29 3b  , tmp.n, tmp.p);
1e410 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
1e420 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
1e430 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1e440 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
1e450 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i2);.      }.   
1e460 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
1e470 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31  erSet(&p->rc, p1
1e480 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b  , out.n, out.p);
1e490 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
1e4a0 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66  ree(&tmp);.    f
1e4b0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f  ts5BufferFree(&o
1e4c0 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ut);.  }.}..stat
1e4d0 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66  ic void fts5Buff
1e4e0 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65  erSwap(Fts5Buffe
1e4f0 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65  r *p1, Fts5Buffe
1e500 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75  r *p2){.  Fts5Bu
1e510 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a  ffer tmp = *p1;.
1e520 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a    *p1 = *p2;.  *
1e530 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61  p2 = tmp;.}..sta
1e540 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74  tic void fts5Set
1e550 75 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20  upPrefixIter(.  
1e560 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e580 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64  /* Index to read
1e590 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   from */.  int b
1e5a0 41 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Asc,            
1e5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e5c0 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59  ue for "ORDER BY
1e5d0 20 72 6f 77 69 64 20 41 53 43 22 20 2a 2f 0a 20   rowid ASC" */. 
1e5e0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65   const u8 *pToke
1e5f0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1e600 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
1e610 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20  ining prefix to 
1e620 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  match */.  int n
1e630 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
1e640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1e650 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f  ze of buffer pTo
1e660 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ken in bytes */.
1e670 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
1e680 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
1e690 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1e6a0 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
1e6b0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1e6c0 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
1e6d0 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20  Buffer *aBuf;.  
1e6e0 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d  const int nBuf =
1e6f0 20 33 32 3b 0a 0a 20 20 61 42 75 66 20 3d 20 28   32;..  aBuf = (
1e700 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73 35  Fts5Buffer*)fts5
1e710 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
1e720 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 2a  eof(Fts5Buffer)*
1e730 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74  nBuf);.  pStruct
1e740 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1e750 52 65 61 64 28 70 2c 20 30 29 3b 0a 0a 20 20 69  Read(p, 0);..  i
1e760 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72 75  f( aBuf && pStru
1e770 63 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6f  ct ){.    Fts5Do
1e780 63 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63 6c  clistIter *pDocl
1e790 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ist;.    int i;.
1e7a0 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77      i64 iLastRow
1e7b0 69 64 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74  id;.    Fts5Mult
1e7c0 69 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 30  iSegIter *p1 = 0
1e7d0 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  ;     /* Iterato
1e7e0 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72  r used to gather
1e7f0 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78   data from index
1e800 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
1e810 65 72 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20  er doclist;..   
1e820 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74   memset(&doclist
1e830 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c  , 0, sizeof(docl
1e840 69 73 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66  ist));.    for(f
1e850 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
1e860 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31  p, pStruct, 0, 1
1e870 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
1e880 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20  , -1, 0, &p1);. 
1e890 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
1e8a0 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d  IterEof(p, p1)==
1e8b0 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  0;.        fts5M
1e8c0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
1e8d0 70 31 2c 20 30 2c 20 30 29 0a 20 20 20 20 29 7b  p1, 0, 0).    ){
1e8e0 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
1e8f0 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
1e900 72 52 6f 77 69 64 28 70 31 29 3b 0a 20 20 20 20  rRowid(p1);.    
1e910 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
1e920 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65     const u8 *pTe
1e930 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  rm = fts5MultiIt
1e940 65 72 54 65 72 6d 28 70 31 2c 20 26 6e 54 65 72  erTerm(p1, &nTer
1e950 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  m);.      assert
1e960 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  ( memcmp(pToken,
1e970 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b   pTerm, MIN(nTok
1e980 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29  en, nTerm))<=0 )
1e990 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72  ;.      if( nTer
1e9a0 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63  m<nToken || memc
1e9b0 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
1e9c0 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61  , nToken) ) brea
1e9d0 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 64 6f  k;..      if( do
1e9e0 63 6c 69 73 74 2e 6e 3e 30 20 0a 20 20 20 20 20  clist.n>0 .     
1e9f0 20 20 26 26 20 28 28 21 62 41 73 63 20 26 26 20    && ((!bAsc && 
1ea00 69 52 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77  iRowid>=iLastRow
1ea10 69 64 29 20 7c 7c 20 28 62 41 73 63 20 26 26 20  id) || (bAsc && 
1ea20 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77  iRowid<=iLastRow
1ea30 69 64 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20  id)).      ){.. 
1ea40 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1ea50 64 6f 63 6c 69 73 74 2e 6e 20 26 26 20 70 2d 3e  doclist.n && p->
1ea60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1ea70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
1ea80 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b  ssert( i<nBuf );
1ea90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1eaa0 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20  Buf[i].n==0 ){. 
1eab0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1eac0 75 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69  ufferSwap(&docli
1ead0 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
1eae0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1eaf0 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69  ufferZero(&docli
1eb00 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  st);.          }
1eb10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1eb20 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69    fts5MergePrefi
1eb30 78 4c 69 73 74 73 28 70 2c 20 62 41 73 63 2c 20  xLists(p, bAsc, 
1eb40 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
1eb50 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
1eb60 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1eb70 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
1eb80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1eb90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1eba0 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20  f( doclist.n==0 
1ebb0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
1ebc0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1ebd0 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69  t(&p->rc, &docli
1ebe0 73 74 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  st, iRowid);.   
1ebf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 41 73     }else if( bAs
1ec00 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1ec10 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1ec20 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1ec30 64 6f 63 6c 69 73 74 2c 20 69 4c 61 73 74 52 6f  doclist, iLastRo
1ec40 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20  wid - iRowid);. 
1ec50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ec60 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1ec70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1ec80 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f  c, &doclist, iRo
1ec90 77 69 64 20 2d 20 69 4c 61 73 74 52 6f 77 69 64  wid - iLastRowid
1eca0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ecb0 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52   iLastRowid = iR
1ecc0 6f 77 69 64 3b 0a 20 20 20 20 20 20 66 74 73 35  owid;.      fts5
1ecd0 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74  MultiIterPoslist
1ece0 28 70 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c  (p, p1, 1, &docl
1ecf0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ist);.    }..   
1ed00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66   for(i=0; i<nBuf
1ed10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
1ed20 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
1ed30 74 73 28 70 2c 20 62 41 73 63 2c 20 26 64 6f 63  ts(p, bAsc, &doc
1ed40 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
1ed50 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1ed60 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b  rFree(&aBuf[i]);
1ed70 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
1ed80 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
1ed90 70 31 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69  p1);..    pDocli
1eda0 73 74 20 3d 20 28 46 74 73 35 44 6f 63 6c 69 73  st = (Fts5Doclis
1edb0 74 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61  tIter*)fts5IdxMa
1edc0 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
1edd0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 29 29  ts5DoclistIter))
1ede0 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 63 6c  ;.    if( !pDocl
1edf0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ist ){.      fts
1ee00 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63  5BufferFree(&doc
1ee10 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  list);.    }else
1ee20 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  {.      pIter->p
1ee30 44 6f 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69  Doclist = pDocli
1ee40 73 74 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6f  st;.      fts5Do
1ee50 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 26 64  clistIterInit(&d
1ee60 6f 63 6c 69 73 74 2c 20 62 41 73 63 2c 20 70 49  oclist, bAsc, pI
1ee70 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a  ter->pDoclist);.
1ee80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
1ee90 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1eea0 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71  e(pStruct);.  sq
1eeb0 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29  lite3_free(aBuf)
1eec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1eed0 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74  a new iterator t
1eee0 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68  o iterate though
1eef0 20 61 6c 6c 20 64 6f 63 69 64 73 20 74 68 61 74   all docids that
1ef00 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73   match the .** s
1ef10 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f  pecified token o
1ef20 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a  r token prefix..
1ef30 2a 2f 0a 46 74 73 35 49 6e 64 65 78 49 74 65 72  */.Fts5IndexIter
1ef40 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64   *sqlite3Fts5Ind
1ef50 65 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49  exQuery(.  Fts5I
1ef60 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1ef70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1ef80 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79  S index to query
1ef90 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1efa0 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
1efb0 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28  oken, /* Token (
1efc0 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75  or prefix) to qu
1efd0 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ery for */.  int
1efe0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f000 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
1f010 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20  X_QUERY_X flags 
1f020 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  */.){.  Fts5Inde
1f030 78 49 74 65 72 20 2a 70 52 65 74 3b 0a 20 20 69  xIter *pRet;.  i
1f040 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 0a 20 20  nt iIdx = 0;..  
1f050 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
1f060 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
1f070 49 58 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  IX ){.    Fts5Co
1f080 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
1f090 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
1f0a0 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78  for(iIdx=1; iIdx
1f0b0 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
1f0c0 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20  ix; iIdx++){.   
1f0d0 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
1f0e0 61 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d  aPrefix[iIdx-1]=
1f0f0 3d 6e 54 6f 6b 65 6e 20 29 20 62 72 65 61 6b 3b  =nToken ) break;
1f100 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1f110 49 64 78 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  Idx>pConfig->nPr
1f120 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 69 49  efix ){.      iI
1f130 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  dx = -1;.    }. 
1f140 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 28 46 74   }..  pRet = (Ft
1f150 73 35 49 6e 64 65 78 49 74 65 72 2a 29 73 71 6c  s5IndexIter*)sql
1f160 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
1f170 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  of(Fts5IndexIter
1f180 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  ));.  if( pRet )
1f190 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65  {.    memset(pRe
1f1a0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  t, 0, sizeof(Fts
1f1b0 35 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 0a 20  5IndexIter));.. 
1f1c0 20 20 20 70 52 65 74 2d 3e 70 49 6e 64 65 78 20     pRet->pIndex 
1f1d0 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 69 49 64  = p;.    if( iId
1f1e0 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 52  x>=0 ){.      pR
1f1f0 65 74 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74  et->pStruct = ft
1f200 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
1f210 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20  p, iIdx);.      
1f220 69 66 28 20 70 52 65 74 2d 3e 70 53 74 72 75 63  if( pRet->pStruc
1f230 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  t ){.        fts
1f240 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
1f250 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74 2c 20   pRet->pStruct, 
1f260 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64  .            iId
1f270 78 2c 20 66 6c 61 67 73 2c 20 28 63 6f 6e 73 74  x, flags, (const
1f280 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f   u8*)pToken, nTo
1f290 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65  ken, -1, 0, &pRe
1f2a0 74 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20 20 20  t->pMulti.      
1f2b0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
1f2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1f2d0 74 20 62 41 73 63 20 3d 20 28 66 6c 61 67 73 20  t bAsc = (flags 
1f2e0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
1f2f0 59 5f 41 53 43 29 21 3d 30 3b 0a 20 20 20 20 20  Y_ASC)!=0;.     
1f300 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
1f310 49 74 65 72 28 70 2c 20 62 41 73 63 2c 20 28 63  Iter(p, bAsc, (c
1f320 6f 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c  onst u8*)pToken,
1f330 20 6e 54 6f 6b 65 6e 2c 20 70 52 65 74 29 3b 0a   nToken, pRet);.
1f340 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1f350 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71   p->rc ){.    sq
1f360 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
1f370 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52  se(pRet);.    pR
1f380 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  et = 0;.  }.  re
1f390 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1f3a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1f3b0 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
1f3c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
1f3d0 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ly argument is a
1f3e0 74 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71  t EOF..*/.int sq
1f3f0 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
1f400 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
1f410 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
1f420 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
1f430 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74   .    return pIt
1f440 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50  er->pDoclist->aP
1f450 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a 20 20 7d 65  oslist==0; .  }e
1f460 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1f470 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1f480 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
1f490 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a  pIter->pMulti);.
1f4a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
1f4b0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
1f4c0 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a  tching rowid. .*
1f4d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
1f4e0 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  s5IterNext(Fts5I
1f4f0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
1f500 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  {.  if( pIter->p
1f510 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66  Doclist ){.    f
1f520 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1f530 78 74 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  xt(pIter->pDocli
1f540 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  st);.  }else{.  
1f550 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
1f560 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
1f570 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  );.    fts5Multi
1f580 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e  IterNext(pIter->
1f590 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
1f5a0 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20  Multi, 0, 0);.  
1f5b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  }.}../*.** Move 
1f5c0 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
1f5d0 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20  hing rowid that 
1f5e0 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66 74  occurs at or aft
1f5f0 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a  er iMatch. The.*
1f600 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  * definition of 
1f610 22 61 74 20 6f 72 20 61 66 74 65 72 22 20 64 65  "at or after" de
1f620 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
1f630 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69   this iterator i
1f640 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73  terates.** in as
1f650 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65  cending or desce
1f660 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
1f670 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
1f680 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
1f690 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  om(Fts5IndexIter
1f6a0 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d 61   *pIter, i64 iMa
1f6b0 74 63 68 29 7b 0a 20 20 69 66 28 20 70 49 74 65  tch){.  if( pIte
1f6c0 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20  r->pDoclist ){. 
1f6d0 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
1f6e0 20 20 20 20 2f 2a 20 66 74 73 35 44 6f 63 6c 69      /* fts5Docli
1f6f0 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  stIterNextFrom(p
1f700 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2c 20  Iter->pDoclist, 
1f710 69 4d 61 74 63 68 29 3b 20 2a 2f 0a 20 20 7d 65  iMatch); */.  }e
1f720 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c  lse{.    fts5Mul
1f730 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  tiIterNextFrom(p
1f740 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
1f750 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61  ter->pMulti, iMa
1f760 74 63 68 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  tch);.  }.}../*.
1f770 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
1f780 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a  rrent rowid..*/.
1f790 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49  i64 sqlite3Fts5I
1f7a0 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64  terRowid(Fts5Ind
1f7b0 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
1f7c0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
1f7d0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  clist ){.    ret
1f7e0 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  urn pIter->pDocl
1f7f0 69 73 74 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 7d  ist->iRowid;.  }
1f800 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1f810 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
1f820 77 69 64 28 70 49 74 65 72 2d 3e 70 4d 75 6c 74  wid(pIter->pMult
1f830 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  i);.  }.}.../*.*
1f840 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1f850 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
1f860 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f 70 79  ontaining a copy
1f870 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
1f880 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68 65   list for.** the
1f890 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1f8a0 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  Output variable 
1f8b0 2a 70 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  *pn is set to th
1f8c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1f8d0 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74 65  ffer .** in byte
1f8e0 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
1f8f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ng..**.** The re
1f900 74 75 72 6e 65 64 20 62 75 66 66 65 72 20 64 6f  turned buffer do
1f910 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
1f920 68 65 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74  he 0x00 terminat
1f930 6f 72 20 62 79 74 65 20 73 74 6f 72 65 64 20 6f  or byte stored o
1f940 6e 0a 2a 2a 20 64 69 73 6b 2e 0a 2a 2f 0a 63 6f  n.** disk..*/.co
1f950 6e 73 74 20 75 38 20 2a 73 71 6c 69 74 65 33 46  nst u8 *sqlite3F
1f960 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 46  ts5IterPoslist(F
1f970 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
1f980 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20  ter, int *pn){. 
1f990 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63   if( pIter->pDoc
1f9a0 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 6e 20  list ){.    *pn 
1f9b0 3d 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  = pIter->pDoclis
1f9c0 74 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20  t->nPoslist;.   
1f9d0 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70   return pIter->p
1f9e0 44 6f 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73  Doclist->aPoslis
1f9f0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
1fa00 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
1fa10 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Iter->pIndex;.  
1fa20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
1fa30 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
1fa40 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  );.    fts5Multi
1fa50 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70  IterPoslist(p, p
1fa60 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30 2c  Iter->pMulti, 0,
1fa70 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
1fa80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fa90 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1faa0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1fab0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1fac0 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pn = pIter->po
1fad0 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 72 65 74  slist.n;.    ret
1fae0 75 72 6e 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  urn pIter->posli
1faf0 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st.p;.  }.}../*.
1fb00 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72  ** Close an iter
1fb10 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61  ator opened by a
1fb20 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
1fb30 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
1fb40 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f  exQuery()..*/.vo
1fb50 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  id sqlite3Fts5It
1fb60 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  erClose(Fts5Inde
1fb70 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
1fb80 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
1fb90 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
1fba0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73  clist ){.      s
1fbb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
1fbc0 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 29 3b  r->pDoclist->a);
1fbd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1fbe0 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c  ree(pIter->pDocl
1fbf0 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
1fc00 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1fc10 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e  IterFree(pIter->
1fc20 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
1fc30 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 74  Multi);.      ft
1fc40 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1fc50 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63  se(pIter->pStruc
1fc60 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  t);.      fts5Bu
1fc70 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
1fc80 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d  >poslist);.    }
1fc90 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65  .    fts5CloseRe
1fca0 61 64 65 72 28 70 49 74 65 72 2d 3e 70 49 6e 64  ader(pIter->pInd
1fcb0 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
1fcc0 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
1fcd0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
1fce0 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
1fcf0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 62  ecord into the b
1fd00 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20 61  uffer supplied a
1fd10 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
1fd20 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72   argument. Retur
1fd30 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
1fd40 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
1fd50 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1fd60 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f  de.** if an erro
1fd70 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  r occurs..*/.int
1fd80 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1fd90 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xGetAverages(Fts
1fda0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42  5Index *p, Fts5B
1fdb0 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
1fdc0 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
1fdd0 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46 54  ffer(p, pBuf, FT
1fde0 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
1fdf0 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  D);.  return p->
1fe00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  rc;.}../*.** Rep
1fe10 6c 61 63 65 20 74 68 65 20 63 75 72 72 65 6e 74  lace the current
1fe20 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
1fe30 72 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  rd with the cont
1fe40 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  ents of the buff
1fe50 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20  er .** supplied 
1fe60 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1fe70 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
1fe80 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
1fe90 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
1fea0 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75  ndex *p, const u
1feb0 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
1fec0 61 74 61 29 7b 0a 20 20 66 74 73 35 44 61 74 61  ata){.  fts5Data
1fed0 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56  Write(p, FTS5_AV
1fee0 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70 44  ERAGES_ROWID, pD
1fef0 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72  ata, nData);.  r
1ff00 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
1ff10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ff20 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1ff30 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64   blocks this mod
1ff40 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f  ule has read fro
1ff50 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  m the %_data.** 
1ff60 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77  table since it w
1ff70 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69  as created..*/.i
1ff80 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
1ff90 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64  dexReads(Fts5Ind
1ffa0 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ex *p){.  return
1ffb0 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a         p->nRead;.}..