/ Hex Artifact Content
Login

Artifact 1e001ed7dd4650a0a853b986f34b71c8d3f71ec1:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 23 69 6e  s5Int.h..*/..#in
0280: 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68  clude "fts5Int.h
0290: 22 0a 23 69 6e 63 6c 75 64 65 20 22 66 74 73 33  ".#include "fts3
02a0: 5f 68 61 73 68 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  _hash.h"../*.** 
02b0: 4f 76 65 72 76 69 65 77 3a 0a 2a 2a 0a 2a 2a 20  Overview:.**.** 
02c0: 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  The %_data table
02d0: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 74 68   contains all th
02e0: 65 20 46 54 53 20 69 6e 64 65 78 65 73 20 66 6f  e FTS indexes fo
02f0: 72 20 61 6e 20 46 54 53 35 20 76 69 72 74 75 61  r an FTS5 virtua
0300: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 77  l table..** As w
0310: 65 6c 6c 20 61 73 20 74 68 65 20 6d 61 69 6e 20  ell as the main 
0320: 74 65 72 6d 20 69 6e 64 65 78 2c 20 74 68 65 72  term index, ther
0330: 65 20 6d 61 79 20 62 65 20 75 70 20 74 6f 20 33  e may be up to 3
0340: 31 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  1 prefix indexes
0350: 2e 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  ..** The format 
0360: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 46 54  is similar to FT
0370: 53 33 2f 34 2c 20 65 78 63 65 70 74 20 74 68 61  S3/4, except tha
0380: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 61 6c 6c  t:.**.**   * all
0390: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
03a0: 6c 65 61 66 20 64 61 74 61 20 69 73 20 73 74 6f  leaf data is sto
03b0: 72 65 64 20 69 6e 20 66 69 78 65 64 20 73 69 7a  red in fixed siz
03c0: 65 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 0a  e page records .
03d0: 2a 2a 20 20 20 20 20 28 65 2e 67 2e 20 31 30 30  **     (e.g. 100
03e0: 30 20 62 79 74 65 73 29 2e 20 41 20 73 69 6e 67  0 bytes). A sing
03f0: 6c 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 73  le doclist may s
0400: 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20 70 61 67  pan multiple pag
0410: 65 73 2e 20 43 61 72 65 20 69 73 20 0a 2a 2a 20  es. Care is .** 
0420: 20 20 20 20 74 61 6b 65 6e 20 74 6f 20 65 6e 73      taken to ens
0430: 75 72 65 20 69 74 20 69 73 20 70 6f 73 73 69 62  ure it is possib
0440: 6c 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e  le to iterate in
0450: 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69 6f   either directio
0460: 6e 20 74 68 72 6f 75 67 68 20 0a 2a 2a 20 20 20  n through .**   
0470: 20 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e    the entries in
0480: 20 61 20 64 6f 63 6c 69 73 74 2c 20 6f 72 20 74   a doclist, or t
0490: 6f 20 73 65 65 6b 20 74 6f 20 61 20 73 70 65 63  o seek to a spec
04a0: 69 66 69 63 20 65 6e 74 72 79 20 77 69 74 68 69  ific entry withi
04b0: 6e 20 61 20 0a 2a 2a 20 20 20 20 20 64 6f 63 6c  n a .**     docl
04c0: 69 73 74 2c 20 77 69 74 68 6f 75 74 20 6c 6f 61  ist, without loa
04d0: 64 69 6e 67 20 69 74 20 69 6e 74 6f 20 6d 65 6d  ding it into mem
04e0: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 6c  ory..**.**   * l
04f0: 61 72 67 65 20 64 6f 63 6c 69 73 74 73 20 74 68  arge doclists th
0500: 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 70 61 67  at span many pag
0510: 65 73 20 68 61 76 65 20 61 73 73 6f 63 69 61 74  es have associat
0520: 65 64 20 22 64 6f 63 6c 69 73 74 20 69 6e 64 65  ed "doclist inde
0530: 78 22 0a 2a 2a 20 20 20 20 20 72 65 63 6f 72 64  x".**     record
0540: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61  s that contain a
0550: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72   copy of the fir
0560: 73 74 20 64 6f 63 69 64 20 6f 6e 20 65 61 63 68  st docid on each
0570: 20 70 61 67 65 20 73 70 61 6e 6e 65 64 20 62 79   page spanned by
0580: 0a 2a 2a 20 20 20 20 20 74 68 65 20 64 6f 63 6c  .**     the docl
0590: 69 73 74 2e 20 54 68 69 73 20 69 73 20 75 73 65  ist. This is use
05a0: 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 73 65  d to speed up se
05b0: 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 61  ek operations, a
05c0: 6e 64 20 6d 65 72 67 65 73 20 6f 66 0a 2a 2a 20  nd merges of.** 
05d0: 20 20 20 20 6c 61 72 67 65 20 64 6f 63 6c 69 73      large doclis
05e0: 74 73 20 77 69 74 68 20 76 65 72 79 20 73 6d 61  ts with very sma
05f0: 6c 6c 20 64 6f 63 6c 69 73 74 73 2e 0a 2a 2a 0a  ll doclists..**.
0600: 2a 2a 20 20 20 2a 20 65 78 74 72 61 20 66 69 65  **   * extra fie
0610: 6c 64 73 20 69 6e 20 74 68 65 20 22 73 74 72 75  lds in the "stru
0620: 63 74 75 72 65 20 72 65 63 6f 72 64 22 20 72 65  cture record" re
0630: 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
0640: 66 20 6f 6e 67 6f 69 6e 67 0a 2a 2a 20 20 20 20  f ongoing.**    
0650: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
0660: 67 65 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ge operations..*
0670: 2a 0a 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54  *.*/..#define FT
0680: 53 35 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  S5_DEFAULT_PAGE_
0690: 53 49 5a 45 20 20 20 31 30 30 30 0a 0a 23 64 65  SIZE   1000..#de
06a0: 66 69 6e 65 20 46 54 53 35 5f 57 4f 52 4b 5f 55  fine FTS5_WORK_U
06b0: 4e 49 54 20 20 20 20 20 20 36 34 20 20 20 20 2f  NIT      64    /
06c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
06d0: 20 70 61 67 65 73 20 69 6e 20 75 6e 69 74 20 6f   pages in unit o
06e0: 66 20 77 6f 72 6b 20 2a 2f 0a 23 64 65 66 69 6e  f work */.#defin
06f0: 65 20 46 54 53 35 5f 4d 49 4e 5f 4d 45 52 47 45  e FTS5_MIN_MERGE
0700: 20 20 20 20 20 20 20 34 20 20 20 20 2f 2a 20 4d         4    /* M
0710: 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
0720: 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
0730: 67 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46  ge */..#define F
0740: 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
0750: 5a 45 20 20 34 20 20 20 20 2f 2a 20 41 64 64 20  ZE  4    /* Add 
0760: 64 6c 69 64 78 20 69 66 20 74 68 69 73 20 6d 61  dlidx if this ma
0770: 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73 20 2a  ny empty pages *
0780: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73  /../*.** Details
0790: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  :.**.** The %_da
07a0: 74 61 20 74 61 62 6c 65 20 6d 61 6e 61 67 65 64  ta table managed
07b0: 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c   by this module,
07c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  .**.**     CREAT
07d0: 45 20 54 41 42 4c 45 20 25 5f 64 61 74 61 28 69  E TABLE %_data(i
07e0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
07f0: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f  Y KEY, block BLO
0800: 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74  B);.**.** , cont
0810: 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ains the followi
0820: 6e 67 20 35 20 74 79 70 65 73 20 6f 66 20 72 65  ng 5 types of re
0830: 63 6f 72 64 73 2e 20 53 65 65 20 74 68 65 20 63  cords. See the c
0840: 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64  omments surround
0850: 69 6e 67 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f  ing.** the FTS5_
0860: 2a 5f 52 4f 57 49 44 20 6d 61 63 72 6f 73 20 62  *_ROWID macros b
0870: 65 6c 6f 77 20 66 6f 72 20 61 20 64 65 73 63 72  elow for a descr
0880: 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f  iption of how %_
0890: 64 61 74 61 20 72 6f 77 69 64 73 20 61 72 65 20  data rowids are 
08a0: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 74 6f 20  .** assigned to 
08b0: 65 61 63 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a  each fo them..**
08c0: 0a 2a 2a 20 31 2e 20 53 74 72 75 63 74 75 72 65  .** 1. Structure
08d0: 20 52 65 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20   Records:.**.** 
08e0: 20 20 54 68 65 20 73 65 74 20 6f 66 20 73 65 67    The set of seg
08f0: 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 6b 65 20  ments that make 
0900: 75 70 20 61 6e 20 69 6e 64 65 78 20 2d 20 74 68  up an index - th
0910: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
0920: 65 20 2d 20 61 72 65 0a 2a 2a 20 20 20 72 65 63  e - are.**   rec
0930: 6f 72 64 65 64 20 69 6e 20 61 20 73 69 6e 67 6c  orded in a singl
0940: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0950: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0960: 2e 20 54 68 65 20 72 65 63 6f 72 64 20 69 73 20  . The record is 
0970: 61 20 6c 69 73 74 0a 2a 2a 20 20 20 6f 66 20 53  a list.**   of S
0980: 51 4c 69 74 65 20 76 61 72 69 6e 74 73 2e 20 0a  QLite varints. .
0990: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 65 61 63 68  **.**   For each
09a0: 20 6c 65 76 65 6c 20 66 72 6f 6d 20 30 20 74 6f   level from 0 to
09b0: 20 6e 4d 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   nMax:.**.**    
09c0: 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70   + number of inp
09d0: 75 74 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f  ut segments in o
09e0: 6e 67 6f 69 6e 67 20 6d 65 72 67 65 2e 0a 2a 2a  ngoing merge..**
09f0: 20 20 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d       + total num
0a00: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
0a10: 69 6e 20 6c 65 76 65 6c 2e 0a 2a 2a 20 20 20 20  in level..**    
0a20: 20 2b 20 66 6f 72 20 65 61 63 68 20 73 65 67 6d   + for each segm
0a30: 65 6e 74 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20  ent from oldest 
0a40: 74 6f 20 6e 65 77 65 73 74 3a 0a 2a 2a 20 20 20  to newest:.**   
0a50: 20 20 20 20 20 20 2b 20 73 65 67 6d 65 6e 74 20        + segment 
0a60: 69 64 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a  id (always > 0).
0a70: 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 62 2d 74  **         + b-t
0a80: 72 65 65 20 68 65 69 67 68 74 20 28 31 20 2d 3e  ree height (1 ->
0a90: 20 72 6f 6f 74 20 69 73 20 6c 65 61 66 2c 20 32   root is leaf, 2
0aa0: 20 2d 3e 20 72 6f 6f 74 20 69 73 20 70 61 72 65   -> root is pare
0ab0: 6e 74 20 6f 66 20 6c 65 61 66 20 65 74 63 2e 29  nt of leaf etc.)
0ac0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69  .**         + fi
0ad0: 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  rst leaf page nu
0ae0: 6d 62 65 72 20 28 6f 66 74 65 6e 20 31 29 0a 2a  mber (often 1).*
0af0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0b00: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0b10: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0b20: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0b30: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0b40: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0b50: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0b60: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0b70: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0b80: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0b90: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0ba0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0bb0: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0bc0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0bd0: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0be0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0bf0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0c00: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0c10: 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a 2a 20 20 20  n for all .**   
0c20: 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c  rows of the tabl
0c30: 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d  e..**.** 3. Segm
0c40: 65 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a  ent leaves:.**.*
0c50: 2a 20 20 20 54 45 52 4d 20 44 4f 43 4c 49 53 54  *   TERM DOCLIST
0c60: 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20   FORMAT:.**.**  
0c70: 20 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20     Most of each 
0c80: 73 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20  segment leaf is 
0c90: 74 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d  taken up by term
0ca0: 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54  /doclist data. T
0cb0: 68 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72  he .**     gener
0cc0: 61 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65  al format of the
0cd0: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61   term/doclist da
0ce0: 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ta is:.**.**    
0cf0: 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69       varint : si
0d00: 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  ze of first term
0d10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 6c 6f 62  .**         blob
0d20: 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20  :    first term 
0d30: 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  data.**         
0d40: 64 6f 63 6c 69 73 74 3a 20 66 69 72 73 74 20 64  doclist: first d
0d50: 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20  oclist.**       
0d60: 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b    zero-or-more {
0d70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0d80: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0d90: 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e   bytes in common
0da0: 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 74   with previous t
0db0: 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  erm.**          
0dc0: 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72   varint:  number
0dd0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
0de0: 20 74 65 72 6d 20 64 61 74 61 20 28 6e 4e 65 77   term data (nNew
0df0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 62  ).**           b
0e00: 6c 6f 62 3a 20 20 20 20 6e 4e 65 77 20 62 79 74  lob:    nNew byt
0e10: 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20 64  es of new term d
0e20: 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ata.**          
0e30: 20 64 6f 63 6c 69 73 74 3a 20 6e 65 78 74 20 64   doclist: next d
0e40: 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20  oclist.**       
0e50: 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f    }.**.**     do
0e60: 63 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a  clist format:.**
0e70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69  .**         vari
0e80: 6e 74 3a 20 20 66 69 72 73 74 20 72 6f 77 69 64  nt:  first rowid
0e90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6f 73 6c  .**         posl
0ea0: 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c 69  ist: first posli
0eb0: 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65  st.**         ze
0ec0: 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20  ro-or-more {.** 
0ed0: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
0ee0: 3a 20 20 72 6f 77 69 64 20 64 65 6c 74 61 20 28  :  rowid delta (
0ef0: 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20  always > 0).**  
0f00: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
0f10: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
0f20: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
0f30: 20 20 20 20 20 20 20 20 30 78 30 30 20 62 79 74          0x00 byt
0f40: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 6f 73 6c  e.**.**     posl
0f50: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
0f60: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
0f70: 3a 20 73 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73  : size of poslis
0f80: 74 20 69 6e 20 62 79 74 65 73 2e 20 6e 6f 74 20  t in bytes. not 
0f90: 69 6e 63 6c 75 64 69 6e 67 20 74 68 69 73 20 66  including this f
0fa0: 69 65 6c 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ield..**        
0fb0: 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73   collist: collis
0fc0: 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 30 0a 2a  t for column 0.*
0fd0: 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f  *         zero-o
0fe0: 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20  r-more {.**     
0ff0: 20 20 20 20 20 20 30 78 30 31 20 62 79 74 65 0a        0x01 byte.
1000: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61 72  **           var
1010: 69 6e 74 3a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  int: column numb
1020: 65 72 20 28 49 29 0a 2a 2a 20 20 20 20 20 20 20  er (I).**       
1030: 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c      collist: col
1040: 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
1050: 49 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  I.**         }.*
1060: 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c 69 73 74  *.**     collist
1070: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
1080: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 66         varint: f
1090: 69 72 73 74 20 6f 66 66 73 65 74 20 2b 20 32 0a  irst offset + 2.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 6f         varint: o
10d0: 66 66 73 65 74 20 64 65 6c 74 61 20 2b 20 32 0a  ffset delta + 2.
10e0: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  **         }.**.
10f0: 2a 2a 20 20 20 50 41 47 49 4e 41 54 49 4f 4e 0a  **   PAGINATION.
1100: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 6f  **.**     The fo
1110: 72 6d 61 74 20 64 65 73 63 72 69 62 65 64 20 61  rmat described a
1120: 62 6f 76 65 20 69 73 20 6f 6e 6c 79 20 61 63 63  bove is only acc
1130: 75 72 61 74 65 20 69 66 20 74 68 65 20 65 6e 74  urate if the ent
1140: 69 72 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74  ire term/doclist
1150: 0a 2a 2a 20 20 20 20 20 64 61 74 61 20 66 69 74  .**     data fit
1160: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65  s on a single le
1170: 61 66 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  af page. If this
1180: 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
1190: 2c 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  , the format.** 
11a0: 20 20 20 20 69 73 20 63 68 61 6e 67 65 64 20 69      is changed i
11b0: 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a  n two ways:.**.*
11c0: 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74 68 65  *       + if the
11d0: 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
11e0: 61 20 70 61 67 65 20 6f 63 63 75 72 73 20 62 65  a page occurs be
11f0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 74  fore the first t
1200: 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20 20 20  erm, it.**      
1210: 20 20 20 69 73 20 73 74 6f 72 65 64 20 61 73 20     is stored as 
1220: 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 3a  a literal value:
1230: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1240: 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69 72 73     varint:  firs
1250: 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 20 20  t rowid.**.**   
1260: 20 20 20 20 2b 20 74 68 65 20 66 69 72 73 74 20      + the first 
1270: 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  term on each pag
1280: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
1290: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 74  he same way as t
12a0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 65  he.**         ve
12b0: 72 79 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  ry first term of
12c0: 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a 2a 2a   the segment:.**
12d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12e0: 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20 6f 66  varint : size of
12f0: 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a 20 20   first term.**  
1300: 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a             blob:
1310: 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 64      first term d
1320: 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20 20 45 61  ata.**.**     Ea
1330: 63 68 20 6c 65 61 66 20 70 61 67 65 20 62 65 67  ch leaf page beg
1340: 69 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20  ins with:.**.** 
1350: 20 20 20 20 20 20 2b 20 32 2d 62 79 74 65 20 75        + 2-byte u
1360: 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61 69 6e 69  nsigned containi
1370: 6e 67 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  ng offset to fir
1380: 73 74 20 72 6f 77 69 64 20 28 6f 72 20 30 29 2e  st rowid (or 0).
1390: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79  .**       + 2-by
13a0: 74 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74  te unsigned cont
13b0: 61 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f  aining offset to
13c0: 20 66 69 72 73 74 20 74 65 72 6d 20 28 6f 72 20   first term (or 
13d0: 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 6c 6c  0)..**.**   Foll
13e0: 6f 77 65 64 20 62 79 20 74 65 72 6d 2f 64 6f 63  owed by term/doc
13f0: 6c 69 73 74 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  list data..**.**
1400: 20 34 2e 20 53 65 67 6d 65 6e 74 20 69 6e 74 65   4. Segment inte
1410: 72 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a 2a 0a 2a  rior nodes:.**.*
1420: 2a 20 20 20 54 68 65 20 69 6e 74 65 72 69 6f 72  *   The interior
1430: 20 6e 6f 64 65 73 20 74 75 72 6e 20 74 68 65 20   nodes turn the 
1440: 6c 69 73 74 20 6f 66 20 6c 65 61 76 65 73 20 69  list of leaves i
1450: 6e 74 6f 20 61 20 62 2b 74 72 65 65 2e 20 0a 2a  nto a b+tree. .*
1460: 2a 0a 2a 2a 20 20 20 45 61 63 68 20 69 6e 74 65  *.**   Each inte
1470: 72 69 6f 72 20 6e 6f 64 65 20 62 65 67 69 6e 73  rior node begins
1480: 20 77 69 74 68 20 61 20 76 61 72 69 6e 74 20 2d   with a varint -
1490: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
14a0: 20 6f 66 20 74 68 65 20 6c 65 66 74 0a 2a 2a 20   of the left.** 
14b0: 20 20 6d 6f 73 74 20 63 68 69 6c 64 20 6e 6f 64    most child nod
14c0: 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  e. Following thi
14d0: 73 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66  s, for each leaf
14e0: 20 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65   page except the
14f0: 20 66 69 72 73 74 2c 0a 2a 2a 20 20 20 74 68 65   first,.**   the
1500: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20   interior nodes 
1510: 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20  contain:.**.**  
1520: 20 20 20 61 29 20 49 66 20 74 68 65 20 6c 65 61     a) If the lea
1530: 66 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  f page contains 
1540: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72  at least one ter
1550: 6d 2c 20 74 68 65 6e 20 61 20 74 65 72 6d 2d 70  m, then a term-p
1560: 72 65 66 69 78 20 74 68 61 74 0a 2a 2a 20 20 20  refix that.**   
1570: 20 20 20 20 20 69 73 20 67 72 65 61 74 65 72 20       is greater 
1580: 74 68 61 6e 20 61 6c 6c 20 70 72 65 76 69 6f 75  than all previou
1590: 73 20 74 65 72 6d 73 2c 20 61 6e 64 20 6c 65 73  s terms, and les
15a0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
15b0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
15c0: 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
15d0: 68 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a  he leaf page..**
15e0: 0a 2a 2a 20 20 20 20 20 62 29 20 49 66 20 74 68  .**     b) If th
15f0: 65 20 6c 65 61 66 20 70 61 67 65 20 6e 6f 20 74  e leaf page no t
1600: 65 72 6d 73 2c 20 61 20 72 65 63 6f 72 64 20 69  erms, a record i
1610: 6e 64 69 63 61 74 69 6e 67 20 68 6f 77 20 6d 61  ndicating how ma
1620: 6e 79 20 63 6f 6e 73 65 63 75 74 69 76 65 0a 2a  ny consecutive.*
1630: 2a 20 20 20 20 20 20 20 20 6c 65 61 76 65 73 20  *        leaves 
1640: 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
1650: 2c 20 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72  , and whether or
1660: 20 6e 6f 74 20 74 68 65 72 65 20 69 73 20 61 6e   not there is an
1670: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 20   associated.**  
1680: 20 20 20 20 20 20 62 79 2d 72 6f 77 69 64 20 69        by-rowid i
1690: 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ndex record..**.
16a0: 2a 2a 20 20 20 42 79 20 64 65 66 69 6e 69 74 69  **   By definiti
16b0: 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 65 76  on, there is nev
16c0: 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  er more than one
16d0: 20 74 79 70 65 20 28 62 29 20 72 65 63 6f 72 64   type (b) record
16e0: 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a 20 20 20   in a row..**   
16f0: 54 79 70 65 20 28 62 29 20 72 65 63 6f 72 64 73  Type (b) records
1700: 20 6f 6e 6c 79 20 65 76 65 72 20 61 70 70 65 61   only ever appea
1710: 72 20 6f 6e 20 68 65 69 67 68 74 3d 31 20 70 61  r on height=1 pa
1720: 67 65 73 20 2d 20 69 6d 6d 65 64 69 61 74 65 20  ges - immediate 
1730: 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20  parents.**   of 
1740: 6c 65 61 76 65 73 2e 20 4f 6e 6c 79 20 74 79 70  leaves. Only typ
1750: 65 20 28 61 29 20 72 65 63 6f 72 64 73 20 61 72  e (a) records ar
1760: 65 20 70 75 73 68 65 64 20 74 6f 20 68 69 67 68  e pushed to high
1770: 65 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a 0a 2a 2a  er levels..**.**
1780: 20 20 20 54 65 72 6d 20 66 6f 72 6d 61 74 3a 0a     Term format:.
1790: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62  **.**     * Numb
17a0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  er of bytes in c
17b0: 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69  ommon with previ
17c0: 6f 75 73 20 74 65 72 6d 20 70 6c 75 73 20 32 2c  ous term plus 2,
17d0: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
17e0: 20 20 20 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66       * Number of
17f0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
1800: 72 6d 20 64 61 74 61 2c 20 61 73 20 61 20 76 61  rm data, as a va
1810: 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 6e  rint..**     * n
1820: 65 77 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a  ew term data..**
1830: 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d 20 66 6f  .**   No-term fo
1840: 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rmat:.**.**     
1850: 2a 20 65 69 74 68 65 72 20 61 6e 20 30 78 30 30  * either an 0x00
1860: 20 6f 72 20 30 78 30 31 20 62 79 74 65 2e 20 49   or 0x01 byte. I
1870: 66 20 74 68 65 20 76 61 6c 75 65 20 30 78 30 31  f the value 0x01
1880: 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 74   is used, then t
1890: 68 65 72 65 20 0a 2a 2a 20 20 20 20 20 20 20 69  here .**       i
18a0: 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  s an associated 
18b0: 69 6e 64 65 78 2d 62 79 2d 72 6f 77 69 64 20 72  index-by-rowid r
18c0: 65 63 6f 72 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  ecord..**     * 
18d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65  the number of ze
18e0: 72 6f 2d 74 65 72 6d 20 6c 65 61 76 65 73 20 61  ro-term leaves a
18f0: 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
1900: 2a 20 35 2e 20 53 65 67 6d 65 6e 74 20 64 6f 63  * 5. Segment doc
1910: 6c 69 73 74 20 69 6e 64 65 78 65 73 3a 0a 2a 2a  list indexes:.**
1920: 0a 2a 2a 20 20 20 41 20 6c 69 73 74 20 6f 66 20  .**   A list of 
1930: 76 61 72 69 6e 74 73 20 2d 20 74 68 65 20 66 69  varints - the fi
1940: 72 73 74 20 64 6f 63 69 64 20 6f 6e 20 65 61 63  rst docid on eac
1950: 68 20 70 61 67 65 20 28 73 74 61 72 74 69 6e 67  h page (starting
1960: 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 20 20 66   with the.**   f
1970: 69 72 73 74 20 74 65 72 6d 6c 65 73 73 20 70 61  irst termless pa
1980: 67 65 29 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  ge) of the docli
1990: 73 74 2e 20 46 69 72 73 74 20 65 6c 65 6d 65 6e  st. First elemen
19a0: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73  t in the list is
19b0: 20 61 0a 2a 2a 20 20 20 6c 69 74 65 72 61 6c 20   a.**   literal 
19c0: 64 6f 63 69 64 2e 20 45 61 63 68 20 64 6f 63 69  docid. Each doci
19d0: 64 20 74 68 65 72 65 61 66 74 65 72 20 69 73 20  d thereafter is 
19e0: 61 20 28 6e 65 67 61 74 69 76 65 29 20 64 65 6c  a (negative) del
19f0: 74 61 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ta. If there.** 
1a00: 20 20 61 72 65 20 6e 6f 20 64 6f 63 69 64 73 20    are no docids 
1a10: 61 74 20 61 6c 6c 20 6f 6e 20 61 20 70 61 67 65  at all on a page
1a20: 2c 20 61 20 30 78 30 30 20 62 79 74 65 20 74 61  , a 0x00 byte ta
1a30: 6b 65 73 20 74 68 65 20 70 6c 61 63 65 20 6f 66  kes the place of
1a40: 20 74 68 65 0a 2a 2a 20 20 20 64 65 6c 74 61 20   the.**   delta 
1a50: 76 61 6c 75 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  value..*/../*.**
1a60: 20 52 6f 77 69 64 73 20 66 6f 72 20 74 68 65 20   Rowids for the 
1a70: 61 76 65 72 61 67 65 73 20 61 6e 64 20 73 74 72  averages and str
1a80: 75 63 74 75 72 65 20 72 65 63 6f 72 64 73 20 69  ucture records i
1a90: 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  n the %_data tab
1aa0: 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  le..*/.#define F
1ab0: 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
1ac0: 49 44 20 20 20 20 20 31 20 20 20 20 2f 2a 20 52  ID     1    /* R
1ad0: 6f 77 69 64 20 75 73 65 64 20 66 6f 72 20 74 68  owid used for th
1ae0: 65 20 61 76 65 72 61 67 65 73 20 72 65 63 6f 72  e averages recor
1af0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  d */.#define FTS
1b00: 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
1b10: 44 28 69 49 64 78 29 20 28 31 30 20 2b 20 28 69  D(iIdx) (10 + (i
1b20: 49 64 78 29 29 20 20 20 20 20 2f 2a 20 46 6f 72  Idx))     /* For
1b30: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
1b40: 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  ds */../*.** Mac
1b50: 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ros determining 
1b60: 74 68 65 20 72 6f 77 69 64 73 20 75 73 65 64 20  the rowids used 
1b70: 62 79 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 73  by segment nodes
1b80: 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 69 6e 20 61  . All nodes in a
1b90: 6c 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 66  ll.** segments f
1ba0: 6f 72 20 61 6c 6c 20 69 6e 64 65 78 65 73 20 28  or all indexes (
1bb0: 74 68 65 20 72 65 67 75 6c 61 72 20 46 54 53 20  the regular FTS 
1bc0: 69 6e 64 65 78 20 61 6e 64 20 61 6e 79 20 70 72  index and any pr
1bd0: 65 66 69 78 20 69 6e 64 65 78 65 73 29 0a 2a 2a  efix indexes).**
1be0: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
1bf0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
1c00: 77 69 74 68 20 6c 61 72 67 65 20 70 6f 73 69 74  with large posit
1c10: 69 76 65 20 72 6f 77 69 64 73 2e 0a 2a 2a 0a 2a  ive rowids..**.*
1c20: 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62  * The %_data tab
1c30: 6c 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 75  le may contain u
1c40: 70 20 74 6f 20 28 31 3c 3c 46 54 53 35 5f 53 45  p to (1<<FTS5_SE
1c50: 47 4d 45 4e 54 5f 49 4e 44 45 58 5f 42 49 54 53  GMENT_INDEX_BITS
1c60: 29 20 0a 2a 2a 20 69 6e 64 65 78 65 73 20 2d 20  ) .** indexes - 
1c70: 6f 6e 65 20 72 65 67 75 6c 61 72 20 74 65 72 6d  one regular term
1c80: 20 69 6e 64 65 78 20 61 6e 64 20 7a 65 72 6f 20   index and zero 
1c90: 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20 69  or more prefix i
1ca0: 6e 64 65 78 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  ndexes..**.** Ea
1cb0: 63 68 20 73 65 67 6d 65 6e 74 20 69 6e 20 61 6e  ch segment in an
1cc0: 20 69 6e 64 65 78 20 68 61 73 20 61 20 75 6e 69   index has a uni
1cd0: 71 75 65 20 69 64 20 67 72 65 61 74 65 72 20 74  que id greater t
1ce0: 68 61 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  han zero..**.** 
1cf0: 45 61 63 68 20 6e 6f 64 65 20 69 6e 20 61 20 73  Each node in a s
1d00: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73  egment b-tree is
1d10: 20 61 73 73 69 67 6e 65 64 20 61 20 22 70 61 67   assigned a "pag
1d20: 65 20 6e 75 6d 62 65 72 22 20 74 68 61 74 20 69  e number" that i
1d30: 73 20 75 6e 69 71 75 65 0a 2a 2a 20 77 69 74 68  s unique.** with
1d40: 69 6e 20 6e 6f 64 65 73 20 6f 66 20 69 74 73 20  in nodes of its 
1d50: 68 65 69 67 68 74 20 77 69 74 68 69 6e 20 74 68  height within th
1d60: 65 20 73 65 67 6d 65 6e 74 20 28 6c 65 61 66 20  e segment (leaf 
1d70: 6e 6f 64 65 73 20 68 61 76 65 20 61 20 68 65 69  nodes have a hei
1d80: 67 68 74 20 0a 2a 2a 20 6f 66 20 30 2c 20 70 61  ght .** of 0, pa
1d90: 72 65 6e 74 73 20 31 2c 20 65 74 63 2e 29 2e 20  rents 1, etc.). 
1da0: 50 61 67 65 20 6e 75 6d 62 65 72 73 20 61 72 65  Page numbers are
1db0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 65 71 75 65   allocated seque
1dc0: 6e 74 69 61 6c 6c 79 20 73 6f 20 74 68 61 74 0a  ntially so that.
1dd0: 2a 2a 20 61 20 6e 6f 64 65 73 20 70 61 67 65 20  ** a nodes page 
1de0: 6e 75 6d 62 65 72 20 69 73 20 61 6c 77 61 79 73  number is always
1df0: 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 69   one more than i
1e00: 74 73 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 2e  ts left sibling.
1e10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64  .**.** The rowid
1e20: 20 66 6f 72 20 61 20 6e 6f 64 65 20 69 73 20 74   for a node is t
1e30: 68 65 6e 20 66 6f 75 6e 64 20 75 73 69 6e 67 20  hen found using 
1e40: 74 68 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  the FTS5_SEGMENT
1e50: 5f 52 4f 57 49 44 28 29 20 6d 61 63 72 6f 0a 2a  _ROWID() macro.*
1e60: 2a 20 62 65 6c 6f 77 2e 20 54 68 65 20 46 54 53  * below. The FTS
1e70: 35 5f 53 45 47 4d 45 4e 54 5f 2a 5f 42 49 54 53  5_SEGMENT_*_BITS
1e80: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 74   macros define t
1e90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
1ea0: 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 65 6e 63  s used.** to enc
1eb0: 6f 64 65 20 74 68 65 20 74 68 72 65 65 20 46 54  ode the three FT
1ec0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
1ed0: 28 29 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68  () arguments. Th
1ee0: 69 73 20 6d 6f 64 75 6c 65 20 72 65 74 75 72 6e  is module return
1ef0: 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  s.** SQLITE_FULL
1f00: 20 61 6e 64 20 66 61 69 6c 73 20 74 68 65 20 63   and fails the c
1f10: 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e  urrent operation
1f20: 20 69 66 20 74 68 65 79 20 65 76 65 72 20 70 72   if they ever pr
1f30: 6f 76 65 20 74 6f 6f 20 73 6d 61 6c 6c 2e 0a 2a  ove too small..*
1f40: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  /.#define FTS5_D
1f50: 41 54 41 5f 49 44 58 5f 42 20 20 20 20 20 35 20  ATA_IDX_B     5 
1f60: 20 20 20 20 2f 2a 20 4d 61 78 20 6f 66 20 33 31      /* Max of 31
1f70: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   prefix indexes 
1f80: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
1f90: 44 41 54 41 5f 49 44 5f 42 20 20 20 20 20 31 36  DATA_ID_B     16
1fa0: 20 20 20 20 20 2f 2a 20 4d 61 78 20 73 65 67 20       /* Max seg 
1fb0: 69 64 20 6e 75 6d 62 65 72 20 36 35 35 33 35 20  id number 65535 
1fc0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
1fd0: 44 41 54 41 5f 48 45 49 47 48 54 5f 42 20 20 35  DATA_HEIGHT_B  5
1fe0: 20 20 20 20 20 2f 2a 20 4d 61 78 20 62 2d 74 72       /* Max b-tr
1ff0: 65 65 20 68 65 69 67 68 74 20 6f 66 20 33 32 20  ee height of 32 
2000: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
2010: 44 41 54 41 5f 50 41 47 45 5f 42 20 20 20 33 31  DATA_PAGE_B   31
2020: 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 61 67 65       /* Max page
2030: 20 6e 75 6d 62 65 72 20 6f 66 20 32 31 34 37 34   number of 21474
2040: 38 33 36 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e  83648 */..#defin
2050: 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  e FTS5_SEGMENT_R
2060: 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c  OWID(idx, segid,
2070: 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 28   height, pgno) (
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
20a0: 34 29 28 69 64 78 29 20 20 20 20 3c 3c 20 28 46  4)(idx)    << (F
20b0: 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 2b 20  TS5_DATA_ID_B + 
20c0: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
20d0: 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49   + FTS5_DATA_HEI
20e0: 47 48 54 5f 42 29 29 20 2b 20 5c 0a 20 28 28 69  GHT_B)) + \. ((i
20f0: 36 34 29 28 73 65 67 69 64 29 20 20 3c 3c 20 28  64)(segid)  << (
2100: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
2110: 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49   + FTS5_DATA_HEI
2120: 47 48 54 5f 42 29 29 20 2b 20 20 20 20 20 20 20  GHT_B)) +       
2130: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28             \. ((
2140: 69 36 34 29 28 68 65 69 67 68 74 29 20 3c 3c 20  i64)(height) << 
2150: 28 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f  (FTS5_DATA_PAGE_
2160: 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  B)) +           
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28              \. (
2190: 28 69 36 34 29 28 70 67 6e 6f 29 29 20 20 20 20  (i64)(pgno))    
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 29               \.)
21e0: 0a 0a 23 69 66 20 46 54 53 35 5f 4d 41 58 5f 50  ..#if FTS5_MAX_P
21f0: 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20 3e 20  REFIX_INDEXES > 
2200: 28 28 31 3c 3c 46 54 53 35 5f 44 41 54 41 5f 49  ((1<<FTS5_DATA_I
2210: 44 58 5f 42 29 2d 31 29 20 0a 23 20 65 72 72 6f  DX_B)-1) .# erro
2220: 72 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46  r "FTS5_MAX_PREF
2230: 49 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f  IX_INDEXES is to
2240: 6f 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a  o large".#endif.
2250: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 69 67 68  ./*.** The heigh
2260: 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d 74  t of segment b-t
2270: 72 65 65 73 20 69 73 20 61 63 74 75 61 6c 6c 79  rees is actually
2280: 20 6c 69 6d 69 74 65 64 20 74 6f 20 6f 6e 65 20   limited to one 
2290: 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 28 31  less than .** (1
22a0: 3c 3c 48 45 49 47 48 54 5f 42 49 54 53 29 2e 20  <<HEIGHT_BITS). 
22b0: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
22c0: 74 68 65 20 72 6f 77 69 64 20 61 64 64 72 65 73  the rowid addres
22d0: 73 20 73 70 61 63 65 20 66 6f 72 20 6e 6f 64 65  s space for node
22e0: 73 0a 2a 2a 20 77 69 74 68 20 73 75 63 68 20 61  s.** with such a
22f0: 20 68 65 69 67 68 74 20 69 73 20 75 73 65 64 20   height is used 
2300: 62 79 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  by doclist index
2310: 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  es..*/.#define F
2320: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f  TS5_SEGMENT_MAX_
2330: 48 45 49 47 48 54 20 28 28 31 20 3c 3c 20 46 54  HEIGHT ((1 << FT
2340: 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
2350: 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )-1)../*.** The 
2360: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 64 6f  rowid for the do
2370: 63 6c 69 73 74 20 69 6e 64 65 78 20 61 73 73 6f  clist index asso
2380: 63 69 61 74 65 64 20 77 69 74 68 20 6c 65 61 66  ciated with leaf
2390: 20 70 61 67 65 20 70 67 6e 6f 20 6f 66 20 73 65   page pgno of se
23a0: 67 6d 65 6e 74 0a 2a 2a 20 73 65 67 69 64 20 69  gment.** segid i
23b0: 6e 20 69 6e 64 65 78 20 69 64 78 2e 0a 2a 2f 0a  n index idx..*/.
23c0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 4f 43  #define FTS5_DOC
23d0: 4c 49 53 54 5f 49 44 58 5f 52 4f 57 49 44 28 69  LIST_IDX_ROWID(i
23e0: 64 78 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29  dx, segid, pgno)
23f0: 20 5c 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f   \.        FTS5_
2400: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 64  SEGMENT_ROWID(id
2410: 78 2c 20 73 65 67 69 64 2c 20 46 54 53 35 5f 53  x, segid, FTS5_S
2420: 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48  EGMENT_MAX_HEIGH
2430: 54 2c 20 70 67 6e 6f 29 0a 0a 23 69 66 64 65 66  T, pgno)..#ifdef
2440: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
2450: 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f 72  atic int fts5Cor
2460: 72 75 70 74 28 29 20 7b 20 72 65 74 75 72 6e 20  rupt() { return 
2470: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
2480: 54 41 42 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  TAB; }.# define 
2490: 46 54 53 35 5f 43 4f 52 52 55 50 54 20 66 74 73  FTS5_CORRUPT fts
24a0: 35 43 6f 72 72 75 70 74 28 29 0a 23 65 6c 73 65  5Corrupt().#else
24b0: 0a 23 20 64 65 66 69 6e 65 20 46 54 53 35 5f 43  .# define FTS5_C
24c0: 4f 52 52 55 50 54 20 53 51 4c 49 54 45 5f 43 4f  ORRUPT SQLITE_CO
24d0: 52 52 55 50 54 5f 56 54 41 42 0a 23 65 6e 64 69  RRUPT_VTAB.#endi
24e0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
24f0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
2500: 74 20 66 74 73 35 4d 69 73 73 69 6e 67 44 61 74  t fts5MissingDat
2510: 61 28 29 20 7b 20 72 65 74 75 72 6e 20 30 3b 20  a() { return 0; 
2520: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
2530: 20 66 74 73 35 4d 69 73 73 69 6e 67 44 61 74 61   fts5MissingData
2540: 28 29 20 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70  () .#endif...typ
2550: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2560: 42 74 72 65 65 49 74 65 72 20 46 74 73 35 42 74  BtreeIter Fts5Bt
2570: 72 65 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66  reeIter;.typedef
2580: 20 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65   struct Fts5Btre
2590: 65 49 74 65 72 4c 65 76 65 6c 20 46 74 73 35 42  eIterLevel Fts5B
25a0: 74 72 65 65 49 74 65 72 4c 65 76 65 6c 3b 0a 74  treeIterLevel;.t
25b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
25c0: 73 35 43 68 75 6e 6b 49 74 65 72 20 46 74 73 35  s5ChunkIter Fts5
25d0: 43 68 75 6e 6b 49 74 65 72 3b 0a 74 79 70 65 64  ChunkIter;.typed
25e0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44 61  ef struct Fts5Da
25f0: 74 61 20 46 74 73 35 44 61 74 61 3b 0a 74 79 70  ta Fts5Data;.typ
2600: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2610: 44 6c 69 64 78 49 74 65 72 20 46 74 73 35 44 6c  DlidxIter Fts5Dl
2620: 69 64 78 49 74 65 72 3b 0a 74 79 70 65 64 65 66  idxIter;.typedef
2630: 20 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c 74   struct Fts5Mult
2640: 69 53 65 67 49 74 65 72 20 46 74 73 35 4d 75 6c  iSegIter Fts5Mul
2650: 74 69 53 65 67 49 74 65 72 3b 0a 74 79 70 65 64  tiSegIter;.typed
2660: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 4e 6f  ef struct Fts5No
2670: 64 65 49 74 65 72 20 46 74 73 35 4e 6f 64 65 49  deIter Fts5NodeI
2680: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2690: 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69 74  uct Fts5PageWrit
26a0: 65 72 20 46 74 73 35 50 61 67 65 57 72 69 74 65  er Fts5PageWrite
26b0: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
26c0: 74 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63  t Fts5PendingDoc
26d0: 6c 69 73 74 20 46 74 73 35 50 65 6e 64 69 6e 67  list Fts5Pending
26e0: 44 6f 63 6c 69 73 74 3b 0a 74 79 70 65 64 65 66  Doclist;.typedef
26f0: 20 73 74 72 75 63 74 20 46 74 73 35 50 65 6e 64   struct Fts5Pend
2700: 69 6e 67 50 6f 73 6c 69 73 74 20 46 74 73 35 50  ingPoslist Fts5P
2710: 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 3b 0a 74  endingPoslist;.t
2720: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2730: 73 35 50 6f 73 49 74 65 72 20 46 74 73 35 50 6f  s5PosIter Fts5Po
2740: 73 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  sIter;.typedef s
2750: 74 72 75 63 74 20 46 74 73 35 53 65 67 49 74 65  truct Fts5SegIte
2760: 72 20 46 74 73 35 53 65 67 49 74 65 72 3b 0a 74  r Fts5SegIter;.t
2770: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2780: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 46 74  s5DoclistIter Ft
2790: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74  s5DoclistIter;.t
27a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
27b0: 73 35 53 65 67 57 72 69 74 65 72 20 46 74 73 35  s5SegWriter Fts5
27c0: 53 65 67 57 72 69 74 65 72 3b 0a 74 79 70 65 64  SegWriter;.typed
27d0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
27e0: 72 75 63 74 75 72 65 20 46 74 73 35 53 74 72 75  ructure Fts5Stru
27f0: 63 74 75 72 65 3b 0a 74 79 70 65 64 65 66 20 73  cture;.typedef s
2800: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2810: 75 72 65 4c 65 76 65 6c 20 46 74 73 35 53 74 72  ureLevel Fts5Str
2820: 75 63 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70  uctureLevel;.typ
2830: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2840: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2850: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2860: 67 6d 65 6e 74 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  gment;../*.** On
2870: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2880: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2890: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
28a0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
28b0: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
28c0: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
28d0: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
28e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
28f0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
2900: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2910: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
2920: 2f 0a 20 20 69 6e 74 20 70 67 73 7a 3b 20 20 20  /.  int pgsz;   
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 2f 2a 20 54 61 72 67 65 74 20 70 61      /* Target pa
2950: 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  ge size for this
2960: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
2970: 6e 4d 69 6e 4d 65 72 67 65 3b 20 20 20 20 20 20  nMinMerge;      
2980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2990: 69 6e 69 6d 75 6d 20 69 6e 70 75 74 20 73 65 67  inimum input seg
29a0: 6d 65 6e 74 73 20 69 6e 20 61 20 6d 65 72 67 65  ments in a merge
29b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55   */.  int nWorkU
29c0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
29d0: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61        /* Leaf pa
29e0: 67 65 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20  ges in a "unit" 
29f0: 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a  of work */..  /*
2a00: 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20  .  ** Variables 
2a10: 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61  related to the a
2a20: 63 63 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74  ccumulation of t
2a30: 6f 6b 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73  okens and doclis
2a40: 74 73 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20  ts within the.  
2a50: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  ** in-memory has
2a60: 68 20 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20  h tables before 
2a70: 74 68 65 79 20 61 72 65 20 66 6c 75 73 68 65 64  they are flushed
2a80: 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   to disk..  */. 
2a90: 20 46 74 73 33 48 61 73 68 20 2a 61 48 61 73 68   Fts3Hash *aHash
2aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ab0: 20 2f 2a 20 4f 6e 65 20 68 61 73 68 20 66 6f 72   /* One hash for
2ac0: 20 74 65 72 6d 73 2c 20 6f 6e 65 20 66 6f 72 20   terms, one for 
2ad0: 65 61 63 68 20 70 72 65 66 69 78 20 2a 2f 0a 20  each prefix */. 
2ae0: 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67   int nMaxPending
2af0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2b00: 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20   /* Max pending 
2b10: 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73  data before flus
2b20: 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  h to disk */.  i
2b30: 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b  nt nPendingData;
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b50: 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 73 20  * Current bytes 
2b60: 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20  of pending data 
2b70: 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74 65 52  */.  i64 iWriteR
2b80: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2b90: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
2ba0: 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20 62 65  r current doc be
2bb0: 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a  ing written */..
2bc0: 20 20 2f 2a 20 45 72 72 6f 72 20 73 74 61 74 65    /* Error state
2bd0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2c00: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  t error code */.
2c10: 0a 20 20 2f 2a 20 53 74 61 74 65 20 75 73 65 64  .  /* State used
2c20: 20 62 79 20 74 68 65 20 66 74 73 35 44 61 74 61   by the fts5Data
2c30: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  XXX() functions.
2c40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c   */.  sqlite3_bl
2c50: 6f 62 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20  ob *pReader;    
2c60: 20 20 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63 72        /* RO incr
2c70: 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25 5f  -blob open on %_
2c80: 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
2c90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57  sqlite3_stmt *pW
2ca0: 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
2cb0: 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25  /* "INSERT ... %
2cc0: 5f 64 61 74 61 20 56 41 4c 55 45 53 28 3f 2c 3f  _data VALUES(?,?
2cd0: 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  )" */.  sqlite3_
2ce0: 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b 20  stmt *pDeleter; 
2cf0: 20 20 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45          /* "DELE
2d00: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 2e  TE FROM %_data .
2d10: 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c  .. id>=? AND id<
2d20: 3d 3f 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  =?" */.  int nRe
2d30: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
2d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2d50: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63  l number of bloc
2d60: 6b 73 20 72 65 61 64 20 2a 2f 0a 7d 3b 0a 0a 73  ks read */.};..s
2d70: 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73  truct Fts5Doclis
2d80: 74 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 62 41  tIter {.  int bA
2d90: 73 63 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69  sc;.  u8 *a;.  i
2da0: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  nt n;.  int i;..
2db0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
2dc0: 61 62 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d  ables. aPoslist=
2dd0: 3d 30 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69  =0 at EOF */.  i
2de0: 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20  64 iRowid;.  u8 
2df0: 2a 61 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74  *aPoslist;.  int
2e00: 20 6e 50 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f   nPoslist;.};../
2e10: 2a 0a 2a 2a 20 45 61 63 68 20 69 74 65 72 61 74  *.** Each iterat
2e20: 6f 72 20 75 73 65 64 20 62 79 20 65 78 74 65 72  or used by exter
2e30: 6e 61 6c 20 6d 6f 64 75 6c 65 73 20 69 73 20 61  nal modules is a
2e40: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2e50: 69 73 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75  is type..*/.stru
2e60: 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ct Fts5IndexIter
2e70: 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a   {.  Fts5Index *
2e80: 70 49 6e 64 65 78 3b 0a 20 20 46 74 73 35 53 74  pIndex;.  Fts5St
2e90: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
2ea0: 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  ;.  Fts5MultiSeg
2eb0: 49 74 65 72 20 2a 70 4d 75 6c 74 69 3b 0a 20 20  Iter *pMulti;.  
2ec0: 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
2ed0: 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 46 74 73  *pDoclist;.  Fts
2ee0: 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 3b  5Buffer poslist;
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f00: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
2f10: 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69 73  g current poslis
2f20: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
2f30: 20 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 72   single record r
2f40: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2f50: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2f60: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2f70: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2fa0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2fb0: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2fc0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fe0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
2ff0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
3000: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3020: 20 52 65 66 20 63 6f 75 6e 74 20 2a 2f 0a 7d 3b   Ref count */.};
3030: 0a 0a 2f 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 69  ../*.** Before i
3040: 74 20 69 73 20 66 6c 75 73 68 65 64 20 74 6f 20  t is flushed to 
3050: 61 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e  a level-0 segmen
3060: 74 2c 20 74 65 72 6d 20 64 61 74 61 20 69 73 20  t, term data is 
3070: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 0a 2a 2a 20  collected in.** 
3080: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
3090: 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  in the Fts5Index
30a0: 2e 61 48 61 73 68 5b 5d 20 61 72 72 61 79 2e 20  .aHash[] array. 
30b0: 48 61 73 68 20 74 61 62 6c 65 20 6b 65 79 73 20  Hash table keys 
30c0: 61 72 65 0a 2a 2a 20 74 65 72 6d 73 20 28 6f 72  are.** terms (or
30d0: 2c 20 66 6f 72 20 70 72 65 66 69 78 20 69 6e 64  , for prefix ind
30e0: 65 78 65 73 2c 20 74 65 72 6d 20 70 72 65 66 69  exes, term prefi
30f0: 78 65 73 29 20 61 6e 64 20 76 61 6c 75 65 73 20  xes) and values 
3100: 61 72 65 20 69 6e 73 74 61 6e 63 65 73 0a 2a 2a  are instances.**
3110: 20 6f 66 20 74 79 70 65 20 46 74 73 35 50 65 6e   of type Fts5Pen
3120: 64 69 6e 67 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  dingDoclist..*/.
3130: 73 74 72 75 63 74 20 46 74 73 35 50 65 6e 64 69  struct Fts5Pendi
3140: 6e 67 44 6f 63 6c 69 73 74 20 7b 0a 20 20 75 38  ngDoclist {.  u8
3150: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3170: 20 54 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65   Term for this e
3180: 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ntry */.  int nT
3190: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
31a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
31b0: 65 73 20 6f 66 20 64 61 74 61 20 61 74 20 70 54  es of data at pT
31c0: 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 65 6e  erm */.  Fts5Pen
31d0: 64 69 6e 67 50 6f 73 6c 69 73 74 20 2a 70 50 6f  dingPoslist *pPo
31e0: 73 6c 69 73 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b  slist;   /* Link
31f0: 65 64 20 6c 69 73 74 20 6f 66 20 70 6f 73 69 74  ed list of posit
3200: 69 6f 6e 20 6c 69 73 74 73 20 2a 2f 0a 20 20 69  ion lists */.  i
3210: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3230: 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 6c 61 73  * Column for las
3240: 74 20 65 6e 74 72 79 20 69 6e 20 70 50 65 6e 64  t entry in pPend
3250: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f  ing */.  int iPo
3260: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
3270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 20           /* Pos 
3280: 76 61 6c 75 65 20 66 6f 72 20 6c 61 73 74 20 65  value for last e
3290: 6e 74 72 79 20 69 6e 20 70 50 65 6e 64 69 6e 67  ntry in pPending
32a0: 20 2a 2f 0a 20 20 46 74 73 35 50 65 6e 64 69 6e   */.  Fts5Pendin
32b0: 67 44 6f 63 6c 69 73 74 20 2a 70 4e 65 78 74 3b  gDoclist *pNext;
32c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 64 75        /* Used du
32d0: 72 69 6e 67 20 6d 65 72 67 65 20 73 6f 72 74 20  ring merge sort 
32e0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
32f0: 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20  5PendingPoslist 
3300: 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  {.  i64 iRowid; 
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
3330: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 20 65 6e   this doclist en
3340: 74 72 79 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  try */.  Fts5Buf
3350: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
3360: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
3370: 65 6e 74 20 64 6f 63 6c 69 73 74 20 63 6f 6e 74  ent doclist cont
3380: 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 50 65  ents */.  Fts5Pe
3390: 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20 2a 70 4e  ndingPoslist *pN
33a0: 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 50 72 65  ext;      /* Pre
33b0: 76 69 6f 75 73 20 70 6f 73 6c 69 73 74 20 66 6f  vious poslist fo
33c0: 72 20 73 61 6d 65 20 74 65 72 6d 20 2a 2f 0a 7d  r same term */.}
33d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  ;../*.** The con
33e0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73 74  tents of the "st
33f0: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20  ructure" record 
3400: 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 61  for each index a
3410: 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a 2a  re represented.*
3420: 2a 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35 53  * using an Fts5S
3430: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
3440: 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63 68  in memory. Which
3450: 20 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73 20   uses instances 
3460: 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65 72  of the .** other
3470: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 58 58   Fts5StructureXX
3480: 58 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70 6f  X types as compo
3490: 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  nents..*/.struct
34a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
34b0: 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69 53  gment {.  int iS
34c0: 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  egid;           
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
34e0: 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74  ment id */.  int
34f0: 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20   nHeight;       
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3510: 48 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e  Height of segmen
3520: 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  t b-tree */.  in
3530: 74 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20 20  t pgnoFirst;    
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3550: 20 46 69 72 73 74 20 6c 65 61 66 20 70 61 67 65   First leaf page
3560: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
3570: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f  nt */.  int pgno
3580: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
3590: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
35a0: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
35b0: 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d   in segment */.}
35c0: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  ;.struct Fts5Str
35d0: 75 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20 20  uctureLevel {.  
35e0: 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20 20  int nMerge;     
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
3610: 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d 65  ments in incr-me
3620: 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  rge */.  int nSe
3630: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
3640: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
3650: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
3660: 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f  ents on level */
3670: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3680: 53 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20 20  Segment *aSeg;  
3690: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
36a0: 65 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30 5d  egments. aSeg[0]
36b0: 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d   is oldest. */.}
36c0: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  ;.struct Fts5Str
36d0: 75 63 74 75 72 65 20 7b 0a 20 20 75 36 34 20 6e  ucture {.  u64 n
36e0: 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20 20  WriteCounter;   
36f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
3700: 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74 74  tal leaves writt
3710: 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f  en to level 0 */
3720: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20  .  int nLevel;  
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3750: 6c 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69  levels in this i
3760: 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74  ndex */.  Fts5St
3770: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65  ructureLevel aLe
3780: 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20 41 72 72  vel[0];   /* Arr
3790: 61 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76  ay of nLevel lev
37a0: 65 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b  el objects */.};
37b0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63  ../*.** An objec
37c0: 74 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65  t of type Fts5Se
37d0: 67 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20  gWriter is used 
37e0: 74 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d  to write to segm
37f0: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ents..*/.struct 
3800: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b  Fts5PageWriter {
3810: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
3840: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3850: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3860: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
3870: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
3880: 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64  ontaining page d
3890: 61 74 61 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ata */.  Fts5Buf
38a0: 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
38b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
38c0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72  er containing pr
38d0: 65 76 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70  evious term on p
38e0: 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74  age */.};.struct
38f0: 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 7b   Fts5SegWriter {
3900: 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20  .  int iIdx;    
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
3930: 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
3940: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3960: 53 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74  Segid to write t
3970: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74  o */.  int nWrit
3980: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3990: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
39a0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
39b0: 57 72 69 74 65 72 20 2a 2f 0a 20 20 46 74 73 35  Writer */.  Fts5
39c0: 50 61 67 65 57 72 69 74 65 72 20 2a 61 57 72 69  PageWriter *aWri
39d0: 74 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ter;        /* A
39e0: 72 72 61 79 20 6f 66 20 50 61 67 65 57 72 69 74  rray of PageWrit
39f0: 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  er objects */.  
3a00: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69  /* Previous doci
3a30: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3a40: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
3a50: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
3a60: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
3a70: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
3a80: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
3a90: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
3aa0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3ab0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3ac0: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3ad0: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3ae0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  page */.  int nL
3af0: 65 61 66 57 72 69 74 74 65 6e 3b 20 20 20 20 20  eafWritten;     
3b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3b10: 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
3b20: 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  s written */.  i
3b30: 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20  nt nEmpty;      
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74  * Number of cont
3b60: 69 67 75 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73  iguous term-less
3b70: 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 46 74 73 35   nodes */.  Fts5
3b80: 42 75 66 66 65 72 20 64 6c 69 64 78 3b 20 20 20  Buffer dlidx;   
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ba0: 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
3bb0: 20 20 69 36 34 20 69 44 6c 69 64 78 50 72 65 76    i64 iDlidxPrev
3bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3bd0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
3be0: 77 69 64 20 61 70 70 65 6e 64 65 64 20 74 6f 20  wid appended to 
3bf0: 64 6c 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  dlidx */.  int b
3c00: 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 3b 20  DlidxPrevValid; 
3c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3c20: 75 65 20 69 66 20 69 44 6c 69 64 78 50 72 65 76  ue if iDlidxPrev
3c30: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a   is valid */.};.
3c40: 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f  ./*.** Object fo
3c50: 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
3c60: 75 67 68 20 74 68 65 20 6d 65 72 67 65 64 20 72  ugh the merged r
3c70: 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72  esults of one or
3c80: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a   more segments,.
3c90: 2a 2a 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  ** visiting each
3ca0: 20 74 65 72 6d 2f 64 6f 63 69 64 20 70 61 69 72   term/docid pair
3cb0: 20 69 6e 20 74 68 65 20 6d 65 72 67 65 64 20 64   in the merged d
3cc0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20  ata..**.** nSeg 
3cd0: 69 73 20 61 6c 77 61 79 73 20 61 20 70 6f 77 65  is always a powe
3ce0: 72 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  r of two greater
3cf0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
3d00: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3d10: 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  ** segments that
3d20: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
3d30: 6d 65 72 67 69 6e 67 20 64 61 74 61 20 66 72 6f  merging data fro
3d40: 6d 2e 20 42 6f 74 68 20 74 68 65 20 61 53 65 67  m. Both the aSeg
3d50: 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74  [] and.** aFirst
3d60: 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20 73 69  [] arrays are si
3d70: 7a 65 64 20 61 74 20 6e 53 65 67 20 65 6e 74 72  zed at nSeg entr
3d80: 69 65 73 2e 20 54 68 65 20 61 53 65 67 5b 5d 20  ies. The aSeg[] 
3d90: 61 72 72 61 79 20 69 73 20 70 61 64 64 65 64 0a  array is padded.
3da0: 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65 64 20 6f  ** with zeroed o
3db0: 62 6a 65 63 74 73 20 2d 20 74 68 65 73 65 20 61  bjects - these a
3dc0: 72 65 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  re handled as if
3dd0: 20 74 68 65 79 20 77 65 72 65 20 69 74 65 72 61   they were itera
3de0: 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  tors opened.** o
3df0: 6e 20 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73  n empty segments
3e00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
3e10: 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
3e20: 20 73 65 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e   segments aSeg[N
3e30: 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c  ] and aSeg[N+1],
3e40: 20 77 68 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a   where N is an.*
3e50: 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69  * even number, i
3e60: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 46 69 72  s stored in aFir
3e70: 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20  st[(nSeg+N)/2]. 
3e80: 54 68 65 20 22 72 65 73 75 6c 74 22 20 6f 66 20  The "result" of 
3e90: 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73  the .** comparis
3ea0: 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65  on in this conte
3eb0: 78 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  xt is the index 
3ec0: 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  of the iterator 
3ed0: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a  that currently.*
3ee0: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
3ef0: 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77  smaller term/row
3f00: 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  id combination. 
3f10: 49 74 65 72 61 74 6f 72 73 20 61 74 20 45 4f 46  Iterators at EOF
3f20: 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   are.** consider
3f30: 65 64 20 74 6f 20 62 65 20 67 72 65 61 74 65 72  ed to be greater
3f40: 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20   than all other 
3f50: 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a  iterators..**.**
3f60: 20 61 46 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61   aFirst[1] conta
3f70: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ins the index in
3f80: 20 61 53 65 67 5b 5d 20 6f 66 20 74 68 65 20 69   aSeg[] of the i
3f90: 74 65 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69  terator that poi
3fa0: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d  nts to.** the sm
3fb0: 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76 65 72 61  allest key overa
3fc0: 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d 20 69 73  ll. aFirst[0] is
3fd0: 20 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a 73 74 72   unused. .*/.str
3fe0: 75 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67  uct Fts5MultiSeg
3ff0: 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65  Iter {.  int nSe
4000: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4020: 20 6f 66 20 61 53 65 67 5b 5d 20 61 72 72 61 79   of aSeg[] array
4030: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4060: 20 69 74 65 72 61 74 65 20 69 6e 20 72 65 76 65   iterate in reve
4070: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46  rse order */.  F
4080: 74 73 35 53 65 67 49 74 65 72 20 2a 61 53 65 67  ts5SegIter *aSeg
4090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
40a0: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d 65  * Array of segme
40b0: 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a  nt iterators */.
40c0: 20 20 75 31 36 20 2a 61 46 69 72 73 74 3b 20 20    u16 *aFirst;  
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65 72    /* Current mer
40f0: 67 65 20 73 74 61 74 65 20 28 73 65 65 20 61 62  ge state (see ab
4100: 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ove) */.};../*.*
4110: 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65  * Object for ite
4120: 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
4130: 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2c   single segment,
4140: 20 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74   visiting each t
4150: 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a 20 70 61 69  erm/docid.** pai
4160: 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  r in the segment
4170: 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a 2a 2a  ..**.** pSeg:.**
4180: 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74 20 74     The segment t
4190: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
41a0: 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 50 67  h..**.** iLeafPg
41b0: 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65 6e 74  no:.**   Current
41c0: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
41d0: 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74  r within segment
41e0: 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f 66 66  ..**.** iLeafOff
41f0: 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65 20 6f  set:.**   Byte o
4200: 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65  ffset within the
4210: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 74 68   current leaf th
4220: 61 74 20 69 73 20 6f 6e 65 20 62 79 74 65 20 70  at is one byte p
4230: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
4240: 68 65 0a 2a 2a 20 20 20 72 6f 77 69 64 20 66 69  he.**   rowid fi
4250: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  eld of the curre
4260: 6e 74 20 65 6e 74 72 79 2e 20 55 73 75 61 6c 6c  nt entry. Usuall
4270: 79 20 74 68 69 73 20 69 73 20 74 68 65 20 73 69  y this is the si
4280: 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  ze field of the.
4290: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
42a0: 73 74 20 64 61 74 61 2e 20 54 68 65 20 65 78 63  st data. The exc
42b0: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
42c0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
42d0: 75 72 72 65 6e 74 20 65 6e 74 72 79 20 0a 2a 2a  urrent entry .**
42e0: 20 20 20 69 73 20 74 68 65 20 6c 61 73 74 20 74     is the last t
42f0: 68 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 61 66  hing on the leaf
4300: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 4c 65   page..**.** pLe
4310: 61 66 3a 0a 2a 2a 20 20 20 42 75 66 66 65 72 20  af:.**   Buffer 
4320: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65  containing curre
4330: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 64 61 74  nt leaf page dat
4340: 61 2e 20 53 65 74 20 74 6f 20 4e 55 4c 4c 20 61  a. Set to NULL a
4350: 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 54 65  t EOF..**.** iTe
4360: 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 69 54 65 72  rmLeafPgno, iTer
4370: 6d 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20  mLeafOffset:.** 
4380: 20 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62    Leaf page numb
4390: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
43a0: 65 20 6c 61 73 74 20 74 65 72 6d 20 72 65 61 64  e last term read
43b0: 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e   from the segmen
43c0: 74 2e 20 41 6e 64 0a 2a 2a 20 20 20 74 68 65 20  t. And.**   the 
43d0: 6f 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74 65  offset immediate
43e0: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
43f0: 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a 2a   term data..**.*
4400: 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20 20 20 4d 61  * flags:.**   Ma
4410: 73 6b 20 6f 66 20 46 54 53 35 5f 53 45 47 49 54  sk of FTS5_SEGIT
4420: 45 52 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49  ER_XXX values. I
4430: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
4440: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46  llows:.**.**   F
4450: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
4460: 45 52 4d 3a 0a 2a 2a 20 20 20 20 20 49 66 20 73  ERM:.**     If s
4470: 65 74 2c 20 73 65 74 20 74 68 65 20 69 74 65 72  et, set the iter
4480: 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ator to point to
4490: 20 45 4f 46 20 61 66 74 65 72 20 74 68 65 20 63   EOF after the c
44a0: 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 0a  urrent doclist .
44b0: 2a 2a 20 20 20 20 20 68 61 73 20 62 65 65 6e 20  **     has been 
44c0: 65 78 68 61 75 73 74 65 64 2e 20 44 6f 20 6e 6f  exhausted. Do no
44d0: 74 20 70 72 6f 63 65 65 64 20 74 6f 20 74 68 65  t proceed to the
44e0: 20 6e 65 78 74 20 74 65 72 6d 20 69 6e 20 74 68   next term in th
44f0: 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  e segment..**.**
4500: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
4510: 52 45 56 45 52 53 45 3a 0a 2a 2a 20 20 20 20 20  REVERSE:.**     
4520: 54 68 69 73 20 66 6c 61 67 20 69 73 20 6f 6e 6c  This flag is onl
4530: 79 20 65 76 65 72 20 73 65 74 20 69 66 20 46 54  y ever set if FT
4540: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
4550: 52 4d 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20  RM is also set. 
4560: 49 66 0a 2a 2a 20 20 20 20 20 69 74 20 69 73 20  If.**     it is 
4570: 73 65 74 2c 20 69 74 65 72 61 74 65 20 74 68 72  set, iterate thr
4580: 6f 75 67 68 20 64 6f 63 69 64 73 20 69 6e 20 61  ough docids in a
4590: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 69  scending order i
45a0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 0a 2a 2a  nstead of the.**
45b0: 20 20 20 20 20 64 65 66 61 75 6c 74 20 64 65 73       default des
45c0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
45d0: 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66 66 73 65  *.** iRowidOffse
45e0: 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65 74 2f 61  t/nRowidOffset/a
45f0: 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a 2a 2a 20  RowidOffset:.** 
4600: 20 20 20 20 54 68 65 73 65 20 61 72 65 20 75 73      These are us
4610: 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53  ed if the FTS5_S
4620: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66  EGITER_REVERSE f
4630: 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  lag is set..**.*
4640: 2a 20 20 20 20 20 45 61 63 68 20 74 69 6d 65 20  *     Each time 
4650: 61 20 6e 65 77 20 70 61 67 65 20 69 73 20 6c 6f  a new page is lo
4660: 61 64 65 64 2c 20 74 68 65 20 69 74 65 72 61 74  aded, the iterat
4670: 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
4680: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  nt to the.**    
4690: 20 66 69 6e 61 6c 20 72 6f 77 69 64 2e 20 41 64   final rowid. Ad
46a0: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
46b0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
46c0: 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65  rray is populate
46d0: 64 20 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  d .**     with t
46e0: 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 73 20  he byte offsets 
46f0: 6f 66 20 61 6c 6c 20 72 65 6c 65 76 61 6e 74 20  of all relevant 
4700: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 6f 6e 20  rowid fields on 
4710: 74 68 65 20 70 61 67 65 2e 20 0a 2a 2f 0a 73 74  the page. .*/.st
4720: 72 75 63 74 20 46 74 73 35 53 65 67 49 74 65 72  ruct Fts5SegIter
4730: 20 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75   {.  Fts5Structu
4740: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
4750: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
4760: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
4770: 67 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  gh */.  int iIdx
4780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4790: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
47a0: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 63 75  offset within cu
47b0: 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20  rrent leaf */.  
47c0: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e 66 69  /* Mask of confi
47f0: 67 75 72 61 74 69 6f 6e 20 66 6c 61 67 73 20 2a  guration flags *
4800: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
4810: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
4820: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
4830: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
4840: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
4850: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
4860: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4870: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 69  leaf data */.  i
4880: 6e 74 20 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  nt iLeafOffset; 
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48a0: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69  * Byte offset wi
48b0: 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61  thin current lea
48c0: 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 70  f */..  /* The p
48d0: 61 67 65 20 61 6e 64 20 6f 66 66 73 65 74 20 66  age and offset f
48e0: 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20 63 75  rom which the cu
48f0: 72 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 72  rrent term was r
4900: 65 61 64 2e 20 54 68 65 20 6f 66 66 73 65 74 20  ead. The offset 
4910: 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 66 66  .  ** is the off
4920: 73 65 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  set of the first
4930: 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 63 75   rowid in the cu
4940: 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e 20 20  rrent doclist.  
4950: 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65  */.  int iTermLe
4960: 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 54  afPgno;.  int iT
4970: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ermLeafOffset;..
4980: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
4990: 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64  ng are only used
49a0: 20 69 66 20 74 68 65 20 46 54 53 35 5f 53 45 47   if the FTS5_SEG
49b0: 49 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c 61  ITER_REVERSE fla
49c0: 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69  g is set. */.  i
49d0: 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b  nt iRowidOffset;
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
49f0: 2a 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20  * Current entry 
4a00: 69 6e 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  in aRowidOffset[
4a10: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69  ] */.  int nRowi
4a20: 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  dOffset;        
4a30: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
4a40: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 77  ted size of aRow
4a50: 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79  idOffset[] array
4a60: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69   */.  int *aRowi
4a70: 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  dOffset;        
4a80: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
4a90: 66 20 6f 66 66 73 65 74 20 74 6f 20 72 6f 77 69  f offset to rowi
4aa0: 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46  d fields */..  F
4ab0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
4ac0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f  lidx;          /
4ad0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
4ae0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f  doclist-index */
4af0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
4b00: 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64   populated based
4b10: 20 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72   on current entr
4b20: 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  y. */.  Fts5Buff
4b30: 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
4b40: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4b50: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34  nt term */.  i64
4b60: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b80: 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f  Current rowid */
4b90: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53  .};..#define FTS
4ba0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
4bb0: 4d 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46  M 0x01.#define F
4bc0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4bd0: 52 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a  RSE 0x02.../*.**
4be0: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
4bf0: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 70 61  ating through pa
4c00: 67 69 6e 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f  ginated data..*/
4c10: 0a 73 74 72 75 63 74 20 46 74 73 35 43 68 75 6e  .struct Fts5Chun
4c20: 6b 49 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61  kIter {.  Fts5Da
4c30: 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
4c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4c50: 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 2e 20  rent leaf data. 
4c60: 4e 55 4c 4c 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a  NULL -> EOF. */.
4c70: 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64    i64 iLeafRowid
4c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c90: 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 72 6f    /* Absolute ro
4ca0: 77 69 64 20 6f 66 20 63 75 72 72 65 6e 74 20 6c  wid of current l
4cb0: 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eaf */.  int nRe
4cc0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61           /* Rema
4ce0: 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64  ining bytes of d
4cf0: 61 74 61 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a  ata to read */..
4d00: 20 20 2f 2a 20 4f 75 74 70 75 74 20 70 61 72 61    /* Output para
4d10: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 75 38 20 2a  meters */.  u8 *
4d20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4d40: 6f 69 6e 74 65 72 20 74 6f 20 63 68 75 6e 6b 20  ointer to chunk 
4d50: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  of data */.  int
4d60: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d80: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
4d90: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a   in bytes */.};.
4da0: 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f  ./*.** Object fo
4db0: 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
4dc0: 75 67 68 20 61 20 73 69 6e 67 6c 65 20 70 6f 73  ugh a single pos
4dd0: 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69  ition list on di
4de0: 73 6b 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  sk..*/.struct Ft
4df0: 73 35 50 6f 73 49 74 65 72 20 7b 0a 20 20 46 74  s5PosIter {.  Ft
4e00: 73 35 43 68 75 6e 6b 49 74 65 72 20 63 68 75 6e  s5ChunkIter chun
4e10: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
4e20: 20 43 75 72 72 65 6e 74 20 63 68 75 6e 6b 20 6f   Current chunk o
4e30: 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  f data */.  int 
4e40: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4e60: 66 66 73 65 74 20 77 69 74 68 69 6e 20 63 68 75  ffset within chu
4e70: 6e 6b 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 6e  nk data */..  in
4e80: 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 50  t iCol;.  int iP
4e90: 6f 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62  os;.};../*.** Ob
4ea0: 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69  ject for iterati
4eb0: 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  ng through the c
4ec0: 6f 6e 65 6e 74 73 20 6f 66 20 61 20 73 69 6e 67  onents of a sing
4ed0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
4ee0: 20 69 6e 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a   in .** memory..
4ef0: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4e 6f  */.struct Fts5No
4f00: 64 65 49 74 65 72 20 7b 0a 20 20 2f 2a 20 49 6e  deIter {.  /* In
4f10: 74 65 72 6e 61 6c 2e 20 53 65 74 20 61 6e 64 20  ternal. Set and 
4f20: 6d 61 6e 61 67 65 64 20 62 79 20 66 74 73 35 4e  managed by fts5N
4f30: 6f 64 65 49 74 65 72 58 58 58 28 29 20 66 75 6e  odeIterXXX() fun
4f40: 63 74 69 6f 6e 73 2e 20 45 78 63 65 70 74 2c 20  ctions. Except, 
4f50: 0a 20 20 2a 2a 20 74 68 65 20 45 4f 46 20 74 65  .  ** the EOF te
4f60: 73 74 20 66 6f 72 20 74 68 65 20 69 74 65 72 61  st for the itera
4f70: 74 6f 72 20 69 73 20 28 46 74 73 35 4e 6f 64 65  tor is (Fts5Node
4f80: 49 74 65 72 2e 61 44 61 74 61 3d 3d 30 29 2e 20  Iter.aData==0). 
4f90: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
4fa0: 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61  aData;.  int nDa
4fb0: 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ta;.  int iOff;.
4fc0: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
4fd0: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35  iables */.  Fts5
4fe0: 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69  Buffer term;.  i
4ff0: 6e 74 20 6e 45 6d 70 74 79 3b 0a 20 20 69 6e 74  nt nEmpty;.  int
5000: 20 69 43 68 69 6c 64 3b 0a 20 20 69 6e 74 20 62   iChild;.  int b
5010: 44 6c 69 64 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Dlidx;.};../*.**
5020: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5030: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  the following ty
5040: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  pe is used to it
5050: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
5060: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
5070: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
5080: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70   record..**.** p
5090: 44 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72  Data:.**   Recor
50a0: 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  d containing the
50b0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64   doclist-index d
50c0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a  ata..**.** bEof:
50d0: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75  .**   Set to tru
50e0: 65 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20  e once iterator 
50f0: 68 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e  has reached EOF.
5100: 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20  .**.** iOff:.** 
5110: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
5120: 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68  rent offset with
5130: 69 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e  in record pData.
5140: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44  .*/.struct Fts5D
5150: 6c 69 64 78 49 74 65 72 20 7b 0a 20 20 46 74 73  lidxIter {.  Fts
5160: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20  5Data *pData;   
5170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5180: 74 61 20 66 6f 72 20 64 6f 63 6c 69 73 74 20 69  ta for doclist i
5190: 6e 64 65 78 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  ndex, if any */.
51a0: 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20    int iOff;     
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  /* Current offse
51d0: 74 20 69 6e 74 6f 20 70 44 6c 69 64 78 20 2a 2f  t into pDlidx */
51e0: 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20  .  int bEof;    
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61   /* At EOF alrea
5210: 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  dy */.  int iFir
5220: 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  stOff;          
5230: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
5240: 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f   reverse iterato
5250: 72 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  rs only */..  /*
5260: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
5270: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
5280: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
5290: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
52a0: 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 20 6c  ber of current l
52b0: 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 36  eaf page */.  i6
52c0: 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20  4 iRowid;       
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
52e0: 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65  irst rowid on le
52f0: 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a  af iLeafPgno */.
5300: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 46 74  };.../*.** An Ft
5310: 73 35 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65  s5BtreeIter obje
5320: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  ct is used to it
5330: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
5340: 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  l entries in the
5350: 0a 2a 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61  .** b-tree hiera
5360: 72 63 68 79 20 62 65 6c 6f 6e 67 69 6e 67 20 74  rchy belonging t
5370: 6f 20 61 20 73 69 6e 67 6c 65 20 66 74 73 35 20  o a single fts5 
5380: 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73  segment. In this
5390: 20 63 61 73 65 20 74 68 65 0a 2a 2a 20 22 62 2d   case the.** "b-
53a0: 74 72 65 65 20 68 69 65 72 61 72 63 68 79 22 20  tree hierarchy" 
53b0: 69 73 20 61 6c 6c 20 62 2d 74 72 65 65 20 6e 6f  is all b-tree no
53c0: 64 65 73 20 65 78 63 65 70 74 20 6c 65 61 76 65  des except leave
53d0: 73 2e 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  s. Each entry in
53e0: 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65 20 68   the.** b-tree h
53f0: 69 65 72 61 72 63 68 79 20 63 6f 6e 73 69 73 74  ierarchy consist
5400: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
5410: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 4c 65 61  ng:.**.**   iLea
5420: 66 3a 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  f:  The page num
5430: 62 65 72 20 6f 66 20 74 68 65 20 6c 65 61 66 20  ber of the leaf 
5440: 70 61 67 65 20 74 68 65 20 65 6e 74 72 79 20 70  page the entry p
5450: 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
5460: 20 20 74 65 72 6d 3a 20 20 20 41 20 73 70 6c 69    term:   A spli
5470: 74 2d 6b 65 79 20 74 68 61 74 20 61 6c 6c 20 74  t-key that all t
5480: 65 72 6d 73 20 6f 6e 20 6c 65 61 66 20 70 61 67  erms on leaf pag
5490: 65 20 24 69 4c 65 61 66 20 6d 75 73 74 20 62 65  e $iLeaf must be
54a0: 20 67 72 65 61 74 65 72 0a 2a 2a 20 20 20 20 20   greater.**     
54b0: 20 20 20 20 20 20 74 68 61 6e 20 6f 72 20 65 71        than or eq
54c0: 75 61 6c 20 74 6f 2e 20 54 68 65 20 22 74 65 72  ual to. The "ter
54d0: 6d 22 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  m" associated wi
54e0: 74 68 20 74 68 65 20 66 69 72 73 74 20 62 2d 74  th the first b-t
54f0: 72 65 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ree.**          
5500: 20 68 69 65 72 61 72 63 68 79 20 65 6e 74 72 79   hierarchy entry
5510: 20 28 74 68 65 20 6f 6e 65 20 74 68 61 74 20 70   (the one that p
5520: 6f 69 6e 74 73 20 74 6f 20 6c 65 61 66 20 70 61  oints to leaf pa
5530: 67 65 20 31 29 20 69 73 20 61 6c 77 61 79 73 20  ge 1) is always 
5540: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 6e  .**           an
5550: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a   empty string..*
5560: 2a 0a 2a 2a 20 20 20 6e 45 6d 70 74 79 3a 20 54  *.**   nEmpty: T
5570: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70  he number of emp
5580: 74 79 20 28 74 65 72 6d 6c 65 73 73 29 20 6c 65  ty (termless) le
5590: 61 66 20 70 61 67 65 73 20 74 68 61 74 20 69 6d  af pages that im
55a0: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20  mediately.**    
55b0: 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67         following
55c0: 20 69 4c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 54 68   iLeaf..**.** Th
55d0: 65 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20  e Fts5BtreeIter 
55e0: 6f 62 6a 65 63 74 20 69 73 20 6f 6e 6c 79 20 75  object is only u
55f0: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
5600: 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
5610: 63 6b 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 72 75  ck code..*/.stru
5620: 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65 72  ct Fts5BtreeIter
5630: 4c 65 76 65 6c 20 7b 0a 20 20 46 74 73 35 4e 6f  Level {.  Fts5No
5640: 64 65 49 74 65 72 20 73 3b 20 20 20 20 20 20 20  deIter s;       
5650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
5660: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63 75  rator for the cu
5670: 72 72 65 6e 74 20 6e 6f 64 65 20 2a 2f 0a 20 20  rrent node */.  
5680: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  /* Data for the 
56b0: 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 2a 2f 0a  current node */.
56c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 42 74  };.struct Fts5Bt
56d0: 72 65 65 49 74 65 72 20 7b 0a 20 20 46 74 73 35  reeIter {.  Fts5
56e0: 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
5700: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
5710: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
5720: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
5730: 65 67 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61  eg;     /* Itera
5740: 74 65 20 74 68 72 6f 75 67 68 20 74 68 69 73 20  te through this 
5750: 73 65 67 6d 65 6e 74 27 73 20 62 2d 74 72 65 65  segment's b-tree
5760: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20   */.  int iIdx; 
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 70        /* Index p
5790: 53 65 67 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  Seg belongs to *
57a0: 2f 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 20 20 20  /.  int nLvl;   
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
57d0: 4c 76 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Lvl[] array */. 
57e0: 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65   Fts5BtreeIterLe
57f0: 76 65 6c 20 2a 61 4c 76 6c 3b 20 20 20 20 20 20  vel *aLvl;      
5800: 20 2f 2a 20 4c 65 76 65 6c 20 66 6f 72 20 65 61   /* Level for ea
5810: 63 68 20 74 69 65 72 20 6f 66 20 62 2d 74 72 65  ch tier of b-tre
5820: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  e */..  /* Outpu
5830: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  t variables */. 
5840: 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
5850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5860: 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d   /* Current term
5870: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 3b   */.  int iLeaf;
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 63 6f        /* Leaf co
58a0: 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 73 20 3e  ntaining terms >
58b0: 3d 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  = current term *
58c0: 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20  /.  int nEmpty; 
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
58f0: 20 22 65 6d 70 74 79 22 20 6c 65 61 76 65 73 20   "empty" leaves 
5900: 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66 20  following iLeaf 
5910: 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20  */.  int bEof;  
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
5940: 72 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20  rue at EOF */.  
5950: 69 6e 74 20 62 44 6c 69 64 78 3b 20 20 20 20 20  int bDlidx;     
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5970: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
5980: 20 65 78 69 73 74 73 20 61 20 64 6c 69 64 78 20   exists a dlidx 
5990: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  */.};.../*.** De
59a0: 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64  code a segment-d
59b0: 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74  ata rowid from t
59c0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
59d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
59e0: 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74  s.** the opposit
59f0: 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f  e of macro FTS5_
5a00: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e  SEGMENT_ROWID().
5a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a20: 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
5a30: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20  .  i64 iRowid,  
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d     /* Rowid from
5a60: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
5a70: 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 2c 20 20  .  int *piIdx,  
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6e 64 65 78     /* OUT: Index
5aa0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67   */.  int *piSeg
5ab0: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
5ac0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
5ad0: 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
5ae0: 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20  t *piHeight,    
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5b00: 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a   OUT: Height */.
5b10: 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20    int *piPgno   
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e    /* OUT: Page n
5b40: 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70  umber */.){.  *p
5b50: 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52  iPgno = (int)(iR
5b60: 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
5b70: 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47  << FTS5_DATA_PAG
5b80: 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  E_B) - 1));.  iR
5b90: 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
5ba0: 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70  TA_PAGE_B;..  *p
5bb0: 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28  iHeight = (int)(
5bc0: 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
5bd0: 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48  1 << FTS5_DATA_H
5be0: 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a  EIGHT_B) - 1));.
5bf0: 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
5c00: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b  5_DATA_HEIGHT_B;
5c10: 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28  ..  *piSegid = (
5c20: 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
5c30: 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
5c40: 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b  ATA_ID_B) - 1));
5c50: 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
5c60: 53 35 5f 44 41 54 41 5f 49 44 5f 42 3b 0a 0a 20  S5_DATA_ID_B;.. 
5c70: 20 2a 70 69 49 64 78 20 3d 20 28 69 6e 74 29 28   *piIdx = (int)(
5c80: 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
5c90: 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
5ca0: 44 58 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a  DX_B) - 1));.}..
5cb0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
5cc0: 44 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a  DebugRowid(int *
5cd0: 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
5ce0: 2a 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29  *pBuf, i64 iKey)
5cf0: 7b 0a 20 20 69 6e 74 20 69 49 64 78 2c 69 53 65  {.  int iIdx,iSe
5d00: 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e  gid,iHeight,iPgn
5d10: 6f 3b 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d  o;  /* Rowid com
5d20: 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73  penents */.  fts
5d30: 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65  5DecodeRowid(iKe
5d40: 79 2c 20 26 69 49 64 78 2c 20 26 69 53 65 67 69  y, &iIdx, &iSegi
5d50: 64 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50  d, &iHeight, &iP
5d60: 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  gno);..  if( iSe
5d70: 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  gid==0 ){.    if
5d80: 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45  ( iKey==FTS5_AVE
5d90: 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20  RAGES_ROWID ){. 
5da0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
5db0: 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
5dc0: 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28  tf(pRc, pBuf, "(
5dd0: 61 76 65 72 61 67 65 73 29 20 22 29 3b 0a 20 20  averages) ");.  
5de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
5df0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
5e00: 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
5e10: 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , pBuf, .       
5e20: 20 20 20 22 7b 73 74 72 75 63 74 75 72 65 20 69     "{structure i
5e30: 64 78 3d 25 64 7d 22 2c 20 28 69 6e 74 29 28 69  dx=%d}", (int)(i
5e40: 4b 65 79 2d 31 30 29 0a 20 20 20 20 20 20 29 3b  Key-10).      );
5e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73  .    }.  }.  els
5e60: 65 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d 46  e if( iHeight==F
5e70: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f  TS5_SEGMENT_MAX_
5e80: 48 45 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71  HEIGHT ){.    sq
5e90: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
5ea0: 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
5eb0: 20 70 42 75 66 2c 20 22 28 64 6c 69 64 78 20 69   pBuf, "(dlidx i
5ec0: 64 78 3d 25 64 20 73 65 67 69 64 3d 25 64 20 70  dx=%d segid=%d p
5ed0: 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20 20 20 20  gno=%d)",.      
5ee0: 20 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20    iIdx, iSegid, 
5ef0: 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d  iPgno.    );.  }
5f00: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
5f10: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
5f20: 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
5f30: 66 2c 20 22 28 69 64 78 3d 25 64 20 73 65 67 69  f, "(idx=%d segi
5f40: 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25  d=%d h=%d pgno=%
5f50: 64 29 22 2c 0a 20 20 20 20 20 20 20 20 69 49 64  d)",.        iId
5f60: 78 2c 20 69 53 65 67 69 64 2c 20 69 48 65 69 67  x, iSegid, iHeig
5f70: 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b  ht, iPgno.    );
5f80: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
5f90: 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72  oid fts5DebugStr
5fa0: 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70  ucture(.  int *p
5fb0: 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
5fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
5fd0: 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
5fe0: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
5ff0: 2a 70 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72  *pBuf,.  Fts5Str
6000: 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69  ucture *p.){.  i
6010: 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20  nt iLvl, iSeg;  
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6030: 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
6040: 68 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e  h levels, segmen
6050: 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76  ts */..  for(iLv
6060: 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65  l=0; iLvl<p->nLe
6070: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
6080: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
6090: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d  evel *pLvl = &p-
60a0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
60b0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
60c0: 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
60d0: 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20  (pRc, pBuf, .   
60e0: 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e       " {lvl=%d n
60f0: 4d 65 72 67 65 3d 25 64 22 2c 20 69 4c 76 6c 2c  Merge=%d", iLvl,
6100: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20   pLvl->nMerge.  
6110: 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65    );.    for(iSe
6120: 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e  g=0; iSeg<pLvl->
6130: 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
6140: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
6150: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
6160: 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
6170: 65 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg];.      sqlit
6180: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
6190: 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
61a0: 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  uf, .          "
61b0: 20 7b 69 64 3d 25 64 20 68 3d 25 64 20 6c 65 61   {id=%d h=%d lea
61c0: 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 70 53  ves=%d..%d}", pS
61d0: 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67  eg->iSegid, pSeg
61e0: 2d 3e 6e 48 65 69 67 68 74 2c 20 0a 20 20 20 20  ->nHeight, .    
61f0: 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
6200: 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e  First, pSeg->pgn
6210: 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20  oLast.      );. 
6220: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6230: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
6240: 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
6250: 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  , "}");.  }.}...
6260: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6270: 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74  5PutU16(u8 *aOut
6280: 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61  , u16 iVal){.  a
6290: 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e  Out[0] = (iVal>>
62a0: 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20  8);.  aOut[1] = 
62b0: 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a  (iVal&0xFF);.}..
62c0: 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35 47  static u16 fts5G
62d0: 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a  etU16(const u8 *
62e0: 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  aIn){.  return (
62f0: 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38  (u16)aIn[0] << 8
6300: 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a 2f  ) + aIn[1];.}../
6310: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
6320: 64 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65  d return a buffe
6330: 72 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65  r at least nByte
6340: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
6350: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
6360: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
6370: 65 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ered, return NUL
6380: 4c 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72  L and set the er
6390: 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74  ror code in.** t
63a0: 68 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  he Fts5Index han
63b0: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
63c0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
63d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
63e0: 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28   *fts5IdxMalloc(
63f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
6400: 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64  t nByte){.  void
6410: 20 2a 70 52 65 74 3b 0a 20 20 61 73 73 65 72 74   *pRet;.  assert
6420: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6430: 4f 4b 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 73  OK );.  pRet = s
6440: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
6450: 79 74 65 29 3b 0a 20 20 69 66 28 20 70 52 65 74  yte);.  if( pRet
6460: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ==0 ){.    p->rc
6470: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6480: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
6490: 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42  mset(pRet, 0, nB
64a0: 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
64b0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pRet;.}.../*.
64c0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63  ** Compare the c
64d0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
64e0: 4c 65 66 74 20 62 75 66 66 65 72 20 77 69 74 68  Left buffer with
64f0: 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67   the pRight/nRig
6500: 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52  ht blob..**.** R
6510: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
6520: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
6530: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
6540: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
6550: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
6560: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
6570: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
6580: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
6590: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
65a0: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
65b0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
65c0: 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a  ferCompareBlob(.
65d0: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c    Fts5Buffer *pL
65e0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
65f0: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73    /* Left hand s
6600: 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ide of compariso
6610: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
6620: 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69  *pRight, int nRi
6630: 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ght    /* Right 
6640: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d  hand side of com
6650: 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  parison */.){.  
6660: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
6670: 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29  Left->n, nRight)
6680: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
6690: 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70  mcmp(pLeft->p, p
66a0: 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20  Right, nCmp);.  
66b0: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
66c0: 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69   (pLeft->n - nRi
66d0: 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a  ght) : res);.}..
66e0: 23 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74  #if 0.static int
66f0: 20 66 74 73 35 43 6f 6d 70 61 72 65 42 6c 6f 62   fts5CompareBlob
6700: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c  (.  const u8 *pL
6710: 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 0a  eft, int nLeft,.
6720: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67    const u8 *pRig
6730: 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29  ht, int nRight.)
6740: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
6750: 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74  IN(nLeft, nRight
6760: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
6770: 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69  emcmp(pLeft, pRi
6780: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
6790: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
67a0: 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20  nLeft - nRight) 
67b0: 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66  : res);.}.#endif
67c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
67d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
67e0: 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20  the two buffers 
67f0: 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
6800: 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a  If one buffer.**
6810: 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
6820: 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73  the other, it is
6830: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20   considered the 
6840: 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  lesser..**.** Re
6850: 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66  turn -ve if pLef
6860: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
6870: 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74  n pRight, 0 if t
6880: 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72  hey are equal or
6890: 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68  .** +ve if pRigh
68a0: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
68b0: 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65  n pLeft. In othe
68c0: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  r words:.**.**  
68d0: 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20     res = *pLeft 
68e0: 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61  - *pRight.*/.sta
68f0: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
6900: 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75  erCompare(Fts5Bu
6910: 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73  ffer *pLeft, Fts
6920: 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74 29  5Buffer *pRight)
6930: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
6940: 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69  IN(pLeft->n, pRi
6950: 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72  ght->n);.  int r
6960: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66  es = memcmp(pLef
6970: 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c  t->p, pRight->p,
6980: 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e   nCmp);.  return
6990: 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66   (res==0 ? (pLef
69a0: 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e  t->n - pRight->n
69b0: 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a  ) : res);.}.../*
69c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
69d0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
69e0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
69f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
6a00: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
6a10: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
6a20: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
6a30: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
6a40: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e  3_blob_close(p->
6a50: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 70 2d  pReader);.    p-
6a60: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
6a70: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35  }.}..static Fts5
6a80: 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52 65  Data *fts5DataRe
6a90: 61 64 4f 72 42 75 66 66 65 72 28 0a 20 20 46 74  adOrBuffer(.  Ft
6aa0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
6ab0: 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
6ac0: 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29   .  i64 iRowid.)
6ad0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52  {.  Fts5Data *pR
6ae0: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  et = 0;.  if( p-
6af0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
6b00: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  {.    int rc = S
6b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30  QLITE_OK;..#if 0
6b20: 0a 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20  .Fts5Buffer buf 
6b30: 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 66 74 73 35 44  = {0,0,0};.fts5D
6b40: 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26  ebugRowid(&rc, &
6b50: 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 66 70  buf, iRowid);.fp
6b60: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72  rintf(stdout, "r
6b70: 65 61 64 3a 20 25 73 5c 6e 22 2c 20 62 75 66 2e  ead: %s\n", buf.
6b80: 70 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75  p);.fflush(stdou
6b90: 74 29 3b 0a 73 71 6c 69 74 65 33 5f 66 72 65 65  t);.sqlite3_free
6ba0: 28 62 75 66 2e 70 29 3b 0a 23 65 6e 64 69 66 0a  (buf.p);.#endif.
6bb0: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64      if( p->pRead
6bc0: 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  er ){.      /* T
6bd0: 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74  his call may ret
6be0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
6bf0: 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
6c00: 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20  en a savepoint. 
6c10: 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
6c20: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
6c30: 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73  st used. In this
6c40: 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62   case a new blob
6c50: 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a   handle.      **
6c60: 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
6c70: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
6c80: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
6c90: 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 69 52 6f  (p->pReader, iRo
6ca0: 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
6cb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  rc==SQLITE_ABORT
6cc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
6cd0: 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
6ce0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
6cf0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
6d00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
6d10: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
6d20: 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
6d30: 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65 65 6b 20  , open and seek 
6d40: 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  it. Otherwise, u
6d50: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6c  se.    ** the bl
6d60: 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41 50 49 20  ob_reopen() API 
6d70: 74 6f 20 72 65 73 65 65 6b 20 74 68 65 20 65 78  to reseek the ex
6d80: 69 73 74 69 6e 67 20 62 6c 6f 62 20 68 61 6e 64  isting blob hand
6d90: 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
6da0: 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 7b  p->pReader==0 ){
6db0: 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e 66 69  .      Fts5Confi
6dc0: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
6dd0: 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20 72  pConfig;.      r
6de0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
6df0: 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64  _open(pConfig->d
6e00: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43  b, .          pC
6e10: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
6e20: 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22  DataTbl, "block"
6e30: 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26 70 2d  , iRowid, 0, &p-
6e40: 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20 20 29  >pReader.      )
6e50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
6e60: 20 72 63 20 29 20 66 74 73 35 4d 69 73 73 69 6e   rc ) fts5Missin
6e70: 67 44 61 74 61 28 29 3b 0a 0a 20 20 20 20 69 66  gData();..    if
6e80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6e90: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
6ea0: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  te = sqlite3_blo
6eb0: 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61 64  b_bytes(p->pRead
6ec0: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
6ed0: 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Buf ){.        f
6ee0: 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42  ts5BufferZero(pB
6ef0: 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  uf);.        fts
6f00: 35 42 75 66 66 65 72 47 72 6f 77 28 26 72 63 2c  5BufferGrow(&rc,
6f10: 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
6f20: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
6f30: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d  te3_blob_read(p-
6f40: 3e 70 52 65 61 64 65 72 2c 20 70 42 75 66 2d 3e  >pReader, pBuf->
6f50: 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  p, nByte, 0);.  
6f60: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6f70: 4c 49 54 45 5f 4f 4b 20 29 20 70 42 75 66 2d 3e  LITE_OK ) pBuf->
6f80: 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  n = nByte;.     
6f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6fa0: 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74 61  pRet = (Fts5Data
6fb0: 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
6fc0: 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61  p, sizeof(Fts5Da
6fd0: 74 61 29 20 2b 20 6e 42 79 74 65 29 3b 0a 20 20  ta) + nByte);.  
6fe0: 20 20 20 20 20 20 69 66 28 20 21 70 52 65 74 20        if( !pRet 
6ff0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
7000: 20 20 20 20 20 70 52 65 74 2d 3e 6e 20 3d 20 6e       pRet->n = n
7010: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52  Byte;.        pR
7020: 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 52  et->p = (u8*)&pR
7030: 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 70  et[1];.        p
7040: 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Ret->nRef = 1;. 
7050: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7060: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d  te3_blob_read(p-
7070: 3e 70 52 65 61 64 65 72 2c 20 70 52 65 74 2d 3e  >pReader, pRet->
7080: 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  p, nByte, 0);.  
7090: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
70a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
70b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
70c0: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
70d0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
70e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
70f0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d     }.    p->rc =
7100: 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61   rc;.    p->nRea
7110: 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  d++;.  }..  retu
7120: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
7130: 2a 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63  * Retrieve a rec
7140: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ord from the %_d
7150: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ata table..**.**
7160: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
7170: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
7180: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
7190: 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a  or left in the .
71a0: 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  ** Fts5Index obj
71b0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ect..*/.static F
71c0: 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74  ts5Data *fts5Dat
71d0: 61 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  aRead(Fts5Index 
71e0: 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  *p, i64 iRowid){
71f0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65  .  Fts5Data *pRe
7200: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
7210: 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20 69  OrBuffer(p, 0, i
7220: 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72 74  Rowid);.  assert
7230: 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d  ( (pRet==0)==(p-
7240: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  >rc!=SQLITE_OK) 
7250: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
7260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
7270: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
7280: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
7290: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73  nto the buffer s
72a0: 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a  upplied as the.*
72b0: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
72c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
72d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
72e0: 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69 6e  error is left in
72f0: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
7300: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
7310: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
7320: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
7330: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
7340: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
7350: 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73   .** no-op..*/.s
7360: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
7370: 61 74 61 42 75 66 66 65 72 28 46 74 73 35 49 6e  ataBuffer(Fts5In
7380: 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66 66  dex *p, Fts5Buff
7390: 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 52  er *pBuf, i64 iR
73a0: 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 66  owid){.  (void)f
73b0: 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66  ts5DataReadOrBuf
73c0: 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52 6f  fer(p, pBuf, iRo
73d0: 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  wid);.}../*.** R
73e0: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
73f0: 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72  ce to data recor
7400: 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  d returned by an
7410: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
7420: 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64  .** fts5DataRead
7430: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
7440: 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  id fts5DataRelea
7450: 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61  se(Fts5Data *pDa
7460: 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61 74 61  ta){.  if( pData
7470: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7480: 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30 20 29 3b  pData->nRef>0 );
7490: 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 52 65 66  .    pData->nRef
74a0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74  --;.    if( pDat
74b0: 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  a->nRef==0 ) sql
74c0: 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29  ite3_free(pData)
74d0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
74e0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 66  void fts5DataRef
74f0: 65 72 65 6e 63 65 28 46 74 73 35 44 61 74 61 20  erence(Fts5Data 
7500: 2a 70 44 61 74 61 29 7b 0a 20 20 70 44 61 74 61  *pData){.  pData
7510: 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nRef++;.}../*.
7520: 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50  ** INSERT OR REP
7530: 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e  LACE a record in
7540: 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  to the %_data ta
7550: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
7560: 6f 69 64 20 66 74 73 35 44 61 74 61 57 72 69 74  oid fts5DataWrit
7570: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
7580: 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73  i64 iRowid, cons
7590: 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74  t u8 *pData, int
75a0: 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70   nData){.  if( p
75b0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
75c0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
75d0: 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29   p->pWriter==0 )
75e0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
75f0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
7600: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
7610: 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ig;.    char *zS
7620: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
7630: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 52  intf(.        "R
7640: 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71 27  EPLACE INTO '%q'
7650: 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56  .%Q(id, block) V
7660: 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70 43 6f  ALUES(?,?)", pCo
7670: 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
7680: 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20  ataTbl.    );.  
7690: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
76a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
76b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
76c0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
76d0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
76e0: 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  v2(pConfig->db, 
76f0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 57  zSql, -1, &p->pW
7700: 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  riter, 0);.     
7710: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
7720: 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
7730: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7740: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
7750: 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
7760: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
7770: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7780: 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20  t64(p->pWriter, 
7790: 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71  1, iRowid);.  sq
77a0: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
77b0: 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70  p->pWriter, 2, p
77c0: 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c  Data, nData, SQL
77d0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
77e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
77f0: 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63  Writer);.  p->rc
7800: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
7810: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a  (p->pWriter);.}.
7820: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  ./*.** Execute t
7830: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
7840: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45  :.**.**     DELE
7850: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57  TE FROM %_data W
7860: 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20  HERE id BETWEEN 
7870: 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61  $iFirst AND $iLa
7880: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  st.*/.static voi
7890: 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65  d fts5DataDelete
78a0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
78b0: 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69  64 iFirst, i64 i
78c0: 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Last){.  if( p->
78d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
78e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
78f0: 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  ->pDeleter==0 ){
7900: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
7910: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
7920: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
7930: 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  g;.    char *zSq
7940: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
7950: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 44 45  ntf(.        "DE
7960: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 25  LETE FROM '%q'.%
7970: 51 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e  Q WHERE id>=? AN
7980: 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66 69  D id<=?", pConfi
7990: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
79a0: 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Tbl.    );.    i
79b0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
79c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
79d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
79e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
79f0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7a00: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
7a10: 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65  l, -1, &p->pDele
7a20: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
7a30: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
7a40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7a50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7a60: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
7a70: 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
7a80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
7a90: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
7aa0: 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31  4(p->pDeleter, 1
7ab0: 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71 6c  , iFirst);.  sql
7ac0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
7ad0: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c 20  p->pDeleter, 2, 
7ae0: 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  iLast);.  sqlite
7af0: 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74  3_step(p->pDelet
7b00: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
7b10: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
7b20: 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  pDeleter);.}../*
7b30: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 73 71  .** Close the sq
7b40: 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e 64 6c  lite3_blob handl
7b50: 65 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 72  e used to read r
7b60: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
7b70: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a  %_data table..**
7b80: 20 41 6e 64 20 64 69 73 63 61 72 64 20 61 6e 79   And discard any
7b90: 20 63 61 63 68 65 64 20 72 65 61 64 73 2e 20 54   cached reads. T
7ba0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7bb0: 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 65 6e  called at the en
7bc0: 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64 20 74  d of.** a read t
7bd0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 77 68  ransaction or wh
7be0: 65 6e 20 61 6e 79 20 73 75 62 2d 74 72 61 6e 73  en any sub-trans
7bf0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
7c00: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
7c10: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
7c20: 73 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  set(Fts5Index *p
7c30: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  ){.  if( p->pRea
7c40: 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  der ){.    sqlit
7c50: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d  e3_blob_close(p-
7c60: 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 70  >pReader);.    p
7c70: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
7c80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
7c90: 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61  ve all records a
7ca0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
7cb0: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 20 69 6e  egment iSegid in
7cc0: 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2f 0a   index iIdx..*/.
7cd0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7ce0: 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e  DataRemoveSegmen
7cf0: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
7d00: 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53  int iIdx, int iS
7d10: 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69  egid){.  i64 iFi
7d20: 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  rst = FTS5_SEGME
7d30: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69  NT_ROWID(iIdx, i
7d40: 53 65 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20  Segid, 0, 0);.  
7d50: 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35  i64 iLast = FTS5
7d60: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
7d70: 49 64 78 2c 20 69 53 65 67 69 64 2b 31 2c 20 30  Idx, iSegid+1, 0
7d80: 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61  , 0)-1;.  fts5Da
7d90: 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72  taDelete(p, iFir
7da0: 73 74 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a 2f  st, iLast);.}../
7db0: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
7dc0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
7dd0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
7de0: 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
7df0: 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a  d in serialized.
7e00: 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62  ** form within b
7e10: 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74  uffer pData/nDat
7e20: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  a..**.** The Fts
7e30: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
7e40: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
7e50: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
7e60: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
7e70: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
7e80: 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20  ed by one slot. 
7e90: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
7ea0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e  structure conten
7eb0: 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65  ts.** to be more
7ec0: 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a   easily edited..
7ed0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
7ee0: 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74  r occurs, *ppOut
7ef0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
7f00: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
7f10: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75  ror code.** retu
7f20: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
7f30: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
7f40: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
7f50: 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a  ew object and.**
7f60: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
7f70: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
7f80: 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65  nt fts5Structure
7f90: 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  Decode(.  const 
7fa0: 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  u8 *pData,      
7fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
7fc0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  fer containing s
7fd0: 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74  erialized struct
7fe0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ure */.  int nDa
7ff0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
8000: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8010: 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74 61   of buffer pData
8020: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46   in bytes */.  F
8030: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
8040: 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f  pOut           /
8050: 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69  * OUT: Deseriali
8060: 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  zed object */.){
8070: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8080: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d  TE_OK;.  int i =
8090: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a   0;.  int iLvl;.
80a0: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30    int nLevel = 0
80b0: 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  ;.  int nSegment
80c0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74   = 0;.  int nByt
80d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
80e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
80f0: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
8100: 6f 63 61 74 65 20 2a 2f 0a 20 20 46 74 73 35 53  ocate */.  Fts5S
8110: 74 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d  tructure *pRet =
8120: 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   0;..  /* Read t
8130: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8140: 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65  of levels and se
8150: 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
8160: 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a  start of the.  *
8170: 2a 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  * structure reco
8180: 72 64 2e 20 55 73 65 20 74 68 65 73 65 20 76 61  rd. Use these va
8190: 6c 75 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  lues to allocate
81a0: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 64   space for the d
81b0: 65 73 65 72 69 61 6c 69 7a 65 64 0a 20 20 2a 2a  eserialized.  **
81c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
81d0: 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 20 3d  record. */.  i =
81e0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44   getVarint32(&pD
81f0: 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b  ata[i], nLevel);
8200: 0a 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e  .  i += getVarin
8210: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
8220: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74  Segment);.  nByt
8230: 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65  e = (.      size
8240: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
8250: 29 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f  ) + .      sizeo
8260: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
8270: 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b  evel) * (nLevel+
8280: 31 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f  1) +.      sizeo
8290: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
82a0: 65 67 6d 65 6e 74 29 20 2a 20 28 6e 53 65 67 6d  egment) * (nSegm
82b0: 65 6e 74 2b 6e 4c 65 76 65 6c 2b 31 29 0a 20 20  ent+nLevel+1).  
82c0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73  );.  pRet = (Fts
82d0: 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69  5Structure*)sqli
82e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
82f0: 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29  );..  if( pRet )
8300: 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65  {.    u8 *pSpace
8310: 20 3d 20 28 75 38 2a 29 26 70 52 65 74 2d 3e 61   = (u8*)&pRet->a
8320: 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 2b 31 5d 3b  Level[nLevel+1];
8330: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74  .    memset(pRet
8340: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
8350: 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pRet->nLevel = 
8360: 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 20 2b 3d  nLevel;.    i +=
8370: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
8380: 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52  t(&pData[i], &pR
8390: 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  et->nWriteCounte
83a0: 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  r);.    for(iLvl
83b0: 3d 30 3b 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b  =0; iLvl<nLevel;
83c0: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
83d0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
83e0: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74  el *pLvl = &pRet
83f0: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
8400: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c        int nTotal
8410: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
8420: 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65  ;..      i += ge
8430: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
8440: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  [i], pLvl->nMerg
8450: 65 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 67  e);.      i += g
8460: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
8470: 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20  a[i], nTotal);. 
8480: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f       assert( nTo
8490: 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67  tal>=pLvl->nMerg
84a0: 65 20 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  e );.      pLvl-
84b0: 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a  >nSeg = nTotal;.
84c0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67        pLvl->aSeg
84d0: 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
84e0: 65 53 65 67 6d 65 6e 74 2a 29 70 53 70 61 63 65  eSegment*)pSpace
84f0: 3b 0a 20 20 20 20 20 20 70 53 70 61 63 65 20 2b  ;.      pSpace +
8500: 3d 20 28 28 6e 54 6f 74 61 6c 2b 31 29 20 2a 20  = ((nTotal+1) * 
8510: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
8520: 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 0a  tureSegment));..
8530: 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
8540: 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69  ; iSeg<nTotal; i
8550: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
8560: 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
8570: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
8580: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
8590: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69 20  gid);.        i 
85a0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
85b0: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
85c0: 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67  aSeg[iSeg].nHeig
85d0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b  ht);.        i +
85e0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
85f0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
8600: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69  Seg[iSeg].pgnoFi
8610: 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 20  rst);.        i 
8620: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
8630: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
8640: 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c  aSeg[iSeg].pgnoL
8650: 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ast);.      }.  
8660: 20 20 7d 0a 20 20 20 20 70 52 65 74 2d 3e 61 4c    }.    pRet->aL
8670: 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2e 61 53 65  evel[nLevel].aSe
8680: 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
8690: 72 65 53 65 67 6d 65 6e 74 2a 29 70 53 70 61 63  reSegment*)pSpac
86a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
86b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
86c0: 4d 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74  M;.  }..  *ppOut
86d0: 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72   = pRet;.  retur
86e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
86f0: 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65  ead, deserialize
8700: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
8710: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
8720: 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78 2e   for index iIdx.
8730: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
8740: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
8750: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
8760: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
8770: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
8780: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
8790: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f   as described fo
87a0: 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53  r function fts5S
87b0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29  tructureDecode()
87c0: 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a   .** above..**.*
87d0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
87e0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
87f0: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
8800: 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e  ror code left in
8810: 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65   the.** Fts5Inde
8820: 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20  x handle. If an 
8830: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
8840: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
8850: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
8860: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
8870: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
8880: 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75  atic Fts5Structu
8890: 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72  re *fts5Structur
88a0: 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  eRead(Fts5Index 
88b0: 2a 70 2c 20 69 6e 74 20 69 49 64 78 29 7b 0a 20  *p, int iIdx){. 
88c0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
88d0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
88e0: 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  g;.  Fts5Structu
88f0: 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20  re *pRet = 0;   
8900: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
8910: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74  o return */.  Ft
8920: 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20  s5Data *pData;  
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8940: 20 25 5f 64 61 74 61 20 65 6e 74 72 79 20 63 6f   %_data entry co
8950: 6e 74 61 69 6e 69 6e 67 20 73 74 72 75 63 74 75  ntaining structu
8960: 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20  re record */..  
8970: 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43  assert( iIdx<=pC
8980: 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29  onfig->nPrefix )
8990: 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35  ;.  pData = fts5
89a0: 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
89b0: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
89c0: 28 69 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21  (iIdx));.  if( !
89d0: 70 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 30  pData ) return 0
89e0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35  ;.  p->rc = fts5
89f0: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
8a00: 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d  pData->p, pData-
8a10: 3e 6e 2c 20 26 70 52 65 74 29 3b 0a 0a 20 20 66  >n, &pRet);..  f
8a20: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
8a30: 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
8a40: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
8a50: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
8a60: 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72  ce to an Fts5Str
8a70: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65  ucture object re
8a80: 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72  turned by an ear
8a90: 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f  lier .** call to
8aa0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
8ab0: 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75  ad() or fts5Stru
8ac0: 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a  ctureDecode()..*
8ad0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
8ae0: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8af0: 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65  se(Fts5Structure
8b00: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 73 71   *pStruct){.  sq
8b10: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
8b20: 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ct);.}../*.** Re
8b30: 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
8b40: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
8b50: 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63  s in index struc
8b60: 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2f  ture pStruct..*/
8b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8b80: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
8b90: 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63  gments(Fts5Struc
8ba0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
8bb0: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
8bc0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8bd0: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
8be0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  r of segments */
8bf0: 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20  .  int iLvl;    
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
8c20: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
8c30: 76 65 6c 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  vels */..  for(i
8c40: 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
8c50: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
8c60: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 53 65 67 6d 65  l++){.    nSegme
8c70: 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61  nt += pStruct->a
8c80: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
8c90: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8ca0: 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  nSegment;.}../*.
8cb0: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64  ** Serialize and
8cc0: 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75   store the "stru
8cd0: 63 74 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f  cture" record fo
8ce0: 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a  r index iIdx..**
8cf0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
8d00: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
8d10: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74   error code in t
8d20: 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  he Fts5Index obj
8d30: 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ect. If an.** er
8d40: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
8d50: 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
8d60: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
8d70: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
8d80: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
8d90: 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
8da0: 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74  *p, int iIdx, Ft
8db0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
8dc0: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65  ruct){.  int nSe
8dd0: 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  gment;          
8de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
8df0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
8e00: 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 42 75  ents */.  Fts5Bu
8e10: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
8e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
8e30: 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65  fer to serialize
8e40: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a   record into */.
8e50: 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20    int iLvl;     
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e70: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
8e80: 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
8e90: 65 6c 73 20 2a 2f 0a 0a 20 20 6e 53 65 67 6d 65  els */..  nSegme
8ea0: 6e 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  nt = fts5Structu
8eb0: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
8ec0: 70 53 74 72 75 63 74 29 3b 0a 20 20 6d 65 6d 73  pStruct);.  mems
8ed0: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
8ee0: 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
8ef0: 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
8f00: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
8f10: 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d  , &buf, pStruct-
8f20: 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 66 74 73 35  >nLevel);.  fts5
8f30: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8f40: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8f50: 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 66 74   nSegment);.  ft
8f60: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
8f70: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
8f80: 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74 2d  f, (i64)pStruct-
8f90: 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b  >nWriteCounter);
8fa0: 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20  ..  for(iLvl=0; 
8fb0: 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
8fc0: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
8fd0: 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20     int iSeg;    
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
9000: 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d  ate through segm
9010: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 46 74 73 35  ents */.    Fts5
9020: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
9030: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
9040: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
9050: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
9060: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
9070: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d  , &buf, pLvl->nM
9080: 65 72 67 65 29 3b 0a 20 20 20 20 66 74 73 35 42  erge);.    fts5B
9090: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
90a0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
90b0: 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20  pLvl->nSeg);.   
90c0: 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e   assert( pLvl->n
90d0: 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65  Merge<=pLvl->nSe
90e0: 67 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 53  g );..    for(iS
90f0: 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d  eg=0; iSeg<pLvl-
9100: 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  >nSeg; iSeg++){.
9110: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9120: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9130: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9140: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
9150: 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  id);.      fts5B
9160: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
9170: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
9180: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
9190: 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20  .nHeight);.     
91a0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
91b0: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
91c0: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
91d0: 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74  [iSeg].pgnoFirst
91e0: 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
91f0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
9200: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
9210: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
9220: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a  gnoLast);.    }.
9230: 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 57    }..  fts5DataW
9240: 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52  rite(p, FTS5_STR
9250: 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69 49 64  UCTURE_ROWID(iId
9260: 78 29 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e  x), buf.p, buf.n
9270: 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
9280: 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 23 69  ree(&buf);.}..#i
9290: 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f 0.static void 
92a0: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
92b0: 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
92c0: 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72  Caption, Fts5Str
92d0: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
92e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
92f0: 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75  ITE_OK;.  Fts5Bu
9300: 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73  ffer buf;.  mems
9310: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
9320: 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35  of(buf));.  fts5
9330: 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 26  DebugStructure(&
9340: 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63  rc, &buf, pStruc
9350: 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  t);.  fprintf(st
9360: 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22  dout, "%s: %s\n"
9370: 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e  , zCaption, buf.
9380: 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64  p);.  fflush(std
9390: 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66  out);.  fts5Buff
93a0: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
93b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
93c0: 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72  ts5PrintStructur
93d0: 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f  e(x,y).#endif../
93e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f  *.** Return a co
93f0: 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75  py of index stru
9400: 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 45  cture pStruct. E
9410: 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61  xcept, promote a
9420: 73 20 6d 61 6e 79 20 73 65 67 6d 65 6e 74 73 0a  s many segments.
9430: 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74  ** as possible t
9440: 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65  o level iPromote
9450: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  . If an OOM occu
9460: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
9470: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
9480: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
9490: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46  rePromoteTo(.  F
94a0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
94b0: 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69  nt iPromote,.  i
94c0: 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20  nt szPromote,.  
94d0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
94e0: 53 74 72 75 63 74 0a 29 7b 0a 20 20 46 74 73 35  Struct.){.  Fts5
94f0: 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 3b  Structure *pNew;
9500: 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b 0a 20  .  u8 *pSpace;. 
9510: 20 69 6e 74 20 6e 53 65 67 20 3d 20 66 74 73 35   int nSeg = fts5
9520: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
9530: 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 3b  gments(pStruct);
9540: 0a 20 20 69 6e 74 20 6e 4c 76 6c 20 3d 20 70 53  .  int nLvl = pS
9550: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  truct->nLevel;. 
9560: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20   int nByte = (. 
9570: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
9580: 53 74 72 75 63 74 75 72 65 29 20 2b 20 0a 20 20  Structure) + .  
9590: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
95a0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
95b0: 20 28 6e 4c 76 6c 2b 31 29 20 2b 0a 20 20 20 20   (nLvl+1) +.    
95c0: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
95d0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
95e0: 20 28 6e 53 65 67 2b 6e 4c 76 6c 2b 31 29 0a 20   (nSeg+nLvl+1). 
95f0: 20 29 3b 0a 20 20 69 6e 74 20 69 54 73 74 3b 0a   );.  int iTst;.
9600: 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64  .  pNew = fts5Id
9610: 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65  xMalloc(p, nByte
9620: 29 3b 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29  );.  if( !pNew )
9630: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d   return;.  pNew-
9640: 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d  >nWriteCounter =
9650: 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
9660: 43 6f 75 6e 74 65 72 3b 0a 20 20 70 4e 65 77 2d  Counter;.  pNew-
9670: 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
9680: 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 70 53 70  t->nLevel;.  pSp
9690: 61 63 65 20 3d 20 28 75 38 2a 29 26 70 4e 65 77  ace = (u8*)&pNew
96a0: 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 76 6c 2b 31 5d  ->aLevel[nLvl+1]
96b0: 3b 0a 0a 20 20 66 6f 72 28 69 54 73 74 3d 30 3b  ;..  for(iTst=0;
96c0: 20 69 54 73 74 3c 6e 4c 76 6c 3b 20 69 54 73 74   iTst<nLvl; iTst
96d0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ++){.    int nCo
96e0: 70 79 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  py;.    Fts5Stru
96f0: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
9700: 4f 75 74 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65  Out = &pNew->aLe
9710: 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 70  vel[iTst];.    p
9720: 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 20 3d 20 28  LvlOut->aSeg = (
9730: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9740: 6d 65 6e 74 2a 29 70 53 70 61 63 65 3b 0a 0a 20  ment*)pSpace;.. 
9750: 20 20 20 69 66 28 20 69 54 73 74 3d 3d 69 50 72     if( iTst==iPr
9760: 6f 6d 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 69  omote ){.      i
9770: 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 20 20 20  nt il, is;.     
9780: 20 69 6e 74 20 6e 53 65 67 43 6f 70 79 20 3d 20   int nSegCopy = 
9790: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  0;..      /* Fig
97a0: 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
97b0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
97c0: 68 61 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 6d  hat will be prom
97d0: 6f 74 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 66  oted. */.      f
97e0: 6f 72 28 69 6c 3d 69 54 73 74 2b 31 3b 20 69 6c  or(il=iTst+1; il
97f0: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
9800: 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; il++){.       
9810: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9820: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
9830: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d  ruct->aLevel[il]
9840: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
9850: 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 62 72 65  vl->nMerge ) bre
9860: 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ak;.        for(
9870: 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b  is=pLvl->nSeg-1;
9880: 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20   is>=0; is--){. 
9890: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
98a0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
98b0: 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
98c0: 67 5b 69 73 5d 3b 0a 20 20 20 20 20 20 20 20 20  g[is];.         
98d0: 20 69 6e 74 20 73 7a 20 3d 20 70 53 65 67 2d 3e   int sz = pSeg->
98e0: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
98f0: 3e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a  >pgnoFirst + 1;.
9900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a            if( sz
9910: 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 7b 0a 20 20  >szPromote ){.  
9920: 20 20 20 20 20 20 20 20 20 20 69 6c 20 3d 20 70            il = p
9930: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a  Struct->nLevel;.
9940: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9950: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
9960: 20 20 20 20 20 20 20 20 20 6e 53 65 67 43 6f 70           nSegCop
9970: 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  y++;.        }. 
9980: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9990: 65 72 74 28 20 6e 53 65 67 43 6f 70 79 3e 30 20  ert( nSegCopy>0 
99a0: 29 3b 0a 20 20 20 20 20 20 70 53 70 61 63 65 20  );.      pSpace 
99b0: 2b 3d 20 28 6e 53 65 67 43 6f 70 79 20 2a 20 73  += (nSegCopy * s
99c0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
99d0: 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20  ureSegment));.  
99e0: 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65      pLvlOut->nSe
99f0: 67 20 3d 20 6e 53 65 67 43 6f 70 79 3b 0a 0a 20  g = nSegCopy;.. 
9a00: 20 20 20 20 20 66 6f 72 28 69 6c 3d 69 54 73 74       for(il=iTst
9a10: 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e  +1; il<pStruct->
9a20: 6e 4c 65 76 65 6c 20 26 26 20 6e 53 65 67 43 6f  nLevel && nSegCo
9a30: 70 79 3e 30 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20  py>0; il++){.   
9a40: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
9a50: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
9a60: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9a70: 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 20 20 66 6f  [il];.        fo
9a80: 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d  r(is=pLvl->nSeg-
9a90: 31 3b 20 69 73 3e 3d 30 20 26 26 20 6e 53 65 67  1; is>=0 && nSeg
9aa0: 43 6f 70 79 3e 30 3b 20 69 73 2d 2d 29 7b 0a 20  Copy>0; is--){. 
9ab0: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
9ac0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
9ad0: 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
9ae0: 67 5b 69 73 5d 3b 0a 20 20 20 20 20 20 20 20 20  g[is];.         
9af0: 20 6e 53 65 67 43 6f 70 79 2d 2d 3b 0a 20 20 20   nSegCopy--;.   
9b00: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
9b10: 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 6e 53 65  LvlOut->aSeg[nSe
9b20: 67 43 6f 70 79 5d 2c 20 70 53 65 67 2c 20 73 69  gCopy], pSeg, si
9b30: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
9b40: 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20  reSegment));.   
9b50: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
9b60: 67 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  g--;.        }. 
9b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9b80: 65 72 74 28 20 6e 53 65 67 43 6f 70 79 3d 3d 30  ert( nSegCopy==0
9b90: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e   );.    }..    n
9ba0: 43 6f 70 79 20 3d 20 70 53 74 72 75 63 74 2d 3e  Copy = pStruct->
9bb0: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65  aLevel[iTst].nSe
9bc0: 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  g * sizeof(Fts5S
9bd0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
9be0: 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 70 79 20  ;.    if( nCopy 
9bf0: 29 20 6d 65 6d 63 70 79 28 70 53 70 61 63 65 2c  ) memcpy(pSpace,
9c00: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
9c10: 5b 69 54 73 74 5d 2e 61 53 65 67 2c 20 6e 43 6f  [iTst].aSeg, nCo
9c20: 70 79 29 3b 0a 20 20 20 20 70 53 70 61 63 65 20  py);.    pSpace 
9c30: 2b 3d 20 28 6e 43 6f 70 79 20 2b 20 73 69 7a 65  += (nCopy + size
9c40: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
9c50: 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 70  Segment));.    p
9c60: 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 20 2b 3d 20  LvlOut->nSeg += 
9c70: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9c80: 69 54 73 74 5d 2e 6e 53 65 67 3b 0a 20 20 7d 0a  iTst].nSeg;.  }.
9c90: 0a 20 20 66 74 73 35 50 72 69 6e 74 53 74 72 75  .  fts5PrintStru
9ca0: 63 74 75 72 65 28 22 4e 45 57 22 2c 20 70 4e 65  cture("NEW", pNe
9cb0: 77 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 53 74  w);.  memcpy(pSt
9cc0: 72 75 63 74 2c 20 70 4e 65 77 2c 20 6e 42 79 74  ruct, pNew, nByt
9cd0: 65 29 3b 0a 20 20 66 6f 72 28 69 54 73 74 3d 30  e);.  for(iTst=0
9ce0: 3b 20 69 54 73 74 3c 70 4e 65 77 2d 3e 6e 4c 65  ; iTst<pNew->nLe
9cf0: 76 65 6c 3b 20 69 54 73 74 2b 2b 29 7b 0a 20 20  vel; iTst++){.  
9d00: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4e 65    int iOff = pNe
9d10: 77 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e  w->aLevel[iTst].
9d20: 61 53 65 67 20 2d 20 28 46 74 73 35 53 74 72 75  aSeg - (Fts5Stru
9d30: 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 70 4e  ctureSegment*)pN
9d40: 65 77 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  ew;.    pStruct-
9d50: 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 61 53  >aLevel[iTst].aS
9d60: 65 67 20 3d 20 26 28 28 46 74 73 35 53 74 72 75  eg = &((Fts5Stru
9d70: 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 70 53  ctureSegment*)pS
9d80: 74 72 75 63 74 29 5b 69 4f 66 66 5d 3b 0a 20 20  truct)[iOff];.  
9d90: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
9da0: 28 70 4e 65 77 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (pNew);.}../*.**
9db0: 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68   A new segment h
9dc0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69  as just been wri
9dd0: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c  tten to level iL
9de0: 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75  vl of index stru
9df0: 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74  cture.** pStruct
9e00: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
9e10: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e  determines if an
9e20: 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c  y segments shoul
9e30: 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a  d be promoted.**
9e40: 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65   as a result. Se
9e50: 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f  gments are promo
9e60: 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61  ted in two scena
9e70: 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
9e80: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
9e90: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
9ea0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65  smaller than one
9eb0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
9ec0: 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e  s.**      within
9ed0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f   the previous po
9ee0: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69  pulated level, i
9ef0: 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f  t is promoted to
9f00: 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a   the previous.**
9f10: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
9f20: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62  level..**.**   b
9f30: 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74  ) If the segment
9f40: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73   just written is
9f50: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
9f60: 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20   newest segment 
9f70: 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e  on.**      the n
9f80: 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65  ext populated le
9f90: 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73  vel, then that s
9fa0: 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20  egment, and any 
9fb0: 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a  other adjacent.*
9fc0: 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20  *      segments 
9fd0: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d  that are also sm
9fe0: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f  aller than the o
9ff0: 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  ne just written,
a000: 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72   are .**      pr
a010: 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49  omoted. .**.** I
a020: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65  f one or more se
a030: 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f  gments are promo
a040: 74 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75  ted, the structu
a050: 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64  re object is upd
a060: 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65  ated.** to refle
a070: 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  ct this..*/.stat
a080: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
a090: 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20  cturePromote(.  
a0a0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
a0d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
a0e0: 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iLvl,           
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a100: 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20  ndex level just 
a110: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73  updated */.  Fts
a120: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
a130: 75 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uct          /* 
a140: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
a150: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
a160: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a170: 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20      int iTst;.  
a180: 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d    int iPromote =
a190: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50   -1;.    int szP
a1a0: 72 6f 6d 6f 74 65 3b 20 20 20 20 20 20 20 20 20  romote;         
a1b0: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74         /* Promot
a1c0: 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20  e anything this 
a1d0: 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20  size or smaller 
a1e0: 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  */.    Fts5Struc
a1f0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
a200: 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20  g;   /* Segment 
a210: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
a220: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
a230: 65 4c 65 76 65 6c 20 2a 70 54 73 74 3b 0a 20 20  eLevel *pTst;.  
a240: 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20    int szSeg;    
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a260: 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65  /* Size of segme
a270: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
a280: 2a 2f 0a 0a 0a 20 20 20 20 70 53 65 67 20 3d 20  */...    pSeg = 
a290: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
a2a0: 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72  [iLvl].aSeg[pStr
a2b0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
a2c0: 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73  ].nSeg-1];.    s
a2d0: 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67  zSeg = (1 + pSeg
a2e0: 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65  ->pgnoLast - pSe
a2f0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a  g->pgnoFirst);..
a300: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
a310: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a   condition (a) *
a320: 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69  /.    for(iTst=i
a330: 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26  Lvl-1; iTst>=0 &
a340: 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
a350: 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b  l[iTst].nSeg==0;
a360: 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 70 54   iTst--);.    pT
a370: 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  st = &pStruct->a
a380: 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20  Level[iTst];.   
a390: 20 69 66 28 20 69 54 73 74 3e 3d 30 20 26 26 20   if( iTst>=0 && 
a3a0: 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20  pTst->nMerge==0 
a3b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a3c0: 20 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20        int szMax 
a3d0: 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 0;.      for(i
a3e0: 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67  =0; i<pTst->nSeg
a3f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a400: 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61  int sz = pTst->a
a410: 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20  Seg[i].pgnoLast 
a420: 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  - pTst->aSeg[i].
a430: 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20  pgnoFirst + 1;. 
a440: 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a         if( sz>sz
a450: 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a  Max ) szMax = sz
a460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a470: 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67  if( szMax>=szSeg
a480: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
a490: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20  ondition (a) is 
a4a0: 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68  true. Promote th
a4b0: 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74  e newest segment
a4c0: 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20 20   on level .     
a4d0: 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65     ** iLvl to le
a4e0: 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20  vel iTst.  */.  
a4f0: 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d        iPromote =
a500: 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20 73   iTst;.        s
a510: 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78  zPromote = szMax
a520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a530: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
a540: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 62 29 20  r condition (b) 
a550: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d  */.    if( iProm
a560: 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 46  ote<0 ){.      F
a570: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
a580: 6c 20 2a 70 54 73 74 3b 0a 20 20 20 20 20 20 66  l *pTst;.      f
a590: 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2b 31 3b 20  or(iTst=iLvl+1; 
a5a0: 69 54 73 74 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iTst<pStruct->nL
a5b0: 65 76 65 6c 3b 20 69 54 73 74 2b 2b 29 7b 0a 20  evel; iTst++){. 
a5c0: 20 20 20 20 20 20 20 70 54 73 74 20 3d 20 26 70         pTst = &p
a5d0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a5e0: 54 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  Tst];.        if
a5f0: 28 20 70 54 73 74 2d 3e 6e 53 65 67 20 29 20 62  ( pTst->nSeg ) b
a600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a610: 20 20 20 20 69 66 28 20 69 54 73 74 3c 70 53 74      if( iTst<pSt
a620: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 26 26 20  ruct->nLevel && 
a630: 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20  pTst->nMerge==0 
a640: 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
a650: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
a660: 2a 70 53 65 67 32 20 3d 20 26 70 54 73 74 2d 3e  *pSeg2 = &pTst->
a670: 61 53 65 67 5b 70 54 73 74 2d 3e 6e 53 65 67 2d  aSeg[pTst->nSeg-
a680: 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  1];.        int 
a690: 73 7a 20 3d 20 70 53 65 67 32 2d 3e 70 67 6e 6f  sz = pSeg2->pgno
a6a0: 4c 61 73 74 20 2d 20 70 53 65 67 32 2d 3e 70 67  Last - pSeg2->pg
a6b0: 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20  noFirst + 1;.   
a6c0: 20 20 20 20 20 69 66 28 20 73 7a 3c 3d 73 7a 53       if( sz<=szS
a6d0: 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  eg ){.          
a6e0: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b  iPromote = iLvl;
a6f0: 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 72 6f  .          szPro
a700: 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20  mote = szSeg;.  
a710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a720: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
a730: 20 69 50 72 6f 6d 6f 74 65 20 69 73 20 67 72 65   iPromote is gre
a740: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
a750: 61 6c 20 74 6f 20 7a 65 72 6f 20 61 74 20 74 68  al to zero at th
a760: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
a770: 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
a780: 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 6f 66 20  level number of 
a790: 61 20 6c 65 76 65 6c 20 74 6f 20 77 68 69 63 68  a level to which
a7a0: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 63   segments that c
a7b0: 6f 6e 73 69 73 74 20 6f 66 0a 20 20 20 20 2a 2a  onsist of.    **
a7c0: 20 73 7a 50 72 6f 6d 6f 74 65 20 6f 72 20 66 65   szPromote or fe
a7d0: 77 65 72 20 70 61 67 65 73 20 73 68 6f 75 6c 64  wer pages should
a7e0: 20 62 65 20 70 72 6f 6d 6f 74 65 64 2e 20 2a 2f   be promoted. */
a7f0: 20 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d 6f   .    if( iPromo
a800: 74 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  te>=0 ){.      f
a810: 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72  ts5PrintStructur
a820: 65 28 22 42 45 46 4f 52 45 22 2c 20 70 53 74 72  e("BEFORE", pStr
a830: 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  uct);.      fts5
a840: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
a850: 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20  To(p, iPromote, 
a860: 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75  szPromote, pStru
a870: 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 50  ct);.      fts5P
a880: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 22 41  rintStructure("A
a890: 46 54 45 52 22 2c 20 70 53 74 72 75 63 74 29 3b  FTER", pStruct);
a8a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
a8b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 49 74 65  *.** If the pIte
a8c0: 72 2d 3e 69 4f 66 66 20 6f 66 66 73 65 74 20 63  r->iOff offset c
a8d0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
a8e0: 74 6f 20 61 6e 20 65 6e 74 72 79 20 69 6e 64 69  to an entry indi
a8f0: 63 61 74 69 6e 67 20 6f 6e 65 0a 2a 2a 20 6f 72  cating one.** or
a900: 20 6d 6f 72 65 20 74 65 72 6d 2d 6c 65 73 73 20   more term-less 
a910: 6e 6f 64 65 73 2c 20 61 64 76 61 6e 63 65 20 70  nodes, advance p
a920: 61 73 74 20 69 74 20 61 6e 64 20 73 65 74 20 70  ast it and set p
a930: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 74 6f 0a  Iter->nEmpty to.
a940: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
a950: 20 65 6d 70 74 79 20 63 68 69 6c 64 20 6e 6f 64   empty child nod
a960: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
a970: 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47  id fts5NodeIterG
a980: 6f 62 62 6c 65 4e 45 6d 70 74 79 28 46 74 73 35  obbleNEmpty(Fts5
a990: 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72 29  NodeIter *pIter)
a9a0: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  {.  if( pIter->i
a9b0: 4f 66 66 3c 70 49 74 65 72 2d 3e 6e 44 61 74 61  Off<pIter->nData
a9c0: 20 26 26 20 30 3d 3d 28 70 49 74 65 72 2d 3e 61   && 0==(pIter->a
a9d0: 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66  Data[pIter->iOff
a9e0: 5d 20 26 20 30 78 66 65 29 20 29 7b 0a 20 20 20  ] & 0xfe) ){.   
a9f0: 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d   pIter->bDlidx =
aa00: 20 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49   pIter->aData[pI
aa10: 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78 30  ter->iOff] & 0x0
aa20: 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f  1;.    pIter->iO
aa30: 66 66 2b 2b 3b 0a 20 20 20 20 70 49 74 65 72 2d  ff++;.    pIter-
aa40: 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69  >iOff += getVari
aa50: 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61  nt32(&pIter->aDa
aa60: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  ta[pIter->iOff],
aa70: 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b   pIter->nEmpty);
aa80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
aa90: 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b  ter->nEmpty = 0;
aaa0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69  .    pIter->bDli
aab0: 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  dx = 0;.  }.}../
aac0: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20  *.** Advance to 
aad0: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 77  the next entry w
aae0: 69 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a  ithin the node..
aaf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ab00: 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
ab10: 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 4e 6f  int *pRc, Fts5No
ab20: 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  deIter *pIter){.
ab30: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66    if( pIter->iOf
ab40: 66 3e 3d 70 49 74 65 72 2d 3e 6e 44 61 74 61 20  f>=pIter->nData 
ab50: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 44  ){.    pIter->aD
ab60: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  ata = 0;.    pIt
ab70: 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 70 49  er->iChild += pI
ab80: 74 65 72 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20 7d  ter->nEmpty;.  }
ab90: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 50  else{.    int nP
aba0: 72 65 2c 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49  re, nNew;.    pI
abb0: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74  ter->iOff += get
abc0: 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
abd0: 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f  >aData[pIter->iO
abe0: 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20  ff], nPre);.    
abf0: 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67  pIter->iOff += g
ac00: 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
ac10: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
ac20: 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
ac30: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
ac40: 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20 66 74  = nPre-2;.    ft
ac50: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
ac60: 6f 62 28 70 52 63 2c 20 26 70 49 74 65 72 2d 3e  ob(pRc, &pIter->
ac70: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49 74 65  term, nNew, pIte
ac80: 72 2d 3e 61 44 61 74 61 2b 70 49 74 65 72 2d 3e  r->aData+pIter->
ac90: 69 4f 66 66 29 3b 0a 20 20 20 20 70 49 74 65 72  iOff);.    pIter
aca0: 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a  ->iOff += nNew;.
acb0: 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69 6c      pIter->iChil
acc0: 64 20 2b 3d 20 28 31 20 2b 20 70 49 74 65 72 2d  d += (1 + pIter-
acd0: 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 66 74  >nEmpty);.    ft
ace0: 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65  s5NodeIterGobble
acf0: 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 20  NEmpty(pIter);. 
ad00: 20 20 20 69 66 28 20 2a 70 52 63 20 29 20 70 49     if( *pRc ) pI
ad10: 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b 0a  ter->aData = 0;.
ad20: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e    }.}.../*.** In
ad30: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65  itialize the ite
ad40: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74  rator object pIt
ad50: 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  er to iterate th
ad60: 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6e  rough the intern
ad70: 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6e 6f  al.** segment no
ad80: 64 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a 2f 0a  de in pData..*/.
ad90: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ada0: 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 63 6f 6e  NodeIterInit(con
adb0: 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 69 6e  st u8 *aData, in
adc0: 74 20 6e 44 61 74 61 2c 20 46 74 73 35 4e 6f 64  t nData, Fts5Nod
add0: 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
ade0: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
adf0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
ae00: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44 61 74  );.  pIter->aDat
ae10: 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 49 74  a = aData;.  pIt
ae20: 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74  er->nData = nDat
ae30: 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  a;.  pIter->iOff
ae40: 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
ae50: 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 69 43 68  Data, pIter->iCh
ae60: 69 6c 64 29 3b 0a 20 20 66 74 73 35 4e 6f 64 65  ild);.  fts5Node
ae70: 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79  IterGobbleNEmpty
ae80: 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pIter);.}../*.*
ae90: 2a 20 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f 72  * Free any memor
aea0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  y allocated by t
aeb0: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
aec0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
aed0: 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46  id fts5NodeIterF
aee0: 72 65 65 28 46 74 73 35 4e 6f 64 65 49 74 65 72  ree(Fts5NodeIter
aef0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35   *pIter){.  fts5
af00: 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65  BufferFree(&pIte
af10: 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  r->term);.}../*.
af20: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
af30: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
af40: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61 73  rst argument has
af50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
af60: 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73 20  ields set.** as 
af70: 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66 75  follows. This fu
af80: 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20 74  nction sets up t
af90: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
afa0: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
afb0: 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  it.** points to 
afc0: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
afd0: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  in the doclist-i
afe0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44  ndex..**.**   pD
aff0: 61 74 61 3a 20 70 6f 69 6e 74 65 72 20 74 6f 20  ata: pointer to 
b000: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65  doclist-index re
b010: 63 6f 72 64 2c 20 0a 2a 2a 20 20 20 69 4c 65 61  cord, .**   iLea
b020: 66 50 67 6e 6f 3a 20 70 61 67 65 20 6e 75 6d 62  fPgno: page numb
b030: 65 72 20 74 68 61 74 20 74 68 69 73 20 64 6f 63  er that this doc
b040: 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 61 73  list-index is as
b050: 73 6f 63 69 61 74 65 64 20 77 69 74 68 2e 0a 2a  sociated with..*
b060: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b070: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
b080: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b090: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 61 74  Iter){.  Fts5Dat
b0a0: 61 20 2a 70 44 61 74 61 20 3d 20 70 49 74 65 72  a *pData = pIter
b0b0: 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  ->pData;.  int i
b0c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
b0d0: 65 72 2d 3e 70 44 61 74 61 20 29 3b 0a 20 20 61  er->pData );.  a
b0e0: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c  ssert( pIter->iL
b0f0: 65 61 66 50 67 6e 6f 3e 30 20 29 3b 0a 0a 20 20  eafPgno>0 );..  
b100: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
b110: 62 65 72 20 6f 66 20 6c 65 61 64 69 6e 67 20 30  ber of leading 0
b120: 78 30 30 20 62 79 74 65 73 2e 20 54 68 65 6e 20  x00 bytes. Then 
b130: 73 65 74 20 69 4c 65 61 66 50 67 6e 6f 2e 20 2a  set iLeafPgno. *
b140: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
b150: 44 61 74 61 2d 3e 6e 3b 20 69 2b 2b 29 7b 20 0a  Data->n; i++){ .
b160: 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70      if( pData->p
b170: 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  [i] ) break;.  }
b180: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
b190: 67 6e 6f 20 2b 3d 20 28 69 2b 31 29 3b 0a 20 20  gno += (i+1);.  
b1a0: 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 69 3b  pIter->iOff = i;
b1b0: 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 77 65  ..  /* Unless we
b1c0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 74 20   are already at 
b1d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
b1e0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 6c 6f  oclist-index, lo
b1f0: 61 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  ad the first.  *
b200: 2a 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 20  * rowid value.  
b210: 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
b220: 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b  iOff<pData->n ){
b230: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
b240: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
b250: 44 61 74 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69  Data->p[pIter->i
b260: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
b270: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d  er->iRowid);.  }
b280: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
b290: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 0a 20  >bEof = 1;.  }. 
b2a0: 20 70 49 74 65 72 2d 3e 69 46 69 72 73 74 4f 66   pIter->iFirstOf
b2b0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66 66 3b  f = pIter->iOff;
b2c0: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b2d0: 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >bEof;.}../*.** 
b2e0: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
b2f0: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
b300: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
b310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b320: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
b330: 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t(Fts5DlidxIter 
b340: 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44  *pIter){.  Fts5D
b350: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 49 74  ata *pData = pIt
b360: 65 72 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e 74  er->pData;.  int
b370: 20 69 4f 66 66 3b 0a 0a 20 20 66 6f 72 28 69 4f   iOff;..  for(iO
b380: 66 66 3d 70 49 74 65 72 2d 3e 69 4f 66 66 3b 20  ff=pIter->iOff; 
b390: 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 3b 20 69  iOff<pData->n; i
b3a0: 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Off++){.    if( 
b3b0: 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29  pData->p[iOff] )
b3c0: 20 62 72 65 61 6b 3b 20 0a 20 20 7d 0a 0a 20 20   break; .  }..  
b3d0: 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  if( iOff<pData->
b3e0: 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61  n ){.    i64 iVa
b3f0: 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  l;.    pIter->iL
b400: 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66  eafPgno += (iOff
b410: 20 2d 20 70 49 74 65 72 2d 3e 69 4f 66 66 29 20   - pIter->iOff) 
b420: 2b 20 31 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  + 1;.    iOff +=
b430: 20 67 65 74 56 61 72 69 6e 74 28 26 70 44 61 74   getVarint(&pDat
b440: 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  a->p[iOff], (u64
b450: 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 49  *)&iVal);.    pI
b460: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  ter->iRowid -= i
b470: 56 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Val;.    pIter->
b480: 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 7d  iOff = iOff;.  }
b490: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
b4a0: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 0a 0a  >bEof = 1;.  }..
b4b0: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
b4c0: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
b4d0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
b4e0: 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
b4f0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
b500: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
b510: 72 6e 20 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rn (p->rc!=SQLIT
b520: 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 62  E_OK || pIter->b
b530: 45 6f 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Eof);.}..static 
b540: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
b550: 65 72 4c 61 73 74 28 46 74 73 35 44 6c 69 64 78  erLast(Fts5Dlidx
b560: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b570: 69 66 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  if( fts5DlidxIte
b580: 72 46 69 72 73 74 28 70 49 74 65 72 29 3d 3d 30  rFirst(pIter)==0
b590: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 30   ){.    while( 0
b5a0: 3d 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  ==fts5DlidxIterN
b5b0: 65 78 74 28 70 49 74 65 72 29 20 29 3b 0a 20 20  ext(pIter) );.  
b5c0: 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
b5d0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
b5e0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
b5f0: 65 72 50 72 65 76 28 46 74 73 35 44 6c 69 64 78  erPrev(Fts5Dlidx
b600: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b610: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
b620: 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  ->iOff;..  asser
b630: 74 28 20 70 49 74 65 72 2d 3e 62 45 6f 66 3d 3d  t( pIter->bEof==
b640: 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c  0 );.  if( iOff<
b650: 3d 70 49 74 65 72 2d 3e 69 46 69 72 73 74 4f 66  =pIter->iFirstOf
b660: 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
b670: 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  bEof = 1;.  }els
b680: 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  e{.    u8 *a = p
b690: 49 74 65 72 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a  Iter->pData->p;.
b6a0: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
b6b0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 0a 20    int iLimit;.. 
b6c0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20     /* Currently 
b6d0: 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74  iOff points to t
b6e0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
b6f0: 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20   a varint. This 
b700: 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65  block .    ** de
b710: 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e  crements iOff un
b720: 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
b730: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
b740: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
b750: 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20  .    ** varint. 
b760: 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20  Taking care not 
b770: 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f  to read any memo
b780: 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61  ry locations tha
b790: 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62  t occur.    ** b
b7a0: 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  efore the buffer
b7b0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a   in memory.  */.
b7c0: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f      iLimit = (iO
b7d0: 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20  ff>9 ? iOff-9 : 
b7e0: 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66  0);.    for(iOff
b7f0: 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b  --; iOff>iLimit;
b800: 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20   iOff--){.      
b810: 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26  if( (a[iOff-1] &
b820: 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61   0x80)==0 ) brea
b830: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 67 65  k;.    }..    ge
b840: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
b850: 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a  , (u64*)&iVal);.
b860: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
b870: 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70  d += iVal;.    p
b880: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
b890: 2d 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69  -;..    while( i
b8a0: 4f 66 66 3e 70 49 74 65 72 2d 3e 69 46 69 72 73  Off>pIter->iFirs
b8b0: 74 4f 66 66 20 0a 20 20 20 20 20 20 20 20 26 26  tOff .        &&
b8c0: 20 61 5b 69 4f 66 66 2d 31 5d 3d 3d 30 78 30 30   a[iOff-1]==0x00
b8d0: 20 26 26 20 28 61 5b 69 4f 66 66 2d 32 5d 20 26   && (a[iOff-2] &
b8e0: 20 30 78 38 30 29 3d 3d 30 20 0a 20 20 20 20 29   0x80)==0 .    )
b8f0: 7b 0a 20 20 20 20 20 20 69 4f 66 66 2d 2d 3b 0a  {.      iOff--;.
b900: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
b910: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 7d 0a  afPgno--;.    }.
b920: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
b930: 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 72  = iOff;.  }..  r
b940: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f  eturn pIter->bEo
b950: 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  f;.}..static voi
b960: 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  d fts5DlidxIterI
b970: 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
b980: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b990: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42         /* Fts5 B
b9a0: 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
b9b0: 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e  e within */.  in
b9c0: 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9e0: 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20   True for ORDER 
b9f0: 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20  BY ASC */.  int 
ba00: 69 49 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64  iIdx, int iSegid
ba10: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
ba20: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 20 77 69  egment iSegid wi
ba30: 74 68 69 6e 20 69 6e 64 65 78 20 69 49 64 78 20  thin index iIdx 
ba40: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
ba50: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
ba60: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
ba70: 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64  e number to load
ba80: 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 20 20   dlidx for */.  
ba90: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 2a  Fts5DlidxIter **
baa0: 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
bab0: 2f 2a 20 4f 55 54 3a 20 50 6f 70 75 6c 61 74 65  /* OUT: Populate
bac0: 64 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  d iterator */.){
bad0: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
bae0: 20 2a 70 49 74 65 72 20 3d 20 2a 70 70 49 74 65   *pIter = *ppIte
baf0: 72 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  r;.  Fts5Data *p
bb00: 44 6c 69 64 78 3b 0a 0a 20 20 70 44 6c 69 64 78  Dlidx;..  pDlidx
bb10: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
bb20: 70 2c 20 46 54 53 35 5f 44 4f 43 4c 49 53 54 5f  p, FTS5_DOCLIST_
bb30: 49 44 58 5f 52 4f 57 49 44 28 69 49 64 78 2c 20  IDX_ROWID(iIdx, 
bb40: 69 53 65 67 69 64 2c 20 69 4c 65 61 66 50 67 6e  iSegid, iLeafPgn
bb50: 6f 29 29 3b 0a 20 20 69 66 28 20 70 44 6c 69 64  o));.  if( pDlid
bb60: 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  x==0 ) return;. 
bb70: 20 69 66 28 20 70 49 74 65 72 3d 3d 30 20 29 7b   if( pIter==0 ){
bb80: 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70  .    *ppIter = p
bb90: 49 74 65 72 20 3d 20 28 46 74 73 35 44 6c 69 64  Iter = (Fts5Dlid
bba0: 78 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61  xIter*)fts5IdxMa
bbb0: 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
bbc0: 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a  ts5DlidxIter));.
bbd0: 20 20 20 20 69 66 28 20 70 49 74 65 72 3d 3d 30      if( pIter==0
bbe0: 20 29 7b 20 0a 20 20 20 20 20 20 66 74 73 35 44   ){ .      fts5D
bbf0: 61 74 61 52 65 6c 65 61 73 65 28 70 44 6c 69 64  ataRelease(pDlid
bc00: 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  x);.      return
bc10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
bc20: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
bc30: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
bc40: 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a 20 20  5DlidxIter));.  
bc50: 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 61 74  }..  pIter->pDat
bc60: 61 20 3d 20 70 44 6c 69 64 78 3b 0a 20 20 70 49  a = pDlidx;.  pI
bc70: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
bc80: 20 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 66   iLeafPgno;.  if
bc90: 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
bca0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69   fts5DlidxIterFi
bcb0: 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20 7d 65  rst(pIter);.  }e
bcc0: 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 6c 69  lse{.    fts5Dli
bcd0: 64 78 49 74 65 72 4c 61 73 74 28 70 49 74 65 72  dxIterLast(pIter
bce0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
bcf0: 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  Free a doclist-i
bd00: 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62  ndex iterator ob
bd10: 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62  ject allocated b
bd20: 79 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  y fts5DlidxIterI
bd30: 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nit()..*/.static
bd40: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
bd50: 74 65 72 46 72 65 65 28 46 74 73 35 44 6c 69 64  terFree(Fts5Dlid
bd60: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
bd70: 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
bd80: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
bd90: 65 28 70 49 74 65 72 2d 3e 70 44 61 74 61 29 3b  e(pIter->pData);
bda0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
bdb0: 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
bdc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
bdd0: 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65 20 69  next leaf page i
bde0: 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20  nto the segment 
bdf0: 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  iterator..*/.sta
be00: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
be10: 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20 20  IterNextPage(.  
be20: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
be50: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
be60: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
be70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
be80: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
be90: 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65 20  ce to next page 
bea0: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
beb0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
bec0: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
bed0: 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ;.  if( pIter->p
bee0: 4c 65 61 66 20 29 20 66 74 73 35 44 61 74 61 52  Leaf ) fts5DataR
bef0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
bf00: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  eaf);.  pIter->i
bf10: 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66  LeafPgno++;.  if
bf20: 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ( pIter->iLeafPg
bf30: 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  no<=pSeg->pgnoLa
bf40: 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  st ){.    pIter-
bf50: 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74  >pLeaf = fts5Dat
bf60: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
bf70: 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52    FTS5_SEGMENT_R
bf80: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64 78  OWID(pIter->iIdx
bf90: 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
bfa0: 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  0, pIter->iLeafP
bfb0: 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65  gno).    );.  }e
bfc0: 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
bfd0: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d  pLeaf = 0;.  }.}
bfe0: 0a 0a 2f 2a 0a 2a 2a 20 4c 65 61 76 65 20 70 49  ../*.** Leave pI
bff0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c000: 20 61 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   as the offset t
c010: 6f 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64  o the size field
c020: 20 6f 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   of the first.**
c030: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20   position list. 
c040: 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  The position lis
c050: 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64  t belonging to d
c060: 6f 63 75 6d 65 6e 74 20 70 49 74 65 72 2d 3e 69  ocument pIter->i
c070: 52 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  Rowid..*/.static
c080: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c090: 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e  rLoadTerm(Fts5In
c0a0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
c0b0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
c0c0: 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20  nKeep){.  u8 *a 
c0d0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c0e0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66  p;        /* Buf
c0f0: 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61  fer to read data
c100: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
c110: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
c120: 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66  afOffset;  /* Of
c130: 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74 20  fset to read at 
c140: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20  */.  int nNew;  
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
c170: 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20   new data */..  
c180: 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
c190: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e  t32(&a[iOff], nN
c1a0: 65 77 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65  ew);.  pIter->te
c1b0: 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  rm.n = nKeep;.  
c1c0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
c1d0: 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49  Blob(&p->rc, &pI
c1e0: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
c1f0: 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f   &a[iOff]);.  iO
c200: 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49  ff += nNew;.  pI
c210: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
c220: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70  fset = iOff;.  p
c230: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
c240: 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
c250: 61 66 50 67 6e 6f 3b 0a 20 20 69 66 28 20 69 4f  afPgno;.  if( iO
c260: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
c270: 2d 3e 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53  ->n ){.    fts5S
c280: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
c290: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  , pIter);.    if
c2a0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
c2b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
c2c0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c2d0: 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
c2e0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65  ORRUPT;.      re
c2f0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
c300: 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20  iOff = 4;.    a 
c310: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c320: 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d  p;.  }.  iOff +=
c330: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
c340: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
c350: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
c360: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
c370: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
c380: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
c390: 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ize the iterator
c3a0: 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
c3b0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
c3c0: 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a   the entries in.
c3d0: 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67 20  ** segment pSeg 
c3e0: 77 69 74 68 69 6e 20 69 6e 64 65 78 20 69 49 64  within index iId
c3f0: 78 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  x. The iterator 
c400: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
c410: 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73   to the .** firs
c420: 74 20 65 6e 74 72 79 20 77 68 65 6e 20 74 68 69  t entry when thi
c430: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
c440: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ns..**.** If an 
c450: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
c460: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
c470: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
c480: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
c490: 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
c4a0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
c4b0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
c4c0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
c4d0: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
c4e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c4f0: 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
c500: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
c510: 2c 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e  ,          .  in
c520: 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c540: 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20   Config.aHash[] 
c550: 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64  index of FTS ind
c560: 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ex */.  Fts5Stru
c570: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
c580: 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
c590: 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
c5a0: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
c5b0: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
c5c0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
c5d0: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
c5e0: 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70  ){.  if( pSeg->p
c5f0: 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20  gnoFirst==0 ){. 
c600: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
c610: 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e  ns if the segmen
c620: 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  t is being used 
c630: 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20 61  as an input to a
c640: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20  n incremental.  
c650: 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20 61    ** merge and a
c660: 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72 65  ll data has alre
c670: 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d 65  ady been "trimme
c680: 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  d". See function
c690: 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69 6d  .    ** fts5Trim
c6a0: 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20 64  Segments() for d
c6b0: 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20  etails. In this 
c6c0: 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20 69  case leave the i
c6d0: 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20  terator empty.. 
c6e0: 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
c6f0: 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28 70   will see the (p
c700: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20  Iter->pLeaf==0) 
c710: 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20 69  and assume the i
c720: 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 2a  terator is.    *
c730: 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * at EOF already
c740: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
c750: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
c760: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
c770: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
c780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c790: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c     memset(pIter,
c7a0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
c7b0: 72 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  r));.    pIter->
c7c0: 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20  pSeg = pSeg;.   
c7d0: 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20 69   pIter->iIdx = i
c7e0: 49 64 78 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Idx;.    pIter->
c7f0: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67  iLeafPgno = pSeg
c800: 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
c810: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
c820: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
c830: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
c840: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c850: 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74  .    u8 *a = pIt
c860: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
c870: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
c880: 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 55 31  fset = fts5GetU1
c890: 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 66 74  6(&a[2]);.    ft
c8a0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
c8b0: 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  m(p, pIter, 0);.
c8c0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
c8d0: 69 64 20 66 74 73 35 4c 65 61 66 48 65 61 64 65  id fts5LeafHeade
c8e0: 72 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61  r(Fts5Data *pLea
c8f0: 66 2c 20 69 6e 74 20 2a 70 69 52 6f 77 69 64 2c  f, int *piRowid,
c900: 20 69 6e 74 20 2a 70 69 54 65 72 6d 29 7b 0a 20   int *piTerm){. 
c910: 20 2a 70 69 52 6f 77 69 64 20 3d 20 28 69 6e 74   *piRowid = (int
c920: 29 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65  )fts5GetU16(&pLe
c930: 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 2a 70 69  af->p[0]);.  *pi
c940: 54 65 72 6d 20 3d 20 28 69 6e 74 29 66 74 73 35  Term = (int)fts5
c950: 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
c960: 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  [2]);.}../*.** T
c970: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c980: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
c990: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
c9a0: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74  eated by calls t
c9b0: 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75  o.** Fts5IndexQu
c9c0: 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46  ery() with the F
c9d0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 41  TS5INDEX_QUERY_A
c9e0: 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  SC flag set..**.
c9f0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
ca00: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
ca10: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
ca20: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
ca30: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 20 6f 6e 20  rst rowid.** on 
ca40: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
ca50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ca60: 20 74 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20   the term being 
ca70: 71 75 65 72 69 65 64 2e 20 54 68 69 73 20 66 75  queried. This fu
ca80: 6e 63 74 69 6f 6e 0a 2a 2a 20 61 64 76 61 6e 63  nction.** advanc
ca90: 65 73 20 69 74 20 74 6f 20 70 6f 69 6e 74 20 74  es it to point t
caa0: 6f 20 74 68 65 20 6c 61 73 74 20 73 75 63 68 20  o the last such 
cab0: 72 6f 77 69 64 20 61 6e 64 2c 20 69 66 20 6e 65  rowid and, if ne
cac0: 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c  cessary, initial
cad0: 69 7a 65 73 0a 2a 2a 20 74 68 65 20 61 52 6f 77  izes.** the aRow
cae0: 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69  idOffset[] and i
caf0: 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69  RowidOffset vari
cb00: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
cb10: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
cb20: 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
cb30: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
cb40: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
cb50: 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49  r){.  int n = pI
cb60: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 20  ter->pLeaf->n;. 
cb70: 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e   int i = pIter->
cb80: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75  iLeafOffset;.  u
cb90: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
cba0: 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52  eaf->p;.  int iR
cbb0: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a  owidOffset = 0;.
cbc0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
cbd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
cbe0: 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65  n ){.    i64 iDe
cbf0: 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  lta = 0;.    int
cc00: 20 6e 50 6f 73 3b 0a 0a 20 20 20 20 69 20 2b 3d   nPos;..    i +=
cc10: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b   getVarint32(&a[
cc20: 69 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 69  i], nPos);.    i
cc30: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 69 66   += nPos;.    if
cc40: 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a  ( i>=n ) break;.
cc50: 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69      i += getVari
cc60: 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29  nt(&a[i], (u64*)
cc70: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 69 66  &iDelta);.    if
cc80: 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62 72  ( iDelta==0 ) br
cc90: 65 61 6b 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  eak;.    pIter->
cca0: 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61  iRowid -= iDelta
ccb0: 3b 0a 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  ;..    if( iRowi
ccc0: 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e  dOffset>=pIter->
ccd0: 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a  nRowidOffset ){.
cce0: 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
ccf0: 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66   pIter->nRowidOf
cd00: 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20  fset + 8;.      
cd10: 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74  int *aNew = (int
cd20: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
cd30: 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  c(pIter->aRowidO
cd40: 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a 65  ffset, nNew*size
cd50: 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
cd60: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
cd70: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
cd80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
cd90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cda0: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
cdb0: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20  >aRowidOffset = 
cdc0: 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65  aNew;.      pIte
cdd0: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
cde0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20  = nNew;.    }.. 
cdf0: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
ce00: 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66  Offset[iRowidOff
ce10: 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e  set++] = pIter->
ce20: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
ce30: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
ce40: 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70  set = i;.  }.  p
ce50: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
ce60: 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65  et = iRowidOffse
ce70: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  t;.}../*.**.*/.s
ce80: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ce90: 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
cea0: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
ceb0: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
cec0: 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
ced0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
cee0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
cef0: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
cf00: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
cf10: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
cf20: 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74 73  NETERM );..  fts
cf30: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
cf40: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
cf50: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
cf60: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
cf70: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
cf80: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49  er->iLeafPgno>pI
cf90: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
cfa0: 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  no ){.    Fts5Da
cfb0: 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 49  ta *pNew;.    pI
cfc0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d  ter->iLeafPgno--
cfd0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73  ;.    pNew = fts
cfe0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
cff0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
d000: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
d010: 2d 3e 69 49 64 78 2c 20 70 49 74 65 72 2d 3e 70  ->iIdx, pIter->p
d020: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  Seg->iSegid, 0, 
d030: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d040: 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28  .    ));.    if(
d050: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69   pNew ){.      i
d060: 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  f( pIter->iLeafP
d070: 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72  gno==pIter->iTer
d080: 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  mLeafPgno ){.   
d090: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
d0a0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c  iTermLeafOffset<
d0b0: 70 4e 65 77 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  pNew->n ){.     
d0c0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
d0d0: 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  f = pNew;.      
d0e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d0f0: 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Offset = pIter->
d100: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
d110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d130: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 2c 20 64  int iRowidOff, d
d140: 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 66 74  ummy;.        ft
d150: 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4e 65  s5LeafHeader(pNe
d160: 77 2c 20 26 69 52 6f 77 69 64 4f 66 66 2c 20 26  w, &iRowidOff, &
d170: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
d180: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b  if( iRowidOff ){
d190: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
d1a0: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
d1b0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
d1c0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
d1d0: 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20  RowidOff;.      
d1e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
d1f0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
d200: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75  eaf ){.        u
d210: 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70  8 *a = &pIter->p
d220: 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69  Leaf->p[pIter->i
d230: 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20  LeafOffset];.   
d240: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
d250: 66 4f 66 66 73 65 74 20 2b 3d 20 67 65 74 56 61  fOffset += getVa
d260: 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 70  rint(a, (u64*)&p
d270: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
d280: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d2a0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
d2b0: 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  se(pNew);.      
d2c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
d2d0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
d2e0: 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ){.    fts5SegIt
d2f0: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
d300: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
d310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
d320: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
d330: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
d340: 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
d350: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d360: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d370: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d380: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d390: 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63   It .** is not c
d3a0: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
d3b0: 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
d3c0: 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20  or reaches EOF. 
d3d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
d3e0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
d3f0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
d400: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d410: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d430: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d440: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
d450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d460: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
d470: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
d480: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
d490: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
d4a0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
d4b0: 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20 69  dvance */.){.  i
d4c0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
d4d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
d4e0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
d4f0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
d500: 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  SE ){.      if( 
d510: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
d520: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  set>0 ){.       
d530: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
d540: 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20  pLeaf->p;.      
d550: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
d560: 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
d570: 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
d580: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
d590: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b  >iRowidOffset--;
d5a0: 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ..        pIter-
d5b0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
d5c0: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f  Off = pIter->aRo
d5d0: 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d  widOffset[pIter-
d5e0: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a  >iRowidOffset];.
d5f0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
d600: 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  getVarint32(&a[i
d610: 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  Off], nPos);.   
d620: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
d630: 73 3b 0a 20 20 20 20 20 20 20 20 67 65 74 56 61  s;.        getVa
d640: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
d650: 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
d660: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
d670: 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
d680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d690: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
d6a0: 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70  ReverseNewPage(p
d6b0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
d6c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d6d0: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
d6e0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
d6f0: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  f;.      int iOf
d700: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65  f;.      int bNe
d710: 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  wTerm = 0;.     
d720: 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a   int nKeep = 0;.
d730: 0a 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68  .      /* Search
d740: 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
d750: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
d760: 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  t within the cur
d770: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
d780: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 65 61      u8 *a = pLea
d790: 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  f->p;.      int 
d7a0: 6e 20 3d 20 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20  n = pLeaf->n;.. 
d7b0: 20 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65       iOff = pIte
d7c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
d7d0: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e        if( iOff<n
d7e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
d7f0: 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20  nPoslist;.      
d800: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
d810: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
d820: 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  nPoslist);.     
d830: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 6c     iOff += nPosl
d840: 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ist;.      }..  
d850: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
d860: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
d870: 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f   next entry is o
d880: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
d890: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 36  ge */.        u6
d8a0: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
d8b0: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
d8c0: 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  3GetVarint(&a[iO
d8d0: 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20  ff], &iDelta);. 
d8e0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
d8f0: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
d900: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 44  ;.        if( iD
d910: 65 6c 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  elta==0 ){.     
d920: 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20       bNewTerm = 
d930: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
d940: 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20   iOff>=n ){.    
d950: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
d960: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
d970: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
d980: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
d990: 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 20  ffset = 4;.     
d9a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
d9b0: 4f 66 66 21 3d 66 74 73 35 47 65 74 55 31 36 28  Off!=fts5GetU16(
d9c0: 26 61 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20  &a[2]) ){.      
d9d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
d9e0: 61 66 4f 66 66 73 65 74 20 2b 3d 20 67 65 74 56  afOffset += getV
d9f0: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
da00: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
da10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
da20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
da30: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20  Iter->iRowid -= 
da40: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
da50: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
da60: 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b         iOff = 0;
da70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  .        /* Next
da80: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
da90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
daa0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  e */.        whi
dab0: 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  le( iOff==0 ){. 
dac0: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
dad0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
dae0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
daf0: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
db00: 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20  >pLeaf;.        
db10: 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
db20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
db30: 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74    if( (iOff = ft
db40: 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
db50: 3e 70 5b 30 5d 29 29 20 29 7b 0a 20 20 20 20 20  >p[0])) ){.     
db60: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
db70: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
db80: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
db90: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
dba0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
dbb0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
dbc0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
dbd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dbe0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 69       else if( (i
dbf0: 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
dc00: 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 29 20  (&pLeaf->p[2])) 
dc10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
dc20: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
dc30: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
dc40: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
dc50: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
dc60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dc70: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  }..      /* Chec
dc80: 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  k if the iterato
dc90: 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e  r is now at EOF.
dca0: 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65   If so, return e
dcb0: 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  arly. */.      i
dcc0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
dcd0: 26 26 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20  && bNewTerm ){. 
dce0: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
dcf0: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
dd00: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
dd10: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
dd20: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
dd30: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
dd40: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
dd50: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  f = 0;.        }
dd60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
dd70: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
dd80: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b  erm(p, pIter, nK
dd90: 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eep);.        }.
dda0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ddb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  }.}../*.** Itera
ddc0: 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
ddd0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
dde0: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  e first rowid in
ddf0: 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73   a doclist. This
de00: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  .** function set
de10: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75  s the iterator u
de20: 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74  p so that iterat
de30: 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
de40: 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  der through.** t
de50: 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73  he doclist..*/.s
de60: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
de70: 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74  egIterReverse(Ft
de80: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
de90: 69 49 64 78 2c 20 46 74 73 35 53 65 67 49 74 65  iIdx, Fts5SegIte
dea0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
deb0: 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20  5Data *pLeaf;   
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ded0: 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
dee0: 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  a */.  int iOff 
def0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
df00: 66 73 65 74 3b 20 20 2f 2a 20 42 79 74 65 20 6f  fset;  /* Byte o
df10: 66 66 73 65 74 20 77 69 74 68 69 6e 20 63 75 72  ffset within cur
df20: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 46  rent leaf */.  F
df30: 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d  ts5Data *pLast =
df40: 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61   0;.  int pgnoLa
df50: 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 6f  st = 0;..  /* Mo
df60: 76 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 74  ve to the page t
df70: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
df80: 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74   last rowid in t
df90: 68 69 73 20 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a  his doclist. */.
dfa0: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
dfb0: 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20 70  >pLeaf;..  if( p
dfc0: 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 7b 0a  Iter->pDlidx ){.
dfd0: 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
dfe0: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
dff0: 65 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61  egid;.    pgnoLa
e000: 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  st = pIter->pDli
e010: 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  dx->iLeafPgno;. 
e020: 20 20 20 70 4c 61 73 74 20 3d 20 66 74 73 35 44     pLast = fts5D
e030: 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
e040: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
e050: 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c 20 70  dx, iSegid, 0, p
e060: 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c  gnoLast));.  }el
e070: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  se{.    while( i
e080: 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a  Off<pLeaf->n ){.
e090: 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
e0a0: 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
e0b0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 69  ;..      /* Posi
e0c0: 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 69  tion list size i
e0d0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
e0e0: 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69   iOff += getVari
e0f0: 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
e100: 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  Off], nPos);.   
e110: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b     iOff += nPos;
e120: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e  .      if( iOff>
e130: 3d 70 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65 61  =pLeaf->n ) brea
e140: 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77  k;..      /* Row
e150: 69 64 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69 66  id delta. Or, if
e160: 20 30 78 30 30 2c 20 74 68 65 20 65 6e 64 20 6f   0x00, the end o
e170: 66 20 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65 72  f doclist marker
e180: 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20  . */.      nPos 
e190: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65  = getVarint(&pLe
e1a0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
e1b0: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
e1c0: 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
e1d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e1e0: 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20  iOff += nPos;.  
e1f0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66    }..    if( iOf
e200: 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  f>=pLeaf->n ){. 
e210: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
e220: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
e230: 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20  = pIter->pSeg;. 
e240: 20 20 20 20 20 69 36 34 20 69 41 62 73 20 3d 20       i64 iAbs = 
e250: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
e260: 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69  ID(iIdx, pSeg->i
e270: 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d  Segid, 0, pIter-
e280: 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20  >iLeafPgno);.   
e290: 20 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46     i64 iLast = F
e2a0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
e2b0: 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53  D(iIdx, pSeg->iS
e2c0: 65 67 69 64 2c 20 30 2c 20 70 53 65 67 2d 3e 70  egid, 0, pSeg->p
e2d0: 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 20  gnoLast);..     
e2e0: 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77   /* The last row
e2f0: 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  id in the doclis
e300: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20  t may not be on 
e310: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e320: 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 20  . Search.       
e330: 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69  ** forward to fi
e340: 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  nd the page cont
e350: 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20  aining the last 
e360: 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20  rowid.  */.     
e370: 20 66 6f 72 28 69 41 62 73 2b 2b 3b 20 70 2d 3e   for(iAbs++; p->
e380: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e390: 20 69 41 62 73 3c 3d 69 4c 61 73 74 3b 20 69 41   iAbs<=iLast; iA
e3a0: 62 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46  bs++){.        F
e3b0: 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20  ts5Data *pNew = 
e3c0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
e3d0: 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69  iAbs);.        i
e3e0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
e3f0: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c       int iRowid,
e400: 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
e410: 20 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72    fts5LeafHeader
e420: 28 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 2c 20  (pNew, &iRowid, 
e430: 26 69 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20  &iTerm);.       
e440: 20 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b     if( iRowid ){
e450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 74 73  .            Fts
e460: 35 44 61 74 61 20 2a 70 54 6d 70 20 3d 20 70 4c  5Data *pTmp = pL
e470: 61 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ast;.           
e480: 20 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pLast = pNew;. 
e490: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
e4a0: 3d 20 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20  = pTmp;.        
e4b0: 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 69      pgnoLast = i
e4c0: 41 62 73 20 26 20 28 28 28 69 36 34 29 31 20 3c  Abs & (((i64)1 <
e4d0: 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  < FTS5_DATA_PAGE
e4e0: 5f 42 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20  _B) - 1);.      
e4f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e500: 69 66 28 20 69 54 65 72 6d 20 29 7b 0a 20 20 20  if( iTerm ){.   
e510: 20 20 20 20 20 20 20 20 20 69 41 62 73 20 3d 20           iAbs = 
e520: 69 4c 61 73 74 3b 0a 20 20 20 20 20 20 20 20 20  iLast;.         
e530: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
e540: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
e550: 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  w);.        }.  
e560: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e570: 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69  .  /* If pLast i
e580: 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  s NULL at this p
e590: 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c  oint, then the l
e5a0: 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68  ast rowid for th
e5b0: 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  is doclist.  ** 
e5c0: 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
e5d0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63   currently indic
e5e0: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
e5f0: 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ator. In this ca
e600: 73 65 20 0a 20 20 2a 2a 20 69 4c 61 73 74 4f 66  se .  ** iLastOf
e610: 66 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  f is set to the 
e620: 76 61 6c 75 65 20 74 68 61 74 20 70 49 74 65 72  value that pIter
e630: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 77 69  ->iLeafOffset wi
e640: 6c 6c 20 74 61 6b 65 20 77 68 65 6e 0a 20 20 2a  ll take when.  *
e650: 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  * the iterator p
e660: 6f 69 6e 74 73 20 74 6f 20 74 68 61 74 20 72 6f  oints to that ro
e670: 77 69 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  wid..  **.  ** O
e680: 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e  r, if pLast is n
e690: 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
e6a0: 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
e6b0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  t contains the l
e6c0: 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 0a  ast.  ** rowid..
e6d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74    */.  if( pLast
e6e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d   ){.    int dumm
e6f0: 79 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  y;.    fts5DataR
e700: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
e710: 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
e720: 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a  >pLeaf = pLast;.
e730: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e740: 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b  Pgno = pgnoLast;
e750: 0a 20 20 20 20 66 74 73 35 4c 65 61 66 48 65 61  .    fts5LeafHea
e760: 64 65 72 28 70 4c 61 73 74 2c 20 26 69 4f 66 66  der(pLast, &iOff
e770: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
e780: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
e790: 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d  (&pLast->p[iOff]
e7a0: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
e7b0: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74  iRowid);.    pIt
e7c0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e7d0: 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 66  = iOff;.  }..  f
e7e0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
e7f0: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
e800: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  er);.}../*.** It
e810: 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
e820: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
e830: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
e840: 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 20 77 69   of a doclist wi
e850: 74 68 69 6e 0a 2a 2a 20 69 6e 64 65 78 20 69 49  thin.** index iI
e860: 64 78 2e 20 54 68 65 72 65 20 69 73 20 61 20 64  dx. There is a d
e870: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73  oclist-index ass
e880: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
e890: 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 0a 2a   final term on.*
e8a0: 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
e8b0: 67 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ge. If the curre
e8c0: 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  nt term is the l
e8d0: 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  ast term on the 
e8e0: 70 61 67 65 2c 20 0a 2a 2a 20 6c 6f 61 64 20 74  page, .** load t
e8f0: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
e900: 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69   from disk and i
e910: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65  nitialize an ite
e920: 72 61 74 6f 72 20 61 74 20 0a 2a 2a 20 28 70 49  rator at .** (pI
e930: 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f  ter->pDlidx)..*/
e940: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
e950: 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64  5SegIterLoadDlid
e960: 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  x(Fts5Index *p, 
e970: 69 6e 74 20 69 49 64 78 2c 20 46 74 73 35 53 65  int iIdx, Fts5Se
e980: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
e990: 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49   int iSegid = pI
e9a0: 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
e9b0: 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  d;.  int bRev = 
e9c0: 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
e9d0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
e9e0: 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74  ERSE);.  Fts5Dat
e9f0: 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
ea00: 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72  ->pLeaf; /* Curr
ea10: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
ea20: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
ea30: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ea40: 3b 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65  ;  /* Byte offse
ea50: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
ea60: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 61 73 73 65   leaf */..  asse
ea70: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
ea80: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
ea90: 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
eaa0: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
eab0: 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  dx==0 );..  /* C
eac0: 68 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72  heck if the curr
ead0: 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73  ent doclist ends
eae0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49   on this page. I
eaf0: 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72  f it does, retur
eb00: 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74  n.  ** early wit
eb10: 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65  hout loading the
eb20: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28   doclist-index (
eb30: 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f  as it belongs to
eb40: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a   a different.  *
eb50: 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 77 68 69  * term. */.  whi
eb60: 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e  le( iOff<pLeaf->
eb70: 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65  n ){.    i64 iDe
eb80: 6c 74 61 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f  lta;.    int nPo
eb90: 73 6c 69 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 69  slist;..    /* i
eba0: 4f 66 66 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Off is currently
ebb0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
ebc0: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
ebd0: 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74   a position list
ebe0: 2e 20 2a 2f 0a 20 20 20 20 69 4f 66 66 20 2b 3d  . */.    iOff +=
ebf0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c   getVarint32(&pL
ec00: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 50  eaf->p[iOff], nP
ec10: 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 69 4f 66  oslist);.    iOf
ec20: 66 20 2b 3d 20 6e 50 6f 73 6c 69 73 74 3b 0a 0a  f += nPoslist;..
ec30: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 4c 65      if( iOff<pLe
ec40: 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69  af->n ){.      i
ec50: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
ec60: 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
ec70: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
ec80: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 65 6c  ;.      if( iDel
ec90: 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ta==0 ) return;.
eca0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
ecb0: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
ecc0: 2c 20 62 52 65 76 2c 20 69 49 64 78 2c 20 69 53  , bRev, iIdx, iS
ecd0: 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65  egid, pIter->iLe
ece0: 61 66 50 67 6e 6f 2c 20 26 70 49 74 65 72 2d 3e  afPgno, &pIter->
ecf0: 70 44 6c 69 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pDlidx);.}../*.*
ed00: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
ed10: 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
ed20: 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70   point to term p
ed30: 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69  Term/nTerm withi
ed40: 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65  n segment.** pSe
ed50: 67 2c 20 69 6e 64 65 78 20 69 49 64 78 2e 20 49  g, index iIdx. I
ed60: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
ed70: 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69  ch term in the i
ed80: 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61 74  ndex, the iterat
ed90: 6f 72 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  or.** is set to 
eda0: 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  EOF..**.** If an
edb0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
edc0: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
edd0: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
ede0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
edf0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
ee00: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
ee10: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
ee20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ee30: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
ee40: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
ee50: 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65  d fts5SegIterSee
ee60: 6b 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  kInit(.  Fts5Ind
ee70: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
ee80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
ee90: 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e   backend */.  in
eea0: 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eec0: 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20   Config.aHash[] 
eed0: 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64  index of FTS ind
eee0: 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ex */.  const u8
eef0: 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
ef00: 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm,     /* Term 
ef10: 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20  to seek to */.  
ef20: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49  /* Mask of FTS5I
ef50: 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a  NDEX_XXX flags *
ef60: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
ef70: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
ef80: 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
ef90: 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
efa0: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
efb0: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
efc0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
efd0: 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
efe0: 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20 20   int iPg = 1;.  
eff0: 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 62 47 65  int h;.  int bGe
f000: 20 3d 20 28 28 66 6c 61 67 73 20 26 20 46 54 53   = ((flags & FTS
f010: 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
f020: 46 49 58 29 20 26 26 20 69 49 64 78 3d 3d 30 29  FIX) && iIdx==0)
f030: 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d  ;.  int bDlidx =
f040: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
f050: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
f060: 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
f070: 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73  t-index */..  as
f080: 73 65 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20  sert( bGe==0 || 
f090: 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
f0a0: 45 58 5f 51 55 45 52 59 5f 41 53 43 29 3d 3d 30  EX_QUERY_ASC)==0
f0b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
f0c0: 65 72 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a  erm && nTerm );.
f0d0: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
f0e0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
f0f0: 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65  ));.  pIter->pSe
f100: 67 20 3d 20 70 53 65 67 3b 0a 20 20 70 49 74 65  g = pSeg;.  pIte
f110: 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
f120: 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
f130: 20 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69   sets stack vari
f140: 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20  able iPg to the 
f150: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
f160: 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63   that may.  ** c
f170: 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65  ontain term (pTe
f180: 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74  rm/nTerm), if it
f190: 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
f1a0: 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  he segment. */. 
f1b0: 20 66 6f 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65   for(h=pSeg->nHe
f1c0: 69 67 68 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d  ight-1; h>0; h--
f1d0: 29 7b 0a 20 20 20 20 46 74 73 35 4e 6f 64 65 49  ){.    Fts5NodeI
f1e0: 74 65 72 20 6e 6f 64 65 3b 20 20 20 20 20 20 20  ter node;       
f1f0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
f200: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
f210: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a  internal nodes *
f220: 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
f230: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
f240: 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67  ROWID(iIdx, pSeg
f250: 2d 3e 69 53 65 67 69 64 2c 20 68 2c 20 69 50 67  ->iSegid, h, iPg
f260: 29 3b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  );.    Fts5Data 
f270: 2a 70 4e 6f 64 65 20 3d 20 66 74 73 35 44 61 74  *pNode = fts5Dat
f280: 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29  aRead(p, iRowid)
f290: 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 3d  ;.    if( pNode=
f2a0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
f2b0: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69   fts5NodeIterIni
f2c0: 74 28 70 4e 6f 64 65 2d 3e 70 2c 20 70 4e 6f 64  t(pNode->p, pNod
f2d0: 65 2d 3e 6e 2c 20 26 6e 6f 64 65 29 3b 0a 20 20  e->n, &node);.  
f2e0: 20 20 61 73 73 65 72 74 28 20 6e 6f 64 65 2e 74    assert( node.t
f2f0: 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 20  erm.n==0 );..   
f300: 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69   iPg = node.iChi
f310: 6c 64 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d  ld;.    bDlidx =
f320: 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20   node.bDlidx;.  
f330: 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49 74    for(fts5NodeIt
f340: 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26  erNext(&p->rc, &
f350: 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  node);.        n
f360: 6f 64 65 2e 61 44 61 74 61 20 26 26 20 66 74 73  ode.aData && fts
f370: 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
f380: 6f 62 28 26 6e 6f 64 65 2e 74 65 72 6d 2c 20 70  ob(&node.term, p
f390: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3c 3d 30 3b  Term, nTerm)<=0;
f3a0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64  .        fts5Nod
f3b0: 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
f3c0: 2c 20 26 6e 6f 64 65 29 0a 20 20 20 20 29 7b 0a  , &node).    ){.
f3d0: 20 20 20 20 20 20 69 50 67 20 3d 20 6e 6f 64 65        iPg = node
f3e0: 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 62  .iChild;.      b
f3f0: 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c  Dlidx = node.bDl
f400: 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  idx;.    }.    f
f410: 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
f420: 26 6e 6f 64 65 29 3b 0a 20 20 20 20 66 74 73 35  &node);.    fts5
f430: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 6f 64  DataRelease(pNod
f440: 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  e);.  }..  if( i
f450: 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  Pg<pSeg->pgnoFir
f460: 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d 20  st ){.    iPg = 
f470: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b  pSeg->pgnoFirst;
f480: 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30 3b  .    bDlidx = 0;
f490: 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69  .  }..  pIter->i
f4a0: 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d  LeafPgno = iPg -
f4b0: 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65   1;.  fts5SegIte
f4c0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
f4d0: 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65  er);..  if( pIte
f4e0: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
f4f0: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 70 49 74  int res;.    pIt
f500: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f510: 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70 49  = fts5GetU16(&pI
f520: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 32 5d  ter->pLeaf->p[2]
f530: 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
f540: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
f550: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 64 6f 20  ter, 0);.    do 
f560: 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 66 74  {.      res = ft
f570: 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42  s5BufferCompareB
f580: 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  lob(&pIter->term
f590: 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , pTerm, nTerm);
f5a0: 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d  .      if( res>=
f5b0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f5c0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
f5d0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
f5e0: 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 70  }while( pIter->p
f5f0: 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 69 66 28  Leaf );..    if(
f600: 20 62 47 65 3d 3d 30 20 26 26 20 72 65 73 20 29   bGe==0 && res )
f610: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69  {.      /* Set i
f620: 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74  terator to point
f630: 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 20 20 20   to EOF */.     
f640: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
f650: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
f660: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f670: 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  af = 0;.    }.  
f680: 7d 0a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20  }..  if( bGe==0 
f690: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  ){.    pIter->fl
f6a0: 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
f6b0: 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20  TER_ONETERM;.   
f6c0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
f6d0: 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  f ){.      if( f
f6e0: 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
f6f0: 5f 51 55 45 52 59 5f 41 53 43 20 29 7b 0a 20 20  _QUERY_ASC ){.  
f700: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61        pIter->fla
f710: 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
f720: 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  ER_REVERSE;.    
f730: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44    }.      if( bD
f740: 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  lidx ){.        
f750: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
f760: 6c 69 64 78 28 70 2c 20 69 49 64 78 2c 20 70 49  lidx(p, iIdx, pI
f770: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
f780: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
f790: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
f7a0: 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ASC ){.        f
f7b0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
f7c0: 65 28 70 2c 20 69 49 64 78 2c 20 70 49 74 65 72  e(p, iIdx, pIter
f7d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f7e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65  .  }.}../*.** Ze
f7f0: 72 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ro the iterator 
f800: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
f810: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
f820: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
f830: 53 65 67 49 74 65 72 43 6c 65 61 72 28 46 74 73  SegIterClear(Fts
f840: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
f850: 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  {.  fts5BufferFr
f860: 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29  ee(&pIter->term)
f870: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
f880: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
f890: 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74  );.  fts5DlidxIt
f8a0: 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44  erFree(pIter->pD
f8b0: 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  lidx);.  sqlite3
f8c0: 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f  _free(pIter->aRo
f8d0: 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65  widOffset);.  me
f8e0: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
f8f0: 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65  izeof(Fts5SegIte
f900: 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  r));.}../*.** Do
f910: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
f920: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70  necessary to pop
f930: 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69  ulate pIter->aFi
f940: 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a  rst[iOut]..**.**
f950: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
f960: 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
f970: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
f980: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65  he index of an e
f990: 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ntry.** in the p
f9a0: 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72  Iter->aSeg[] arr
f9b0: 61 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6e  ay that is (a) n
f9c0: 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28  ot at EOF, and (
f9d0: 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  b) pointing.** t
f9e0: 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20  o a key that is 
f9f0: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
fa00: 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20 70  nother, higher p
fa10: 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67  riority, .** seg
fa20: 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e  ment-iterator in
fa30: 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b   the pSeg->aSeg[
fa40: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
fa50: 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
fa60: 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74  IterDoCompare(Ft
fa70: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
fa80: 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29  pIter, int iOut)
fa90: 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20  {.  int i1;     
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
fac0: 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65  left-hand Fts5Se
fad0: 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  gIter */.  int i
fae0: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
faf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
fb00: 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e  dex of right-han
fb10: 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
fb20: 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46  .  int iRes;.  F
fb30: 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20  ts5SegIter *p1; 
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb50: 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35  * Left-hand Fts5
fb60: 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
fb70: 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20  5SegIter *p2;   
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb90: 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53  Right-hand Fts5S
fba0: 65 67 49 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  egIter */..  ass
fbb0: 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d  ert( iOut<pIter-
fbc0: 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20  >nSeg && iOut>0 
fbd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
fbe0: 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70  er->bRev==0 || p
fbf0: 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b  Iter->bRev==1 );
fc00: 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70  ..  if( iOut>=(p
fc10: 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b  Iter->nSeg/2) ){
fc20: 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20  .    i1 = (iOut 
fc30: 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29  - pIter->nSeg/2)
fc40: 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69   * 2;.    i2 = i
fc50: 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1 + 1;.  }else{.
fc60: 20 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e      i1 = pIter->
fc70: 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 3b 0a  aFirst[iOut*2];.
fc80: 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e      i2 = pIter->
fc90: 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d  aFirst[iOut*2+1]
fca0: 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49  ;.  }.  p1 = &pI
fcb0: 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20  ter->aSeg[i1];. 
fcc0: 20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p2 = &pIter->aS
fcd0: 65 67 5b 69 32 5d 3b 0a 0a 20 20 69 66 28 20 70  eg[i2];..  if( p
fce0: 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  1->pLeaf==0 ){  
fcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
fd00: 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  1 is at EOF */. 
fd10: 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
fd20: 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
fd30: 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a  eaf==0 ){     /*
fd40: 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46   If p2 is at EOF
fd50: 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
fd60: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
fd70: 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75  int res = fts5Bu
fd80: 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d  fferCompare(&p1-
fd90: 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d  >term, &p2->term
fda0: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  );.    if( res==
fdb0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
fdc0: 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20  t( i2>i1 );.    
fdd0: 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20    assert( i2!=0 
fde0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d  );.      if( p1-
fdf0: 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f  >iRowid==p2->iRo
fe00: 77 69 64 20 29 20 72 65 74 75 72 6e 20 69 32 3b  wid ) return i2;
fe10: 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70  .      res = ((p
fe20: 31 2d 3e 69 52 6f 77 69 64 20 3c 20 70 32 2d 3e  1->iRowid < p2->
fe30: 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
fe40: 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b  bRev) ? -1 : +1;
fe50: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
fe60: 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20  t( res!=0 );.   
fe70: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
fe80: 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
fe90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fea0: 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d  iRes = i2;.    }
feb0: 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 61  .  }..  pIter->a
fec0: 46 69 72 73 74 5b 69 4f 75 74 5d 20 3d 20 69 52  First[iOut] = iR
fed0: 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  es;.  return 0;.
fee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
fef0: 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
ff00: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
ff10: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
ff20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ff30: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
ff40: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
ff50: 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
ff60: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
ff70: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
ff80: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
ff90: 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
ffa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
ffb0: 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49  SegIterClear(&pI
ffc0: 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20  ter->aSeg[i]);. 
ffd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ffe0: 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
fff0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
10000 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
10010 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e  vanced(.  Fts5In
10020 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
10030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
10040 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
10050 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
10060 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
10070 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
10080 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
10090 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20  update aFirst[] 
100a0 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69  array for */.  i
100b0 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20  nt iChanged,    
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
100d0 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69  * Index of sub-i
100e0 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76  terator just adv
100f0 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
10100 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20  Minset          
10110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
10120 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61  nimum entry in a
10130 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a  First[] to set *
10140 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
10150 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53  for(i=(pIter->nS
10160 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20  eg+iChanged)/2; 
10170 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d  i>=iMinset && p-
10180 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
10190 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20  i=i/2){.    int 
101a0 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45  iEq;.    if( (iE
101b0 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
101c0 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72  rDoCompare(pIter
101d0 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 66  , i)) ){.      f
101e0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
101f0 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  , &pIter->aSeg[i
10200 45 71 5d 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  Eq]);.      i = 
10210 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45  pIter->nSeg + iE
10220 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  q;.    }.  }.}..
10230 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73  /*.** Move the s
10240 65 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20  eg-iter so that 
10250 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
10260 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
10270 70 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a  page iLeafPgno..
10280 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  ** It is an erro
10290 72 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50  r if leaf iLeafP
102a0 67 6e 6f 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  gno contains no 
102b0 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rowid..*/.static
102c0 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
102d0 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73  rGotoPage(.  Fts
102e0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10300 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
10310 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
10320 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
10330 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
10340 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
10350 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
10360 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  no.){.  assert( 
10370 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
10380 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20  >iLeafPgno );.  
10390 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
103a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65  E_OK ){.    pIte
103b0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
103c0 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20  LeafPgno-1;.    
103d0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
103e0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
103f0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
10400 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
10410 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d  Iter->iLeafPgno=
10420 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20  =iLeafPgno );.  
10430 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
10440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10450 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 75   int iOff;.    u
10460 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
10470 65 61 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20  eaf->p;.    int 
10480 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
10490 2d 3e 6e 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d  ->n;..    iOff =
104a0 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30   fts5GetU16(&a[0
104b0 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66  ]);.    if( iOff
104c0 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b  <4 || iOff>=n ){
104d0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
104e0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
104f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f   }else{.      iO
10500 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  ff += getVarint(
10510 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
10520 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
10530 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
10540 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
10550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
10560 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
10570 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
10580 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
10590 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74  rgument until it
105a0 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61   is at or .** pa
105b0 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20  st rowid iFrom. 
105c0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
105d0 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d  e value of iFrom
105e0 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  , the iterator i
105f0 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61  s.** always adva
10600 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e  nced at least on
10610 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
10620 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
10630 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
10640 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
10650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
10660 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
10670 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
10680 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
10690 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
106a0 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
106b0 20 20 69 36 34 20 69 4d 61 74 63 68 20 20 20 20    i64 iMatch    
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65    /* Advance ite
106e0 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74  rator at least t
106f0 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20  his far */.){.  
10700 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65  int bRev = (pIte
10710 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
10720 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
10730 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ;.  Fts5DlidxIte
10740 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65  r *pDlidx = pIte
10750 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74  r->pDlidx;.  int
10760 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74   iLeafPgno = pIt
10770 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  er->iLeafPgno;. 
10780 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a   int bMove = 1;.
10790 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
107a0 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
107b0 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
107c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
107d0 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61  r->pDlidx );.  a
107e0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
107f0 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52  eaf );..  if( bR
10800 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ev==0 ){.    whi
10810 6c 65 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  le( fts5DlidxIte
10820 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
10830 3d 30 20 26 26 20 69 4d 61 74 63 68 3c 70 44 6c  =0 && iMatch<pDl
10840 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20  idx->iRowid ){. 
10850 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d       iLeafPgno =
10860 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67   pDlidx->iLeafPg
10870 6e 6f 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  no;.      fts5Dl
10880 69 64 78 49 74 65 72 4e 65 78 74 28 70 44 6c 69  idxIterNext(pDli
10890 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dx);.    }.    a
108a0 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f  ssert( iLeafPgno
108b0 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  >=pIter->iLeafPg
108c0 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20  no || p->rc );. 
108d0 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f     if( iLeafPgno
108e0 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
108f0 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  o ){.      fts5S
10900 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70  egIterGotoPage(p
10910 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67  , pIter, iLeafPg
10920 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  no);.      bMove
10930 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
10940 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
10950 20 69 4d 61 74 63 68 3e 70 49 74 65 72 2d 3e 69   iMatch>pIter->i
10960 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69  Rowid );.    whi
10970 6c 65 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  le( fts5DlidxIte
10980 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
10990 3d 30 20 26 26 20 69 4d 61 74 63 68 3e 70 44 6c  =0 && iMatch>pDl
109a0 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20  idx->iRowid ){. 
109b0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
109c0 65 72 50 72 65 76 28 70 44 6c 69 64 78 29 3b 0a  erPrev(pDlidx);.
109d0 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50      }.    iLeafP
109e0 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c  gno = pDlidx->iL
109f0 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 20 20 61 73  eafPgno;..    as
10a00 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49  sert( fts5DlidxI
10a10 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
10a20 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d  ) || iLeafPgno<=
10a30 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
10a40 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65   );..    if( iLe
10a50 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c  afPgno<pIter->iL
10a60 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
10a70 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
10a80 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b  o = iLeafPgno+1;
10a90 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
10aa0 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
10ab0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
10ac0 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20    bMove = 0;.   
10ad0 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28   }.  }..  while(
10ae0 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4d   1 ){.    if( bM
10af0 6f 76 65 20 29 20 66 74 73 35 53 65 67 49 74 65  ove ) fts5SegIte
10b00 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  rNext(p, pIter);
10b10 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
10b20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
10b30 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d  ;.    if( bRev==
10b40 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77  0 && pIter->iRow
10b50 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
10b60 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  ak;.    if( bRev
10b70 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52  !=0 && pIter->iR
10b80 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
10b90 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20  reak;.    bMove 
10ba0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
10bb0 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
10bc0 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
10bd0 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  entry. .**.** If
10be0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10bf0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
10c00 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49  is left in Fts5I
10c10 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e  ndex.rc. It is n
10c20 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  ot .** considere
10c30 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
10c40 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68  e iterator reach
10c50 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74  es EOF, or if it
10c60 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a   is already at .
10c70 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  ** EOF when this
10c80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
10c90 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
10ca0 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
10cb0 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
10cc0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d 75  ex *p, .  Fts5Mu
10cd0 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
10ce0 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20  r,.  int bFrom, 
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
10d10 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69  argument iFrom i
10d20 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34  s valid */.  i64
10d30 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20 20   iFrom          
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d50 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73 74  Advance at least
10d60 20 61 73 20 66 61 72 20 61 73 20 74 68 69 73 20   as far as this 
10d70 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
10d80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10d90 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d      int iFirst =
10da0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
10db0 5d 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ];.    Fts5SegIt
10dc0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
10dd0 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b  r->aSeg[iFirst];
10de0 0a 20 20 20 20 69 66 28 20 62 46 72 6f 6d 20 26  .    if( bFrom &
10df0 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29  & pSeg->pDlidx )
10e00 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
10e10 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70  terNextFrom(p, p
10e20 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20  Seg, iFrom);.   
10e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
10e40 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
10e50 20 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pSeg);.    }.  
10e60 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
10e70 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72  dvanced(p, pIter
10e80 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20  , iFirst, 1);.  
10e90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
10ea0 61 74 65 20 61 20 6e 65 77 20 46 74 73 35 4d 75  ate a new Fts5Mu
10eb0 6c 74 69 53 65 67 49 74 65 72 20 6f 62 6a 65 63  ltiSegIter objec
10ec0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
10ed0 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20   object will be 
10ee0 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
10ef0 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20  through data in 
10f00 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
10f10 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20  t..** If iLevel 
10f20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c  is -ve, then all
10f30 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67   data in all seg
10f40 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e  ments is merged.
10f50 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a   Or, if iLevel.*
10f60 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65  * is zero or gre
10f70 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20  ater, data from 
10f80 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65  the first nSegme
10f90 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  nt segments on l
10fa0 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69  evel iLevel.** i
10fb0 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  s merged..**.** 
10fc0 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69  The iterator ini
10fd0 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tially points to
10fe0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f   the first term/
10ff0 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74  rowid entry in t
11000 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20  he .** iterated 
11010 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
11020 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
11030 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64  erNew(.  Fts5Ind
11040 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
11050 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
11060 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
11070 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
11080 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
11090 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20  Struct,         
110a0 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66 20  /* Structure of 
110b0 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a  specific index *
110c0 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48      /* Config.aH
110f0 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46  ash[] index of F
11100 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  TS index */.  in
11110 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11130 20 54 72 75 65 20 66 6f 72 20 3e 3d 20 2a 2f 0a   True for >= */.
11140 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
11150 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
11160 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
11170 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29  k to (or NULL/0)
11180 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
11190 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
111a0 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74        /* Level t
111b0 6f 20 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f  o iterate (-1 fo
111c0 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20  r all) */.  int 
111d0 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20  nSegment,       
111e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
111f0 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
11200 73 20 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76  s to merge (iLev
11210 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35  el>=0) */.  Fts5
11220 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 2a 70  MultiSegIter **p
11230 70 4f 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4e  pOut        /* N
11240 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ew object */.){.
11250 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20    int nSeg;     
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
11280 65 67 6d 65 6e 74 73 20 6d 65 72 67 65 64 20 2a  egments merged *
11290 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20  /.  int nSlot;  
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20      /* Power of 
112c0 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 20  two >= nSeg */. 
112d0 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20   int iIter = 0; 
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65   /* */.  int iSe
11300 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
11310 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
11320 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
11330 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
11340 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
11350 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74  evel *pLvl;.  Ft
11360 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
11370 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28  pNew;..  assert(
11380 20 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54   (pTerm==0 && nT
11390 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65  erm==0) || iLeve
113a0 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  l<0 );..  /* All
113b0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
113c0 74 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65  the new multi-se
113d0 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20  g-iterator. */. 
113e0 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
113f0 0a 20 20 20 20 6e 53 65 67 20 3d 20 66 74 73 35  .    nSeg = fts5
11400 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
11410 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 3b  gments(pStruct);
11420 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 53  .  }else{.    nS
11430 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74  eg = MIN(pStruct
11440 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d  ->aLevel[iLevel]
11450 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29  .nSeg, nSegment)
11460 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 53 6c 6f  ;.  }.  for(nSlo
11470 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b  t=2; nSlot<nSeg;
11480 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b   nSlot=nSlot*2);
11490 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77  .  *ppOut = pNew
114a0 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
114b0 28 70 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f  (p, .      sizeo
114c0 66 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  f(Fts5MultiSegIt
114d0 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 2f  er) +          /
114e0 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20  * pNew */.      
114f0 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74  sizeof(Fts5SegIt
11500 65 72 29 20 2a 20 6e 53 6c 6f 74 20 2b 20 20 20  er) * nSlot +   
11510 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65      /* pNew->aSe
11520 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  g[] */.      siz
11530 65 6f 66 28 75 31 36 29 20 2a 20 6e 53 6c 6f 74  eof(u16) * nSlot
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74   /* pNew->aFirst
11560 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  [] */.  );.  if(
11570 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
11580 6e 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20  n;.  pNew->nSeg 
11590 3d 20 6e 53 6c 6f 74 3b 0a 20 20 70 4e 65 77 2d  = nSlot;.  pNew-
115a0 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 65 67  >aSeg = (Fts5Seg
115b0 49 74 65 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  Iter*)&pNew[1];.
115c0 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d    pNew->aFirst =
115d0 20 28 75 31 36 2a 29 26 70 4e 65 77 2d 3e 61 53   (u16*)&pNew->aS
115e0 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 70 4e 65  eg[nSlot];.  pNe
115f0 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66  w->bRev = (0!=(f
11600 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
11610 5f 51 55 45 52 59 5f 41 53 43 29 29 3b 0a 0a 20  _QUERY_ASC));.. 
11620 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65   /* Initialize e
11630 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  ach of the compo
11640 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65  nent segment ite
11650 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28  rators. */.  if(
11660 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
11670 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
11680 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74  vel *pEnd = &pSt
11690 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  ruct->aLevel[pSt
116a0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
116b0 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74     for(pLvl=&pSt
116c0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b  ruct->aLevel[0];
116d0 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c   pLvl<pEnd; pLvl
116e0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
116f0 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31  Seg=pLvl->nSeg-1
11700 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
11710 2d 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  -){.        Fts5
11720 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
11730 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
11740 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
11750 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
11760 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
11770 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
11780 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
11790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
117a0 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
117b0 28 70 2c 20 69 49 64 78 2c 20 70 53 65 67 2c 20  (p, iIdx, pSeg, 
117c0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
117d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
117e0 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b   fts5SegIterSeek
117f0 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 54  Init(p, iIdx, pT
11800 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
11810 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  s, pSeg, pIter);
11820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11830 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
11840 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53  {.    pLvl = &pS
11850 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
11860 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69  evel];.    for(i
11870 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67  Seg=nSeg-1; iSeg
11880 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20  >=0; iSeg--){.  
11890 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
118a0 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 26 70 4c  nit(p, iIdx, &pL
118b0 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20  vl->aSeg[iSeg], 
118c0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
118d0 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  r++]);.    }.  }
118e0 0a 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72  .  assert( iIter
118f0 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20  ==nSeg );..  /* 
11900 49 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73  If the above was
11910 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63   successful, eac
11920 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72  h component iter
11930 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73  ators now points
11940 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69   .  ** to the fi
11950 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73  rst entry in its
11960 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69   segment. In thi
11970 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a  s case initializ
11980 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72  e the .  ** aFir
11990 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20  st[] array. Or, 
119a0 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
119b0 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74  occurred, free t
119c0 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a  he iterator.  **
119d0 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20   object and set 
119e0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
119f0 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f  ble to NULL.  */
11a00 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
11a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
11a20 6f 72 28 69 49 74 65 72 3d 6e 53 6c 6f 74 2d 31  or(iIter=nSlot-1
11a30 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72  ; iIter>0; iIter
11a40 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  --){.      int i
11a50 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  Eq;.      if( (i
11a60 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
11a70 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77  erDoCompare(pNew
11a80 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20  , iIter)) ){.   
11a90 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11aa0 4e 65 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61  Next(p, &pNew->a
11ab0 53 65 67 5b 69 45 71 5d 29 3b 0a 20 20 20 20 20  Seg[iEq]);.     
11ac0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
11ad0 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77  Advanced(p, pNew
11ae0 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20  , iEq, iIter);. 
11af0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11b00 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75  else{.    fts5Mu
11b10 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
11b20 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74  New);.    *ppOut
11b30 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
11b40 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
11b50 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
11b60 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61  s at EOF or if a
11b70 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
11b80 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20  rred. .** False 
11b90 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
11ba0 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
11bb0 74 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  tiIterEof(Fts5In
11bc0 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74  dex *p, Fts5Mult
11bd0 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  iSegIter *pIter)
11be0 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  {.  return (p->r
11bf0 63 20 7c 7c 20 70 49 74 65 72 2d 3e 61 53 65 67  c || pIter->aSeg
11c00 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
11c10 31 5d 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a  1] ].pLeaf==0);.
11c20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11c30 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
11c40 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
11c50 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
11c60 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e  ly points.** to.
11c70 20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   If the iterator
11c80 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77   points to EOF w
11c90 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11ca0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a  n is called the.
11cb0 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  ** results are u
11cc0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
11cd0 74 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74  tic i64 fts5Mult
11ce0 69 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 4d  iIterRowid(Fts5M
11cf0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
11d00 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
11d10 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
11d20 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 70  r->aFirst[1] ].p
11d30 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e  Leaf );.  return
11d40 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
11d50 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d  ter->aFirst[1] ]
11d60 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  .iRowid;.}../*.*
11d70 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
11d80 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
11d90 65 6e 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c  entry at or foll
11da0 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f  owing iMatch..*/
11db0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
11dc0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72  5MultiIterNextFr
11dd0 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  om(.  Fts5Index 
11de0 2a 70 2c 20 0a 20 20 46 74 73 35 4d 75 6c 74 69  *p, .  Fts5Multi
11df0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
11e00 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b  .  i64 iMatch.){
11e10 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
11e20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20     i64 iRowid;. 
11e30 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
11e40 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31  Next(p, pIter, 1
11e50 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69  , iMatch);.    i
11e60 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
11e70 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 20  Eof(p, pIter) ) 
11e80 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69  break;.    iRowi
11e90 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
11ea0 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
11eb0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
11ec0 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3c  ev==0 && iRowid<
11ed0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
11ee0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
11ef0 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69  bRev!=0 && iRowi
11f00 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d>=iMatch ) brea
11f10 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
11f20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
11f30 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
11f40 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d  taining the term
11f50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11f60 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74   the .** entry t
11f70 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
11f80 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
11f90 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
11fa0 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75  const u8 *fts5Mu
11fb0 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73 35  ltiIterTerm(Fts5
11fc0 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
11fd0 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20  ter, int *pn){. 
11fe0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 20   Fts5SegIter *p 
11ff0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
12000 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
12010 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74   ];.  *pn = p->t
12020 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20  erm.n;.  return 
12030 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a  p->term.p;.}../*
12040 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
12050 69 66 20 74 68 65 20 63 68 75 6e 6b 20 69 74 65  if the chunk ite
12060 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
12070 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12080 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f 46  ent is.** at EOF
12090 2e 20 4f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  . Or if an error
120a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
120b0 75 72 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urred. Otherwise
120c0 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a  , return false..
120d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
120e0 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 46  s5ChunkIterEof(F
120f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
12100 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65  5ChunkIter *pIte
12110 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  r){.  return (p-
12120 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c  >rc || pIter->pL
12130 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eaf==0);.}../*.*
12140 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 68  * Advance the ch
12150 75 6e 6b 2d 69 74 65 72 61 74 6f 72 20 74 6f 20  unk-iterator to 
12160 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 20 6f  the next chunk o
12170 66 20 64 61 74 61 20 74 6f 20 72 65 61 64 2e 0a  f data to read..
12180 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12190 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74  ts5ChunkIterNext
121a0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
121b0 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49  ts5ChunkIter *pI
121c0 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
121d0 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 3d 70 49 74  pIter->nRem>=pIt
121e0 65 72 2d 3e 6e 20 29 3b 0a 20 20 70 49 74 65 72  er->n );.  pIter
121f0 2d 3e 6e 52 65 6d 20 2d 3d 20 70 49 74 65 72 2d  ->nRem -= pIter-
12200 3e 6e 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65  >n;.  fts5DataRe
12210 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
12220 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c  af);.  pIter->pL
12230 65 61 66 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  eaf = 0;.  pIter
12240 2d 3e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ->p = 0;.  if( p
12250 49 74 65 72 2d 3e 6e 52 65 6d 3e 30 20 29 7b 0a  Iter->nRem>0 ){.
12260 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
12270 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  eaf;.    pIter->
12280 69 4c 65 61 66 52 6f 77 69 64 2b 2b 3b 0a 20 20  iLeafRowid++;.  
12290 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
122a0 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74  >pLeaf = fts5Dat
122b0 61 52 65 61 64 28 70 2c 20 70 49 74 65 72 2d 3e  aRead(p, pIter->
122c0 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
122d0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
122e0 20 20 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d      pIter->n = M
122f0 49 4e 28 70 49 74 65 72 2d 3e 6e 52 65 6d 2c 20  IN(pIter->nRem, 
12300 70 4c 65 61 66 2d 3e 6e 2d 34 29 3b 0a 20 20 20  pLeaf->n-4);.   
12310 20 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 4c     pIter->p = pL
12320 65 61 66 2d 3e 70 2b 34 3b 0a 20 20 20 20 7d 0a  eaf->p+4;.    }.
12330 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74    }.}../*.** Int
12340 69 61 6c 69 7a 65 20 74 68 65 20 63 68 75 6e 6b  ialize the chunk
12350 20 69 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61   iterator to rea
12360 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  d the position l
12370 69 73 74 20 64 61 74 61 20 66 6f 72 20 77 68 69  ist data for whi
12380 63 68 20 0a 2a 2a 20 74 68 65 20 73 69 7a 65 20  ch .** the size 
12390 66 69 65 6c 64 20 69 73 20 61 74 20 6f 66 66 73  field is at offs
123a0 65 74 20 69 4f 66 66 20 6f 66 20 6c 65 61 66 20  et iOff of leaf 
123b0 70 4c 65 61 66 2e 20 0a 2a 2f 0a 73 74 61 74 69  pLeaf. .*/.stati
123c0 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
123d0 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
123e0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
123f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12400 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
12410 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
12420 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20  ter *pSeg,      
12430 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
12440 6e 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20 72  nt iterator to r
12450 65 61 64 20 70 6f 73 6c 69 73 74 20 66 72 6f 6d  ead poslist from
12460 20 2a 2f 0a 20 20 46 74 73 35 43 68 75 6e 6b 49   */.  Fts5ChunkI
12470 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
12480 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
12490 69 7a 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ize this object 
124a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 49 64 20  */.){.  int iId 
124b0 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53  = pSeg->pSeg->iS
124c0 65 67 69 64 3b 0a 20 20 69 36 34 20 72 6f 77 69  egid;.  i64 rowi
124d0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
124e0 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64  _ROWID(pSeg->iId
124f0 78 2c 20 69 49 64 2c 20 30 2c 20 70 53 65 67 2d  x, iId, 0, pSeg-
12500 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 46  >iLeafPgno);.  F
12510 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
12520 20 70 53 65 67 2d 3e 70 4c 65 61 66 3b 0a 20 20   pSeg->pLeaf;.  
12530 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d  int iOff = pSeg-
12540 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20  >iLeafOffset;.. 
12550 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
12560 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
12570 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
12580 66 52 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a  fRowid = rowid;.
12590 20 20 69 66 28 20 69 4f 66 66 3c 70 4c 65 61 66    if( iOff<pLeaf
125a0 2d 3e 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ->n ){.    fts5D
125b0 61 74 61 52 65 66 65 72 65 6e 63 65 28 70 4c 65  ataReference(pLe
125c0 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
125d0 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20  pLeaf = pLeaf;. 
125e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
125f0 72 2d 3e 6e 52 65 6d 20 3d 20 31 3b 0a 20 20 20  r->nRem = 1;.   
12600 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65   fts5ChunkIterNe
12610 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  xt(p, pIter);.  
12620 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
12630 74 75 72 6e 3b 0a 20 20 20 20 69 4f 66 66 20 3d  turn;.    iOff =
12640 20 34 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20   4;.    pLeaf = 
12650 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20  pIter->pLeaf;.  
12660 7d 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 67 65 74  }..  iOff += get
12670 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
12680 3e 70 5b 69 4f 66 66 5d 2c 20 70 49 74 65 72 2d  >p[iOff], pIter-
12690 3e 6e 52 65 6d 29 3b 0a 20 20 70 49 74 65 72 2d  >nRem);.  pIter-
126a0 3e 6e 20 3d 20 4d 49 4e 28 70 4c 65 61 66 2d 3e  >n = MIN(pLeaf->
126b0 6e 20 2d 20 69 4f 66 66 2c 20 70 49 74 65 72 2d  n - iOff, pIter-
126c0 3e 6e 52 65 6d 29 3b 0a 20 20 70 49 74 65 72 2d  >nRem);.  pIter-
126d0 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 20 2b 20  >p = pLeaf->p + 
126e0 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70 49 74  iOff;..  if( pIt
126f0 65 72 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  er->n==0 ){.    
12700 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78  fts5ChunkIterNex
12710 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  t(p, pIter);.  }
12720 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
12730 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c  fts5ChunkIterRel
12740 65 61 73 65 28 46 74 73 35 43 68 75 6e 6b 49 74  ease(Fts5ChunkIt
12750 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74  er *pIter){.  ft
12760 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
12770 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
12780 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
12790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
127a0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  nd return the ne
127b0 78 74 20 33 32 2d 62 69 74 20 76 61 72 69 6e 74  xt 32-bit varint
127c0 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
127d0 6f 6e 2d 6c 69 73 74 20 69 74 65 72 61 74 6f 72  on-list iterator
127e0 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
127f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12800 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
12810 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 7a 65  error occurs, ze
12820 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ro is returned a
12830 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
12840 6c 65 66 74 20 69 6e 20 0a 2a 2a 20 46 74 73 35  left in .** Fts5
12850 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20  Index.rc. If an 
12860 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
12870 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
12880 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12890 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  .** called, it i
128a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
128b0 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73  atic int fts5Pos
128c0 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 46  IterReadVarint(F
128d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
128e0 35 50 6f 73 49 74 65 72 20 2a 70 49 74 65 72 29  5PosIter *pIter)
128f0 7b 0a 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 30  {.  int iVal = 0
12900 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
12910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12920 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3e  if( pIter->iOff>
12930 3d 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e 6e 20  =pIter->chunk.n 
12940 29 7b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75  ){.      fts5Chu
12950 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70  nkIterNext(p, &p
12960 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3b 0a 20 20  Iter->chunk);.  
12970 20 20 20 20 69 66 28 20 66 74 73 35 43 68 75 6e      if( fts5Chun
12980 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70 49 74  kIterEof(p, &pIt
12990 65 72 2d 3e 63 68 75 6e 6b 29 20 29 20 72 65 74  er->chunk) ) ret
129a0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 70 49 74  urn 0;.      pIt
129b0 65 72 2d 3e 69 4f 66 66 20 3d 20 30 3b 0a 20 20  er->iOff = 0;.  
129c0 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
129d0 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
129e0 33 32 28 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b  32(&pIter->chunk
129f0 2e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  .p[pIter->iOff],
12a00 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
12a10 74 75 72 6e 20 69 56 61 6c 3b 0a 7d 0a 0a 2f 2a  turn iVal;.}../*
12a20 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
12a30 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 74  position list it
12a40 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
12a50 78 74 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  xt entry..*/.sta
12a60 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73  tic void fts5Pos
12a70 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
12a80 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74  ex *p, Fts5PosIt
12a90 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
12aa0 74 20 69 56 61 6c 3b 0a 20 20 61 73 73 65 72 74  t iVal;.  assert
12ab0 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45  ( fts5ChunkIterE
12ac0 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68  of(p, &pIter->ch
12ad0 75 6e 6b 29 3d 3d 30 20 29 3b 0a 20 20 69 56 61  unk)==0 );.  iVa
12ae0 6c 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52  l = fts5PosIterR
12af0 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74  eadVarint(p, pIt
12b00 65 72 29 3b 0a 20 20 69 66 28 20 66 74 73 35 43  er);.  if( fts5C
12b10 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
12b20 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30  pIter->chunk)==0
12b30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 56 61 6c   ){.    if( iVal
12b40 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ==1 ){.      pIt
12b50 65 72 2d 3e 69 43 6f 6c 20 3d 20 66 74 73 35 50  er->iCol = fts5P
12b60 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e 74  osIterReadVarint
12b70 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12b80 20 20 70 49 74 65 72 2d 3e 69 50 6f 73 20 3d 20    pIter->iPos = 
12b90 66 74 73 35 50 6f 73 49 74 65 72 52 65 61 64 56  fts5PosIterReadV
12ba0 61 72 69 6e 74 28 70 2c 20 70 49 74 65 72 29 20  arint(p, pIter) 
12bb0 2d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 2;.    }else{.
12bc0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 6f        pIter->iPo
12bd0 73 20 2b 3d 20 28 69 56 61 6c 20 2d 20 32 29 3b  s += (iVal - 2);
12be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12bf0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
12c00 68 65 20 46 74 73 35 50 6f 73 49 74 65 72 20 6f  he Fts5PosIter o
12c10 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
12c20 74 68 65 20 66 69 6e 61 6c 20 61 72 67 75 6d 65  the final argume
12c30 6e 74 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a  nt to iterate.**
12c40 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73   through the pos
12c50 69 74 69 6f 6e 2d 6c 69 73 74 20 61 73 73 6f 63  ition-list assoc
12c60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 69  iated with the i
12c70 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
12c80 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70 4d 75  iterator .** pMu
12c90 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  lti currently po
12ca0 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
12cb0 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 49  ic void fts5PosI
12cc0 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
12cd0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
12ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
12cf0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
12d00 74 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69  t */.  Fts5Multi
12d10 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c  SegIter *pMulti,
12d20 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d         /* Multi-
12d30 73 65 67 20 69 74 65 72 61 74 6f 72 20 74 6f 20  seg iterator to 
12d40 72 65 61 64 20 70 6f 73 2d 6c 69 73 74 20 66 72  read pos-list fr
12d50 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 50 6f 73 49  om */.  Fts5PosI
12d60 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
12d70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
12d80 61 6c 69 7a 65 20 74 68 69 73 20 6f 62 6a 65 63  alize this objec
12d90 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  t */.){.  if( p-
12da0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
12db0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
12dc0 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74  r *pSeg = &pMult
12dd0 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d  i->aSeg[ pMulti-
12de0 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20  >aFirst[1] ];.  
12df0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
12e00 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
12e10 29 29 3b 0a 20 20 20 20 66 74 73 35 43 68 75 6e  ));.    fts5Chun
12e20 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
12e30 67 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b  g, &pIter->chunk
12e40 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 43  );.    if( fts5C
12e50 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
12e60 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30  pIter->chunk)==0
12e70 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 6f   ){.      fts5Po
12e80 73 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  sIterNext(p, pIt
12e90 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  er);.    }.  }.}
12ea0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
12eb0 72 75 65 20 69 66 20 74 68 65 20 70 6f 73 69 74  rue if the posit
12ec0 69 6f 6e 20 69 74 65 72 61 74 6f 72 20 70 61 73  ion iterator pas
12ed0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
12ee0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  d argument is.**
12ef0 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20 61   at EOF. Or if a
12f00 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
12f10 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f 74  ady occurred. Ot
12f20 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
12f30 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  false..*/.static
12f40 20 69 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72   int fts5PosIter
12f50 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
12f60 2c 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70  , Fts5PosIter *p
12f70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
12f80 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
12f90 3e 63 68 75 6e 6b 2e 70 4c 65 61 66 3d 3d 30 29  >chunk.pLeaf==0)
12fa0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
12fb0 63 61 74 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65  cate memory. The
12fc0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
12fd0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
12fe0 6e 20 61 6e 64 20 66 74 73 35 49 64 78 4d 61 6c  n and fts5IdxMal
12ff0 6c 6f 63 28 29 0a 2a 2a 20 69 73 20 74 68 61 74  loc().** is that
13000 20 74 68 69 73 20 69 6e 63 72 65 6d 65 6e 74 73   this increments
13010 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 6e   the Fts5Index.n
13020 50 65 6e 64 69 6e 67 44 61 74 61 20 76 61 72 69  PendingData vari
13030 61 62 6c 65 20 62 79 20 74 68 65 0a 2a 2a 20 6e  able by the.** n
13040 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
13050 6c 6c 6f 63 61 74 65 64 2e 20 49 74 20 73 68 6f  llocated. It sho
13060 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
13070 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  all allocations 
13080 75 73 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  used.** to store
13090 20 70 65 6e 64 69 6e 67 2d 64 61 74 61 20 77 69   pending-data wi
130a0 74 68 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  thin the in-memo
130b0 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a  ry hash tables..
130c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
130d0 66 74 73 35 50 65 6e 64 69 6e 67 4d 61 6c 6c 6f  fts5PendingMallo
130e0 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  c(Fts5Index *p, 
130f0 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 70 2d  int nByte){.  p-
13100 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 2b 3d  >nPendingData +=
13110 20 6e 42 79 74 65 3b 0a 20 20 72 65 74 75 72 6e   nByte;.  return
13120 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
13130 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , nByte);.}../*.
13140 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  ** Add an entry 
13150 66 6f 72 20 28 69 52 6f 77 69 64 2f 69 43 6f 6c  for (iRowid/iCol
13160 2f 69 50 6f 73 29 20 74 6f 20 74 68 65 20 64 6f  /iPos) to the do
13170 63 6c 69 73 74 20 66 6f 72 20 28 70 54 6f 6b 65  clist for (pToke
13180 6e 2f 6e 54 6f 6b 65 6e 29 0a 2a 2a 20 69 6e 20  n/nToken).** in 
13190 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  hash table for i
131a0 6e 64 65 78 20 69 49 64 78 2e 20 49 66 20 69 49  ndex iIdx. If iI
131b0 64 78 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  dx is zero, this
131c0 20 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65 72   is the main ter
131d0 6d 73 20 0a 2a 2a 20 69 6e 64 65 78 2e 20 56 61  ms .** index. Va
131e0 6c 75 65 73 20 6f 66 20 31 20 61 6e 64 20 67 72  lues of 1 and gr
131f0 65 61 74 65 72 20 66 6f 72 20 69 49 64 78 20 61  eater for iIdx a
13200 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  re prefix indexe
13210 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  s..**.** If an O
13220 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
13230 75 6e 74 65 72 65 64 2c 20 73 65 74 20 74 68 65  untered, set the
13240 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
13250 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 61 63 63  ror code .** acc
13260 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61  ordingly..*/.sta
13270 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 64 64  tic void fts5Add
13280 54 65 72 6d 54 6f 48 61 73 68 28 0a 20 20 46 74  TermToHash(.  Ft
13290 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
132b0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
132c0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
132d0 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132f0 2a 20 45 6e 74 72 79 20 69 6e 20 70 2d 3e 61 48  * Entry in p->aH
13300 61 73 68 5b 5d 20 74 6f 20 75 70 64 61 74 65 20  ash[] to update 
13310 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
13340 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
13350 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
13360 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13380 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
13390 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
133a0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
133b0 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
133c0 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
133d0 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
133e0 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
133f0 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
13400 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
13410 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
13420 3b 0a 20 20 46 74 73 33 48 61 73 68 20 2a 70 48  ;.  Fts3Hash *pH
13430 61 73 68 3b 0a 20 20 46 74 73 35 50 65 6e 64 69  ash;.  Fts5Pendi
13440 6e 67 44 6f 63 6c 69 73 74 20 2a 70 44 6f 63 6c  ngDoclist *pDocl
13450 69 73 74 3b 0a 20 20 46 74 73 35 50 65 6e 64 69  ist;.  Fts5Pendi
13460 6e 67 50 6f 73 6c 69 73 74 20 2a 70 50 6f 73 6c  ngPoslist *pPosl
13470 69 73 74 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  ist;.  i64 iRowi
13480 64 20 3d 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  d = p->iWriteRow
13490 69 64 3b 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  id;     /* Rowid
134a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
134b0 20 74 68 65 73 65 20 74 6f 6b 65 6e 73 20 2a 2f   these tokens */
134c0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
134d0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
134e0 63 63 75 72 65 64 20 74 68 69 73 20 63 61 6c 6c  ccured this call
134f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
13500 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
13510 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
13520 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
13530 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 75 73  hash table to us
13540 65 2e 20 49 74 20 68 61 73 20 61 6c 72 65 61 64  e. It has alread
13550 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
13560 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
13570 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
13580 72 65 66 69 78 20 29 3b 0a 20 20 61 73 73 65 72  refix );.  asser
13590 74 28 20 69 49 64 78 3d 3d 30 20 7c 7c 20 6e 54  t( iIdx==0 || nT
135a0 6f 6b 65 6e 3d 3d 70 43 6f 6e 66 69 67 2d 3e 61  oken==pConfig->a
135b0 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 20 29  Prefix[iIdx-1] )
135c0 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 2d 3e  ;.  pHash = &p->
135d0 61 48 61 73 68 5b 69 49 64 78 5d 3b 0a 0a 20 20  aHash[iIdx];..  
135e0 2f 2a 20 46 69 6e 64 20 74 68 65 20 64 6f 63 6c  /* Find the docl
135f0 69 73 74 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  ist to append to
13600 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  . Allocate a new
13610 20 64 6f 63 6c 69 73 74 20 6f 62 6a 65 63 74 20   doclist object 
13620 69 66 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  if.  ** required
13630 2e 20 2a 2f 0a 20 20 70 44 6f 63 6c 69 73 74 20  . */.  pDoclist 
13640 3d 20 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  = (Fts5PendingDo
13650 63 6c 69 73 74 2a 29 66 74 73 33 48 61 73 68 46  clist*)fts3HashF
13660 69 6e 64 28 70 48 61 73 68 2c 20 70 54 6f 6b 65  ind(pHash, pToke
13670 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  n, nToken);.  if
13680 28 20 70 44 6f 63 6c 69 73 74 3d 3d 30 20 29 7b  ( pDoclist==0 ){
13690 0a 20 20 20 20 46 74 73 35 50 65 6e 64 69 6e 67  .    Fts5Pending
136a0 44 6f 63 6c 69 73 74 20 2a 70 44 65 6c 3b 0a 20  Doclist *pDel;. 
136b0 20 20 20 70 44 6f 63 6c 69 73 74 20 3d 20 66 74     pDoclist = ft
136c0 73 35 50 65 6e 64 69 6e 67 4d 61 6c 6c 6f 63 28  s5PendingMalloc(
136d0 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 65  p, sizeof(Fts5Pe
136e0 6e 64 69 6e 67 44 6f 63 6c 69 73 74 29 20 2b 20  ndingDoclist) + 
136f0 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28  nToken);.    if(
13700 20 70 44 6f 63 6c 69 73 74 3d 3d 30 20 29 20 72   pDoclist==0 ) r
13710 65 74 75 72 6e 3b 0a 20 20 20 20 70 44 6f 63 6c  eturn;.    pDocl
13720 69 73 74 2d 3e 70 54 65 72 6d 20 3d 20 28 75 38  ist->pTerm = (u8
13730 2a 29 26 70 44 6f 63 6c 69 73 74 5b 31 5d 3b 0a  *)&pDoclist[1];.
13740 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 6e 54      pDoclist->nT
13750 65 72 6d 20 3d 20 6e 54 6f 6b 65 6e 3b 0a 20 20  erm = nToken;.  
13760 20 20 6d 65 6d 63 70 79 28 70 44 6f 63 6c 69 73    memcpy(pDoclis
13770 74 2d 3e 70 54 65 72 6d 2c 20 70 54 6f 6b 65 6e  t->pTerm, pToken
13780 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70  , nToken);.    p
13790 44 65 6c 20 3d 20 66 74 73 33 48 61 73 68 49 6e  Del = fts3HashIn
137a0 73 65 72 74 28 70 48 61 73 68 2c 20 70 44 6f 63  sert(pHash, pDoc
137b0 6c 69 73 74 2d 3e 70 54 65 72 6d 2c 20 6e 54 6f  list->pTerm, nTo
137c0 6b 65 6e 2c 20 70 44 6f 63 6c 69 73 74 29 3b 0a  ken, pDoclist);.
137d0 20 20 20 20 69 66 28 20 70 44 65 6c 20 29 7b 0a      if( pDel ){.
137e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
137f0 6f 63 6c 69 73 74 3d 3d 70 44 65 6c 20 29 3b 0a  oclist==pDel );.
13800 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13810 65 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  ee(pDel);.      
13820 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
13830 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65 74 75  OMEM;.      retu
13840 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
13850 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 6f 73   /* Find the pos
13860 6c 69 73 74 20 74 6f 20 61 70 70 65 6e 64 20 74  list to append t
13870 6f 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  o. Allocate a ne
13880 77 20 6f 62 6a 65 63 74 20 69 66 20 72 65 71 75  w object if requ
13890 69 72 65 64 2e 20 2a 2f 0a 20 20 70 50 6f 73 6c  ired. */.  pPosl
138a0 69 73 74 20 3d 20 70 44 6f 63 6c 69 73 74 2d 3e  ist = pDoclist->
138b0 70 50 6f 73 6c 69 73 74 3b 0a 20 20 69 66 28 20  pPoslist;.  if( 
138c0 70 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 70  pPoslist==0 || p
138d0 50 6f 73 6c 69 73 74 2d 3e 69 52 6f 77 69 64 21  Poslist->iRowid!
138e0 3d 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 70  =iRowid ){.    p
138f0 50 6f 73 6c 69 73 74 20 3d 20 66 74 73 35 50 65  Poslist = fts5Pe
13900 6e 64 69 6e 67 4d 61 6c 6c 6f 63 28 70 2c 20 73  ndingMalloc(p, s
13910 69 7a 65 6f 66 28 46 74 73 35 50 65 6e 64 69 6e  izeof(Fts5Pendin
13920 67 50 6f 73 6c 69 73 74 29 29 3b 0a 20 20 20 20  gPoslist));.    
13930 69 66 28 20 70 50 6f 73 6c 69 73 74 3d 3d 30 20  if( pPoslist==0 
13940 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50  ) return;.    pP
13950 6f 73 6c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20  oslist->pNext = 
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 20 20 70 50 6f 73 6c 69 73 74  st;.    pPoslist
13980 2d 3e 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  ->iRowid = iRowi
13990 64 3b 0a 20 20 20 20 70 44 6f 63 6c 69 73 74 2d  d;.    pDoclist-
139a0 3e 70 50 6f 73 6c 69 73 74 20 3d 20 70 50 6f 73  >pPoslist = pPos
139b0 6c 69 73 74 3b 0a 20 20 20 20 70 44 6f 63 6c 69  list;.    pDocli
139c0 73 74 2d 3e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  st->iCol = 0;.  
139d0 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50 6f 73    pDoclist->iPos
139e0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
139f0 41 70 70 65 6e 64 20 74 68 65 20 76 61 6c 75 65  Append the value
13a00 73 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  s to the positio
13a10 6e 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28  n list. */.  if(
13a20 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
13a30 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
13a40 2d 3d 20 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66  -= pPoslist->buf
13a50 2e 6e 53 70 61 63 65 3b 0a 20 20 20 20 69 66 28  .nSpace;.    if(
13a60 20 69 43 6f 6c 21 3d 70 44 6f 63 6c 69 73 74 2d   iCol!=pDoclist-
13a70 3e 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 66  >iCol ){.      f
13a80 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
13a90 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
13aa0 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2c 20 31 29  Poslist->buf, 1)
13ab0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
13ac0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
13ad0 70 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73 74  p->rc, &pPoslist
13ae0 2d 3e 62 75 66 2c 20 69 43 6f 6c 29 3b 0a 20 20  ->buf, iCol);.  
13af0 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 43      pDoclist->iC
13b00 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
13b10 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50 6f 73 20   pDoclist->iPos 
13b20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
13b30 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
13b40 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
13b50 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2c 20 69 50  Poslist->buf, iP
13b60 6f 73 20 2b 20 32 20 2d 20 70 44 6f 63 6c 69 73  os + 2 - pDoclis
13b70 74 2d 3e 69 50 6f 73 29 3b 0a 20 20 20 20 70 2d  t->iPos);.    p-
13b80 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 2b 3d  >nPendingData +=
13b90 20 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2e 6e   pPoslist->buf.n
13ba0 53 70 61 63 65 3b 0a 20 20 20 20 70 44 6f 63 6c  Space;.    pDocl
13bb0 69 73 74 2d 3e 69 50 6f 73 20 3d 20 69 50 6f 73  ist->iPos = iPos
13bc0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
13bd0 72 65 65 20 74 68 65 20 70 65 6e 64 69 6e 67 2d  ree the pending-
13be0 64 6f 63 6c 69 73 74 20 6f 62 6a 65 63 74 20 70  doclist object p
13bf0 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
13c00 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
13c10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 46  tatic void fts5F
13c20 72 65 65 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  reePendingDoclis
13c30 74 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63  t(Fts5PendingDoc
13c40 6c 69 73 74 20 2a 70 29 7b 0a 20 20 46 74 73 35  list *p){.  Fts5
13c50 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20 2a  PendingPoslist *
13c60 70 50 6f 73 6c 69 73 74 3b 0a 20 20 46 74 73 35  pPoslist;.  Fts5
13c70 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20 2a  PendingPoslist *
13c80 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 6f  pNext;.  for(pPo
13c90 73 6c 69 73 74 3d 70 2d 3e 70 50 6f 73 6c 69 73  slist=p->pPoslis
13ca0 74 3b 20 70 50 6f 73 6c 69 73 74 3b 20 70 50 6f  t; pPoslist; pPo
13cb0 73 6c 69 73 74 3d 70 4e 65 78 74 29 7b 0a 20 20  slist=pNext){.  
13cc0 20 20 70 4e 65 78 74 20 3d 20 70 50 6f 73 6c 69    pNext = pPosli
13cd0 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 66  st->pNext;.    f
13ce0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
13cf0 50 6f 73 6c 69 73 74 2d 3e 62 75 66 29 3b 0a 20  Poslist->buf);. 
13d00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13d10 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20 7d 0a 20  pPoslist);.  }. 
13d20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
13d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
13d40 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61  t or remove data
13d50 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
13d60 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65  index. Each time
13d70 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a   a document is .
13d80 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72  ** added to or r
13d90 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
13da0 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63  index, this func
13db0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
13dc0 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69  ne or more.** ti
13dd0 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  mes..**.** For a
13de0 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73  n insert, it mus
13df0 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  t be called once
13e00 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
13e10 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d  in the new docum
13e20 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ent..** If the o
13e30 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65  peration is a de
13e40 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65  lete, it must be
13e50 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73   called (at leas
13e60 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  t) once for each
13e70 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e  .** unique token
13e80 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
13e90 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61   with an iCol va
13ea0 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65  lue less than ze
13eb0 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20  ro. The iPos.** 
13ec0 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f  argument is igno
13ed0 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65  red for a delete
13ee0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13ef0 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
13f00 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
13f30 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
13f40 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f60 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
13f70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
13f80 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
13f90 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13fb0 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
13fc0 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
13fd0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13fe0 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
13ff0 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
14000 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
14010 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
14020 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
14050 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
14060 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  gh indexes */.  
14070 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
14080 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
14090 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
140a0 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
140b0 6f 63 63 75 72 65 64 20 74 68 69 73 20 63 61 6c  occured this cal
140c0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  l is a no-op. */
140d0 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
140e0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
140f0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14100 20 68 61 73 68 20 74 61 62 6c 65 73 20 69 66 20   hash tables if 
14110 74 68 65 79 20 68 61 76 65 20 6e 6f 74 20 61 6c  they have not al
14120 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
14130 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
14140 3e 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >aHash==0 ){.   
14150 20 69 6e 74 20 6e 48 61 73 68 20 3d 20 70 43 6f   int nHash = pCo
14160 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 2b 20  nfig->nPrefix + 
14170 31 3b 0a 20 20 20 20 70 2d 3e 61 48 61 73 68 20  1;.    p->aHash 
14180 3d 20 28 46 74 73 33 48 61 73 68 2a 29 73 71 6c  = (Fts3Hash*)sql
14190 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
141a0 6f 66 28 46 74 73 33 48 61 73 68 29 20 2a 20 6e  of(Fts3Hash) * n
141b0 48 61 73 68 29 3b 0a 20 20 20 20 69 66 28 20 70  Hash);.    if( p
141c0 2d 3e 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->aHash==0 ){.  
141d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
141e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
141f0 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  lse{.      for(i
14200 3d 30 3b 20 69 3c 6e 48 61 73 68 3b 20 69 2b 2b  =0; i<nHash; i++
14210 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 48  ){.        fts3H
14220 61 73 68 49 6e 69 74 28 26 70 2d 3e 61 48 61 73  ashInit(&p->aHas
14230 68 5b 69 5d 2c 20 46 54 53 33 5f 48 41 53 48 5f  h[i], FTS3_HASH_
14240 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20  STRING, 0);.    
14250 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
14260 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
14270 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 6d 61 69  token to the mai
14280 6e 20 74 65 72 6d 73 20 68 61 73 68 20 74 61 62  n terms hash tab
14290 6c 65 2e 20 41 6e 64 20 74 6f 20 65 61 63 68 20  le. And to each 
142a0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 70 72 65 66  of the.  ** pref
142b0 69 78 20 68 61 73 68 20 74 61 62 6c 65 73 20 74  ix hash tables t
142c0 68 61 74 20 69 74 20 69 73 20 6c 61 72 67 65 20  hat it is large 
142d0 65 6e 6f 75 67 68 20 66 6f 72 2e 20 2a 2f 0a 20  enough for. */. 
142e0 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48 61   fts5AddTermToHa
142f0 73 68 28 70 2c 20 30 2c 20 69 43 6f 6c 2c 20 69  sh(p, 0, iCol, i
14300 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  Pos, pToken, nTo
14310 6b 65 6e 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ken);.  for(i=0;
14320 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   i<pConfig->nPre
14330 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  fix; i++){.    i
14340 66 28 20 6e 54 6f 6b 65 6e 3e 3d 70 43 6f 6e 66  f( nToken>=pConf
14350 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 20 29  ig->aPrefix[i] )
14360 7b 0a 20 20 20 20 20 20 66 74 73 35 41 64 64 54  {.      fts5AddT
14370 65 72 6d 54 6f 48 61 73 68 28 70 2c 20 69 2b 31  ermToHash(p, i+1
14380 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54  , iCol, iPos, pT
14390 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e 61  oken, pConfig->a
143a0 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20  Prefix[i]);.    
143b0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
143c0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
143d0 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65  gment-id for the
143e0 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
143f0 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ct..**.** If an 
14400 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
14410 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
14420 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
14430 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72  o-op. 0 is .** r
14440 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
14450 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
14460 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  int fts5Allocate
14470 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20  Segid(Fts5Index 
14480 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  *p, Fts5Structur
14490 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
144a0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 72  nt i;.  if( p->r
144b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
144c0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 66 6f 72 28  eturn 0;..  for(
144d0 69 3d 30 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29  i=0; i<100; i++)
144e0 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64  {.    int iSegid
144f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
14500 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
14510 69 6e 74 29 2c 20 28 76 6f 69 64 2a 29 26 69 53  int), (void*)&iS
14520 65 67 69 64 29 3b 0a 20 20 20 20 69 53 65 67 69  egid);.    iSegi
14530 64 20 3d 20 69 53 65 67 69 64 20 26 20 28 28 31  d = iSegid & ((1
14540 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44   << FTS5_DATA_ID
14550 5f 42 29 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  _B)-1);.    if( 
14560 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20  iSegid ){.      
14570 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
14580 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30        for(iLvl=0
14590 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
145a0 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
145b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
145c0 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63  g=0; iSeg<pStruc
145d0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
145e0 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
145f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65           if( iSe
14600 67 69 64 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c  gid==pStruct->aL
14610 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b  evel[iLvl].aSeg[
14620 69 53 65 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a  iSeg].iSegid ){.
14630 20 20 20 20 20 20 20 20 20 20 20 20 69 53 65 67              iSeg
14640 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  id = 0;.        
14650 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
14660 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14670 69 66 28 20 69 53 65 67 69 64 20 29 20 72 65 74  if( iSegid ) ret
14680 75 72 6e 20 69 53 65 67 69 64 3b 0a 20 20 7d 0a  urn iSegid;.  }.
14690 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
146a0 45 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  E_ERROR;.  retur
146b0 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46  n 0;.}..static F
146c0 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
146d0 74 20 2a 66 74 73 35 50 65 6e 64 69 6e 67 4d 65  t *fts5PendingMe
146e0 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
146f0 20 2a 70 2c 20 0a 20 20 46 74 73 35 50 65 6e 64   *p, .  Fts5Pend
14700 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70 4c 65 66  ingDoclist *pLef
14710 74 2c 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67  t,.  Fts5Pending
14720 44 6f 63 6c 69 73 74 20 2a 70 52 69 67 68 74 0a  Doclist *pRight.
14730 29 7b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67  ){.  Fts5Pending
14740 44 6f 63 6c 69 73 74 20 2a 70 31 20 3d 20 70 4c  Doclist *p1 = pL
14750 65 66 74 3b 0a 20 20 46 74 73 35 50 65 6e 64 69  eft;.  Fts5Pendi
14760 6e 67 44 6f 63 6c 69 73 74 20 2a 70 32 20 3d 20  ngDoclist *p2 = 
14770 70 52 69 67 68 74 3b 0a 20 20 46 74 73 35 50 65  pRight;.  Fts5Pe
14780 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70 52  ndingDoclist *pR
14790 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 50 65  et = 0;.  Fts5Pe
147a0 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 2a 70  ndingDoclist **p
147b0 70 4f 75 74 20 3d 20 26 70 52 65 74 3b 0a 0a 20  pOut = &pRet;.. 
147c0 20 77 68 69 6c 65 28 20 70 31 20 7c 7c 20 70 32   while( p1 || p2
147d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31 3d 3d   ){.    if( p1==
147e0 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 75  0 ){.      *ppOu
147f0 74 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 70 32  t = p2;.      p2
14800 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
14810 69 66 28 20 70 32 3d 3d 30 20 29 7b 0a 20 20 20  if( p2==0 ){.   
14820 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 31 3b 0a     *ppOut = p1;.
14830 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20        p1 = 0;.  
14840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14850 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 31  nt nCmp = MIN(p1
14860 2d 3e 6e 54 65 72 6d 2c 20 70 32 2d 3e 6e 54 65  ->nTerm, p2->nTe
14870 72 6d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  rm);.      int r
14880 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e  es = memcmp(p1->
14890 70 54 65 72 6d 2c 20 70 32 2d 3e 70 54 65 72 6d  pTerm, p2->pTerm
148a0 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 69  , nCmp);.      i
148b0 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
148c0 3d 20 70 31 2d 3e 6e 54 65 72 6d 20 2d 20 70 32  = p1->nTerm - p2
148d0 2d 3e 6e 54 65 72 6d 3b 0a 0a 20 20 20 20 20 20  ->nTerm;..      
148e0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
148f0 20 20 20 20 20 2f 2a 20 70 32 20 69 73 20 73 6d       /* p2 is sm
14900 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
14910 20 2a 70 70 4f 75 74 20 3d 20 70 32 3b 0a 20 20   *ppOut = p2;.  
14920 20 20 20 20 20 20 70 70 4f 75 74 20 3d 20 26 70        ppOut = &p
14930 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  2->pNext;.      
14940 20 20 70 32 20 3d 20 70 32 2d 3e 70 4e 65 78 74    p2 = p2->pNext
14950 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14960 20 20 20 20 20 20 20 2f 2a 20 70 31 20 69 73 20         /* p1 is 
14970 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20  smaller */.     
14980 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 31 3b 0a     *ppOut = p1;.
14990 20 20 20 20 20 20 20 20 70 70 4f 75 74 20 3d 20          ppOut = 
149a0 26 70 31 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  &p1->pNext;.    
149b0 20 20 20 20 70 31 20 3d 20 70 31 2d 3e 70 4e 65      p1 = p1->pNe
149c0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
149d0 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20    *ppOut = 0;.  
149e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
149f0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
14a00 20 45 78 74 72 61 63 74 20 61 6c 6c 20 74 6f 6b   Extract all tok
14a10 65 6e 73 20 66 72 6f 6d 20 68 61 73 68 20 74 61  ens from hash ta
14a20 62 6c 65 20 69 48 61 73 68 20 61 6e 64 20 6c 69  ble iHash and li
14a30 6e 6b 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  nk them into a l
14a40 69 73 74 0a 2a 2a 20 69 6e 20 73 6f 72 74 65 64  ist.** in sorted
14a50 20 6f 72 64 65 72 2e 20 54 68 65 20 68 61 73 68   order. The hash
14a60 20 74 61 62 6c 65 20 69 73 20 63 6c 65 61 72 65   table is cleare
14a70 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
14a80 6e 67 2e 20 49 74 20 69 73 0a 2a 2a 20 74 68 65  ng. It is.** the
14a90 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14aa0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
14ab0 20 66 72 65 65 20 74 68 65 20 65 6c 65 6d 65 6e   free the elemen
14ac0 74 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ts of the return
14ad0 65 64 0a 2a 2a 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ed.** list..**.*
14ae0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
14af0 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
14b00 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
14b10 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
14b20 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
14b30 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
14b40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
14b50 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
14b60 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
14b70 69 73 74 20 2a 66 74 73 35 50 65 6e 64 69 6e 67  ist *fts5Pending
14b80 4c 69 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a  List(Fts5Index *
14b90 70 2c 20 69 6e 74 20 69 48 61 73 68 29 7b 0a 20  p, int iHash){. 
14ba0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 65 72 67   const int nMerg
14bb0 65 53 6c 6f 74 20 3d 20 33 32 3b 0a 20 20 46 74  eSlot = 32;.  Ft
14bc0 73 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20  s3Hash *pHash;. 
14bd0 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70   Fts3HashElem *p
14be0 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E;              
14bf0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
14c00 69 61 62 6c 65 20 2a 2f 0a 20 20 46 74 73 35 50  iable */.  Fts5P
14c10 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 2a  endingDoclist **
14c20 61 70 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e  ap;.  Fts5Pendin
14c30 67 44 6f 63 6c 69 73 74 20 2a 70 4c 69 73 74 3b  gDoclist *pList;
14c40 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 70 20  .  int i;..  ap 
14c50 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  = fts5IdxMalloc(
14c60 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 65  p, sizeof(Fts5Pe
14c70 6e 64 69 6e 67 44 6f 63 6c 69 73 74 2a 29 20 2a  ndingDoclist*) *
14c80 20 6e 4d 65 72 67 65 53 6c 6f 74 29 3b 0a 20 20   nMergeSlot);.  
14c90 69 66 28 20 21 61 70 20 29 20 72 65 74 75 72 6e  if( !ap ) return
14ca0 20 30 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26   0;..  pHash = &
14cb0 70 2d 3e 61 48 61 73 68 5b 69 48 61 73 68 5d 3b  p->aHash[iHash];
14cc0 0a 20 20 66 6f 72 28 70 45 3d 66 74 73 33 48 61  .  for(pE=fts3Ha
14cd0 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
14ce0 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73 68 4e  pE; pE=fts3HashN
14cf0 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20 69 6e  ext(pE)){.    in
14d00 74 20 69 3b 0a 20 20 20 20 46 74 73 35 50 65 6e  t i;.    Fts5Pen
14d10 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70 44 6f  dingDoclist *pDo
14d20 63 6c 69 73 74 20 3d 20 28 46 74 73 35 50 65 6e  clist = (Fts5Pen
14d30 64 69 6e 67 44 6f 63 6c 69 73 74 2a 29 66 74 73  dingDoclist*)fts
14d40 33 48 61 73 68 44 61 74 61 28 70 45 29 3b 0a 20  3HashData(pE);. 
14d50 20 20 20 61 73 73 65 72 74 28 20 70 44 6f 63 6c     assert( pDocl
14d60 69 73 74 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b  ist->pNext==0 );
14d70 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 70  .    for(i=0; ap
14d80 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
14d90 20 70 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35   pDoclist = fts5
14da0 50 65 6e 64 69 6e 67 4d 65 72 67 65 28 70 2c 20  PendingMerge(p, 
14db0 70 44 6f 63 6c 69 73 74 2c 20 61 70 5b 69 5d 29  pDoclist, ap[i])
14dc0 3b 0a 20 20 20 20 20 20 61 70 5b 69 5d 20 3d 20  ;.      ap[i] = 
14dd0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 70 5b  0;.    }.    ap[
14de0 69 5d 20 3d 20 70 44 6f 63 6c 69 73 74 3b 0a 20  i] = pDoclist;. 
14df0 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b   }..  pList = 0;
14e00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d  .  for(i=0; i<nM
14e10 65 72 67 65 53 6c 6f 74 3b 20 69 2b 2b 29 7b 0a  ergeSlot; i++){.
14e20 20 20 20 20 70 4c 69 73 74 20 3d 20 66 74 73 35      pList = fts5
14e30 50 65 6e 64 69 6e 67 4d 65 72 67 65 28 70 2c 20  PendingMerge(p, 
14e40 70 4c 69 73 74 2c 20 61 70 5b 69 5d 29 3b 0a 20  pList, ap[i]);. 
14e50 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
14e60 65 65 28 61 70 29 3b 0a 20 20 66 74 73 33 48 61  ee(ap);.  fts3Ha
14e70 73 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a  shClear(pHash);.
14e80 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
14e90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  }.../*.** Discar
14ea0 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65  d all data curre
14eb0 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74  ntly cached in t
14ec0 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a  he hash-tables..
14ed0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14ee0 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
14ef0 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ata(Fts5Index *p
14f00 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
14f10 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
14f20 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  onfig;.  int i;.
14f30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
14f40 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
14f50 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 48 61  i++){.    Fts3Ha
14f60 73 68 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e  sh *pHash = &p->
14f70 61 48 61 73 68 5b 69 5d 3b 0a 20 20 20 20 46 74  aHash[i];.    Ft
14f80 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 3b 20  s3HashElem *pE; 
14f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14fa0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
14fb0 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 45  le */.    for(pE
14fc0 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28 70  =fts3HashFirst(p
14fd0 48 61 73 68 29 3b 20 70 45 3b 20 70 45 3d 66 74  Hash); pE; pE=ft
14fe0 73 33 48 61 73 68 4e 65 78 74 28 70 45 29 29 7b  s3HashNext(pE)){
14ff0 0a 20 20 20 20 20 20 46 74 73 35 50 65 6e 64 69  .      Fts5Pendi
15000 6e 67 44 6f 63 6c 69 73 74 20 2a 70 44 6f 63 6c  ngDoclist *pDocl
15010 69 73 74 20 3d 20 28 46 74 73 35 50 65 6e 64 69  ist = (Fts5Pendi
15020 6e 67 44 6f 63 6c 69 73 74 2a 29 66 74 73 33 48  ngDoclist*)fts3H
15030 61 73 68 44 61 74 61 28 70 45 29 3b 0a 20 20 20  ashData(pE);.   
15040 20 20 20 66 74 73 35 46 72 65 65 50 65 6e 64 69     fts5FreePendi
15050 6e 67 44 6f 63 6c 69 73 74 28 70 44 6f 63 6c 69  ngDoclist(pDocli
15060 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  st);.    }.    f
15070 74 73 33 48 61 73 68 43 6c 65 61 72 28 70 48 61  ts3HashClear(pHa
15080 73 68 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50  sh);.  }.  p->nP
15090 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
150a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
150b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
150c0 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73  prefix, in bytes
150d0 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 28 6e  , that buffer (n
150e0 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72 65 73  New/pNew) shares
150f0 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65 72 20  .** with buffer 
15100 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a  (nOld/pOld)..*/.
15110 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
15120 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20  refixCompress(. 
15130 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74   int nOld, const
15140 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74   u8 *pOld,.  int
15150 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38 20   nNew, const u8 
15160 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69  *pNew.){.  int i
15170 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
15180 4e 65 77 20 26 26 20 69 3c 6e 4f 6c 64 3b 20 69  New && i<nOld; i
15190 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ++){.    if( pOl
151a0 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20  d[i]!=pNew[i] ) 
151b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
151c0 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
151d0 49 66 20 61 6e 20 22 6e 45 6d 70 74 79 22 20 72  If an "nEmpty" r
151e0 65 63 6f 72 64 20 6d 75 73 74 20 62 65 20 77 72  ecord must be wr
151f0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 2d 74  itten to the b-t
15200 72 65 65 20 62 65 66 6f 72 65 20 74 68 65 20 6e  ree before the n
15210 65 78 74 0a 2a 2a 20 74 65 72 6d 2c 20 77 72 69  ext.** term, wri
15220 74 65 20 69 74 20 6e 6f 77 2e 0a 2a 2f 0a 73 74  te it now..*/.st
15230 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
15240 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 46  iteBtreeNEmpty(F
15250 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
15260 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
15270 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72 69  ter){.  if( pWri
15280 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20  ter->nEmpty ){. 
15290 20 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30     int bFlag = 0
152a0 3b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  ;.    Fts5PageWr
152b0 69 74 65 72 20 2a 70 50 67 3b 0a 20 20 20 20 70  iter *pPg;.    p
152c0 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  Pg = &pWriter->a
152d0 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 20 20 69  Writer[1];.    i
152e0 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  f( pWriter->nEmp
152f0 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ty>=FTS5_MIN_DLI
15300 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  DX_SIZE ){.     
15310 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54 53 35   i64 iKey = FTS5
15320 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57  _DOCLIST_IDX_ROW
15330 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
15340 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
15350 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 0a 20  iter->iSegid, . 
15360 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72           pWriter
15370 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
15380 6f 20 2d 20 31 20 2d 20 70 57 72 69 74 65 72 2d  o - 1 - pWriter-
15390 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20 20 29 3b  >nEmpty.      );
153a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
153b0 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2e 6e 3e  Writer->dlidx.n>
153c0 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  0 );.      fts5D
153d0 61 74 61 57 72 69 74 65 28 70 2c 20 69 4b 65 79  ataWrite(p, iKey
153e0 2c 20 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78  , pWriter->dlidx
153f0 2e 70 2c 20 70 57 72 69 74 65 72 2d 3e 64 6c 69  .p, pWriter->dli
15400 64 78 2e 6e 29 3b 0a 20 20 20 20 20 20 62 46 6c  dx.n);.      bFl
15410 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ag = 1;.    }.  
15420 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
15430 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
15440 20 26 70 50 67 2d 3e 62 75 66 2c 20 62 46 6c 61   &pPg->buf, bFla
15450 67 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  g);.    fts5Buff
15460 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
15470 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75 66  p->rc, &pPg->buf
15480 2c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  , pWriter->nEmpt
15490 79 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  y);.    pWriter-
154a0 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 7d  >nEmpty = 0;.  }
154b0 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f  ..  /* Whether o
154c0 72 20 6e 6f 74 20 69 74 20 77 61 73 20 77 72 69  r not it was wri
154d0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2c 20 7a 65  tten to disk, ze
154e0 72 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69  ro the doclist i
154f0 6e 64 65 78 20 61 74 20 74 68 69 73 0a 20 20 2a  ndex at this.  *
15500 2a 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 73 71 6c  * point */.  sql
15510 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
15520 72 6f 28 26 70 57 72 69 74 65 72 2d 3e 64 6c 69  ro(&pWriter->dli
15530 64 78 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  dx);.  pWriter->
15540 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 20  bDlidxPrevValid 
15550 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  = 0;.}..static v
15560 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
15570 65 65 47 72 6f 77 28 46 74 73 35 49 6e 64 65 78  eeGrow(Fts5Index
15580 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
15590 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
155a0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
155b0 61 4e 65 77 3b 0a 20 20 46 74 73 35 50 61 67 65  aNew;.  Fts5Page
155c0 57 72 69 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20  Writer *pNew;.  
155d0 69 6e 74 20 6e 4e 65 77 20 3d 20 73 69 7a 65 6f  int nNew = sizeo
155e0 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72  f(Fts5PageWriter
155f0 29 20 2a 20 28 70 57 72 69 74 65 72 2d 3e 6e 57  ) * (pWriter->nW
15600 72 69 74 65 72 2b 31 29 3b 0a 0a 20 20 61 4e 65  riter+1);..  aNe
15610 77 20 3d 20 28 46 74 73 35 50 61 67 65 57 72 69  w = (Fts5PageWri
15620 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ter*)sqlite3_rea
15630 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 61 57  lloc(pWriter->aW
15640 72 69 74 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20  riter, nNew);.  
15650 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65  if( aNew==0 ) re
15660 74 75 72 6e 3b 0a 0a 20 20 70 4e 65 77 20 3d 20  turn;..  pNew = 
15670 26 61 4e 65 77 5b 70 57 72 69 74 65 72 2d 3e 6e  &aNew[pWriter->n
15680 57 72 69 74 65 72 5d 3b 0a 20 20 6d 65 6d 73 65  Writer];.  memse
15690 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
156a0 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72  f(Fts5PageWriter
156b0 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 67 6e 6f  ));.  pNew->pgno
156c0 20 3d 20 31 3b 0a 20 20 66 74 73 35 42 75 66 66   = 1;.  fts5Buff
156d0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
156e0 70 2d 3e 72 63 2c 20 26 70 4e 65 77 2d 3e 62 75  p->rc, &pNew->bu
156f0 66 2c 20 31 29 3b 0a 0a 20 20 70 57 72 69 74 65  f, 1);..  pWrite
15700 72 2d 3e 6e 57 72 69 74 65 72 2b 2b 3b 0a 20 20  r->nWriter++;.  
15710 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
15720 20 3d 20 61 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a   = aNew;.}../*.*
15730 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
15740 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c   once for each l
15750 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20  eaf page except 
15760 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20 63  the first that c
15770 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65  ontains.** at le
15780 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72  ast one term. Ar
15790 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54  gument (nTerm/pT
157a0 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69  erm) is the spli
157b0 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74  t-key - a term t
157c0 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72  hat.** is larger
157d0 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20   than all terms 
157e0 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69  written to earli
157f0 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65  er leaves, and e
15800 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d  qual to or.** sm
15810 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66  aller than the f
15820 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  irst term on the
15830 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a   new leaf..**.**
15840 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
15850 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
15860 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
15870 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61  s5Index.rc. If a
15880 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61  n error.** has a
15890 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
158a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
158b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
158c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
158d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
158e0 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a  WriteBtreeTerm(.
158f0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
15920 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
15930 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
15940 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
15950 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
15960 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63  /.  int nTerm, c
15970 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20  onst u8 *pTerm  
15980 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72      /* First ter
15990 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f  m on new page */
159a0 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65 69 67 68  .){.  int iHeigh
159b0 74 3b 0a 20 20 66 6f 72 28 69 48 65 69 67 68 74  t;.  for(iHeight
159c0 3d 31 3b 20 31 3b 20 69 48 65 69 67 68 74 2b 2b  =1; 1; iHeight++
159d0 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57  ){.    Fts5PageW
159e0 72 69 74 65 72 20 2a 70 50 61 67 65 3b 0a 0a 20  riter *pPage;.. 
159f0 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3e 3d     if( iHeight>=
15a00 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
15a10 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
15a20 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c 20  iteBtreeGrow(p, 
15a30 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  pWriter);.      
15a40 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
15a50 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rn;.    }.    pP
15a60 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
15a70 61 57 72 69 74 65 72 5b 69 48 65 69 67 68 74 5d  aWriter[iHeight]
15a80 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ;..    fts5Write
15a90 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c 20 70  BtreeNEmpty(p, p
15aa0 57 72 69 74 65 72 29 3b 0a 0a 20 20 20 20 69 66  Writer);..    if
15ab0 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
15ac0 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  p->pgsz ){.     
15ad0 20 2f 2a 20 70 50 61 67 65 20 77 69 6c 6c 20 62   /* pPage will b
15ae0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  e written to dis
15af0 6b 2e 20 54 68 65 20 74 65 72 6d 20 77 69 6c 6c  k. The term will
15b00 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
15b10 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
15b20 72 65 6e 74 20 6f 66 20 70 50 61 67 65 2e 20 20  rent of pPage.  
15b30 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  */.      i64 iRo
15b40 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
15b50 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20  NT_ROWID(.      
15b60 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64      pWriter->iId
15b70 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
15b80 69 64 2c 20 69 48 65 69 67 68 74 2c 20 70 50 61  id, iHeight, pPa
15b90 67 65 2d 3e 70 67 6e 6f 0a 20 20 20 20 20 20 29  ge->pgno.      )
15ba0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
15bb0 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c  Write(p, iRowid,
15bc0 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70   pPage->buf.p, p
15bd0 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20  Page->buf.n);.  
15be0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
15bf0 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b  ro(&pPage->buf);
15c00 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
15c10 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 74 65  rZero(&pPage->te
15c20 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  rm);.      fts5B
15c30 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
15c40 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
15c50 2d 3e 62 75 66 2c 20 70 50 61 67 65 5b 2d 31 5d  ->buf, pPage[-1]
15c60 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50  .pgno);.      pP
15c70 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20  age->pgno++;.   
15c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
15c90 74 20 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65  t nPre = fts5Pre
15ca0 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67  fixCompress(pPag
15cb0 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65  e->term.n, pPage
15cc0 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c  ->term.p, nTerm,
15cd0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66   pTerm);.      f
15ce0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
15cf0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
15d00 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 2b  Page->buf, nPre+
15d10 32 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  2);.      fts5Bu
15d20 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
15d30 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
15d40 3e 62 75 66 2c 20 6e 54 65 72 6d 2d 6e 50 72 65  >buf, nTerm-nPre
15d50 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
15d60 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
15d70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
15d80 66 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 2c 20 70  f, nTerm-nPre, p
15d90 54 65 72 6d 2b 6e 50 72 65 29 3b 0a 20 20 20 20  Term+nPre);.    
15da0 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
15db0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
15dc0 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
15dd0 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
15de0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
15df0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
15e00 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28  riteBtreeNoTerm(
15e10 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e30 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
15e40 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
15e50 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
15e60 72 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  riter          /
15e70 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
15e80 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 57 72 69  */.){.  if( pWri
15e90 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
15ea0 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a  InPage ){.    /*
15eb0 20 4e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68   No rowids on th
15ec0 69 73 20 70 61 67 65 2e 20 41 70 70 65 6e 64 20  is page. Append 
15ed0 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20  an 0x00 byte to 
15ee0 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20  the current .   
15ef0 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65   ** doclist-inde
15f00 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  x */.    sqlite3
15f10 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
15f20 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
15f30 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2c 20  pWriter->dlidx, 
15f40 30 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65  0);.  }.  pWrite
15f50 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a  r->nEmpty++;.}..
15f60 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77  /*.** Rowid iRow
15f70 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  id has just been
15f80 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
15f90 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
15fa0 67 65 2e 20 41 73 20 69 74 20 69 73 0a 2a 2a 20  ge. As it is.** 
15fb0 74 68 65 20 66 69 72 73 74 20 6f 6e 20 69 74 73  the first on its
15fc0 20 70 61 67 65 2c 20 61 70 70 65 6e 64 20 61 6e   page, append an
15fd0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75   entry to the cu
15fe0 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e  rrent doclist-in
15ff0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
16000 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
16010 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35  dxAppend(.  Fts5
16020 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
16030 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
16040 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  ter, .  i64 iRow
16050 69 64 0a 29 7b 0a 20 20 69 36 34 20 69 56 61 6c  id.){.  i64 iVal
16060 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ;.  if( pWriter-
16070 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64  >bDlidxPrevValid
16080 20 29 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20 70   ){.    iVal = p
16090 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50 72  Writer->iDlidxPr
160a0 65 76 20 2d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  ev - iRowid;.  }
160b0 65 6c 73 65 7b 0a 20 20 20 20 69 56 61 6c 20 3d  else{.    iVal =
160c0 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 73   iRowid;.  }.  s
160d0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
160e0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
160f0 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 64  >rc, &pWriter->d
16100 6c 69 64 78 2c 20 69 56 61 6c 29 3b 0a 20 20 70  lidx, iVal);.  p
16110 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72  Writer->bDlidxPr
16120 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 70  evValid = 1;.  p
16130 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50 72  Writer->iDlidxPr
16140 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a  ev = iRowid;.}..
16150 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16160 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46  WriteFlushLeaf(F
16170 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
16180 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
16190 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ter){.  static c
161a0 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d  onst u8 zero[] =
161b0 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30   { 0x00, 0x00, 0
161c0 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46  x00, 0x00 };.  F
161d0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
161e0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
161f0 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 69  >aWriter[0];.  i
16200 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 69 66  64 iRowid;..  if
16210 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d  ( pPage->term.n=
16220 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
16230 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e  term was written
16240 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a   to this page. *
16250 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d  /.    assert( 0=
16260 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61  =fts5GetU16(&pPa
16270 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b  ge->buf.p[2]) );
16280 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74  .    fts5WriteBt
16290 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72  reeNoTerm(p, pWr
162a0 69 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iter);.  }..  /*
162b0 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
162c0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  nt page to the d
162d0 62 2e 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d  b. */.  iRowid =
162e0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
162f0 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64  WID(pWriter->iId
16300 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
16310 69 64 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 67  id, 0, pPage->pg
16320 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57  no);.  fts5DataW
16330 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20  rite(p, iRowid, 
16340 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50  pPage->buf.p, pP
16350 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20  age->buf.n);..  
16360 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
16370 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a  e next page. */.
16380 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
16390 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20  (&pPage->buf);. 
163a0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
163b0 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20  &pPage->term);. 
163c0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
163d0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
163e0 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65  Page->buf, 4, ze
163f0 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  ro);.  pPage->pg
16400 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  no++;..  /* Incr
16410 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20  ease the leaves 
16420 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20  written counter 
16430 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c  */.  pWriter->nL
16440 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 7d 0a  eafWritten++;.}.
16450 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65  ./*.** Append te
16460 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74  rm pTerm/nTerm t
16470 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65  o the segment be
16480 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20 74  ing written by t
16490 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65 64  he writer passed
164a0 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
164b0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
164c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
164d0 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
164e0 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
164f0 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
16500 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
16510 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
16520 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
16530 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
16540 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
16550 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73  ppendTerm(.  Fts
16560 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
16570 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
16580 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72  iter,.  int nTer
16590 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  m, const u8 *pTe
165a0 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72  rm .){.  int nPr
165b0 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
165c0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
165d0 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70  s of prefix comp
165e0 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d  ression for term
165f0 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
16600 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
16610 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
16620 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  0];..  assert( p
16630 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 7c  Page->buf.n==0 |
16640 7c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34  | pPage->buf.n>4
16650 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
16660 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  >buf.n==0 ){.   
16670 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69 72   /* Zero the fir
16680 73 74 20 74 65 72 6d 20 61 6e 64 20 66 69 72 73  st term and firs
16690 74 20 64 6f 63 69 64 20 66 69 65 6c 64 73 20 2a  t docid fields *
166a0 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
166b0 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b  st u8 zero[] = {
166c0 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
166d0 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20 20 66  0, 0x00 };.    f
166e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
166f0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
16700 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f  ge->buf, 4, zero
16710 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
16720 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20  Page->term.n==0 
16730 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
16740 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a  rc ) return;.  .
16750 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
16760 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  m.n==0 ){.    /*
16770 20 55 70 64 61 74 65 20 74 68 65 20 22 66 69 72   Update the "fir
16780 73 74 20 74 65 72 6d 22 20 66 69 65 6c 64 20 6f  st term" field o
16790 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  f the page heade
167a0 72 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  r. */.    assert
167b0 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32  ( pPage->buf.p[2
167c0 5d 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 62  ]==0 && pPage->b
167d0 75 66 2e 70 5b 33 5d 3d 3d 30 20 29 3b 0a 20 20  uf.p[3]==0 );.  
167e0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50    fts5PutU16(&pP
167f0 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 70  age->buf.p[2], p
16800 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20  Page->buf.n);.  
16810 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a 20    nPrefix = 0;. 
16820 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
16830 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 21  aWriter[0].pgno!
16840 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =1 ){.      fts5
16850 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 70  WriteBtreeTerm(p
16860 2c 20 70 57 72 69 74 65 72 2c 20 6e 54 65 72 6d  , pWriter, nTerm
16870 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
16880 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
16890 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20  ->aWriter[0];.  
168a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
168b0 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35 50   nPrefix = fts5P
168c0 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20  refixCompress(. 
168d0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 74 65         pPage->te
168e0 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
168f0 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
16900 6d 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 74 73  m.    );.    fts
16910 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
16920 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
16930 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78  ge->buf, nPrefix
16940 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  );.  }..  /* App
16950 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  end the number o
16960 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64  f bytes of new d
16970 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65  ata, then the te
16980 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20  rm data itself. 
16990 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e   ** to the page.
169a0 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72   */.  fts5Buffer
169b0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
169c0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
169d0 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69  , nTerm - nPrefi
169e0 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  x);.  fts5Buffer
169f0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
16a00 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
16a10 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c  nTerm - nPrefix,
16a20 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d   &pTerm[nPrefix]
16a30 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  );..  /* Update 
16a40 74 68 65 20 46 74 73 35 50 61 67 65 57 72 69 74  the Fts5PageWrit
16a50 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a  er.term field. *
16a60 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65  /.  fts5BufferSe
16a70 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
16a80 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70  ->term, nTerm, p
16a90 54 65 72 6d 29 3b 0a 0a 20 20 70 57 72 69 74 65  Term);..  pWrite
16aa0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
16ab0 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72 69  Page = 0;.  pWri
16ac0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
16ad0 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a  InDoclist = 1;..
16ae0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
16af0 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ent leaf page is
16b00 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20   full, flush it 
16b10 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66  to disk. */.  if
16b20 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
16b30 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66  p->pgsz ){.    f
16b40 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
16b50 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
16b60 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
16b70 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
16b80 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
16b90 41 70 70 65 6e 64 20 61 20 64 6f 63 69 64 20 74  Append a docid t
16ba0 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75  o the writers ou
16bb0 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  tput. .*/.static
16bc0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
16bd0 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74  ppendRowid(.  Ft
16be0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
16bf0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16c00 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f  riter,.  i64 iRo
16c10 77 69 64 0a 29 7b 0a 20 20 46 74 73 35 50 61 67  wid.){.  Fts5Pag
16c20 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
16c30 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
16c40 65 72 5b 30 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20  er[0];..  /* If 
16c50 74 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68  this is to be th
16c60 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 77 72  e first docid wr
16c70 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67  itten to the pag
16c80 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20 2a 2a  e, set the .  **
16c90 20 64 6f 63 69 64 2d 70 6f 69 6e 74 65 72 20 69   docid-pointer i
16ca0 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  n the page-heade
16cb0 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61  r. Also append a
16cc0 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c   value to the dl
16cd0 69 64 78 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c  idx.  ** buffer,
16ce0 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63 6c 69   in case a docli
16cf0 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65 71 75  st-index is requ
16d00 69 72 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ired.  */.  if( 
16d10 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
16d20 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
16d30 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
16d40 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65  ge->buf.p, pPage
16d50 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74  ->buf.n);.    ft
16d60 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
16d70 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69  nd(p, pWriter, i
16d80 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Rowid);.  }..  /
16d90 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f 63 69  * Write the doci
16da0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69  d. */.  if( pWri
16db0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
16dc0 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72  InDoclist || pWr
16dd0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
16de0 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 66  dInPage ){.    f
16df0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
16e00 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
16e10 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69  Page->buf, iRowi
16e20 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
16e30 20 61 73 73 65 72 74 28 20 69 52 6f 77 69 64 3c   assert( iRowid<
16e40 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
16e50 77 69 64 20 29 3b 0a 20 20 20 20 66 74 73 35 42  wid );.    fts5B
16e60 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
16e70 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
16e80 2d 3e 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e  ->buf, pWriter->
16e90 69 50 72 65 76 52 6f 77 69 64 20 2d 20 69 52 6f  iPrevRowid - iRo
16ea0 77 69 64 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69  wid);.  }.  pWri
16eb0 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
16ec0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 57 72 69  = iRowid;.  pWri
16ed0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
16ee0 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20  InDoclist = 0;. 
16ef0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
16f00 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
16f10 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62  ..  if( pPage->b
16f20 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73 7a 20 29 7b  uf.n>=p->pgsz ){
16f30 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c  .    fts5WriteFl
16f40 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
16f50 65 72 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  er);.    pWriter
16f60 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
16f70 61 67 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  age = 1;.  }.}..
16f80 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16f90 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
16fa0 73 74 49 6e 74 28 0a 20 20 46 74 73 35 49 6e 64  stInt(.  Fts5Ind
16fb0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
16fc0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
16fd0 2c 0a 20 20 69 6e 74 20 69 56 61 6c 0a 29 7b 0a  ,.  int iVal.){.
16fe0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
16ff0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
17000 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a  er->aWriter[0];.
17010 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
17020 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
17030 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 56   &pPage->buf, iV
17040 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  al);.  if( pPage
17050 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73 7a  ->buf.n>=p->pgsz
17060 20 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69 74   ){.    fts5Writ
17070 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
17080 72 69 74 65 72 29 3b 0a 20 20 20 20 70 57 72 69  riter);.    pWri
17090 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
170a0 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d 0a  InPage = 1;.  }.
170b0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
170c0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65  ts5WriteAppendZe
170d0 72 6f 62 79 74 65 28 46 74 73 35 49 6e 64 65 78  robyte(Fts5Index
170e0 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
170f0 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
17100 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
17110 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
17120 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
17130 5b 30 5d 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a  [0].buf, 0);.}..
17140 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
17150 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 65 6e 64  contents of pend
17160 69 6e 67 2d 64 6f 63 6c 69 73 74 20 6f 62 6a 65  ing-doclist obje
17170 63 74 20 70 44 6f 63 6c 69 73 74 20 74 6f 20 77  ct pDoclist to w
17180 72 69 74 65 72 20 70 57 72 69 74 65 72 2e 0a 2a  riter pWriter..*
17190 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
171a0 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
171b0 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
171c0 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
171d0 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
171e0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
171f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
17200 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
17210 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
17220 74 65 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  tePendingDoclist
17230 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
17240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17250 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
17260 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
17270 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
17280 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
17290 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 69 73  /* Write to this
172a0 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   writer object *
172b0 2f 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44  /.  Fts5PendingD
172c0 6f 63 6c 69 73 74 20 2a 70 44 6f 63 6c 69 73 74  oclist *pDoclist
172d0 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
172e0 6f 20 77 72 69 74 65 20 74 6f 20 70 57 72 69 74  o write to pWrit
172f0 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 50  er */.){.  Fts5P
17300 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20 2a 70  endingPoslist *p
17310 50 6f 73 6c 69 73 74 3b 20 20 20 2f 2a 20 55 73  Poslist;   /* Us
17320 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
17330 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73  rough the doclis
17340 74 20 2a 2f 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  t */..  /* Appen
17350 64 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  d the term */.  
17360 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
17370 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20  erm(p, pWriter, 
17380 70 44 6f 63 6c 69 73 74 2d 3e 6e 54 65 72 6d 2c  pDoclist->nTerm,
17390 20 70 44 6f 63 6c 69 73 74 2d 3e 70 54 65 72 6d   pDoclist->pTerm
173a0 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20  );..  /* Append 
173b0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
173c0 74 20 66 6f 72 20 65 61 63 68 20 72 6f 77 69 64  t for each rowid
173d0 20 2a 2f 0a 20 20 66 6f 72 28 70 50 6f 73 6c 69   */.  for(pPosli
173e0 73 74 3d 70 44 6f 63 6c 69 73 74 2d 3e 70 50 6f  st=pDoclist->pPo
173f0 73 6c 69 73 74 3b 20 70 50 6f 73 6c 69 73 74 3b  slist; pPoslist;
17400 20 70 50 6f 73 6c 69 73 74 3d 70 50 6f 73 6c 69   pPoslist=pPosli
17410 73 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  st->pNext){.    
17420 69 6e 74 20 69 20 3d 20 30 3b 0a 0a 20 20 20 20  int i = 0;..    
17430 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f  /* Append the ro
17440 77 69 64 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20  wid itself */.  
17450 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
17460 64 52 6f 77 69 64 28 70 2c 20 70 57 72 69 74 65  dRowid(p, pWrite
17470 72 2c 20 70 50 6f 73 6c 69 73 74 2d 3e 69 52 6f  r, pPoslist->iRo
17480 77 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  wid);..    /* Ap
17490 70 65 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66  pend the size of
174a0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
174b0 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  st in bytes */. 
174c0 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
174d0 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 70 2c 20  ndPoslistInt(p, 
174e0 70 57 72 69 74 65 72 2c 20 70 50 6f 73 6c 69 73  pWriter, pPoslis
174f0 74 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 20 20  t->buf.n);..    
17500 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 6f 73 69  /* Copy the posi
17510 74 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65  tion list to the
17520 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
17530 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3c  */.    while( i<
17540 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2e 6e 29  pPoslist->buf.n)
17550 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c  {.      int iVal
17560 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74  ;.      i += get
17570 56 61 72 69 6e 74 33 32 28 26 70 50 6f 73 6c 69  Varint32(&pPosli
17580 73 74 2d 3e 62 75 66 2e 70 5b 69 5d 2c 20 69 56  st->buf.p[i], iV
17590 61 6c 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57  al);.      fts5W
175a0 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
175b0 74 49 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2c  tInt(p, pWriter,
175c0 20 69 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iVal);.    }.  
175d0 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
175e0 65 20 64 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e  e doclist termin
175f0 61 74 6f 72 20 2a 2f 0a 20 20 66 74 73 35 57 72  ator */.  fts5Wr
17600 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74  iteAppendZerobyt
17610 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 7d  e(p, pWriter);.}
17620 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
17630 79 20 64 61 74 61 20 63 61 63 68 65 64 20 62 79  y data cached by
17640 20 74 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65   the writer obje
17650 63 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ct to the databa
17660 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20  se. Free any.** 
17670 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
17680 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
17690 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  writer..*/.stati
176a0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
176b0 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e  Finish(.  Fts5In
176c0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
176d0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
176e0 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r,         /* Wr
176f0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
17700 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 2c 20   int *pnHeight, 
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20   /* OUT: Height 
17730 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 2a 2f  of the b-tree */
17740 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20  .  int *pnLeaf  
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
17770 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
17780 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a  in b-tree */.){.
17790 20 20 69 6e 74 20 69 3b 0a 20 20 2a 70 6e 4c 65    int i;.  *pnLe
177a0 61 66 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 57  af = pWriter->aW
177b0 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 3b 0a 20  riter[0].pgno;. 
177c0 20 69 66 28 20 2a 70 6e 4c 65 61 66 3d 3d 31 20   if( *pnLeaf==1 
177d0 26 26 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69  && pWriter->aWri
177e0 74 65 72 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20  ter[0].buf.n==0 
177f0 29 7b 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d  ){.    *pnLeaf =
17800 20 30 3b 0a 20 20 20 20 2a 70 6e 48 65 69 67 68   0;.    *pnHeigh
17810 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
17820 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
17830 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
17840 72 29 3b 0a 20 20 20 20 69 66 28 20 70 57 72 69  r);.    if( pWri
17850 74 65 72 2d 3e 6e 57 72 69 74 65 72 3d 3d 31 20  ter->nWriter==1 
17860 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  && pWriter->nEmp
17870 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ty>=FTS5_MIN_DLI
17880 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  DX_SIZE ){.     
17890 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 47   fts5WriteBtreeG
178a0 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b  row(p, pWriter);
178b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
178c0 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3e  Writer->nWriter>
178d0 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  1 ){.      fts5W
178e0 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28  riteBtreeNEmpty(
178f0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
17900 20 7d 0a 20 20 20 20 2a 70 6e 48 65 69 67 68 74   }.    *pnHeight
17910 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69   = pWriter->nWri
17920 74 65 72 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ter;..    for(i=
17930 31 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57  1; i<pWriter->nW
17940 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  riter; i++){.   
17950 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
17960 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65  r *pPg = &pWrite
17970 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20  r->aWriter[i];. 
17980 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
17990 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  te(p, .         
179a0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
179b0 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64  WID(pWriter->iId
179c0 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
179d0 69 64 2c 20 69 2c 20 70 50 67 2d 3e 70 67 6e 6f  id, i, pPg->pgno
179e0 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 50  ), .          pP
179f0 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62  g->buf.p, pPg->b
17a00 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  uf.n.      );.  
17a10 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
17a20 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57  0; i<pWriter->nW
17a30 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  riter; i++){.   
17a40 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
17a50 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d  *pPg = &pWriter-
17a60 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20  >aWriter[i];.   
17a70 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
17a80 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a 20 20 20  &pPg->term);.   
17a90 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
17aa0 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20 7d 0a  &pPg->buf);.  }.
17ab0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17ac0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 29  Writer->aWriter)
17ad0 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
17ae0 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69 74  ufferFree(&pWrit
17af0 65 72 2d 3e 64 6c 69 64 78 29 3b 0a 7d 0a 0a 73  er->dlidx);.}..s
17b00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
17b10 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35  riteInit(.  Fts5
17b20 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
17b30 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
17b40 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 49 64 78  ter, .  int iIdx
17b50 2c 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a  , int iSegid.){.
17b60 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72    memset(pWriter
17b70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
17b80 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70  SegWriter));.  p
17b90 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69  Writer->iIdx = i
17ba0 49 64 78 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  Idx;.  pWriter->
17bb0 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
17bc0 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72  ..  pWriter->aWr
17bd0 69 74 65 72 20 3d 20 28 46 74 73 35 50 61 67 65  iter = (Fts5Page
17be0 57 72 69 74 65 72 2a 29 66 74 73 35 49 64 78 4d  Writer*)fts5IdxM
17bf0 61 6c 6c 6f 63 28 70 2c 73 69 7a 65 6f 66 28 46  alloc(p,sizeof(F
17c00 74 73 35 50 61 67 65 57 72 69 74 65 72 29 29 3b  ts5PageWriter));
17c10 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
17c20 61 57 72 69 74 65 72 3d 3d 30 20 29 20 72 65 74  aWriter==0 ) ret
17c30 75 72 6e 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  urn;.  pWriter->
17c40 6e 57 72 69 74 65 72 20 3d 20 31 3b 0a 20 20 70  nWriter = 1;.  p
17c50 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
17c60 30 5d 2e 70 67 6e 6f 20 3d 20 31 3b 0a 7d 0a 0a  0].pgno = 1;.}..
17c70 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
17c80 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70 70 65  WriteInitForAppe
17c90 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nd(.  Fts5Index 
17ca0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17cb0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
17cc0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
17cd0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
17ce0 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
17cf0 20 20 2f 2a 20 57 72 69 74 65 72 20 74 6f 20 69    /* Writer to i
17d00 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 69  nitialize */.  i
17d10 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d30 2a 20 49 6e 64 65 78 20 73 65 67 6d 65 6e 74 20  * Index segment 
17d40 69 73 20 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a  is a part of */.
17d50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
17d60 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20  egment *pSeg    
17d70 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6f 62 6a    /* Segment obj
17d80 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  ect to append to
17d90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
17da0 74 65 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67  te = pSeg->nHeig
17db0 68 74 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  ht * sizeof(Fts5
17dc0 50 61 67 65 57 72 69 74 65 72 29 3b 0a 20 20 6d  PageWriter);.  m
17dd0 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30  emset(pWriter, 0
17de0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
17df0 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69  Writer));.  pWri
17e00 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78  ter->iIdx = iIdx
17e10 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65  ;.  pWriter->iSe
17e20 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67  gid = pSeg->iSeg
17e30 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61  id;.  pWriter->a
17e40 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 50 61  Writer = (Fts5Pa
17e50 67 65 57 72 69 74 65 72 2a 29 66 74 73 35 49 64  geWriter*)fts5Id
17e60 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65  xMalloc(p, nByte
17e70 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57  );.  pWriter->nW
17e80 72 69 74 65 72 20 3d 20 70 53 65 67 2d 3e 6e 48  riter = pSeg->nH
17e90 65 69 67 68 74 3b 0a 0a 20 20 69 66 28 20 70 2d  eight;..  if( p-
17ea0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
17eb0 7b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d  {.    int pgno =
17ec0 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   1;.    int i;. 
17ed0 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69     pWriter->aWri
17ee0 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 53  ter[0].pgno = pS
17ef0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a  eg->pgnoLast+1;.
17f00 20 20 20 20 66 6f 72 28 69 3d 70 53 65 67 2d 3e      for(i=pSeg->
17f10 6e 48 65 69 67 68 74 2d 31 3b 20 69 3e 30 3b 20  nHeight-1; i>0; 
17f20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 36 34 20  i--){.      i64 
17f30 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
17f40 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
17f50 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74  ter->iIdx, pWrit
17f60 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
17f70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 46 74 73 35  gno);.      Fts5
17f80 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 67 20  PageWriter *pPg 
17f90 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
17fa0 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 70 50  ter[i];.      pP
17fb0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
17fc0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 42 75        fts5DataBu
17fd0 66 66 65 72 28 70 2c 20 26 70 50 67 2d 3e 62 75  ffer(p, &pPg->bu
17fe0 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  f, iRowid);.    
17ff0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
18000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18010 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73    Fts5NodeIter s
18020 73 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e  s;.        fts5N
18030 6f 64 65 49 74 65 72 49 6e 69 74 28 70 50 67 2d  odeIterInit(pPg-
18040 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66  >buf.p, pPg->buf
18050 2e 6e 2c 20 26 73 73 29 3b 0a 20 20 20 20 20 20  .n, &ss);.      
18060 20 20 77 68 69 6c 65 28 20 73 73 2e 61 44 61 74    while( ss.aDat
18070 61 20 29 20 66 74 73 35 4e 6f 64 65 49 74 65 72  a ) fts5NodeIter
18080 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 73 73  Next(&p->rc, &ss
18090 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
180a0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
180b0 20 26 70 50 67 2d 3e 74 65 72 6d 2c 20 73 73 2e   &pPg->term, ss.
180c0 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e  term.n, ss.term.
180d0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f  p);.        pgno
180e0 20 3d 20 73 73 2e 69 43 68 69 6c 64 3b 0a 20 20   = ss.iChild;.  
180f0 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74        fts5NodeIt
18100 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20 20 20  erFree(&ss);.   
18110 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
18120 66 28 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  f( pSeg->nHeight
18130 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 57 72  ==1 ){.      pWr
18140 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70  iter->nEmpty = p
18150 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2d 31 3b  Seg->pgnoLast-1;
18160 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18170 74 28 20 28 70 67 6e 6f 2b 70 57 72 69 74 65 72  t( (pgno+pWriter
18180 2d 3e 6e 45 6d 70 74 79 29 3d 3d 70 53 65 67 2d  ->nEmpty)==pSeg-
18190 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 7d  >pgnoLast );.  }
181a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74  .}../*.** Iterat
181b0 6f 72 20 70 49 74 65 72 20 77 61 73 20 75 73 65  or pIter was use
181c0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
181d0 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74 20 73  ough the input s
181e0 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e  egments of on an
181f0 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  .** incremental 
18200 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e  merge operation.
18210 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
18220 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20  s called if the 
18230 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d  incremental.** m
18240 65 72 67 65 20 73 74 65 70 20 68 61 73 20 66 69  erge step has fi
18250 6e 69 73 68 65 64 20 62 75 74 20 74 68 65 20 69  nished but the i
18260 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65  nput has not bee
18270 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68  n completely exh
18280 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  austed..*/.stati
18290 63 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53  c void fts5TrimS
182a0 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65  egments(Fts5Inde
182b0 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53  x *p, Fts5MultiS
182c0 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
182d0 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42    int i;.  Fts5B
182e0 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
182f0 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
18300 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
18310 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
18320 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
18330 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
18340 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
18350 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69  ->aSeg[i];.    i
18360 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30  f( pSeg->pSeg==0
18370 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d   ){.      /* no-
18380 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  op */.    }else 
18390 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
183a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67  =0 ){.      pSeg
183b0 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ->pSeg->pgnoLast
183c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67   = 0;.      pSeg
183d0 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
183e0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
183f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
18400 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
18410 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a  afOffset;     /*
18420 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66   Offset on new f
18430 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a  irst leaf page *
18440 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61  /.      i64 iLea
18450 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74  fRowid;.      Ft
18460 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
18470 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70       int iId = p
18480 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
18490 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72  d;.      u8 aHdr
184a0 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30  [4] = {0x00, 0x0
184b0 30 2c 20 30 78 30 30 2c 20 30 78 30 34 7d 3b 0a  0, 0x00, 0x04};.
184c0 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69  .      iLeafRowi
184d0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
184e0 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64  _ROWID(pSeg->iId
184f0 78 2c 20 69 49 64 2c 20 30 2c 20 70 53 65 67 2d  x, iId, 0, pSeg-
18500 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b  >iTermLeafPgno);
18510 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66  .      pData = f
18520 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
18530 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20  LeafRowid);.    
18540 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20    if( pData ){. 
18550 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
18560 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20  rZero(&buf);.   
18570 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
18580 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
18590 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61  , &buf, sizeof(a
185a0 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20  Hdr), aHdr);.   
185b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
185c0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
185d0 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e  rc, &buf, pSeg->
185e0 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20  term.n);.       
185f0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
18600 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
18610 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
18620 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b  , pSeg->term.p);
18630 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
18640 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
18650 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74  ->rc, &buf, pDat
18660 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 26 70 44  a->n - iOff, &pD
18670 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20  ata->p[iOff]);. 
18680 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
18690 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
186a0 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65         pSeg->pSe
186b0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 70  g->pgnoFirst = p
186c0 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
186d0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  no;.        fts5
186e0 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 46 54  DataDelete(p, FT
186f0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
18700 28 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64  (pSeg->iIdx, iId
18710 2c 20 30 2c 20 31 29 2c 69 4c 65 61 66 52 6f 77  , 0, 1),iLeafRow
18720 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
18730 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c  5DataWrite(p, iL
18740 65 61 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c  eafRowid, buf.p,
18750 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d   buf.n);.      }
18760 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73  .    }.  }.  fts
18770 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
18780 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
18790 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
187a0 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a  ndexMergeLevel(.
187b0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
187e0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  d object */.  in
187f0 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18810 20 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b 20 6f   Index to work o
18820 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  n */.  Fts5Struc
18830 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20  ture *pStruct,  
18840 20 20 20 20 20 20 20 2f 2a 20 53 74 75 63 74 75         /* Stuctu
18850 72 65 20 6f 66 20 69 6e 64 65 78 20 69 49 64 78  re of index iIdx
18860 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20   */.  int iLvl, 
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18880 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74        /* Level t
18890 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f  o read input fro
188a0 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65  m */.  int *pnRe
188b0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
188c0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
188d0 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20  up to this many 
188e0 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a 2f  output leaves */
188f0 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
18900 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
18910 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
18920 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53  l[iLvl];.  Fts5S
18930 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
18940 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
18950 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
18960 5d 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  ];.  Fts5MultiSe
18970 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  gIter *pIter = 0
18980 3b 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72  ;    /* Iterator
18990 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64   to read input d
189a0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ata */.  int nRe
189b0 6d 20 3d 20 2a 70 6e 52 65 6d 3b 20 20 20 20 20  m = *pnRem;     
189c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
189d0 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  ut leaf pages le
189e0 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  ft to write */. 
189f0 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20   int nInput;    
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
18a20 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
18a30 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
18a40 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  writer;         
18a50 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
18a60 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
18a70 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
18a80 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  eg;     /* Outpu
18a90 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  t segment */.  F
18aa0 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a  ts5Buffer term;.
18ab0 20 20 69 6e 74 20 62 52 65 71 75 69 72 65 44 6f    int bRequireDo
18ac0 63 6c 69 73 74 54 65 72 6d 20 3d 20 30 3b 20 20  clistTerm = 0;  
18ad0 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 65 72    /* Doclist ter
18ae0 6d 69 6e 61 74 6f 72 20 28 30 78 30 30 29 20 72  minator (0x00) r
18af0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
18b00 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20 20   bOldest;       
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 70  True if the outp
18b30 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74 68  ut segment is th
18b40 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20 20 61  e oldest */..  a
18b50 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72  ssert( iLvl<pStr
18b60 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20  uct->nLevel );. 
18b70 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e   assert( pLvl->n
18b80 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65  Merge<=pLvl->nSe
18b90 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  g );..  memset(&
18ba0 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  writer, 0, sizeo
18bb0 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
18bc0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72  );.  memset(&ter
18bd0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
18be0 35 42 75 66 66 65 72 29 29 3b 0a 20 20 77 72 69  5Buffer));.  wri
18bf0 74 65 72 2e 69 49 64 78 20 3d 20 69 49 64 78 3b  ter.iIdx = iIdx;
18c00 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65  .  if( pLvl->nMe
18c10 72 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rge ){.    asser
18c20 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  t( pLvlOut->nSeg
18c30 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74  >0 );.    nInput
18c40 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b   = pLvl->nMerge;
18c50 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e  .    fts5WriteIn
18c60 69 74 46 6f 72 41 70 70 65 6e 64 28 70 2c 20 26  itForAppend(p, &
18c70 77 72 69 74 65 72 2c 20 69 49 64 78 2c 20 26 70  writer, iIdx, &p
18c80 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76  LvlOut->aSeg[pLv
18c90 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 29 3b 0a  lOut->nSeg-1]);.
18ca0 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
18cb0 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
18cc0 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 7d 65  t->nSeg-1];.  }e
18cd0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  lse{.    int iSe
18ce0 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61  gid = fts5Alloca
18cf0 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75  teSegid(p, pStru
18d00 63 74 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  ct);.    fts5Wri
18d10 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
18d20 72 2c 20 69 49 64 78 2c 20 69 53 65 67 69 64 29  r, iIdx, iSegid)
18d30 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
18d40 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f  e new segment to
18d50 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65   the output leve
18d60 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76  l */.    if( iLv
18d70 6c 2b 31 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c  l+1==pStruct->nL
18d80 65 76 65 6c 20 29 20 70 53 74 72 75 63 74 2d 3e  evel ) pStruct->
18d90 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 70 53  nLevel++;.    pS
18da0 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
18db0 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
18dc0 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d  g];.    pLvlOut-
18dd0 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65  >nSeg++;.    pSe
18de0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31  g->pgnoFirst = 1
18df0 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67  ;.    pSeg->iSeg
18e00 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20  id = iSegid;..  
18e10 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20    /* Read input 
18e20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74  from all segment
18e30 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
18e40 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70  evel */.    nInp
18e50 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  ut = pLvl->nSeg;
18e60 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d  .  }.  bOldest =
18e70 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d   (pLvlOut->nSeg=
18e80 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e  =1 && pStruct->n
18e90 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a  Level==iLvl+2);.
18ea0 0a 23 69 66 20 30 0a 66 70 72 69 6e 74 66 28 73  .#if 0.fprintf(s
18eb0 74 64 6f 75 74 2c 20 22 6d 65 72 67 69 6e 67 20  tdout, "merging 
18ec0 25 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  %d segments from
18ed0 20 6c 65 76 65 6c 20 25 64 21 22 2c 20 6e 49 6e   level %d!", nIn
18ee0 70 75 74 2c 20 69 4c 76 6c 29 3b 0a 66 66 6c 75  put, iLvl);.fflu
18ef0 73 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64  sh(stdout);.#end
18f00 69 66 0a 0a 20 20 66 6f 72 28 66 74 73 35 4d 75  if..  for(fts5Mu
18f10 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
18f20 74 72 75 63 74 2c 20 69 49 64 78 2c 20 30 2c 20  truct, iIdx, 0, 
18f30 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70  0, 0, iLvl, nInp
18f40 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20  ut, &pIter);.   
18f50 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
18f60 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30  Eof(p, pIter)==0
18f70 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
18f80 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
18f90 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20  er, 0, 0).  ){. 
18fa0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
18fb0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
18fc0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
18fd0 73 74 5b 31 5d 20 5d 3b 0a 20 20 20 20 46 74 73  st[1] ];.    Fts
18fe0 35 43 68 75 6e 6b 49 74 65 72 20 73 50 6f 73 3b  5ChunkIter sPos;
18ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
19000 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
19010 72 6f 75 67 68 20 70 6f 73 69 74 69 6f 6e 20 6c  rough position l
19020 69 73 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ist */..    /* I
19030 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65  f the segment be
19040 69 6e 67 20 77 72 69 74 74 65 6e 20 69 73 20 74  ing written is t
19050 68 65 20 6f 6c 64 65 73 74 20 69 6e 20 74 68 65  he oldest in the
19060 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 61 6e   entire index an
19070 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 73  d.    ** the pos
19080 69 74 69 6f 6e 20 6c 69 73 74 20 69 73 20 65 6d  ition list is em
19090 70 74 79 20 28 69 2e 65 2e 20 74 68 65 20 65 6e  pty (i.e. the en
190a0 74 72 79 20 69 73 20 61 20 64 65 6c 65 74 65 20  try is a delete 
190b0 6d 61 72 6b 65 72 29 2c 20 6e 6f 0a 20 20 20 20  marker), no.    
190c0 2a 2a 20 65 6e 74 72 79 20 6e 65 65 64 20 62 65  ** entry need be
190d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
190e0 6f 75 74 70 75 74 2e 20 20 2a 2f 0a 20 20 20 20  output.  */.    
190f0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69  fts5ChunkIterIni
19100 74 28 70 2c 20 70 53 65 67 2c 20 26 73 50 6f 73  t(p, pSeg, &sPos
19110 29 3b 0a 20 20 20 20 69 66 28 20 62 4f 6c 64 65  );.    if( bOlde
19120 73 74 3d 3d 30 20 7c 7c 20 73 50 6f 73 2e 6e 52  st==0 || sPos.nR
19130 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  em>0 ){.      in
19140 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 63  t nTerm;.      c
19150 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d  onst u8 *pTerm =
19160 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65   fts5MultiIterTe
19170 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72 6d  rm(pIter, &nTerm
19180 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65  );.      if( nTe
19190 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65  rm!=term.n || me
191a0 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72 6d  mcmp(pTerm, term
191b0 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20  .p, nTerm) ){.  
191c0 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72        if( writer
191d0 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52  .nLeafWritten>nR
191e0 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  em ){.          
191f0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c  fts5ChunkIterRel
19200 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20 20 20  ease(&sPos);.   
19210 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19220 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
19230 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65   /* This is a ne
19240 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61  w term. Append a
19250 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74   term to the out
19260 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a  put segment. */.
19270 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65 71          if( bReq
19280 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20  uireDoclistTerm 
19290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
192a0 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f  5WriteAppendZero
192b0 62 79 74 65 28 70 2c 20 26 77 72 69 74 65 72 29  byte(p, &writer)
192c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
192d0 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
192e0 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74  endTerm(p, &writ
192f0 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  er, nTerm, pTerm
19300 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
19310 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
19320 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70   &term, nTerm, p
19330 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 62  Term);.        b
19340 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65  RequireDoclistTe
19350 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rm = 1;.      }.
19360 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  .      /* Append
19370 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
19380 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
19390 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
193a0 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74 65  dRowid(p, &write
193b0 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r, fts5MultiIter
193c0 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b 0a 0a  Rowid(pIter));..
193d0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
193e0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
193f0 66 72 6f 6d 20 69 6e 70 75 74 20 74 6f 20 6f 75  from input to ou
19400 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 66 74  tput */.      ft
19410 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
19420 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72 69 74  listInt(p, &writ
19430 65 72 2c 20 73 50 6f 73 2e 6e 52 65 6d 29 3b 0a  er, sPos.nRem);.
19440 20 20 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 6f        for(/* noo
19450 70 20 2a 2f 3b 20 21 66 74 73 35 43 68 75 6e 6b  p */; !fts5Chunk
19460 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73  IterEof(p, &sPos
19470 29 3b 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  ); fts5ChunkIter
19480 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29 29 7b  Next(p, &sPos)){
19490 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
194a0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  f = 0;.        w
194b0 68 69 6c 65 28 20 69 4f 66 66 3c 73 50 6f 73 2e  hile( iOff<sPos.
194c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
194d0 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20  nt iVal;.       
194e0 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
194f0 72 69 6e 74 33 32 28 26 73 50 6f 73 2e 70 5b 69  rint32(&sPos.p[i
19500 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
19510 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
19520 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74  AppendPoslistInt
19530 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 56 61  (p, &writer, iVa
19540 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
19550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
19560 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65   fts5ChunkIterRe
19570 6c 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20 20  lease(&sPos);.  
19580 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68  }..  /* Flush th
19590 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  e last leaf page
195a0 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68   to disk. Set th
195b0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
195c0 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20   b-tree height. 
195d0 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61   ** and last lea
195e0 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74  f page number at
195f0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20   the same time. 
19600 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46   */.  fts5WriteF
19610 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72  inish(p, &writer
19620 2c 20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  , &pSeg->nHeight
19630 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  , &pSeg->pgnoLas
19640 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d  t);..  if( fts5M
19650 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
19660 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Iter) ){.    int
19670 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   i;..    /* Remo
19680 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
19690 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
196a0 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
196b0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
196c0 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a  i<nInput; i++){.
196d0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
196e0 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 69  moveSegment(p, i
196f0 49 64 78 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  Idx, pLvl->aSeg[
19700 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  i].iSegid);.    
19710 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
19720 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73   the redundant s
19730 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
19740 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
19750 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
19760 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20  eg!=nInput ){.  
19770 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20      int nMove = 
19780 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49  (pLvl->nSeg - nI
19790 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46  nput) * sizeof(F
197a0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
197b0 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  ent);.      memm
197c0 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20  ove(pLvl->aSeg, 
197d0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70  &pLvl->aSeg[nInp
197e0 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  ut], nMove);.   
197f0 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65   }.    pLvl->nSe
19800 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  g -= nInput;.   
19810 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
19820 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  0;.    if( pSeg-
19830 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a  >pgnoLast==0 ){.
19840 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e        pLvlOut->n
19850 53 65 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Seg--;.    }.  }
19860 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
19870 28 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3e  ( pSeg->nHeight>
19880 30 20 26 26 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  0 && pSeg->pgnoL
19890 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73  ast>0 );.    fts
198a0 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c  5TrimSegments(p,
198b0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76   pIter);.    pLv
198c0 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70  l->nMerge = nInp
198d0 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d  ut;.  }..  fts5M
198e0 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
198f0 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75  pIter);.  fts5Bu
19900 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
19910 0a 20 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69  .  *pnRem -= wri
19920 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
19930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74  ;.}../*.** A tot
19940 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66  al of nLeaf leaf
19950 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20 68   pages of data h
19960 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75  as just been flu
19970 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d  shed to a level-
19980 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e  0.** segments in
19990 20 69 6e 64 65 78 20 69 49 64 78 20 77 69 74 68   index iIdx with
199a0 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
199b0 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
199c0 6e 20 75 70 64 61 74 65 73 20 74 68 65 0a 2a 2a  n updates the.**
199d0 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61   write-counter a
199e0 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20  ccordingly and, 
199f0 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65  if necessary, pe
19a00 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74  rforms increment
19a10 61 6c 20 6d 65 72 67 65 0a 2a 2a 20 77 6f 72 6b  al merge.** work
19a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
19a30 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
19a40 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
19a50 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
19a60 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
19a70 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
19a80 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
19a90 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
19aa0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
19ab0 49 6e 64 65 78 57 6f 72 6b 28 0a 20 20 46 74 73  IndexWork(.  Fts
19ac0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ae0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
19af0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ect */.  int iId
19b00 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
19b10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
19b20 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a  x to work on */.
19b30 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
19b40 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  *pStruct,       
19b50 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 72    /* Current str
19b60 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
19b70 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20  */.  int nLeaf  
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19ba0 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20  f output leaves 
19bb0 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
19bc0 29 7b 0a 20 20 69 36 34 20 6e 57 72 69 74 65 3b  ){.  i64 nWrite;
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
19bf0 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63  value of write-c
19c00 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
19c10 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20  nWork;          
19c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19c30 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75  umber of work-qu
19c40 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20  anta to perform 
19c50 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20  */.  int nRem;  
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19c80 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  f leaf pages lef
19c90 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20  t to write */.. 
19ca0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77   /* Update the w
19cb0 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68  rite-counter. Wh
19cc0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65  ile doing so, se
19cd0 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 6e 57  t nWork. */.  nW
19ce0 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e  rite = pStruct->
19cf0 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
19d00 20 6e 57 6f 72 6b 20 3d 20 28 28 6e 57 72 69 74   nWork = ((nWrit
19d10 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e  e + nLeaf) / p->
19d20 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57  nWorkUnit) - (nW
19d30 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55  rite / p->nWorkU
19d40 6e 69 74 29 3b 0a 20 20 70 53 74 72 75 63 74 2d  nit);.  pStruct-
19d50 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b  >nWriteCounter +
19d60 3d 20 6e 4c 65 61 66 3b 0a 20 20 6e 52 65 6d 20  = nLeaf;.  nRem 
19d70 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a  = p->nWorkUnit *
19d80 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74   nWork * pStruct
19d90 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20 20 77 68 69  ->nLevel;..  whi
19da0 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20  le( nRem>0 ){.  
19db0 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20    int iLvl;     
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19dd0 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   To iterate thro
19de0 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
19df0 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d    int iBestLvl =
19e00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
19e10 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20   Level offering 
19e20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73  the most input s
19e30 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69  egments */.    i
19e40 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20  nt nBest = 0;   
19e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19e60 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65  mber of input se
19e70 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c  gments on best l
19e80 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  evel */..    /* 
19e90 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20  Set iBestLvl to 
19ea0 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61  the level to rea
19eb0 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  d input segments
19ec0 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73   from. */.    as
19ed0 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
19ee0 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66  Level>0 );.    f
19ef0 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
19f00 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
19f10 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
19f20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
19f30 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
19f40 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
19f50 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  ];.      if( pLv
19f60 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
19f70 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
19f80 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20  Merge>nBest ){. 
19f90 20 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76           iBestLv
19fa0 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  l = iLvl;.      
19fb0 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
19fc0 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20  ->nMerge;.      
19fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
19fe0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
19ff0 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e   if( pLvl->nSeg>
1a000 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  nBest ){.       
1a010 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e   nBest = pLvl->n
1a020 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65  Seg;.        iBe
1a030 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20  stLvl = iLvl;.  
1a040 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a050 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20   /* If nBest is 
1a060 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68  still 0, then th
1a070 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
1a080 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66  empty. */.#ifdef
1a090 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1a0a0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42    for(iLvl=0; nB
1a0b0 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70  est==0 && iLvl<p
1a0c0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1a0d0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61  iLvl++){.      a
1a0e0 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
1a0f0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
1a100 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65  g==0 );.    }.#e
1a110 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42  ndif..    if( nB
1a120 65 73 74 3c 70 2d 3e 6e 4d 69 6e 4d 65 72 67 65  est<p->nMinMerge
1a130 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
1a140 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d  vel[iBestLvl].nM
1a150 65 72 67 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  erge==0 ) break;
1a160 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
1a170 72 67 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78  rgeLevel(p, iIdx
1a180 2c 20 70 53 74 72 75 63 74 2c 20 69 42 65 73 74  , pStruct, iBest
1a190 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
1a1a0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
1a1b0 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76  omote(p, iBestLv
1a1c0 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  l+1, pStruct);. 
1a1d0 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 6d 3d     assert( nRem=
1a1e0 3d 30 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  =0 || p->rc==SQL
1a1f0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 7d 0a  ITE_OK );.  }.}.
1a200 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65  ./*.** Flush the
1a210 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d   contents of in-
1a220 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1a230 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77  e iHash to a new
1a240 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67   level-0 .** seg
1a250 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c  ment on disk. Al
1a260 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f  so update the co
1a270 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75  rresponding stru
1a280 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a  cture record..**
1a290 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1a2a0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1a2b0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1a2c0 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1a2d0 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1a2e0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1a2f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a300 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1a310 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73  ic void fts5Flus
1a320 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64  hOneHash(Fts5Ind
1a330 65 78 20 2a 70 2c 20 69 6e 74 20 69 48 61 73 68  ex *p, int iHash
1a340 2c 20 69 6e 74 20 2a 70 6e 4c 65 61 66 29 7b 0a  , int *pnLeaf){.
1a350 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1a360 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20  *pStruct;.  int 
1a370 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67  iSegid;.  int pg
1a380 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20  noLast = 0;     
1a390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1a3a0 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
1a3b0 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
1a3c0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
1a3d0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
1a3e0 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
1a3f0 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  re and allocate 
1a400 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
1a410 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
1a420 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e  w level-0 segmen
1a430 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74  t.  */.  pStruct
1a440 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1a450 52 65 61 64 28 70 2c 20 69 48 61 73 68 29 3b 0a  Read(p, iHash);.
1a460 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41    iSegid = fts5A
1a470 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20  llocateSegid(p, 
1a480 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28  pStruct);..  if(
1a490 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 46   iSegid ){.    F
1a4a0 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
1a4b0 74 65 72 3b 0a 20 20 20 20 46 74 73 35 50 65 6e  ter;.    Fts5Pen
1a4c0 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70 4c 69  dingDoclist *pLi
1a4d0 73 74 3b 0a 20 20 20 20 46 74 73 35 50 65 6e 64  st;.    Fts5Pend
1a4e0 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70 49 74 65  ingDoclist *pIte
1a4f0 72 3b 0a 20 20 20 20 46 74 73 35 50 65 6e 64 69  r;.    Fts5Pendi
1a500 6e 67 44 6f 63 6c 69 73 74 20 2a 70 4e 65 78 74  ngDoclist *pNext
1a510 3b 0a 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ;..    Fts5Struc
1a520 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
1a530 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d  g;   /* New segm
1a540 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72 75  ent within pStru
1a550 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 48  ct */.    int nH
1a560 65 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  eight;          
1a570 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68          /* Heigh
1a580 74 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74  t of new segment
1a590 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
1a5a0 70 4c 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64  pList = fts5Pend
1a5b0 69 6e 67 4c 69 73 74 28 70 2c 20 69 48 61 73 68  ingList(p, iHash
1a5c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a5d0 4c 69 73 74 21 3d 30 20 7c 7c 20 70 2d 3e 72 63  List!=0 || p->rc
1a5e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1a5f0 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
1a600 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 48 61  (p, &writer, iHa
1a610 73 68 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  sh, iSegid);..  
1a620 20 20 66 6f 72 28 70 49 74 65 72 3d 70 4c 69 73    for(pIter=pLis
1a630 74 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  t; pIter; pIter=
1a640 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
1a650 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  ext = pIter->pNe
1a660 78 74 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72  xt;.      fts5Wr
1a670 69 74 65 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  itePendingDoclis
1a680 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 70 49  t(p, &writer, pI
1a690 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ter);.      fts5
1a6a0 46 72 65 65 50 65 6e 64 69 6e 67 44 6f 63 6c 69  FreePendingDocli
1a6b0 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  st(pIter);.    }
1a6c0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 69  .    fts5WriteFi
1a6d0 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
1a6e0 20 26 6e 48 65 69 67 68 74 2c 20 26 70 67 6e 6f   &nHeight, &pgno
1a6f0 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  Last);..    /* E
1a700 64 69 74 20 74 68 65 20 46 74 73 35 53 74 72 75  dit the Fts5Stru
1a710 63 74 75 72 65 20 61 6e 64 20 77 72 69 74 65 20  cture and write 
1a720 69 74 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  it back to the d
1a730 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20  atabase. */.    
1a740 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  if( pStruct->nLe
1a750 76 65 6c 3d 3d 30 20 29 20 70 53 74 72 75 63 74  vel==0 ) pStruct
1a760 2d 3e 6e 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20  ->nLevel = 1;.  
1a770 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
1a780 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65  t->aLevel[0].aSe
1a790 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  g[ pStruct->aLev
1a7a0 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a  el[0].nSeg++ ];.
1a7b0 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
1a7c0 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 70   = iSegid;.    p
1a7d0 53 65 67 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e  Seg->nHeight = n
1a7e0 48 65 69 67 68 74 3b 0a 20 20 20 20 70 53 65 67  Height;.    pSeg
1a7f0 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
1a800 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  .    pSeg->pgnoL
1a810 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a  ast = pgnoLast;.
1a820 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64 65 78    }..  fts5Index
1a830 57 6f 72 6b 28 70 2c 20 69 48 61 73 68 2c 20 70  Work(p, iHash, p
1a840 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74  Struct, pgnoLast
1a850 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
1a860 72 65 57 72 69 74 65 28 70 2c 20 69 48 61 73 68  reWrite(p, iHash
1a870 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74  , pStruct);.  ft
1a880 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1a890 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a  se(pStruct);.}..
1a8a0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
1a8b0 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
1a8c0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
1a8d0 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  h tables to the 
1a8e0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1a8f0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1a900 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65  exFlush(Fts5Inde
1a910 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e  x *p){.  Fts5Con
1a920 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
1a930 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74  ->pConfig;.  int
1a940 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a960 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
1a970 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20  through indexes 
1a980 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 3d  */.  int nLeaf =
1a990 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a9a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a9b0 66 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e  f leaves written
1a9c0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   */..  /* If an 
1a9d0 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
1a9e0 79 20 6f 63 63 75 72 65 64 20 74 68 69 73 20 63  y occured this c
1a9f0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  all is a no-op. 
1aa00 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  */.  if( p->rc!=
1aa10 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
1aa20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
1aa30 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
1aa40 72 74 28 20 70 2d 3e 61 48 61 73 68 20 29 3b 0a  rt( p->aHash );.
1aa50 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20  .  /* Flush the 
1aa60 74 65 72 6d 73 20 61 6e 64 20 65 61 63 68 20 70  terms and each p
1aa70 72 65 66 69 78 20 69 6e 64 65 78 20 74 6f 20 64  refix index to d
1aa80 69 73 6b 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  isk */.  for(i=0
1aa90 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  ; i<=pConfig->nP
1aaa0 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
1aab0 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73   fts5FlushOneHas
1aac0 68 28 70 2c 20 69 2c 20 26 6e 4c 65 61 66 29 3b  h(p, i, &nLeaf);
1aad0 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50 65 6e 64 69  .  }.  p->nPendi
1aae0 6e 67 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngData = 0;.}../
1aaf0 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
1ab00 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
1ab10 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
1ab20 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
1ab30 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f  () pertain.** to
1ab40 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
1ab50 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e  th rowid iRowid.
1ab60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ab70 46 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72  Fts5IndexBeginWr
1ab80 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ite(Fts5Index *p
1ab90 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
1aba0 20 69 66 28 20 69 52 6f 77 69 64 3c 3d 70 2d 3e   if( iRowid<=p->
1abb0 69 57 72 69 74 65 52 6f 77 69 64 20 29 7b 0a 20  iWriteRowid ){. 
1abc0 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73     fts5IndexFlus
1abd0 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  h(p);.  }.  p->i
1abe0 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52 6f  WriteRowid = iRo
1abf0 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  wid;.}../*.** Co
1ac00 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69 73  mmit data to dis
1ac10 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1ac20 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46  3Fts5IndexSync(F
1ac30 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
1ac40 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 66 74 73   bCommit){.  fts
1ac50 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a  5IndexFlush(p);.
1ac60 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29 20    if( bCommit ) 
1ac70 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
1ac80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p);.  return p->
1ac90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  rc;.}../*.** Dis
1aca0 63 61 72 64 20 61 6e 79 20 64 61 74 61 20 73 74  card any data st
1acb0 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
1acc0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
1acd0 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  s. Do not write 
1ace0 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  it.** to the dat
1acf0 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
1ad00 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lly, assume that
1ad10 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1ad20 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74   the %_data.** t
1ad30 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68  able may have ch
1ad40 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53  anged on disk. S
1ad50 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20  o any in-memory 
1ad60 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61  caches of %_data
1ad70 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73   .** records mus
1ad80 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  t be invalidated
1ad90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ada0 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63  Fts5IndexRollbac
1adb0 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  k(Fts5Index *p){
1adc0 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  .  fts5CloseRead
1add0 65 72 28 70 29 3b 0a 20 20 66 74 73 35 49 6e 64  er(p);.  fts5Ind
1ade0 65 78 44 69 73 63 61 72 64 44 61 74 61 28 70 29  exDiscardData(p)
1adf0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ae00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  E_OK;.}../*.** O
1ae10 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e  pen a new Fts5In
1ae20 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74  dex handle. If t
1ae30 68 65 20 62 43 72 65 61 74 65 20 61 72 67 75 6d  he bCreate argum
1ae40 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72 65  ent is true, cre
1ae50 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  ate.** and initi
1ae60 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
1ae70 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c  ying %_data tabl
1ae80 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
1ae90 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20  essful, set *pp 
1aea0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1aeb0 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  new object and r
1aec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1aed0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
1aee0 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61  et *pp to NULL a
1aef0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
1af00 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1af10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
1af20 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46  s5IndexOpen(.  F
1af30 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
1af40 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61  ig, .  int bCrea
1af50 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78  te, .  Fts5Index
1af60 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a   **pp,.  char **
1af70 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72  pzErr.){.  int r
1af80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1af90 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20   Fts5Index *p;  
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afb0 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
1afc0 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28  /..  *pp = p = (
1afd0 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74  Fts5Index*)sqlit
1afe0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
1aff0 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20  (Fts5Index));.  
1b000 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
1b010 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
1b020 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
1b030 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29  zeof(Fts5Index))
1b040 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d  ;.  p->pConfig =
1b050 20 70 43 6f 6e 66 69 67 3b 0a 20 20 70 2d 3e 70   pConfig;.  p->p
1b060 67 73 7a 20 3d 20 31 30 30 30 3b 0a 20 20 70 2d  gsz = 1000;.  p-
1b070 3e 6e 4d 69 6e 4d 65 72 67 65 20 3d 20 46 54 53  >nMinMerge = FTS
1b080 35 5f 4d 49 4e 5f 4d 45 52 47 45 3b 0a 20 20 70  5_MIN_MERGE;.  p
1b090 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54  ->nWorkUnit = FT
1b0a0 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20  S5_WORK_UNIT;.  
1b0b0 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
1b0c0 74 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a  ta = 1024*1024;.
1b0d0 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20    p->zDataTbl = 
1b0e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1b0f0 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66  "%s_data", pConf
1b100 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ig->zName);.  if
1b110 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d 30  ( p->zDataTbl==0
1b120 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1b130 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
1b140 73 65 20 69 66 28 20 62 43 72 65 61 74 65 20 29  se if( bCreate )
1b150 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1b160 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73   Fts5Structure s
1b170 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1b180 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c  e3Fts5CreateTabl
1b190 65 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66  e(.        pConf
1b1a0 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20  ig, "data", "id 
1b1b0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1b1c0 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22  KEY, block BLOB"
1b1d0 2c 20 70 7a 45 72 72 0a 20 20 20 20 29 3b 0a 20  , pzErr.    );. 
1b1e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b1f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
1b200 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
1b210 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
1b220 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
1b230 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50  0; i<pConfig->nP
1b240 72 65 66 69 78 2b 31 3b 20 69 2b 2b 29 7b 0a 20  refix+1; i++){. 
1b250 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
1b260 74 75 72 65 57 72 69 74 65 28 70 2c 20 69 2c 20  tureWrite(p, i, 
1b270 26 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  &s);.      }.   
1b280 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20     rc = p->rc;. 
1b290 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1b2a0 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72  Fts5IndexSetAver
1b2b0 61 67 65 73 28 70 2c 20 28 63 6f 6e 73 74 20 75  ages(p, (const u
1b2c0 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a  8*)"", 0);.  }..
1b2d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1b2e0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
1b2f0 43 6c 6f 73 65 28 70 2c 20 30 29 3b 0a 20 20 20  Close(p, 0);.   
1b300 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
1b310 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b320 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64  .** Close a hand
1b330 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  le opened by an 
1b340 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
1b350 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
1b360 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Open()..*/.int s
1b370 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
1b380 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lose(Fts5Index *
1b390 70 2c 20 69 6e 74 20 62 44 65 73 74 72 6f 79 29  p, int bDestroy)
1b3a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1b3b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 62 44  ITE_OK;.  if( bD
1b3c0 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 72 63  estroy ){.    rc
1b3d0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 44 72   = sqlite3Fts5Dr
1b3e0 6f 70 54 61 62 6c 65 28 70 2d 3e 70 43 6f 6e 66  opTable(p->pConf
1b3f0 69 67 2c 20 22 64 61 74 61 22 29 3b 0a 20 20 7d  ig, "data");.  }
1b400 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52  .  assert( p->pR
1b410 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 73 71  eader==0 );.  sq
1b420 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1b430 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71  ->pWriter);.  sq
1b440 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1b450 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 73  ->pDeleter);.  s
1b460 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
1b470 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 33  Hash);.  sqlite3
1b480 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62  _free(p->zDataTb
1b490 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
1b4a0 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
1b4b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1b4c0 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65  urn a simple che
1b4d0 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65  cksum value base
1b4e0 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  d on the argumen
1b4f0 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36  ts..*/.static u6
1b500 34 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  4 fts5IndexEntry
1b510 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f  Cksum(.  i64 iRo
1b520 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c  wid, .  int iCol
1b530 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a  , .  int iPos, .
1b540 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
1b550 65 72 6d 2c 20 0a 20 20 69 6e 74 20 6e 54 65 72  erm, .  int nTer
1b560 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  m.){.  int i;.  
1b570 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69 64  u64 ret = iRowid
1b580 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
1b590 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65  <3) + iCol;.  re
1b5a0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
1b5b0 69 50 6f 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  iPos;.  for(i=0;
1b5c0 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
1b5d0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
1b5e0 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74   pTerm[i];.  ret
1b5f0 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
1b600 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20  * Calculate and 
1b610 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
1b620 6d 20 74 68 61 74 20 69 73 20 74 68 65 20 58 4f  m that is the XO
1b630 52 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  R of the index e
1b640 6e 74 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d  ntry.** checksum
1b650 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
1b660 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 67 65  that would be ge
1b670 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 74  nerated by the t
1b680 6f 6b 65 6e 20 73 70 65 63 69 66 69 65 64 0a 2a  oken specified.*
1b690 2a 20 62 79 20 74 68 65 20 66 69 6e 61 6c 20 35  * by the final 5
1b6a0 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
1b6b0 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
1b6c0 64 65 78 43 6b 73 75 6d 28 0a 20 20 46 74 73 35  dexCksum(.  Fts5
1b6d0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b6f0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
1b700 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ect */.  i64 iRo
1b710 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
1b720 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 75           /* Docu
1b730 6d 65 6e 74 20 74 65 72 6d 20 61 70 70 65 61 72  ment term appear
1b740 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  s in */.  int iC
1b750 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
1b760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1b770 75 6d 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73  umn term appears
1b780 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f   in */.  int iPo
1b790 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1b7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
1b7b0 74 69 6f 6e 20 74 65 72 6d 20 61 70 70 65 61 72  tion term appear
1b7c0 73 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  s in */.  const 
1b7d0 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74  char *pTerm, int
1b7e0 20 6e 54 65 72 6d 20 20 20 20 2f 2a 20 54 65 72   nTerm    /* Ter
1b7f0 6d 20 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a  m at iPos */.){.
1b800 20 20 75 36 34 20 72 65 74 20 3d 20 30 3b 20 20    u64 ret = 0;  
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1b830 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  e */.  int iIdx;
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
1b860 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
1b870 69 6e 64 65 78 65 73 20 2a 2f 0a 0a 20 20 66 6f  indexes */..  fo
1b880 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 3d  r(iIdx=0; iIdx<=
1b890 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
1b8a0 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69  ; iIdx++){.    i
1b8b0 6e 74 20 6e 20 3d 20 28 28 69 49 64 78 3d 3d 70  nt n = ((iIdx==p
1b8c0 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 29  Config->nPrefix)
1b8d0 20 3f 20 6e 54 65 72 6d 20 3a 20 70 43 6f 6e 66   ? nTerm : pConf
1b8e0 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78  ig->aPrefix[iIdx
1b8f0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 6e  ]);.    if( n<=n
1b900 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  Term ){.      re
1b910 74 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  t ^= fts5IndexEn
1b920 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
1b930 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 65   iCol, iPos, pTe
1b940 72 6d 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  rm, n);.    }.  
1b950 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  }..  return ret;
1b960 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1b970 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69  fts5BtreeIterIni
1b980 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
1b990 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a  p, .  int iIdx,.
1b9a0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1b9b0 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 0a 20  egment *pSeg, . 
1b9c0 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a   Fts5BtreeIter *
1b9d0 70 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74 20 6e  pIter.){.  int n
1b9e0 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
1b9f0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1ba00 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 29 20  pIter->aLvl[0]) 
1ba10 2a 20 28 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  * (pSeg->nHeight
1ba20 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  -1);.  memset(pI
1ba30 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
1ba40 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
1ba50 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d 3e 6e  ->nLvl = pSeg->n
1ba60 48 65 69 67 68 74 2d 31 3b 0a 20 20 70 49 74 65  Height-1;.  pIte
1ba70 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
1ba80 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a    pIter->p = p;.
1ba90 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
1baa0 70 53 65 67 3b 0a 20 20 69 66 28 20 6e 42 79 74  pSeg;.  if( nByt
1bab0 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  e && p->rc==SQLI
1bac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74  TE_OK ){.    pIt
1bad0 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74 73 35  er->aLvl = (Fts5
1bae0 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 2a 29  BtreeIterLevel*)
1baf0 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
1bb00 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 66   nByte);.  }.  f
1bb10 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
1bb20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49  QLITE_OK && i<pI
1bb30 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
1bb40 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
1bb50 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1bb60 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d  OWID(iIdx, pSeg-
1bb70 3e 69 53 65 67 69 64 2c 20 69 2b 31 2c 20 31 29  >iSegid, i+1, 1)
1bb80 3b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  ;.    Fts5Data *
1bb90 70 44 61 74 61 3b 0a 20 20 20 20 70 49 74 65 72  pData;.    pIter
1bba0 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 20  ->aLvl[i].pData 
1bbb0 3d 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  = pData = fts5Da
1bbc0 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64  taRead(p, iRowid
1bbd0 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  );.    if( pData
1bbe0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f   ){.      fts5No
1bbf0 64 65 49 74 65 72 49 6e 69 74 28 70 44 61 74 61  deIterInit(pData
1bc00 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26  ->p, pData->n, &
1bc10 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73  pIter->aLvl[i].s
1bc20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1bc30 69 66 28 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d  if( pIter->nLvl=
1bc40 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20  =0 || p->rc ){. 
1bc50 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
1bc60 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   1;.    pIter->i
1bc70 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
1bc80 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  oLast;.  }else{.
1bc90 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74      pIter->nEmpt
1bca0 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  y = pIter->aLvl[
1bcb0 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 20  0].s.nEmpty;.   
1bcc0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
1bcd0 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
1bce0 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 70 49 74  .iChild;.    pIt
1bcf0 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74  er->bDlidx = pIt
1bd00 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44  er->aLvl[0].s.bD
1bd10 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  lidx;.  }.}..sta
1bd20 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
1bd30 65 65 49 74 65 72 4e 65 78 74 28 46 74 73 35 42  eeIterNext(Fts5B
1bd40 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29  treeIter *pIter)
1bd50 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
1bd60 20 3d 20 70 49 74 65 72 2d 3e 70 3b 0a 20 20 69   = pIter->p;.  i
1bd70 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
1bd80 20 70 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20   pIter->bEof==0 
1bd90 26 26 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  && pIter->aLvl[0
1bda0 5d 2e 73 2e 61 44 61 74 61 20 29 3b 0a 20 20 66  ].s.aData );.  f
1bdb0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1bdc0 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e 72 63 3d 3d  >nLvl && p->rc==
1bdd0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
1bde0 0a 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74  .    Fts5BtreeIt
1bdf0 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  erLevel *pLvl = 
1be00 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
1be10 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
1be20 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 70  rNext(&p->rc, &p
1be30 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28  Lvl->s);.    if(
1be40 20 70 4c 76 6c 2d 3e 73 2e 61 44 61 74 61 20 29   pLvl->s.aData )
1be50 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
1be60 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1be70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c  Iter->term, pLvl
1be80 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c  ->s.term.n, pLvl
1be90 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20  ->s.term.p);.   
1bea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
1beb0 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4e  lse{.      fts5N
1bec0 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
1bed0 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20 66 74 73  l->s);.      fts
1bee0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
1bef0 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
1bf00 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30   pLvl->pData = 0
1bf10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1bf20 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c  ( i==pIter->nLvl
1bf30 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20   || p->rc ){.   
1bf40 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
1bf50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1bf60 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65  nt iSegid = pIte
1bf70 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  r->pSeg->iSegid;
1bf80 0a 20 20 20 20 66 6f 72 28 69 2d 2d 3b 20 69 3e  .    for(i--; i>
1bf90 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
1bfa0 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
1bfb0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  el *pLvl = &pIte
1bfc0 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  r->aLvl[i];.    
1bfd0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
1bfe0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1bff0 44 28 70 49 74 65 72 2d 3e 69 49 64 78 2c 69 53  D(pIter->iIdx,iS
1c000 65 67 69 64 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d  egid,i+1,pLvl[1]
1c010 2e 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  .s.iChild);.    
1c020 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
1c030 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1c040 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
1c050 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
1c060 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f  {.        fts5No
1c070 64 65 49 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d  deIterInit(pLvl-
1c080 3e 70 44 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d  >pData->p, pLvl-
1c090 3e 70 44 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c  >pData->n, &pLvl
1c0a0 2d 3e 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ->s);.      }.  
1c0b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72    }.  }..  pIter
1c0c0 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72  ->nEmpty = pIter
1c0d0 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70  ->aLvl[0].s.nEmp
1c0e0 74 79 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c  ty;.  pIter->bDl
1c0f0 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  idx = pIter->aLv
1c100 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20  l[0].s.bDlidx;. 
1c110 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
1c120 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
1c130 2e 69 43 68 69 6c 64 3b 0a 20 20 61 73 73 65 72  .iChild;.  asser
1c140 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
1c150 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45  _OK || pIter->bE
1c160 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  of );.}..static 
1c170 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74  void fts5BtreeIt
1c180 65 72 46 72 65 65 28 46 74 73 35 42 74 72 65 65  erFree(Fts5Btree
1c190 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1c1a0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1c1b0 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
1c1c0 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42   i++){.    Fts5B
1c1d0 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70  treeIterLevel *p
1c1e0 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
1c1f0 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e  vl[i];.    fts5N
1c200 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
1c210 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70  l->s);.    if( p
1c220 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
1c230 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
1c240 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
1c250 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
1c260 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ata = 0;.    }. 
1c270 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1c280 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a  e(pIter->aLvl);.
1c290 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1c2a0 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
1c2b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1c2c0 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79  nction is purely
1c2d0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
1c2e0 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
1c2f0 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
1c300 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
1c310 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
1c320 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
1c330 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
1c340 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74  ** Instead, it t
1c350 65 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61  ests that the sa
1c360 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72  me set of pgno/r
1c370 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
1c380 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65  s are .** visite
1c390 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  d regardless of 
1c3a0 77 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c  whether the docl
1c3b0 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69  ist-index identi
1c3c0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
1c3d0 72 73 0a 2a 2a 20 69 49 64 78 2f 69 53 65 67 69  rs.** iIdx/iSegi
1c3e0 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61  d/iLeaf is itera
1c3f0 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20  ted in forwards 
1c400 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  or reverse order
1c410 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1c420 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
1c430 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
1c440 65 72 54 65 73 74 52 65 76 65 72 73 65 28 0a 20  erTestReverse(. 
1c450 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1c460 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6c 6f    /* Index to lo
1c490 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
1c4a0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1c4b0 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
1c4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1c4d0 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64  gment id to load
1c4e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1c4f0 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
1c500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1c510 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
1c520 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
1c530 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  /.){.  Fts5Dlidx
1c540 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
1c550 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 31 20 3d  ;.  i64 cksum1 =
1c560 20 31 33 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d   13;.  i64 cksum
1c570 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 66  2 = 13;..  for(f
1c580 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
1c590 28 70 2c 20 30 2c 20 69 49 64 78 2c 20 69 53 65  (p, 0, iIdx, iSe
1c5a0 67 69 64 2c 20 69 4c 65 61 66 2c 20 26 70 44 6c  gid, iLeaf, &pDl
1c5b0 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35  idx);.      fts5
1c5c0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
1c5d0 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
1c5e0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
1c5f0 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 29 7b  ext(pDlidx).  ){
1c600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c  .    assert( pDl
1c610 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69  idx->iLeafPgno>i
1c620 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75  Leaf );.    cksu
1c630 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 28  m1 = (cksum1 ^ (
1c640 20 28 69 36 34 29 28 70 44 6c 69 64 78 2d 3e 69   (i64)(pDlidx->i
1c650 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20  LeafPgno) << 32 
1c660 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d  ));.    cksum1 =
1c670 20 28 63 6b 73 75 6d 31 20 5e 20 70 44 6c 69 64   (cksum1 ^ pDlid
1c680 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a  x->iRowid);.  }.
1c690 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
1c6a0 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
1c6b0 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
1c6c0 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  r(fts5DlidxIterI
1c6d0 6e 69 74 28 70 2c 20 31 2c 20 69 49 64 78 2c 20  nit(p, 1, iIdx, 
1c6e0 69 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20 26  iSegid, iLeaf, &
1c6f0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
1c700 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
1c710 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
1c720 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1c730 65 72 50 72 65 76 28 70 44 6c 69 64 78 29 0a 20  erPrev(pDlidx). 
1c740 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c750 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e  pDlidx->iLeafPgn
1c760 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63  o>iLeaf );.    c
1c770 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20  ksum2 = (cksum2 
1c780 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69 64 78  ^ ( (i64)(pDlidx
1c790 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20  ->iLeafPgno) << 
1c7a0 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d  32 ));.    cksum
1c7b0 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20 70 44  2 = (cksum2 ^ pD
1c7c0 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  lidx->iRowid);. 
1c7d0 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74   }.  fts5DlidxIt
1c7e0 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
1c7f0 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20    pDlidx = 0;.. 
1c800 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c810 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21  TE_OK && cksum1!
1c820 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
1c830 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 20  = FTS5_CORRUPT; 
1c840 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1c850 65 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 54  e fts5DlidxIterT
1c860 65 73 74 52 65 76 65 72 73 65 28 77 2c 78 2c 79  estReverse(w,x,y
1c870 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ,z).#endif..stat
1c880 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1c890 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
1c8a0 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e  egment(.  Fts5In
1c8b0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1c8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1c8d0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1c8e0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c900 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1c910 68 61 74 20 70 53 65 67 20 69 73 20 61 20 70 61  hat pSeg is a pa
1c920 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53  rt of */.  Fts5S
1c930 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
1c940 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65  *pSeg      /* Se
1c950 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
1c960 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
1c970 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ncy */.){.  Fts5
1c980 42 74 72 65 65 49 74 65 72 20 69 74 65 72 3b 20  BtreeIter iter; 
1c990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c9a0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1c9b0 68 72 6f 75 67 68 20 62 2d 74 72 65 65 20 68 69  hrough b-tree hi
1c9c0 65 72 61 72 63 68 79 20 2a 2f 0a 0a 20 20 2f 2a  erarchy */..  /*
1c9d0 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
1c9e0 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
1c9f0 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66 6f 72  archy.  */.  for
1ca00 28 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e  (fts5BtreeIterIn
1ca10 69 74 28 70 2c 20 69 49 64 78 2c 20 70 53 65 67  it(p, iIdx, pSeg
1ca20 2c 20 26 69 74 65 72 29 3b 0a 20 20 20 20 20 20  , &iter);.      
1ca30 69 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20  iter.bEof==0;.  
1ca40 20 20 20 20 66 74 73 35 42 74 72 65 65 49 74 65      fts5BtreeIte
1ca50 72 4e 65 78 74 28 26 69 74 65 72 29 0a 20 20 29  rNext(&iter).  )
1ca60 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20  {.    i64 iRow; 
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca80 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
1ca90 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20   this leaf */.  
1caa0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
1cab0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1cac0 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73  /* Data for this
1cad0 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74   leaf */.    int
1cae0 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
1caf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1cb00 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65  fset of first te
1cb10 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  rm on leaf */.  
1cb20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
1cb50 74 65 20 74 68 72 6f 75 67 68 20 65 6d 70 74 79  te through empty
1cb60 20 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20   leaves */..    
1cb70 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69  /* If the leaf i
1cb80 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61  n question has a
1cb90 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d  lready been trim
1cba0 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67  med from the seg
1cbb0 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67  ment, .    ** ig
1cbc0 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65  nore this b-tree
1cbd0 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73   entry. Otherwis
1cbe0 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20  e, load it into 
1cbf0 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69  memory. */.    i
1cc00 66 28 20 69 74 65 72 2e 69 4c 65 61 66 3c 70 53  f( iter.iLeaf<pS
1cc10 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20  eg->pgnoFirst ) 
1cc20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52  continue;.    iR
1cc30 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ow = FTS5_SEGMEN
1cc40 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53  T_ROWID(iIdx, pS
1cc50 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69  eg->iSegid, 0, i
1cc60 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
1cc70 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
1cc80 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20  Read(p, iRow);. 
1cc90 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20     if( pLeaf==0 
1cca0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
1ccb0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
1ccc0 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74  leaf contains at
1ccd0 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c   least one term,
1cce0 20 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20   and that it is 
1ccf0 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20  equal.    ** to 
1cd00 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  or larger than t
1cd10 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20  he split-key in 
1cd20 69 74 65 72 2e 74 65 72 6d 2e 20 20 2a 2f 0a 20  iter.term.  */. 
1cd30 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65     iOff = fts5Ge
1cd40 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
1cd50 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66  ]);.    if( iOff
1cd60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1cd70 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1cd80 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
1cd90 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20      int nTerm;  
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
1cdc0 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73  on leaf in bytes
1cdd0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
1cde0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1cdf0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
1ce00 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20  son of term and 
1ce10 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 20 20 20  split-key */.   
1ce20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
1ce30 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
1ce40 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a  [iOff], nTerm);.
1ce50 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63        res = memc
1ce60 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  mp(&pLeaf->p[iOf
1ce70 66 5d 2c 20 69 74 65 72 2e 74 65 72 6d 2e 70 2c  f], iter.term.p,
1ce80 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 69 74 65 72   MIN(nTerm, iter
1ce90 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20 20 20 20 20  .term.n));.     
1cea0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
1ceb0 73 20 3d 20 6e 54 65 72 6d 20 2d 20 69 74 65 72  s = nTerm - iter
1cec0 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 69  .term.n;.      i
1ced0 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
1cee0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
1cef0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
1cf00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  }.    }.    fts5
1cf10 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
1cf20 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  f);.    if( p->r
1cf30 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  c ) break;..    
1cf40 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
1cf50 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
1cf60 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
1cf70 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
1cf80 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65  eaf.    ** (a) e
1cf90 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  xist and (b) con
1cfa0 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a  tain no terms. *
1cfb0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 70  /.    for(i=1; p
1cfc0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1cfd0 26 26 20 69 3c 3d 69 74 65 72 2e 6e 45 6d 70 74  && i<=iter.nEmpt
1cfe0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  y; i++){.      p
1cff0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
1d000 65 61 64 28 70 2c 20 69 52 6f 77 2b 69 29 3b 0a  ead(p, iRow+i);.
1d010 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
1d020 26 26 20 30 21 3d 66 74 73 35 47 65 74 55 31 36  && 0!=fts5GetU16
1d030 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 20 29  (&pLeaf->p[2]) )
1d040 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
1d050 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
1d060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1d070 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
1d080 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  eaf);.    }..   
1d090 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1d0a0 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c  a doclist-index,
1d0b0 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c   check that it l
1d0c0 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20  ooks right. */. 
1d0d0 20 20 20 69 66 28 20 69 74 65 72 2e 62 44 6c 69     if( iter.bDli
1d0e0 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  dx ){.      Fts5
1d0f0 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
1d100 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69  x = 0;  /* For i
1d110 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
1d120 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a   doclist index *
1d130 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72 65  /.      int iPre
1d140 76 4c 65 61 66 20 3d 20 69 74 65 72 2e 69 4c 65  vLeaf = iter.iLe
1d150 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  af;.      int iS
1d160 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65  egid = pSeg->iSe
1d170 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  gid;.      int i
1d180 50 67 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b  Pg;.      i64 iK
1d190 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 66  ey;..      for(f
1d1a0 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
1d1b0 28 70 2c 20 30 2c 20 69 49 64 78 2c 20 69 53 65  (p, 0, iIdx, iSe
1d1c0 67 69 64 2c 20 69 74 65 72 2e 69 4c 65 61 66 2c  gid, iter.iLeaf,
1d1d0 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20   &pDlidx);.     
1d1e0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1d1f0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
1d200 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ==0;.          f
1d210 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
1d220 28 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29  (pDlidx).      )
1d230 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  {..        /* Ch
1d240 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65  eck any rowid-le
1d250 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63  ss pages that oc
1d260 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63  cur before the c
1d270 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a  urrent leaf. */.
1d280 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
1d290 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67  iPrevLeaf+1; iPg
1d2a0 3c 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67  <pDlidx->iLeafPg
1d2b0 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  no; iPg++){.    
1d2c0 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
1d2d0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1d2e0 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c  iIdx, iSegid, 0,
1d2f0 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20   iPg);.         
1d300 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1d310 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1d320 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
1d330 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1d340 20 20 20 69 66 28 20 66 74 73 35 47 65 74 55 31     if( fts5GetU1
1d350 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 21  6(&pLeaf->p[0])!
1d360 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  =0 ) p->rc = FTS
1d370 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
1d380 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
1d390 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
1d3a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d3b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50 72     }.        iPr
1d3c0 65 76 4c 65 61 66 20 3d 20 70 44 6c 69 64 78 2d  evLeaf = pDlidx-
1d3d0 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 20  >iLeafPgno;..   
1d3e0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
1d3f0 61 74 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  at the leaf page
1d400 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
1d410 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c 6c  e iterator reall
1d420 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a  y does.        *
1d430 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f  * contain the ro
1d440 77 69 64 20 73 75 67 67 65 73 74 65 64 20 62 79  wid suggested by
1d450 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20   the same. */.  
1d460 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
1d470 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1d480 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c  iIdx, iSegid, 0,
1d490 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67   pDlidx->iLeafPg
1d4a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  no);.        pLe
1d4b0 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
1d4c0 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
1d4d0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
1d4e0 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
1d4f0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Rowid;.         
1d500 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d   int iRowidOff =
1d510 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
1d520 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20 20 20  af->p[0]);.     
1d530 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 26       getVarint(&
1d540 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f  pLeaf->p[iRowidO
1d550 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  ff], (u64*)&iRow
1d560 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  id);.          i
1d570 66 28 20 69 52 6f 77 69 64 21 3d 70 44 6c 69 64  f( iRowid!=pDlid
1d580 78 2d 3e 69 52 6f 77 69 64 20 29 20 70 2d 3e 72  x->iRowid ) p->r
1d590 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
1d5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1d5b0 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
1d5c0 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  f);.        }.. 
1d5d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
1d5e0 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b  r(iPg=iPrevLeaf+
1d5f0 31 3b 20 69 50 67 3c 3d 28 69 74 65 72 2e 69 4c  1; iPg<=(iter.iL
1d600 65 61 66 20 2b 20 69 74 65 72 2e 6e 45 6d 70 74  eaf + iter.nEmpt
1d610 79 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  y); iPg++){.    
1d620 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
1d630 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1d640 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c 20 69  dx, iSegid, 0, i
1d650 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  Pg);.        pLe
1d660 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
1d670 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
1d680 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
1d690 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
1d6a0 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
1d6b0 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e  ->p[0])!=0 ) p->
1d6c0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1d6d0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  T;.          fts
1d6e0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
1d6f0 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  af);.        }. 
1d700 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
1d710 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
1d720 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
1d730 74 73 35 44 6c 69 64 78 49 74 65 72 54 65 73 74  ts5DlidxIterTest
1d740 52 65 76 65 72 73 65 28 70 2c 20 69 49 64 78 2c  Reverse(p, iIdx,
1d750 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c   iSegid, iter.iL
1d760 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  eaf);.    }.  }.
1d770 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1d780 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e  LITE_OK && iter.
1d790 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e  iLeaf!=pSeg->pgn
1d7a0 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  oLast ){.    p->
1d7b0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1d7c0 54 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 74  T;.  }..  fts5Bt
1d7d0 72 65 65 49 74 65 72 46 72 65 65 28 26 69 74 65  reeIterFree(&ite
1d7e0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  r);.}../*.** Run
1d7f0 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
1d800 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1d810 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61  the FTS index (a
1d820 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ) is internally 
1d830 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61  .** consistent a
1d840 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20  nd (b) contains 
1d850 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63  entries for whic
1d860 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65  h the XOR of the
1d870 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73   checksums.** as
1d880 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 66   calculated by f
1d890 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
1d8a0 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
1d8b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1d8c0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
1d8d0 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
1d8e0 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
1d8f0 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
1d900 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
1d910 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
1d920 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
1d930 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
1d940 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
1d950 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
1d960 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
1d970 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
1d980 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
1d990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d9a0 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
1d9b0 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
1d9c0 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
1d9d0 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
1d9e0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
1d9f0 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 49 64 78  nfig;.  int iIdx
1da00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da10 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1da20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1da30 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  gh indexes */.  
1da40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1da70 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  /.  u64 cksum2 =
1da80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1da90 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
1daa0 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
1dab0 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
1dac0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1dad0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
1dae0 20 74 68 65 20 69 6e 64 65 78 20 6d 61 74 63 68   the index match
1daf0 65 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  es the argument 
1db00 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 66 6f  checksum */.  fo
1db10 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 3d  r(iIdx=0; iIdx<=
1db20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
1db30 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46  ; iIdx++){.    F
1db40 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
1db50 2a 70 49 74 65 72 3b 0a 20 20 20 20 46 74 73 35  *pIter;.    Fts5
1db60 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1db70 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1db80 72 65 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b  reRead(p, iIdx);
1db90 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  .    for(fts5Mul
1dba0 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
1dbb0 72 75 63 74 2c 20 69 49 64 78 2c 20 30 2c 20 30  ruct, iIdx, 0, 0
1dbc0 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74  , 0, -1, 0, &pIt
1dbd0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  er);.        fts
1dbe0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
1dbf0 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
1dc00 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1dc10 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
1dc20 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  0, 0).    ){.   
1dc30 20 20 20 46 74 73 35 50 6f 73 49 74 65 72 20 73     Fts5PosIter s
1dc40 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Pos;           /
1dc50 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
1dc60 65 20 74 68 72 6f 75 67 68 20 70 6f 73 69 74 69  e through positi
1dc70 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  on list */.     
1dc80 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dca0 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20  Size of term in 
1dcb0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  bytes */.      i
1dcc0 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
1dcd0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
1dce0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 63 68 61  Iter);.      cha
1dcf0 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74  r *z = (char*)ft
1dd00 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
1dd10 70 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20  pIter, &n);..   
1dd20 20 20 20 66 6f 72 28 66 74 73 35 50 6f 73 49 74     for(fts5PosIt
1dd30 65 72 49 6e 69 74 28 70 2c 20 70 49 74 65 72 2c  erInit(p, pIter,
1dd40 20 26 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20   &sPos);.       
1dd50 20 20 20 66 74 73 35 50 6f 73 49 74 65 72 45 6f     fts5PosIterEo
1dd60 66 28 70 2c 20 26 73 50 6f 73 29 3d 3d 30 3b 0a  f(p, &sPos)==0;.
1dd70 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 6f            fts5Po
1dd80 73 49 74 65 72 4e 65 78 74 28 70 2c 20 26 73 50  sIterNext(p, &sP
1dd90 6f 73 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  os).      ){.   
1dda0 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66       cksum2 ^= f
1ddb0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
1ddc0 75 6d 28 69 52 6f 77 69 64 2c 20 73 50 6f 73 2e  um(iRowid, sPos.
1ddd0 69 43 6f 6c 2c 20 73 50 6f 73 2e 69 50 6f 73 2c  iCol, sPos.iPos,
1dde0 20 7a 2c 20 6e 29 3b 0a 23 69 66 20 30 0a 20 20   z, n);.#if 0.  
1ddf0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1de00 64 6f 75 74 2c 20 22 72 6f 77 69 64 3d 25 64 20  dout, "rowid=%d 
1de10 22 2c 20 28 69 6e 74 29 69 52 6f 77 69 64 29 3b  ", (int)iRowid);
1de20 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1de30 28 73 74 64 6f 75 74 2c 20 22 74 65 72 6d 3d 25  (stdout, "term=%
1de40 2e 2a 73 20 22 2c 20 6e 2c 20 7a 29 3b 0a 20 20  .*s ", n, z);.  
1de50 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1de60 64 6f 75 74 2c 20 22 63 6f 6c 3d 25 64 20 22 2c  dout, "col=%d ",
1de70 20 73 50 6f 73 2e 69 43 6f 6c 29 3b 0a 20 20 20   sPos.iCol);.   
1de80 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1de90 6f 75 74 2c 20 22 6f 66 66 3d 25 64 5c 6e 22 2c  out, "off=%d\n",
1dea0 20 73 50 6f 73 2e 69 50 6f 73 29 3b 0a 20 20 20   sPos.iPos);.   
1deb0 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f       fflush(stdo
1dec0 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ut);.#endif.    
1ded0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
1dee0 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
1def0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 66  p, pIter);.    f
1df00 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
1df10 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
1df20 7d 0a 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  }.  rc = p->rc;.
1df30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1df40 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b  _OK && cksum!=ck
1df50 73 75 6d 32 20 29 20 72 63 20 3d 20 46 54 53 35  sum2 ) rc = FTS5
1df60 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 2f 2a 20  _CORRUPT;..  /* 
1df70 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  Check that the i
1df80 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66  nternal nodes of
1df90 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61   each segment ma
1dfa0 74 63 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a  tch the leaves *
1dfb0 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20  /.  for(iIdx=0; 
1dfc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1dfd0 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
1dfe0 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29  nPrefix; iIdx++)
1dff0 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
1e000 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66  ure *pStruct = f
1e010 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
1e020 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69  (p, iIdx);.    i
1e030 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
1e040 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
1e050 65 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c  eg;.      for(iL
1e060 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
1e070 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1e080 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
1e090 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
1e0a0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1e0b0 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
1e0c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
1e0d0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1e0e0 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75  t *pSeg = &pStru
1e0f0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1e100 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
1e110 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78         fts5Index
1e120 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
1e130 67 6d 65 6e 74 28 70 2c 20 69 49 64 78 2c 20 70  gment(p, iIdx, p
1e140 53 65 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Seg);.        }.
1e150 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e160 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1e170 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
1e180 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b  .    rc = p->rc;
1e190 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1e1a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2f 0a 73 74 61 74  c;.}../*.*/.stat
1e1b0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
1e1c0 64 65 53 74 72 75 63 74 75 72 65 28 0a 20 20 69  deStructure(.  i
1e1d0 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e1f0 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
1e200 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
1e210 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f  ffer *pBuf,.  co
1e220 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69  nst u8 *pBlob, i
1e230 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e  nt nBlob.){.  in
1e240 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e260 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e270 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1e280 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
1e290 20 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72    /* Decoded str
1e2a0 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f  ucture object */
1e2b0 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72  ..  rc = fts5Str
1e2c0 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c  uctureDecode(pBl
1e2d0 6f 62 2c 20 6e 42 6c 6f 62 2c 20 26 70 29 3b 0a  ob, nBlob, &p);.
1e2e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e2f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20  _OK ){.    *pRc 
1e300 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
1e310 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62  ;.  }..  fts5Deb
1e320 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c  ugStructure(pRc,
1e330 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73   pBuf, p);.  fts
1e340 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1e350 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  e(p);.}../*.** B
1e360 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61  uffer (a/n) is a
1e370 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
1e380 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69  n a list of seri
1e390 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20  alized varints. 
1e3a0 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72  Read.** each var
1e3b0 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
1e3c0 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ts string repres
1e3d0 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66  entation to buff
1e3e0 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a  er pBuf. Return.
1e3f0 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20  ** after either 
1e400 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
1e410 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72   is exhausted or
1e420 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65   a 0 value is re
1e430 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ad..**.** The re
1e440 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1e450 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1e460 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
1e470 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
1e480 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1e490 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e  DecodePoslist(in
1e4a0 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
1e4b0 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
1e4c0 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
1e4d0 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
1e4e0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
1e4f0 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a  {.    int iVal;.
1e500 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56      iOff += getV
1e510 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
1e520 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  , iVal);.    sql
1e530 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1e540 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
1e550 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61  pBuf, " %d", iVa
1e560 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
1e570 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
1e580 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66  The start of buf
1e590 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69  fer (a/n) contai
1e5a0 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ns the start of 
1e5b0 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64  a doclist. The d
1e5c0 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72  oclist.** may or
1e5d0 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20   may not finish 
1e5e0 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65  within the buffe
1e5f0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1e600 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a   appends a text.
1e610 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ** representatio
1e620 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66  n of the part of
1e630 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61   the doclist tha
1e640 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20  t is present to 
1e650 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20  buffer.** pBuf. 
1e660 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
1e670 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
1e680 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1e690 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
1e6a0 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
1e6b0 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
1e6c0 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a  odeDoclist(int *
1e6d0 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
1e6e0 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
1e6f0 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36  *a, int n){.  i6
1e700 34 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20  4 iDocid;.  int 
1e710 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iOff = 0;..  if(
1e720 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
1e730 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
1e740 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
1e750 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29  , (u64*)&iDocid)
1e760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
1e770 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
1e780 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
1e790 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44   rowid=%lld", iD
1e7a0 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69  ocid);.  }.  whi
1e7b0 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  le( iOff<n ){.  
1e7c0 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
1e7d0 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
1e7e0 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 50  t32(&a[iOff], nP
1e7f0 6f 73 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  os);.    iOff +=
1e800 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
1e810 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61  st(pRc, pBuf, &a
1e820 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f  [iOff], MIN(n-iO
1e830 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20  ff, nPos));.    
1e840 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
1e850 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
1e860 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
1e870 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26  lite3GetVarint(&
1e880 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
1e890 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69  iDelta);.      i
1e8a0 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72  f( iDelta==0 ) r
1e8b0 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20  eturn iOff;.    
1e8c0 20 20 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c    iDocid -= iDel
1e8d0 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ta;.      sqlite
1e8e0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1e8f0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
1e900 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22  f, " rowid=%lld"
1e910 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d  , iDocid);.    }
1e920 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69  .  }..  return i
1e930 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
1e940 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1e950 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
1e960 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
1e970 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a   fts5_decode()..
1e980 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e990 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
1e9a0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
1e9b0 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
1e9c0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
1e9d0 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f   call context */
1e9e0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ea10 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20  args (always 2) 
1ea20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1ea30 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
1ea40 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
1ea50 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
1ea60 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
1ea90 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
1eaa0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  oded */.  int iI
1eab0 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68  dx,iSegid,iHeigh
1eac0 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77  t,iPgno;  /* Row
1ead0 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f  id components */
1eae0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20  .  const u8 *a; 
1eaf0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
1eb00 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20     /* Record to 
1eb10 64 65 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  decode */.  Fts5
1eb20 42 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20  Buffer s;       
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1eb40 75 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20  uild up text to 
1eb50 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20  return here */. 
1eb60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1eb70 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1eb80 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1eb90 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41  */..  assert( nA
1eba0 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65  rg==2 );.  memse
1ebb0 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&s, 0, sizeof(
1ebc0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
1ebd0 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
1ebe0 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56  _value_int64(apV
1ebf0 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71  al[0]);.  n = sq
1ec00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1ec10 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61  s(apVal[1]);.  a
1ec20 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1ec30 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b  _blob(apVal[1]);
1ec40 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
1ec50 69 64 28 69 52 6f 77 69 64 2c 20 26 69 49 64 78  id(iRowid, &iIdx
1ec60 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65 69  , &iSegid, &iHei
1ec70 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
1ec80 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
1ec90 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29  &rc, &s, iRowid)
1eca0 3b 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3d  ;.  if( iHeight=
1ecb0 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41  =FTS5_SEGMENT_MA
1ecc0 58 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20 20  X_HEIGHT ){.    
1ecd0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69  int i = 0;.    i
1ece0 36 34 20 69 50 72 65 76 3b 0a 20 20 20 20 69 66  64 iPrev;.    if
1ecf0 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ( n>0 ){.      i
1ed00 20 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b   = getVarint(&a[
1ed10 69 5d 2c 20 28 75 36 34 2a 29 26 69 50 72 65 76  i], (u64*)&iPrev
1ed20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ed30 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1ed40 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
1ed50 22 20 25 6c 6c 64 22 2c 20 69 50 72 65 76 29 3b  " %lld", iPrev);
1ed60 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1ed70 28 20 69 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69  ( i<n ){.      i
1ed80 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69  64 iVal;.      i
1ed90 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61   += getVarint(&a
1eda0 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  [i], (u64*)&iVal
1edb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 56 61  );.      if( iVa
1edc0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
1edd0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1ede0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
1edf0 63 2c 20 26 73 2c 20 22 20 78 22 29 3b 0a 20 20  c, &s, " x");.  
1ee00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ee10 20 20 20 69 50 72 65 76 20 3d 20 69 50 72 65 76     iPrev = iPrev
1ee20 20 2d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20   - iVal;.       
1ee30 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1ee40 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
1ee50 72 63 2c 20 26 73 2c 20 22 20 25 6c 6c 64 22 2c  rc, &s, " %lld",
1ee60 20 69 50 72 65 76 29 3b 0a 20 20 20 20 20 20 7d   iPrev);.      }
1ee70 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 0a  .    }..  }else.
1ee80 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20    if( iSegid==0 
1ee90 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  ){.    if( iRowi
1eea0 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  d==FTS5_AVERAGES
1eeb0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
1eec0 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 7d  /* todo */.    }
1eed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
1eee0 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
1eef0 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
1ef00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a      }.  }else{..
1ef10 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
1ef20 65 72 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  erm;.    memset(
1ef30 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
1ef40 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
1ef50 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3d      if( iHeight=
1ef60 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1ef70 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
1ef80 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
1ef90 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  f = 0;.      int
1efa0 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74   iOff;.      int
1efb0 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20   nKeep = 0;..   
1efc0 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
1efd0 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29  ts5GetU16(&a[0])
1efe0 3b 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66  ;.      iTermOff
1eff0 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
1f000 5b 32 5d 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  [2]);..      if(
1f010 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
1f020 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f        iOff = iRo
1f030 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65  widOff;.      }e
1f040 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
1f050 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
1f060 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
1f070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f080 20 20 69 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20    iOff = n;.    
1f090 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44 65    }.      fts5De
1f0a0 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c  codePoslist(&rc,
1f0b0 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66   &s, &a[4], iOff
1f0c0 2d 34 29 3b 0a 0a 0a 20 20 20 20 20 20 61 73 73  -4);...      ass
1f0d0 65 72 74 28 20 69 52 6f 77 69 64 4f 66 66 3d 3d  ert( iRowidOff==
1f0e0 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77 69  0 || iOff==iRowi
1f0f0 64 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66  dOff );.      if
1f100 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20  ( iRowidOff ){. 
1f110 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
1f120 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
1f130 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
1f140 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20  f], n-iOff);.   
1f150 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
1f160 72 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30 20  rt( iTermOff==0 
1f170 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f 66  || iOff==iTermOf
1f180 66 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  f );.      while
1f190 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
1f1a0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
1f1b0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67         iOff += g
1f1c0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
1f1d0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
1f1e0 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65       term.n= nKe
1f1f0 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ep;.        fts5
1f200 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1f210 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79  (&rc, &term, nBy
1f220 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  te, &a[iOff]);. 
1f230 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
1f240 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 73  Byte;..        s
1f250 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1f260 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20  AppendPrintf(.  
1f270 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
1f280 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
1f290 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
1f2a0 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
1f2b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1f2c0 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
1f2d0 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
1f2e0 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69  s, &a[iOff], n-i
1f2f0 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
1f300 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
1f310 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65        iOff += ge
1f320 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
1f330 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
1f340 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f350 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
1f360 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20 7d  ee(&term);.    }
1f370 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
1f380 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20  NodeIter ss;.   
1f390 20 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49     for(fts5NodeI
1f3a0 74 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 73  terInit(a, n, &s
1f3b0 73 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66 74  s); ss.aData; ft
1f3c0 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
1f3d0 72 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20 20  rc, &ss)){.     
1f3e0 20 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e 6e     if( ss.term.n
1f3f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1f400 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1f410 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
1f420 72 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d 25  rc, &s, " left=%
1f430 64 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b 0a  d", ss.iChild);.
1f440 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f450 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f460 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1f470 50 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20 22  Printf(&rc,&s, "
1f480 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20 20   \"%.*s\"", .   
1f490 20 20 20 20 20 20 20 20 20 20 20 73 73 2e 74 65             ss.te
1f4a0 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 0a  rm.n, ss.term.p.
1f4b0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1f4c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1f4d0 66 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b 0a  f( ss.nEmpty ){.
1f4e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f4f0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1f500 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
1f510 20 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c 20   " empty=%d%s", 
1f520 73 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20 20  ss.nEmpty,.     
1f530 20 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c 69           ss.bDli
1f540 64 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20 20  dx ? "*" : "".  
1f550 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1f560 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f570 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46     fts5NodeIterF
1f580 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d 0a  ree(&ss);.    }.
1f590 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
1f5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f5b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1f5c0 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e  _text(pCtx, (con
1f5d0 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e  st char*)s.p, s.
1f5e0 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
1f5f0 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ENT);.  }else{. 
1f600 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1f610 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74  t_error_code(pCt
1f620 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74  x, rc);.  }.  ft
1f630 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29  s5BufferFree(&s)
1f640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f650 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1f660 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67  t of registering
1f670 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65   the FTS5 module
1f680 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a   with database.*
1f690 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
1f6a0 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65   It registers se
1f6b0 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e  veral user-defin
1f6c0 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
1f6d0 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69  ons useful.** wi
1f6e0 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49  th FTS5..**.** I
1f6f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
1f700 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f710 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
1f720 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74   occurs, some ot
1f730 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72  her.** SQLite er
1f740 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f750 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  rned instead..*/
1f760 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1f770 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65  IndexInit(sqlite
1f780 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
1f790 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1f7a0 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
1f7b0 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f    db, "fts5_deco
1f7c0 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  de", 2, SQLITE_U
1f7d0 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f  TF8, 0, fts5Deco
1f7e0 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  deFunction, 0, 0
1f7f0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
1f800 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
1f810 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
1f820 73 69 7a 65 20 66 6f 72 20 74 68 65 20 69 6e 64  size for the ind
1f830 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  ex object..*/.vo
1f840 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  id sqlite3Fts5In
1f850 64 65 78 50 67 73 7a 28 46 74 73 35 49 6e 64 65  dexPgsz(Fts5Inde
1f860 78 20 2a 70 2c 20 69 6e 74 20 70 67 73 7a 29 7b  x *p, int pgsz){
1f870 0a 20 20 70 2d 3e 70 67 73 7a 20 3d 20 70 67 73  .  p->pgsz = pgs
1f880 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  z;.}../*.** Iter
1f890 61 74 6f 72 20 70 4d 75 6c 74 69 20 63 75 72 72  ator pMulti curr
1f8a0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
1f8b0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e  a valid entry (n
1f8c0 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a  ot EOF). This.**
1f8d0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
1f8e0 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
1f8f0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 6f 66  position-list of
1f900 20 74 68 65 20 65 6e 74 72 79 20 70 4d 75 6c 74   the entry pMult
1f910 69 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  i .** currently 
1f920 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 62 75 66  points to to buf
1f930 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
1f940 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1f950 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1f960 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e  e is left in p->
1f970 72 63 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  rc. It is assume
1f980 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 68 61  d.** no error ha
1f990 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
1f9a0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
1f9b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1f9c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f9d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73  fts5MultiIterPos
1f9e0 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65  list(.  Fts5Inde
1f9f0 78 20 2a 70 2c 0a 20 20 46 74 73 35 4d 75 6c 74  x *p,.  Fts5Mult
1fa00 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69  iSegIter *pMulti
1fa10 2c 0a 20 20 69 6e 74 20 62 53 7a 2c 0a 20 20 46  ,.  int bSz,.  F
1fa20 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
1fa30 29 7b 0a 20 20 46 74 73 35 43 68 75 6e 6b 49 74  ){.  Fts5ChunkIt
1fa40 65 72 20 69 74 65 72 3b 0a 20 20 46 74 73 35 53  er iter;.  Fts5S
1fa50 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
1fa60 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d  pMulti->aSeg[ pM
1fa70 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 20  ulti->aFirst[1] 
1fa80 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74 73  ];.  assert( fts
1fa90 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
1faa0 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 20   pMulti)==0 );. 
1fab0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e   fts5ChunkIterIn
1fac0 69 74 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65  it(p, pSeg, &ite
1fad0 72 29 3b 0a 20 20 69 66 28 20 66 74 73 35 43 68  r);.  if( fts5Ch
1fae0 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 69  unkIterEof(p, &i
1faf0 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ter)==0 ){.    i
1fb00 66 28 20 62 53 7a 20 29 7b 0a 20 20 20 20 20 20  f( bSz ){.      
1fb10 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fb20 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70  Varint(&p->rc, p
1fb30 42 75 66 2c 20 69 74 65 72 2e 6e 52 65 6d 29 3b  Buf, iter.nRem);
1fb40 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1fb50 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45  ( fts5ChunkIterE
1fb60 6f 66 28 70 2c 20 26 69 74 65 72 29 3d 3d 30 20  of(p, &iter)==0 
1fb70 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
1fb80 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1fb90 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72  ->rc, pBuf, iter
1fba0 2e 6e 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20 20  .n, iter.p);.   
1fbb0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1fbc0 4e 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b 0a  Next(p, &iter);.
1fbd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
1fbe0 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65  ChunkIterRelease
1fbf0 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74  (&iter);.}..stat
1fc00 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
1fc10 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35  istIterNext(Fts5
1fc20 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
1fc30 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
1fc40 2d 3e 69 3c 70 49 74 65 72 2d 3e 6e 20 29 7b 0a  ->i<pIter->n ){.
1fc50 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
1fc60 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44   ){.      i64 iD
1fc70 65 6c 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65  elta;.      pIte
1fc80 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69 6e  r->i += getVarin
1fc90 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  t(&pIter->a[pIte
1fca0 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 69 44  r->i], (u64*)&iD
1fcb0 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  elta);.      if(
1fcc0 20 70 49 74 65 72 2d 3e 62 41 73 63 20 29 7b 0a   pIter->bAsc ){.
1fcd0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
1fce0 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
1fcf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fd00 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
1fd10 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20  wid -= iDelta;. 
1fd20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1fd30 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
1fd40 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
1fd50 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69  Iter->a[pIter->i
1fd60 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
1fd70 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  >iRowid);.    }.
1fd80 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20      pIter->i += 
1fd90 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  getVarint32(&pIt
1fda0 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c  er->a[pIter->i],
1fdb0 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
1fdc0 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  );.    pIter->aP
1fdd0 6f 73 6c 69 73 74 20 3d 20 26 70 49 74 65 72 2d  oslist = &pIter-
1fde0 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 3b 0a 20 20  >a[pIter->i];.  
1fdf0 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 70 49    pIter->i += pI
1fe00 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20  ter->nPoslist;. 
1fe10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
1fe20 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b  r->aPoslist = 0;
1fe30 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
1fe40 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49  oid fts5DoclistI
1fe50 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42  terInit(.  Fts5B
1fe60 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20  uffer *pBuf, .  
1fe70 69 6e 74 20 62 41 73 63 2c 20 0a 20 20 46 74 73  int bAsc, .  Fts
1fe80 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
1fe90 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28  ter.){.  memset(
1fea0 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
1feb0 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
1fec0 65 72 2d 3e 61 20 3d 20 70 42 75 66 2d 3e 70 3b  er->a = pBuf->p;
1fed0 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 70 42  .  pIter->n = pB
1fee0 75 66 2d 3e 6e 3b 0a 20 20 70 49 74 65 72 2d 3e  uf->n;.  pIter->
1fef0 62 41 73 63 20 3d 20 62 41 73 63 3b 0a 20 20 66  bAsc = bAsc;.  f
1ff00 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1ff10 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  xt(pIter);.}../*
1ff20 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
1ff30 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70  list to buffer p
1ff40 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Buf..*/.static v
1ff50 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70  oid fts5MergeApp
1ff60 65 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20  endDocid(.  int 
1ff70 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ff90 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
1ffa0 65 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63 2c  e */.  int bAsc,
1ffb0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1ffc0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1ffd0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
1ffe0 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36  write to */.  i6
1fff0 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20  4 *piLastRowid, 
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20010 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75   IN/OUT: Previou
20020 73 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20  s rowid written 
20030 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36  (if any) */.  i6
20040 34 20 69 52 6f 77 69 64 20 20 20 20 20 20 20 20  4 iRowid        
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20060 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64   Rowid to append
20070 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42 75   */.){.  if( pBu
20080 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f->n==0 ){.    f
20090 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
200a0 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c  arint(pRc, pBuf,
200b0 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73   iRowid);.  }els
200c0 65 20 69 66 28 20 62 41 73 63 3d 3d 30 20 29 7b  e if( bAsc==0 ){
200d0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
200e0 70 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c  ppendVarint(pRc,
200f0 20 70 42 75 66 2c 20 2a 70 69 4c 61 73 74 52 6f   pBuf, *piLastRo
20100 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20  wid - iRowid);. 
20110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
20120 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20130 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52  nt(pRc, pBuf, iR
20140 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f  owid - *piLastRo
20150 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c  wid);.  }.  *piL
20160 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  astRowid = iRowi
20170 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  d;.}../*.** Buff
20180 65 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f  ers p1 and p2 co
20190 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20  ntain doclists. 
201a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65  This function me
201b0 72 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  rges the content
201c0 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64  .** of the two d
201d0 6f 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72  oclists together
201e0 20 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72   and sets buffer
201f0 20 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c   p1 to the resul
20200 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  t before.** retu
20210 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
20220 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
20230 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
20240 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e  s left in p->rc.
20250 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
20260 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
20270 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
20280 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
20290 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
202a0 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
202b0 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sts(.  Fts5Index
202c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
202d0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
202e0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
202f0 0a 20 20 69 6e 74 20 62 41 73 63 2c 0a 20 20 46  .  int bAsc,.  F
20300 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20  ts5Buffer *p1,  
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20320 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20  * First list to 
20330 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42  merge */.  Fts5B
20340 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20  uffer *p2       
20350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
20360 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72  cond list to mer
20370 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ge */.){.  if( p
20380 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20  2->n ){.    i64 
20390 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
203a0 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
203b0 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35  ter i1;.    Fts5
203c0 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a  DoclistIter i2;.
203d0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f      Fts5Buffer o
203e0 75 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  ut;.    Fts5Buff
203f0 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73  er tmp;.    mems
20400 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65  et(&out, 0, size
20410 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65  of(out));.    me
20420 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69  mset(&tmp, 0, si
20430 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20  zeof(tmp));..   
20440 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
20450 49 6e 69 74 28 70 31 2c 20 62 41 73 63 2c 20 26  Init(p1, bAsc, &
20460 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  i1);.    fts5Doc
20470 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c  listIterInit(p2,
20480 20 62 41 73 63 2c 20 26 69 32 29 3b 0a 20 20 20   bAsc, &i2);.   
20490 20 77 68 69 6c 65 28 20 69 31 2e 61 50 6f 73 6c   while( i1.aPosl
204a0 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50 6f  ist!=0 || i2.aPo
204b0 73 6c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20  slist!=0 ){.    
204c0 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73    if( i2.aPoslis
204d0 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73  t==0 || (i1.aPos
204e0 6c 69 73 74 20 26 26 20 0a 20 20 20 20 20 20 20  list && .       
204f0 20 20 20 20 28 20 28 21 62 41 73 63 20 26 26 20      ( (!bAsc && 
20500 69 31 2e 69 52 6f 77 69 64 3e 69 32 2e 69 52 6f  i1.iRowid>i2.iRo
20510 77 69 64 29 20 7c 7c 20 28 62 41 73 63 20 26 26  wid) || (bAsc &&
20520 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52   i1.iRowid<i2.iR
20530 6f 77 69 64 29 20 29 0a 20 20 20 20 20 20 29 29  owid) ).      ))
20540 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  {.        /* Cop
20550 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20  y entry from i1 
20560 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  */.        fts5M
20570 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
20580 26 70 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f  &p->rc, bAsc, &o
20590 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c  ut, &iLastRowid,
205a0 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i1.iRowid);.   
205b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
205c0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
205d0 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f  rc, &out, i1.nPo
205e0 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  slist);.        
205f0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20600 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75  Blob(&p->rc, &ou
20610 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i1.nPoslist, 
20620 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i1.aPoslist);.  
20630 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
20640 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a  tIterNext(&i1);.
20650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
20660 73 65 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69  se if( i1.aPosli
20670 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77  st==0 || i2.iRow
20680 69 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b  id!=i1.iRowid ){
20690 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
206a0 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a   entry from i2 *
206b0 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
206c0 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
206d0 70 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75  p->rc, bAsc, &ou
206e0 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20  t, &iLastRowid, 
206f0 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
20700 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
20710 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
20720 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73  c, &out, i2.nPos
20730 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  list);.        f
20740 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
20750 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  lob(&p->rc, &out
20760 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69  , i2.nPoslist, i
20770 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.aPoslist);.   
20780 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
20790 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
207a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
207b0 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  e{.        Fts5P
207c0 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b  oslistReader r1;
207d0 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
207e0 6c 69 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20  listReader r2;. 
207f0 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69         Fts5Posli
20800 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  stWriter writer;
20810 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ..        memset
20820 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
20830 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20  eof(writer));.. 
20840 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20         /* Merge 
20850 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e  the two position
20860 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20   lists. */ .    
20870 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
20880 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c  endDocid(&p->rc,
20890 20 62 41 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c   bAsc, &out, &iL
208a0 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
208b0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
208c0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d  s5BufferZero(&tm
208d0 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
208e0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
208f0 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e  aderInit(-1, i1.
20900 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
20910 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20  slist, &r1);.   
20920 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
20930 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
20940 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73  t(-1, i2.aPoslis
20950 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i2.nPoslist, 
20960 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68  &r2);.        wh
20970 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
20980 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f  TE_OK && (r1.bEo
20990 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d  f==0 || r2.bEof=
209a0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
209b0 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20   i64 iNew;.     
209c0 20 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66       if( r2.bEof
209d0 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20   || (r1.bEof==0 
209e0 26 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50  && r1.iPos<r2.iP
209f0 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os) ){.         
20a00 20 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f     iNew = r1.iPo
20a10 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  s;.            s
20a20 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
20a30 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29  tReaderNext(&r1)
20a40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
20a50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
20a60 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20  New = r2.iPos;. 
20a70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20a80 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
20a90 64 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20  derNext(&r2);.  
20aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
20ab0 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29  .iPos==r2.iPos )
20ac0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
20ad0 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72  istReaderNext(&r
20ae0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  1);.          }.
20af0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
20b00 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  = sqlite3Fts5Pos
20b10 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
20b20 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20  (&tmp, &writer, 
20b30 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  iNew);.        }
20b40 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ..        fts5Bu
20b50 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
20b60 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74  (&p->rc, &out, t
20b70 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  mp.n);.        f
20b80 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
20b90 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  lob(&p->rc, &out
20ba0 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70 29 3b  , tmp.n, tmp.p);
20bb0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
20bc0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
20bd0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
20be0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
20bf0 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i2);.      }.   
20c00 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
20c10 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31  erSet(&p->rc, p1
20c20 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b  , out.n, out.p);
20c30 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
20c40 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66  ree(&tmp);.    f
20c50 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f  ts5BufferFree(&o
20c60 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ut);.  }.}..stat
20c70 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66  ic void fts5Buff
20c80 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65  erSwap(Fts5Buffe
20c90 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65  r *p1, Fts5Buffe
20ca0 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75  r *p2){.  Fts5Bu
20cb0 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a  ffer tmp = *p1;.
20cc0 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a    *p1 = *p2;.  *
20cd0 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61  p2 = tmp;.}..sta
20ce0 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74  tic void fts5Set
20cf0 75 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20  upPrefixIter(.  
20d00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64  /* Index to read
20d30 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   from */.  int b
20d40 41 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Asc,            
20d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20d60 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59  ue for "ORDER BY
20d70 20 72 6f 77 69 64 20 41 53 43 22 20 2a 2f 0a 20   rowid ASC" */. 
20d80 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65   const u8 *pToke
20d90 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20da0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
20db0 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20  ining prefix to 
20dc0 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  match */.  int n
20dd0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
20de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20df0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f  ze of buffer pTo
20e00 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ken in bytes */.
20e10 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
20e20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
20e30 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
20e40 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
20e50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
20e60 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
20e70 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20  Buffer *aBuf;.  
20e80 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d  const int nBuf =
20e90 20 33 32 3b 0a 0a 20 20 61 42 75 66 20 3d 20 28   32;..  aBuf = (
20ea0 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73 35  Fts5Buffer*)fts5
20eb0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
20ec0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 2a  eof(Fts5Buffer)*
20ed0 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74  nBuf);.  pStruct
20ee0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
20ef0 52 65 61 64 28 70 2c 20 30 29 3b 0a 0a 20 20 69  Read(p, 0);..  i
20f00 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72 75  f( aBuf && pStru
20f10 63 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6f  ct ){.    Fts5Do
20f20 63 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63 6c  clistIter *pDocl
20f30 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ist;.    int i;.
20f40 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77      i64 iLastRow
20f50 69 64 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74  id;.    Fts5Mult
20f60 69 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 30  iSegIter *p1 = 0
20f70 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  ;     /* Iterato
20f80 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72  r used to gather
20f90 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78   data from index
20fa0 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
20fb0 65 72 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20  er doclist;..   
20fc0 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74   memset(&doclist
20fd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c  , 0, sizeof(docl
20fe0 69 73 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66  ist));.    for(f
20ff0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
21000 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31  p, pStruct, 0, 1
21010 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
21020 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20  , -1, 0, &p1);. 
21030 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
21040 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d  IterEof(p, p1)==
21050 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  0;.        fts5M
21060 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
21070 70 31 2c 20 30 2c 20 30 29 0a 20 20 20 20 29 7b  p1, 0, 0).    ){
21080 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
21090 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
210a0 72 52 6f 77 69 64 28 70 31 29 3b 0a 20 20 20 20  rRowid(p1);.    
210b0 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
210c0 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65     const u8 *pTe
210d0 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  rm = fts5MultiIt
210e0 65 72 54 65 72 6d 28 70 31 2c 20 26 6e 54 65 72  erTerm(p1, &nTer
210f0 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  m);.      assert
21100 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  ( memcmp(pToken,
21110 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b   pTerm, MIN(nTok
21120 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29  en, nTerm))<=0 )
21130 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72  ;.      if( nTer
21140 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63  m<nToken || memc
21150 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
21160 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61  , nToken) ) brea
21170 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 64 6f  k;..      if( do
21180 63 6c 69 73 74 2e 6e 3e 30 20 0a 20 20 20 20 20  clist.n>0 .     
21190 20 20 26 26 20 28 28 21 62 41 73 63 20 26 26 20    && ((!bAsc && 
211a0 69 52 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77  iRowid>=iLastRow
211b0 69 64 29 20 7c 7c 20 28 62 41 73 63 20 26 26 20  id) || (bAsc && 
211c0 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77  iRowid<=iLastRow
211d0 69 64 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20  id)).      ){.. 
211e0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
211f0 64 6f 63 6c 69 73 74 2e 6e 20 26 26 20 70 2d 3e  doclist.n && p->
21200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
21210 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
21220 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b  ssert( i<nBuf );
21230 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
21240 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20  Buf[i].n==0 ){. 
21250 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
21260 75 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69  ufferSwap(&docli
21270 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
21280 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
21290 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69  ufferZero(&docli
212a0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  st);.          }
212b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
212c0 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69    fts5MergePrefi
212d0 78 4c 69 73 74 73 28 70 2c 20 62 41 73 63 2c 20  xLists(p, bAsc, 
212e0 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
212f0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
21300 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
21310 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
21320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21340 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20  f( doclist.n==0 
21350 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
21360 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
21370 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69  t(&p->rc, &docli
21380 73 74 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  st, iRowid);.   
21390 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 41 73     }else if( bAs
213a0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
213b0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
213c0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
213d0 64 6f 63 6c 69 73 74 2c 20 69 4c 61 73 74 52 6f  doclist, iLastRo
213e0 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20  wid - iRowid);. 
213f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21400 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
21410 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
21420 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f  c, &doclist, iRo
21430 77 69 64 20 2d 20 69 4c 61 73 74 52 6f 77 69 64  wid - iLastRowid
21440 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21450 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52   iLastRowid = iR
21460 6f 77 69 64 3b 0a 20 20 20 20 20 20 66 74 73 35  owid;.      fts5
21470 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74  MultiIterPoslist
21480 28 70 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c  (p, p1, 1, &docl
21490 69 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ist);.    }..   
214a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66   for(i=0; i<nBuf
214b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
214c0 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
214d0 74 73 28 70 2c 20 62 41 73 63 2c 20 26 64 6f 63  ts(p, bAsc, &doc
214e0 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
214f0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
21500 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b  rFree(&aBuf[i]);
21510 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
21520 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
21530 70 31 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69  p1);..    pDocli
21540 73 74 20 3d 20 28 46 74 73 35 44 6f 63 6c 69 73  st = (Fts5Doclis
21550 74 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61  tIter*)fts5IdxMa
21560 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
21570 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 29 29  ts5DoclistIter))
21580 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 63 6c  ;.    if( !pDocl
21590 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ist ){.      fts
215a0 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63  5BufferFree(&doc
215b0 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  list);.    }else
215c0 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  {.      pIter->p
215d0 44 6f 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69  Doclist = pDocli
215e0 73 74 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6f  st;.      fts5Do
215f0 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 26 64  clistIterInit(&d
21600 6f 63 6c 69 73 74 2c 20 62 41 73 63 2c 20 70 49  oclist, bAsc, pI
21610 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a  ter->pDoclist);.
21620 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
21630 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
21640 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71  e(pStruct);.  sq
21650 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29  lite3_free(aBuf)
21660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
21670 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74  a new iterator t
21680 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68  o iterate though
21690 20 61 6c 6c 20 64 6f 63 69 64 73 20 74 68 61 74   all docids that
216a0 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73   match the .** s
216b0 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f  pecified token o
216c0 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a  r token prefix..
216d0 2a 2f 0a 46 74 73 35 49 6e 64 65 78 49 74 65 72  */.Fts5IndexIter
216e0 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64   *sqlite3Fts5Ind
216f0 65 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49  exQuery(.  Fts5I
21700 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
21710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
21720 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79  S index to query
21730 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
21740 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
21750 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28  oken, /* Token (
21760 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75  or prefix) to qu
21770 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ery for */.  int
21780 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
217a0 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
217b0 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20  X_QUERY_X flags 
217c0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  */.){.  Fts5Inde
217d0 78 49 74 65 72 20 2a 70 52 65 74 3b 0a 20 20 69  xIter *pRet;.  i
217e0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 0a 20 20  nt iIdx = 0;..  
217f0 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
21800 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
21810 49 58 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  IX ){.    Fts5Co
21820 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
21830 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
21840 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78  for(iIdx=1; iIdx
21850 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
21860 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20  ix; iIdx++){.   
21870 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
21880 61 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d  aPrefix[iIdx-1]=
21890 3d 6e 54 6f 6b 65 6e 20 29 20 62 72 65 61 6b 3b  =nToken ) break;
218a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
218b0 49 64 78 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  Idx>pConfig->nPr
218c0 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 69 49  efix ){.      iI
218d0 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  dx = -1;.    }. 
218e0 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 28 46 74   }..  pRet = (Ft
218f0 73 35 49 6e 64 65 78 49 74 65 72 2a 29 73 71 6c  s5IndexIter*)sql
21900 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
21910 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  of(Fts5IndexIter
21920 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  ));.  if( pRet )
21930 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65  {.    memset(pRe
21940 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  t, 0, sizeof(Fts
21950 35 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 0a 20  5IndexIter));.. 
21960 20 20 20 70 52 65 74 2d 3e 70 49 6e 64 65 78 20     pRet->pIndex 
21970 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 69 49 64  = p;.    if( iId
21980 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 52  x>=0 ){.      pR
21990 65 74 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74  et->pStruct = ft
219a0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
219b0 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20  p, iIdx);.      
219c0 69 66 28 20 70 52 65 74 2d 3e 70 53 74 72 75 63  if( pRet->pStruc
219d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  t ){.        fts
219e0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
219f0 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74 2c 20   pRet->pStruct, 
21a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64  .            iId
21a10 78 2c 20 66 6c 61 67 73 2c 20 28 63 6f 6e 73 74  x, flags, (const
21a20 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f   u8*)pToken, nTo
21a30 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65  ken, -1, 0, &pRe
21a40 74 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20 20 20  t->pMulti.      
21a50 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
21a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
21a70 74 20 62 41 73 63 20 3d 20 28 66 6c 61 67 73 20  t bAsc = (flags 
21a80 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
21a90 59 5f 41 53 43 29 21 3d 30 3b 0a 20 20 20 20 20  Y_ASC)!=0;.     
21aa0 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
21ab0 49 74 65 72 28 70 2c 20 62 41 73 63 2c 20 28 63  Iter(p, bAsc, (c
21ac0 6f 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c  onst u8*)pToken,
21ad0 20 6e 54 6f 6b 65 6e 2c 20 70 52 65 74 29 3b 0a   nToken, pRet);.
21ae0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
21af0 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71   p->rc ){.    sq
21b00 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
21b10 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52  se(pRet);.    pR
21b20 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  et = 0;.  }.  re
21b30 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
21b40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
21b50 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
21b60 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
21b70 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ly argument is a
21b80 74 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71  t EOF..*/.int sq
21b90 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
21ba0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
21bb0 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
21bc0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
21bd0 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74   .    return pIt
21be0 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50  er->pDoclist->aP
21bf0 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a 20 20 7d 65  oslist==0; .  }e
21c00 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
21c10 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
21c20 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
21c30 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a  pIter->pMulti);.
21c40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
21c50 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
21c60 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a  tching rowid. .*
21c70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
21c80 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  s5IterNext(Fts5I
21c90 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
21ca0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  {.  if( pIter->p
21cb0 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66  Doclist ){.    f
21cc0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
21cd0 78 74 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  xt(pIter->pDocli
21ce0 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  st);.  }else{.  
21cf0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
21d00 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
21d10 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  );.    fts5Multi
21d20 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e  IterNext(pIter->
21d30 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
21d40 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20  Multi, 0, 0);.  
21d50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  }.}../*.** Move 
21d60 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
21d70 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20  hing rowid that 
21d80 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66 74  occurs at or aft
21d90 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a  er iMatch. The.*
21da0 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  * definition of 
21db0 22 61 74 20 6f 72 20 61 66 74 65 72 22 20 64 65  "at or after" de
21dc0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
21dd0 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69   this iterator i
21de0 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73  terates.** in as
21df0 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65  cending or desce
21e00 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
21e10 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
21e20 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
21e30 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  om(Fts5IndexIter
21e40 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d 61   *pIter, i64 iMa
21e50 74 63 68 29 7b 0a 20 20 69 66 28 20 70 49 74 65  tch){.  if( pIte
21e60 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20  r->pDoclist ){. 
21e70 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
21e80 20 20 20 20 2f 2a 20 66 74 73 35 44 6f 63 6c 69      /* fts5Docli
21e90 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  stIterNextFrom(p
21ea0 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2c 20  Iter->pDoclist, 
21eb0 69 4d 61 74 63 68 29 3b 20 2a 2f 0a 20 20 7d 65  iMatch); */.  }e
21ec0 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c  lse{.    fts5Mul
21ed0 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  tiIterNextFrom(p
21ee0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
21ef0 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61  ter->pMulti, iMa
21f00 74 63 68 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  tch);.  }.}../*.
21f10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
21f20 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a  rrent rowid..*/.
21f30 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49  i64 sqlite3Fts5I
21f40 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64  terRowid(Fts5Ind
21f50 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
21f60 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
21f70 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  clist ){.    ret
21f80 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  urn pIter->pDocl
21f90 69 73 74 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 7d  ist->iRowid;.  }
21fa0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
21fb0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
21fc0 77 69 64 28 70 49 74 65 72 2d 3e 70 4d 75 6c 74  wid(pIter->pMult
21fd0 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  i);.  }.}.../*.*
21fe0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
21ff0 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
22000 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f 70 79  ontaining a copy
22010 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
22020 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68 65   list for.** the
22030 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
22040 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  Output variable 
22050 2a 70 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  *pn is set to th
22060 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
22070 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74 65  ffer .** in byte
22080 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
22090 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ng..**.** The re
220a0 74 75 72 6e 65 64 20 62 75 66 66 65 72 20 64 6f  turned buffer do
220b0 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
220c0 68 65 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74  he 0x00 terminat
220d0 6f 72 20 62 79 74 65 20 73 74 6f 72 65 64 20 6f  or byte stored o
220e0 6e 0a 2a 2a 20 64 69 73 6b 2e 0a 2a 2f 0a 63 6f  n.** disk..*/.co
220f0 6e 73 74 20 75 38 20 2a 73 71 6c 69 74 65 33 46  nst u8 *sqlite3F
22100 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 46  ts5IterPoslist(F
22110 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
22120 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20  ter, int *pn){. 
22130 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63   if( pIter->pDoc
22140 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 6e 20  list ){.    *pn 
22150 3d 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  = pIter->pDoclis
22160 74 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20  t->nPoslist;.   
22170 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70   return pIter->p
22180 44 6f 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73  Doclist->aPoslis
22190 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
221a0 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
221b0 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Iter->pIndex;.  
221c0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
221d0 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
221e0 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  );.    fts5Multi
221f0 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70  IterPoslist(p, p
22200 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30 2c  Iter->pMulti, 0,
22210 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
22220 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22230 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22240 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
22250 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
22260 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pn = pIter->po
22270 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 72 65 74  slist.n;.    ret
22280 75 72 6e 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  urn pIter->posli
22290 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st.p;.  }.}../*.
222a0 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72  ** Close an iter
222b0 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61  ator opened by a
222c0 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
222d0 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
222e0 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f  exQuery()..*/.vo
222f0 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  id sqlite3Fts5It
22300 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  erClose(Fts5Inde
22310 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
22320 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
22330 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
22340 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73  clist ){.      s
22350 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
22360 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 29 3b  r->pDoclist->a);
22370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22380 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c  ree(pIter->pDocl
22390 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
223a0 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
223b0 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e  IterFree(pIter->
223c0 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
223d0 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 74  Multi);.      ft
223e0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
223f0 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63  se(pIter->pStruc
22400 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  t);.      fts5Bu
22410 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
22420 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d  >poslist);.    }
22430 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65  .    fts5CloseRe
22440 61 64 65 72 28 70 49 74 65 72 2d 3e 70 49 6e 64  ader(pIter->pInd
22450 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
22460 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
22470 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
22480 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
22490 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 62  ecord into the b
224a0 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20 61  uffer supplied a
224b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
224c0 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72   argument. Retur
224d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
224e0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
224f0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
22500 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f  de.** if an erro
22510 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  r occurs..*/.int
22520 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22530 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xGetAverages(Fts
22540 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42  5Index *p, Fts5B
22550 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
22560 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
22570 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46 54  ffer(p, pBuf, FT
22580 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
22590 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  D);.  return p->
225a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  rc;.}../*.** Rep
225b0 6c 61 63 65 20 74 68 65 20 63 75 72 72 65 6e 74  lace the current
225c0 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
225d0 72 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  rd with the cont
225e0 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  ents of the buff
225f0 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20  er .** supplied 
22600 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
22610 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
22620 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
22630 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
22640 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75  ndex *p, const u
22650 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
22660 61 74 61 29 7b 0a 20 20 66 74 73 35 44 61 74 61  ata){.  fts5Data
22670 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56  Write(p, FTS5_AV
22680 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70 44  ERAGES_ROWID, pD
22690 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72  ata, nData);.  r
226a0 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
226b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
226c0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
226d0 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64   blocks this mod
226e0 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f  ule has read fro
226f0 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  m the %_data.** 
22700 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77  table since it w
22710 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69  as created..*/.i
22720 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
22730 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64  dexReads(Fts5Ind
22740 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ex *p){.  return
22750 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a         p->nRead;.}..