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

Artifact 75b2ebfa97ad6054bba98cb923cd2d3c6cc5b112:


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 54 68 65 20 72 65 63 6f  **.**   The reco
09a0: 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  rd begins with t
09b0: 68 72 65 65 20 76 61 72 69 6e 74 73 3a 0a 2a 2a  hree varints:.**
09c0: 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d 62 65 72  .**     + number
09d0: 20 6f 66 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20 20   of levels,.**  
09e0: 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65     + total numbe
09f0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e  r of segments on
0a00: 20 61 6c 6c 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20   all levels,.** 
0a10: 20 20 20 20 2b 20 76 61 6c 75 65 20 6f 66 20 77      + value of w
0a20: 72 69 74 65 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  rite counter..**
0a30: 0a 2a 2a 20 20 20 54 68 65 6e 2c 20 66 6f 72 20  .**   Then, for 
0a40: 65 61 63 68 20 6c 65 76 65 6c 20 66 72 6f 6d 20  each level from 
0a50: 30 20 74 6f 20 6e 4d 61 78 3a 0a 2a 2a 0a 2a 2a  0 to nMax:.**.**
0a60: 20 20 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66       + number of
0a70: 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
0a80: 69 6e 20 6f 6e 67 6f 69 6e 67 20 6d 65 72 67 65  in ongoing merge
0a90: 2e 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ..**     + total
0aa0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0ab0: 6e 74 73 20 69 6e 20 6c 65 76 65 6c 2e 0a 2a 2a  nts in level..**
0ac0: 20 20 20 20 20 2b 20 66 6f 72 20 65 61 63 68 20       + for each 
0ad0: 73 65 67 6d 65 6e 74 20 66 72 6f 6d 20 6f 6c 64  segment from old
0ae0: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 3a 0a 2a  est to newest:.*
0af0: 2a 20 20 20 20 20 20 20 20 20 2b 20 73 65 67 6d  *         + segm
0b00: 65 6e 74 20 69 64 20 28 61 6c 77 61 79 73 20 3e  ent id (always >
0b10: 20 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b   0).**         +
0b20: 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 20 28   b-tree height (
0b30: 31 20 2d 3e 20 72 6f 6f 74 20 69 73 20 6c 65 61  1 -> root is lea
0b40: 66 2c 20 32 20 2d 3e 20 72 6f 6f 74 20 69 73 20  f, 2 -> root is 
0b50: 70 61 72 65 6e 74 20 6f 66 20 6c 65 61 66 20 65  parent of leaf e
0b60: 74 63 2e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  tc.).**         
0b70: 2b 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67  + first leaf pag
0b80: 65 20 6e 75 6d 62 65 72 20 28 6f 66 74 65 6e 20  e number (often 
0b90: 31 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20  1).**         + 
0ba0: 66 69 6e 61 6c 20 6c 65 61 66 20 70 61 67 65 20  final leaf page 
0bb0: 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20  number.**.** 2. 
0bc0: 54 68 65 20 41 76 65 72 61 67 65 73 20 52 65 63  The Averages Rec
0bd0: 6f 72 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73  ord:.**.**   A s
0be0: 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 69 74  ingle record wit
0bf0: 68 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74  hin the %_data t
0c00: 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 20 69  able. The data i
0c10: 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69  s a list of vari
0c20: 6e 74 73 2e 0a 2a 2a 20 20 20 54 68 65 20 66 69  nts..**   The fi
0c30: 72 73 74 20 76 61 6c 75 65 20 69 73 20 74 68 65  rst value is the
0c40: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0c50: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68  in the index. Th
0c60: 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  en, for each col
0c70: 75 6d 6e 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c 65  umn.**   from le
0c80: 66 74 20 74 6f 20 72 69 67 68 74 2c 20 74 68 65  ft to right, the
0c90: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0ca0: 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 63   tokens in the c
0cb0: 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a  olumn for all .*
0cc0: 2a 20 20 20 72 6f 77 73 20 6f 66 20 74 68 65 20  *   rows of the 
0cd0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20  table..**.** 3. 
0ce0: 53 65 67 6d 65 6e 74 20 6c 65 61 76 65 73 3a 0a  Segment leaves:.
0cf0: 2a 2a 0a 2a 2a 20 20 20 54 45 52 4d 20 44 4f 43  **.**   TERM DOC
0d00: 4c 49 53 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a  LIST FORMAT:.**.
0d10: 2a 2a 20 20 20 20 20 4d 6f 73 74 20 6f 66 20 65  **     Most of e
0d20: 61 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66  ach segment leaf
0d30: 20 69 73 20 74 61 6b 65 6e 20 75 70 20 62 79 20   is taken up by 
0d40: 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74  term/doclist dat
0d50: 61 2e 20 54 68 65 20 0a 2a 2a 20 20 20 20 20 67  a. The .**     g
0d60: 65 6e 65 72 61 6c 20 66 6f 72 6d 61 74 20 6f 66  eneral format of
0d70: 20 74 68 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73   the term/doclis
0d80: 74 20 64 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a  t data is:.**.**
0d90: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 20           varint 
0da0: 3a 20 73 69 7a 65 20 6f 66 20 66 69 72 73 74 20  : size of first 
0db0: 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  term.**         
0dc0: 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74  blob:    first t
0dd0: 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20  erm data.**     
0de0: 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 66 69 72      doclist: fir
0df0: 73 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20  st doclist.**   
0e00: 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f        zero-or-mo
0e10: 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  re {.**         
0e20: 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65    varint:  numbe
0e30: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 6f  r of bytes in co
0e40: 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69 6f  mmon with previo
0e50: 75 73 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20  us term.**      
0e60: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 6e 75       varint:  nu
0e70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
0e80: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 20 28   new term data (
0e90: 6e 4e 65 77 29 0a 2a 2a 20 20 20 20 20 20 20 20  nNew).**        
0ea0: 20 20 20 62 6c 6f 62 3a 20 20 20 20 6e 4e 65 77     blob:    nNew
0eb0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0ec0: 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20  rm data.**      
0ed0: 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 6e 65       doclist: ne
0ee0: 78 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20  xt doclist.**   
0ef0: 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20        }.**.**   
0f00: 20 20 64 6f 63 6c 69 73 74 20 66 6f 72 6d 61 74    doclist format
0f10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
0f20: 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20 72  varint:  first r
0f30: 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  owid.**         
0f40: 70 6f 73 6c 69 73 74 3a 20 66 69 72 73 74 20 70  poslist: first p
0f50: 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20  oslist.**       
0f60: 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b    zero-or-more {
0f70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0f80: 72 69 6e 74 3a 20 20 72 6f 77 69 64 20 64 65 6c  rint:  rowid del
0f90: 74 61 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a  ta (always > 0).
0fa0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 6f 73  **           pos
0fb0: 6c 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c  list: first posl
0fc0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30 30  .**         0x00
0fe0: 20 62 79 74 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20   byte.**.**     
0ff0: 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a  poslist format:.
1000: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61  **.**         va
1010: 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66 20 70 6f  rint: size of po
1020: 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 2e 20  slist in bytes. 
1030: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  not including th
1040: 69 73 20 66 69 65 6c 64 2e 0a 2a 2a 20 20 20 20  is field..**    
1050: 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f       collist: co
1060: 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e  llist for column
1070: 20 30 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65   0.**         ze
1080: 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20  ro-or-more {.** 
1090: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 20 62            0x01 b
10a0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  yte.**          
10b0: 20 76 61 72 69 6e 74 3a 20 63 6f 6c 75 6d 6e 20   varint: column 
10c0: 6e 75 6d 62 65 72 20 28 49 29 0a 2a 2a 20 20 20  number (I).**   
10d0: 20 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a          collist:
10e0: 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c   collist for col
10f0: 75 6d 6e 20 49 0a 2a 2a 20 20 20 20 20 20 20 20  umn I.**        
1100: 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c   }.**.**     col
1110: 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  list format:.**.
1120: 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e  **         varin
1130: 74 3a 20 66 69 72 73 74 20 6f 66 66 73 65 74 20  t: first offset 
1140: 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  + 2.**         z
1150: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
1160: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
1170: 74 3a 20 6f 66 66 73 65 74 20 64 65 6c 74 61 20  t: offset delta 
1180: 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  + 2.**         }
1190: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 49 4e 41 54  .**.**   PAGINAT
11a0: 49 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  ION.**.**     Th
11b0: 65 20 66 6f 72 6d 61 74 20 64 65 73 63 72 69 62  e format describ
11c0: 65 64 20 61 62 6f 76 65 20 69 73 20 6f 6e 6c 79  ed above is only
11d0: 20 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65   accurate if the
11e0: 20 65 6e 74 69 72 65 20 74 65 72 6d 2f 64 6f 63   entire term/doc
11f0: 6c 69 73 74 0a 2a 2a 20 20 20 20 20 64 61 74 61  list.**     data
1200: 20 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c   fits on a singl
1210: 65 20 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20  e leaf page. If 
1220: 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
1230: 63 61 73 65 2c 20 74 68 65 20 66 6f 72 6d 61 74  case, the format
1240: 0a 2a 2a 20 20 20 20 20 69 73 20 63 68 61 6e 67  .**     is chang
1250: 65 64 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a  ed in two ways:.
1260: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66  **.**       + if
1270: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
1280: 20 6f 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72   on a page occur
1290: 73 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  s before the fir
12a0: 73 74 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20  st term, it.**  
12b0: 20 20 20 20 20 20 20 69 73 20 73 74 6f 72 65 64         is stored
12c0: 20 61 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61   as a literal va
12d0: 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lue:.**.**      
12e0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
12f0: 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a  first rowid.**.*
1300: 2a 20 20 20 20 20 20 20 2b 20 74 68 65 20 66 69  *       + the fi
1310: 72 73 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68  rst term on each
1320: 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
1330: 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20  in the same way 
1340: 61 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  as the.**       
1350: 20 20 76 65 72 79 20 66 69 72 73 74 20 74 65 72    very first ter
1360: 6d 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74  m of the segment
1370: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1380: 20 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a      varint : siz
1390: 65 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a  e of first term.
13a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 62  **             b
13b0: 6c 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74 65  lob:    first te
13c0: 72 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20  rm data.**.**   
13d0: 20 20 45 61 63 68 20 6c 65 61 66 20 70 61 67 65    Each leaf page
13e0: 20 62 65 67 69 6e 73 20 77 69 74 68 3a 0a 2a 2a   begins with:.**
13f0: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79  .**       + 2-by
1400: 74 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74  te unsigned cont
1410: 61 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f  aining offset to
1420: 20 66 69 72 73 74 20 72 6f 77 69 64 20 28 6f 72   first rowid (or
1430: 20 30 29 2e 0a 2a 2a 20 20 20 20 20 20 20 2b 20   0)..**       + 
1440: 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  2-byte unsigned 
1450: 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65  containing offse
1460: 74 20 74 6f 20 66 69 72 73 74 20 74 65 72 6d 20  t to first term 
1470: 28 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  (or 0)..**.**   
1480: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 72 6d  Followed by term
1490: 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 0a 2a  /doclist data..*
14a0: 2a 0a 2a 2a 20 34 2e 20 53 65 67 6d 65 6e 74 20  *.** 4. Segment 
14b0: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 3a 0a  interior nodes:.
14c0: 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 69 6e 74 65  **.**   The inte
14d0: 72 69 6f 72 20 6e 6f 64 65 73 20 74 75 72 6e 20  rior nodes turn 
14e0: 74 68 65 20 6c 69 73 74 20 6f 66 20 6c 65 61 76  the list of leav
14f0: 65 73 20 69 6e 74 6f 20 61 20 62 2b 74 72 65 65  es into a b+tree
1500: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68 20  . .**.**   Each 
1510: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 65  interior node be
1520: 67 69 6e 73 20 77 69 74 68 20 61 20 76 61 72 69  gins with a vari
1530: 6e 74 20 2d 20 74 68 65 20 70 61 67 65 20 6e 75  nt - the page nu
1540: 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74  mber of the left
1550: 0a 2a 2a 20 20 20 6d 6f 73 74 20 63 68 69 6c 64  .**   most child
1560: 20 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67   node. Following
1570: 20 74 68 69 73 2c 20 66 6f 72 20 65 61 63 68 20   this, for each 
1580: 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74  leaf page except
1590: 20 74 68 65 20 66 69 72 73 74 2c 0a 2a 2a 20 20   the first,.**  
15a0: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
15b0: 64 65 73 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a  des contain:.**.
15c0: 2a 2a 20 20 20 20 20 61 29 20 49 66 20 74 68 65  **     a) If the
15d0: 20 6c 65 61 66 20 70 61 67 65 20 63 6f 6e 74 61   leaf page conta
15e0: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
15f0: 20 74 65 72 6d 2c 20 74 68 65 6e 20 61 20 74 65   term, then a te
1600: 72 6d 2d 70 72 65 66 69 78 20 74 68 61 74 0a 2a  rm-prefix that.*
1610: 2a 20 20 20 20 20 20 20 20 69 73 20 67 72 65 61  *        is grea
1620: 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 70 72 65  ter than all pre
1630: 76 69 6f 75 73 20 74 65 72 6d 73 2c 20 61 6e 64  vious terms, and
1640: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1650: 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ual to the.**   
1660: 20 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20       first term 
1670: 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  on the leaf page
1680: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 49  ..**.**     b) I
1690: 66 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  f the leaf page 
16a0: 6e 6f 20 74 65 72 6d 73 2c 20 61 20 72 65 63 6f  no terms, a reco
16b0: 72 64 20 69 6e 64 69 63 61 74 69 6e 67 20 68 6f  rd indicating ho
16c0: 77 20 6d 61 6e 79 20 63 6f 6e 73 65 63 75 74 69  w many consecuti
16d0: 76 65 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61  ve.**        lea
16e0: 76 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74  ves contain no t
16f0: 65 72 6d 73 2c 20 61 6e 64 20 77 68 65 74 68 65  erms, and whethe
1700: 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 69  r or not there i
1710: 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 0a  s an associated.
1720: 2a 2a 20 20 20 20 20 20 20 20 62 79 2d 72 6f 77  **        by-row
1730: 69 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e  id index record.
1740: 0a 2a 2a 0a 2a 2a 20 20 20 42 79 20 64 65 66 69  .**.**   By defi
1750: 6e 69 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73  nition, there is
1760: 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
1770: 20 6f 6e 65 20 74 79 70 65 20 28 62 29 20 72 65   one type (b) re
1780: 63 6f 72 64 20 69 6e 20 61 20 72 6f 77 2e 0a 2a  cord in a row..*
1790: 2a 20 20 20 54 79 70 65 20 28 62 29 20 72 65 63  *   Type (b) rec
17a0: 6f 72 64 73 20 6f 6e 6c 79 20 65 76 65 72 20 61  ords only ever a
17b0: 70 70 65 61 72 20 6f 6e 20 68 65 69 67 68 74 3d  ppear on height=
17c0: 31 20 70 61 67 65 73 20 2d 20 69 6d 6d 65 64 69  1 pages - immedi
17d0: 61 74 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20 20  ate parents.**  
17e0: 20 6f 66 20 6c 65 61 76 65 73 2e 20 4f 6e 6c 79   of leaves. Only
17f0: 20 74 79 70 65 20 28 61 29 20 72 65 63 6f 72 64   type (a) record
1800: 73 20 61 72 65 20 70 75 73 68 65 64 20 74 6f 20  s are pushed to 
1810: 68 69 67 68 65 72 20 6c 65 76 65 6c 73 2e 0a 2a  higher levels..*
1820: 2a 0a 2a 2a 20 20 20 54 65 72 6d 20 66 6f 72 6d  *.**   Term form
1830: 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  at:.**.**     * 
1840: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1850: 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 70  in common with p
1860: 72 65 76 69 6f 75 73 20 74 65 72 6d 20 70 6c 75  revious term plu
1870: 73 20 32 2c 20 61 73 20 61 20 76 61 72 69 6e 74  s 2, as a varint
1880: 2e 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65  ..**     * Numbe
1890: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
18a0: 77 20 74 65 72 6d 20 64 61 74 61 2c 20 61 73 20  w term data, as 
18b0: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20 20  a varint..**    
18c0: 20 2a 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61   * new term data
18d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72  ..**.**   No-ter
18e0: 6d 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20  m format:.**.** 
18f0: 20 20 20 20 2a 20 65 69 74 68 65 72 20 61 6e 20      * either an 
1900: 30 78 30 30 20 6f 72 20 30 78 30 31 20 62 79 74  0x00 or 0x01 byt
1910: 65 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  e. If the value 
1920: 30 78 30 31 20 69 73 20 75 73 65 64 2c 20 74 68  0x01 is used, th
1930: 65 6e 20 74 68 65 72 65 20 0a 2a 2a 20 20 20 20  en there .**    
1940: 20 20 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61     is an associa
1950: 74 65 64 20 69 6e 64 65 78 2d 62 79 2d 72 6f 77  ted index-by-row
1960: 69 64 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 20 20  id record..**   
1970: 20 20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f    * the number o
1980: 66 20 7a 65 72 6f 2d 74 65 72 6d 20 6c 65 61 76  f zero-term leav
1990: 65 73 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  es as a varint..
19a0: 2a 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d 65 6e 74  **.** 5. Segment
19b0: 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73   doclist indexes
19c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 6c 69 73 74  :.**.**   A list
19d0: 20 6f 66 20 76 61 72 69 6e 74 73 20 2d 20 74 68   of varints - th
19e0: 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f 6e  e first docid on
19f0: 20 65 61 63 68 20 70 61 67 65 20 28 73 74 61 72   each page (star
1a00: 74 69 6e 67 20 77 69 74 68 20 74 68 65 0a 2a 2a  ting with the.**
1a10: 20 20 20 66 69 72 73 74 20 74 65 72 6d 6c 65 73     first termles
1a20: 73 20 70 61 67 65 29 20 6f 66 20 74 68 65 20 64  s page) of the d
1a30: 6f 63 6c 69 73 74 2e 20 46 69 72 73 74 20 65 6c  oclist. First el
1a40: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69 73  ement in the lis
1a50: 74 20 69 73 20 61 0a 2a 2a 20 20 20 6c 69 74 65  t is a.**   lite
1a60: 72 61 6c 20 64 6f 63 69 64 2e 20 45 61 63 68 20  ral docid. Each 
1a70: 64 6f 63 69 64 20 74 68 65 72 65 61 66 74 65 72  docid thereafter
1a80: 20 69 73 20 61 20 28 6e 65 67 61 74 69 76 65 29   is a (negative)
1a90: 20 64 65 6c 74 61 2e 20 49 66 20 74 68 65 72 65   delta. If there
1aa0: 0a 2a 2a 20 20 20 61 72 65 20 6e 6f 20 64 6f 63  .**   are no doc
1ab0: 69 64 73 20 61 74 20 61 6c 6c 20 6f 6e 20 61 20  ids at all on a 
1ac0: 70 61 67 65 2c 20 61 20 30 78 30 30 20 62 79 74  page, a 0x00 byt
1ad0: 65 20 74 61 6b 65 73 20 74 68 65 20 70 6c 61 63  e takes the plac
1ae0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 64 65  e of the.**   de
1af0: 6c 74 61 20 76 61 6c 75 65 2e 0a 2a 2f 0a 0a 2f  lta value..*/../
1b00: 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20  *.** Rowids for 
1b10: 74 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64  the averages and
1b20: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
1b30: 64 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ds in the %_data
1b40: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69   table..*/.#defi
1b50: 6e 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  ne FTS5_AVERAGES
1b60: 5f 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20  _ROWID     1    
1b70: 2f 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f  /* Rowid used fo
1b80: 72 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72  r the averages r
1b90: 65 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ecord */.#define
1ba0: 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
1bb0: 52 4f 57 49 44 28 69 49 64 78 29 20 28 31 30 20  ROWID(iIdx) (10 
1bc0: 2b 20 28 69 49 64 78 29 29 20 20 20 20 20 2f 2a  + (iIdx))     /*
1bd0: 20 46 6f 72 20 73 74 72 75 63 74 75 72 65 20 72   For structure r
1be0: 65 63 6f 72 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ecords */../*.**
1bf0: 20 4d 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e   Macros determin
1c00: 69 6e 67 20 74 68 65 20 72 6f 77 69 64 73 20 75  ing the rowids u
1c10: 73 65 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6e  sed by segment n
1c20: 6f 64 65 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20  odes. All nodes 
1c30: 69 6e 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65 6e  in all.** segmen
1c40: 74 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65 78  ts for all index
1c50: 65 73 20 28 74 68 65 20 72 65 67 75 6c 61 72 20  es (the regular 
1c60: 46 54 53 20 69 6e 64 65 78 20 61 6e 64 20 61 6e  FTS index and an
1c70: 79 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  y prefix indexes
1c80: 29 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  ).** are stored 
1c90: 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  in the %_data ta
1ca0: 62 6c 65 20 77 69 74 68 20 6c 61 72 67 65 20 70  ble with large p
1cb0: 6f 73 69 74 69 76 65 20 72 6f 77 69 64 73 2e 0a  ositive rowids..
1cc0: 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61  **.** The %_data
1cd0: 20 74 61 62 6c 65 20 6d 61 79 20 63 6f 6e 74 61   table may conta
1ce0: 69 6e 20 75 70 20 74 6f 20 28 31 3c 3c 46 54 53  in up to (1<<FTS
1cf0: 35 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 5f  5_SEGMENT_INDEX_
1d00: 42 49 54 53 29 20 0a 2a 2a 20 69 6e 64 65 78 65  BITS) .** indexe
1d10: 73 20 2d 20 6f 6e 65 20 72 65 67 75 6c 61 72 20  s - one regular 
1d20: 74 65 72 6d 20 69 6e 64 65 78 20 61 6e 64 20 7a  term index and z
1d30: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 72 65 66  ero or more pref
1d40: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a 2a  ix indexes..**.*
1d50: 2a 20 45 61 63 68 20 73 65 67 6d 65 6e 74 20 69  * Each segment i
1d60: 6e 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20 61  n an index has a
1d70: 20 75 6e 69 71 75 65 20 69 64 20 67 72 65 61 74   unique id great
1d80: 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a 2a  er than zero..**
1d90: 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 65 20 69 6e  .** Each node in
1da0: 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65   a segment b-tre
1db0: 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 20  e is assigned a 
1dc0: 22 70 61 67 65 20 6e 75 6d 62 65 72 22 20 74 68  "page number" th
1dd0: 61 74 20 69 73 20 75 6e 69 71 75 65 0a 2a 2a 20  at is unique.** 
1de0: 77 69 74 68 69 6e 20 6e 6f 64 65 73 20 6f 66 20  within nodes of 
1df0: 69 74 73 20 68 65 69 67 68 74 20 77 69 74 68 69  its height withi
1e00: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 28 6c  n the segment (l
1e10: 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20 61  eaf nodes have a
1e20: 20 68 65 69 67 68 74 20 0a 2a 2a 20 6f 66 20 30   height .** of 0
1e30: 2c 20 70 61 72 65 6e 74 73 20 31 2c 20 65 74 63  , parents 1, etc
1e40: 2e 29 2e 20 50 61 67 65 20 6e 75 6d 62 65 72 73  .). Page numbers
1e50: 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   are allocated s
1e60: 65 71 75 65 6e 74 69 61 6c 6c 79 20 73 6f 20 74  equentially so t
1e70: 68 61 74 0a 2a 2a 20 61 20 6e 6f 64 65 73 20 70  hat.** a nodes p
1e80: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 61 6c  age number is al
1e90: 77 61 79 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  ways one more th
1ea0: 61 6e 20 69 74 73 20 6c 65 66 74 20 73 69 62 6c  an its left sibl
1eb0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ing..**.** The r
1ec0: 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 64 65 20  owid for a node 
1ed0: 69 73 20 74 68 65 6e 20 66 6f 75 6e 64 20 75 73  is then found us
1ee0: 69 6e 67 20 74 68 65 20 46 54 53 35 5f 53 45 47  ing the FTS5_SEG
1ef0: 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 6d 61 63  MENT_ROWID() mac
1f00: 72 6f 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54 68 65  ro.** below. The
1f10: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 2a 5f   FTS5_SEGMENT_*_
1f20: 42 49 54 53 20 6d 61 63 72 6f 73 20 64 65 66 69  BITS macros defi
1f30: 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
1f40: 20 62 69 74 73 20 75 73 65 64 0a 2a 2a 20 74 6f   bits used.** to
1f50: 20 65 6e 63 6f 64 65 20 74 68 65 20 74 68 72 65   encode the thre
1f60: 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  e FTS5_SEGMENT_R
1f70: 4f 57 49 44 28 29 20 61 72 67 75 6d 65 6e 74 73  OWID() arguments
1f80: 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 72 65  . This module re
1f90: 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  turns.** SQLITE_
1fa0: 46 55 4c 4c 20 61 6e 64 20 66 61 69 6c 73 20 74  FULL and fails t
1fb0: 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72 61  he current opera
1fc0: 74 69 6f 6e 20 69 66 20 74 68 65 79 20 65 76 65  tion if they eve
1fd0: 72 20 70 72 6f 76 65 20 74 6f 6f 20 73 6d 61 6c  r prove too smal
1fe0: 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  l..*/.#define FT
1ff0: 53 35 5f 44 41 54 41 5f 49 44 58 5f 42 20 20 20  S5_DATA_IDX_B   
2000: 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78 20 6f    5     /* Max o
2010: 66 20 33 31 20 70 72 65 66 69 78 20 69 6e 64 65  f 31 prefix inde
2020: 78 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  xes */.#define F
2030: 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 20 20  TS5_DATA_ID_B   
2040: 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61 78 20    16     /* Max 
2050: 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20 36 35  seg id number 65
2060: 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  535 */.#define F
2070: 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
2080: 42 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78 20  B  5     /* Max 
2090: 62 2d 74 72 65 65 20 68 65 69 67 68 74 20 6f 66  b-tree height of
20a0: 20 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46   32 */.#define F
20b0: 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20  TS5_DATA_PAGE_B 
20c0: 20 20 33 31 20 20 20 20 20 2f 2a 20 4d 61 78 20    31     /* Max 
20d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 32  page number of 2
20e0: 31 34 37 34 38 33 36 34 38 20 2a 2f 0a 0a 23 64  147483648 */..#d
20f0: 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d 45  efine FTS5_SEGME
2100: 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73 65  NT_ROWID(idx, se
2110: 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e  gid, height, pgn
2120: 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20 20  o) (            
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2140: 28 28 69 36 34 29 28 69 64 78 29 20 20 20 20 3c  ((i64)(idx)    <
2150: 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 49 44 5f  < (FTS5_DATA_ID_
2160: 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  B + FTS5_DATA_PA
2170: 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41  GE_B + FTS5_DATA
2180: 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 5c 0a  _HEIGHT_B)) + \.
2190: 20 28 28 69 36 34 29 28 73 65 67 69 64 29 20 20   ((i64)(segid)  
21a0: 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50 41  << (FTS5_DATA_PA
21b0: 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41  GE_B + FTS5_DATA
21c0: 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 20 20  _HEIGHT_B)) +   
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21e0: 0a 20 28 28 69 36 34 29 28 68 65 69 67 68 74 29  . ((i64)(height)
21f0: 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50   << (FTS5_DATA_P
2200: 41 47 45 5f 42 29 29 20 2b 20 20 20 20 20 20 20  AGE_B)) +       
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 5c 0a 20 28 28 69 36 34 29 28 70 67 6e 6f 29 29  \. ((i64)(pgno))
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 5c 0a 29 0a 0a 23 69 66 20 46 54 53 35 5f 4d   \.)..#if FTS5_M
2290: 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45  AX_PREFIX_INDEXE
22a0: 53 20 3e 20 28 28 31 3c 3c 46 54 53 35 5f 44 41  S > ((1<<FTS5_DA
22b0: 54 41 5f 49 44 58 5f 42 29 2d 31 29 20 0a 23 20  TA_IDX_B)-1) .# 
22c0: 65 72 72 6f 72 20 22 46 54 53 35 5f 4d 41 58 5f  error "FTS5_MAX_
22d0: 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20 69  PREFIX_INDEXES i
22e0: 73 20 74 6f 6f 20 6c 61 72 67 65 22 0a 23 65 6e  s too large".#en
22f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68  dif../*.** The h
2300: 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e 74  eight of segment
2310: 20 62 2d 74 72 65 65 73 20 69 73 20 61 63 74 75   b-trees is actu
2320: 61 6c 6c 79 20 6c 69 6d 69 74 65 64 20 74 6f 20  ally limited to 
2330: 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a  one less than .*
2340: 2a 20 28 31 3c 3c 48 45 49 47 48 54 5f 42 49 54  * (1<<HEIGHT_BIT
2350: 53 29 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  S). This is beca
2360: 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 61 64  use the rowid ad
2370: 64 72 65 73 73 20 73 70 61 63 65 20 66 6f 72 20  dress space for 
2380: 6e 6f 64 65 73 0a 2a 2a 20 77 69 74 68 20 73 75  nodes.** with su
2390: 63 68 20 61 20 68 65 69 67 68 74 20 69 73 20 75  ch a height is u
23a0: 73 65 64 20 62 79 20 64 6f 63 6c 69 73 74 20 69  sed by doclist i
23b0: 6e 64 65 78 65 73 2e 0a 2a 2f 0a 23 64 65 66 69  ndexes..*/.#defi
23c0: 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ne FTS5_SEGMENT_
23d0: 4d 41 58 5f 48 45 49 47 48 54 20 28 28 31 20 3c  MAX_HEIGHT ((1 <
23e0: 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  < FTS5_DATA_HEIG
23f0: 48 54 5f 42 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20  HT_B)-1)../*.** 
2400: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
2410: 65 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  e doclist index 
2420: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2430: 6c 65 61 66 20 70 61 67 65 20 70 67 6e 6f 20 6f  leaf page pgno o
2440: 66 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 73 65 67  f segment.** seg
2450: 69 64 20 69 6e 20 69 6e 64 65 78 20 69 64 78 2e  id in index idx.
2460: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .*/.#define FTS5
2470: 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57  _DOCLIST_IDX_ROW
2480: 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20 70  ID(idx, segid, p
2490: 67 6e 6f 29 20 5c 0a 20 20 20 20 20 20 20 20 46  gno) \.        F
24a0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
24b0: 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20 46 54  D(idx, segid, FT
24c0: 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48  S5_SEGMENT_MAX_H
24d0: 45 49 47 48 54 2c 20 70 67 6e 6f 29 0a 0a 23 69  EIGHT, pgno)..#i
24e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
24f0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
2500: 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65 74  5Corrupt() { ret
2510: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2520: 50 54 5f 56 54 41 42 3b 20 7d 0a 23 20 64 65 66  PT_VTAB; }.# def
2530: 69 6e 65 20 46 54 53 35 5f 43 4f 52 52 55 50 54  ine FTS5_CORRUPT
2540: 20 66 74 73 35 43 6f 72 72 75 70 74 28 29 0a 23   fts5Corrupt().#
2550: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 46 54  else.# define FT
2560: 53 35 5f 43 4f 52 52 55 50 54 20 53 51 4c 49 54  S5_CORRUPT SQLIT
2570: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 0a 23  E_CORRUPT_VTAB.#
2580: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
2590: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
25a0: 63 20 69 6e 74 20 66 74 73 35 4d 69 73 73 69 6e  c int fts5Missin
25b0: 67 44 61 74 61 28 29 20 7b 20 72 65 74 75 72 6e  gData() { return
25c0: 20 30 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65   0; }.#else.# de
25d0: 66 69 6e 65 20 66 74 73 35 4d 69 73 73 69 6e 67  fine fts5Missing
25e0: 44 61 74 61 28 29 20 0a 23 65 6e 64 69 66 0a 0a  Data() .#endif..
25f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2600: 46 74 73 35 42 74 72 65 65 49 74 65 72 20 46 74  Fts5BtreeIter Ft
2610: 73 35 42 74 72 65 65 49 74 65 72 3b 0a 74 79 70  s5BtreeIter;.typ
2620: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2630: 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 46  BtreeIterLevel F
2640: 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
2650: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2660: 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20  t Fts5ChunkIter 
2670: 46 74 73 35 43 68 75 6e 6b 49 74 65 72 3b 0a 74  Fts5ChunkIter;.t
2680: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2690: 73 35 44 61 74 61 20 46 74 73 35 44 61 74 61 3b  s5Data Fts5Data;
26a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
26b0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 46 74  Fts5DlidxIter Ft
26c0: 73 35 44 6c 69 64 78 49 74 65 72 3b 0a 74 79 70  s5DlidxIter;.typ
26d0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
26e0: 4d 75 6c 74 69 53 65 67 49 74 65 72 20 46 74 73  MultiSegIter Fts
26f0: 35 4d 75 6c 74 69 53 65 67 49 74 65 72 3b 0a 74  5MultiSegIter;.t
2700: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2710: 73 35 4e 6f 64 65 49 74 65 72 20 46 74 73 35 4e  s5NodeIter Fts5N
2720: 6f 64 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66  odeIter;.typedef
2730: 20 73 74 72 75 63 74 20 46 74 73 35 50 61 67 65   struct Fts5Page
2740: 57 72 69 74 65 72 20 46 74 73 35 50 61 67 65 57  Writer Fts5PageW
2750: 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  riter;.typedef s
2760: 74 72 75 63 74 20 46 74 73 35 50 65 6e 64 69 6e  truct Fts5Pendin
2770: 67 44 6f 63 6c 69 73 74 20 46 74 73 35 50 65 6e  gDoclist Fts5Pen
2780: 64 69 6e 67 44 6f 63 6c 69 73 74 3b 0a 74 79 70  dingDoclist;.typ
2790: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
27a0: 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20 46  PendingPoslist F
27b0: 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73  ts5PendingPoslis
27c0: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
27d0: 74 20 46 74 73 35 50 6f 73 49 74 65 72 20 46 74  t Fts5PosIter Ft
27e0: 73 35 50 6f 73 49 74 65 72 3b 0a 74 79 70 65 64  s5PosIter;.typed
27f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2800: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2810: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2820: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2830: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2840: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2850: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2860: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2870: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2880: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2890: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
28a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
28b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
28c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
28d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
28e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
28f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2900: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 2f 2a 0a 2a  reSegment;../*.*
2910: 2a 20 4f 6e 65 20 6f 62 6a 65 63 74 20 70 65 72  * One object per
2920: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
2930: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e 64  /.struct Fts5Ind
2940: 65 78 20 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  ex {.  Fts5Confi
2950: 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20 20 20 20  g *pConfig;     
2960: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
2970: 6c 20 74 61 62 6c 65 20 63 6f 6e 66 69 67 75 72  l table configur
2980: 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ation */.  char 
2990: 2a 7a 44 61 74 61 54 62 6c 3b 20 20 20 20 20 20  *zDataTbl;      
29a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
29b0: 6d 65 20 6f 66 20 25 5f 64 61 74 61 20 74 61 62  me of %_data tab
29c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a  le */.  int pgsz
29d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 72 67 65          /* Targe
29f0: 74 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  t page size for 
2a00: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
2a10: 69 6e 74 20 6e 4d 69 6e 4d 65 72 67 65 3b 20 20  int nMinMerge;  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 69 6e 70 75 74  /* Minimum input
2a40: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 61 20 6d   segments in a m
2a50: 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  erge */.  int nW
2a60: 6f 72 6b 55 6e 69 74 3b 20 20 20 20 20 20 20 20  orkUnit;        
2a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
2a80: 66 20 70 61 67 65 73 20 69 6e 20 61 20 22 75 6e  f pages in a "un
2a90: 69 74 22 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a  it" of work */..
2aa0: 20 20 2f 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    /*.  ** Variab
2ab0: 6c 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  les related to t
2ac0: 68 65 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 20  he accumulation 
2ad0: 6f 66 20 74 6f 6b 65 6e 73 20 61 6e 64 20 64 6f  of tokens and do
2ae0: 63 6c 69 73 74 73 20 77 69 74 68 69 6e 20 74 68  clists within th
2af0: 65 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  e.  ** in-memory
2b00: 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 65 66   hash tables bef
2b10: 6f 72 65 20 74 68 65 79 20 61 72 65 20 66 6c 75  ore they are flu
2b20: 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 20 20  shed to disk..  
2b30: 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 20 2a 61  */.  Fts3Hash *a
2b40: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
2b50: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 68 61 73 68       /* One hash
2b60: 20 66 6f 72 20 74 65 72 6d 73 2c 20 6f 6e 65 20   for terms, one 
2b70: 66 6f 72 20 65 61 63 68 20 70 72 65 66 69 78 20  for each prefix 
2b80: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e  */.  int nMaxPen
2b90: 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20  dingData;       
2ba0: 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64       /* Max pend
2bb0: 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20  ing data before 
2bc0: 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f  flush to disk */
2bd0: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
2be0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2bf0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2c00: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2c10: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2c20: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2c40: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2c50: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2c60: 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  */..  /* Error s
2c70: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2c80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2c90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2ca0: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2cb0: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2cc0: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2cd0: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2ce0: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2cf0: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2d10: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
2d20: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
2d30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2d40: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
2d50: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
2d60: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
2d70: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
2d80: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2d90: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
2da0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
2db0: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
2dc0: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 69 6e 74   id<=?" */.  int
2dd0: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2df0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2e00: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
2e10: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
2e20: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 69 6e  clistIter {.  in
2e30: 74 20 62 41 73 63 3b 0a 20 20 75 38 20 2a 61 3b  t bAsc;.  u8 *a;
2e40: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
2e50: 69 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  i;..  /* Output 
2e60: 76 61 72 69 61 62 6c 65 73 2e 20 61 50 6f 73 6c  variables. aPosl
2e70: 69 73 74 3d 3d 30 20 61 74 20 45 4f 46 20 2a 2f  ist==0 at EOF */
2e80: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20  .  i64 iRowid;. 
2e90: 20 75 38 20 2a 61 50 6f 73 6c 69 73 74 3b 0a 20   u8 *aPoslist;. 
2ea0: 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 7d   int nPoslist;.}
2eb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 74  ;../*.** Each it
2ec0: 65 72 61 74 6f 72 20 75 73 65 64 20 62 79 20 65  erator used by e
2ed0: 78 74 65 72 6e 61 6c 20 6d 6f 64 75 6c 65 73 20  xternal modules 
2ee0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
2ef0: 66 20 74 68 69 73 20 74 79 70 65 2e 0a 2a 2f 0a  f this type..*/.
2f00: 73 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78  struct Fts5Index
2f10: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64  Iter {.  Fts5Ind
2f20: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 46 74  ex *pIndex;.  Ft
2f30: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
2f40: 72 75 63 74 3b 0a 20 20 46 74 73 35 4d 75 6c 74  ruct;.  Fts5Mult
2f50: 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69  iSegIter *pMulti
2f60: 3b 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ;.  Fts5DoclistI
2f70: 74 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20  ter *pDoclist;. 
2f80: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
2f90: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
2fa0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
2fb0: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
2fc0: 73 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  slist */.};../*.
2fd0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 72 65 63 6f  ** A single reco
2fe0: 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
2ff0: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
3000: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 61 74  /.struct Fts5Dat
3010: 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20 20 20 20  a {.  u8 *p;    
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3040: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
3050: 69 6e 69 6e 67 20 72 65 63 6f 72 64 20 2a 2f 0a  ining record */.
3060: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
3090: 6f 72 64 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ord in bytes */.
30a0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 2f 2a 20 52 65 66 20 63 6f 75 6e 74 20 2a    /* Ref count *
30d0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 65 66 6f  /.};../*.** Befo
30e0: 72 65 20 69 74 20 69 73 20 66 6c 75 73 68 65 64  re it is flushed
30f0: 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 20 73 65   to a level-0 se
3100: 67 6d 65 6e 74 2c 20 74 65 72 6d 20 64 61 74 61  gment, term data
3110: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
3120: 0a 2a 2a 20 74 68 65 20 68 61 73 68 20 74 61 62  .** the hash tab
3130: 6c 65 73 20 69 6e 20 74 68 65 20 46 74 73 35 49  les in the Fts5I
3140: 6e 64 65 78 2e 61 48 61 73 68 5b 5d 20 61 72 72  ndex.aHash[] arr
3150: 61 79 2e 20 48 61 73 68 20 74 61 62 6c 65 20 6b  ay. Hash table k
3160: 65 79 73 20 61 72 65 0a 2a 2a 20 74 65 72 6d 73  eys are.** terms
3170: 20 28 6f 72 2c 20 66 6f 72 20 70 72 65 66 69 78   (or, for prefix
3180: 20 69 6e 64 65 78 65 73 2c 20 74 65 72 6d 20 70   indexes, term p
3190: 72 65 66 69 78 65 73 29 20 61 6e 64 20 76 61 6c  refixes) and val
31a0: 75 65 73 20 61 72 65 20 69 6e 73 74 61 6e 63 65  ues are instance
31b0: 73 0a 2a 2a 20 6f 66 20 74 79 70 65 20 46 74 73  s.** of type Fts
31c0: 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 2e  5PendingDoclist.
31d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50  .*/.struct Fts5P
31e0: 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 7b 0a  endingDoclist {.
31f0: 20 20 75 38 20 2a 70 54 65 72 6d 3b 20 20 20 20    u8 *pTerm;    
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 2f 2a 20 54 65 72 6d 20 66 6f 72 20 74 68    /* Term for th
3220: 69 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  is entry */.  in
3230: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3250: 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   Bytes of data a
3260: 74 20 70 54 65 72 6d 20 2a 2f 0a 20 20 46 74 73  t pTerm */.  Fts
3270: 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20  5PendingPoslist 
3280: 2a 70 50 6f 73 6c 69 73 74 3b 20 20 20 2f 2a 20  *pPoslist;   /* 
3290: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  Linked list of p
32a0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 20 2a 2f  osition lists */
32b0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72     /* Column for
32e0: 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 70   last entry in p
32f0: 50 65 6e 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  Pending */.  int
3300: 20 69 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   iPos;          
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3320: 50 6f 73 20 76 61 6c 75 65 20 66 6f 72 20 6c 61  Pos value for la
3330: 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 65 6e  st entry in pPen
3340: 64 69 6e 67 20 2a 2f 0a 20 20 46 74 73 35 50 65  ding */.  Fts5Pe
3350: 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70 4e  ndingDoclist *pN
3360: 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 55 73 65  ext;      /* Use
3370: 64 20 64 75 72 69 6e 67 20 6d 65 72 67 65 20 73  d during merge s
3380: 6f 72 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74  ort */.};.struct
3390: 20 46 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c   Fts5PendingPosl
33a0: 69 73 74 20 7b 0a 20 20 69 36 34 20 69 52 6f 77  ist {.  i64 iRow
33b0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
33d0: 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73   for this doclis
33e0: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 46 74 73  t entry */.  Fts
33f0: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3410: 43 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20  Current doclist 
3420: 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 46 74  contents */.  Ft
3430: 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74  s5PendingPoslist
3440: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a   *pNext;      /*
3450: 20 50 72 65 76 69 6f 75 73 20 70 6f 73 6c 69 73   Previous poslis
3460: 74 20 66 6f 72 20 73 61 6d 65 20 74 65 72 6d 20  t for same term 
3470: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
3480: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3490: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
34a0: 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ord for each ind
34b0: 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ex are represent
34c0: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46  ed.** using an F
34d0: 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63  ts5Structure rec
34e0: 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57  ord in memory. W
34f0: 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e  hich uses instan
3500: 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f  ces of the .** o
3510: 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75  ther Fts5Structu
3520: 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63  reXXX types as c
3530: 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74  omponents..*/.st
3540: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
3550: 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e  reSegment {.  in
3560: 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20  t iSegid;       
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3580: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
3590: 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20   int nHeight;   
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73 65   /* Height of se
35c0: 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a  gment b-tree */.
35d0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
3600: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
3610: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
3620: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
3630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3640: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
3650: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
3660: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3670: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
3680: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36b0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
36c0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
36d0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36f0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
3700: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3710: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3720: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3730: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3740: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3750: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3760: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3770: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 75  5Structure {.  u
3780: 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  64 nWriteCounter
3790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
37a0: 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77  * Total leaves w
37b0: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
37c0: 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65  0 */.  int nLeve
37d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
37e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37f0: 20 6f 66 20 6c 65 76 65 6c 73 20 69 6e 20 74 68   of levels in th
3800: 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74  is index */.  Ft
3810: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
3820: 20 61 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a   aLevel[0];   /*
3830: 20 41 72 72 61 79 20 6f 66 20 6e 4c 65 76 65 6c   Array of nLevel
3840: 20 6c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 2a   level objects *
3850: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f  /.};../*.** An o
3860: 62 6a 65 63 74 20 6f 66 20 74 79 70 65 20 46 74  bject of type Ft
3870: 73 35 53 65 67 57 72 69 74 65 72 20 69 73 20 75  s5SegWriter is u
3880: 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  sed to write to 
3890: 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72  segments..*/.str
38a0: 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69 74  uct Fts5PageWrit
38b0: 65 72 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b  er {.  int pgno;
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
38e0: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
38f0: 61 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  age */.  Fts5Buf
3900: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
3910: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
3920: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61  er containing pa
3930: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73  ge data */.  Fts
3940: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3960: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3970: 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  g previous term 
3980: 6f 6e 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74  on page */.};.st
3990: 72 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74  ruct Fts5SegWrit
39a0: 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78 3b  er {.  int iIdx;
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
39d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
39e0: 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20   int iSegid;    
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 2f 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69   /* Segid to wri
3a10: 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  te to */.  int n
3a20: 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  Writer;         
3a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3a40: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
3a50: 69 6e 20 61 57 72 69 74 65 72 20 2a 2f 0a 20 20  in aWriter */.  
3a60: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
3a70: 61 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20  aWriter;        
3a80: 2f 2a 20 41 72 72 61 79 20 6f 66 20 50 61 67 65  /* Array of Page
3a90: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a  Writer objects *
3aa0: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77  /.  i64 iPrevRow
3ab0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3ac0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
3ad0: 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
3ae0: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
3af0: 0a 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69  .  u8 bFirstRowi
3b00: 64 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  dInDoclist;     
3b10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
3b20: 78 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73  xt rowid is firs
3b30: 74 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  t in doclist */.
3b40: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
3b50: 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  InPage;         
3b60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
3b70: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
3b80: 20 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e   in page */.  in
3b90: 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 20  t nLeafWritten; 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3bb0: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
3bc0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f  pages written */
3bd0: 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20  .  int nEmpty;  
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3c00: 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72 6d 2d  contiguous term-
3c10: 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 20 20  less nodes */.  
3c20: 46 74 73 35 42 75 66 66 65 72 20 64 6c 69 64 78  Fts5Buffer dlidx
3c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c40: 2f 2a 20 44 6f 63 6c 69 73 74 20 69 6e 64 65 78  /* Doclist index
3c50: 20 2a 2f 0a 20 20 69 36 34 20 69 44 6c 69 64 78   */.  i64 iDlidx
3c60: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
3c70: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
3c80: 73 20 72 6f 77 69 64 20 61 70 70 65 6e 64 65 64  s rowid appended
3c90: 20 74 6f 20 64 6c 69 64 78 20 2a 2f 0a 20 20 69   to dlidx */.  i
3ca0: 6e 74 20 62 44 6c 69 64 78 50 72 65 76 56 61 6c  nt bDlidxPrevVal
3cb0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  id;            /
3cc0: 2a 20 54 72 75 65 20 69 66 20 69 44 6c 69 64 78  * True if iDlidx
3cd0: 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f  Prev is valid */
3ce0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
3cf0: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
3d00: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67  through the merg
3d10: 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e  ed results of on
3d20: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
3d30: 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20  ts,.** visiting 
3d40: 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 20  each term/docid 
3d50: 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67  pair in the merg
3d60: 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e  ed data..**.** n
3d70: 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20  Seg is always a 
3d80: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65  power of two gre
3d90: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
3da0: 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  al to the number
3db0: 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20   of.** segments 
3dc0: 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74  that this object
3dd0: 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61   is merging data
3de0: 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20   from. Both the 
3df0: 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46  aSeg[] and.** aF
3e00: 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72  irst[] arrays ar
3e10: 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20  e sized at nSeg 
3e20: 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65  entries. The aSe
3e30: 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64  g[] array is pad
3e40: 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f  ded.** with zero
3e50: 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65  ed objects - the
3e60: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61  se are handled a
3e70: 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69  s if they were i
3e80: 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a  terators opened.
3e90: 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d  ** on empty segm
3ea0: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
3eb0: 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
3ec0: 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53  ring segments aS
3ed0: 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e  eg[N] and aSeg[N
3ee0: 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20  +1], where N is 
3ef0: 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65  an.** even numbe
3f00: 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  r, is stored in 
3f10: 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f  aFirst[(nSeg+N)/
3f20: 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22  2]. The "result"
3f30: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70   of the .** comp
3f40: 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63  arison in this c
3f50: 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e  ontext is the in
3f60: 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61  dex of the itera
3f70: 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74  tor that current
3f80: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
3f90: 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d  the smaller term
3fa0: 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
3fb0: 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74  on. Iterators at
3fc0: 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73   EOF are.** cons
3fd0: 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65  idered to be gre
3fe0: 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74  ater than all ot
3ff0: 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  her iterators..*
4000: 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63  *.** aFirst[1] c
4010: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
4020: 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74  x in aSeg[] of t
4030: 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  he iterator that
4040: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
4050: 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f  e smallest key o
4060: 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30  verall. aFirst[0
4070: 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f  ] is unused. .*/
4080: 0a 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c 74  .struct Fts5Mult
4090: 69 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e 74  iSegIter {.  int
40a0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40c0: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
40d0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
40e0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
40f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4100: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4110: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4120: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
4130: 61 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  aSeg;           
4140: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4150: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4160: 20 2a 2f 0a 20 20 75 31 36 20 2a 61 46 69 72 73   */.  u16 *aFirs
4170: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4180: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4190: 20 6d 65 72 67 65 20 73 74 61 74 65 20 28 73 65   merge state (se
41a0: 65 20 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a  e above) */.};..
41b0: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
41c0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
41d0: 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  gh a single segm
41e0: 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61  ent, visiting ea
41f0: 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a  ch term/docid.**
4200: 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67   pair in the seg
4210: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67  ment..**.** pSeg
4220: 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65  :.**   The segme
4230: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
4240: 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  rough..**.** iLe
4250: 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72  afPgno:.**   Cur
4260: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
4270: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67  umber within seg
4280: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ment..**.** iLea
4290: 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79  fOffset:.**   By
42a0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
42b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
42c0: 66 20 74 68 61 74 20 69 73 20 6f 6e 65 20 62 79  f that is one by
42d0: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
42e0: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 72 6f 77 69  of the.**   rowi
42f0: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
4300: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
4310: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
4320: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
4330: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
4340: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
4350: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
4360: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
4370: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
4380: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
4390: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
43a0: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
43b0: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
43c0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
43d0: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
43e0: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
43f0: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
4400: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
4410: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
4420: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
4430: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
4440: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
4450: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
4460: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
4470: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
4480: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
4490: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
44a0: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
44b0: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
44c0: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
44d0: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
44e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
44f0: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
4500: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
4510: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
4520: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
4530: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
4540: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
4550: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
4560: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
4570: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
4580: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
4590: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
45a0: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
45b0: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
45c0: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
45d0: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
45e0: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
45f0: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
4600: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
4610: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
4620: 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73 20   through docids 
4630: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
4640: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  er instead of th
4650: 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74  e.**     default
4660: 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65   descending orde
4670: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
4680: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
4690: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
46a0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
46b0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
46c0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
46d0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
46e0: 2a 2a 0a 2a 2a 20 20 20 20 20 45 61 63 68 20 74  **.**     Each t
46f0: 69 6d 65 20 61 20 6e 65 77 20 70 61 67 65 20 69  ime a new page i
4700: 73 20 6c 6f 61 64 65 64 2c 20 74 68 65 20 69 74  s loaded, the it
4710: 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  erator is set to
4720: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
4730: 20 20 20 20 20 66 69 6e 61 6c 20 72 6f 77 69 64       final rowid
4740: 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
4750: 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65 74  the aRowidOffset
4760: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  [] array is popu
4770: 6c 61 74 65 64 20 0a 2a 2a 20 20 20 20 20 77 69  lated .**     wi
4780: 74 68 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  th the byte offs
4790: 65 74 73 20 6f 66 20 61 6c 6c 20 72 65 6c 65 76  ets of all relev
47a0: 61 6e 74 20 72 6f 77 69 64 20 66 69 65 6c 64 73  ant rowid fields
47b0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 2a   on the page. .*
47c0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67  /.struct Fts5Seg
47d0: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 53 74 72  Iter {.  Fts5Str
47e0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
47f0: 53 65 67 3b 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg;     /* Segm
4800: 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ent to iterate t
4810: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
4820: 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
4830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
4840: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
4850: 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  n current leaf *
4860: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
4890: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
48a0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
48b0: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
48c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
48d0: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
48e0: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
48f0: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4900: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4910: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4920: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
4930: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
4940: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
4950: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
4960: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
4970: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4980: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4990: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
49a0: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
49b0: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
49c0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
49d0: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
49e0: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
49f0: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
4a00: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
4a10: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
4a20: 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  t;..  /* The fol
4a30: 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20  lowing are only 
4a40: 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35  used if the FTS5
4a50: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
4a60: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f   flag is set. */
4a70: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
4a80: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4a90: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e     /* Current en
4aa0: 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66  try in aRowidOff
4ab0: 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  set[] */.  int n
4ac0: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4ae0: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4af0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
4b00: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  rray */.  int *a
4b10: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
4b30: 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20  ay of offset to 
4b40: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a  rowid fields */.
4b50: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
4b60: 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20   *pDlidx;       
4b70: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
4b80: 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
4b90: 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61  x */..  /* Varia
4ba0: 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62  bles populated b
4bb0: 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20  ased on current 
4bc0: 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35  entry. */.  Fts5
4bd0: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4bf0: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
4c00: 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
4c30: 64 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  d */.};..#define
4c40: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
4c50: 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65 66 69  ETERM 0x01.#defi
4c60: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4c70: 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a 0a 2f  REVERSE 0x02.../
4c80: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
4c90: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
4ca0: 68 20 70 61 67 69 6e 61 74 65 64 20 64 61 74 61  h paginated data
4cb0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
4cc0: 43 68 75 6e 6b 49 74 65 72 20 7b 0a 20 20 46 74  ChunkIter {.  Ft
4cd0: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20  s5Data *pLeaf;  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4cf0: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
4d00: 74 61 2e 20 4e 55 4c 4c 20 2d 3e 20 45 4f 46 2e  ta. NULL -> EOF.
4d10: 20 2a 2f 0a 20 20 69 36 34 20 69 4c 65 61 66 52   */.  i64 iLeafR
4d20: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
4d30: 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74        /* Absolut
4d40: 65 20 72 6f 77 69 64 20 6f 66 20 63 75 72 72 65  e rowid of curre
4d50: 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74  nt leaf */.  int
4d60: 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d80: 52 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20  Remaining bytes 
4d90: 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61 64 20  of data to read 
4da0: 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  */..  /* Output 
4db0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
4dc0: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 68  /* Pointer to ch
4df0: 75 6e 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  unk of data */. 
4e00: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
4e30: 65 72 20 70 20 69 6e 20 62 79 74 65 73 20 2a 2f  er p in bytes */
4e40: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
4e50: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
4e60: 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c 65  through a single
4e70: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f   position list o
4e80: 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 72 75 63  n disk..*/.struc
4e90: 74 20 46 74 73 35 50 6f 73 49 74 65 72 20 7b 0a  t Fts5PosIter {.
4ea0: 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20    Fts5ChunkIter 
4eb0: 63 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  chunk;          
4ec0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 63 68 75    /* Current chu
4ed0: 6e 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  nk of data */.  
4ee0: 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e  /* Offset within
4f10: 20 63 68 75 6e 6b 20 64 61 74 61 20 2a 2f 0a 0a   chunk data */..
4f20: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e    int iCol;.  in
4f30: 74 20 69 50 6f 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  t iPos;.};../*.*
4f40: 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65  * Object for ite
4f50: 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74  rating through t
4f60: 68 65 20 63 6f 6e 65 6e 74 73 20 6f 66 20 61 20  he conents of a 
4f70: 73 69 6e 67 6c 65 20 69 6e 74 65 72 6e 61 6c 20  single internal 
4f80: 6e 6f 64 65 20 69 6e 20 0a 2a 2a 20 6d 65 6d 6f  node in .** memo
4f90: 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  ry..*/.struct Ft
4fa0: 73 35 4e 6f 64 65 49 74 65 72 20 7b 0a 20 20 2f  s5NodeIter {.  /
4fb0: 2a 20 49 6e 74 65 72 6e 61 6c 2e 20 53 65 74 20  * Internal. Set 
4fc0: 61 6e 64 20 6d 61 6e 61 67 65 64 20 62 79 20 66  and managed by f
4fd0: 74 73 35 4e 6f 64 65 49 74 65 72 58 58 58 28 29  ts5NodeIterXXX()
4fe0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 45 78 63 65   functions. Exce
4ff0: 70 74 2c 20 0a 20 20 2a 2a 20 74 68 65 20 45 4f  pt, .  ** the EO
5000: 46 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 69  F test for the i
5010: 74 65 72 61 74 6f 72 20 69 73 20 28 46 74 73 35  terator is (Fts5
5020: 4e 6f 64 65 49 74 65 72 2e 61 44 61 74 61 3d 3d  NodeIter.aData==
5030: 30 29 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  0).  */.  const 
5040: 75 38 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74  u8 *aData;.  int
5050: 20 6e 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 4f   nData;.  int iO
5060: 66 66 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ff;..  /* Output
5070: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5080: 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
5090: 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 0a 20  .  int nEmpty;. 
50a0: 20 69 6e 74 20 69 43 68 69 6c 64 3b 0a 20 20 69   int iChild;.  i
50b0: 6e 74 20 62 44 6c 69 64 78 3b 0a 7d 3b 0a 0a 2f  nt bDlidx;.};../
50c0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
50d0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
50e0: 67 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  g type is used t
50f0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
5100: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  h the contents.*
5110: 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2d 69  * of a doclist-i
5120: 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ndex record..**.
5130: 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 52  ** pData:.**   R
5140: 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69 6e 67  ecord containing
5150: 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
5160: 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62  ex data..**.** b
5170: 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f  Eof:.**   Set to
5180: 20 74 72 75 65 20 6f 6e 63 65 20 69 74 65 72 61   true once itera
5190: 74 6f 72 20 68 61 73 20 72 65 61 63 68 65 64 20  tor has reached 
51a0: 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a  EOF..**.** iOff:
51b0: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 68 65  .**   Set to the
51c0: 20 63 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   current offset 
51d0: 77 69 74 68 69 6e 20 72 65 63 6f 72 64 20 70 44  within record pD
51e0: 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ata..*/.struct F
51f0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 7b 0a 20  ts5DlidxIter {. 
5200: 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
5210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5220: 2a 20 44 61 74 61 20 66 6f 72 20 64 6f 63 6c 69  * Data for docli
5230: 73 74 20 69 6e 64 65 78 2c 20 69 66 20 61 6e 79  st index, if any
5240: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
5270: 66 66 73 65 74 20 69 6e 74 6f 20 70 44 6c 69 64  ffset into pDlid
5280: 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b  x */.  int bEof;
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61       /* At EOF a
52b0: 6c 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20  lready */.  int 
52c0: 69 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20  iFirstOff;      
52d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
52e0: 64 20 62 79 20 72 65 76 65 72 73 65 20 69 74 65  d by reverse ite
52f0: 72 61 74 6f 72 73 20 6f 6e 6c 79 20 2a 2f 0a 0a  rators only */..
5300: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
5310: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ables */.  int i
5320: 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20  LeafPgno;       
5330: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
5340: 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   number of curre
5350: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  nt leaf page */.
5360: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 2f 2a 20 46 69 72 73 74 20 72 6f 77 69 64 20 6f  /* First rowid o
5390: 6e 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f  n leaf iLeafPgno
53a0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
53b0: 6e 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20  n Fts5BtreeIter 
53c0: 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74  object is used t
53d0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
53e0: 68 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  h all entries in
53f0: 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65 20 68   the.** b-tree h
5400: 69 65 72 61 72 63 68 79 20 62 65 6c 6f 6e 67 69  ierarchy belongi
5410: 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 66  ng to a single f
5420: 74 73 35 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20  ts5 segment. In 
5430: 74 68 69 73 20 63 61 73 65 20 74 68 65 0a 2a 2a  this case the.**
5440: 20 22 62 2d 74 72 65 65 20 68 69 65 72 61 72 63   "b-tree hierarc
5450: 68 79 22 20 69 73 20 61 6c 6c 20 62 2d 74 72 65  hy" is all b-tre
5460: 65 20 6e 6f 64 65 73 20 65 78 63 65 70 74 20 6c  e nodes except l
5470: 65 61 76 65 73 2e 20 45 61 63 68 20 65 6e 74 72  eaves. Each entr
5480: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72  y in the.** b-tr
5490: 65 65 20 68 69 65 72 61 72 63 68 79 20 63 6f 6e  ee hierarchy con
54a0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 66 6f 6c  sists of the fol
54b0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
54c0: 69 4c 65 61 66 3a 20 20 54 68 65 20 70 61 67 65  iLeaf:  The page
54d0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
54e0: 65 61 66 20 70 61 67 65 20 74 68 65 20 65 6e 74  eaf page the ent
54f0: 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ry points to..**
5500: 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20 20 41 20  .**   term:   A 
5510: 73 70 6c 69 74 2d 6b 65 79 20 74 68 61 74 20 61  split-key that a
5520: 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c 65 61 66  ll terms on leaf
5530: 20 70 61 67 65 20 24 69 4c 65 61 66 20 6d 75 73   page $iLeaf mus
5540: 74 20 62 65 20 67 72 65 61 74 65 72 0a 2a 2a 20  t be greater.** 
5550: 20 20 20 20 20 20 20 20 20 20 74 68 61 6e 20 6f            than o
5560: 72 20 65 71 75 61 6c 20 74 6f 2e 20 54 68 65 20  r equal to. The 
5570: 22 74 65 72 6d 22 20 61 73 73 6f 63 69 61 74 65  "term" associate
5580: 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
5590: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 20 20   b-tree.**      
55a0: 20 20 20 20 20 68 69 65 72 61 72 63 68 79 20 65       hierarchy e
55b0: 6e 74 72 79 20 28 74 68 65 20 6f 6e 65 20 74 68  ntry (the one th
55c0: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c 65 61  at points to lea
55d0: 66 20 70 61 67 65 20 31 29 20 69 73 20 61 6c 77  f page 1) is alw
55e0: 61 79 73 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ays .**         
55f0: 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e    an empty strin
5600: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d 70 74  g..**.**   nEmpt
5610: 79 3a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  y: The number of
5620: 20 65 6d 70 74 79 20 28 74 65 72 6d 6c 65 73 73   empty (termless
5630: 29 20 6c 65 61 66 20 70 61 67 65 73 20 74 68 61  ) leaf pages tha
5640: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  t immediately.**
5650: 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f             follo
5660: 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a 0a 2a  wing iLeaf..**.*
5670: 2a 20 54 68 65 20 46 74 73 35 42 74 72 65 65 49  * The Fts5BtreeI
5680: 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 6e  ter object is on
5690: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
56a0: 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  of the integrity
56b0: 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a 2f 0a  -check code..*/.
56c0: 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65  struct Fts5Btree
56d0: 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20 46 74  IterLevel {.  Ft
56e0: 73 35 4e 6f 64 65 49 74 65 72 20 73 3b 20 20 20  s5NodeIter s;   
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5700: 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68   Iterator for th
5710: 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 2a  e current node *
5720: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
5730: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
5740: 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
5750: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
5760: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
5770: 73 35 42 74 72 65 65 49 74 65 72 20 7b 0a 20 20  s5BtreeIter {.  
5780: 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20  Fts5Index *p;   
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
57b0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
57c0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
57d0: 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 49   *pSeg;     /* I
57e0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
57f0: 68 69 73 20 73 65 67 6d 65 6e 74 27 73 20 62 2d  his segment's b-
5800: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49  tree */.  int iI
5810: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
5820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
5830: 65 78 20 70 53 65 67 20 62 65 6c 6f 6e 67 73 20  ex pSeg belongs 
5840: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 76 6c  to */.  int nLvl
5850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5860: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
5870: 6f 66 20 61 4c 76 6c 5b 5d 20 61 72 72 61 79 20  of aLvl[] array 
5880: 2a 2f 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  */.  Fts5BtreeIt
5890: 65 72 4c 65 76 65 6c 20 2a 61 4c 76 6c 3b 20 20  erLevel *aLvl;  
58a0: 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 66 6f       /* Level fo
58b0: 72 20 65 61 63 68 20 74 69 65 72 20 6f 66 20 62  r each tier of b
58c0: 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  -tree */..  /* O
58d0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
58e0: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
58f0: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
5900: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
5910: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  term */.  int iL
5920: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
5930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
5940: 66 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  f containing ter
5950: 6d 73 20 3e 3d 20 63 75 72 72 65 6e 74 20 74 65  ms >= current te
5960: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70  rm */.  int nEmp
5970: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
5980: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5990: 72 20 6f 66 20 22 65 6d 70 74 79 22 20 6c 65 61  r of "empty" lea
59a0: 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c  ves following iL
59b0: 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f  eaf */.  int bEo
59c0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
59d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
59e0: 74 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a  to true at EOF *
59f0: 2f 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b 20  /.  int bDlidx; 
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5a20: 68 65 72 65 20 65 78 69 73 74 73 20 61 20 64 6c  here exists a dl
5a30: 69 64 78 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  idx */.};.../*.*
5a40: 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65  * Decode a segme
5a50: 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72  nt-data rowid fr
5a60: 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
5a70: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
5a80: 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70  on is.** the opp
5a90: 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46  osite of macro F
5aa0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
5ab0: 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  D()..*/.static v
5ac0: 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f  oid fts5DecodeRo
5ad0: 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69  wid(.  i64 iRowi
5ae0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
5af0: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
5b00: 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c  from %_data tabl
5b10: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 49 64  e */.  int *piId
5b20: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
5b30: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49         /* OUT: I
5b40: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ndex */.  int *p
5b50: 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
5b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
5b70: 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  : Segment id */.
5b80: 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c    int *piHeight,
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74    /* OUT: Height
5bb0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e   */.  int *piPgn
5bc0: 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
5bd0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61        /* OUT: Pa
5be0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
5bf0: 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74    *piPgno = (int
5c00: 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
5c10: 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
5c20: 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a  _PAGE_B) - 1));.
5c30: 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
5c40: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a  5_DATA_PAGE_B;..
5c50: 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69    *piHeight = (i
5c60: 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
5c70: 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
5c80: 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31  TA_HEIGHT_B) - 1
5c90: 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
5ca0: 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
5cb0: 54 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64  T_B;..  *piSegid
5cc0: 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
5cd0: 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
5ce0: 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20  S5_DATA_ID_B) - 
5cf0: 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  1));.  iRowid >>
5d00: 3d 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  = FTS5_DATA_ID_B
5d10: 3b 0a 0a 20 20 2a 70 69 49 64 78 20 3d 20 28 69  ;..  *piIdx = (i
5d20: 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
5d30: 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
5d40: 54 41 5f 49 44 58 5f 42 29 20 2d 20 31 29 29 3b  TA_IDX_B) - 1));
5d50: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
5d60: 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 69  fts5DebugRowid(i
5d70: 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
5d80: 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
5d90: 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 49 64 78  Key){.  int iIdx
5da0: 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c  ,iSegid,iHeight,
5db0: 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77 69 64  iPgno;  /* Rowid
5dc0: 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20   compenents */. 
5dd0: 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
5de0: 28 69 4b 65 79 2c 20 26 69 49 64 78 2c 20 26 69  (iKey, &iIdx, &i
5df0: 53 65 67 69 64 2c 20 26 69 48 65 69 67 68 74 2c  Segid, &iHeight,
5e00: 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28   &iPgno);..  if(
5e10: 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
5e20: 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35    if( iKey==FTS5
5e30: 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
5e40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5e50: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
5e60: 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
5e70: 2c 20 22 28 61 76 65 72 61 67 65 73 29 20 22 29  , "(averages) ")
5e80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5e90: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
5ea0: 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
5eb0: 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20  (pRc, pBuf, .   
5ec0: 20 20 20 20 20 20 20 22 7b 73 74 72 75 63 74 75         "{structu
5ed0: 72 65 20 69 64 78 3d 25 64 7d 22 2c 20 28 69 6e  re idx=%d}", (in
5ee0: 74 29 28 69 4b 65 79 2d 31 30 29 0a 20 20 20 20  t)(iKey-10).    
5ef0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    );.    }.  }. 
5f00: 20 65 6c 73 65 20 69 66 28 20 69 48 65 69 67 68   else if( iHeigh
5f10: 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  t==FTS5_SEGMENT_
5f20: 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a 20 20  MAX_HEIGHT ){.  
5f30: 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
5f40: 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
5f50: 70 52 63 2c 20 70 42 75 66 2c 20 22 28 64 6c 69  pRc, pBuf, "(dli
5f60: 64 78 20 69 64 78 3d 25 64 20 73 65 67 69 64 3d  dx idx=%d segid=
5f70: 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20  %d pgno=%d)",.  
5f80: 20 20 20 20 20 20 69 49 64 78 2c 20 69 53 65 67        iIdx, iSeg
5f90: 69 64 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b  id, iPgno.    );
5fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
5fb0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
5fc0: 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
5fd0: 20 70 42 75 66 2c 20 22 28 69 64 78 3d 25 64 20   pBuf, "(idx=%d 
5fe0: 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67  segid=%d h=%d pg
5ff0: 6e 6f 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20  no=%d)",.       
6000: 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69   iIdx, iSegid, i
6010: 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20  Height, iPgno.  
6020: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74    );.  }.}..stat
6030: 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
6040: 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  gStructure(.  in
6050: 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6070: 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
6080: 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
6090: 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73  fer *pBuf,.  Fts
60a0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b  5Structure *p.){
60b0: 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65  .  int iLvl, iSe
60c0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
60d0: 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
60e0: 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65  rough levels, se
60f0: 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72  gments */..  for
6100: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d  (iLvl=0; iLvl<p-
6110: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
6120: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
6130: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
6140: 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c   &p->aLevel[iLvl
6150: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ];.    sqlite3Ft
6160: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
6170: 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
6180: 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d  .        " {lvl=
6190: 25 64 20 6e 4d 65 72 67 65 3d 25 64 22 2c 20 69  %d nMerge=%d", i
61a0: 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  Lvl, pLvl->nMerg
61b0: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72  e.    );.    for
61c0: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c  (iSeg=0; iSeg<pL
61d0: 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl->nSeg; iSeg++
61e0: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
61f0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
6200: 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
6210: 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 73  g[iSeg];.      s
6220: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
6230: 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
6240: 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , pBuf, .       
6250: 20 20 20 22 20 7b 69 64 3d 25 64 20 68 3d 25 64     " {id=%d h=%d
6260: 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22   leaves=%d..%d}"
6270: 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
6280: 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20 0a  pSeg->nHeight, .
6290: 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e            pSeg->
62a0: 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d  pgnoFirst, pSeg-
62b0: 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20  >pgnoLast.      
62c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
62d0: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
62e0: 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
62f0: 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a  pBuf, "}");.  }.
6300: 7d 0a 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }....static void
6310: 20 66 74 73 35 50 75 74 55 31 36 28 75 38 20 2a   fts5PutU16(u8 *
6320: 61 4f 75 74 2c 20 75 31 36 20 69 56 61 6c 29 7b  aOut, u16 iVal){
6330: 0a 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56  .  aOut[0] = (iV
6340: 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31  al>>8);.  aOut[1
6350: 5d 20 3d 20 28 69 56 61 6c 26 30 78 46 46 29 3b  ] = (iVal&0xFF);
6360: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 31 36 20 66  .}..static u16 f
6370: 74 73 35 47 65 74 55 31 36 28 63 6f 6e 73 74 20  ts5GetU16(const 
6380: 75 38 20 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75  u8 *aIn){.  retu
6390: 72 6e 20 28 28 75 31 36 29 61 49 6e 5b 30 5d 20  rn ((u16)aIn[0] 
63a0: 3c 3c 20 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a  << 8) + aIn[1];.
63b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
63c0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 62  e and return a b
63d0: 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 6e  uffer at least n
63e0: 42 79 74 65 20 62 79 74 65 73 20 69 6e 20 73 69  Byte bytes in si
63f0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
6400: 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
6410: 6f 75 6e 74 65 72 65 64 2c 20 72 65 74 75 72 6e  ountered, return
6420: 20 4e 55 4c 4c 20 61 6e 64 20 73 65 74 20 74 68   NULL and set th
6430: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 0a  e error code in.
6440: 2a 2a 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  ** the Fts5Index
6450: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
6460: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
6470: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
6480: 76 6f 69 64 20 2a 66 74 73 35 49 64 78 4d 61 6c  void *fts5IdxMal
6490: 6c 6f 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70  loc(Fts5Index *p
64a0: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
64b0: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 61 73  void *pRet;.  as
64c0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
64d0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 52 65 74  ITE_OK );.  pRet
64e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
64f0: 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  c(nByte);.  if( 
6500: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pRet==0 ){.    p
6510: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
6520: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
6530: 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
6540: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
6550: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
6560: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
6570: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74 20  5MallocZero(int 
6580: 2a 70 52 63 2c 20 69 6e 74 20 6e 42 79 74 65 29  *pRc, int nByte)
6590: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d  {.  void *pRet =
65a0: 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
65b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
65c0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f   pRet = sqlite3_
65d0: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
65e0: 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26     if( pRet==0 &
65f0: 26 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20 20 20  & nByte>0 ){.   
6600: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
6610: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
6620: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
6630: 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  pRet, 0, nByte);
6640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6650: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
6660: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63  ** Compare the c
6670: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
6680: 4c 65 66 74 20 62 75 66 66 65 72 20 77 69 74 68  Left buffer with
6690: 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67   the pRight/nRig
66a0: 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52  ht blob..**.** R
66b0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
66c0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
66d0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
66e0: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
66f0: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
6700: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
6710: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
6720: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
6730: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
6740: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
6750: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
6760: 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a  ferCompareBlob(.
6770: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c    Fts5Buffer *pL
6780: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
6790: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73    /* Left hand s
67a0: 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ide of compariso
67b0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
67c0: 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69  *pRight, int nRi
67d0: 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ght    /* Right 
67e0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d  hand side of com
67f0: 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  parison */.){.  
6800: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
6810: 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29  Left->n, nRight)
6820: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
6830: 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70  mcmp(pLeft->p, p
6840: 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20  Right, nCmp);.  
6850: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
6860: 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69   (pLeft->n - nRi
6870: 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a  ght) : res);.}..
6880: 23 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74  #if 0.static int
6890: 20 66 74 73 35 43 6f 6d 70 61 72 65 42 6c 6f 62   fts5CompareBlob
68a0: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c  (.  const u8 *pL
68b0: 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 0a  eft, int nLeft,.
68c0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67    const u8 *pRig
68d0: 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29  ht, int nRight.)
68e0: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
68f0: 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74  IN(nLeft, nRight
6900: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
6910: 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69  emcmp(pLeft, pRi
6920: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
6930: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
6940: 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20  nLeft - nRight) 
6950: 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66  : res);.}.#endif
6960: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
6970: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
6980: 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20  the two buffers 
6990: 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
69a0: 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a  If one buffer.**
69b0: 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
69c0: 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73  the other, it is
69d0: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20   considered the 
69e0: 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  lesser..**.** Re
69f0: 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66  turn -ve if pLef
6a00: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
6a10: 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74  n pRight, 0 if t
6a20: 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72  hey are equal or
6a30: 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68  .** +ve if pRigh
6a40: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
6a50: 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65  n pLeft. In othe
6a60: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  r words:.**.**  
6a70: 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20     res = *pLeft 
6a80: 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61  - *pRight.*/.sta
6a90: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
6aa0: 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75  erCompare(Fts5Bu
6ab0: 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73  ffer *pLeft, Fts
6ac0: 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74 29  5Buffer *pRight)
6ad0: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
6ae0: 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69  IN(pLeft->n, pRi
6af0: 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72  ght->n);.  int r
6b00: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66  es = memcmp(pLef
6b10: 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c  t->p, pRight->p,
6b20: 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e   nCmp);.  return
6b30: 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66   (res==0 ? (pLef
6b40: 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e  t->n - pRight->n
6b50: 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a  ) : res);.}.../*
6b60: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
6b70: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
6b80: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
6b90: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
6ba0: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
6bb0: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
6bc0: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
6bd0: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
6be0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e  3_blob_close(p->
6bf0: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 70 2d  pReader);.    p-
6c00: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
6c10: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35  }.}..static Fts5
6c20: 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52 65  Data *fts5DataRe
6c30: 61 64 4f 72 42 75 66 66 65 72 28 0a 20 20 46 74  adOrBuffer(.  Ft
6c40: 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
6c50: 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
6c60: 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29   .  i64 iRowid.)
6c70: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52  {.  Fts5Data *pR
6c80: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  et = 0;.  if( p-
6c90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
6ca0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  {.    int rc = S
6cb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30  QLITE_OK;..#if 0
6cc0: 0a 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20  .Fts5Buffer buf 
6cd0: 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 66 74 73 35 44  = {0,0,0};.fts5D
6ce0: 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26  ebugRowid(&rc, &
6cf0: 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 66 70  buf, iRowid);.fp
6d00: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72  rintf(stdout, "r
6d10: 65 61 64 3a 20 25 73 5c 6e 22 2c 20 62 75 66 2e  ead: %s\n", buf.
6d20: 70 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75  p);.fflush(stdou
6d30: 74 29 3b 0a 73 71 6c 69 74 65 33 5f 66 72 65 65  t);.sqlite3_free
6d40: 28 62 75 66 2e 70 29 3b 0a 23 65 6e 64 69 66 0a  (buf.p);.#endif.
6d50: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64      if( p->pRead
6d60: 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  er ){.      /* T
6d70: 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74  his call may ret
6d80: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
6d90: 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
6da0: 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20  en a savepoint. 
6db0: 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
6dc0: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
6dd0: 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73  st used. In this
6de0: 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62   case a new blob
6df0: 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a   handle.      **
6e00: 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
6e10: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
6e20: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
6e30: 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 69 52 6f  (p->pReader, iRo
6e40: 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
6e50: 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  rc==SQLITE_ABORT
6e60: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
6e70: 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
6e80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
6e90: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
6ea0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
6eb0: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
6ec0: 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
6ed0: 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65 65 6b 20  , open and seek 
6ee0: 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  it. Otherwise, u
6ef0: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6c  se.    ** the bl
6f00: 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41 50 49 20  ob_reopen() API 
6f10: 74 6f 20 72 65 73 65 65 6b 20 74 68 65 20 65 78  to reseek the ex
6f20: 69 73 74 69 6e 67 20 62 6c 6f 62 20 68 61 6e 64  isting blob hand
6f30: 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
6f40: 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 7b  p->pReader==0 ){
6f50: 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e 66 69  .      Fts5Confi
6f60: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
6f70: 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20 72  pConfig;.      r
6f80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
6f90: 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64  _open(pConfig->d
6fa0: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43  b, .          pC
6fb0: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
6fc0: 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22  DataTbl, "block"
6fd0: 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26 70 2d  , iRowid, 0, &p-
6fe0: 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20 20 29  >pReader.      )
6ff0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
7000: 20 72 63 20 29 20 66 74 73 35 4d 69 73 73 69 6e   rc ) fts5Missin
7010: 67 44 61 74 61 28 29 3b 0a 0a 20 20 20 20 69 66  gData();..    if
7020: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7030: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
7040: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  te = sqlite3_blo
7050: 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61 64  b_bytes(p->pRead
7060: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
7070: 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Buf ){.        f
7080: 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42  ts5BufferZero(pB
7090: 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  uf);.        fts
70a0: 35 42 75 66 66 65 72 47 72 6f 77 28 26 72 63 2c  5BufferGrow(&rc,
70b0: 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
70c0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
70d0: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d  te3_blob_read(p-
70e0: 3e 70 52 65 61 64 65 72 2c 20 70 42 75 66 2d 3e  >pReader, pBuf->
70f0: 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  p, nByte, 0);.  
7100: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
7110: 4c 49 54 45 5f 4f 4b 20 29 20 70 42 75 66 2d 3e  LITE_OK ) pBuf->
7120: 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  n = nByte;.     
7130: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7140: 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74 61  pRet = (Fts5Data
7150: 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
7160: 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61  p, sizeof(Fts5Da
7170: 74 61 29 20 2b 20 6e 42 79 74 65 29 3b 0a 20 20  ta) + nByte);.  
7180: 20 20 20 20 20 20 69 66 28 20 21 70 52 65 74 20        if( !pRet 
7190: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
71a0: 20 20 20 20 20 70 52 65 74 2d 3e 6e 20 3d 20 6e       pRet->n = n
71b0: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52  Byte;.        pR
71c0: 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 52  et->p = (u8*)&pR
71d0: 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 70  et[1];.        p
71e0: 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Ret->nRef = 1;. 
71f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7200: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d  te3_blob_read(p-
7210: 3e 70 52 65 61 64 65 72 2c 20 70 52 65 74 2d 3e  >pReader, pRet->
7220: 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  p, nByte, 0);.  
7230: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
7240: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7250: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7260: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
7270: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
7280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7290: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d     }.    p->rc =
72a0: 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61   rc;.    p->nRea
72b0: 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  d++;.  }..  retu
72c0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
72d0: 2a 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63  * Retrieve a rec
72e0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ord from the %_d
72f0: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ata table..**.**
7300: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
7310: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
7320: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
7330: 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a  or left in the .
7340: 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  ** Fts5Index obj
7350: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ect..*/.static F
7360: 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74  ts5Data *fts5Dat
7370: 61 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  aRead(Fts5Index 
7380: 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  *p, i64 iRowid){
7390: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65  .  Fts5Data *pRe
73a0: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
73b0: 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20 69  OrBuffer(p, 0, i
73c0: 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72 74  Rowid);.  assert
73d0: 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d  ( (pRet==0)==(p-
73e0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  >rc!=SQLITE_OK) 
73f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
7400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
7410: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
7420: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
7430: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73  nto the buffer s
7440: 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a  upplied as the.*
7450: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
7460: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
7470: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
7480: 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69 6e  error is left in
7490: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
74a0: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
74b0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
74c0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
74d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
74e0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
74f0: 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73   .** no-op..*/.s
7500: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
7510: 61 74 61 42 75 66 66 65 72 28 46 74 73 35 49 6e  ataBuffer(Fts5In
7520: 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66 66  dex *p, Fts5Buff
7530: 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 52  er *pBuf, i64 iR
7540: 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 66  owid){.  (void)f
7550: 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66  ts5DataReadOrBuf
7560: 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52 6f  fer(p, pBuf, iRo
7570: 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  wid);.}../*.** R
7580: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
7590: 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72  ce to data recor
75a0: 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  d returned by an
75b0: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
75c0: 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64  .** fts5DataRead
75d0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
75e0: 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  id fts5DataRelea
75f0: 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61  se(Fts5Data *pDa
7600: 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61 74 61  ta){.  if( pData
7610: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7620: 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30 20 29 3b  pData->nRef>0 );
7630: 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 52 65 66  .    pData->nRef
7640: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74  --;.    if( pDat
7650: 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  a->nRef==0 ) sql
7660: 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29  ite3_free(pData)
7670: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
7680: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 66  void fts5DataRef
7690: 65 72 65 6e 63 65 28 46 74 73 35 44 61 74 61 20  erence(Fts5Data 
76a0: 2a 70 44 61 74 61 29 7b 0a 20 20 70 44 61 74 61  *pData){.  pData
76b0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nRef++;.}../*.
76c0: 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50  ** INSERT OR REP
76d0: 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e  LACE a record in
76e0: 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  to the %_data ta
76f0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
7700: 6f 69 64 20 66 74 73 35 44 61 74 61 57 72 69 74  oid fts5DataWrit
7710: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
7720: 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73  i64 iRowid, cons
7730: 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74  t u8 *pData, int
7740: 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70   nData){.  if( p
7750: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
7760: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
7770: 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29   p->pWriter==0 )
7780: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
7790: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
77a0: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
77b0: 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ig;.    char *zS
77c0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
77d0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 52  intf(.        "R
77e0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71 27  EPLACE INTO '%q'
77f0: 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56  .%Q(id, block) V
7800: 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70 43 6f  ALUES(?,?)", pCo
7810: 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
7820: 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20  ataTbl.    );.  
7830: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
7840: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
7850: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
7860: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
7870: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
7880: 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  v2(pConfig->db, 
7890: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 57  zSql, -1, &p->pW
78a0: 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  riter, 0);.     
78b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
78c0: 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
78d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
78e0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
78f0: 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
7900: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
7910: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7920: 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20  t64(p->pWriter, 
7930: 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71  1, iRowid);.  sq
7940: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
7950: 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70  p->pWriter, 2, p
7960: 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c  Data, nData, SQL
7970: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
7980: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
7990: 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63  Writer);.  p->rc
79a0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
79b0: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a  (p->pWriter);.}.
79c0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  ./*.** Execute t
79d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
79e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45  :.**.**     DELE
79f0: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57  TE FROM %_data W
7a00: 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20  HERE id BETWEEN 
7a10: 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61  $iFirst AND $iLa
7a20: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  st.*/.static voi
7a30: 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65  d fts5DataDelete
7a40: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
7a50: 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69  64 iFirst, i64 i
7a60: 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Last){.  if( p->
7a70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7a80: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
7a90: 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  ->pDeleter==0 ){
7aa0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
7ab0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
7ac0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
7ad0: 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  g;.    char *zSq
7ae0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
7af0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 44 45  ntf(.        "DE
7b00: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 25  LETE FROM '%q'.%
7b10: 51 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e  Q WHERE id>=? AN
7b20: 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66 69  D id<=?", pConfi
7b30: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
7b40: 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Tbl.    );.    i
7b50: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
7b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7b70: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
7b80: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7b90: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7ba0: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
7bb0: 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65  l, -1, &p->pDele
7bc0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
7bd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
7be0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7bf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7c00: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
7c10: 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
7c20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
7c30: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
7c40: 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31  4(p->pDeleter, 1
7c50: 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71 6c  , iFirst);.  sql
7c60: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
7c70: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c 20  p->pDeleter, 2, 
7c80: 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  iLast);.  sqlite
7c90: 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74  3_step(p->pDelet
7ca0: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
7cb0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
7cc0: 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  pDeleter);.}../*
7cd0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 73 71  .** Close the sq
7ce0: 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e 64 6c  lite3_blob handl
7cf0: 65 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 72  e used to read r
7d00: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
7d10: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a  %_data table..**
7d20: 20 41 6e 64 20 64 69 73 63 61 72 64 20 61 6e 79   And discard any
7d30: 20 63 61 63 68 65 64 20 72 65 61 64 73 2e 20 54   cached reads. T
7d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7d50: 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 65 6e  called at the en
7d60: 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64 20 74  d of.** a read t
7d70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 77 68  ransaction or wh
7d80: 65 6e 20 61 6e 79 20 73 75 62 2d 74 72 61 6e 73  en any sub-trans
7d90: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
7da0: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
7db0: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
7dc0: 73 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  set(Fts5Index *p
7dd0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  ){.  if( p->pRea
7de0: 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  der ){.    sqlit
7df0: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d  e3_blob_close(p-
7e00: 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 70  >pReader);.    p
7e10: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
7e20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
7e30: 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61  ve all records a
7e40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
7e50: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 20 69 6e  egment iSegid in
7e60: 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2f 0a   index iIdx..*/.
7e70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7e80: 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e  DataRemoveSegmen
7e90: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
7ea0: 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53  int iIdx, int iS
7eb0: 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69  egid){.  i64 iFi
7ec0: 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  rst = FTS5_SEGME
7ed0: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69  NT_ROWID(iIdx, i
7ee0: 53 65 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20  Segid, 0, 0);.  
7ef0: 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35  i64 iLast = FTS5
7f00: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
7f10: 49 64 78 2c 20 69 53 65 67 69 64 2b 31 2c 20 30  Idx, iSegid+1, 0
7f20: 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61  , 0)-1;.  fts5Da
7f30: 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72  taDelete(p, iFir
7f40: 73 74 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a 2f  st, iLast);.}../
7f50: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
7f60: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
7f70: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
7f80: 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
7f90: 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a  d in serialized.
7fa0: 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62  ** form within b
7fb0: 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74  uffer pData/nDat
7fc0: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  a..**.** The Fts
7fd0: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
7fe0: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
7ff0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
8000: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
8010: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
8020: 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20  ed by one slot. 
8030: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
8040: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e  structure conten
8050: 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65  ts.** to be more
8060: 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a   easily edited..
8070: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8080: 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74  r occurs, *ppOut
8090: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
80a0: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
80b0: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75  ror code.** retu
80c0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
80d0: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
80e0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
80f0: 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a  ew object and.**
8100: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
8110: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8120: 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65  nt fts5Structure
8130: 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  Decode(.  const 
8140: 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  u8 *pData,      
8150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
8160: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  fer containing s
8170: 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74  erialized struct
8180: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ure */.  int nDa
8190: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
81a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
81b0: 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74 61   of buffer pData
81c0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46   in bytes */.  F
81d0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
81e0: 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f  pOut           /
81f0: 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69  * OUT: Deseriali
8200: 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  zed object */.){
8210: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8220: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d  TE_OK;.  int i =
8230: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a   0;.  int iLvl;.
8240: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30    int nLevel = 0
8250: 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  ;.  int nSegment
8260: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74   = 0;.  int nByt
8270: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8280: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
8290: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
82a0: 6f 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f  ocate at pRet */
82b0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
82c0: 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
82d0: 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20     /* Structure 
82e0: 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e  object to return
82f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
8300: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8310: 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65  of levels and se
8320: 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
8330: 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a  start of the.  *
8340: 2a 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  * structure reco
8350: 72 64 2e 20 20 2a 2f 0a 20 20 69 20 3d 20 67 65  rd.  */.  i = ge
8360: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
8370: 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20  [i], nLevel);.  
8380: 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
8390: 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53 65 67  (&pData[i], nSeg
83a0: 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65 20 3d  ment);.  nByte =
83b0: 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28   (.      sizeof(
83c0: 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b  Fts5Structure) +
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75      /* Main stru
83f0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 73  cture */.      s
8400: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
8410: 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65  ureLevel) * (nLe
8420: 76 65 6c 29 20 20 20 20 20 20 2f 2a 20 61 4c 65  vel)      /* aLe
8430: 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vel[] array */. 
8440: 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46 74   );.  pRet = (Ft
8450: 73 35 53 74 72 75 63 74 75 72 65 2a 29 66 74 73  s5Structure*)fts
8460: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
8470: 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20   nByte);..  if( 
8480: 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74  pRet ){.    pRet
8490: 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65  ->nLevel = nLeve
84a0: 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  l;.    i += sqli
84b0: 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 70 44  te3GetVarint(&pD
84c0: 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e  ata[i], &pRet->n
84d0: 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a  WriteCounter);..
84e0: 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
84f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8500: 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c   iLvl<nLevel; iL
8510: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  vl++){.      Fts
8520: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
8530: 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61  *pLvl = &pRet->a
8540: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
8550: 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20     int nTotal;. 
8560: 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a       int iSeg;..
8570: 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61        i += getVa
8580: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
8590: 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b  , pLvl->nMerge);
85a0: 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56  .      i += getV
85b0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
85c0: 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20  ], nTotal);.    
85d0: 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61 6c    assert( nTotal
85e0: 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  >=pLvl->nMerge )
85f0: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53  ;.      pLvl->aS
8600: 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
8610: 75 72 65 53 65 67 6d 65 6e 74 2a 29 66 74 73 35  ureSegment*)fts5
8620: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
8630: 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61  .          nTota
8640: 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  l * sizeof(Fts5S
8650: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
8660: 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
8670: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8680: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  OK ){.        pL
8690: 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61  vl->nSeg = nTota
86a0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
86b0: 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74  Seg=0; iSeg<nTot
86c0: 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  al; iSeg++){.   
86d0: 20 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56         i += getV
86e0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
86f0: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
8700: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
8710: 20 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56         i += getV
8720: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8730: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
8740: 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20  eg].nHeight);.  
8750: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74          i += get
8760: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8770: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
8780: 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg].pgnoFirst);
8790: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
87a0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  getVarint32(&pDa
87b0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
87c0: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74  g[iSeg].pgnoLast
87d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
87e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
87f0: 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b    *ppOut = pRet;
8800: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8810: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
8820: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8830: 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20  ureAddLevel(int 
8840: 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74  *pRc, Fts5Struct
8850: 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b  ure **ppStruct){
8860: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
8870: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
8880: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
8890: 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
88a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c  ;.    int nLevel
88b0: 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
88c0: 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  el;.    int nByt
88d0: 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69  e = (.        si
88e0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
88f0: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
8900: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
8910: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
8920: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
8930: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
8940: 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20   (nLevel+1)  /* 
8950: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
8960: 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53  /.    );..    pS
8970: 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f  truct = sqlite3_
8980: 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c  realloc(pStruct,
8990: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
89a0: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
89b0: 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63    memset(&pStruc
89c0: 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c  t->aLevel[nLevel
89d0: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
89e0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
89f0: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
8a00: 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20  ->nLevel++;.    
8a10: 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
8a20: 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65  truct;.    }else
8a30: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
8a40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8a50: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8a60: 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76  Extend level iLv
8a70: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  l so that there 
8a80: 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c  is room for at l
8a90: 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65  east nExtra more
8aa0: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f  .** segments..*/
8ab0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8ac0: 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
8ad0: 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52  Level(.  int *pR
8ae0: 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74  c, .  Fts5Struct
8af0: 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20  ure *pStruct, . 
8b00: 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e   int iLvl, .  in
8b10: 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74  t nExtra, .  int
8b20: 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66   bInsert.){.  if
8b30: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
8b40: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
8b50: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
8b60: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
8b70: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
8b80: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
8b90: 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20  ment *aNew;.    
8ba0: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
8bb0: 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nByte = (pLvl->n
8bc0: 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20  Seg + nExtra) * 
8bd0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
8be0: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
8bf0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
8c00: 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61  _realloc(pLvl->a
8c10: 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Seg, nByte);.   
8c20: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
8c30: 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d     if( bInsert==
8c40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
8c50: 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e  set(&aNew[pLvl->
8c60: 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSeg], 0, sizeof
8c70: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
8c80: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
8c90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8ca0: 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65         int nMove
8cb0: 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20   = pLvl->nSeg * 
8cc0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
8cd0: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
8ce0: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61        memmove(&a
8cf0: 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65  New[nExtra], aNe
8d00: 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20  w, nMove);.     
8d10: 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20     memset(aNew, 
8d20: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
8d30: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20  ructureSegment) 
8d40: 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  * nExtra);.     
8d50: 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61   }.      pLvl->a
8d60: 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Seg = aNew;.    
8d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
8d80: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8d90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8da0: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
8db0: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
8dc0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
8dd0: 72 65 63 6f 72 64 20 66 6f 72 20 69 6e 64 65 78  record for index
8de0: 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iIdx..**.** The
8df0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61   Fts5Structure.a
8e00: 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68  Level[] and each
8e10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
8e20: 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79  vel.aSeg[] array
8e30: 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c  .** are over-all
8e40: 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72 69  ocated as descri
8e50: 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  bed for function
8e60: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
8e70: 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65  code() .** above
8e80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
8e90: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
8ea0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
8eb0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c   an error code l
8ec0: 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74  eft in the.** Ft
8ed0: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
8ee0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
8ef0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
8f00: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
8f10: 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
8f20: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
8f30: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 53  .*/.static Fts5S
8f40: 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74  tructure *fts5St
8f50: 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73 35  ructureRead(Fts5
8f60: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49  Index *p, int iI
8f70: 64 78 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  dx){.  Fts5Confi
8f80: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
8f90: 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 53  pConfig;.  Fts5S
8fa0: 74 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d  tructure *pRet =
8fb0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 62   0;        /* Ob
8fc0: 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a  ject to return *
8fd0: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
8fe0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
8ff0: 20 20 20 20 2f 2a 20 25 5f 64 61 74 61 20 65 6e      /* %_data en
9000: 74 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  try containing s
9010: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
9020: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 49  */..  assert( iI
9030: 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
9040: 65 66 69 78 20 29 3b 0a 20 20 70 44 61 74 61 20  efix );.  pData 
9050: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
9060: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
9070: 5f 52 4f 57 49 44 28 69 49 64 78 29 29 3b 0a 20  _ROWID(iIdx));. 
9080: 20 69 66 28 20 21 70 44 61 74 61 20 29 20 72 65   if( !pData ) re
9090: 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 72 63 20  turn 0;.  p->rc 
90a0: 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  = fts5StructureD
90b0: 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20  ecode(pData->p, 
90c0: 70 44 61 74 61 2d 3e 6e 2c 20 26 70 52 65 74 29  pData->n, &pRet)
90d0: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
90e0: 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72  ease(pData);.  r
90f0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
9100: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
9110: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46  eference to an F
9120: 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
9130: 65 63 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  ect returned by 
9140: 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63  an earlier .** c
9150: 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63  all to fts5Struc
9160: 74 75 72 65 52 65 61 64 28 29 20 6f 72 20 66 74  tureRead() or ft
9170: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
9180: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
9190: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
91a0: 65 52 65 6c 65 61 73 65 28 46 74 73 35 53 74 72  eRelease(Fts5Str
91b0: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
91c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
91d0: 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d  (i=0; i<pStruct-
91e0: 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
91f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9200: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9210: 69 5d 2e 61 53 65 67 29 3b 0a 20 20 7d 0a 20 20  i].aSeg);.  }.  
9220: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
9230: 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ruct);.}../*.** 
9240: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
9250: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
9260: 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72  nts in index str
9270: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a  ucture pStruct..
9280: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
9290: 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
92a0: 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72  Segments(Fts5Str
92b0: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
92c0: 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  {.  int nSegment
92d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
92e0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
92f0: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
9300: 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  */.  int iLvl;  
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
9330: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
9340: 6c 65 76 65 6c 73 20 2a 2f 0a 0a 20 20 66 6f 72  levels */..  for
9350: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
9360: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
9370: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 6e 53 65 67  Lvl++){.    nSeg
9380: 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d  ment += pStruct-
9390: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
93a0: 65 67 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  eg;.  }..  retur
93b0: 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f  n nSegment;.}../
93c0: 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61  *.** Serialize a
93d0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74  nd store the "st
93e0: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20  ructure" record 
93f0: 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a  for index iIdx..
9400: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
9410: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
9420: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  an error code in
9430: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
9440: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
9450: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
9460: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
9470: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
9480: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
9490: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
94a0: 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  reWrite(Fts5Inde
94b0: 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20  x *p, int iIdx, 
94c0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
94d0: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e  Struct){.  int n
94e0: 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20  Segment;        
94f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
9500: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
9510: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35  gments */.  Fts5
9520: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
9530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
9540: 75 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69  uffer to seriali
9550: 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a  ze record into *
9560: 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20  /.  int iLvl;   
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9580: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
9590: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
95a0: 65 76 65 6c 73 20 2a 2f 0a 0a 20 20 6e 53 65 67  evels */..  nSeg
95b0: 6d 65 6e 74 20 3d 20 66 74 73 35 53 74 72 75 63  ment = fts5Struc
95c0: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
95d0: 73 28 70 53 74 72 75 63 74 29 3b 0a 20 20 6d 65  s(pStruct);.  me
95e0: 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
95f0: 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
9600: 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
9610: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
9620: 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63  rc, &buf, pStruc
9630: 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 66 74  t->nLevel);.  ft
9640: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9650: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9660: 66 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20  f, nSegment);.  
9670: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9680: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9690: 62 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63  buf, (i64)pStruc
96a0: 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
96b0: 29 3b 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30  );..  for(iLvl=0
96c0: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
96d0: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
96e0: 0a 20 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20  .    int iSeg;  
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9710: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65  erate through se
9720: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 46 74  gments */.    Ft
9730: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9740: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
9750: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
9760: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
9770: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
9780: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
9790: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 66 74 73  nMerge);.    fts
97a0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
97b0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
97c0: 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20  , pLvl->nSeg);. 
97d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
97e0: 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
97f0: 53 65 67 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  Seg );..    for(
9800: 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76  iSeg=0; iSeg<pLv
9810: 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l->nSeg; iSeg++)
9820: 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
9830: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
9840: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
9850: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l->aSeg[iSeg].iS
9860: 65 67 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73  egid);.      fts
9870: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
9880: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
9890: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
98a0: 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  g].nHeight);.   
98b0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
98c0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
98d0: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
98e0: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
98f0: 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  st);.      fts5B
9900: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
9910: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
9920: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
9930: 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20  .pgnoLast);.    
9940: 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  }.  }..  fts5Dat
9950: 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53  aWrite(p, FTS5_S
9960: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69  TRUCTURE_ROWID(i
9970: 49 64 78 29 2c 20 62 75 66 2e 70 2c 20 62 75 66  Idx), buf.p, buf
9980: 2e 6e 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  .n);.  fts5Buffe
9990: 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a  rFree(&buf);.}..
99a0: 23 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69  #if 0.static voi
99b0: 64 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63  d fts5PrintStruc
99c0: 74 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20  ture(const char 
99d0: 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53  *zCaption, Fts5S
99e0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
99f0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
9a00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35  QLITE_OK;.  Fts5
9a10: 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65  Buffer buf;.  me
9a20: 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
9a30: 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74  zeof(buf));.  ft
9a40: 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65  s5DebugStructure
9a50: 28 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72  (&rc, &buf, pStr
9a60: 75 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  uct);.  fprintf(
9a70: 73 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c  stdout, "%s: %s\
9a80: 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75  n", zCaption, bu
9a90: 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73  f.p);.  fflush(s
9aa0: 74 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75  tdout);.  fts5Bu
9ab0: 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
9ac0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
9ad0: 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74   fts5PrintStruct
9ae0: 75 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  ure(x,y).#endif.
9af0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
9b00: 53 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35  SegmentSize(Fts5
9b10: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
9b20: 20 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72   *pSeg){.  retur
9b30: 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f  n 1 + pSeg->pgno
9b40: 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e  Last - pSeg->pgn
9b50: 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oFirst;.}../*.**
9b60: 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f   Return a copy o
9b70: 66 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  f index structur
9b80: 65 20 70 53 74 72 75 63 74 2e 20 45 78 63 65 70  e pStruct. Excep
9b90: 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61  t, promote as ma
9ba0: 6e 79 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 61  ny segments.** a
9bb0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65  s possible to le
9bc0: 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66  vel iPromote. If
9bd0: 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
9be0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
9bf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9c00: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
9c10: 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49  omoteTo(.  Fts5I
9c20: 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69  ndex *p,.  int i
9c30: 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73  Promote,.  int s
9c40: 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35  zPromote,.  Fts5
9c50: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
9c60: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20  ct.){.  int il, 
9c70: 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  is;.  Fts5Struct
9c80: 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d  ureLevel *pOut =
9c90: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
9ca0: 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20  l[iPromote];..  
9cb0: 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b  for(il=iPromote+
9cc0: 31 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e  1; il<pStruct->n
9cd0: 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20  Level; il++){.  
9ce0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9cf0: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
9d00: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c  truct->aLevel[il
9d10: 5d 3b 0a 20 20 20 20 66 6f 72 28 69 73 3d 70 4c  ];.    for(is=pL
9d20: 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d  vl->nSeg-1; is>=
9d30: 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20  0; is--){.      
9d40: 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67  int sz = fts5Seg
9d50: 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e  mentSize(&pLvl->
9d60: 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20  aSeg[is]);.     
9d70: 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74   if( sz>szPromot
9d80: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
9d90: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
9da0: 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
9db0: 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f  c, pStruct, iPro
9dc0: 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  mote, 1, 1);.   
9dd0: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
9de0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 6d 65 6d  eturn;.      mem
9df0: 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20  cpy(pOut->aSeg, 
9e00: 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c  &pLvl->aSeg[is],
9e10: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
9e20: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a  ctureSegment));.
9e30: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67        pOut->nSeg
9e40: 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ++;.      pLvl->
9e50: 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nSeg--;.    }.  
9e60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77  }.}../*.** A new
9e70: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73   segment has jus
9e80: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
9e90: 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20  o level iLvl of 
9ea0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a  index structure.
9eb0: 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73  ** pStruct. This
9ec0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
9ed0: 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d  ines if any segm
9ee0: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ents should be p
9ef0: 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20  romoted.** as a 
9f00: 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73  result. Segments
9f10: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e   are promoted in
9f20: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
9f30: 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68  **.**   a) If th
9f40: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
9f50: 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65  ritten is smalle
9f60: 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f  r than one or mo
9f70: 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20  re segments.**  
9f80: 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70      within the p
9f90: 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65  revious populate
9fa0: 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70  d level, it is p
9fb0: 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70  romoted to the p
9fc0: 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20  revious.**      
9fd0: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e  populated level.
9fe0: 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74  .**.**   b) If t
9ff0: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
a000: 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65  written is large
a010: 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73  r than the newes
a020: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20  t segment on.** 
a030: 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f       the next po
a040: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74  pulated level, t
a050: 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74  hen that segment
a060: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
a070: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20  adjacent.**     
a080: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61   segments that a
a090: 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20  re also smaller 
a0a0: 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73  than the one jus
a0b0: 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a  t written, are .
a0c0: 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64  **      promoted
a0d0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  . .**.** If one 
a0e0: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
a0f0: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74   are promoted, t
a100: 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  he structure obj
a110: 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a  ect is updated.*
a120: 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69  * to reflect thi
a130: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
a140: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50  d fts5StructureP
a150: 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e  romote(.  Fts5In
a160: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
a170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
a180: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
a190: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20   */.  int iLvl, 
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1b0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c        /* Index l
a1c0: 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65  evel just update
a1d0: 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  d */.  Fts5Struc
a1e0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20  ture *pStruct   
a1f0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a200: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
a210: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
a220: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
a230: 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20  t iTst;.    int 
a240: 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20  iPromote = -1;. 
a250: 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65     int szPromote
a260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a270: 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74   /* Promote anyt
a280: 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f  hing this size o
a290: 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  r smaller */.   
a2a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
a2b0: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f  gment *pSeg;   /
a2c0: 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  * Segment just w
a2d0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 46 74  ritten */.    Ft
a2e0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
a2f0: 20 2a 70 54 73 74 3b 0a 20 20 20 20 69 6e 74 20   *pTst;.    int 
a300: 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20  szSeg;          
a310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a320: 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73  e of segment jus
a330: 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 0a 20  t written */... 
a340: 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75     pSeg = &pStru
a350: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
a360: 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61  .aSeg[pStruct->a
a370: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
a380: 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d  -1];.    szSeg =
a390: 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f   (1 + pSeg->pgno
a3a0: 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e  Last - pSeg->pgn
a3b0: 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  oFirst);..    /*
a3c0: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69   Check for condi
a3d0: 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20  tion (a) */.    
a3e0: 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b  for(iTst=iLvl-1;
a3f0: 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72   iTst>=0 && pStr
a400: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74  uct->aLevel[iTst
a410: 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d  ].nSeg==0; iTst-
a420: 2d 29 3b 0a 20 20 20 20 70 54 73 74 20 3d 20 26  -);.    pTst = &
a430: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a440: 69 54 73 74 5d 3b 0a 20 20 20 20 69 66 28 20 69  iTst];.    if( i
a450: 54 73 74 3e 3d 30 20 26 26 20 70 54 73 74 2d 3e  Tst>=0 && pTst->
a460: 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  nMerge==0 ){.   
a470: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
a480: 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20  int szMax = 0;. 
a490: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a4a0: 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  pTst->nSeg; i++)
a4b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
a4c0: 20 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   = pTst->aSeg[i]
a4d0: 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74  .pgnoLast - pTst
a4e0: 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69  ->aSeg[i].pgnoFi
a4f0: 72 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  rst + 1;.       
a500: 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20   if( sz>szMax ) 
a510: 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20  szMax = sz;.    
a520: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a    }.      if( sz
a530: 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20  Max>=szSeg ){.  
a540: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69        /* Conditi
a550: 6f 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20  on (a) is true. 
a560: 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65  Promote the newe
a570: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65  st segment on le
a580: 76 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  vel .        ** 
a590: 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54  iLvl to level iT
a5a0: 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
a5b0: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b  iPromote = iTst;
a5c0: 0a 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f  .        szPromo
a5d0: 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20  te = szMax;.    
a5e0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
a5f0: 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64  * Check for cond
a600: 69 74 69 6f 6e 20 28 62 29 20 2a 2f 0a 20 20 20  ition (b) */.   
a610: 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20   if( iPromote<0 
a620: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
a630: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73  uctureLevel *pTs
a640: 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 73  t;.      for(iTs
a650: 74 3d 69 4c 76 6c 2b 31 3b 20 69 54 73 74 3c 70  t=iLvl+1; iTst<p
a660: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
a670: 69 54 73 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iTst++){.       
a680: 20 70 54 73 74 20 3d 20 26 70 53 74 72 75 63 74   pTst = &pStruct
a690: 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a  ->aLevel[iTst];.
a6a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 73 74          if( pTst
a6b0: 2d 3e 6e 53 65 67 20 29 20 62 72 65 61 6b 3b 0a  ->nSeg ) break;.
a6c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a6d0: 28 20 69 54 73 74 3c 70 53 74 72 75 63 74 2d 3e  ( iTst<pStruct->
a6e0: 6e 4c 65 76 65 6c 20 26 26 20 70 54 73 74 2d 3e  nLevel && pTst->
a6f0: 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  nMerge==0 ){.   
a700: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
a710: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 32  reSegment *pSeg2
a720: 20 3d 20 26 70 54 73 74 2d 3e 61 53 65 67 5b 70   = &pTst->aSeg[p
a730: 54 73 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20  Tst->nSeg-1];.  
a740: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70        int sz = p
a750: 53 65 67 32 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  Seg2->pgnoLast -
a760: 20 70 53 65 67 32 2d 3e 70 67 6e 6f 46 69 72 73   pSeg2->pgnoFirs
a770: 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t + 1;.        i
a780: 66 28 20 73 7a 3c 3d 73 7a 53 65 67 20 29 7b 0a  f( sz<=szSeg ){.
a790: 20 20 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f            iPromo
a7a0: 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  te = iLvl;.     
a7b0: 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d       szPromote =
a7c0: 20 73 7a 53 65 67 3b 0a 20 20 20 20 20 20 20 20   szSeg;.        
a7d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
a7e0: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 72 6f 6d  .    /* If iProm
a7f0: 6f 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ote is greater t
a800: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
a810: 7a 65 72 6f 20 61 74 20 74 68 69 73 20 70 6f 69  zero at this poi
a820: 6e 74 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20  nt, then it.    
a830: 2a 2a 20 69 73 20 74 68 65 20 6c 65 76 65 6c 20  ** is the level 
a840: 6e 75 6d 62 65 72 20 6f 66 20 61 20 6c 65 76 65  number of a leve
a850: 6c 20 74 6f 20 77 68 69 63 68 20 73 65 67 6d 65  l to which segme
a860: 6e 74 73 20 74 68 61 74 20 63 6f 6e 73 69 73 74  nts that consist
a870: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 7a 50 72 6f   of.    ** szPro
a880: 6d 6f 74 65 20 6f 72 20 66 65 77 65 72 20 70 61  mote or fewer pa
a890: 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72  ges should be pr
a8a0: 6f 6d 6f 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  omoted. */ .    
a8b0: 69 66 28 20 69 50 72 6f 6d 6f 74 65 3e 3d 30 20  if( iPromote>=0 
a8c0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 72 69  ){.      fts5Pri
a8d0: 6e 74 53 74 72 75 63 74 75 72 65 28 22 42 45 46  ntStructure("BEF
a8e0: 4f 52 45 22 2c 20 70 53 74 72 75 63 74 29 3b 0a  ORE", pStruct);.
a8f0: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
a900: 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20  urePromoteTo(p, 
a910: 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d  iPromote, szProm
a920: 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  ote, pStruct);. 
a930: 20 20 20 20 20 66 74 73 35 50 72 69 6e 74 53 74       fts5PrintSt
a940: 72 75 63 74 75 72 65 28 22 41 46 54 45 52 22 2c  ructure("AFTER",
a950: 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d   pStruct);.    }
a960: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
a970: 66 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f 66  f the pIter->iOf
a980: 66 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e 74  f offset current
a990: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ly points to an 
a9a0: 65 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e 67  entry indicating
a9b0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
a9c0: 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 2c  term-less nodes,
a9d0: 20 61 64 76 61 6e 63 65 20 70 61 73 74 20 69 74   advance past it
a9e0: 20 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d 3e   and set pIter->
a9f0: 6e 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68 65  nEmpty to.** the
aa00: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79   number of empty
aa10: 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f   child nodes..*/
aa20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
aa30: 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e  5NodeIterGobbleN
aa40: 45 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49 74  Empty(Fts5NodeIt
aa50: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
aa60: 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 49  ( pIter->iOff<pI
aa70: 74 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30 3d  ter->nData && 0=
aa80: 3d 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70  =(pIter->aData[p
aa90: 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78  Iter->iOff] & 0x
aaa0: 66 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72  fe) ){.    pIter
aab0: 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72  ->bDlidx = pIter
aac0: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
aad0: 4f 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20 20  Off] & 0x01;.   
aae0: 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a   pIter->iOff++;.
aaf0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
ab00: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
ab10: 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74  pIter->aData[pIt
ab20: 65 72 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72  er->iOff], pIter
ab30: 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c  ->nEmpty);.  }el
ab40: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e  se{.    pIter->n
ab50: 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Empty = 0;.    p
ab60: 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30  Iter->bDlidx = 0
ab70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
ab80: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
ab90: 78 74 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20  xt entry within 
aba0: 74 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61  the node..*/.sta
abb0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64  tic void fts5Nod
abc0: 65 49 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70  eIterNext(int *p
abd0: 52 63 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72  Rc, Fts5NodeIter
abe0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
abf0: 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74  pIter->iOff>=pIt
ac00: 65 72 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20  er->nData ){.   
ac10: 20 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20   pIter->aData = 
ac20: 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43  0;.    pIter->iC
ac30: 68 69 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e  hild += pIter->n
ac40: 45 6d 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Empty;.  }else{.
ac50: 20 20 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e      int nPre, nN
ac60: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ew;.    pIter->i
ac70: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
ac80: 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61  32(&pIter->aData
ac90: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e  [pIter->iOff], n
aca0: 50 72 65 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  Pre);.    pIter-
acb0: 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69  >iOff += getVari
acc0: 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61  nt32(&pIter->aDa
acd0: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  ta[pIter->iOff],
ace0: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 49 74 65   nNew);.    pIte
acf0: 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65  r->term.n = nPre
ad00: 2d 32 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  -2;.    fts5Buff
ad10: 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63  erAppendBlob(pRc
ad20: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
ad30: 6e 4e 65 77 2c 20 70 49 74 65 72 2d 3e 61 44 61  nNew, pIter->aDa
ad40: 74 61 2b 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b  ta+pIter->iOff);
ad50: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
ad60: 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49   += nNew;.    pI
ad70: 74 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28  ter->iChild += (
ad80: 31 20 2b 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74  1 + pIter->nEmpt
ad90: 79 29 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65  y);.    fts5Node
ada0: 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79  IterGobbleNEmpty
adb0: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28  (pIter);.    if(
adc0: 20 2a 70 52 63 20 29 20 70 49 74 65 72 2d 3e 61   *pRc ) pIter->a
add0: 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Data = 0;.  }.}.
ade0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
adf0: 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ze the iterator 
ae00: 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
ae10: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
ae20: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
ae30: 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20  segment node in 
ae40: 70 44 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  pData..*/.static
ae50: 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74   void fts5NodeIt
ae60: 65 72 49 6e 69 74 28 63 6f 6e 73 74 20 75 38 20  erInit(const u8 
ae70: 2a 61 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *aData, int nDat
ae80: 61 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20  a, Fts5NodeIter 
ae90: 2a 70 49 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65  *pIter){.  memse
aea0: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
aeb0: 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
aec0: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 44  Iter->aData = aD
aed0: 61 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44  ata;.  pIter->nD
aee0: 61 74 61 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70  ata = nData;.  p
aef0: 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 67 65 74  Iter->iOff = get
af00: 56 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c 20  Varint32(aData, 
af10: 70 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a  pIter->iChild);.
af20: 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f    fts5NodeIterGo
af30: 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72  bbleNEmpty(pIter
af40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
af50: 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   any memory allo
af60: 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
af70: 72 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f  rator object..*/
af80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
af90: 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46 74  5NodeIterFree(Ft
afa0: 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65  s5NodeIter *pIte
afb0: 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r){.  fts5Buffer
afc0: 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72  Free(&pIter->ter
afd0: 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  m);.}../*.** The
afe0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
aff0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
b000: 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66  gument has the f
b010: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
b020: 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  set.** as follow
b030: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
b040: 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73   sets up the res
b050: 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  t of the iterato
b060: 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  r so that it.** 
b070: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
b080: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  rst rowid in the
b090: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
b0a0: 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20 70  **.**   pData: p
b0b0: 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
b0c0: 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  t-index record, 
b0d0: 0a 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f 3a  .**   iLeafPgno:
b0e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
b0f0: 74 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2d 69  t this doclist-i
b100: 6e 64 65 78 20 69 73 20 61 73 73 6f 63 69 61 74  ndex is associat
b110: 65 64 20 77 69 74 68 2e 0a 2a 2f 0a 73 74 61 74  ed with..*/.stat
b120: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
b130: 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44 6c  IterFirst(Fts5Dl
b140: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b150: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
b160: 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61 74  ta = pIter->pDat
b170: 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  a;.  int i;..  a
b180: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
b190: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
b1a0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b1b0: 6f 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  o>0 );..  /* Cou
b1c0: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
b1d0: 20 6c 65 61 64 69 6e 67 20 30 78 30 30 20 62 79   leading 0x00 by
b1e0: 74 65 73 2e 20 54 68 65 6e 20 73 65 74 20 69 4c  tes. Then set iL
b1f0: 65 61 66 50 67 6e 6f 2e 20 2a 2f 0a 20 20 66 6f  eafPgno. */.  fo
b200: 72 28 69 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e  r(i=0; i<pData->
b210: 6e 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 66  n; i++){ .    if
b220: 28 20 70 44 61 74 61 2d 3e 70 5b 69 5d 20 29 20  ( pData->p[i] ) 
b230: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 49 74  break;.  }.  pIt
b240: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d  er->iLeafPgno +=
b250: 20 28 69 2b 31 29 3b 0a 20 20 70 49 74 65 72 2d   (i+1);.  pIter-
b260: 3e 69 4f 66 66 20 3d 20 69 3b 0a 0a 20 20 2f 2a  >iOff = i;..  /*
b270: 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 61   Unless we are a
b280: 6c 72 65 61 64 79 20 61 74 20 74 68 65 20 65 6e  lready at the en
b290: 64 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  d of the doclist
b2a0: 2d 69 6e 64 65 78 2c 20 6c 6f 61 64 20 74 68 65  -index, load the
b2b0: 20 66 69 72 73 74 0a 20 20 2a 2a 20 72 6f 77 69   first.  ** rowi
b2c0: 64 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69  d value.  */.  i
b2d0: 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70  f( pIter->iOff<p
b2e0: 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  Data->n ){.    p
b2f0: 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65  Iter->iOff += ge
b300: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
b310: 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20  p[pIter->iOff], 
b320: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
b330: 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
b340: 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20      pIter->bEof 
b350: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  = 1;.  }.  pIter
b360: 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 49  ->iFirstOff = pI
b370: 74 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65 74  ter->iOff;.  ret
b380: 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b  urn pIter->bEof;
b390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
b3a0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
b3b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
b3c0: 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
b3d0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
b3e0: 69 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35  idxIterNext(Fts5
b3f0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b400: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
b410: 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44  Data = pIter->pD
b420: 61 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  ata;.  int iOff;
b430: 0a 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70 49 74  ..  for(iOff=pIt
b440: 65 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70  er->iOff; iOff<p
b450: 44 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29  Data->n; iOff++)
b460: 7b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d  {.    if( pData-
b470: 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b  >p[iOff] ) break
b480: 3b 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f  ; .  }..  if( iO
b490: 66 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20  ff<pData->n ){. 
b4a0: 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
b4b0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b4c0: 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49 74  o += (iOff - pIt
b4d0: 65 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20  er->iOff) + 1;. 
b4e0: 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
b4f0: 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
b500: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  Off], (u64*)&iVa
b510: 6c 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  l);.    pIter->i
b520: 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20  Rowid -= iVal;. 
b530: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d     pIter->iOff =
b540: 20 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iOff;.  }else{.
b550: 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20      pIter->bEof 
b560: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 1;.  }..  retu
b570: 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a  rn pIter->bEof;.
b580: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b590: 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46  s5DlidxIterEof(F
b5a0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
b5b0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b5c0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  r){.  return (p-
b5d0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
b5e0: 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a  | pIter->bEof);.
b5f0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
b600: 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74  ts5DlidxIterLast
b610: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
b620: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 66 74  pIter){.  if( ft
b630: 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
b640: 28 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20  (pIter)==0 ){.  
b650: 20 20 77 68 69 6c 65 28 20 30 3d 3d 66 74 73 35    while( 0==fts5
b660: 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 49  DlidxIterNext(pI
b670: 74 65 72 29 20 29 3b 0a 20 20 20 20 70 49 74 65  ter) );.    pIte
b680: 72 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 7d  r->bEof = 0;.  }
b690: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
b6a0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
b6b0: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
b6c0: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 4f  pIter){.  int iO
b6d0: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66 66  ff = pIter->iOff
b6e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
b6f0: 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  er->bEof==0 );. 
b700: 20 69 66 28 20 69 4f 66 66 3c 3d 70 49 74 65 72   if( iOff<=pIter
b710: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
b720: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
b730: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
b740: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
b750: 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36  pData->p;.    i6
b760: 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20  4 iVal;.    int 
b770: 69 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  iLimit;..    /* 
b780: 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70  Currently iOff p
b790: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
b7a0: 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72  st byte of a var
b7b0: 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  int. This block 
b7c0: 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e  .    ** decremen
b7d0: 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74  ts iOff until it
b7e0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
b7f0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b800: 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a   previous .    *
b810: 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67  * varint. Taking
b820: 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61   care not to rea
b830: 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63  d any memory loc
b840: 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75  ations that occu
b850: 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  r.    ** before 
b860: 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65  the buffer in me
b870: 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c  mory.  */.    iL
b880: 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f  imit = (iOff>9 ?
b890: 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20   iOff-9 : 0);.  
b8a0: 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f    for(iOff--; iO
b8b0: 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d  ff>iLimit; iOff-
b8c0: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61  -){.      if( (a
b8d0: 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29  [iOff-1] & 0x80)
b8e0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b8f0: 20 7d 0a 0a 20 20 20 20 67 65 74 56 61 72 69 6e   }..    getVarin
b900: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
b910: 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 49  *)&iVal);.    pI
b920: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
b930: 56 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Val;.    pIter->
b940: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20  iLeafPgno--;..  
b950: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3e 70 49    while( iOff>pI
b960: 74 65 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 0a  ter->iFirstOff .
b970: 20 20 20 20 20 20 20 20 26 26 20 61 5b 69 4f 66          && a[iOf
b980: 66 2d 31 5d 3d 3d 30 78 30 30 20 26 26 20 28 61  f-1]==0x00 && (a
b990: 5b 69 4f 66 66 2d 32 5d 20 26 20 30 78 38 30 29  [iOff-2] & 0x80)
b9a0: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b9b0: 20 20 69 4f 66 66 2d 2d 3b 0a 20 20 20 20 20 20    iOff--;.      
b9c0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
b9d0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  --;.    }.    pI
b9e0: 74 65 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  ter->iOff = iOff
b9f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
ba00: 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a  pIter->bEof;.}..
ba10: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ba20: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20  DlidxIterInit(. 
ba30: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64   /* Fts5 Backend
ba60: 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
ba70: 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  in */.  int bRev
ba80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
baa0: 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53 43  for ORDER BY ASC
bab0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
bac0: 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20  int iSegid,     
bad0: 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
bae0: 20 69 53 65 67 69 64 20 77 69 74 68 69 6e 20 69   iSegid within i
baf0: 6e 64 65 78 20 69 49 64 78 20 2a 2f 0a 20 20 69  ndex iIdx */.  i
bb00: 6e 74 20 69 4c 65 61 66 50 67 6e 6f 2c 20 20 20  nt iLeafPgno,   
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb20: 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  * Leaf page numb
bb30: 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78  er to load dlidx
bb40: 20 66 6f 72 20 2a 2f 0a 20 20 46 74 73 35 44 6c   for */.  Fts5Dl
bb50: 69 64 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72  idxIter **ppIter
bb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
bb70: 3a 20 50 6f 70 75 6c 61 74 65 64 20 69 74 65 72  : Populated iter
bb80: 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ator */.){.  Fts
bb90: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
bba0: 72 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 46  r = *ppIter;.  F
bbb0: 74 73 35 44 61 74 61 20 2a 70 44 6c 69 64 78 3b  ts5Data *pDlidx;
bbc0: 0a 0a 20 20 70 44 6c 69 64 78 20 3d 20 66 74 73  ..  pDlidx = fts
bbd0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
bbe0: 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f  5_DOCLIST_IDX_RO
bbf0: 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
bc00: 2c 20 69 4c 65 61 66 50 67 6e 6f 29 29 3b 0a 20  , iLeafPgno));. 
bc10: 20 69 66 28 20 70 44 6c 69 64 78 3d 3d 30 20 29   if( pDlidx==0 )
bc20: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
bc30: 49 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  Iter==0 ){.    *
bc40: 70 70 49 74 65 72 20 3d 20 70 49 74 65 72 20 3d  ppIter = pIter =
bc50: 20 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a   (Fts5DlidxIter*
bc60: 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
bc70: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
bc80: 64 78 49 74 65 72 29 29 3b 0a 20 20 20 20 69 66  dxIter));.    if
bc90: 28 20 70 49 74 65 72 3d 3d 30 20 29 7b 20 0a 20  ( pIter==0 ){ . 
bca0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
bcb0: 65 61 73 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  ease(pDlidx);.  
bcc0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bcd0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  }.  }else{.    m
bce0: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
bcf0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
bd00: 49 74 65 72 29 29 3b 0a 20 20 7d 0a 0a 20 20 70  Iter));.  }..  p
bd10: 49 74 65 72 2d 3e 70 44 61 74 61 20 3d 20 70 44  Iter->pData = pD
bd20: 6c 69 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69  lidx;.  pIter->i
bd30: 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
bd40: 50 67 6e 6f 3b 0a 20 20 69 66 28 20 62 52 65 76  Pgno;.  if( bRev
bd50: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ==0 ){.    fts5D
bd60: 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49  lidxIterFirst(pI
bd70: 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ter);.  }else{. 
bd80: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
bd90: 4c 61 73 74 28 70 49 74 65 72 29 3b 0a 20 20 7d  Last(pIter);.  }
bda0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
bdb0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
bdc0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61  terator object a
bdd0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35  llocated by fts5
bde0: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e  DlidxIterInit().
bdf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
be00: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
be10: 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  e(Fts5DlidxIter 
be20: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
be30: 49 74 65 72 20 29 7b 0a 20 20 20 20 66 74 73 35  Iter ){.    fts5
be40: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
be50: 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73  r->pData);.    s
be60: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
be70: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
be80: 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c   Load the next l
be90: 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68  eaf page into th
bea0: 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  e segment iterat
beb0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
bec0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
bed0: 78 74 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  xtPage(.  Fts5In
bee0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
bef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
bf00: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
bf10: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
bf20: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
bf30: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
bf40: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20  r to advance to 
bf50: 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  next page */.){.
bf60: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
bf70: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
bf80: 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 69 66  Iter->pSeg;.  if
bf90: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
bfa0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
bfb0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
bfc0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
bfd0: 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65  no++;.  if( pIte
bfe0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53  r->iLeafPgno<=pS
bff0: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
c000: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
c010: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
c020: 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53 35  p, .        FTS5
c030: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
c040: 49 74 65 72 2d 3e 69 49 64 78 2c 20 70 53 65 67  Iter->iIdx, pSeg
c050: 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74  ->iSegid, 0, pIt
c060: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  er->iLeafPgno). 
c070: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
c080: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
c090: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
c0a0: 2a 20 4c 65 61 76 65 20 70 49 74 65 72 2d 3e 69  * Leave pIter->i
c0b0: 4c 65 61 66 4f 66 66 73 65 74 20 61 73 20 74 68  LeafOffset as th
c0c0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
c0d0: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
c0e0: 65 20 66 69 72 73 74 0a 2a 2a 20 70 6f 73 69 74  e first.** posit
c0f0: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f  ion list. The po
c100: 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f  sition list belo
c110: 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e  nging to documen
c120: 74 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 2e  t pIter->iRowid.
c130: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c140: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
c150: 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70  erm(Fts5Index *p
c160: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
c170: 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29  Iter, int nKeep)
c180: 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65  {.  u8 *a = pIte
c190: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20  r->pLeaf->p;    
c1a0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
c1b0: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
c1c0: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  */.  int iOff = 
c1d0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c1e0: 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  et;  /* Offset t
c1f0: 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69  o read at */.  i
c200: 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c220: 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64  * Bytes of new d
c230: 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b  ata */..  iOff +
c240: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
c250: 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20  [iOff], nNew);. 
c260: 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d   pIter->term.n =
c270: 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42 75   nKeep;.  fts5Bu
c280: 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
c290: 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
c2a0: 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f  erm, nNew, &a[iO
c2b0: 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20  ff]);.  iOff += 
c2c0: 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69  nNew;.  pIter->i
c2d0: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d  TermLeafOffset =
c2e0: 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e   iOff;.  pIter->
c2f0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20  iTermLeafPgno = 
c300: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
c310: 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49  ;.  if( iOff>=pI
c320: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b  ter->pLeaf->n ){
c330: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
c340: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
c350: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  r);.    if( pIte
c360: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  r->pLeaf==0 ){. 
c370: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
c380: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72  SQLITE_OK ) p->r
c390: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
c3a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
c3b0: 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d      }.    iOff =
c3c0: 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65   4;.    a = pIte
c3d0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d  r->pLeaf->p;.  }
c3e0: 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74  .  iOff += sqlit
c3f0: 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  e3GetVarint(&a[i
c400: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
c410: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70  er->iRowid);.  p
c420: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c430: 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  t = iOff;.}../*.
c440: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
c450: 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
c460: 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61  t pIter to itera
c470: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  te through the e
c480: 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67  ntries in.** seg
c490: 6d 65 6e 74 20 70 53 65 67 20 77 69 74 68 69 6e  ment pSeg within
c4a0: 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68 65   index iIdx. The
c4b0: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
c4c0: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
c4d0: 65 20 0a 2a 2a 20 66 69 72 73 74 20 65 6e 74 72  e .** first entr
c4e0: 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  y when this func
c4f0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
c500: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
c510: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
c520: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
c530: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
c540: 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
c550: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
c560: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
c570: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c580: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
c590: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
c5a0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
c5b0: 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  egIterInit(.  Ft
c5c0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
c5d0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 49 64 78       .  int iIdx
c5e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c5f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
c600: 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20  g.aHash[] index 
c610: 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a  of FTS index */.
c620: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
c630: 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20  egment *pSeg,   
c640: 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
c650: 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   of segment */. 
c660: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c670: 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
c680: 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
c690: 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  pulate */.){.  i
c6a0: 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  f( pSeg->pgnoFir
c6b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  st==0 ){.    /* 
c6c0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
c6d0: 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 62  the segment is b
c6e0: 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e 20  eing used as an 
c6f0: 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63 72  input to an incr
c700: 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d  emental.    ** m
c710: 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61 74  erge and all dat
c720: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
c730: 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53 65  en "trimmed". Se
c740: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a  e function.    *
c750: 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e  * fts5TrimSegmen
c760: 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  ts() for details
c770: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
c780: 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  eave the iterato
c790: 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20  r empty..    ** 
c7a0: 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
c7b0: 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d 3e  see the (pIter->
c7c0: 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61 73  pLeaf==0) and as
c7d0: 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74 6f  sume the iterato
c7e0: 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 45  r is.    ** at E
c7f0: 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20  OF already. */. 
c800: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
c810: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  ->pLeaf==0 );.  
c820: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
c830: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
c840: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d  TE_OK ){.    mem
c850: 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
c860: 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
c870: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d     pIter->pSeg =
c880: 20 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72   pSeg;.    pIter
c890: 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20  ->iIdx = iIdx;. 
c8a0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
c8b0: 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
c8c0: 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73  First-1;.    fts
c8d0: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
c8e0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
c8f0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
c900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
c910: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
c920: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65  eaf->p;.    pIte
c930: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
c940: 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32   fts5GetU16(&a[2
c950: 5d 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  ]);.    fts5SegI
c960: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
c970: 49 74 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  Iter, 0);.  }.}.
c980: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c990: 35 4c 65 61 66 48 65 61 64 65 72 28 46 74 73 35  5LeafHeader(Fts5
c9a0: 44 61 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74  Data *pLeaf, int
c9b0: 20 2a 70 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a   *piRowid, int *
c9c0: 70 69 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f  piTerm){.  *piRo
c9d0: 77 69 64 20 3d 20 28 69 6e 74 29 66 74 73 35 47  wid = (int)fts5G
c9e0: 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
c9f0: 30 5d 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d  0]);.  *piTerm =
ca00: 20 28 69 6e 74 29 66 74 73 35 47 65 74 55 31 36   (int)fts5GetU16
ca10: 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a  (&pLeaf->p[2]);.
ca20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
ca30: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
ca40: 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74  ver called on it
ca50: 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20  erators created 
ca60: 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46  by calls to.** F
ca70: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20  ts5IndexQuery() 
ca80: 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44  with the FTS5IND
ca90: 45 58 5f 51 55 45 52 59 5f 41 53 43 20 66 6c 61  EX_QUERY_ASC fla
caa0: 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  g set..**.** Whe
cab0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
cac0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 65 72 61  is called, itera
cad0: 74 6f 72 20 70 49 74 65 72 20 70 6f 69 6e 74 73  tor pIter points
cae0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
caf0: 77 69 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75  wid.** on the cu
cb00: 72 72 65 6e 74 20 6c 65 61 66 20 61 73 73 6f 63  rrent leaf assoc
cb10: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
cb20: 65 72 6d 20 62 65 69 6e 67 20 71 75 65 72 69 65  erm being querie
cb30: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
cb40: 0a 2a 2a 20 61 64 76 61 6e 63 65 73 20 69 74 20  .** advances it 
cb50: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
cb60: 6c 61 73 74 20 73 75 63 68 20 72 6f 77 69 64 20  last such rowid 
cb70: 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
cb80: 79 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 0a 2a  y, initializes.*
cb90: 2a 20 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73  * the aRowidOffs
cba0: 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f  et[] and iRowidO
cbb0: 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e  ffset variables.
cbc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cbd0: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
cbe0: 73 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49  seInitPage(Fts5I
cbf0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
cc00: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
cc10: 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70  int n = pIter->p
cc20: 4c 65 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69  Leaf->n;.  int i
cc30: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
cc40: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d  ffset;.  u8 *a =
cc50: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
cc60: 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  ;.  int iRowidOf
cc70: 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69  fset = 0;..  whi
cc80: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
cc90: 45 5f 4f 4b 20 26 26 20 69 3c 6e 20 29 7b 0a 20  E_OK && i<n ){. 
cca0: 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20     i64 iDelta = 
ccb0: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  0;.    int nPos;
ccc0: 0a 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61  ..    i += getVa
ccd0: 72 69 6e 74 33 32 28 26 61 5b 69 5d 2c 20 6e 50  rint32(&a[i], nP
cce0: 6f 73 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50  os);.    i += nP
ccf0: 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e  os;.    if( i>=n
cd00: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20   ) break;.    i 
cd10: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b  += getVarint(&a[
cd20: 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  i], (u64*)&iDelt
cd30: 61 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c  a);.    if( iDel
cd40: 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ta==0 ) break;. 
cd50: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
cd60: 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20   -= iDelta;..   
cd70: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65   if( iRowidOffse
cd80: 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64  t>=pIter->nRowid
cd90: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
cda0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72  int nNew = pIter
cdb0: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b  ->nRowidOffset +
cdc0: 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   8;.      int *a
cdd0: 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  New = (int*)sqli
cde0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65  te3_realloc(pIte
cdf0: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c  r->aRowidOffset,
ce00: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74   nNew*sizeof(int
ce10: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e  ));.      if( aN
ce20: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
ce30: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
ce40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
ce50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ce60: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
ce70: 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a  dOffset = aNew;.
ce80: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f        pIter->nRo
ce90: 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77  widOffset = nNew
cea0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
ceb0: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
cec0: 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d  [iRowidOffset++]
ced0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
cee0: 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72  ffset;.    pIter
cef0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
cf00: 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  i;.  }.  pIter->
cf10: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69  iRowidOffset = i
cf20: 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 7d 0a 0a  RowidOffset;.}..
cf30: 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
cf40: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
cf50: 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 46  ReverseNewPage(F
cf60: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
cf70: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
cf80: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
cf90: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
cfa0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
cfb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
cfc0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
cfd0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
cfe0: 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52   );..  fts5DataR
cff0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
d000: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
d010: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  Leaf = 0;.  whil
d020: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
d030: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c  _OK && pIter->iL
d040: 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
d050: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  TermLeafPgno ){.
d060: 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e      Fts5Data *pN
d070: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ew;.    pIter->i
d080: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  LeafPgno--;.    
d090: 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
d0a0: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
d0b0: 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20  ENT_ROWID(.     
d0c0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78       pIter->iIdx
d0d0: 2c 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69  , pIter->pSeg->i
d0e0: 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d  Segid, 0, pIter-
d0f0: 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29  >iLeafPgno.    )
d100: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
d110: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
d120: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  er->iLeafPgno==p
d130: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
d140: 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  gno ){.        i
d150: 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
d160: 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e  eafOffset<pNew->
d170: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
d180: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
d190: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
d1a0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d1b0: 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c   = pIter->iTermL
d1c0: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  eafOffset;.     
d1d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
d1e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  {.        int iR
d1f0: 6f 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a  owidOff, dummy;.
d200: 20 20 20 20 20 20 20 20 66 74 73 35 4c 65 61 66          fts5Leaf
d210: 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52  Header(pNew, &iR
d220: 6f 77 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79 29  owidOff, &dummy)
d230: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52  ;.        if( iR
d240: 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
d250: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
d260: 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  f = pNew;.      
d270: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d280: 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f  Offset = iRowidO
d290: 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ff;.        }.  
d2a0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
d2b0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
d2c0: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d  .        u8 *a =
d2d0: 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e   &pIter->pLeaf->
d2e0: 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  p[pIter->iLeafOf
d2f0: 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70  fset];.        p
d300: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d310: 74 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61  t += getVarint(a
d320: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
d330: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
d340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
d350: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
d360: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
d370: 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
d380: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74  }.  }..  if( pIt
d390: 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
d3a0: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
d3b0: 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
d3c0: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Iter);.  }.}../*
d3d0: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72  .** Advance iter
d3e0: 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68  ator pIter to th
d3f0: 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
d400: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
d410: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
d420: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
d430: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
d440: 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a  rror code. It .*
d450: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
d460: 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
d470: 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
d480: 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20  ches EOF. If an 
d490: 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
d4a0: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
d4b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d4c0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
d4d0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
d4e0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
d4f0: 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  egIterNext(.  Ft
d500: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d520: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
d530: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
d540: 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
d550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
d560: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
d570: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
d580: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d590: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
d5a0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
d5b0: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a  ITER_REVERSE ){.
d5c0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
d5d0: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20  >iRowidOffset>0 
d5e0: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  ){.        u8 *a
d5f0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
d600: 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  >p;.        int 
d610: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e  iOff;.        in
d620: 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  t nPos;.        
d630: 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  i64 iDelta;.    
d640: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
d650: 64 4f 66 66 73 65 74 2d 2d 3b 0a 0a 20 20 20 20  dOffset--;..    
d660: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d670: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 3d 20  Offset = iOff = 
d680: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
d690: 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69  set[pIter->iRowi
d6a0: 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20  dOffset];.      
d6b0: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
d6c0: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
d6d0: 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69  nPos);.        i
d6e0: 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
d6f0: 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 26       getVarint(&
d700: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
d710: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  iDelta);.       
d720: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
d730: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
d740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
d750: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
d760: 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65  eNewPage(p, pIte
d770: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
d780: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73  }else{.      Fts
d790: 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70  5Data *pLeaf = p
d7a0: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20  Iter->pLeaf;.   
d7b0: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
d7c0: 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20     int bNewTerm 
d7d0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
d7e0: 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Keep = 0;..     
d7f0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
d800: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f  he end of the po
d810: 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68  sition list with
d820: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
d830: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38  age. */.      u8
d840: 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a   *a = pLeaf->p;.
d850: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c        int n = pL
d860: 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69  eaf->n;..      i
d870: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
d880: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  afOffset;.      
d890: 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
d8a0: 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 6c 69        int nPosli
d8b0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  st;.        iOff
d8c0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
d8d0: 26 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69  &a[iOff], nPosli
d8e0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  st);.        iOf
d8f0: 66 20 2b 3d 20 6e 50 6f 73 6c 69 73 74 3b 0a 20  f += nPoslist;. 
d900: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
d910: 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
d920: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
d930: 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20  entry is on the 
d940: 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a  current page */.
d950: 20 20 20 20 20 20 20 20 75 36 34 20 69 44 65 6c          u64 iDel
d960: 74 61 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  ta;.        iOff
d970: 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
d980: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26  rint(&a[iOff], &
d990: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  iDelta);.       
d9a0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d9b0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
d9c0: 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
d9d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
d9e0: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
d9f0: 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e         if( iOff>
da00: 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =n ){.          
da10: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
da20: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
da30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
da40: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
da50: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
da60: 65 6c 73 65 20 69 66 28 20 69 4f 66 66 21 3d 66  else if( iOff!=f
da70: 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29  ts5GetU16(&a[2])
da80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
da90: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
daa0: 65 74 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  et += getVarint3
dab0: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
dac0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
dad0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
dae0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
daf0: 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61  iRowid -= iDelta
db00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
db10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db20: 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20   iOff = 0;.     
db30: 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
db40: 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
db50: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
db60: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f         while( iO
db70: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
db80: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
db90: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
dba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61  ;.          pLea
dbb0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
dbc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
dbd0: 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
dbe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
dbf0: 28 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  (iOff = fts5GetU
dc00: 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29  16(&pLeaf->p[0])
dc10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
dc20: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
dc30: 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  GetVarint(&pLeaf
dc40: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
dc50: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
dc60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
dc70: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dc80: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
dc90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
dca0: 6c 73 65 20 69 66 28 20 28 69 4f 66 66 20 3d 20  lse if( (iOff = 
dcb0: 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
dcc0: 66 2d 3e 70 5b 32 5d 29 29 20 29 7b 0a 20 20 20  f->p[2])) ){.   
dcd0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
dce0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
dcf0: 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ff;.            
dd00: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
dd10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
dd30: 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
dd40: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e  he iterator is n
dd50: 6f 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f  ow at EOF. If so
dd60: 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
dd70: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  */.      if( pIt
dd80: 65 72 2d 3e 70 4c 65 61 66 20 26 26 20 62 4e 65  er->pLeaf && bNe
dd90: 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  wTerm ){.       
dda0: 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67   if( pIter->flag
ddb0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
ddc0: 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20  _ONETERM ){.    
ddd0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
dde0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
ddf0: 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  af);.          p
de00: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
de10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
de20: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
de30: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
de40: 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a   pIter, nKeep);.
de50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
de60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
de70: 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
de80: 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
de90: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
dea0: 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63  t rowid in a doc
deb0: 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  list. This.** fu
dec0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
ded0: 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74  iterator up so t
dee0: 68 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20  hat iterates in 
def0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68  reverse order th
df00: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63  rough.** the doc
df10: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
df20: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
df30: 52 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65  Reverse(Fts5Inde
df40: 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20  x *p, int iIdx, 
df50: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
df60: 65 72 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  er){.  Fts5Data 
df70: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
df80: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
df90: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20  t leaf data */. 
dfa0: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
dfb0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
dfc0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
dfd0: 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c  within current l
dfe0: 65 61 66 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  eaf */.  Fts5Dat
dff0: 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  a *pLast = 0;.  
e000: 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
e010: 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 6f 20  ;..  /* Move to 
e020: 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  the page that co
e030: 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 20  ntains the last 
e040: 72 6f 77 69 64 20 69 6e 20 74 68 69 73 20 64 6f  rowid in this do
e050: 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 4c 65 61  clist. */.  pLea
e060: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
e070: 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
e080: 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e  pDlidx ){.    in
e090: 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72  t iSegid = pIter
e0a0: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
e0b0: 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70      pgnoLast = p
e0c0: 49 74 65 72 2d 3e 70 44 6c 69 64 78 2d 3e 69 4c  Iter->pDlidx->iL
e0d0: 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 70 4c 61  eafPgno;.    pLa
e0e0: 73 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  st = fts5DataRea
e0f0: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
e100: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53  T_ROWID(iIdx, iS
e110: 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f 4c 61 73  egid, 0, pgnoLas
e120: 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t));.  }else{.  
e130: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c    while( iOff<pL
e140: 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  eaf->n ){.      
e150: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
e160: 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20  i64 iDelta;..   
e170: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c     /* Position l
e180: 69 73 74 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ist size in byte
e190: 73 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20  s */.      iOff 
e1a0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
e1b0: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
e1c0: 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 4f 66  nPos);.      iOf
e1d0: 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20  f += nPos;.     
e1e0: 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66   if( iOff>=pLeaf
e1f0: 2d 3e 6e 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ->n ) break;..  
e200: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 64 65 6c      /* Rowid del
e210: 74 61 2e 20 4f 72 2c 20 69 66 20 30 78 30 30 2c  ta. Or, if 0x00,
e220: 20 74 68 65 20 65 6e 64 20 6f 66 20 64 6f 63 6c   the end of docl
e230: 69 73 74 20 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20  ist marker. */. 
e240: 20 20 20 20 20 6e 50 6f 73 20 3d 20 67 65 74 56       nPos = getV
e250: 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
e260: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
e270: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  elta);.      if(
e280: 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62 72 65   iDelta==0 ) bre
e290: 61 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ak;.      iOff +
e2a0: 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 0a 20  = nPos;.    }.. 
e2b0: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
e2c0: 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 46  af->n ){.      F
e2d0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
e2e0: 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
e2f0: 72 2d 3e 70 53 65 67 3b 0a 20 20 20 20 20 20 69  r->pSeg;.      i
e300: 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53  64 iAbs = FTS5_S
e310: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
e320: 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  x, pSeg->iSegid,
e330: 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   0, pIter->iLeaf
e340: 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 36 34  Pgno);.      i64
e350: 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f 53 45   iLast = FTS5_SE
e360: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
e370: 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
e380: 30 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  0, pSeg->pgnoLas
e390: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  t);..      /* Th
e3a0: 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20  e last rowid in 
e3b0: 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20  the doclist may 
e3c0: 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75  not be on the cu
e3d0: 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72  rrent page. Sear
e3e0: 63 68 0a 20 20 20 20 20 20 20 2a 2a 20 66 6f 72  ch.       ** for
e3f0: 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65  ward to find the
e400: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   page containing
e410: 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e   the last rowid.
e420: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
e430: 41 62 73 2b 2b 3b 20 70 2d 3e 72 63 3d 3d 53 51  Abs++; p->rc==SQ
e440: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 41 62 73 3c  LITE_OK && iAbs<
e450: 3d 69 4c 61 73 74 3b 20 69 41 62 73 2b 2b 29 7b  =iLast; iAbs++){
e460: 0a 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74  .        Fts5Dat
e470: 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61  a *pNew = fts5Da
e480: 74 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b  taRead(p, iAbs);
e490: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
e4a0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
e4b0: 6e 74 20 69 52 6f 77 69 64 2c 20 69 54 65 72 6d  nt iRowid, iTerm
e4c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
e4d0: 4c 65 61 66 48 65 61 64 65 72 28 70 4e 65 77 2c  LeafHeader(pNew,
e4e0: 20 26 69 52 6f 77 69 64 2c 20 26 69 54 65 72 6d   &iRowid, &iTerm
e4f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
e500: 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20   iRowid ){.     
e510: 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20         Fts5Data 
e520: 2a 70 54 6d 70 20 3d 20 70 4c 61 73 74 3b 0a 20  *pTmp = pLast;. 
e530: 20 20 20 20 20 20 20 20 20 20 20 70 4c 61 73 74             pLast
e540: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
e550: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 6d 70       pNew = pTmp
e560: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67  ;.            pg
e570: 6e 6f 4c 61 73 74 20 3d 20 69 41 62 73 20 26 20  noLast = iAbs & 
e580: 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
e590: 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20  _DATA_PAGE_B) - 
e5a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  1);.          }.
e5b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 54            if( iT
e5c0: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  erm ){.         
e5d0: 20 20 20 69 41 62 73 20 3d 20 69 4c 61 73 74 3b     iAbs = iLast;
e5e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e5f0: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
e600: 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
e610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e620: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e630: 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c  If pLast is NULL
e640: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
e650: 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
e660: 77 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63  wid for this doc
e670: 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f  list.  ** lies o
e680: 6e 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  n the page curre
e690: 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
e6a0: 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20  y the iterator. 
e6b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20  In this case .  
e6c0: 2a 2a 20 69 4c 61 73 74 4f 66 66 20 69 73 20 73  ** iLastOff is s
e6d0: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
e6e0: 74 68 61 74 20 70 49 74 65 72 2d 3e 69 4c 65 61  that pIter->iLea
e6f0: 66 4f 66 66 73 65 74 20 77 69 6c 6c 20 74 61 6b  fOffset will tak
e700: 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  e when.  ** the 
e710: 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
e720: 74 6f 20 74 68 61 74 20 72 6f 77 69 64 2e 0a 20  to that rowid.. 
e730: 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20   **.  ** Or, if 
e740: 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  pLast is non-NUL
e750: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  L, then it is th
e760: 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
e770: 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20  ains the last.  
e780: 2a 2a 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20  ** rowid..  */. 
e790: 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20   if( pLast ){.  
e7a0: 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20    int dummy;.   
e7b0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
e7c0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
e7d0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
e7e0: 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49   = pLast;.    pI
e7f0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
e800: 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 66   pgnoLast;.    f
e810: 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4c  ts5LeafHeader(pL
e820: 61 73 74 2c 20 26 69 4f 66 66 2c 20 26 64 75 6d  ast, &iOff, &dum
e830: 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  my);.    iOff +=
e840: 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73   getVarint(&pLas
e850: 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t->p[iOff], (u64
e860: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e870: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
e880: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
e890: 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  ;.  }..  fts5Seg
e8a0: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
e8b0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  age(p, pIter);.}
e8c0: 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
e8d0: 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
e8e0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
e8f0: 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20  irst rowid of a 
e900: 64 6f 63 6c 69 73 74 20 77 69 74 68 69 6e 0a 2a  doclist within.*
e910: 2a 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68  * index iIdx. Th
e920: 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
e930: 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  -index associate
e940: 64 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c  d with the final
e950: 20 74 65 72 6d 20 6f 6e 0a 2a 2a 20 74 68 65 20   term on.** the 
e960: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 49 66  current page. If
e970: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
e980: 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65  m is the last te
e990: 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  rm on the page, 
e9a0: 0a 2a 2a 20 6c 6f 61 64 20 74 68 65 20 64 6f 63  .** load the doc
e9b0: 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20  list-index from 
e9c0: 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c  disk and initial
e9d0: 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ize an iterator 
e9e0: 61 74 20 0a 2a 2a 20 28 70 49 74 65 72 2d 3e 70  at .** (pIter->p
e9f0: 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69  Dlidx)..*/.stati
ea00: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
ea10: 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35  erLoadDlidx(Fts5
ea20: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49  Index *p, int iI
ea30: 64 78 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  dx, Fts5SegIter 
ea40: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
ea50: 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70  Segid = pIter->p
ea60: 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69  Seg->iSegid;.  i
ea70: 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72  nt bRev = (pIter
ea80: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
ea90: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b  EGITER_REVERSE);
eaa0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
eab0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
eac0: 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65  f; /* Current le
ead0: 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  af data */.  int
eae0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
eaf0: 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20  LeafOffset;  /* 
eb00: 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68  Byte offset with
eb10: 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  in current leaf 
eb20: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  */..  assert( pI
eb30: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
eb40: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
eb50: 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
eb60: 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20  Iter->pDlidx==0 
eb70: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
eb80: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  f the current do
eb90: 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68  clist ends on th
eba0: 69 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64  is page. If it d
ebb0: 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  oes, return.  **
ebc0: 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c   early without l
ebd0: 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  oading the docli
ebe0: 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20  st-index (as it 
ebf0: 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66  belongs to a dif
ec00: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d  ferent.  ** term
ec10: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 4f  . */.  while( iO
ec20: 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  ff<pLeaf->n ){. 
ec30: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
ec40: 20 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b     int nPoslist;
ec50: 0a 0a 20 20 20 20 2f 2a 20 69 4f 66 66 20 69 73  ..    /* iOff is
ec60: 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f   currently the o
ec70: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 69 7a  ffset of the siz
ec80: 65 20 66 69 65 6c 64 20 6f 66 20 61 20 70 6f 73  e field of a pos
ec90: 69 74 69 6f 6e 20 6c 69 73 74 2e 20 2a 2f 0a 20  ition list. */. 
eca0: 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
ecb0: 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
ecc0: 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73 74  [iOff], nPoslist
ecd0: 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  );.    iOff += n
ece0: 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 69 66  Poslist;..    if
ecf0: 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20  ( iOff<pLeaf->n 
ed00: 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  ){.      iOff +=
ed10: 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61   getVarint(&pLea
ed20: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
ed30: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
ed40: 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
ed50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ) return;.    }.
ed60: 20 20 7d 0a 0a 20 20 66 74 73 35 44 6c 69 64 78    }..  fts5Dlidx
ed70: 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76  IterInit(p, bRev
ed80: 2c 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  , iIdx, iSegid, 
ed90: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
eda0: 2c 20 26 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  , &pIter->pDlidx
edb0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
edc0: 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
edd0: 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
ede0: 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
edf0: 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d  Term within segm
ee00: 65 6e 74 0a 2a 2a 20 70 53 65 67 2c 20 69 6e 64  ent.** pSeg, ind
ee10: 65 78 20 69 49 64 78 2e 20 49 66 20 74 68 65 72  ex iIdx. If ther
ee20: 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72  e is no such ter
ee30: 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  m in the index, 
ee40: 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20  the iterator.** 
ee50: 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
ee60: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
ee70: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
ee80: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
ee90: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
eea0: 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
eeb0: 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
eec0: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
eed0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
eee0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
eef0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ef00: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ef10: 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
ef20: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
ef50: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  nd */.  int iIdx
ef60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ef70: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
ef80: 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20  g.aHash[] index 
ef90: 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a  of FTS index */.
efa0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
efb0: 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
efc0: 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
efd0: 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  k to */.  int fl
efe0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
eff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
f000: 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58  k of FTS5INDEX_X
f010: 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  XX flags */.  Ft
f020: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
f030: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
f040: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
f050: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
f060: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f080: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
f090: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
f0a0: 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 68 3b  Pg = 1;.  int h;
f0b0: 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28 28 66  .  int bGe = ((f
f0c0: 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
f0d0: 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29 20 26  _QUERY_PREFIX) &
f0e0: 26 20 69 49 64 78 3d 3d 30 29 3b 0a 20 20 69 6e  & iIdx==0);.  in
f0f0: 74 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20  t bDlidx = 0;   
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f110: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69   True if there i
f120: 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
f130: 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  x */..  assert( 
f140: 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  bGe==0 || (flags
f150: 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
f160: 52 59 5f 41 53 43 29 3d 3d 30 20 29 3b 0a 20 20  RY_ASC)==0 );.  
f170: 61 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26  assert( pTerm &&
f180: 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73   nTerm );.  mems
f190: 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
f1a0: 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
f1b0: 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
f1c0: 65 67 3b 0a 20 20 70 49 74 65 72 2d 3e 69 49 64  eg;.  pIter->iId
f1d0: 78 20 3d 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20  x = iIdx;..  /* 
f1e0: 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20  This block sets 
f1f0: 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69  stack variable i
f200: 50 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70  Pg to the leaf p
f210: 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
f220: 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  may.  ** contain
f230: 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65   term (pTerm/nTe
f240: 72 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70 72  rm), if it is pr
f250: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67  esent in the seg
f260: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 68  ment. */.  for(h
f270: 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31  =pSeg->nHeight-1
f280: 3b 20 68 3e 30 3b 20 68 2d 2d 29 7b 0a 20 20 20  ; h>0; h--){.   
f290: 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 6e 6f   Fts5NodeIter no
f2a0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
f2b0: 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e   /* For iteratin
f2c0: 67 20 74 68 72 6f 75 67 68 20 69 6e 74 65 72 6e  g through intern
f2d0: 61 6c 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 20 20  al nodes */.    
f2e0: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
f2f0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
f300: 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67  iIdx, pSeg->iSeg
f310: 69 64 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20 20  id, h, iPg);.   
f320: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 6f 64 65   Fts5Data *pNode
f330: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
f340: 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  p, iRowid);.    
f350: 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62  if( pNode==0 ) b
f360: 72 65 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e  reak;..    fts5N
f370: 6f 64 65 49 74 65 72 49 6e 69 74 28 70 4e 6f 64  odeIterInit(pNod
f380: 65 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20  e->p, pNode->n, 
f390: 26 6e 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65  &node);.    asse
f3a0: 72 74 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d  rt( node.term.n=
f3b0: 3d 30 20 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d  =0 );..    iPg =
f3c0: 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20   node.iChild;.  
f3d0: 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e    bDlidx = node.
f3e0: 62 44 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72 28  bDlidx;.    for(
f3f0: 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74  fts5NodeIterNext
f400: 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b  (&p->rc, &node);
f410: 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 2e 61 44  .        node.aD
f420: 61 74 61 20 26 26 20 66 74 73 35 42 75 66 66 65  ata && fts5Buffe
f430: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f  rCompareBlob(&no
f440: 64 65 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20  de.term, pTerm, 
f450: 6e 54 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20  nTerm)<=0;.     
f460: 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e     fts5NodeIterN
f470: 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64  ext(&p->rc, &nod
f480: 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
f490: 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c  iPg = node.iChil
f4a0: 64 3b 0a 20 20 20 20 20 20 62 44 6c 69 64 78 20  d;.      bDlidx 
f4b0: 3d 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20  = node.bDlidx;. 
f4c0: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64     }.    fts5Nod
f4d0: 65 49 74 65 72 46 72 65 65 28 26 6e 6f 64 65 29  eIterFree(&node)
f4e0: 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
f4f0: 6c 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20  lease(pNode);.  
f500: 7d 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  }..  if( iPg<pSe
f510: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
f520: 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
f530: 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
f540: 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
f550: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
f560: 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
f570: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
f580: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
f590: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
f5a0: 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  af ){.    int re
f5b0: 73 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  s;.    pIter->iL
f5c0: 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
f5d0: 47 65 74 55 31 36 28 26 70 49 74 65 72 2d 3e 70  GetU16(&pIter->p
f5e0: 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20  Leaf->p[2]);.   
f5f0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
f600: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30  Term(p, pIter, 0
f610: 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  );.    do {.    
f620: 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66    res = fts5Buff
f630: 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70  erCompareBlob(&p
f640: 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72  Iter->term, pTer
f650: 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
f660: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62 72   if( res>=0 ) br
f670: 65 61 6b 3b 0a 20 20 20 20 20 20 66 74 73 35 53  eak;.      fts5S
f680: 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  egIterNext(p, pI
f690: 74 65 72 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ter);.    }while
f6a0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
f6b0: 3b 0a 0a 20 20 20 20 69 66 28 20 62 47 65 3d 3d  ;..    if( bGe==
f6c0: 30 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  0 && res ){.    
f6d0: 20 20 2f 2a 20 53 65 74 20 69 74 65 72 61 74 6f    /* Set iterato
f6e0: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f  r to point to EO
f6f0: 46 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44  F */.      fts5D
f700: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
f710: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
f720: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
f730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
f740: 66 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20  f( bGe==0 ){.   
f750: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
f760: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
f770: 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
f780: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
f790: 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
f7a0: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
f7b0: 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  _ASC ){.        
f7c0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
f7d0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
f7e0: 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERSE;.      }.  
f7f0: 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29      if( bDlidx )
f800: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
f810: 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70  gIterLoadDlidx(p
f820: 2c 20 69 49 64 78 2c 20 70 49 74 65 72 29 3b 0a  , iIdx, pIter);.
f830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f840: 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
f850: 44 45 58 5f 51 55 45 52 59 5f 41 53 43 20 29 7b  DEX_QUERY_ASC ){
f860: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
f870: 49 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 69  IterReverse(p, i
f880: 49 64 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  Idx, pIter);.   
f890: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
f8a0: 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65  ../*.** Zero the
f8b0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
f8c0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
f8d0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
f8e0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
f8f0: 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74  rClear(Fts5SegIt
f900: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74  er *pIter){.  ft
f910: 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
f920: 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  ter->term);.  ft
f930: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
f940: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66  ter->pLeaf);.  f
f950: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
f960: 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b  (pIter->pDlidx);
f970: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
f980: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
f990: 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  set);.  memset(p
f9a0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
f9b0: 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d  Fts5SegIter));.}
f9c0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63  ../*.** Do the c
f9d0: 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73  omparison necess
f9e0: 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ary to populate 
f9f0: 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
fa00: 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ut]..**.** If th
fa10: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
fa20: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
fa30: 65 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64  en it is the ind
fa40: 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a  ex of an entry.*
fa50: 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e  * in the pIter->
fa60: 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61  aSeg[] array tha
fa70: 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20  t is (a) not at 
fa80: 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69  EOF, and (b) poi
fa90: 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65  nting.** to a ke
faa0: 79 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c  y that is a dupl
fab0: 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
fac0: 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74  , higher priorit
fad0: 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69  y, .** segment-i
fae0: 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70  terator in the p
faf0: 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61  Seg->aSeg[] arra
fb00: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
fb10: 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
fb20: 43 6f 6d 70 61 72 65 28 46 74 73 35 4d 75 6c 74  Compare(Fts5Mult
fb30: 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
fb40: 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e   int iOut){.  in
fb50: 74 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20  t i1;           
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb70: 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68   Index of left-h
fb80: 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
fb90: 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20  */.  int i2;    
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
fbc0: 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   right-hand Fts5
fbd0: 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74  SegIter */.  int
fbe0: 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67   iRes;.  Fts5Seg
fbf0: 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20  Iter *p1;       
fc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
fc10: 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
fc20: 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  r */.  Fts5SegIt
fc30: 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20  er *p2;         
fc40: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d         /* Right-
fc50: 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
fc60: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
fc70: 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20  Out<pIter->nSeg 
fc80: 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61  && iOut>0 );.  a
fc90: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52  ssert( pIter->bR
fca0: 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e  ev==0 || pIter->
fcb0: 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  bRev==1 );..  if
fcc0: 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e  ( iOut>=(pIter->
fcd0: 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69  nSeg/2) ){.    i
fce0: 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65  1 = (iOut - pIte
fcf0: 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a  r->nSeg/2) * 2;.
fd00: 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b      i2 = i1 + 1;
fd10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31  .  }else{.    i1
fd20: 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
fd30: 5b 69 4f 75 74 2a 32 5d 3b 0a 20 20 20 20 69 32  [iOut*2];.    i2
fd40: 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
fd50: 5b 69 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a  [iOut*2+1];.  }.
fd60: 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61    p1 = &pIter->a
fd70: 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20  Seg[i1];.  p2 = 
fd80: 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d  &pIter->aSeg[i2]
fd90: 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  ;..  if( p1->pLe
fda0: 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  af==0 ){        
fdb0: 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61     /* If p1 is a
fdc0: 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65  t EOF */.    iRe
fdd0: 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20  s = i2;.  }else 
fde0: 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30  if( p2->pLeaf==0
fdf0: 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32   ){     /* If p2
fe00: 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20   is at EOF */.  
fe10: 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d    iRes = i1;.  }
fe20: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65  else{.    int re
fe30: 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f  s = fts5BufferCo
fe40: 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c  mpare(&p1->term,
fe50: 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20   &p2->term);.   
fe60: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
fe70: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e       assert( i2>
fe80: 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  i1 );.      asse
fe90: 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20  rt( i2!=0 );.   
fea0: 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69     if( p1->iRowi
feb0: 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 20  d==p2->iRowid ) 
fec0: 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20  return i2;.     
fed0: 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f   res = ((p1->iRo
fee0: 77 69 64 20 3c 20 70 32 2d 3e 69 52 6f 77 69 64  wid < p2->iRowid
fef0: 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20  )==pIter->bRev) 
ff00: 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d  ? -1 : +1;.    }
ff10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73  .    assert( res
ff20: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  !=0 );.    if( r
ff30: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52  es<0 ){.      iR
ff40: 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c  es = i1;.    }el
ff50: 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d  se{.      iRes =
ff60: 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   i2;.    }.  }..
ff70: 20 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b    pIter->aFirst[
ff80: 69 4f 75 74 5d 20 3d 20 69 52 65 73 3b 0a 20 20  iOut] = iRes;.  
ff90: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
ffa0: 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72  ** Free the iter
ffb0: 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ator object pass
ffc0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
ffd0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
ffe0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
fff0: 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35  ltiIterFree(Fts5
10000 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75  Index *p, Fts5Mu
10010 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
10020 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
10030 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
10040 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
10050 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  er->nSeg; i++){.
10060 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
10070 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e 61  rClear(&pIter->a
10080 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Seg[i]);.    }. 
10090 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
100a0 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  pIter);.  }.}..s
100b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
100c0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
100d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
100e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
100f0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
10100 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
10110 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 4d  ithin */.  Fts5M
10120 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
10130 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 74  er,        /* It
10140 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65  erator to update
10150 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20   aFirst[] array 
10160 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68  for */.  int iCh
10170 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20  anged,          
10180 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10190 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f  x of sub-iterato
101a0 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20  r just advanced 
101b0 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74  */.  int iMinset
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
101e0 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b  entry in aFirst[
101f0 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  ] to set */.){. 
10200 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
10210 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68  (pIter->nSeg+iCh
10220 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69  anged)/2; i>=iMi
10230 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53  nset && p->rc==S
10240 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29  QLITE_OK; i=i/2)
10250 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20  {.    int iEq;. 
10260 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
10270 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
10280 70 61 72 65 28 70 49 74 65 72 2c 20 69 29 29 20  pare(pIter, i)) 
10290 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
102a0 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70 49 74  IterNext(p, &pIt
102b0 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 29 3b 0a  er->aSeg[iEq]);.
102c0 20 20 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d        i = pIter-
102d0 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20  >nSeg + iEq;.   
102e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
102f0 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65  Move the seg-ite
10300 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
10310 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
10320 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
10330 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20  LeafPgno..** It 
10340 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c  is an error if l
10350 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 63 6f  eaf iLeafPgno co
10360 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 2e  ntains no rowid.
10370 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10380 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50  fts5SegIterGotoP
10390 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  age(.  Fts5Index
103a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
103b0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
103c0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
103d0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
103e0 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
103f0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
10400 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
10410 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a  nt iLeafPgno.){.
10420 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50    assert( iLeafP
10430 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
10440 50 67 6e 6f 20 29 3b 0a 20 20 69 66 28 20 70 2d  Pgno );.  if( p-
10450 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10460 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  {.    pIter->iLe
10470 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
10480 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65  no-1;.    fts5Se
10490 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
104a0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73   pIter);.    ass
104b0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
104c0 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  TE_OK || pIter->
104d0 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66  iLeafPgno==iLeaf
104e0 50 67 6e 6f 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pgno );.  }..  i
104f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
10500 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
10510 4f 66 66 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d  Off;.    u8 *a =
10520 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
10530 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49  ;.    int n = pI
10540 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a  ter->pLeaf->n;..
10550 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47      iOff = fts5G
10560 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20  etU16(&a[0]);.  
10570 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
10580 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
10590 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
105a0 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
105b0 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  {.      iOff += 
105c0 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  getVarint(&a[iOf
105d0 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
105e0 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
105f0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
10600 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
10610 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
10620 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
10630 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
10640 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10650 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74  t until it is at
10660 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77   or .** past row
10670 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64  id iFrom. Regard
10680 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
10690 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20  e of iFrom, the 
106a0 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61  iterator is.** a
106b0 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61  lways advanced a
106c0 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f  t least once..*/
106d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
106e0 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d  5SegIterNextFrom
106f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
10700 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10710 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
10720 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
10730 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
10740 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
10750 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
10760 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20  dvance */.  i64 
10770 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20  iMatch          
10780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10790 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
107a0 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61  at least this fa
107b0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52  r */.){.  int bR
107c0 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61  ev = (pIter->fla
107d0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
107e0 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74  R_REVERSE);.  Ft
107f0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
10800 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c  idx = pIter->pDl
10810 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66  idx;.  int iLeaf
10820 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c  Pgno = pIter->iL
10830 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62  eafPgno;.  int b
10840 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73  Move = 1;..  ass
10850 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
10860 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
10870 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73  _ONETERM );.  as
10880 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c  sert( pIter->pDl
10890 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28  idx );.  assert(
108a0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b   pIter->pLeaf );
108b0 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20  ..  if( bRev==0 
108c0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74  ){.    while( ft
108d0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
108e0 2c 20 70 44 6c 69 64 78 29 3d 3d 30 20 26 26 20  , pDlidx)==0 && 
108f0 69 4d 61 74 63 68 3c 70 44 6c 69 64 78 2d 3e 69  iMatch<pDlidx->i
10900 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69  Rowid ){.      i
10910 4c 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64  LeafPgno = pDlid
10920 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  x->iLeafPgno;.  
10930 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
10940 72 4e 65 78 74 28 70 44 6c 69 64 78 29 3b 0a 20  rNext(pDlidx);. 
10950 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
10960 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65   iLeafPgno>=pIte
10970 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20  r->iLeafPgno || 
10980 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28  p->rc );.    if(
10990 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
109a0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
109b0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
109c0 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65  GotoPage(p, pIte
109d0 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  r, iLeafPgno);. 
109e0 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a       bMove = 0;.
109f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
10a00 20 20 20 61 73 73 65 72 74 28 20 69 4d 61 74 63     assert( iMatc
10a10 68 3e 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20  h>pIter->iRowid 
10a20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74  );.    while( ft
10a30 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
10a40 2c 20 70 44 6c 69 64 78 29 3d 3d 30 20 26 26 20  , pDlidx)==0 && 
10a50 69 4d 61 74 63 68 3e 70 44 6c 69 64 78 2d 3e 69  iMatch>pDlidx->i
10a60 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 66  Rowid ){.      f
10a70 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
10a80 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a  (pDlidx);.    }.
10a90 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
10aa0 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e  pDlidx->iLeafPgn
10ab0 6f 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  o;..    assert( 
10ac0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
10ad0 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69  (p, pDlidx) || i
10ae0 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d  LeafPgno<=pIter-
10af0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20  >iLeafPgno );.. 
10b00 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f     if( iLeafPgno
10b10 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  <pIter->iLeafPgn
10b20 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  o ){.      pIter
10b30 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c  ->iLeafPgno = iL
10b40 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20  eafPgno+1;.     
10b50 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
10b60 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49  rseNewPage(p, pI
10b70 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76  ter);.      bMov
10b80 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
10b90 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
10ba0 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20 29 20      if( bMove ) 
10bb0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
10bc0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69  p, pIter);.    i
10bd0 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
10be0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
10bf0 69 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70  if( bRev==0 && p
10c00 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d  Iter->iRowid<=iM
10c10 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
10c20 20 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26    if( bRev!=0 &&
10c30 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d   pIter->iRowid>=
10c40 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
10c50 20 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20      bMove = 1;. 
10c60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65   }.}../*.** Move
10c70 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
10c80 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
10c90 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
10ca0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
10cb0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
10cc0 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
10cd0 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a  c. It is not .**
10ce0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
10cf0 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
10d00 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
10d10 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c  , or if it is al
10d20 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46  ready at .** EOF
10d30 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
10d40 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
10d50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10d60 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
10d70 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
10d80 20 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67   .  Fts5MultiSeg
10d90 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69  Iter *pIter,.  i
10da0 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt bFrom,       
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10dc0 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65  * True if argume
10dd0 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69  nt iFrom is vali
10de0 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d  d */.  i64 iFrom
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
10e10 65 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61  e at least as fa
10e20 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a  r as this */.){.
10e30 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
10e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
10e50 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72  t iFirst = pIter
10e60 2d 3e 61 46 69 72 73 74 5b 31 5d 3b 0a 20 20 20  ->aFirst[1];.   
10e70 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
10e80 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
10e90 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 69  g[iFirst];.    i
10ea0 66 28 20 62 46 72 6f 6d 20 26 26 20 70 53 65 67  f( bFrom && pSeg
10eb0 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ->pDlidx ){.    
10ec0 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
10ed0 74 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69  tFrom(p, pSeg, i
10ee0 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  From);.    }else
10ef0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
10f00 74 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 29  terNext(p, pSeg)
10f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
10f20 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
10f30 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
10f40 73 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  st, 1);.  }.}../
10f50 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
10f60 6e 65 77 20 46 74 73 35 4d 75 6c 74 69 53 65 67  new Fts5MultiSeg
10f70 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Iter object..**.
10f80 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
10f90 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
10fa0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
10fb0 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63 74  h data in struct
10fc0 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20  ure pStruct..** 
10fd0 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65  If iLevel is -ve
10fe0 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  , then all data 
10ff0 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  in all segments 
11000 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69  is merged. Or, i
11010 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a  f iLevel.** is z
11020 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20  ero or greater, 
11030 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69  data from the fi
11040 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67  rst nSegment seg
11050 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69  ments on level i
11060 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67  Level.** is merg
11070 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74  ed..**.** The it
11080 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79  erator initially
11090 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
110a0 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20  irst term/rowid 
110b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a  entry in the .**
110c0 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a   iterated data..
110d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
110e0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
110f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
11120 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
11130 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74  thin */.  Fts5St
11140 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
11150 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ,         /* Str
11160 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69 66  ucture of specif
11170 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ic index */.  in
11180 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
111a0 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20   Config.aHash[] 
111b0 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64  index of FTS ind
111c0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ex */.  int flag
111d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
111e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
111f0 66 6f 72 20 3e 3d 20 2a 2f 0a 20 20 63 6f 6e 73  for >= */.  cons
11200 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
11210 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
11220 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28  erm to seek to (
11230 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20  or NULL/0) */.  
11240 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72  /* Level to iter
11270 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29  ate (-1 for all)
11280 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
11290 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
112a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
112b0 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d  of segments to m
112c0 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29  erge (iLevel>=0)
112d0 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53   */.  Fts5MultiS
112e0 65 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  egIter **ppOut  
112f0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
11300 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
11310 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
11320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11330 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
11340 73 20 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69 6e  s merged */.  in
11350 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20  t nSlot;        
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11370 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d   Power of two >=
11380 20 6e 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69   nSeg */.  int i
11390 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Iter = 0;       
113a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f             /* */
113b0 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20  .  int iSeg;    
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
113e0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65  erate through se
113f0 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35  gments */.  Fts5
11400 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
11410 70 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74  pLvl;.  Fts5Mult
11420 69 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a  iSegIter *pNew;.
11430 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
11440 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30  m==0 && nTerm==0
11450 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b  ) || iLevel<0 );
11460 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
11470 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
11480 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72  w multi-seg-iter
11490 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 69  ator. */.  if( i
114a0 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 6e  Level<0 ){.    n
114b0 53 65 67 20 3d 20 66 74 73 35 53 74 72 75 63 74  Seg = fts5Struct
114c0 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
114d0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 65 6c  (pStruct);.  }el
114e0 73 65 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 4d  se{.    nSeg = M
114f0 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  IN(pStruct->aLev
11500 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c  el[iLevel].nSeg,
11510 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d 0a   nSegment);.  }.
11520 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e    for(nSlot=2; n
11530 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74  Slot<nSeg; nSlot
11540 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70 70  =nSlot*2);.  *pp
11550 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
11560 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20  5IdxMalloc(p, . 
11570 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
11580 4d 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20  MultiSegIter) + 
11590 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
115a0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
115b0 28 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20  (Fts5SegIter) * 
115c0 6e 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a  nSlot +       /*
115d0 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f   pNew->aSeg[] */
115e0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 31  .      sizeof(u1
115f0 36 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20  6) * nSlot      
11600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
11610 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a  ew->aFirst[] */.
11620 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d    );.  if( pNew=
11630 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
11640 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f  New->nSeg = nSlo
11650 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20  t;.  pNew->aSeg 
11660 3d 20 28 46 74 73 35 53 65 67 49 74 65 72 2a 29  = (Fts5SegIter*)
11670 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77  &pNew[1];.  pNew
11680 2d 3e 61 46 69 72 73 74 20 3d 20 28 75 31 36 2a  ->aFirst = (u16*
11690 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c  )&pNew->aSeg[nSl
116a0 6f 74 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65  ot];.  pNew->bRe
116b0 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26  v = (0!=(flags &
116c0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
116d0 5f 41 53 43 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  _ASC));..  /* In
116e0 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66  itialize each of
116f0 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73   the component s
11700 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
11710 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65  . */.  if( iLeve
11720 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53  l<0 ){.    Fts5S
11730 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
11740 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  End = &pStruct->
11750 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e  aLevel[pStruct->
11760 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72  nLevel];.    for
11770 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e  (pLvl=&pStruct->
11780 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c  aLevel[0]; pLvl<
11790 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20  pEnd; pLvl++){. 
117a0 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c       for(iSeg=pL
117b0 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67  vl->nSeg-1; iSeg
117c0 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20  >=0; iSeg--){.  
117d0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
117e0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
117f0 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69   = &pLvl->aSeg[i
11800 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74  Seg];.        Ft
11810 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
11820 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
11830 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  Iter++];.       
11840 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
11850 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
11860 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49  egIterInit(p, iI
11870 64 78 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  dx, pSeg, pIter)
11880 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11890 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
118a0 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70  egIterSeekInit(p
118b0 2c 20 69 49 64 78 2c 20 70 54 65 72 6d 2c 20 6e  , iIdx, pTerm, n
118c0 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65  Term, flags, pSe
118d0 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  g, pIter);.     
118e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
118f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
11900 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
11910 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b  >aLevel[iLevel];
11920 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53  .    for(iSeg=nS
11930 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
11940 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74  Seg--){.      ft
11950 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c  s5SegIterInit(p,
11960 20 69 49 64 78 2c 20 26 70 4c 76 6c 2d 3e 61 53   iIdx, &pLvl->aS
11970 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d  eg[iSeg], &pNew-
11980 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b  >aSeg[iIter++]);
11990 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
119a0 65 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67  ert( iIter==nSeg
119b0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
119c0 20 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65   above was succe
119d0 73 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70  ssful, each comp
119e0 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  onent iterators 
119f0 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a  now points .  **
11a00 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
11a10 74 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65  try in its segme
11a20 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
11a30 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
11a40 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61  .  ** aFirst[] a
11a50 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rray. Or, if an 
11a60 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
11a70 65 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65  ed, free the ite
11a80 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63  rator.  ** objec
11a90 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75  t and set the ou
11aa0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
11ab0 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28   NULL.  */.  if(
11ac0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11ad0 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74  K ){.    for(iIt
11ae0 65 72 3d 6e 53 6c 6f 74 2d 31 3b 20 69 49 74 65  er=nSlot-1; iIte
11af0 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20  r>0; iIter--){. 
11b00 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20       int iEq;.  
11b10 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66      if( (iEq = f
11b20 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
11b30 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65  mpare(pNew, iIte
11b40 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  r)) ){.        f
11b50 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
11b60 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45  , &pNew->aSeg[iE
11b70 71 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  q]);.        fts
11b80 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
11b90 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
11ba0 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
11bb0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
11bc0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
11bd0 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a  rFree(p, pNew);.
11be0 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a      *ppOut = 0;.
11bf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
11c00 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
11c10 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
11c20 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  OF or if an erro
11c30 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
11c40 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77  .** False otherw
11c50 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
11c60 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
11c70 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
11c80 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  , Fts5MultiSegIt
11c90 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
11ca0 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
11cb0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
11cc0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 70  r->aFirst[1] ].p
11cd0 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Leaf==0);.}../*.
11ce0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f  ** Return the ro
11cf0 77 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79  wid of the entry
11d00 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74   that the iterat
11d10 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
11d20 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68  nts.** to. If th
11d30 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
11d40 73 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68  s to EOF when th
11d50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11d60 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73  alled the.** res
11d70 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e  ults are undefin
11d80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ed..*/.static i6
11d90 34 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  4 fts5MultiIterR
11da0 6f 77 69 64 28 46 74 73 35 4d 75 6c 74 69 53 65  owid(Fts5MultiSe
11db0 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
11dc0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
11dd0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
11de0 72 73 74 5b 31 5d 20 5d 2e 70 4c 65 61 66 20 29  rst[1] ].pLeaf )
11df0 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ;.  return pIter
11e00 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
11e10 46 69 72 73 74 5b 31 5d 20 5d 2e 69 52 6f 77 69  First[1] ].iRowi
11e20 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
11e30 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
11e40 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
11e50 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  at or following 
11e60 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  iMatch..*/.stati
11e70 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
11e80 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
11e90 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
11ea0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
11eb0 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34  r *pIter, .  i64
11ec0 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69   iMatch.){.  whi
11ed0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34  le( 1 ){.    i64
11ee0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73   iRowid;.    fts
11ef0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
11f00 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74  , pIter, 1, iMat
11f10 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73  ch);.    if( fts
11f20 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
11f30 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b   pIter) ) break;
11f40 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74  .    iRowid = ft
11f50 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
11f60 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28  (pIter);.    if(
11f70 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20   pIter->bRev==0 
11f80 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63  && iRowid<=iMatc
11f90 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
11fa0 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d  f( pIter->bRev!=
11fb0 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61  0 && iRowid>=iMa
11fc0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  tch ) break;.  }
11fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11fe0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
11ff0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
12000 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63  g the term assoc
12010 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a  iated with the .
12020 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  ** entry that th
12030 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65  e iterator curre
12040 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
12050 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
12060 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65  u8 *fts5MultiIte
12070 72 54 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53  rTerm(Fts5MultiS
12080 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
12090 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53  nt *pn){.  Fts5S
120a0 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74  egIter *p = &pIt
120b0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
120c0 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20  >aFirst[1] ];.  
120d0 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b  *pn = p->term.n;
120e0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72  .  return p->ter
120f0 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  m.p;.}../*.** Re
12100 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
12110 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20   chunk iterator 
12120 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
12130 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12140 0a 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69  .** at EOF. Or i
12150 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
12160 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e  lready occurred.
12170 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
12180 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61  rn false..*/.sta
12190 74 69 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e  tic int fts5Chun
121a0 6b 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  kIterEof(Fts5Ind
121b0 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b  ex *p, Fts5Chunk
121c0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
121d0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c  return (p->rc ||
121e0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
121f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
12200 6e 63 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74  nce the chunk-it
12210 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
12220 78 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61  xt chunk of data
12230 20 74 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61   to read..*/.sta
12240 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
12250 6e 6b 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  nkIterNext(Fts5I
12260 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75  ndex *p, Fts5Chu
12270 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  nkIter *pIter){.
12280 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
12290 3e 6e 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20  >nRem>=pIter->n 
122a0 29 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d  );.  pIter->nRem
122b0 20 2d 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20   -= pIter->n;.  
122c0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
122d0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
122e0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
122f0 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20  0;.  pIter->p = 
12300 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  0;.  if( pIter->
12310 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74  nRem>0 ){.    Ft
12320 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
12330 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52     pIter->iLeafR
12340 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61  owid++;.    pLea
12350 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
12360 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
12370 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52  p, pIter->iLeafR
12380 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70  owid);.    if( p
12390 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49  Leaf ){.      pI
123a0 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74  ter->n = MIN(pIt
123b0 65 72 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d  er->nRem, pLeaf-
123c0 3e 6e 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74  >n-4);.      pIt
123d0 65 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70  er->p = pLeaf->p
123e0 2b 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  +4;.    }.  }.}.
123f0 0a 2f 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65  ./*.** Intialize
12400 20 74 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61   the chunk itera
12410 74 6f 72 20 74 6f 20 72 65 61 64 20 74 68 65 20  tor to read the 
12420 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
12430 74 61 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a  ta for which .**
12440 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20   the size field 
12450 69 73 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66  is at offset iOf
12460 66 20 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e  f of leaf pLeaf.
12470 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
12480 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e   fts5ChunkIterIn
12490 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
124a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
124b0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
124c0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
124d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
124e0 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
124f0 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65    /* Segment ite
12500 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f  rator to read po
12510 73 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  slist from */.  
12520 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70  Fts5ChunkIter *p
12530 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
12540 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
12550 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
12560 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67    int iId = pSeg
12570 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
12580 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 46 54    i64 rowid = FT
12590 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
125a0 28 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64  (pSeg->iIdx, iId
125b0 2c 20 30 2c 20 70 53 65 67 2d 3e 69 4c 65 61 66  , 0, pSeg->iLeaf
125c0 50 67 6e 6f 29 3b 0a 20 20 46 74 73 35 44 61 74  Pgno);.  Fts5Dat
125d0 61 20 2a 70 4c 65 61 66 20 3d 20 70 53 65 67 2d  a *pLeaf = pSeg-
125e0 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f  >pLeaf;.  int iO
125f0 66 66 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66  ff = pSeg->iLeaf
12600 4f 66 66 73 65 74 3b 0a 0a 20 20 6d 65 6d 73 65  Offset;..  memse
12610 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
12620 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
12630 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64  Iter->iLeafRowid
12640 20 3d 20 72 6f 77 69 64 3b 0a 20 20 69 66 28 20   = rowid;.  if( 
12650 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b  iOff<pLeaf->n ){
12660 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 66  .    fts5DataRef
12670 65 72 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20  erence(pLeaf);. 
12680 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
12690 3d 20 70 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  = pLeaf;.  }else
126a0 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 65  {.    pIter->nRe
126b0 6d 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 43  m = 1;.    fts5C
126c0 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20  hunkIterNext(p, 
126d0 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
126e0 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
126f0 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20      iOff = 4;.  
12700 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
12710 3e 70 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 69  >pLeaf;.  }..  i
12720 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
12730 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
12740 66 5d 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29  f], pIter->nRem)
12750 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d  ;.  pIter->n = M
12760 49 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f  IN(pLeaf->n - iO
12770 66 66 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29  ff, pIter->nRem)
12780 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70  ;.  pIter->p = p
12790 4c 65 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a  Leaf->p + iOff;.
127a0 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d  .  if( pIter->n=
127b0 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68  =0 ){.    fts5Ch
127c0 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70  unkIterNext(p, p
127d0 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
127e0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68  atic void fts5Ch
127f0 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46  unkIterRelease(F
12800 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49  ts5ChunkIter *pI
12810 74 65 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61  ter){.  fts5Data
12820 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
12830 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
12840 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pLeaf = 0;.}../*
12850 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74  .** Read and ret
12860 75 72 6e 20 74 68 65 20 6e 65 78 74 20 33 32 2d  urn the next 32-
12870 62 69 74 20 76 61 72 69 6e 74 20 66 72 6f 6d 20  bit varint from 
12880 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
12890 74 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70  t iterator .** p
128a0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
128b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
128c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
128d0 6f 63 63 75 72 73 2c 20 7a 65 72 6f 20 69 73 20  occurs, zero is 
128e0 72 65 74 75 72 6e 65 64 20 61 6e 20 61 6e 20 65  returned an an e
128f0 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
12900 6e 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 2e  n .** Fts5Index.
12910 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rc. If an error 
12920 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
12930 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
12940 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
12950 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
12960 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
12970 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72 52 65  nt fts5PosIterRe
12980 61 64 56 61 72 69 6e 74 28 46 74 73 35 49 6e 64  adVarint(Fts5Ind
12990 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74  ex *p, Fts5PosIt
129a0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
129b0 74 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 69 66  t iVal = 0;.  if
129c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
129d0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  OK ){.    if( pI
129e0 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72  ter->iOff>=pIter
129f0 2d 3e 63 68 75 6e 6b 2e 6e 20 29 7b 0a 20 20 20  ->chunk.n ){.   
12a00 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
12a10 4e 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e  Next(p, &pIter->
12a20 63 68 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66  chunk);.      if
12a30 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45  ( fts5ChunkIterE
12a40 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68  of(p, &pIter->ch
12a50 75 6e 6b 29 20 29 20 72 65 74 75 72 6e 20 30 3b  unk) ) return 0;
12a60 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4f  .      pIter->iO
12a70 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ff = 0;.    }.  
12a80 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
12a90 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49   getVarint32(&pI
12aa0 74 65 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74  ter->chunk.p[pIt
12ab0 65 72 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29  er->iOff], iVal)
12ac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
12ad0 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  Val;.}../*.** Ad
12ae0 76 61 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69  vance the positi
12af0 6f 6e 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72  on list iterator
12b00 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
12b10 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
12b20 69 64 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65  id fts5PosIterNe
12b30 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
12b40 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49   Fts5PosIter *pI
12b50 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c  ter){.  int iVal
12b60 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35  ;.  assert( fts5
12b70 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20  ChunkIterEof(p, 
12b80 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d  &pIter->chunk)==
12b90 30 20 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74  0 );.  iVal = ft
12ba0 73 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72  s5PosIterReadVar
12bb0 69 6e 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  int(p, pIter);. 
12bc0 20 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74   if( fts5ChunkIt
12bd0 65 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d  erEof(p, &pIter-
12be0 3e 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20  >chunk)==0 ){.  
12bf0 20 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b    if( iVal==1 ){
12c00 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43  .      pIter->iC
12c10 6f 6c 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72  ol = fts5PosIter
12c20 52 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49  ReadVarint(p, pI
12c30 74 65 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ter);.      pIte
12c40 72 2d 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f  r->iPos = fts5Po
12c50 73 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28  sIterReadVarint(
12c60 70 2c 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20  p, pIter) - 2;. 
12c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c80 70 49 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28  pIter->iPos += (
12c90 69 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d  iVal - 2);.    }
12ca0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
12cb0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73  itialize the Fts
12cc0 35 50 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20  5PosIter object 
12cd0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
12ce0 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  nal argument to 
12cf0 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
12d00 67 68 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  gh the position-
12d10 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 20  list associated 
12d20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 65  with the index e
12d30 6e 74 72 79 20 74 68 61 74 20 69 74 65 72 61 74  ntry that iterat
12d40 6f 72 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75  or .** pMulti cu
12d50 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
12d60 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
12d70 64 20 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69  d fts5PosIterIni
12d80 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
12d90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12da0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
12db0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
12dc0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
12dd0 72 20 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20  r *pMulti,      
12de0 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74   /* Multi-seg it
12df0 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70  erator to read p
12e00 6f 73 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a  os-list from */.
12e10 20 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70    Fts5PosIter *p
12e20 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
12e30 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
12e40 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  this object */.)
12e50 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
12e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12e70 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
12e80 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65  g = &pMulti->aSe
12e90 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73  g[ pMulti->aFirs
12ea0 74 5b 31 5d 20 5d 3b 0a 20 20 20 20 6d 65 6d 73  t[1] ];.    mems
12eb0 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
12ec0 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
12ed0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49    fts5ChunkIterI
12ee0 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 70 49  nit(p, pSeg, &pI
12ef0 74 65 72 2d 3e 63 68 75 6e 6b 29 3b 0a 20 20 20  ter->chunk);.   
12f00 20 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74   if( fts5ChunkIt
12f10 65 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d  erEof(p, &pIter-
12f20 3e 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20  >chunk)==0 ){.  
12f30 20 20 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e      fts5PosIterN
12f40 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
12f50 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12f60 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
12f70 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
12f80 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
12f90 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12fa0 6d 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f  ment is.** at EO
12fb0 46 2e 20 4f 72 20 69 66 20 61 6e 20 65 72 72 6f  F. Or if an erro
12fc0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
12fd0 63 75 72 72 65 64 2e 20 4f 74 68 65 72 77 69 73  curred. Otherwis
12fe0 65 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  e, return false.
12ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
13000 74 73 35 50 6f 73 49 74 65 72 45 6f 66 28 46 74  ts5PosIterEof(Ft
13010 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
13020 50 6f 73 49 74 65 72 20 2a 70 49 74 65 72 29 7b  PosIter *pIter){
13030 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
13040 20 7c 7c 20 70 49 74 65 72 2d 3e 63 68 75 6e 6b   || pIter->chunk
13050 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 0a  .pLeaf==0);.}...
13060 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  /*.** Allocate m
13070 65 6d 6f 72 79 2e 20 54 68 65 20 64 69 66 66 65  emory. The diffe
13080 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
13090 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
130a0 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 29 0a  fts5IdxMalloc().
130b0 2a 2a 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ** is that this 
130c0 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 46  increments the F
130d0 74 73 35 49 6e 64 65 78 2e 6e 50 65 6e 64 69 6e  ts5Index.nPendin
130e0 67 44 61 74 61 20 76 61 72 69 61 62 6c 65 20 62  gData variable b
130f0 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  y the.** number 
13100 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
13110 65 64 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  ed. It should be
13120 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 6c   used for all al
13130 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 0a 2a  locations used.*
13140 2a 20 74 6f 20 73 74 6f 72 65 20 70 65 6e 64 69  * to store pendi
13150 6e 67 2d 64 61 74 61 20 77 69 74 68 69 6e 20 74  ng-data within t
13160 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
13170 68 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  h tables..*/.sta
13180 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 50 65  tic void *fts5Pe
13190 6e 64 69 6e 67 4d 61 6c 6c 6f 63 28 46 74 73 35  ndingMalloc(Fts5
131a0 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42  Index *p, int nB
131b0 79 74 65 29 7b 0a 20 20 70 2d 3e 6e 50 65 6e 64  yte){.  p->nPend
131c0 69 6e 67 44 61 74 61 20 2b 3d 20 6e 42 79 74 65  ingData += nByte
131d0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
131e0 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74  dxMalloc(p, nByt
131f0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  e);.}../*.** Add
13200 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 28 69   an entry for (i
13210 52 6f 77 69 64 2f 69 43 6f 6c 2f 69 50 6f 73 29  Rowid/iCol/iPos)
13220 20 74 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20   to the doclist 
13230 66 6f 72 20 28 70 54 6f 6b 65 6e 2f 6e 54 6f 6b  for (pToken/nTok
13240 65 6e 29 0a 2a 2a 20 69 6e 20 68 61 73 68 20 74  en).** in hash t
13250 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 20 69  able for index i
13260 49 64 78 2e 20 49 66 20 69 49 64 78 20 69 73 20  Idx. If iIdx is 
13270 7a 65 72 6f 2c 20 74 68 69 73 20 69 73 20 74 68  zero, this is th
13280 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 0a 2a 2a  e main terms .**
13290 20 69 6e 64 65 78 2e 20 56 61 6c 75 65 73 20 6f   index. Values o
132a0 66 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 20  f 1 and greater 
132b0 66 6f 72 20 69 49 64 78 20 61 72 65 20 70 72 65  for iIdx are pre
132c0 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a  fix indexes..**.
132d0 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
132e0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
132f0 64 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  d, set the Fts5I
13300 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
13310 64 65 20 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  de .** according
13320 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
13330 69 64 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f  id fts5AddTermTo
13340 48 61 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  Hash(.  Fts5Inde
13350 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
13360 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13370 20 6f 62 6a 65 63 74 20 74 6f 20 77 72 69 74 65   object to write
13380 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64   to */.  int iId
13390 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
133a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72           /* Entr
133b0 79 20 69 6e 20 70 2d 3e 61 48 61 73 68 5b 5d 20  y in p->aHash[] 
133c0 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 69  to update */.  i
133d0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
133f0 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
13400 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
13410 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
13420 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13440 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
13450 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
13460 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
13470 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
13480 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
13490 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
134a0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
134b0 78 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f  x */.){.  Fts5Co
134c0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
134d0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74  p->pConfig;.  Ft
134e0 73 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20  s3Hash *pHash;. 
134f0 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
13500 69 73 74 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20  ist *pDoclist;. 
13510 20 46 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c   Fts5PendingPosl
13520 69 73 74 20 2a 70 50 6f 73 6c 69 73 74 3b 0a 20  ist *pPoslist;. 
13530 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d   i64 iRowid = p-
13540 3e 69 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20  >iWriteRowid;   
13550 20 20 2f 2a 20 52 6f 77 69 64 20 61 73 73 6f 63    /* Rowid assoc
13560 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
13570 20 74 6f 6b 65 6e 73 20 2a 2f 0a 0a 20 20 2f 2a   tokens */..  /*
13580 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
13590 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64   already occured
135a0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
135b0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
135c0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
135d0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
135e0 20 46 69 6e 64 20 74 68 65 20 68 61 73 68 20 74   Find the hash t
135f0 61 62 6c 65 20 74 6f 20 75 73 65 2e 20 49 74 20  able to use. It 
13600 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
13610 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20   allocated. */. 
13620 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
13630 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
13640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  );.  assert( iId
13650 78 3d 3d 30 20 7c 7c 20 6e 54 6f 6b 65 6e 3d 3d  x==0 || nToken==
13660 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
13670 5b 69 49 64 78 2d 31 5d 20 29 3b 0a 20 20 70 48  [iIdx-1] );.  pH
13680 61 73 68 20 3d 20 26 70 2d 3e 61 48 61 73 68 5b  ash = &p->aHash[
13690 69 49 64 78 5d 3b 0a 0a 20 20 2f 2a 20 46 69 6e  iIdx];..  /* Fin
136a0 64 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 6f  d the doclist to
136b0 20 61 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c 6f   append to. Allo
136c0 63 61 74 65 20 61 20 6e 65 77 20 64 6f 63 6c 69  cate a new docli
136d0 73 74 20 6f 62 6a 65 63 74 20 69 66 0a 20 20 2a  st object if.  *
136e0 2a 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  * required. */. 
136f0 20 70 44 6f 63 6c 69 73 74 20 3d 20 28 46 74 73   pDoclist = (Fts
13700 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 2a  5PendingDoclist*
13710 29 66 74 73 33 48 61 73 68 46 69 6e 64 28 70 48  )fts3HashFind(pH
13720 61 73 68 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  ash, pToken, nTo
13730 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 44 6f 63  ken);.  if( pDoc
13740 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46  list==0 ){.    F
13750 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
13760 74 20 2a 70 44 65 6c 3b 0a 20 20 20 20 70 44 6f  t *pDel;.    pDo
13770 63 6c 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64  clist = fts5Pend
13780 69 6e 67 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  ingMalloc(p, siz
13790 65 6f 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44  eof(Fts5PendingD
137a0 6f 63 6c 69 73 74 29 20 2b 20 6e 54 6f 6b 65 6e  oclist) + nToken
137b0 29 3b 0a 20 20 20 20 69 66 28 20 70 44 6f 63 6c  );.    if( pDocl
137c0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
137d0 0a 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 70  .    pDoclist->p
137e0 54 65 72 6d 20 3d 20 28 75 38 2a 29 26 70 44 6f  Term = (u8*)&pDo
137f0 63 6c 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 44  clist[1];.    pD
13800 6f 63 6c 69 73 74 2d 3e 6e 54 65 72 6d 20 3d 20  oclist->nTerm = 
13810 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 6d 65 6d 63  nToken;.    memc
13820 70 79 28 70 44 6f 63 6c 69 73 74 2d 3e 70 54 65  py(pDoclist->pTe
13830 72 6d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  rm, pToken, nTok
13840 65 6e 29 3b 0a 20 20 20 20 70 44 65 6c 20 3d 20  en);.    pDel = 
13850 66 74 73 33 48 61 73 68 49 6e 73 65 72 74 28 70  fts3HashInsert(p
13860 48 61 73 68 2c 20 70 44 6f 63 6c 69 73 74 2d 3e  Hash, pDoclist->
13870 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 2c 20 70  pTerm, nToken, p
13880 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 69 66  Doclist);.    if
13890 28 20 70 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pDel ){.      
138a0 61 73 73 65 72 74 28 20 70 44 6f 63 6c 69 73 74  assert( pDoclist
138b0 3d 3d 70 44 65 6c 20 29 3b 0a 20 20 20 20 20 20  ==pDel );.      
138c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65  sqlite3_free(pDe
138d0 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20  l);.      p->rc 
138e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
138f0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
13900 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
13910 6e 64 20 74 68 65 20 70 6f 73 6c 69 73 74 20 74  nd the poslist t
13920 6f 20 61 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c  o append to. All
13930 6f 63 61 74 65 20 61 20 6e 65 77 20 6f 62 6a 65  ocate a new obje
13940 63 74 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  ct if required. 
13950 2a 2f 0a 20 20 70 50 6f 73 6c 69 73 74 20 3d 20  */.  pPoslist = 
13960 70 44 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69  pDoclist->pPosli
13970 73 74 3b 0a 20 20 69 66 28 20 70 50 6f 73 6c 69  st;.  if( pPosli
13980 73 74 3d 3d 30 20 7c 7c 20 70 50 6f 73 6c 69 73  st==0 || pPoslis
13990 74 2d 3e 69 52 6f 77 69 64 21 3d 69 52 6f 77 69  t->iRowid!=iRowi
139a0 64 20 29 7b 0a 20 20 20 20 70 50 6f 73 6c 69 73  d ){.    pPoslis
139b0 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4d  t = fts5PendingM
139c0 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
139d0 46 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69  Fts5PendingPosli
139e0 73 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 50  st));.    if( pP
139f0 6f 73 6c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  oslist==0 ) retu
13a00 72 6e 3b 0a 20 20 20 20 70 50 6f 73 6c 69 73 74  rn;.    pPoslist
13a10 2d 3e 70 4e 65 78 74 20 3d 20 70 44 6f 63 6c 69  ->pNext = pDocli
13a20 73 74 2d 3e 70 50 6f 73 6c 69 73 74 3b 0a 20 20  st->pPoslist;.  
13a30 20 20 70 50 6f 73 6c 69 73 74 2d 3e 69 52 6f 77    pPoslist->iRow
13a40 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  id = iRowid;.   
13a50 20 70 44 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c   pDoclist->pPosl
13a60 69 73 74 20 3d 20 70 50 6f 73 6c 69 73 74 3b 0a  ist = pPoslist;.
13a70 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 43      pDoclist->iC
13a80 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 44 6f 63  ol = 0;.    pDoc
13a90 6c 69 73 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a  list->iPos = 0;.
13aa0 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
13ab0 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 74   the values to t
13ac0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
13ad0 2e 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3e  . */.  if( iCol>
13ae0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65  =0 ){.    p->nPe
13af0 6e 64 69 6e 67 44 61 74 61 20 2d 3d 20 70 50 6f  ndingData -= pPo
13b00 73 6c 69 73 74 2d 3e 62 75 66 2e 6e 53 70 61 63  slist->buf.nSpac
13b10 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 21  e;.    if( iCol!
13b20 3d 70 44 6f 63 6c 69 73 74 2d 3e 69 43 6f 6c 20  =pDoclist->iCol 
13b30 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
13b40 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
13b50 26 70 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73  &p->rc, &pPoslis
13b60 74 2d 3e 62 75 66 2c 20 31 29 3b 0a 20 20 20 20  t->buf, 1);.    
13b70 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
13b80 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
13b90 20 26 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2c   &pPoslist->buf,
13ba0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 44   iCol);.      pD
13bb0 6f 63 6c 69 73 74 2d 3e 69 43 6f 6c 20 3d 20 69  oclist->iCol = i
13bc0 43 6f 6c 3b 0a 20 20 20 20 20 20 70 44 6f 63 6c  Col;.      pDocl
13bd0 69 73 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a 20  ist->iPos = 0;. 
13be0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
13bf0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
13c00 26 70 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73  &p->rc, &pPoslis
13c10 74 2d 3e 62 75 66 2c 20 69 50 6f 73 20 2b 20 32  t->buf, iPos + 2
13c20 20 2d 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50 6f   - pDoclist->iPo
13c30 73 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64  s);.    p->nPend
13c40 69 6e 67 44 61 74 61 20 2b 3d 20 70 50 6f 73 6c  ingData += pPosl
13c50 69 73 74 2d 3e 62 75 66 2e 6e 53 70 61 63 65 3b  ist->buf.nSpace;
13c60 0a 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69  .    pDoclist->i
13c70 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20 7d 0a  Pos = iPos;.  }.
13c80 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
13c90 65 20 70 65 6e 64 69 6e 67 2d 64 6f 63 6c 69 73  e pending-doclis
13ca0 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  t object passed 
13cb0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
13cc0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
13cd0 76 6f 69 64 20 66 74 73 35 46 72 65 65 50 65 6e  void fts5FreePen
13ce0 64 69 6e 67 44 6f 63 6c 69 73 74 28 46 74 73 35  dingDoclist(Fts5
13cf0 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a  PendingDoclist *
13d00 70 29 7b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e  p){.  Fts5Pendin
13d10 67 50 6f 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69  gPoslist *pPosli
13d20 73 74 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e  st;.  Fts5Pendin
13d30 67 50 6f 73 6c 69 73 74 20 2a 70 4e 65 78 74 3b  gPoslist *pNext;
13d40 0a 20 20 66 6f 72 28 70 50 6f 73 6c 69 73 74 3d  .  for(pPoslist=
13d50 70 2d 3e 70 50 6f 73 6c 69 73 74 3b 20 70 50 6f  p->pPoslist; pPo
13d60 73 6c 69 73 74 3b 20 70 50 6f 73 6c 69 73 74 3d  slist; pPoslist=
13d70 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
13d80 74 20 3d 20 70 50 6f 73 6c 69 73 74 2d 3e 70 4e  t = pPoslist->pN
13d90 65 78 74 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ext;.    fts5Buf
13da0 66 65 72 46 72 65 65 28 26 70 50 6f 73 6c 69 73  ferFree(&pPoslis
13db0 74 2d 3e 62 75 66 29 3b 0a 20 20 20 20 73 71 6c  t->buf);.    sql
13dc0 69 74 65 33 5f 66 72 65 65 28 70 50 6f 73 6c 69  ite3_free(pPosli
13dd0 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  st);.  }.  sqlit
13de0 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  e3_free(p);.}../
13df0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
13e00 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72  emove data to or
13e10 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
13e20 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63   Each time a doc
13e30 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64  ument is .** add
13e40 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64  ed to or removed
13e50 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c   from the index,
13e60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
13e70 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20  s called one or 
13e80 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  more.** times..*
13e90 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  *.** For an inse
13ea0 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
13eb0 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
13ec0 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
13ed0 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a   new document..*
13ee0 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
13ef0 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  on is a delete, 
13f00 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
13f10 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63  d (at least) onc
13f20 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e  e for each.** un
13f30 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
13f40 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
13f50 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
13f60 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
13f70 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65  e iPos.** argume
13f80 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  nt is ignored fo
13f90 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 76  r a delete..*/.v
13fa0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49  oid sqlite3Fts5I
13fb0 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73  ndexWrite(.  Fts
13fc0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13fe0 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74  Index to write t
13ff0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  o */.  int iCol,
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
14020 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69   token appears i
14030 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65  n (-ve -> delete
14040 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c  ) */.  int iPos,
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
14070 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68  on of token with
14080 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  in column */.  c
14090 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
140a0 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f  n, int nToken  /
140b0 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f  * Token to add o
140c0 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66  r remove to or f
140d0 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  rom index */.){.
140e0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14100 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
14110 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64  rate through ind
14120 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  exes */.  Fts5Co
14130 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
14140 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 2f  p->pConfig;..  /
14150 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
14160 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65  s already occure
14170 64 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  d this call is a
14180 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
14190 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
141a0 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  K ) return;..  /
141b0 2a 20 41 6c 6c 6f 63 61 74 65 20 68 61 73 68 20  * Allocate hash 
141c0 74 61 62 6c 65 73 20 69 66 20 74 68 65 79 20 68  tables if they h
141d0 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  ave not already 
141e0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
141f0 2f 0a 20 20 69 66 28 20 70 2d 3e 61 48 61 73 68  /.  if( p->aHash
14200 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
14210 48 61 73 68 20 3d 20 70 43 6f 6e 66 69 67 2d 3e  Hash = pConfig->
14220 6e 50 72 65 66 69 78 20 2b 20 31 3b 0a 20 20 20  nPrefix + 1;.   
14230 20 70 2d 3e 61 48 61 73 68 20 3d 20 28 46 74 73   p->aHash = (Fts
14240 33 48 61 73 68 2a 29 73 71 6c 69 74 65 33 5f 6d  3Hash*)sqlite3_m
14250 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73  alloc(sizeof(Fts
14260 33 48 61 73 68 29 20 2a 20 6e 48 61 73 68 29 3b  3Hash) * nHash);
14270 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 48 61 73  .    if( p->aHas
14280 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  h==0 ){.      p-
14290 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
142a0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
142b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
142c0 6e 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20  nHash; i++){.   
142d0 20 20 20 20 20 66 74 73 33 48 61 73 68 49 6e 69       fts3HashIni
142e0 74 28 26 70 2d 3e 61 48 61 73 68 5b 69 5d 2c 20  t(&p->aHash[i], 
142f0 46 54 53 33 5f 48 41 53 48 5f 53 54 52 49 4e 47  FTS3_HASH_STRING
14300 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
14310 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64    }.  }..  /* Ad
14320 64 20 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20  d the new token 
14330 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d  to the main term
14340 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20 41 6e  s hash table. An
14350 64 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  d to each of the
14360 0a 20 20 2a 2a 20 70 72 65 66 69 78 20 68 61 73  .  ** prefix has
14370 68 20 74 61 62 6c 65 73 20 74 68 61 74 20 69 74  h tables that it
14380 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
14390 20 66 6f 72 2e 20 2a 2f 0a 20 20 66 74 73 35 41   for. */.  fts5A
143a0 64 64 54 65 72 6d 54 6f 48 61 73 68 28 70 2c 20  ddTermToHash(p, 
143b0 30 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70  0, iCol, iPos, p
143c0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
143d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
143e0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
143f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 6f  ++){.    if( nTo
14400 6b 65 6e 3e 3d 70 43 6f 6e 66 69 67 2d 3e 61 50  ken>=pConfig->aP
14410 72 65 66 69 78 5b 69 5d 20 29 7b 0a 20 20 20 20  refix[i] ){.    
14420 20 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48    fts5AddTermToH
14430 61 73 68 28 70 2c 20 69 2b 31 2c 20 69 43 6f 6c  ash(p, i+1, iCol
14440 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20  , iPos, pToken, 
14450 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
14460 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [i]);.    }.  }.
14470 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
14480 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
14490 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
144a0 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a  ture pStruct..**
144b0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
144c0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
144d0 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
144e0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
144f0 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  0 is .** returne
14500 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
14510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
14520 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
14530 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
14540 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
14550 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ruct){.  int i;.
14560 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
14570 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
14580 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
14590 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <100; i++){.    
145a0 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 20 20  int iSegid;.    
145b0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
145c0 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20  ss(sizeof(int), 
145d0 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b  (void*)&iSegid);
145e0 0a 20 20 20 20 69 53 65 67 69 64 20 3d 20 69 53  .    iSegid = iS
145f0 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20 46 54  egid & ((1 << FT
14600 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31 29  S5_DATA_ID_B)-1)
14610 3b 0a 20 20 20 20 69 66 28 20 69 53 65 67 69 64  ;.    if( iSegid
14620 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
14630 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
14640 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
14650 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
14660 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
14670 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
14680 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
14690 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
146a0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
146b0 20 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70     if( iSegid==p
146c0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
146d0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl].aSeg[iSeg].
146e0 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20  iSegid ){.      
146f0 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 30        iSegid = 0
14700 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14720 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 53      }.    if( iS
14730 65 67 69 64 20 29 20 72 65 74 75 72 6e 20 69 53  egid ) return iS
14740 65 67 69 64 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  egid;.  }..  p->
14750 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
14760 52 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  R;.  return 0;.}
14770 0a 0a 73 74 61 74 69 63 20 46 74 73 35 50 65 6e  ..static Fts5Pen
14780 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 66 74 73  dingDoclist *fts
14790 35 50 65 6e 64 69 6e 67 4d 65 72 67 65 28 0a 20  5PendingMerge(. 
147a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
147b0 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63    Fts5PendingDoc
147c0 6c 69 73 74 20 2a 70 4c 65 66 74 2c 0a 20 20 46  list *pLeft,.  F
147d0 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
147e0 74 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 46  t *pRight.){.  F
147f0 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
14800 74 20 2a 70 31 20 3d 20 70 4c 65 66 74 3b 0a 20  t *p1 = pLeft;. 
14810 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
14820 69 73 74 20 2a 70 32 20 3d 20 70 52 69 67 68 74  ist *p2 = pRight
14830 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44  ;.  Fts5PendingD
14840 6f 63 6c 69 73 74 20 2a 70 52 65 74 20 3d 20 30  oclist *pRet = 0
14850 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44  ;.  Fts5PendingD
14860 6f 63 6c 69 73 74 20 2a 2a 70 70 4f 75 74 20 3d  oclist **ppOut =
14870 20 26 70 52 65 74 3b 0a 0a 20 20 77 68 69 6c 65   &pRet;..  while
14880 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
14890 20 20 69 66 28 20 70 31 3d 3d 30 20 29 7b 0a 20    if( p1==0 ){. 
148a0 20 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 32       *ppOut = p2
148b0 3b 0a 20 20 20 20 20 20 70 32 20 3d 20 30 3b 0a  ;.      p2 = 0;.
148c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32      }else if( p2
148d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==0 ){.      *pp
148e0 4f 75 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20  Out = p1;.      
148f0 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p1 = 0;.    }els
14900 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d  e{.      int nCm
14910 70 20 3d 20 4d 49 4e 28 70 31 2d 3e 6e 54 65 72  p = MIN(p1->nTer
14920 6d 2c 20 70 32 2d 3e 6e 54 65 72 6d 29 3b 0a 20  m, p2->nTerm);. 
14930 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d       int res = m
14940 65 6d 63 6d 70 28 70 31 2d 3e 70 54 65 72 6d 2c  emcmp(p1->pTerm,
14950 20 70 32 2d 3e 70 54 65 72 6d 2c 20 6e 43 6d 70   p2->pTerm, nCmp
14960 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
14970 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e  ==0 ) res = p1->
14980 6e 54 65 72 6d 20 2d 20 70 32 2d 3e 6e 54 65 72  nTerm - p2->nTer
14990 6d 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65  m;..      if( re
149a0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  s>0 ){.        /
149b0 2a 20 70 32 20 69 73 20 73 6d 61 6c 6c 65 72 20  * p2 is smaller 
149c0 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 70 4f 75  */.        *ppOu
149d0 74 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 20 20  t = p2;.        
149e0 70 70 4f 75 74 20 3d 20 26 70 32 2d 3e 70 4e 65  ppOut = &p2->pNe
149f0 78 74 3b 0a 20 20 20 20 20 20 20 20 70 32 20 3d  xt;.        p2 =
14a00 20 70 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   p2->pNext;.    
14a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14a20 20 2f 2a 20 70 31 20 69 73 20 73 6d 61 6c 6c 65   /* p1 is smalle
14a30 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 70  r */.        *pp
14a40 4f 75 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20  Out = p1;.      
14a50 20 20 70 70 4f 75 74 20 3d 20 26 70 31 2d 3e 70    ppOut = &p1->p
14a60 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 31  Next;.        p1
14a70 20 3d 20 70 31 2d 3e 70 4e 65 78 74 3b 0a 20 20   = p1->pNext;.  
14a80 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 4f      }.      *ppO
14a90 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
14aa0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
14ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61  ;.}../*.** Extra
14ac0 63 74 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 66 72  ct all tokens fr
14ad0 6f 6d 20 68 61 73 68 20 74 61 62 6c 65 20 69 48  om hash table iH
14ae0 61 73 68 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  ash and link the
14af0 6d 20 69 6e 74 6f 20 61 20 6c 69 73 74 0a 2a 2a  m into a list.**
14b00 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
14b10 2e 20 54 68 65 20 68 61 73 68 20 74 61 62 6c 65  . The hash table
14b20 20 69 73 20 63 6c 65 61 72 65 64 20 62 65 66 6f   is cleared befo
14b30 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
14b40 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 70 6f   is.** the respo
14b50 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
14b60 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20   caller to free 
14b70 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
14b80 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
14b90 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  list..**.** If a
14ba0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
14bb0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
14bc0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
14bd0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
14be0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
14bf0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
14c00 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
14c10 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 50  .*/.static Fts5P
14c20 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 66  endingDoclist *f
14c30 74 73 35 50 65 6e 64 69 6e 67 4c 69 73 74 28 46  ts5PendingList(F
14c40 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
14c50 20 69 48 61 73 68 29 7b 0a 20 20 63 6f 6e 73 74   iHash){.  const
14c60 20 69 6e 74 20 6e 4d 65 72 67 65 53 6c 6f 74 20   int nMergeSlot 
14c70 3d 20 33 32 3b 0a 20 20 46 74 73 33 48 61 73 68  = 32;.  Fts3Hash
14c80 20 2a 70 48 61 73 68 3b 0a 20 20 46 74 73 33 48   *pHash;.  Fts3H
14c90 61 73 68 45 6c 65 6d 20 2a 70 45 3b 20 20 20 20  ashElem *pE;    
14ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
14cb0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
14cc0 2a 2f 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67  */.  Fts5Pending
14cd0 44 6f 63 6c 69 73 74 20 2a 2a 61 70 3b 0a 20 20  Doclist **ap;.  
14ce0 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69  Fts5PendingDocli
14cf0 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  st *pList;.  int
14d00 20 69 3b 0a 0a 20 20 61 70 20 3d 20 66 74 73 35   i;..  ap = fts5
14d10 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
14d20 65 6f 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44  eof(Fts5PendingD
14d30 6f 63 6c 69 73 74 2a 29 20 2a 20 6e 4d 65 72 67  oclist*) * nMerg
14d40 65 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 21 61  eSlot);.  if( !a
14d50 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  p ) return 0;.. 
14d60 20 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 48 61   pHash = &p->aHa
14d70 73 68 5b 69 48 61 73 68 5d 3b 0a 20 20 66 6f 72  sh[iHash];.  for
14d80 28 70 45 3d 66 74 73 33 48 61 73 68 46 69 72 73  (pE=fts3HashFirs
14d90 74 28 70 48 61 73 68 29 3b 20 70 45 3b 20 70 45  t(pHash); pE; pE
14da0 3d 66 74 73 33 48 61 73 68 4e 65 78 74 28 70 45  =fts3HashNext(pE
14db0 29 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  )){.    int i;. 
14dc0 20 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f     Fts5PendingDo
14dd0 63 6c 69 73 74 20 2a 70 44 6f 63 6c 69 73 74 20  clist *pDoclist 
14de0 3d 20 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  = (Fts5PendingDo
14df0 63 6c 69 73 74 2a 29 66 74 73 33 48 61 73 68 44  clist*)fts3HashD
14e00 61 74 61 28 70 45 29 3b 0a 20 20 20 20 61 73 73  ata(pE);.    ass
14e10 65 72 74 28 20 70 44 6f 63 6c 69 73 74 2d 3e 70  ert( pDoclist->p
14e20 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66  Next==0 );.    f
14e30 6f 72 28 69 3d 30 3b 20 61 70 5b 69 5d 3b 20 69  or(i=0; ap[i]; i
14e40 2b 2b 29 7b 0a 20 20 20 20 20 20 70 44 6f 63 6c  ++){.      pDocl
14e50 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e  ist = fts5Pendin
14e60 67 4d 65 72 67 65 28 70 2c 20 70 44 6f 63 6c 69  gMerge(p, pDocli
14e70 73 74 2c 20 61 70 5b 69 5d 29 3b 0a 20 20 20 20  st, ap[i]);.    
14e80 20 20 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20    ap[i] = 0;.   
14e90 20 7d 0a 20 20 20 20 61 70 5b 69 5d 20 3d 20 70   }.    ap[i] = p
14ea0 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Doclist;.  }..  
14eb0 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72  pList = 0;.  for
14ec0 28 69 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 53 6c  (i=0; i<nMergeSl
14ed0 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  ot; i++){.    pL
14ee0 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e  ist = fts5Pendin
14ef0 67 4d 65 72 67 65 28 70 2c 20 70 4c 69 73 74 2c  gMerge(p, pList,
14f00 20 61 70 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20   ap[i]);.  }..  
14f10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 29  sqlite3_free(ap)
14f20 3b 0a 20 20 66 74 73 33 48 61 73 68 43 6c 65 61  ;.  fts3HashClea
14f30 72 28 70 48 61 73 68 29 3b 0a 20 20 72 65 74 75  r(pHash);.  retu
14f40 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 0a 2f 2a  rn pList;.}.../*
14f50 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20  .** Discard all 
14f60 64 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63  data currently c
14f70 61 63 68 65 64 20 69 6e 20 74 68 65 20 68 61 73  ached in the has
14f80 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  h-tables..*/.sta
14f90 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
14fa0 65 78 44 69 73 63 61 72 64 44 61 74 61 28 46 74  exDiscardData(Ft
14fb0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
14fc0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
14fd0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
14fe0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
14ff0 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d  i=0; i<=pConfig-
15000 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a  >nPrefix; i++){.
15010 20 20 20 20 46 74 73 33 48 61 73 68 20 2a 70 48      Fts3Hash *pH
15020 61 73 68 20 3d 20 26 70 2d 3e 61 48 61 73 68 5b  ash = &p->aHash[
15030 69 5d 3b 0a 20 20 20 20 46 74 73 33 48 61 73 68  i];.    Fts3Hash
15040 45 6c 65 6d 20 2a 70 45 3b 20 20 20 20 20 20 20  Elem *pE;       
15050 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
15060 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
15070 20 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33 48      for(pE=fts3H
15080 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
15090 20 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73 68   pE; pE=fts3Hash
150a0 4e 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20 20  Next(pE)){.     
150b0 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
150c0 69 73 74 20 2a 70 44 6f 63 6c 69 73 74 20 3d 20  ist *pDoclist = 
150d0 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c  (Fts5PendingDocl
150e0 69 73 74 2a 29 66 74 73 33 48 61 73 68 44 61 74  ist*)fts3HashDat
150f0 61 28 70 45 29 3b 0a 20 20 20 20 20 20 66 74 73  a(pE);.      fts
15100 35 46 72 65 65 50 65 6e 64 69 6e 67 44 6f 63 6c  5FreePendingDocl
15110 69 73 74 28 70 44 6f 63 6c 69 73 74 29 3b 0a 20  ist(pDoclist);. 
15120 20 20 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73     }.    fts3Has
15130 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20  hClear(pHash);. 
15140 20 7d 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   }.  p->nPending
15150 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Data = 0;.}../*.
15160 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
15170 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  ze of the prefix
15180 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74  , in bytes, that
15190 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70 4e   buffer (nNew/pN
151a0 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77 69  ew) shares.** wi
151b0 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64 2f  th buffer (nOld/
151c0 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  pOld)..*/.static
151d0 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78 43   int fts5PrefixC
151e0 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20 6e  ompress(.  int n
151f0 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  Old, const u8 *p
15200 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77 2c  Old,.  int nNew,
15210 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77 0a   const u8 *pNew.
15220 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
15230 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26  r(i=0; i<nNew &&
15240 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
15250 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d     if( pOld[i]!=
15260 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b  pNew[i] ) break;
15270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
15280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  .}../*.** If an 
15290 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72 64 20  "nEmpty" record 
152a0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
152b0 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 62 65  to the b-tree be
152c0 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a 2a 2a  fore the next.**
152d0 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69 74 20   term, write it 
152e0 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  now..*/.static v
152f0 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
15300 65 65 4e 45 6d 70 74 79 28 46 74 73 35 49 6e 64  eeNEmpty(Fts5Ind
15310 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
15320 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
15330 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
15340 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 69 6e 74  Empty ){.    int
15350 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20   bFlag = 0;.    
15360 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
15370 70 50 67 3b 0a 20 20 20 20 70 50 67 20 3d 20 26  pPg;.    pPg = &
15380 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
15390 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 57 72  [1];.    if( pWr
153a0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54  iter->nEmpty>=FT
153b0 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
153c0 45 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  E ){.      i64 i
153d0 4b 65 79 20 3d 20 46 54 53 35 5f 44 4f 43 4c 49  Key = FTS5_DOCLI
153e0 53 54 5f 49 44 58 5f 52 4f 57 49 44 28 0a 20 20  ST_IDX_ROWID(.  
153f0 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
15400 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e  >iIdx, pWriter->
15410 69 53 65 67 69 64 2c 20 0a 20 20 20 20 20 20 20  iSegid, .       
15420 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69     pWriter->aWri
15430 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 2d 20 31 20  ter[0].pgno - 1 
15440 2d 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  - pWriter->nEmpt
15450 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  y.      );.     
15460 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
15470 2d 3e 64 6c 69 64 78 2e 6e 3e 30 20 29 3b 0a 20  ->dlidx.n>0 );. 
15480 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
15490 74 65 28 70 2c 20 69 4b 65 79 2c 20 70 57 72 69  te(p, iKey, pWri
154a0 74 65 72 2d 3e 64 6c 69 64 78 2e 70 2c 20 70 57  ter->dlidx.p, pW
154b0 72 69 74 65 72 2d 3e 64 6c 69 64 78 2e 6e 29 3b  riter->dlidx.n);
154c0 0a 20 20 20 20 20 20 62 46 6c 61 67 20 3d 20 31  .      bFlag = 1
154d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
154e0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
154f0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d  nt(&p->rc, &pPg-
15500 3e 62 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20 20  >buf, bFlag);.  
15510 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
15520 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
15530 20 26 70 50 67 2d 3e 62 75 66 2c 20 70 57 72 69   &pPg->buf, pWri
15540 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20  ter->nEmpty);.  
15550 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74    pWriter->nEmpt
15560 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
15570 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
15580 69 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  it was written t
15590 6f 20 64 69 73 6b 2c 20 7a 65 72 6f 20 74 68 65  o disk, zero the
155a0 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 61   doclist index a
155b0 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
155c0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74  t */.  sqlite3Ft
155d0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 57  s5BufferZero(&pW
155e0 72 69 74 65 72 2d 3e 64 6c 69 64 78 29 3b 0a 20  riter->dlidx);. 
155f0 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78   pWriter->bDlidx
15600 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 7d  PrevValid = 0;.}
15610 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
15620 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77  s5WriteBtreeGrow
15630 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
15640 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
15650 72 69 74 65 72 29 7b 0a 20 20 46 74 73 35 50 61  riter){.  Fts5Pa
15660 67 65 57 72 69 74 65 72 20 2a 61 4e 65 77 3b 0a  geWriter *aNew;.
15670 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
15680 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e   *pNew;.  int nN
15690 65 77 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  ew = sizeof(Fts5
156a0 50 61 67 65 57 72 69 74 65 72 29 20 2a 20 28 70  PageWriter) * (p
156b0 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b  Writer->nWriter+
156c0 31 29 3b 0a 0a 20 20 61 4e 65 77 20 3d 20 28 46  1);..  aNew = (F
156d0 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29 73  ts5PageWriter*)s
156e0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
156f0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 2c  Writer->aWriter,
15700 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 61 4e   nNew);.  if( aN
15710 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
15720 0a 20 20 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  .  pNew = &aNew[
15730 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
15740 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  ];.  memset(pNew
15750 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
15760 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20  PageWriter));.  
15770 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a  pNew->pgno = 1;.
15780 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
15790 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
157a0 20 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29 3b   &pNew->buf, 1);
157b0 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72  ..  pWriter->nWr
157c0 69 74 65 72 2b 2b 3b 0a 20 20 70 57 72 69 74 65  iter++;.  pWrite
157d0 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 61 4e 65  r->aWriter = aNe
157e0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  w;.}../*.** This
157f0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   is called once 
15800 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61  for each leaf pa
15810 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69  ge except the fi
15820 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  rst that contain
15830 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e  s.** at least on
15840 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74  e term. Argument
15850 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69   (nTerm/pTerm) i
15860 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20  s the split-key 
15870 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a  - a term that.**
15880 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
15890 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65  all terms writte
158a0 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61  n to earlier lea
158b0 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74  ves, and equal t
158c0 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20  o or.** smaller 
158d0 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 74  than the first t
158e0 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c  erm on the new l
158f0 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  eaf..**.** If an
15900 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
15910 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
15920 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65  left in Fts5Inde
15930 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  x.rc. If an erro
15940 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  r.** has already
15950 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
15960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15970 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
15980 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
15990 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
159a0 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35  treeTerm(.  Fts5
159b0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
159c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
159d0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
159e0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
159f0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
15a00 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
15a10 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
15a20 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75  t nTerm, const u
15a30 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a  8 *pTerm      /*
15a40 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e   First term on n
15a50 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ew page */.){.  
15a60 69 6e 74 20 69 48 65 69 67 68 74 3b 0a 20 20 66  int iHeight;.  f
15a70 6f 72 28 69 48 65 69 67 68 74 3d 31 3b 20 31 3b  or(iHeight=1; 1;
15a80 20 69 48 65 69 67 68 74 2b 2b 29 7b 0a 20 20 20   iHeight++){.   
15a90 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
15aa0 2a 70 50 61 67 65 3b 0a 0a 20 20 20 20 69 66 28  *pPage;..    if(
15ab0 20 69 48 65 69 67 68 74 3e 3d 70 57 72 69 74 65   iHeight>=pWrite
15ac0 72 2d 3e 6e 57 72 69 74 65 72 20 29 7b 0a 20 20  r->nWriter ){.  
15ad0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
15ae0 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  eeGrow(p, pWrite
15af0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  r);.      if( p-
15b00 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
15b10 20 20 7d 0a 20 20 20 20 70 50 61 67 65 20 3d 20    }.    pPage = 
15b20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
15b30 72 5b 69 48 65 69 67 68 74 5d 3b 0a 0a 20 20 20  r[iHeight];..   
15b40 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
15b50 45 6d 70 74 79 28 70 2c 20 70 57 72 69 74 65 72  Empty(p, pWriter
15b60 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  );..    if( pPag
15b70 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73  e->buf.n>=p->pgs
15b80 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  z ){.      /* pP
15b90 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74  age will be writ
15ba0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ten to disk. The
15bb0 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77 72   term will be wr
15bc0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 20  itten into the. 
15bd0 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6f       ** parent o
15be0 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20 20  f pPage.  */.   
15bf0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
15c00 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
15c10 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
15c20 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
15c30 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 48  iter->iSegid, iH
15c40 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70 67  eight, pPage->pg
15c50 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  no.      );.    
15c60 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
15c70 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
15c80 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
15c90 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  buf.n);.      ft
15ca0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
15cb0 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20  age->buf);.     
15cc0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
15cd0 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20  &pPage->term);. 
15ce0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
15cf0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
15d00 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
15d10 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29   pPage[-1].pgno)
15d20 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
15d30 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  gno++;.    }else
15d40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65  {.      int nPre
15d50 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
15d60 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72  press(pPage->ter
15d70 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  m.n, pPage->term
15d80 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  .p, nTerm, pTerm
15d90 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
15da0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
15db0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
15dc0 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20 20  buf, nPre+2);.  
15dd0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
15de0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
15df0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
15e00 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20 20  nTerm-nPre);.   
15e10 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
15e20 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
15e30 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
15e40 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b 6e  rm-nPre, pTerm+n
15e50 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  Pre);.      fts5
15e60 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
15e70 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
15e80 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
15e90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15ea0 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
15eb0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
15ec0 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
15ed0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ef0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
15f00 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
15f10 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
15f20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
15f30 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
15f40 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
15f50 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
15f60 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72 6f   ){.    /* No ro
15f70 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67  wids on this pag
15f80 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30 78 30  e. Append an 0x0
15f90 30 20 62 79 74 65 20 74 6f 20 74 68 65 20 63 75  0 byte to the cu
15fa0 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64 6f  rrent .    ** do
15fb0 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
15fc0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
15fd0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
15fe0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
15ff0 72 2d 3e 64 6c 69 64 78 2c 20 30 29 3b 0a 20 20  r->dlidx, 0);.  
16000 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  }.  pWriter->nEm
16010 70 74 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pty++;.}../*.** 
16020 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73  Rowid iRowid has
16030 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e   just been appen
16040 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
16050 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73  nt leaf page. As
16060 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20 66 69   it is.** the fi
16070 72 73 74 20 6f 6e 20 69 74 73 20 70 61 67 65 2c  rst on its page,
16080 20 61 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79   append an entry
16090 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
160a0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
160b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
160c0 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
160d0 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nd(.  Fts5Index 
160e0 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
160f0 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
16100 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a    i64 iRowid.){.
16110 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 69 66    i64 iVal;.  if
16120 28 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64  ( pWriter->bDlid
16130 78 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20  xPrevValid ){.  
16140 20 20 69 56 61 6c 20 3d 20 70 57 72 69 74 65 72    iVal = pWriter
16150 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 2d 20 69  ->iDlidxPrev - i
16160 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rowid;.  }else{.
16170 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
16180 64 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  d;.  }.  sqlite3
16190 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
161a0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
161b0 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2c 20  pWriter->dlidx, 
161c0 69 56 61 6c 29 3b 0a 20 20 70 57 72 69 74 65 72  iVal);.  pWriter
161d0 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  ->bDlidxPrevVali
161e0 64 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  d = 1;.  pWriter
161f0 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 3d 20 69  ->iDlidxPrev = i
16200 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74 69 63  Rowid;.}..static
16210 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
16220 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64  lushLeaf(Fts5Ind
16230 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
16240 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
16250 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
16260 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30  8 zero[] = { 0x0
16270 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
16280 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67  x00 };.  Fts5Pag
16290 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
162a0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
162b0 65 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f  er[0];.  i64 iRo
162c0 77 69 64 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  wid;..  if( pPag
162d0 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a  e->term.n==0 ){.
162e0 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77      /* No term w
162f0 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  as written to th
16300 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  is page. */.    
16310 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47  assert( 0==fts5G
16320 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  etU16(&pPage->bu
16330 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66  f.p[2]) );.    f
16340 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
16350 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
16360 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
16370 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
16380 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a  e to the db. */.
16390 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
163a0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
163b0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
163c0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c  iter->iSegid, 0,
163d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
163e0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
163f0 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d  , iRowid, pPage-
16400 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
16410 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  uf.n);..  /* Ini
16420 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74  tialize the next
16430 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
16440 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
16450 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  e->buf);.  fts5B
16460 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
16470 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  ->term);.  fts5B
16480 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
16490 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
164a0 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20  buf, 4, zero);. 
164b0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
164c0 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
164d0 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
164e0 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
164f0 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
16500 74 74 65 6e 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tten++;.}../*.**
16510 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
16520 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
16530 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
16540 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
16550 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
16560 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
16570 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
16580 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
16590 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
165a0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
165b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
165c0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
165d0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
165e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
165f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16600 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
16610 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
16620 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
16630 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
16640 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
16650 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
16660 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
16690 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
166a0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
166b0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
166c0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
166d0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20  ->aWriter[0];.. 
166e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
166f0 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67  buf.n==0 || pPag
16700 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20  e->buf.n>4 );.  
16710 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
16720 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65  ==0 ){.    /* Ze
16730 72 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ro the first ter
16740 6d 20 61 6e 64 20 66 69 72 73 74 20 64 6f 63 69  m and first doci
16750 64 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20  d fields */.    
16760 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
16770 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
16780 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
16790 30 20 7d 3b 0a 20 20 20 20 66 74 73 35 42 75 66  0 };.    fts5Buf
167a0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
167b0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
167c0 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20  f, 4, zero);.   
167d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
167e0 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 7d  term.n==0 );.  }
167f0 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
16800 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28 20  eturn;.  .  if( 
16810 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30  pPage->term.n==0
16820 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   ){.    /* Updat
16830 65 20 74 68 65 20 22 66 69 72 73 74 20 74 65 72  e the "first ter
16840 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  m" field of the 
16850 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  page header. */.
16860 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16870 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26  e->buf.p[2]==0 &
16880 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33  & pPage->buf.p[3
16890 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  ]==0 );.    fts5
168a0 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
168b0 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e  uf.p[2], pPage->
168c0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65  buf.n);.    nPre
168d0 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
168e0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
168f0 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a  r[0].pgno!=1 ){.
16900 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
16910 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69  treeTerm(p, pWri
16920 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
16930 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  m);.      pPage 
16940 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
16950 74 65 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20  ter[0];.    }.  
16960 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
16970 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
16980 6f 6d 70 72 65 73 73 28 0a 20 20 20 20 20 20 20  ompress(.       
16990 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20   pPage->term.n, 
169a0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e  pPage->term.p, n
169b0 54 65 72 6d 2c 20 70 54 65 72 6d 0a 20 20 20 20  Term, pTerm.    
169c0 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
169d0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
169e0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
169f0 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d  f, nPrefix);.  }
16a00 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
16a10 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16a20 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74  s of new data, t
16a30 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74  hen the term dat
16a40 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f  a itself.  ** to
16a50 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
16a60 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
16a70 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
16a80 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
16a90 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  m - nPrefix);.  
16aa0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
16ab0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
16ac0 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
16ad0 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72  - nPrefix, &pTer
16ae0 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20  m[nPrefix]);..  
16af0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
16b00 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65 72  s5PageWriter.ter
16b10 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74  m field. */.  ft
16b20 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
16b30 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
16b40 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
16b50 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ..  pWriter->bFi
16b60 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
16b70 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   0;.  pWriter->b
16b80 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
16b90 69 73 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ist = 1;..  /* I
16ba0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  f the current le
16bb0 61 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c  af page is full,
16bc0 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
16bd0 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  k. */.  if( pPag
16be0 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73  e->buf.n>=p->pgs
16bf0 7a 20 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69  z ){.    fts5Wri
16c00 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
16c10 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 57 72  Writer);.    pWr
16c20 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
16c30 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d  dInPage = 1;.  }
16c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
16c50 20 61 20 64 6f 63 69 64 20 74 6f 20 74 68 65 20   a docid to the 
16c60 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
16c70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16c80 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
16c90 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
16ca0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
16cb0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
16cc0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
16cd0 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
16ce0 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
16cf0 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b  ter->aWriter[0];
16d00 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
16d10 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
16d20 74 20 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20  t docid written 
16d30 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65 74  to the page, set
16d40 20 74 68 65 20 0a 20 20 2a 2a 20 64 6f 63 69 64   the .  ** docid
16d50 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
16d60 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
16d70 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
16d80 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
16d90 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61  ** buffer, in ca
16da0 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  se a doclist-ind
16db0 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ex is required. 
16dc0 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65   */.  if( pWrite
16dd0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
16de0 50 61 67 65 20 29 7b 0a 20 20 20 20 66 74 73 35  Page ){.    fts5
16df0 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75  PutU16(pPage->bu
16e00 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
16e10 6e 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  n);.    fts5Writ
16e20 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
16e30 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  pWriter, iRowid)
16e40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
16e50 65 20 74 68 65 20 64 6f 63 69 64 2e 20 2a 2f 0a  e the docid. */.
16e60 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
16e70 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
16e80 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  ist || pWriter->
16e90 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
16ea0 65 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  e ){.    fts5Buf
16eb0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
16ec0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
16ed0 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
16ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
16ef0 74 28 20 69 52 6f 77 69 64 3c 70 57 72 69 74 65  t( iRowid<pWrite
16f00 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b  r->iPrevRowid );
16f10 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
16f20 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
16f30 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
16f40 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
16f50 6f 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a  owid - iRowid);.
16f60 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69    }.  pWriter->i
16f70 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77  PrevRowid = iRow
16f80 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62  id;.  pWriter->b
16f90 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
16fa0 69 73 74 20 3d 20 30 3b 0a 20 20 70 57 72 69 74  ist = 0;.  pWrit
16fb0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
16fc0 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 69 66  nPage = 0;..  if
16fd0 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
16fe0 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66  p->pgsz ){.    f
16ff0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
17000 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
17010 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
17020 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
17030 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  1;.  }.}..static
17040 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
17050 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28  ppendPoslistInt(
17060 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
17070 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
17080 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
17090 74 20 69 56 61 6c 0a 29 7b 0a 20 20 46 74 73 35  t iVal.){.  Fts5
170a0 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
170b0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
170c0 72 69 74 65 72 5b 30 5d 3b 0a 20 20 66 74 73 35  riter[0];.  fts5
170d0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
170e0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
170f0 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20  e->buf, iVal);. 
17100 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
17110 6e 3e 3d 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  n>=p->pgsz ){.  
17120 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
17130 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
17140 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
17150 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
17160 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 1;.  }.}..sta
17170 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
17180 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65  teAppendZerobyte
17190 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
171a0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
171b0 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  riter){.  fts5Bu
171c0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
171d0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
171e0 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75  r->aWriter[0].bu
171f0 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
17200 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
17210 74 73 20 6f 66 20 70 65 6e 64 69 6e 67 2d 64 6f  ts of pending-do
17220 63 6c 69 73 74 20 6f 62 6a 65 63 74 20 70 44 6f  clist object pDo
17230 63 6c 69 73 74 20 74 6f 20 77 72 69 74 65 72 20  clist to writer 
17240 70 57 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pWriter..**.** I
17250 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
17260 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  s, set the Fts5I
17270 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
17280 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  de. If an error 
17290 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
172a0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
172b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
172c0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
172d0 69 64 20 66 74 73 35 57 72 69 74 65 50 65 6e 64  id fts5WritePend
172e0 69 6e 67 44 6f 63 6c 69 73 74 28 0a 20 20 46 74  ingDoclist(.  Ft
172f0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17310 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
17320 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
17330 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
17340 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
17350 74 65 20 74 6f 20 74 68 69 73 20 77 72 69 74 65  te to this write
17360 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  r object */.  Ft
17370 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  s5PendingDoclist
17380 20 2a 70 44 6f 63 6c 69 73 74 20 20 20 20 2f 2a   *pDoclist    /*
17390 20 44 6f 63 6c 69 73 74 20 74 6f 20 77 72 69 74   Doclist to writ
173a0 65 20 74 6f 20 70 57 72 69 74 65 72 20 2a 2f 0a  e to pWriter */.
173b0 29 7b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67  ){.  Fts5Pending
173c0 50 6f 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69 73  Poslist *pPoslis
173d0 74 3b 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20  t;   /* Used to 
173e0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
173f0 74 68 65 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a  the doclist */..
17400 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
17410 74 65 72 6d 20 2a 2f 0a 20 20 66 74 73 35 57 72  term */.  fts5Wr
17420 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
17430 20 70 57 72 69 74 65 72 2c 20 70 44 6f 63 6c 69   pWriter, pDocli
17440 73 74 2d 3e 6e 54 65 72 6d 2c 20 70 44 6f 63 6c  st->nTerm, pDocl
17450 69 73 74 2d 3e 70 54 65 72 6d 29 3b 0a 0a 20 20  ist->pTerm);..  
17460 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f  /* Append the po
17470 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  sition list for 
17480 65 61 63 68 20 72 6f 77 69 64 20 2a 2f 0a 20 20  each rowid */.  
17490 66 6f 72 28 70 50 6f 73 6c 69 73 74 3d 70 44 6f  for(pPoslist=pDo
174a0 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69 73 74 3b  clist->pPoslist;
174b0 20 70 50 6f 73 6c 69 73 74 3b 20 70 50 6f 73 6c   pPoslist; pPosl
174c0 69 73 74 3d 70 50 6f 73 6c 69 73 74 2d 3e 70 4e  ist=pPoslist->pN
174d0 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ext){.    int i 
174e0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  = 0;..    /* App
174f0 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 69 74  end the rowid it
17500 73 65 6c 66 20 2a 2f 0a 20 20 20 20 66 74 73 35  self */.    fts5
17510 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64  WriteAppendRowid
17520 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70 50 6f  (p, pWriter, pPo
17530 73 6c 69 73 74 2d 3e 69 52 6f 77 69 64 29 3b 0a  slist->iRowid);.
17540 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
17550 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
17560 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20  osition list in 
17570 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 66 74 73  bytes */.    fts
17580 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
17590 69 73 74 49 6e 74 28 70 2c 20 70 57 72 69 74 65  istInt(p, pWrite
175a0 72 2c 20 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66  r, pPoslist->buf
175b0 2e 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  .n);..    /* Cop
175c0 79 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  y the position l
175d0 69 73 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ist to the outpu
175e0 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 20  t segment */.   
175f0 20 77 68 69 6c 65 28 20 69 3c 70 50 6f 73 6c 69   while( i<pPosli
17600 73 74 2d 3e 62 75 66 2e 6e 29 7b 0a 20 20 20 20  st->buf.n){.    
17610 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
17620 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
17630 33 32 28 26 70 50 6f 73 6c 69 73 74 2d 3e 62 75  32(&pPoslist->bu
17640 66 2e 70 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20  f.p[i], iVal);. 
17650 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
17660 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 70  pendPoslistInt(p
17670 2c 20 70 57 72 69 74 65 72 2c 20 69 56 61 6c 29  , pWriter, iVal)
17680 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17690 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f 63 6c  * Write the docl
176a0 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a  ist terminator *
176b0 2f 0a 20 20 66 74 73 35 57 72 69 74 65 41 70 70  /.  fts5WriteApp
176c0 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2c 20 70  endZerobyte(p, p
176d0 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Writer);.}../*.*
176e0 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61  * Flush any data
176f0 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77   cached by the w
17700 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  riter object to 
17710 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72  the database. Fr
17720 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ee any.** alloca
17730 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
17740 20 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72   with the writer
17750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17760 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
17770 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
17780 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
17790 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
177a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
177b0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  bject */.  int *
177c0 70 6e 48 65 69 67 68 74 2c 20 20 20 20 20 20 20  pnHeight,       
177d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
177e0 54 3a 20 48 65 69 67 68 74 20 6f 66 20 74 68 65  T: Height of the
177f0 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
17800 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20   *pnLeaf        
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17820 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c  OUT: Number of l
17830 65 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74  eaf pages in b-t
17840 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ree */.){.  int 
17850 69 3b 0a 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70  i;.  *pnLeaf = p
17860 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
17870 30 5d 2e 70 67 6e 6f 3b 0a 20 20 69 66 28 20 2a  0].pgno;.  if( *
17880 70 6e 4c 65 61 66 3d 3d 31 20 26 26 20 70 57 72  pnLeaf==1 && pWr
17890 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
178a0 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  .buf.n==0 ){.   
178b0 20 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20   *pnLeaf = 0;.  
178c0 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 30 3b    *pnHeight = 0;
178d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
178e0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
178f0 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
17900 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
17910 57 72 69 74 65 72 3d 3d 31 20 26 26 20 70 57 72  Writer==1 && pWr
17920 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54  iter->nEmpty>=FT
17930 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
17940 45 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  E ){.      fts5W
17950 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c  riteBtreeGrow(p,
17960 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
17970 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
17980 2d 3e 6e 57 72 69 74 65 72 3e 31 20 29 7b 0a 20  ->nWriter>1 ){. 
17990 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
179a0 72 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72  reeNEmpty(p, pWr
179b0 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  iter);.    }.   
179c0 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 57 72   *pnHeight = pWr
179d0 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a  iter->nWriter;..
179e0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
179f0 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b  Writer->nWriter;
17a00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   i++){.      Fts
17a10 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 67  5PageWriter *pPg
17a20 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
17a30 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 66  iter[i];.      f
17a40 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
17a50 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
17a60 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
17a70 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
17a80 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
17a90 20 70 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20   pPg->pgno), .  
17aa0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 62 75 66          pPg->buf
17ab0 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 0a 20  .p, pPg->buf.n. 
17ac0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
17ad0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
17ae0 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b  Writer->nWriter;
17af0 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50   i++){.    Fts5P
17b00 61 67 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d  ageWriter *pPg =
17b10 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
17b20 65 72 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 42  er[i];.    fts5B
17b30 75 66 66 65 72 46 72 65 65 28 26 70 50 67 2d 3e  ufferFree(&pPg->
17b40 74 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35 42  term);.    fts5B
17b50 75 66 66 65 72 46 72 65 65 28 26 70 50 67 2d 3e  ufferFree(&pPg->
17b60 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  buf);.  }.  sqli
17b70 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
17b80 2d 3e 61 57 72 69 74 65 72 29 3b 0a 20 20 73 71  ->aWriter);.  sq
17b90 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
17ba0 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 64 6c  ree(&pWriter->dl
17bb0 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  idx);.}..static 
17bc0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e  void fts5WriteIn
17bd0 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
17be0 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
17bf0 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
17c00 20 20 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20    int iIdx, int 
17c10 69 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73  iSegid.){.  mems
17c20 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73  et(pWriter, 0, s
17c30 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
17c40 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72  ter));.  pWriter
17c50 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20  ->iIdx = iIdx;. 
17c60 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
17c70 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 70 57   = iSegid;..  pW
17c80 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d  riter->aWriter =
17c90 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72   (Fts5PageWriter
17ca0 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
17cb0 70 2c 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67  p,sizeof(Fts5Pag
17cc0 65 57 72 69 74 65 72 29 29 3b 0a 20 20 69 66 28  eWriter));.  if(
17cd0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
17ce0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
17cf0 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
17d00 72 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  r = 1;.  pWriter
17d10 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
17d20 6f 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63  o = 1;.}..static
17d30 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49   void fts5WriteI
17d40 6e 69 74 46 6f 72 41 70 70 65 6e 64 28 0a 20 20  nitForAppend(.  
17d50 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
17d80 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
17d90 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
17da0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
17db0 72 69 74 65 72 20 74 6f 20 69 6e 69 74 69 61 6c  riter to initial
17dc0 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ize */.  int iId
17dd0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
17de0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17df0 78 20 73 65 67 6d 65 6e 74 20 69 73 20 61 20 70  x segment is a p
17e00 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35  art of */.  Fts5
17e10 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
17e20 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53   *pSeg      /* S
17e30 65 67 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f  egment object to
17e40 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b   append to */.){
17e50 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70  .  int nByte = p
17e60 53 65 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73  Seg->nHeight * s
17e70 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
17e80 69 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  iter);.  memset(
17e90 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
17ea0 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
17eb0 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  ));.  pWriter->i
17ec0 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57  Idx = iIdx;.  pW
17ed0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  riter->iSegid = 
17ee0 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
17ef0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
17f00 20 3d 20 28 46 74 73 35 50 61 67 65 57 72 69 74   = (Fts5PageWrit
17f10 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
17f20 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70  c(p, nByte);.  p
17f30 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20  Writer->nWriter 
17f40 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b  = pSeg->nHeight;
17f50 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
17f60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17f70 69 6e 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  int pgno = 1;.  
17f80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72    int i;.    pWr
17f90 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
17fa0 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  .pgno = pSeg->pg
17fb0 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f  noLast+1;.    fo
17fc0 72 28 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68  r(i=pSeg->nHeigh
17fd0 74 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  t-1; i>0; i--){.
17fe0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
17ff0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
18000 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
18010 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  Idx, pWriter->iS
18020 65 67 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a  egid, i, pgno);.
18030 20 20 20 20 20 20 46 74 73 35 50 61 67 65 57 72        Fts5PageWr
18040 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72  iter *pPg = &pWr
18050 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d  iter->aWriter[i]
18060 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  ;.      pPg->pgn
18070 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  o = pgno;.      
18080 66 74 73 35 44 61 74 61 42 75 66 66 65 72 28 70  fts5DataBuffer(p
18090 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f  , &pPg->buf, iRo
180a0 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
180b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
180c0 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
180d0 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20  NodeIter ss;.   
180e0 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65       fts5NodeIte
180f0 72 49 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70  rInit(pPg->buf.p
18100 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73  , pPg->buf.n, &s
18110 73 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  s);.        whil
18120 65 28 20 73 73 2e 61 44 61 74 61 20 29 20 66 74  e( ss.aData ) ft
18130 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
18140 70 2d 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20  p->rc, &ss);.   
18150 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
18160 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d  et(&p->rc, &pPg-
18170 3e 74 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e  >term, ss.term.n
18180 2c 20 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20  , ss.term.p);.  
18190 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e        pgno = ss.
181a0 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20  iChild;.        
181b0 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65  fts5NodeIterFree
181c0 28 26 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&ss);.      }. 
181d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65     }.    if( pSe
181e0 67 2d 3e 6e 48 65 69 67 68 74 3d 3d 31 20 29 7b  g->nHeight==1 ){
181f0 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
18200 6e 45 6d 70 74 79 20 3d 20 70 53 65 67 2d 3e 70  nEmpty = pSeg->p
18210 67 6e 6f 4c 61 73 74 2d 31 3b 0a 20 20 20 20 7d  gnoLast-1;.    }
18220 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 67  .    assert( (pg
18230 6e 6f 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  no+pWriter->nEmp
18240 74 79 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  ty)==pSeg->pgnoL
18250 61 73 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ast );.  }.}../*
18260 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
18270 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
18280 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
18290 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
182a0 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
182b0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
182c0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
182d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
182e0 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
182f0 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
18300 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
18310 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
18320 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
18330 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
18340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18350 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
18360 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
18370 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
18380 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
18390 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i;.  Fts5Buffer 
183a0 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
183b0 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
183c0 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f  s5Buffer));.  fo
183d0 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
183e0 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
183f0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
18400 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
18410 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65  [i];.    if( pSe
18420 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20  g->pSeg==0 ){.  
18430 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
18440 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
18450 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  eg->pLeaf==0 ){.
18460 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
18470 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a  ->pgnoLast = 0;.
18480 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
18490 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b  ->pgnoFirst = 0;
184a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
184b0 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65    int iOff = pSe
184c0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  g->iTermLeafOffs
184d0 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  et;     /* Offse
184e0 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c  t on new first l
184f0 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
18500 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64    i64 iLeafRowid
18510 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61  ;.      Fts5Data
18520 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69   *pData;.      i
18530 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70  nt iId = pSeg->p
18540 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
18550 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20     u8 aHdr[4] = 
18560 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30  {0x00, 0x00, 0x0
18570 30 2c 20 30 78 30 34 7d 3b 0a 0a 20 20 20 20 20  0, 0x04};..     
18580 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54   iLeafRowid = FT
18590 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
185a0 28 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64  (pSeg->iIdx, iId
185b0 2c 20 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d  , 0, pSeg->iTerm
185c0 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
185d0 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
185e0 61 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f  aRead(p, iLeafRo
185f0 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
18600 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
18610 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
18620 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  &buf);.        f
18630 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
18640 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
18650 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20  , sizeof(aHdr), 
18660 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66  aHdr);.        f
18670 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
18680 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
18690 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
186a0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
186b0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
186c0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
186d0 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67  eg->term.n, pSeg
186e0 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20  ->term.p);.     
186f0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
18700 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
18710 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d  &buf, pData->n -
18720 20 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70   iOff, &pData->p
18730 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20  [iOff]);.       
18740 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
18750 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  (pData);.       
18760 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
18770 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69  oFirst = pSeg->i
18780 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  TermLeafPgno;.  
18790 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65        fts5DataDe
187a0 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47  lete(p, FTS5_SEG
187b0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
187c0 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 31  >iIdx, iId, 0, 1
187d0 29 2c 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  ),iLeafRowid);. 
187e0 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57         fts5DataW
187f0 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77  rite(p, iLeafRow
18800 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e  id, buf.p, buf.n
18810 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18820 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
18830 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a  rFree(&buf);.}..
18840 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
18850 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65  void fts5IndexMe
18860 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35  rgeLevel(.  Fts5
18870 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
18880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18890 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
188a0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
188b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
188c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
188d0 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20   to work on */. 
188e0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
188f0 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20  pStruct,        
18900 20 2f 2a 20 53 74 75 63 74 75 72 65 20 6f 66 20   /* Stucture of 
18910 69 6e 64 65 78 20 69 49 64 78 20 2a 2f 0a 20 20  index iIdx */.  
18920 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64  /* Level to read
18950 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20   input from */. 
18960 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20   int *pnRem     
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20   /* Write up to 
18990 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74  this many output
189a0 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20   leaves */.){.  
189b0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
189c0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
189d0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
189e0 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ];.  Fts5Structu
189f0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74  reLevel *pLvlOut
18a00 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
18a10 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 46  vel[iLvl+1];.  F
18a20 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
18a30 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 2f  *pIter = 0;    /
18a40 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65  * Iterator to re
18a50 61 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f  ad input data */
18a60 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 2a 70  .  int nRem = *p
18a70 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nRem;           
18a80 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61     /* Output lea
18a90 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20  f pages left to 
18aa0 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
18ab0 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20  Input;          
18ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18ad0 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65  mber of input se
18ae0 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35  gments */.  Fts5
18af0 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
18b00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;           /* W
18b10 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
18b20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
18b30 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
18b40 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d    /* Output segm
18b50 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ent */.  Fts5Buf
18b60 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20  fer term;.  int 
18b70 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54  bRequireDoclistT
18b80 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44  erm = 0;    /* D
18b90 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  oclist terminato
18ba0 72 20 28 30 78 30 30 29 20 72 65 71 75 69 72 65  r (0x00) require
18bb0 64 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65  d */.  int bOlde
18bc0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
18bd0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
18be0 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  f the output seg
18bf0 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65  ment is the olde
18c00 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
18c10 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
18c20 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Level );.  asser
18c30 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c  t( pLvl->nMerge<
18c40 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a  =pLvl->nSeg );..
18c50 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72    memset(&writer
18c60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
18c70 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d  SegWriter));.  m
18c80 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
18c90 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
18ca0 72 29 29 3b 0a 20 20 77 72 69 74 65 72 2e 69 49  r));.  writer.iI
18cb0 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 69 66 28  dx = iIdx;.  if(
18cc0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b   pLvl->nMerge ){
18cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76  .    assert( pLv
18ce0 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a  lOut->nSeg>0 );.
18cf0 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
18d00 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 66  l->nMerge;.    f
18d10 74 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41  ts5WriteInitForA
18d20 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72  ppend(p, &writer
18d30 2c 20 69 49 64 78 2c 20 26 70 4c 76 6c 4f 75 74  , iIdx, &pLvlOut
18d40 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
18d50 6e 53 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53  nSeg-1]);.    pS
18d60 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
18d70 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
18d80 67 2d 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  g-1];.  }else{. 
18d90 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
18da0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
18db0 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  d(p, pStruct);. 
18dc0 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
18dd0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64  (p, &writer, iId
18de0 78 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  x, iSegid);..   
18df0 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
18e00 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f  segment to the o
18e10 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  utput level */. 
18e20 20 20 20 69 66 28 20 69 4c 76 6c 2b 31 3d 3d 70     if( iLvl+1==p
18e30 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29  Struct->nLevel )
18e40 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
18e50 2b 2b 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26  ++;.    pSeg = &
18e60 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
18e70 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20  vlOut->nSeg];.  
18e80 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b    pLvlOut->nSeg+
18e90 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  +;.    pSeg->pgn
18ea0 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
18eb0 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
18ec0 53 65 67 69 64 3b 0a 0a 20 20 20 20 2f 2a 20 52  Segid;..    /* R
18ed0 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61  ead input from a
18ee0 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ll segments in t
18ef0 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a  he input level *
18f00 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70  /.    nInput = p
18f10 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20  Lvl->nSeg;.  }. 
18f20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c   bOldest = (pLvl
18f30 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20  Out->nSeg==1 && 
18f40 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d  pStruct->nLevel=
18f50 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66 20 30  =iLvl+2);..#if 0
18f60 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  .fprintf(stdout,
18f70 20 22 6d 65 72 67 69 6e 67 20 25 64 20 73 65 67   "merging %d seg
18f80 6d 65 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65 6c  ments from level
18f90 20 25 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20 69   %d!", nInput, i
18fa0 4c 76 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74 64  Lvl);.fflush(std
18fb0 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  out);.#endif..  
18fc0 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
18fd0 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
18fe0 20 69 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20   iIdx, 0, 0, 0, 
18ff0 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70  iLvl, nInput, &p
19000 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
19010 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
19020 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
19030 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
19040 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
19050 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73   0).  ){.    Fts
19060 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
19070 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
19080 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20  Iter->aFirst[1] 
19090 5d 3b 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b  ];.    Fts5Chunk
190a0 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20  Iter sPos;      
190b0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
190c0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
190d0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
190e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
190f0 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
19100 69 74 74 65 6e 20 69 73 20 74 68 65 20 6f 6c 64  itten is the old
19110 65 73 74 20 69 6e 20 74 68 65 20 65 6e 74 69 72  est in the entir
19120 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 20 20  e index and.    
19130 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ** the position 
19140 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 28 69  list is empty (i
19150 2e 65 2e 20 74 68 65 20 65 6e 74 72 79 20 69 73  .e. the entry is
19160 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72   a delete marker
19170 29 2c 20 6e 6f 0a 20 20 20 20 2a 2a 20 65 6e 74  ), no.    ** ent
19180 72 79 20 6e 65 65 64 20 62 65 20 77 72 69 74 74  ry need be writt
19190 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
191a0 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68  .  */.    fts5Ch
191b0 75 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70  unkIterInit(p, p
191c0 53 65 67 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20  Seg, &sPos);.   
191d0 20 69 66 28 20 62 4f 6c 64 65 73 74 3d 3d 30 20   if( bOldest==0 
191e0 7c 7c 20 73 50 6f 73 2e 6e 52 65 6d 3e 30 20 29  || sPos.nRem>0 )
191f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  {.      int nTer
19200 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  m;.      const u
19210 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d  8 *pTerm = fts5M
19220 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74  ultiIterTerm(pIt
19230 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20  er, &nTerm);.   
19240 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65     if( nTerm!=te
19250 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  rm.n || memcmp(p
19260 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54  Term, term.p, nT
19270 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  erm) ){.        
19280 69 66 28 20 77 72 69 74 65 72 2e 6e 4c 65 61 66  if( writer.nLeaf
19290 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a  Written>nRem ){.
192a0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 43 68            fts5Ch
192b0 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26  unkIterRelease(&
192c0 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20  sPos);.         
192d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
192e0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  }..        /* Th
192f0 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d  is is a new term
19300 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20  . Append a term 
19310 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  to the output se
19320 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  gment. */.      
19330 20 20 69 66 28 20 62 52 65 71 75 69 72 65 44 6f    if( bRequireDo
19340 63 6c 69 73 74 54 65 72 6d 20 29 7b 0a 20 20 20  clistTerm ){.   
19350 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
19360 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70  AppendZerobyte(p
19370 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
19380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 74      }.        ft
19390 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
193a0 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54  m(p, &writer, nT
193b0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
193c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
193d0 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d  et(&p->rc, &term
193e0 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
193f0 0a 20 20 20 20 20 20 20 20 62 52 65 71 75 69 72  .        bRequir
19400 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 31  eDoclistTerm = 1
19410 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19420 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72   /* Append the r
19430 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70  owid to the outp
19440 75 74 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35  ut */.      fts5
19450 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64  WriteAppendRowid
19460 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73  (p, &writer, fts
19470 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
19480 70 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20  pIter));..      
19490 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 6f 73 69  /* Copy the posi
194a0 74 69 6f 6e 20 6c 69 73 74 20 66 72 6f 6d 20 69  tion list from i
194b0 6e 70 75 74 20 74 6f 20 6f 75 74 70 75 74 20 2a  nput to output *
194c0 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  /.      fts5Writ
194d0 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e  eAppendPoslistIn
194e0 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 73 50  t(p, &writer, sP
194f0 6f 73 2e 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20  os.nRem);.      
19500 66 6f 72 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b 20  for(/* noop */; 
19510 21 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f  !fts5ChunkIterEo
19520 66 28 70 2c 20 26 73 50 6f 73 29 3b 20 66 74 73  f(p, &sPos); fts
19530 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70  5ChunkIterNext(p
19540 2c 20 26 73 50 6f 73 29 29 7b 0a 20 20 20 20 20  , &sPos)){.     
19550 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
19560 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
19570 69 4f 66 66 3c 73 50 6f 73 2e 6e 20 29 7b 0a 20  iOff<sPos.n ){. 
19580 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61           int iVa
19590 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  l;.          iOf
195a0 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
195b0 28 26 73 50 6f 73 2e 70 5b 69 4f 66 66 5d 2c 20  (&sPos.p[iOff], 
195c0 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  iVal);.         
195d0 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
195e0 50 6f 73 6c 69 73 74 49 6e 74 28 70 2c 20 26 77  PoslistInt(p, &w
195f0 72 69 74 65 72 2c 20 69 56 61 6c 29 3b 0a 20 20  riter, iVal);.  
19600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19610 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 43      }..    fts5C
19620 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28  hunkIterRelease(
19630 26 73 50 6f 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  &sPos);.  }..  /
19640 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74  * Flush the last
19650 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64 69   leaf page to di
19660 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70  sk. Set the outp
19670 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ut segment b-tre
19680 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e  e height.  ** an
19690 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  d last leaf page
196a0 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20 73   number at the s
196b0 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20  ame time.  */.  
196c0 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
196d0 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53 65  p, &writer, &pSe
196e0 67 2d 3e 6e 48 65 69 67 68 74 2c 20 26 70 53 65  g->nHeight, &pSe
196f0 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20  g->pgnoLast);.. 
19700 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74   if( fts5MultiIt
19710 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20  erEof(p, pIter) 
19720 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ){.    int i;.. 
19730 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
19740 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65   redundant segme
19750 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  nts from the %_d
19760 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ata table */.   
19770 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70   for(i=0; i<nInp
19780 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ut; i++){.      
19790 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
197a0 67 6d 65 6e 74 28 70 2c 20 69 49 64 78 2c 20 70  gment(p, iIdx, p
197b0 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65  Lvl->aSeg[i].iSe
197c0 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gid);.    }..   
197d0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
197e0 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
197f0 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  s from the input
19800 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
19810 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49  ( pLvl->nSeg!=nI
19820 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  nput ){.      in
19830 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d  t nMove = (pLvl-
19840 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20  >nSeg - nInput) 
19850 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
19860 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
19870 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c        memmove(pL
19880 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d  vl->aSeg, &pLvl-
19890 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e  >aSeg[nInput], n
198a0 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Move);.    }.   
198b0 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e   pLvl->nSeg -= n
198c0 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
198d0 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20  >nMerge = 0;.   
198e0 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   if( pSeg->pgnoL
198f0 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
19900 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b  pLvlOut->nSeg--;
19910 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19920 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
19930 2d 3e 6e 48 65 69 67 68 74 3e 30 20 26 26 20 70  ->nHeight>0 && p
19940 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20  Seg->pgnoLast>0 
19950 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53  );.    fts5TrimS
19960 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72  egments(p, pIter
19970 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65  );.    pLvl->nMe
19980 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  rge = nInput;.  
19990 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  }..  fts5MultiIt
199a0 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29  erFree(p, pIter)
199b0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
199c0 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 2a 70 6e  ee(&term);.  *pn
199d0 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c  Rem -= writer.nL
199e0 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f  eafWritten;.}../
199f0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
19a00 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73  nLeaf leaf pages
19a10 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73   of data has jus
19a20 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74  t been flushed t
19a30 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73  o a level-0.** s
19a40 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78  egments in index
19a50 20 69 49 64 78 20 77 69 74 68 20 73 74 72 75 63   iIdx with struc
19a60 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
19a70 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61  is function upda
19a80 74 65 73 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  tes the.** write
19a90 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69  -counter accordi
19aa0 6e 67 6c 79 20 61 6e 64 2c 20 69 66 20 6e 65 63  ngly and, if nec
19ab0 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d 73  essary, performs
19ac0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
19ad0 67 65 0a 2a 2a 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a  ge.** work..**.*
19ae0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
19af0 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
19b00 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
19b10 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
19b20 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
19b30 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
19b40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
19b50 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
19b60 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 57   void fts5IndexW
19b70 6f 72 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ork(.  Fts5Index
19b80 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
19b90 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
19ba0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
19bb0 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
19be0 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35  ork on */.  Fts5
19bf0 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
19c00 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
19c10 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
19c20 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
19c30 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  x */.  int nLeaf
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19c60 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65   of output leave
19c70 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  s just written *
19c80 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
19c90 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
19ca0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69 36 34  *ppStruct;.  i64
19cb0 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19cd0 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
19ce0 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a   write-counter *
19cf0 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20  /.  int nWork;  
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19d20 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20   work-quanta to 
19d30 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74  perform */.  int
19d40 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d60 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
19d70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
19d80 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55 70 64 61  te */..  /* Upda
19d90 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  te the write-cou
19da0 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e  nter. While doin
19db0 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e  g so, set nWork.
19dc0 20 2a 2f 0a 20 20 6e 57 72 69 74 65 20 3d 20 70   */.  nWrite = p
19dd0 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
19de0 75 6e 74 65 72 3b 0a 20 20 6e 57 6f 72 6b 20 3d  unter;.  nWork =
19df0 20 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61   ((nWrite + nLea
19e00 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  f) / p->nWorkUni
19e10 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70  t) - (nWrite / p
19e20 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 3b 0a 20 20  ->nWorkUnit);.  
19e30 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
19e40 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b  ounter += nLeaf;
19e50 0a 20 20 6e 52 65 6d 20 3d 20 70 2d 3e 6e 57 6f  .  nRem = p->nWo
19e60 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
19e70 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
19e80 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d  ;..  while( nRem
19e90 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  >0 ){.    int iL
19ea0 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
19eb0 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
19ec0 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
19ed0 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  ls */.    int iB
19ee0 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20  estLvl = 0;     
19ef0 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
19f00 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74  ffering the most
19f10 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
19f20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74  */.    int nBest
19f30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
19f40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19f50 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
19f60 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
19f70 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73  .    /* Set iBes
19f80 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
19f90 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
19fa0 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
19fb0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
19fc0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
19fd0 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
19fe0 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
19ff0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
1a000 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
1a010 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1a020 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1a030 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
1a040 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
1a050 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
1a060 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
1a070 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
1a080 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
1a090 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73  ;.          nBes
1a0a0 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
1a0b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a0c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a0d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76   }.      if( pLv
1a0e0 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b  l->nSeg>nBest ){
1a0f0 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d  .        nBest =
1a100 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20   pLvl->nSeg;.   
1a110 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
1a120 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iLvl;.      }.  
1a130 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1a140 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
1a150 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
1a160 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
1a170 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a180 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c  DEBUG.    for(iL
1a190 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26  vl=0; nBest==0 &
1a1a0 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
1a1b0 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
1a1c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a1d0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1a1e0 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
1a1f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1a200 20 20 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 6e    if( nBest<p->n
1a210 4d 69 6e 4d 65 72 67 65 20 26 26 20 70 53 74 72  MinMerge && pStr
1a220 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73  uct->aLevel[iBes
1a230 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20  tLvl].nMerge==0 
1a240 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
1a250 20 69 42 65 73 74 4c 76 6c 3d 3d 70 53 74 72 75   iBestLvl==pStru
1a260 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a  ct->nLevel-1 ){.
1a270 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
1a280 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e  ureAddLevel(&p->
1a290 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20  rc, &pStruct);. 
1a2a0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
1a2b0 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
1a2c0 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
1a2d0 74 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 31  t, iBestLvl+1, 1
1a2e0 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 49 6e  , 0);.    fts5In
1a2f0 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
1a300 20 69 49 64 78 2c 20 70 53 74 72 75 63 74 2c 20   iIdx, pStruct, 
1a310 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29  iBestLvl, &nRem)
1a320 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
1a330 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42  urePromote(p, iB
1a340 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  estLvl+1, pStruc
1a350 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
1a360 6e 52 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63  nRem==0 || p->rc
1a370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1a380 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70     *ppStruct = p
1a390 53 74 72 75 63 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Struct;.  }.}../
1a3a0 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63  *.** Flush the c
1a3b0 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65  ontents of in-me
1a3c0 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20  mory hash table 
1a3d0 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c  iHash to a new l
1a3e0 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65  evel-0 .** segme
1a3f0 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f  nt on disk. Also
1a400 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 72 72   update the corr
1a410 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74  esponding struct
1a420 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  ure record..**.*
1a430 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1a440 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
1a450 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
1a460 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
1a470 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
1a480 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
1a490 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1a4a0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1a4b0 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f   void fts5FlushO
1a4c0 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64 65 78  neHash(Fts5Index
1a4d0 20 2a 70 2c 20 69 6e 74 20 69 48 61 73 68 2c 20   *p, int iHash, 
1a4e0 69 6e 74 20 2a 70 6e 4c 65 61 66 29 7b 0a 20 20  int *pnLeaf){.  
1a4f0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1a500 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53  Struct;.  int iS
1a510 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f  egid;.  int pgno
1a520 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Last = 0;       
1a530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
1a540 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
1a550 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f  er in segment */
1a560 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20  ..  /* Obtain a 
1a570 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1a580 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
1a590 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
1a5a0 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20  new segment-id. 
1a5b0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
1a5c0 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e  level-0 segment.
1a5d0 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d    */.  pStruct =
1a5e0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1a5f0 61 64 28 70 2c 20 69 48 61 73 68 29 3b 0a 20 20  ad(p, iHash);.  
1a600 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
1a610 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
1a620 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69  truct);..  if( i
1a630 53 65 67 69 64 20 29 7b 0a 20 20 20 20 46 74 73  Segid ){.    Fts
1a640 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
1a650 72 3b 0a 20 20 20 20 46 74 73 35 50 65 6e 64 69  r;.    Fts5Pendi
1a660 6e 67 44 6f 63 6c 69 73 74 20 2a 70 4c 69 73 74  ngDoclist *pList
1a670 3b 0a 20 20 20 20 46 74 73 35 50 65 6e 64 69 6e  ;.    Fts5Pendin
1a680 67 44 6f 63 6c 69 73 74 20 2a 70 49 74 65 72 3b  gDoclist *pIter;
1a690 0a 20 20 20 20 46 74 73 35 50 65 6e 64 69 6e 67  .    Fts5Pending
1a6a0 44 6f 63 6c 69 73 74 20 2a 70 4e 65 78 74 3b 0a  Doclist *pNext;.
1a6b0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1a6c0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
1a6d0 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e     /* New segmen
1a6e0 74 20 77 69 74 68 69 6e 20 70 53 74 72 75 63 74  t within pStruct
1a6f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 48 65 69   */.    int nHei
1a700 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
1a710 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20        /* Height 
1a720 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 62  of new segment b
1a730 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 70 4c  -tree */..    pL
1a740 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e  ist = fts5Pendin
1a750 67 4c 69 73 74 28 70 2c 20 69 48 61 73 68 29 3b  gList(p, iHash);
1a760 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1a770 73 74 21 3d 30 20 7c 7c 20 70 2d 3e 72 63 21 3d  st!=0 || p->rc!=
1a780 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
1a790 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
1a7a0 2c 20 26 77 72 69 74 65 72 2c 20 69 48 61 73 68  , &writer, iHash
1a7b0 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
1a7c0 66 6f 72 28 70 49 74 65 72 3d 70 4c 69 73 74 3b  for(pIter=pList;
1a7d0 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 4e   pIter; pIter=pN
1a7e0 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  ext){.      pNex
1a7f0 74 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  t = pIter->pNext
1a800 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
1a810 65 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 28  ePendingDoclist(
1a820 70 2c 20 26 77 72 69 74 65 72 2c 20 70 49 74 65  p, &writer, pIte
1a830 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 46 72  r);.      fts5Fr
1a840 65 65 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  eePendingDoclist
1a850 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  (pIter);.    }. 
1a860 20 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69     fts5WriteFini
1a870 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
1a880 6e 48 65 69 67 68 74 2c 20 26 70 67 6e 6f 4c 61  nHeight, &pgnoLa
1a890 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 64 69  st);..    /* Edi
1a8a0 74 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  t the Fts5Struct
1a8b0 75 72 65 20 61 6e 64 20 77 72 69 74 65 20 69 74  ure and write it
1a8c0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
1a8d0 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 69 66  abase. */.    if
1a8e0 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1a8f0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  l==0 ){.      ft
1a900 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
1a910 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74  vel(&p->rc, &pSt
1a920 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ruct);.    }.   
1a930 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
1a940 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
1a950 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c  , pStruct, 0, 1,
1a960 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
1a970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a980 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
1a990 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
1a9a0 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d  ].aSeg[ pStruct-
1a9b0 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b  >aLevel[0].nSeg+
1a9c0 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  + ];.      pSeg-
1a9d0 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1a9e0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48  ;.      pSeg->nH
1a9f0 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b  eight = nHeight;
1aa00 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
1aa10 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
1aa20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74    pSeg->pgnoLast
1aa30 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
1aa40 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e   }.  }..  fts5In
1aa50 64 65 78 57 6f 72 6b 28 70 2c 20 69 48 61 73 68  dexWork(p, iHash
1aa60 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f  , &pStruct, pgno
1aa70 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 53 74 72  Last);.  fts5Str
1aa80 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 69  uctureWrite(p, i
1aa90 48 61 73 68 2c 20 70 53 74 72 75 63 74 29 3b 0a  Hash, pStruct);.
1aaa0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1aab0 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
1aac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1aad0 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20  any data stored 
1aae0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
1aaf0 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20   hash tables to 
1ab00 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1ab10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1ab20 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35  5IndexFlush(Fts5
1ab30 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
1ab40 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1ab50 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1ab60 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
1ab90 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
1aba0 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  xes */.  int nLe
1abb0 61 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  af = 0;         
1abc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1abd0 65 72 20 6f 66 20 6c 65 61 76 65 73 20 77 72 69  er of leaves wri
1abe0 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  tten */..  /* If
1abf0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
1ac00 72 65 61 64 79 20 6f 63 63 75 72 65 64 20 74 68  ready occured th
1ac10 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1ac20 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  op. */.  if( p->
1ac30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1ac40 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
1ac50 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1ac60 61 73 73 65 72 74 28 20 70 2d 3e 61 48 61 73 68  assert( p->aHash
1ac70 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20   );..  /* Flush 
1ac80 74 68 65 20 74 65 72 6d 73 20 61 6e 64 20 65 61  the terms and ea
1ac90 63 68 20 70 72 65 66 69 78 20 69 6e 64 65 78 20  ch prefix index 
1aca0 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 66 6f 72  to disk */.  for
1acb0 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67  (i=0; i<=pConfig
1acc0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b  ->nPrefix; i++){
1acd0 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e  .    fts5FlushOn
1ace0 65 48 61 73 68 28 70 2c 20 69 2c 20 26 6e 4c 65  eHash(p, i, &nLe
1acf0 61 66 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50  af);.  }.  p->nP
1ad00 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
1ad10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
1ad20 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65  e that all subse
1ad30 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
1ad40 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57  qlite3Fts5IndexW
1ad50 72 69 74 65 28 29 20 70 65 72 74 61 69 6e 0a 2a  rite() pertain.*
1ad60 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e  * to the documen
1ad70 74 20 77 69 74 68 20 72 6f 77 69 64 20 69 52 6f  t with rowid iRo
1ad80 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wid..*/.void sql
1ad90 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65 67  ite3Fts5IndexBeg
1ada0 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  inWrite(Fts5Inde
1adb0 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
1adc0 29 7b 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c  ){.  if( iRowid<
1add0 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20  =p->iWriteRowid 
1ade0 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
1adf0 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20  Flush(p);.  }.  
1ae00 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
1ae10 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a   iRowid;.}../*.*
1ae20 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f  * Commit data to
1ae30 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
1ae40 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79  lite3Fts5IndexSy
1ae50 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  nc(Fts5Index *p,
1ae60 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1ae70 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
1ae80 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69  p);.  if( bCommi
1ae90 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52 65 61  t ) fts5CloseRea
1aea0 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  der(p);.  return
1aeb0 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
1aec0 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74   Discard any dat
1aed0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
1aee0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
1aef0 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72  ables. Do not wr
1af00 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65  ite it.** to the
1af10 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
1af20 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20  ionally, assume 
1af30 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
1af40 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a  s of the %_data.
1af50 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76  ** table may hav
1af60 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73  e changed on dis
1af70 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d  k. So any in-mem
1af80 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f  ory caches of %_
1af90 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73  data .** records
1afa0 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64   must be invalid
1afb0 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
1afc0 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c  ite3Fts5IndexRol
1afd0 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20  lback(Fts5Index 
1afe0 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65  *p){.  fts5Close
1aff0 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73  Reader(p);.  fts
1b000 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
1b010 61 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  a(p);.  return S
1b020 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b030 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74  ** Open a new Ft
1b040 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
1b050 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20 61  If the bCreate a
1b060 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
1b070 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69   create.** and i
1b080 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e  nitialize the un
1b090 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20  derlying %_data 
1b0a0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
1b0b0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1b0c0 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  *pp to point to 
1b0d0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  the new object a
1b0e0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1b0f0 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  _OK..** Otherwis
1b100 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  e, set *pp to NU
1b110 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  LL and return an
1b120 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1b130 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
1b140 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
1b150 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
1b160 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62  Config, .  int b
1b170 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49  Create, .  Fts5I
1b180 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61  ndex **pp,.  cha
1b190 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69  r **pzErr.){.  i
1b1a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b1b0 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  K;.  Fts5Index *
1b1c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1b1d0 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
1b1e0 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70  ct */..  *pp = p
1b1f0 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73   = (Fts5Index*)s
1b200 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
1b210 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29  zeof(Fts5Index))
1b220 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1b230 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1b240 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ;..  memset(p, 0
1b250 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  , sizeof(Fts5Ind
1b260 65 78 29 29 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66  ex));.  p->pConf
1b270 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20  ig = pConfig;.  
1b280 70 2d 3e 70 67 73 7a 20 3d 20 31 30 30 30 3b 0a  p->pgsz = 1000;.
1b290 20 20 70 2d 3e 6e 4d 69 6e 4d 65 72 67 65 20 3d    p->nMinMerge =
1b2a0 20 46 54 53 35 5f 4d 49 4e 5f 4d 45 52 47 45 3b   FTS5_MIN_MERGE;
1b2b0 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20  .  p->nWorkUnit 
1b2c0 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  = FTS5_WORK_UNIT
1b2d0 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69  ;.  p->nMaxPendi
1b2e0 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31 30  ngData = 1024*10
1b2f0 32 34 3b 0a 20 20 70 2d 3e 7a 44 61 74 61 54 62  24;.  p->zDataTb
1b300 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1b310 6e 74 66 28 22 25 73 5f 64 61 74 61 22 2c 20 70  ntf("%s_data", p
1b320 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a  Config->zName);.
1b330 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62    if( p->zDataTb
1b340 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
1b350 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1b360 20 7d 65 6c 73 65 20 69 66 28 20 62 43 72 65 61   }else if( bCrea
1b370 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  te ){.    int i;
1b380 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1b390 72 65 20 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  re s;.    rc = s
1b3a0 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
1b3b0 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 70  Table(.        p
1b3c0 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20  Config, "data", 
1b3d0 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  "id INTEGER PRIM
1b3e0 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
1b3f0 4c 4f 42 22 2c 20 70 7a 45 72 72 0a 20 20 20 20  LOB", pzErr.    
1b400 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1b410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b420 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20    memset(&s, 0, 
1b430 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
1b440 74 75 72 65 29 29 3b 0a 20 20 20 20 20 20 66 6f  ture));.      fo
1b450 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
1b460 2d 3e 6e 50 72 65 66 69 78 2b 31 3b 20 69 2b 2b  ->nPrefix+1; i++
1b470 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
1b480 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
1b490 20 69 2c 20 26 73 29 3b 0a 20 20 20 20 20 20 7d   i, &s);.      }
1b4a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 72  .      rc = p->r
1b4b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  c;.    }.    sql
1b4c0 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
1b4d0 41 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f 6e  Averages(p, (con
1b4e0 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20  st u8*)"", 0);. 
1b4f0 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   }..  if( rc ){.
1b500 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
1b510 6e 64 65 78 43 6c 6f 73 65 28 70 2c 20 30 29 3b  ndexClose(p, 0);
1b520 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
1b530 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b540 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1b550 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79  handle opened by
1b560 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
1b570 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
1b580 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  ndexOpen()..*/.i
1b590 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
1b5a0 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64  dexClose(Fts5Ind
1b5b0 65 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 73 74  ex *p, int bDest
1b5c0 72 6f 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  roy){.  int rc =
1b5d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1b5e0 28 20 62 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( bDestroy ){.  
1b5f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
1b600 73 35 44 72 6f 70 54 61 62 6c 65 28 70 2d 3e 70  s5DropTable(p->p
1b610 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 29 3b  Config, "data");
1b620 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b630 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a  ->pReader==0 );.
1b640 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1b650 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  ze(p->pWriter);.
1b660 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1b670 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ze(p->pDeleter);
1b680 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1b690 70 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  p->aHash);.  sql
1b6a0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61  ite3_free(p->zDa
1b6b0 74 61 54 62 6c 29 3b 0a 20 20 73 71 6c 69 74 65  taTbl);.  sqlite
1b6c0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
1b6d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b6e0 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65   Return a simple
1b6f0 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
1b700 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67  based on the arg
1b710 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  uments..*/.stati
1b720 63 20 75 36 34 20 66 74 73 35 49 6e 64 65 78 45  c u64 fts5IndexE
1b730 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34  ntryCksum(.  i64
1b740 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20   iRowid, .  int 
1b750 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f  iCol, .  int iPo
1b760 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
1b770 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69 6e 74 20   *pTerm, .  int 
1b780 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69  nTerm.){.  int i
1b790 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52  ;.  u64 ret = iR
1b7a0 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  owid;.  ret += (
1b7b0 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a  ret<<3) + iCol;.
1b7c0 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
1b7d0 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f 72 28  ) + iPos;.  for(
1b7e0 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
1b7f0 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  +) ret += (ret<<
1b800 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20  3) + pTerm[i];. 
1b810 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
1b820 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65 20  /*.** Calculate 
1b830 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
1b840 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20 74 68  cksum that is th
1b850 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69 6e 64  e XOR of the ind
1b860 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68 65 63  ex entry.** chec
1b870 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72  ksum of all entr
1b880 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ies that would b
1b890 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
1b8a0 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69 66 69  he token specifi
1b8b0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 69 6e  ed.** by the fin
1b8c0 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73 2e 0a  al 5 arguments..
1b8d0 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74  */.u64 sqlite3Ft
1b8e0 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a 20 20  s5IndexCksum(.  
1b8f0 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1b900 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  fig,            
1b910 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
1b920 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34   object */.  i64
1b930 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b950 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20 61 70  Document term ap
1b960 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e  pears in */.  in
1b970 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b990 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61 70 70   Column term app
1b9a0 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  ears in */.  int
1b9b0 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b9d0 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20 61 70  Position term ap
1b9e0 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 63 6f  pears in */.  co
1b9f0 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
1ba00 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 2f 2a   int nTerm    /*
1ba10 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20 2a 2f   Term at iPos */
1ba20 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20 3d 20  .){.  u64 ret = 
1ba30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ba40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1ba50 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
1ba60 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1ba70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1ba80 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
1ba90 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 0a  ugh indexes */..
1baa0 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49    for(iIdx=0; iI
1bab0 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
1bac0 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
1bad0 20 20 20 69 6e 74 20 6e 20 3d 20 28 28 69 49 64     int n = ((iId
1bae0 78 3d 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x==pConfig->nPre
1baf0 66 69 78 29 20 3f 20 6e 54 65 72 6d 20 3a 20 70  fix) ? nTerm : p
1bb00 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
1bb10 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20  iIdx]);.    if( 
1bb20 6e 3c 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  n<=nTerm ){.    
1bb30 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64    ret ^= fts5Ind
1bb40 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
1bb50 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
1bb60 20 70 54 65 72 6d 2c 20 6e 29 3b 0a 20 20 20 20   pTerm, n);.    
1bb70 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1bb80 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ret;.}..static v
1bb90 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65  oid fts5BtreeIte
1bba0 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
1bbb0 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49  ex *p, .  int iI
1bbc0 64 78 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  dx,.  Fts5Struct
1bbd0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1bbe0 2c 20 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  , .  Fts5BtreeIt
1bbf0 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69  er *pIter.){.  i
1bc00 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
1bc10 69 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  i;.  nByte = siz
1bc20 65 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  eof(pIter->aLvl[
1bc30 30 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65  0]) * (pSeg->nHe
1bc40 69 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65  ight-1);.  memse
1bc50 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
1bc60 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
1bc70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65  Iter->nLvl = pSe
1bc80 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20  g->nHeight-1;.  
1bc90 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49  pIter->iIdx = iI
1bca0 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d  dx;.  pIter->p =
1bcb0 20 70 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65   p;.  pIter->pSe
1bcc0 67 20 3d 20 70 53 65 67 3b 0a 20 20 69 66 28 20  g = pSeg;.  if( 
1bcd0 6e 42 79 74 65 20 26 26 20 70 2d 3e 72 63 3d 3d  nByte && p->rc==
1bce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bcf0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28   pIter->aLvl = (
1bd00 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
1bd10 65 6c 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  el*)fts5IdxMallo
1bd20 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  c(p, nByte);.  }
1bd30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
1bd40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bd50 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
1bd60 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  ++){.    i64 iRo
1bd70 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
1bd80 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
1bd90 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 2b 31  Seg->iSegid, i+1
1bda0 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35 44 61  , 1);.    Fts5Da
1bdb0 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  ta *pData;.    p
1bdc0 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44  Iter->aLvl[i].pD
1bdd0 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20 66 74  ata = pData = ft
1bde0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
1bdf0 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70  owid);.    if( p
1be00 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74  Data ){.      ft
1be10 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
1be20 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
1be30 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  n, &pIter->aLvl[
1be40 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  i].s);.    }.  }
1be50 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e  ..  if( pIter->n
1be60 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20  Lvl==0 || p->rc 
1be70 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  ){.    pIter->bE
1be80 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 74 65  of = 1;.    pIte
1be90 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65 67 2d  r->iLeaf = pSeg-
1bea0 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c  >pgnoLast;.  }el
1beb0 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e  se{.    pIter->n
1bec0 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61  Empty = pIter->a
1bed0 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b  Lvl[0].s.nEmpty;
1bee0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
1bef0 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
1bf00 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20  0].s.iChild;.   
1bf10 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d   pIter->bDlidx =
1bf20 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
1bf30 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a  s.bDlidx;.  }.}.
1bf40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1bf50 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28 46  5BtreeIterNext(F
1bf60 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70 49  ts5BtreeIter *pI
1bf70 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  ter){.  Fts5Inde
1bf80 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 3b  x *p = pIter->p;
1bf90 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
1bfa0 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f 66  ert( pIter->bEof
1bfb0 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61 4c  ==0 && pIter->aL
1bfc0 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20 29 3b  vl[0].s.aData );
1bfd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
1bfe0 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e  ter->nLvl && p->
1bff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1c000 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72  ++){.    Fts5Btr
1c010 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
1c020 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
1c030 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64  [i];.    fts5Nod
1c040 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
1c050 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  , &pLvl->s);.   
1c060 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61 44 61   if( pLvl->s.aDa
1c070 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ta ){.      fts5
1c080 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1c090 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
1c0a0 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20  pLvl->s.term.n, 
1c0b0 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b  pLvl->s.term.p);
1c0c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c0d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
1c0e0 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
1c0f0 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20  &pLvl->s);.     
1c100 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1c110 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
1c120 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
1c130 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1c140 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e    if( i==pIter->
1c150 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20 29 7b  nLvl || p->rc ){
1c160 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
1c170 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1c180 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
1c190 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
1c1a0 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69 2d 2d  gid;.    for(i--
1c1b0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
1c1c0 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65      Fts5BtreeIte
1c1d0 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  rLevel *pLvl = &
1c1e0 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
1c1f0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
1c200 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1c210 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64  ROWID(pIter->iId
1c220 78 2c 69 53 65 67 69 64 2c 69 2b 31 2c 70 4c 76  x,iSegid,i+1,pLv
1c230 6c 5b 31 5d 2e 73 2e 69 43 68 69 6c 64 29 3b 0a  l[1].s.iChild);.
1c240 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
1c250 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
1c260 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  (p, iRowid);.   
1c270 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61     if( pLvl->pDa
1c280 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ta ){.        ft
1c290 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
1c2a0 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 2c 20 70  Lvl->pData->p, p
1c2b0 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 6e 2c 20 26  Lvl->pData->n, &
1c2c0 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20  pLvl->s);.      
1c2d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
1c2e0 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70  Iter->nEmpty = p
1c2f0 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
1c300 6e 45 6d 70 74 79 3b 0a 20 20 70 49 74 65 72 2d  nEmpty;.  pIter-
1c310 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
1c320 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64  >aLvl[0].s.bDlid
1c330 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  x;.  pIter->iLea
1c340 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
1c350 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 61  0].s.iChild;.  a
1c360 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1c370 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
1c380 2d 3e 62 45 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61  ->bEof );.}..sta
1c390 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
1c3a0 65 65 49 74 65 72 46 72 65 65 28 46 74 73 35 42  eeIterFree(Fts5B
1c3b0 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29  treeIter *pIter)
1c3c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1c3d0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
1c3e0 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Lvl; i++){.    F
1c3f0 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
1c400 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
1c410 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66  ->aLvl[i];.    f
1c420 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
1c430 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69  &pLvl->s);.    i
1c440 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
1c450 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
1c460 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44  Release(pLvl->pD
1c470 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  ata);.      pLvl
1c480 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->pData = 0;.   
1c490 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1c4a0 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 4c 76  _free(pIter->aLv
1c4b0 6c 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  l);.  fts5Buffer
1c4c0 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72  Free(&pIter->ter
1c4d0 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  m);.}../*.** Thi
1c4e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75  s function is pu
1c4f0 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
1c500 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
1c510 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
1c520 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
1c530 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
1c540 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
1c550 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
1c560 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  .**.** Instead, 
1c570 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68  it tests that th
1c580 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67  e same set of pg
1c590 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  no/rowid combina
1c5a0 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69  tions are .** vi
1c5b0 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73  sited regardless
1c5c0 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
1c5d0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64  doclist-index id
1c5e0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
1c5f0 6d 65 74 65 72 73 0a 2a 2a 20 69 49 64 78 2f 69  meters.** iIdx/i
1c600 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69  Segid/iLeaf is i
1c610 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61  terated in forwa
1c620 72 64 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f  rds or reverse o
1c630 72 64 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rder..*/.#ifdef 
1c640 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
1c650 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
1c660 64 78 49 74 65 72 54 65 73 74 52 65 76 65 72 73  dxIterTestRevers
1c670 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
1c680 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20  p, .  int iIdx, 
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1c6b0 6f 20 6c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  o load doclist-i
1c6c0 6e 64 65 78 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ndex from */.  i
1c6d0 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c6f0 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20  * Segment id to 
1c700 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  load from */.  i
1c710 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20 20  nt iLeaf        
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c730 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  * Load doclist-i
1c740 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65  ndex for this le
1c750 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  af */.){.  Fts5D
1c760 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
1c770 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 6b 73 75   = 0;.  i64 cksu
1c780 6d 31 20 3d 20 31 33 3b 0a 20 20 69 36 34 20 63  m1 = 13;.  i64 c
1c790 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66  ksum2 = 13;..  f
1c7a0 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1c7b0 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
1c7c0 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20   iSegid, iLeaf, 
1c7d0 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  &pDlidx);.      
1c7e0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
1c7f0 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
1c800 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
1c810 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78 29 0a  terNext(pDlidx).
1c820 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
1c830 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67   pDlidx->iLeafPg
1c840 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  no>iLeaf );.    
1c850 63 6b 73 75 6d 31 20 3d 20 28 63 6b 73 75 6d 31  cksum1 = (cksum1
1c860 20 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69 64   ^ ( (i64)(pDlid
1c870 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c  x->iLeafPgno) <<
1c880 20 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75   32 ));.    cksu
1c890 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 70  m1 = (cksum1 ^ p
1c8a0 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a  Dlidx->iRowid);.
1c8b0 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49    }.  fts5DlidxI
1c8c0 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
1c8d0 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a  .  pDlidx = 0;..
1c8e0 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49    for(fts5DlidxI
1c8f0 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 49  terInit(p, 1, iI
1c900 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61  dx, iSegid, iLea
1c910 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20  f, &pDlidx);.   
1c920 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1c930 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
1c940 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  0;.      fts5Dli
1c950 64 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64  dxIterPrev(pDlid
1c960 78 29 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  x).  ){.    asse
1c970 72 74 28 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61  rt( pDlidx->iLea
1c980 66 50 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20  fPgno>iLeaf );. 
1c990 20 20 20 63 6b 73 75 6d 32 20 3d 20 28 63 6b 73     cksum2 = (cks
1c9a0 75 6d 32 20 5e 20 28 20 28 69 36 34 29 28 70 44  um2 ^ ( (i64)(pD
1c9b0 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  lidx->iLeafPgno)
1c9c0 20 3c 3c 20 33 32 20 29 29 3b 0a 20 20 20 20 63   << 32 ));.    c
1c9d0 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20  ksum2 = (cksum2 
1c9e0 5e 20 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64  ^ pDlidx->iRowid
1c9f0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
1ca00 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
1ca10 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
1ca20 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
1ca30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
1ca40 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d  um1!=cksum2 ) p-
1ca50 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1ca60 50 54 3b 20 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  PT; .}.#else.# d
1ca70 65 66 69 6e 65 20 66 74 73 35 44 6c 69 64 78 49  efine fts5DlidxI
1ca80 74 65 72 54 65 73 74 52 65 76 65 72 73 65 28 77  terTestReverse(w
1ca90 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
1caa0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1cab0 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
1cac0 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  eckSegment(.  Ft
1cad0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1caf0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1cb00 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ject */.  int iI
1cb10 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
1cb20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1cb30 65 78 20 74 68 61 74 20 70 53 65 67 20 69 73 20  ex that pSeg is 
1cb40 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46  a part of */.  F
1cb50 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1cb60 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f  ent *pSeg      /
1cb70 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65  * Segment to che
1cb80 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73  ck internal cons
1cb90 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20  istency */.){.  
1cba0 46 74 73 35 42 74 72 65 65 49 74 65 72 20 69 74  Fts5BtreeIter it
1cbb0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1cbc0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
1cbd0 74 65 20 74 68 72 6f 75 67 68 20 62 2d 74 72 65  te through b-tre
1cbe0 65 20 68 69 65 72 61 72 63 68 79 20 2a 2f 0a 0a  e hierarchy */..
1cbf0 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
1cc00 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20  ough the b-tree 
1cc10 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20  hierarchy.  */. 
1cc20 20 66 6f 72 28 66 74 73 35 42 74 72 65 65 49 74   for(fts5BtreeIt
1cc30 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20  erInit(p, iIdx, 
1cc40 70 53 65 67 2c 20 26 69 74 65 72 29 3b 0a 20 20  pSeg, &iter);.  
1cc50 20 20 20 20 69 74 65 72 2e 62 45 6f 66 3d 3d 30      iter.bEof==0
1cc60 3b 0a 20 20 20 20 20 20 66 74 73 35 42 74 72 65  ;.      fts5Btre
1cc70 65 49 74 65 72 4e 65 78 74 28 26 69 74 65 72 29  eIterNext(&iter)
1cc80 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
1cc90 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
1cca0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1ccb0 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
1ccc0 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
1ccd0 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
1cce0 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
1ccf0 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
1cd00 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cd20 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
1cd30 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a  t term on leaf *
1cd40 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
1cd70 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
1cd80 6d 70 74 79 20 6c 65 61 76 65 73 20 2a 2f 0a 0a  mpty leaves */..
1cd90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
1cda0 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
1cdb0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1cdc0 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
1cdd0 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
1cde0 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
1cdf0 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
1ce00 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
1ce10 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
1ce20 20 20 20 69 66 28 20 69 74 65 72 2e 69 4c 65 61     if( iter.iLea
1ce30 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  f<pSeg->pgnoFirs
1ce40 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1ce50 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45    iRow = FTS5_SE
1ce60 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
1ce70 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
1ce80 30 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a  0, iter.iLeaf);.
1ce90 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
1cea0 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
1ceb0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
1cec0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
1ced0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1cee0 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e  the leaf contain
1cef0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
1cf00 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74  erm, and that it
1cf10 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a   is equal.    **
1cf20 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68   to or larger th
1cf30 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  an the split-key
1cf40 20 69 6e 20 69 74 65 72 2e 74 65 72 6d 2e 20 20   in iter.term.  
1cf50 2a 2f 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  */.    iOff = ft
1cf60 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
1cf70 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  >p[2]);.    if( 
1cf80 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
1cf90 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1cfa0 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
1cfb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  {.      int nTer
1cfc0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1cfd0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1cfe0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
1cff0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
1d000 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
1d010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1d020 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
1d030 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
1d040 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
1d050 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
1d060 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
1d070 6d 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  m);.      res = 
1d080 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70  memcmp(&pLeaf->p
1d090 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72  [iOff], iter.ter
1d0a0 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  m.p, MIN(nTerm, 
1d0b0 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20  iter.term.n));. 
1d0c0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1d0d0 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
1d0e0 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20  iter.term.n;.   
1d0f0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
1d100 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1d110 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
1d120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1d130 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1d140 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
1d150 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
1d160 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
1d170 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
1d180 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
1d190 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
1d1a0 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
1d1b0 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
1d1c0 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
1d1d0 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  s. */.    for(i=
1d1e0 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  1; p->rc==SQLITE
1d1f0 5f 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e  _OK && i<=iter.n
1d200 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  Empty; i++){.   
1d210 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1d220 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b  ataRead(p, iRow+
1d230 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i);.      if( pL
1d240 65 61 66 20 26 26 20 30 21 3d 66 74 73 35 47 65  eaf && 0!=fts5Ge
1d250 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
1d260 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ]) ){.        p-
1d270 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1d280 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1d290 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1d2a0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  e(pLeaf);.    }.
1d2b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1d2c0 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
1d2d0 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20  dex, check that 
1d2e0 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20  it looks right. 
1d2f0 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e  */.    if( iter.
1d300 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  bDlidx ){.      
1d310 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
1d320 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
1d330 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
1d340 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
1d350 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
1d360 69 50 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72  iPrevLeaf = iter
1d370 2e 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  .iLeaf;.      in
1d380 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
1d390 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
1d3a0 6e 74 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36  nt iPg;.      i6
1d3b0 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66  4 iKey;..      f
1d3c0 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1d3d0 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
1d3e0 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c   iSegid, iter.iL
1d3f0 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20  eaf, &pDlidx);. 
1d400 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
1d410 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
1d420 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
1d430 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1d440 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20  Next(pDlidx).   
1d450 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f     ){..        /
1d460 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69  * Check any rowi
1d470 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  d-less pages tha
1d480 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
1d490 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1d4a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
1d4b0 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b  iPg=iPrevLeaf+1;
1d4c0 20 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65   iPg<pDlidx->iLe
1d4d0 61 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a  afPgno; iPg++){.
1d4e0 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
1d4f0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1d500 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1d510 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20  , 0, iPg);.     
1d520 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
1d530 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
1d540 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1d550 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
1d560 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 47         if( fts5G
1d570 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
1d580 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  0])!=0 ) p->rc =
1d590 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
1d5a0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
1d5b0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
1d5c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1d5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d5e0 20 69 50 72 65 76 4c 65 61 66 20 3d 20 70 44 6c   iPrevLeaf = pDl
1d5f0 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  idx->iLeafPgno;.
1d600 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1d610 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
1d620 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62  page indicated b
1d630 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  y the iterator r
1d640 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20  eally does.     
1d650 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68     ** contain th
1d660 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65  e rowid suggeste
1d670 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a  d by the same. *
1d680 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
1d690 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1d6a0 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1d6b0 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65  , 0, pDlidx->iLe
1d6c0 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  afPgno);.       
1d6d0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1d6e0 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1d6f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1d700 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1d710 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
1d720 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
1d730 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
1d740 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
1d750 20 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69           getVari
1d760 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
1d770 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
1d780 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1d790 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70     if( iRowid!=p
1d7a0 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20  Dlidx->iRowid ) 
1d7b0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1d7c0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
1d7d0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1d7e0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
1d7f0 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  }..      }..    
1d800 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
1d810 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65  eaf+1; iPg<=(ite
1d820 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e  r.iLeaf + iter.n
1d830 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a  Empty); iPg++){.
1d840 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1d850 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1d860 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1d870 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  0, iPg);.       
1d880 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1d890 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1d8a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1d8b0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1d8c0 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70  f( fts5GetU16(&p
1d8d0 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29  Leaf->p[0])!=0 )
1d8e0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1d8f0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
1d900 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1d910 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
1d920 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
1d930 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
1d940 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ree(pDlidx);.   
1d950 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1d960 54 65 73 74 52 65 76 65 72 73 65 28 70 2c 20 69  TestReverse(p, i
1d970 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65  Idx, iSegid, ite
1d980 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  r.iLeaf);.    }.
1d990 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1d9a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1d9b0 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
1d9c0 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
1d9d0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1d9e0 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74  RRUPT;.  }..  ft
1d9f0 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65 28  s5BtreeIterFree(
1da00 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &iter);.}../*.**
1da10 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68   Run internal ch
1da20 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ecks to ensure t
1da30 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65  hat the FTS inde
1da40 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61  x (a) is interna
1da50 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65  lly .** consiste
1da60 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  nt and (b) conta
1da70 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
1da80 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66  which the XOR of
1da90 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a   the checksums.*
1daa0 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20  * as calculated 
1dab0 62 79 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  by fts5IndexEntr
1dac0 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75  yCksum() is cksu
1dad0 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  m..**.** Return 
1dae0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
1daf0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74  f any of the int
1db00 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69  ernal checks fai
1db10 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  l, or if the.** 
1db20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f  checksum does no
1db30 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20  t match. Return 
1db40 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
1db50 20 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74   checks pass wit
1db60 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f  hout.** error, o
1db70 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c  r some other SQL
1db80 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1db90 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  f another error 
1dba0 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63  (e.g. OOM).** oc
1dbb0 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
1dbc0 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74  ite3Fts5IndexInt
1dbd0 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35  egrityCheck(Fts5
1dbe0 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b  Index *p, u64 ck
1dbf0 73 75 6d 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  sum){.  Fts5Conf
1dc00 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
1dc10 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20  >pConfig;.  int 
1dc20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1dc40 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1dc50 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a  hrough indexes *
1dc60 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1dc90 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75  de */.  u64 cksu
1dca0 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  m2 = 0;         
1dcb0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
1dcc0 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e  sum based on con
1dcd0 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73  tents of indexes
1dce0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
1dcf0 74 68 61 74 20 74 68 65 20 63 68 65 63 6b 73 75  that the checksu
1dd00 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6d  m of the index m
1dd10 61 74 63 68 65 73 20 74 68 65 20 61 72 67 75 6d  atches the argum
1dd20 65 6e 74 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ent checksum */.
1dd30 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49    for(iIdx=0; iI
1dd40 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
1dd50 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
1dd60 20 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49     Fts5MultiSegI
1dd70 74 65 72 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ter *pIter;.    
1dd80 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1dd90 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1dda0 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69 49  uctureRead(p, iI
1ddb0 64 78 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  dx);.    for(fts
1ddc0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
1ddd0 20 70 53 74 72 75 63 74 2c 20 69 49 64 78 2c 20   pStruct, iIdx, 
1dde0 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20  0, 0, 0, -1, 0, 
1ddf0 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20  &pIter);.       
1de00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1de10 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
1de20 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
1de30 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
1de40 65 72 2c 20 30 2c 20 30 29 0a 20 20 20 20 29 7b  er, 0, 0).    ){
1de50 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 49 74  .      Fts5PosIt
1de60 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20  er sPos;        
1de70 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
1de80 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f  erate through po
1de90 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
1dea0 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20       int n;     
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
1ded0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1dee0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1def0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1df00 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  id(pIter);.     
1df10 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72   char *z = (char
1df20 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
1df30 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
1df40 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 50  .      for(fts5P
1df50 6f 73 49 74 65 72 49 6e 69 74 28 70 2c 20 70 49  osIterInit(p, pI
1df60 74 65 72 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20  ter, &sPos);.   
1df70 20 20 20 20 20 20 20 66 74 73 35 50 6f 73 49 74         fts5PosIt
1df80 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73 29 3d  erEof(p, &sPos)=
1df90 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  =0;.          ft
1dfa0 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28 70 2c  s5PosIterNext(p,
1dfb0 20 26 73 50 6f 73 29 0a 20 20 20 20 20 20 29 7b   &sPos).      ){
1dfc0 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20  .        cksum2 
1dfd0 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  ^= fts5IndexEntr
1dfe0 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 73  yCksum(iRowid, s
1dff0 50 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f 73 2e 69  Pos.iCol, sPos.i
1e000 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 23 69 66 20  Pos, z, n);.#if 
1e010 30 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  0.        fprint
1e020 66 28 73 74 64 6f 75 74 2c 20 22 72 6f 77 69 64  f(stdout, "rowid
1e030 3d 25 64 20 22 2c 20 28 69 6e 74 29 69 52 6f 77  =%d ", (int)iRow
1e040 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  id);.        fpr
1e050 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74 65  intf(stdout, "te
1e060 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e 2c 20 7a 29  rm=%.*s ", n, z)
1e070 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
1e080 66 28 73 74 64 6f 75 74 2c 20 22 63 6f 6c 3d 25  f(stdout, "col=%
1e090 64 20 22 2c 20 73 50 6f 73 2e 69 43 6f 6c 29 3b  d ", sPos.iCol);
1e0a0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1e0b0 28 73 74 64 6f 75 74 2c 20 22 6f 66 66 3d 25 64  (stdout, "off=%d
1e0c0 5c 6e 22 2c 20 73 50 6f 73 2e 69 50 6f 73 29 3b  \n", sPos.iPos);
1e0d0 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28  .        fflush(
1e0e0 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a  stdout);.#endif.
1e0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e100 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
1e110 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ree(p, pIter);. 
1e120 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1e130 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1e140 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 2d 3e  ;.  }.  rc = p->
1e150 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  rc;.  if( rc==SQ
1e160 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d  LITE_OK && cksum
1e170 21 3d 63 6b 73 75 6d 32 20 29 20 72 63 20 3d 20  !=cksum2 ) rc = 
1e180 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
1e190 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
1e1a0 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
1e1b0 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65 6e  s of each segmen
1e1c0 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61 76  t match the leav
1e1d0 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64 78  es */.  for(iIdx
1e1e0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1e1f0 4b 20 26 26 20 69 49 64 78 3c 3d 70 43 6f 6e 66  K && iIdx<=pConf
1e200 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
1e210 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  x++){.    Fts5St
1e220 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
1e230 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1e240 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20  Read(p, iIdx);. 
1e250 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
1e260 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
1e270 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 66 6f  , iSeg;.      fo
1e280 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1e290 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1e2a0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1e2b0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
1e2c0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
1e2d0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
1e2e0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
1e2f0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
1e300 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
1e310 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1e320 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
1e330 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 49  .          fts5I
1e340 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
1e350 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 69 49 64  ckSegment(p, iId
1e360 78 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  x, pSeg);.      
1e370 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e380 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
1e390 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
1e3a0 63 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  ct);.    rc = p-
1e3b0 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  >rc;.  }..  retu
1e3c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2f 0a  rn rc;.}../*.*/.
1e3d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1e3e0 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
1e3f0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
1e420 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
1e430 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
1e440 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f    const u8 *pBlo
1e450 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a  b, int nBlob.){.
1e460 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e490 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1e4a0 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  ure *p = 0;     
1e4b0 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64        /* Decoded
1e4c0 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
1e4d0 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  t */..  rc = fts
1e4e0 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
1e4f0 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 26  (pBlob, nBlob, &
1e500 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
1e510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
1e520 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRc = rc;.    re
1e530 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  turn;.  }..  fts
1e540 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
1e550 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20  pRc, pBuf, p);. 
1e560 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1e570 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  lease(p);.}../*.
1e580 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20  ** Buffer (a/n) 
1e590 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
1e5a0 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  ntain a list of 
1e5b0 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e  serialized varin
1e5c0 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68  ts. Read.** each
1e5d0 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65   varint and appe
1e5e0 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65  nd its string re
1e5f0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20  presentation to 
1e600 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74  buffer pBuf. Ret
1e610 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74  urn.** after eit
1e620 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75  her the input bu
1e630 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65  ffer is exhauste
1e640 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69  d or a 0 value i
1e650 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
1e660 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1e670 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1e680 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
1e690 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
1e6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e6b0 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
1e6c0 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
1e6d0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
1e6e0 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
1e6f0 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
1e700 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  0;.  while( iOff
1e710 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  <n ){.    int iV
1e720 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  al;.    iOff += 
1e730 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  getVarint32(&a[i
1e740 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
1e750 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1e760 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
1e770 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c  Rc, pBuf, " %d",
1e780 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
1e790 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
1e7a0 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66  .** The start of
1e7b0 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f   buffer (a/n) co
1e7c0 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74  ntains the start
1e7d0 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   of a doclist. T
1e7e0 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61  he doclist.** ma
1e7f0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e  y or may not fin
1e800 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62  ish within the b
1e810 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
1e820 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74  tion appends a t
1e830 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74  ext.** represent
1e840 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
1e850 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  t of the doclist
1e860 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
1e870 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   to buffer.** pB
1e880 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  uf. .**.** The r
1e890 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1e8a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e8b0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
1e8c0 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
1e8d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1e8e0 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69  5DecodeDoclist(i
1e8f0 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
1e900 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
1e910 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
1e920 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a 20 20    i64 iDocid;.  
1e930 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
1e940 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
1e950 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
1e960 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  e3GetVarint(&a[i
1e970 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 6f  Off], (u64*)&iDo
1e980 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  cid);.    sqlite
1e990 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1e9a0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
1e9b0 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22  f, " rowid=%lld"
1e9c0 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20  , iDocid);.  }. 
1e9d0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
1e9e0 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  {.    int nPos;.
1e9f0 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56      iOff += getV
1ea00 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
1ea10 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 69 4f 66  , nPos);.    iOf
1ea20 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50  f += fts5DecodeP
1ea30 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66  oslist(pRc, pBuf
1ea40 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28  , &a[iOff], MIN(
1ea50 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a  n-iOff, nPos));.
1ea60 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
1ea70 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
1ea80 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ta;.      iOff +
1ea90 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
1eaa0 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
1eab0 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
1eac0 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
1ead0 20 29 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a   ) return iOff;.
1eae0 20 20 20 20 20 20 69 44 6f 63 69 64 20 2d 3d 20        iDocid -= 
1eaf0 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71  iDelta;.      sq
1eb00 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1eb10 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
1eb20 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64 3d 25   pBuf, " rowid=%
1eb30 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20  lld", iDocid);. 
1eb40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1eb50 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iOff;.}../*.*
1eb60 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
1eb70 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
1eb80 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
1eb90 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65  tion fts5_decode
1eba0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
1ebb0 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e  id fts5DecodeFun
1ebc0 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
1ebd0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
1ebe0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
1ebf0 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78  tion call contex
1ec00 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ec30 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73   of args (always
1ec40 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   2) */.  sqlite3
1ec50 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
1ec60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
1ec70 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
1ec80 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69  /.){.  i64 iRowi
1ec90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1eca0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
1ecb0 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67  for record being
1ecc0 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e   decoded */.  in
1ecd0 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c 69 48  t iIdx,iSegid,iH
1ece0 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a  eight,iPgno;  /*
1ecf0 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74   Rowid component
1ed00 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  s */.  const u8 
1ed10 2a 61 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  *a; int n;      
1ed20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64         /* Record
1ed30 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20   to decode */.  
1ed40 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20  Fts5Buffer s;   
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74  /* Build up text
1ed70 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20   to return here 
1ed80 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1ed90 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1eda0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1edb0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
1edc0 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d  ( nArg==2 );.  m
1edd0 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
1ede0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1edf0 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  ;.  iRowid = sql
1ee00 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
1ee10 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20  (apVal[0]);.  n 
1ee20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ee30 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b  bytes(apVal[1]);
1ee40 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  a = sqlite3_v
1ee50 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b  alue_blob(apVal[
1ee60 31 5d 29 3b 0a 20 20 66 74 73 35 44 65 63 6f 64  1]);.  fts5Decod
1ee70 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26  eRowid(iRowid, &
1ee80 69 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26  iIdx, &iSegid, &
1ee90 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
1eea0 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f  ;..  fts5DebugRo
1eeb0 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f  wid(&rc, &s, iRo
1eec0 77 69 64 29 3b 0a 20 20 69 66 28 20 69 48 65 69  wid);.  if( iHei
1eed0 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e  ght==FTS5_SEGMEN
1eee0 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a  T_MAX_HEIGHT ){.
1eef0 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
1ef00 20 20 20 69 36 34 20 69 50 72 65 76 3b 0a 20 20     i64 iPrev;.  
1ef10 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1ef20 20 20 20 69 20 3d 20 67 65 74 56 61 72 69 6e 74     i = getVarint
1ef30 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69  (&a[i], (u64*)&i
1ef40 50 72 65 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  Prev);.      sql
1ef50 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1ef60 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20  pendPrintf(&rc, 
1ef70 26 73 2c 20 22 20 25 6c 6c 64 22 2c 20 69 50 72  &s, " %lld", iPr
1ef80 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ev);.    }.    w
1ef90 68 69 6c 65 28 20 69 3c 6e 20 29 7b 0a 20 20 20  hile( i<n ){.   
1efa0 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
1efb0 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e     i += getVarin
1efc0 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26  t(&a[i], (u64*)&
1efd0 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iVal);.      if(
1efe0 20 69 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   iVal==0 ){.    
1eff0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1f000 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
1f010 66 28 26 72 63 2c 20 26 73 2c 20 22 20 78 22 29  f(&rc, &s, " x")
1f020 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f030 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
1f040 50 72 65 76 20 2d 20 69 56 61 6c 3b 0a 20 20 20  Prev - iVal;.   
1f050 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1f060 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
1f070 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 25 6c  tf(&rc, &s, " %l
1f080 6c 64 22 2c 20 69 50 72 65 76 29 3b 0a 20 20 20  ld", iPrev);.   
1f090 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 7d 65     }.    }..  }e
1f0a0 6c 73 65 0a 20 20 69 66 28 20 69 53 65 67 69 64  lse.  if( iSegid
1f0b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
1f0c0 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52  Rowid==FTS5_AVER
1f0d0 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20  AGES_ROWID ){.  
1f0e0 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20      /* todo */. 
1f0f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f100 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
1f110 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ure(&rc, &s, a, 
1f120 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
1f130 65 7b 0a 0a 20 20 20 20 46 74 73 35 42 75 66 66  e{..    Fts5Buff
1f140 65 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d 65 6d  er term;.    mem
1f150 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
1f160 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
1f170 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65 69  );..    if( iHei
1f180 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
1f190 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30  int iTermOff = 0
1f1a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77  ;.      int iRow
1f1b0 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  idOff = 0;.     
1f1c0 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
1f1d0 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a   int nKeep = 0;.
1f1e0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66  .      iRowidOff
1f1f0 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
1f200 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 54 65 72  [0]);.      iTer
1f210 6d 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  mOff = fts5GetU1
1f220 36 28 26 61 5b 32 5d 29 3b 0a 0a 20 20 20 20 20  6(&a[2]);..     
1f230 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
1f240 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  {.        iOff =
1f250 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
1f260 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72    }else if( iTer
1f270 6d 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  mOff ){.        
1f280 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
1f290 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f2a0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a        iOff = n;.
1f2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1f2c0 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
1f2d0 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20  &rc, &s, &a[4], 
1f2e0 69 4f 66 66 2d 34 29 3b 0a 0a 0a 20 20 20 20 20  iOff-4);...     
1f2f0 20 61 73 73 65 72 74 28 20 69 52 6f 77 69 64 4f   assert( iRowidO
1f300 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69  ff==0 || iOff==i
1f310 52 6f 77 69 64 4f 66 66 20 29 3b 0a 20 20 20 20  RowidOff );.    
1f320 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20    if( iRowidOff 
1f330 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
1f340 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  += fts5DecodeDoc
1f350 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
1f360 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b  [iOff], n-iOff);
1f370 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1f380 61 73 73 65 72 74 28 20 69 54 65 72 6d 4f 66 66  assert( iTermOff
1f390 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65  ==0 || iOff==iTe
1f3a0 72 6d 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 77  rmOff );.      w
1f3b0 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
1f3c0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
1f3d0 65 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e;.        iOff 
1f3e0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1f3f0 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  a[iOff], nByte);
1f400 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 3d  .        term.n=
1f410 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20   nKeep;.        
1f420 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1f430 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c  Blob(&rc, &term,
1f440 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d   nByte, &a[iOff]
1f450 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  );.        iOff 
1f460 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20  += nByte;..     
1f470 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1f480 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
1f490 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 72  (.            &r
1f4a0 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e  c, &s, " term=%.
1f4b0 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f  *s", term.n, (co
1f4c0 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70  nst char*)term.p
1f4d0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1f4e0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
1f4f0 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
1f500 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
1f510 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20   n-iOff);.      
1f520 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
1f530 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
1f540 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
1f550 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
1f560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f570 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  }.      fts5Buff
1f580 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
1f590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f5a0 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b  Fts5NodeIter ss;
1f5b0 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 4e  .      for(fts5N
1f5c0 6f 64 65 49 74 65 72 49 6e 69 74 28 61 2c 20 6e  odeIterInit(a, n
1f5d0 2c 20 26 73 73 29 3b 20 73 73 2e 61 44 61 74 61  , &ss); ss.aData
1f5e0 3b 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  ; fts5NodeIterNe
1f5f0 78 74 28 26 72 63 2c 20 26 73 73 29 29 7b 0a 20  xt(&rc, &ss)){. 
1f600 20 20 20 20 20 20 20 69 66 28 20 73 73 2e 74 65         if( ss.te
1f610 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rm.n==0 ){.     
1f620 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1f630 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
1f640 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 6c 65  tf(&rc, &s, " le
1f650 66 74 3d 25 64 22 2c 20 73 73 2e 69 43 68 69 6c  ft=%d", ss.iChil
1f660 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
1f670 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
1f680 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1f690 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 26  pendPrintf(&rc,&
1f6a0 73 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20  s, " \"%.*s\"", 
1f6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1f6c0 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72  s.term.n, ss.ter
1f6d0 6d 2e 70 0a 20 20 20 20 20 20 20 20 20 20 29 3b  m.p.          );
1f6e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f6f0 20 20 20 69 66 28 20 73 73 2e 6e 45 6d 70 74 79     if( ss.nEmpty
1f700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1f710 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1f720 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
1f730 20 26 73 2c 20 22 20 65 6d 70 74 79 3d 25 64 25   &s, " empty=%d%
1f740 73 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20  s", ss.nEmpty,. 
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e               ss.
1f760 62 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a 20 22  bDlidx ? "*" : "
1f770 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ".          );. 
1f780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f790 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49  .      fts5NodeI
1f7a0 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20 20  terFree(&ss);.  
1f7b0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
1f7c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f7d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1f7e0 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
1f7f0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70  (const char*)s.p
1f800 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52  , s.n, SQLITE_TR
1f810 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
1f820 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
1f830 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
1f840 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a  (pCtx, rc);.  }.
1f850 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1f860 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (&s);.}../*.** T
1f870 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73  his is called as
1f880 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65   part of registe
1f890 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f  ring the FTS5 mo
1f8a0 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61  dule with databa
1f8b0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
1f8c0 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72   db. It register
1f8d0 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64  s several user-d
1f8e0 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
1f8f0 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a  nctions useful.*
1f900 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a  * with FTS5..**.
1f910 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1f920 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1f930 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1f940 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d  rror occurs, som
1f950 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74  e other.** SQLit
1f960 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1f970 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
1f980 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f990 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71  Fts5IndexInit(sq
1f9a0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
1f9b0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  t rc = sqlite3_c
1f9c0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
1f9d0 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
1f9e0 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49  decode", 2, SQLI
1f9f0 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
1fa00 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
1fa10 30 2c 20 30 0a 20 20 29 3b 0a 20 20 72 65 74 75  0, 0.  );.  retu
1fa20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fa30 53 65 74 20 74 68 65 20 74 61 72 67 65 74 20 70  Set the target p
1fa40 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68 65  age size for the
1fa50 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a   index object..*
1fa60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
1fa70 73 35 49 6e 64 65 78 50 67 73 7a 28 46 74 73 35  s5IndexPgsz(Fts5
1fa80 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 70 67  Index *p, int pg
1fa90 73 7a 29 7b 0a 20 20 70 2d 3e 70 67 73 7a 20 3d  sz){.  p->pgsz =
1faa0 20 70 67 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pgsz;.}../*.** 
1fab0 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20  Iterator pMulti 
1fac0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1fad0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1fae0 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69  y (not EOF). Thi
1faf0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
1fb00 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66 20  pends a copy of 
1fb10 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
1fb20 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 70  t of the entry p
1fb30 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65 6e  Multi .** curren
1fb40 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f  tly points to to
1fb50 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
1fb60 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1fb70 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1fb80 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
1fb90 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61 73   p->rc. It is as
1fba0 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f  sumed.** no erro
1fbb0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
1fbc0 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
1fbd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1fbe0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
1fbf0 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1fc00 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
1fc10 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
1fc20 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d  MultiSegIter *pM
1fc30 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a 2c  ulti,.  int bSz,
1fc40 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1fc50 42 75 66 0a 29 7b 0a 20 20 46 74 73 35 43 68 75  Buf.){.  Fts5Chu
1fc60 6e 6b 49 74 65 72 20 69 74 65 72 3b 0a 20 20 46  nkIter iter;.  F
1fc70 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1fc80 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67   = &pMulti->aSeg
1fc90 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74  [ pMulti->aFirst
1fca0 5b 31 5d 20 5d 3b 0a 20 20 61 73 73 65 72 74 28  [1] ];.  assert(
1fcb0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1fcc0 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20  f(p, pMulti)==0 
1fcd0 29 3b 0a 20 20 66 74 73 35 43 68 75 6e 6b 49 74  );.  fts5ChunkIt
1fce0 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20  erInit(p, pSeg, 
1fcf0 26 69 74 65 72 29 3b 0a 20 20 69 66 28 20 66 74  &iter);.  if( ft
1fd00 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
1fd10 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20  , &iter)==0 ){. 
1fd20 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20     if( bSz ){.  
1fd30 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fd40 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1fd50 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e 52  c, pBuf, iter.nR
1fd60 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  em);.    }.    w
1fd70 68 69 6c 65 28 20 66 74 73 35 43 68 75 6e 6b 49  hile( fts5ChunkI
1fd80 74 65 72 45 6f 66 28 70 2c 20 26 69 74 65 72 29  terEof(p, &iter)
1fd90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
1fda0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1fdb0 62 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  b(&p->rc, pBuf, 
1fdc0 69 74 65 72 2e 6e 2c 20 69 74 65 72 2e 70 29 3b  iter.n, iter.p);
1fdd0 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b  .      fts5Chunk
1fde0 49 74 65 72 4e 65 78 74 28 70 2c 20 26 69 74 65  IterNext(p, &ite
1fdf0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1fe00 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c  fts5ChunkIterRel
1fe10 65 61 73 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a  ease(&iter);.}..
1fe20 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1fe30 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
1fe40 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
1fe50 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
1fe60 49 74 65 72 2d 3e 69 3c 70 49 74 65 72 2d 3e 6e  Iter->i<pIter->n
1fe70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65   ){.    if( pIte
1fe80 72 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 36  r->i ){.      i6
1fe90 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
1fea0 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56  pIter->i += getV
1feb0 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b  arint(&pIter->a[
1fec0 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a  pIter->i], (u64*
1fed0 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
1fee0 20 69 66 28 20 70 49 74 65 72 2d 3e 62 41 73 63   if( pIter->bAsc
1fef0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
1ff00 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
1ff10 6c 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lta;.      }else
1ff20 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
1ff30 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74  >iRowid -= iDelt
1ff40 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
1ff50 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1ff60 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69 6e  r->i += getVarin
1ff70 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  t(&pIter->a[pIte
1ff80 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70 49  r->i], (u64*)&pI
1ff90 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
1ffa0 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
1ffb0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1ffc0 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d  &pIter->a[pIter-
1ffd0 3e 69 5d 2c 20 70 49 74 65 72 2d 3e 6e 50 6f 73  >i], pIter->nPos
1ffe0 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72  list);.    pIter
1fff0 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26 70 49  ->aPoslist = &pI
20000 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d  ter->a[pIter->i]
20010 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b  ;.    pIter->i +
20020 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73  = pIter->nPoslis
20030 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
20040 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
20050 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
20060 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
20070 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46  istIterInit(.  F
20080 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
20090 20 0a 20 20 69 6e 74 20 62 41 73 63 2c 20 0a 20   .  int bAsc, . 
200a0 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
200b0 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d   *pIter.){.  mem
200c0 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
200d0 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
200e0 20 70 49 74 65 72 2d 3e 61 20 3d 20 70 42 75 66   pIter->a = pBuf
200f0 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20  ->p;.  pIter->n 
20100 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 70 49 74  = pBuf->n;.  pIt
20110 65 72 2d 3e 62 41 73 63 20 3d 20 62 41 73 63 3b  er->bAsc = bAsc;
20120 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  .  fts5DoclistIt
20130 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d  erNext(pIter);.}
20140 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
20150 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66   doclist to buff
20160 65 72 20 70 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er pBuf..*/.stat
20170 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
20180 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20  eAppendDocid(.  
20190 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
201c0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62   code */.  int b
201d0 41 73 63 2c 0a 20 20 46 74 73 35 42 75 66 66 65  Asc,.  Fts5Buffe
201e0 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
201f0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
20200 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
20210 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77    i64 *piLastRow
20220 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
20230 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65    /* IN/OUT: Pre
20240 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74  vious rowid writ
20250 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ten (if any) */.
20260 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20    i64 iRowid    
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70    /* Rowid to ap
20290 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  pend */.){.  if(
202a0 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBuf->n==0 ){. 
202b0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
202c0 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70  endVarint(pRc, p
202d0 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Buf, iRowid);.  
202e0 7d 65 6c 73 65 20 69 66 28 20 62 41 73 63 3d 3d  }else if( bAsc==
202f0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  0 ){.    fts5Buf
20300 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
20310 70 52 63 2c 20 70 42 75 66 2c 20 2a 70 69 4c 61  pRc, pBuf, *piLa
20320 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77 69 64  stRowid - iRowid
20330 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20340 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20350 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66  Varint(pRc, pBuf
20360 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61  , iRowid - *piLa
20370 73 74 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  stRowid);.  }.  
20380 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69  *piLastRowid = i
20390 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
203a0 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70  Buffers p1 and p
203b0 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73  2 contain doclis
203c0 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
203d0 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e  n merges the con
203e0 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74  tent.** of the t
203f0 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65  wo doclists toge
20400 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75  ther and sets bu
20410 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72  ffer p1 to the r
20420 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20  esult before.** 
20430 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
20440 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
20450 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
20460 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d  de is left in p-
20470 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  >rc. If an error
20480 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
20490 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
204a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
204b0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
204c0 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66  id fts5MergePref
204d0 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49  ixLists(.  Fts5I
204e0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
204f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
20500 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
20510 74 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63 2c  t */.  int bAsc,
20520 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
20530 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
20540 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74     /* First list
20550 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46   to merge */.  F
20560 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20  ts5Buffer *p2   
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20580 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f  * Second list to
20590 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
205a0 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20  f( p2->n ){.    
205b0 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
205c0 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c   0;.    Fts5Docl
205d0 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20  istIter i1;.    
205e0 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
205f0 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  i2;.    Fts5Buff
20600 65 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73 35  er out;.    Fts5
20610 42 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20 20  Buffer tmp;.    
20620 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20  memset(&out, 0, 
20630 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20  sizeof(out));.  
20640 20 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20 30    memset(&tmp, 0
20650 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a  , sizeof(tmp));.
20660 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74  .    fts5Doclist
20670 49 74 65 72 49 6e 69 74 28 70 31 2c 20 62 41 73  IterInit(p1, bAs
20680 63 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73  c, &i1);.    fts
20690 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
206a0 28 70 32 2c 20 62 41 73 63 2c 20 26 69 32 29 3b  (p2, bAsc, &i2);
206b0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 31 2e 61  .    while( i1.a
206c0 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32  Poslist!=0 || i2
206d0 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 29 7b 0a  .aPoslist!=0 ){.
206e0 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f        if( i2.aPo
206f0 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e  slist==0 || (i1.
20700 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20 20 20  aPoslist && .   
20710 20 20 20 20 20 20 20 20 28 20 28 21 62 41 73 63          ( (!bAsc
20720 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e 69 32   && i1.iRowid>i2
20730 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 62 41 73  .iRowid) || (bAs
20740 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69  c && i1.iRowid<i
20750 32 2e 69 52 6f 77 69 64 29 20 29 0a 20 20 20 20  2.iRowid) ).    
20760 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a    )){.        /*
20770 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
20780 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i1 */.        f
20790 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
207a0 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73 63  cid(&p->rc, bAsc
207b0 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f  , &out, &iLastRo
207c0 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
207d0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
207e0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
207f0 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31  &p->rc, &out, i1
20800 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .nPoslist);.    
20810 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
20820 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
20830 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69   &out, i1.nPosli
20840 73 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 29  st, i1.aPoslist)
20850 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
20860 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
20870 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
20880 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61 50    else if( i1.aP
20890 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e  oslist==0 || i2.
208a0 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69  iRowid!=i1.iRowi
208b0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
208c0 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
208d0 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i2 */.        ft
208e0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
208f0 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73 63 2c  id(&p->rc, bAsc,
20900 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77   &out, &iLastRow
20910 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
20920 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20930 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
20940 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e  p->rc, &out, i2.
20950 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  nPoslist);.     
20960 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
20970 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
20980 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  &out, i2.nPoslis
20990 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b  t, i2.aPoslist);
209a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
209b0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32  listIterNext(&i2
209c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
209d0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 46   else{.        F
209e0 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
209f0 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46 74 73   r1;.        Fts
20a00 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72  5PoslistReader r
20a10 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  2;.        Fts5P
20a20 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69  oslistWriter wri
20a30 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  ter;..        me
20a40 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
20a50 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29   sizeof(writer))
20a60 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65  ;..        /* Me
20a70 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69  rge the two posi
20a80 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a  tion lists. */ .
20a90 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
20aa0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
20ab0 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75 74 2c  >rc, bAsc, &out,
20ac0 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32   &iLastRowid, i2
20ad0 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
20ae0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
20af0 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  (&tmp);.        
20b00 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
20b10 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31 2c  stReaderInit(-1,
20b20 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31   i1.aPoslist, i1
20b30 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 31 29 3b  .nPoslist, &r1);
20b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20b50 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
20b60 72 49 6e 69 74 28 2d 31 2c 20 69 32 2e 61 50 6f  rInit(-1, i2.aPo
20b70 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69  slist, i2.nPosli
20b80 73 74 2c 20 26 72 32 29 3b 0a 20 20 20 20 20 20  st, &r2);.      
20b90 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
20ba0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 72 31  SQLITE_OK && (r1
20bb0 2e 62 45 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e 62  .bEof==0 || r2.b
20bc0 45 6f 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Eof==0) ){.     
20bd0 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a 20       i64 iNew;. 
20be0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 32 2e           if( r2.
20bf0 62 45 6f 66 20 7c 7c 20 28 72 31 2e 62 45 6f 66  bEof || (r1.bEof
20c00 3d 3d 30 20 26 26 20 72 31 2e 69 50 6f 73 3c 72  ==0 && r1.iPos<r
20c10 32 2e 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20  2.iPos) ){.     
20c20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 72 31         iNew = r1
20c30 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20  .iPos;.         
20c40 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
20c50 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
20c60 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &r1);.          
20c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20c80 20 20 20 69 4e 65 77 20 3d 20 72 32 2e 69 50 6f     iNew = r2.iPo
20c90 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  s;.            s
20ca0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
20cb0 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 32 29  tReaderNext(&r2)
20cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
20cd0 28 20 72 31 2e 69 50 6f 73 3d 3d 72 32 2e 69 50  ( r1.iPos==r2.iP
20ce0 6f 73 20 29 20 73 71 6c 69 74 65 33 46 74 73 35  os ) sqlite3Fts5
20cf0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
20d00 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&r1);.        
20d10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
20d20 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
20d30 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70  5PoslistWriterAp
20d40 70 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69 74  pend(&tmp, &writ
20d50 65 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20 20  er, iNew);.     
20d60 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74     }..        ft
20d70 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20d80 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75  rint(&p->rc, &ou
20d90 74 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20  t, tmp.n);.     
20da0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
20db0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
20dc0 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70  &out, tmp.n, tmp
20dd0 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .p);.        fts
20de0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
20df0 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66  (&i1);.        f
20e00 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
20e10 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d  xt(&i2);.      }
20e20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
20e30 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
20e40 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74  , p1, out.n, out
20e50 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .p);.    fts5Buf
20e60 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20  ferFree(&tmp);. 
20e70 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
20e80 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(&out);.  }.}..
20e90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
20ea0 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42  BufferSwap(Fts5B
20eb0 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42  uffer *p1, Fts5B
20ec0 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74  uffer *p2){.  Ft
20ed0 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a  s5Buffer tmp = *
20ee0 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b  p1;.  *p1 = *p2;
20ef0 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a  .  *p2 = tmp;.}.
20f00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
20f10 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72  5SetupPrefixIter
20f20 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
20f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20f40 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
20f50 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
20f60 6e 74 20 62 41 73 63 2c 20 20 20 20 20 20 20 20  nt bAsc,        
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f80 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45  * True for "ORDE
20f90 52 20 42 59 20 72 6f 77 69 64 20 41 53 43 22 20  R BY rowid ASC" 
20fa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
20fb0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
20fc0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
20fd0 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
20fe0 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69   to match */.  i
20ff0 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21010 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
21020 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73   pToken in bytes
21030 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
21040 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
21050 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
21060 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
21070 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
21080 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
21090 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66  Fts5Buffer *aBuf
210a0 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42  ;.  const int nB
210b0 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66  uf = 32;..  aBuf
210c0 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29   = (Fts5Buffer*)
210d0 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
210e0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
210f0 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74  er)*nBuf);.  pSt
21100 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
21110 74 75 72 65 52 65 61 64 28 70 2c 20 30 29 3b 0a  tureRead(p, 0);.
21120 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70  .  if( aBuf && p
21130 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 46 74  Struct ){.    Ft
21140 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
21150 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74  Doclist;.    int
21160 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   i;.    i64 iLas
21170 74 52 6f 77 69 64 3b 0a 20 20 20 20 46 74 73 35  tRowid;.    Fts5
21180 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 31  MultiSegIter *p1
21190 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65   = 0;     /* Ite
211a0 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61  rator used to ga
211b0 74 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69  ther data from i
211c0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35  ndex */.    Fts5
211d0 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a  Buffer doclist;.
211e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63  .    memset(&doc
211f0 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  list, 0, sizeof(
21200 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66  doclist));.    f
21210 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72  or(fts5MultiIter
21220 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
21230 30 2c 20 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  0, 1, pToken, nT
21240 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31  oken, -1, 0, &p1
21250 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
21260 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
21270 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66  1)==0;.        f
21280 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
21290 28 70 2c 20 70 31 2c 20 30 2c 20 30 29 0a 20 20  (p, p1, 0, 0).  
212a0 20 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69    ){.      i64 i
212b0 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74  Rowid = fts5Mult
212c0 69 49 74 65 72 52 6f 77 69 64 28 70 31 29 3b 0a  iIterRowid(p1);.
212d0 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
212e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
212f0 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c  *pTerm = fts5Mul
21300 74 69 49 74 65 72 54 65 72 6d 28 70 31 2c 20 26  tiIterTerm(p1, &
21310 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 61 73  nTerm);.      as
21320 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 70 54 6f  sert( memcmp(pTo
21330 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28  ken, pTerm, MIN(
21340 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c  nToken, nTerm))<
21350 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
21360 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20  nTerm<nToken || 
21370 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70  memcmp(pToken, p
21380 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20  Term, nToken) ) 
21390 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66  break;..      if
213a0 28 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 0a 20  ( doclist.n>0 . 
213b0 20 20 20 20 20 20 26 26 20 28 28 21 62 41 73 63        && ((!bAsc
213c0 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c 61 73   && iRowid>=iLas
213d0 74 52 6f 77 69 64 29 20 7c 7c 20 28 62 41 73 63  tRowid) || (bAsc
213e0 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73   && iRowid<=iLas
213f0 74 52 6f 77 69 64 29 29 0a 20 20 20 20 20 20 29  tRowid)).      )
21400 7b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  {..        for(i
21410 3d 30 3b 20 64 6f 63 6c 69 73 74 2e 6e 20 26 26  =0; doclist.n &&
21420 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
21430 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  K; i++){.       
21440 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75     assert( i<nBu
21450 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  f );.          i
21460 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20  f( aBuf[i].n==0 
21470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
21480 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64  ts5BufferSwap(&d
21490 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
214a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
214b0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64  ts5BufferZero(&d
214c0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oclist);.       
214d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
214e0 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50        fts5MergeP
214f0 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20 62 41  refixLists(p, bA
21500 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  sc, &doclist, &a
21510 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
21520 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
21530 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ero(&aBuf[i]);. 
21540 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21550 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21560 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e     if( doclist.n
21570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
21580 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
21590 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64  arint(&p->rc, &d
215a0 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69 64 29 3b  oclist, iRowid);
215b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
215c0 20 62 41 73 63 3d 3d 30 20 29 7b 0a 20 20 20 20   bAsc==0 ){.    
215d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
215e0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
215f0 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 4c 61  c, &doclist, iLa
21600 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77 69 64  stRowid - iRowid
21610 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21620 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
21630 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
21640 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c  p->rc, &doclist,
21650 20 69 52 6f 77 69 64 20 2d 20 69 4c 61 73 74 52   iRowid - iLastR
21660 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  owid);.      }. 
21670 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20       iLastRowid 
21680 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  = iRowid;.      
21690 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73  fts5MultiIterPos
216a0 6c 69 73 74 28 70 2c 20 70 31 2c 20 31 2c 20 26  list(p, p1, 1, &
216b0 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  doclist);.    }.
216c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
216d0 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nBuf; i++){.    
216e0 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69    fts5MergePrefi
216f0 78 4c 69 73 74 73 28 70 2c 20 62 41 73 63 2c 20  xLists(p, bAsc, 
21700 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
21710 69 5d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  i]);.      fts5B
21720 75 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b  ufferFree(&aBuf[
21730 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
21740 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
21750 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44  (p, p1);..    pD
21760 6f 63 6c 69 73 74 20 3d 20 28 46 74 73 35 44 6f  oclist = (Fts5Do
21770 63 6c 69 73 74 49 74 65 72 2a 29 66 74 73 35 49  clistIter*)fts5I
21780 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
21790 6f 66 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74  of(Fts5DoclistIt
217a0 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  er));.    if( !p
217b0 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
217c0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
217d0 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d  &doclist);.    }
217e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
217f0 72 2d 3e 70 44 6f 63 6c 69 73 74 20 3d 20 70 44  r->pDoclist = pD
21800 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 66 74  oclist;.      ft
21810 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
21820 74 28 26 64 6f 63 6c 69 73 74 2c 20 62 41 73 63  t(&doclist, bAsc
21830 2c 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  , pIter->pDoclis
21840 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
21850 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
21860 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
21870 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
21880 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Buf);.}../*.** O
21890 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74  pen a new iterat
218a0 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
218b0 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69 64 73 20  ough all docids 
218c0 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a  that match the .
218d0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b  ** specified tok
218e0 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
218f0 69 78 2e 0a 2a 2f 0a 46 74 73 35 49 6e 64 65 78  ix..*/.Fts5Index
21900 49 74 65 72 20 2a 73 71 6c 69 74 65 33 46 74 73  Iter *sqlite3Fts
21910 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46  5IndexQuery(.  F
21920 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21940 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71  * FTS index to q
21950 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  uery */.  const 
21960 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
21970 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b  t nToken, /* Tok
21980 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74  en (or prefix) t
21990 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
219a0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
219d0 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c  INDEX_QUERY_X fl
219e0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ags */.){.  Fts5
219f0 49 6e 64 65 78 49 74 65 72 20 2a 70 52 65 74 3b  IndexIter *pRet;
21a00 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
21a10 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
21a20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
21a30 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 46 74  PREFIX ){.    Ft
21a40 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
21a50 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
21a60 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20      for(iIdx=1; 
21a70 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
21a80 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
21a90 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66  .      if( pConf
21aa0 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78  ig->aPrefix[iIdx
21ab0 2d 31 5d 3d 3d 6e 54 6f 6b 65 6e 20 29 20 62 72  -1]==nToken ) br
21ac0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
21ad0 66 28 20 69 49 64 78 3e 70 43 6f 6e 66 69 67 2d  f( iIdx>pConfig-
21ae0 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20  >nPrefix ){.    
21af0 20 20 69 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20    iIdx = -1;.   
21b00 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d   }.  }..  pRet =
21b10 20 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a   (Fts5IndexIter*
21b20 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
21b30 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
21b40 49 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70 52  Iter));.  if( pR
21b50 65 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  et ){.    memset
21b60 28 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (pRet, 0, sizeof
21b70 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 29 29  (Fts5IndexIter))
21b80 3b 0a 0a 20 20 20 20 70 52 65 74 2d 3e 70 49 6e  ;..    pRet->pIn
21b90 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 69 66 28  dex = p;.    if(
21ba0 20 69 49 64 78 3e 3d 30 20 29 7b 0a 20 20 20 20   iIdx>=0 ){.    
21bb0 20 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74 20    pRet->pStruct 
21bc0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
21bd0 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20  ead(p, iIdx);.  
21be0 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 53      if( pRet->pS
21bf0 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20  truct ){.       
21c00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
21c10 77 28 70 2c 20 70 52 65 74 2d 3e 70 53 74 72 75  w(p, pRet->pStru
21c20 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ct, .           
21c30 20 69 49 64 78 2c 20 66 6c 61 67 73 2c 20 28 63   iIdx, flags, (c
21c40 6f 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c  onst u8*)pToken,
21c50 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20   nToken, -1, 0, 
21c60 26 70 52 65 74 2d 3e 70 4d 75 6c 74 69 0a 20 20  &pRet->pMulti.  
21c70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
21c80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21c90 20 20 69 6e 74 20 62 41 73 63 20 3d 20 28 66 6c    int bAsc = (fl
21ca0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
21cb0 51 55 45 52 59 5f 41 53 43 29 21 3d 30 3b 0a 20  QUERY_ASC)!=0;. 
21cc0 20 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72       fts5SetupPr
21cd0 65 66 69 78 49 74 65 72 28 70 2c 20 62 41 73 63  efixIter(p, bAsc
21ce0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 54 6f  , (const u8*)pTo
21cf0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 52 65  ken, nToken, pRe
21d00 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
21d10 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
21d20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
21d30 72 43 6c 6f 73 65 28 70 52 65 74 29 3b 0a 20 20  rClose(pRet);.  
21d40 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
21d50 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
21d60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21d70 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61  rue if the itera
21d80 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
21d90 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
21da0 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 69 6e  is at EOF..*/.in
21db0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
21dc0 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74  rEof(Fts5IndexIt
21dd0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
21de0 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  ( pIter->pDoclis
21df0 74 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  t ){ .    return
21e00 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
21e10 2d 3e 61 50 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a  ->aPoslist==0; .
21e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
21e30 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65  urn fts5MultiIte
21e40 72 45 6f 66 28 70 49 74 65 72 2d 3e 70 49 6e 64  rEof(pIter->pInd
21e50 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74  ex, pIter->pMult
21e60 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  i);.  }.}../*.**
21e70 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
21e80 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
21e90 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
21ea0 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 46  e3Fts5IterNext(F
21eb0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
21ec0 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
21ed0 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20  r->pDoclist ){. 
21ee0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
21ef0 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 44  erNext(pIter->pD
21f00 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 65 6c 73 65  oclist);.  }else
21f10 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
21f20 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
21f30 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 4d  list);.    fts5M
21f40 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49 74  ultiIterNext(pIt
21f50 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
21f60 72 2d 3e 70 4d 75 6c 74 69 2c 20 30 2c 20 30 29  r->pMulti, 0, 0)
21f70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
21f80 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
21f90 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74  matching rowid t
21fa0 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72  hat occurs at or
21fb0 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54   after iMatch. T
21fc0 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e  he.** definition
21fd0 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72   of "at or after
21fe0 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  " depends on whe
21ff0 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74  ther this iterat
22000 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69  or iterates.** i
22010 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
22020 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
22030 6f 72 64 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  order..*/.void s
22040 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
22050 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78  xtFrom(Fts5Index
22060 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 36 34  Iter *pIter, i64
22070 20 69 4d 61 74 63 68 29 7b 0a 20 20 69 66 28 20   iMatch){.  if( 
22080 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
22090 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  ){.    assert( 0
220a0 20 29 3b 0a 20 20 20 20 2f 2a 20 66 74 73 35 44   );.    /* fts5D
220b0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72  oclistIterNextFr
220c0 6f 6d 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  om(pIter->pDocli
220d0 73 74 2c 20 69 4d 61 74 63 68 29 3b 20 2a 2f 0a  st, iMatch); */.
220e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
220f0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72  5MultiIterNextFr
22100 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  om(pIter->pIndex
22110 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c  , pIter->pMulti,
22120 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d 0a 7d 0a   iMatch);.  }.}.
22130 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22140 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e  e current rowid.
22150 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 46  .*/.i64 sqlite3F
22160 74 73 35 49 74 65 72 52 6f 77 69 64 28 46 74 73  ts5IterRowid(Fts
22170 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
22180 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  r){.  if( pIter-
22190 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
221a0 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70   return pIter->p
221b0 44 6f 63 6c 69 73 74 2d 3e 69 52 6f 77 69 64 3b  Doclist->iRowid;
221c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
221d0 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74  turn fts5MultiIt
221e0 65 72 52 6f 77 69 64 28 70 49 74 65 72 2d 3e 70  erRowid(pIter->p
221f0 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  Multi);.  }.}...
22200 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
22210 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
22220 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
22230 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69  copy of the posi
22240 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a  tion list for.**
22250 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
22260 72 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61  ry. Output varia
22270 62 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74  ble *pn is set t
22280 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
22290 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20  e buffer .** in 
222a0 62 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74  bytes before ret
222b0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
222c0 65 20 72 65 74 75 72 6e 65 64 20 62 75 66 66 65  e returned buffe
222d0 72 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  r does not inclu
222e0 64 65 20 74 68 65 20 30 78 30 30 20 74 65 72 6d  de the 0x00 term
222f0 69 6e 61 74 6f 72 20 62 79 74 65 20 73 74 6f 72  inator byte stor
22300 65 64 20 6f 6e 0a 2a 2a 20 64 69 73 6b 2e 0a 2a  ed on.** disk..*
22310 2f 0a 63 6f 6e 73 74 20 75 38 20 2a 73 71 6c 69  /.const u8 *sqli
22320 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
22330 73 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  st(Fts5IndexIter
22340 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e   *pIter, int *pn
22350 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ){.  if( pIter->
22360 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  pDoclist ){.    
22370 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 44 6f  *pn = pIter->pDo
22380 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69 73 74 3b  clist->nPoslist;
22390 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65  .    return pIte
223a0 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f  r->pDoclist->aPo
223b0 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  slist;.  }else{.
223c0 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70      Fts5Index *p
223d0 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
223e0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
223f0 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
22400 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 4d  list);.    fts5M
22410 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
22420 70 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  p, pIter->pMulti
22430 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  , 0, &pIter->pos
22440 6c 69 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72  list);.    asser
22450 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
22460 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  _OK );.    if( p
22470 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ->rc ) return 0;
22480 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72  .    *pn = pIter
22490 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20  ->poslist.n;.   
224a0 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70   return pIter->p
224b0 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a  oslist.p;.  }.}.
224c0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
224d0 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20  iterator opened 
224e0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
224f0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ll to sqlite3Fts
22500 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a  5IndexQuery()..*
22510 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
22520 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35  s5IterClose(Fts5
22530 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
22540 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
22550 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
22560 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
22570 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22580 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d  pIter->pDoclist-
22590 3e 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >a);.      sqlit
225a0 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 70  e3_free(pIter->p
225b0 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65  Doclist);.    }e
225c0 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  lse{.      fts5M
225d0 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
225e0 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
225f0 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20  r->pMulti);.    
22600 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
22610 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53  elease(pIter->pS
22620 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74  truct);.      ft
22630 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
22640 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
22650 20 20 20 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f     }.    fts5Clo
22660 73 65 52 65 61 64 65 72 28 70 49 74 65 72 2d 3e  seReader(pIter->
22670 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  pIndex);.    sql
22680 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
22690 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
226a0 65 61 64 20 74 68 65 20 22 61 76 65 72 61 67 65  ead the "average
226b0 73 22 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  s" record into t
226c0 68 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69  he buffer suppli
226d0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
226e0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52   .** argument. R
226f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22700 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
22710 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
22720 72 20 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20  r code.** if an 
22730 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
22740 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22750 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73  IndexGetAverages
22760 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
22770 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29  ts5Buffer *pBuf)
22780 7b 0a 20 20 66 74 73 35 44 61 74 61 52 65 61 64  {.  fts5DataRead
22790 4f 72 42 75 66 66 65 72 28 70 2c 20 70 42 75 66  OrBuffer(p, pBuf
227a0 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
227b0 52 4f 57 49 44 29 3b 0a 20 20 72 65 74 75 72 6e  ROWID);.  return
227c0 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
227d0 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75 72   Replace the cur
227e0 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22 20  rent "averages" 
227f0 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65 20  record with the 
22800 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22810 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c  buffer .** suppl
22820 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ied as the secon
22830 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  d argument..*/.i
22840 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
22850 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28 46  dexSetAverages(F
22860 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e  ts5Index *p, con
22870 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
22880 74 20 6e 44 61 74 61 29 7b 0a 20 20 66 74 73 35  t nData){.  fts5
22890 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
228a0 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
228b0 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
228c0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
228d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
228e0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
228f0 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73  r of blocks this
22900 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64   module has read
22910 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
22920 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20  .** table since 
22930 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  it was created..
22940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22950 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73  s5IndexReads(Fts
22960 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65  5Index *p){.  re
22970 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d  turn p->nRead;.}
22980 0a 0a                                            ..