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

Artifact dab399c67cb6bdd23009d2f1280ea60a9585b47c:


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 0a 73 74 61 74 69 63 20  .  }.}...static 
5f90: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5fa0: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5fb0: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5fc0: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5fd0: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5fe0: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5ff0: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
6000: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
6010: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
6020: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
6030: 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  1];.}../*.** All
6040: 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
6050: 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65 61   a buffer at lea
6060: 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20 69  st nByte bytes i
6070: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
6080: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73   an OOM error is
6090: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72 65   encountered, re
60a0: 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73 65  turn NULL and se
60b0: 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  t the error code
60c0: 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35 49   in.** the Fts5I
60d0: 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73 73  ndex handle pass
60e0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
60f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
6100: 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49 64  tic void *fts5Id
6110: 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64 65  xMalloc(Fts5Inde
6120: 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 29  x *p, int nByte)
6130: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
6140: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
6150: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
6160: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pRet = sqlite3_m
6170: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
6180: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
6190: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
61a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
61b0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65  {.    memset(pRe
61c0: 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  t, 0, nByte);.  
61d0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
61e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .}.../*.** Compa
61f0: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
6200: 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75 66  of the pLeft buf
6210: 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52 69  fer with the pRi
6220: 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e  ght/nRight blob.
6230: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
6240: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
6250: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
6260: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
6270: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
6280: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
6290: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
62a0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
62b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
62c0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
62d0: 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ht.*/.static int
62e0: 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
62f0: 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42 75  reBlob(.  Fts5Bu
6300: 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  ffer *pLeft,    
6310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
6320: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t hand side of c
6330: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63  omparison */.  c
6340: 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74 2c  onst u8 *pRight,
6350: 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20 2f   int nRight    /
6360: 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69 64  * Right hand sid
6370: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
6380: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  */.){.  int nCmp
6390: 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c   = MIN(pLeft->n,
63a0: 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20   nRight);.  int 
63b0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
63c0: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20 6e  ft->p, pRight, n
63d0: 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmp);.  return (
63e0: 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d  res==0 ? (pLeft-
63f0: 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20 72  >n - nRight) : r
6400: 65 73 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 73 74  es);.}..#if 0.st
6410: 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6d  atic int fts5Com
6420: 70 61 72 65 42 6c 6f 62 28 0a 20 20 63 6f 6e 73  pareBlob(.  cons
6430: 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74  t u8 *pLeft, int
6440: 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20   nLeft,.  const 
6450: 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20  u8 *pRight, int 
6460: 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20  nRight.){.  int 
6470: 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74  nCmp = MIN(nLeft
6480: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
6490: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
64a0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d  eft, pRight, nCm
64b0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
64c0: 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20  s==0 ? (nLeft - 
64d0: 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a  nRight) : res);.
64e0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
64f0: 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74  Compare the cont
6500: 65 6e 74 73 20 6f 66 20 74 68 65 20 74 77 6f 20  ents of the two 
6510: 62 75 66 66 65 72 73 20 75 73 69 6e 67 20 6d 65  buffers using me
6520: 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65 20 62  mcmp(). If one b
6530: 75 66 66 65 72 0a 2a 2a 20 69 73 20 61 20 70 72  uffer.** is a pr
6540: 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65  efix of the othe
6550: 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65  r, it is conside
6560: 72 65 64 20 74 68 65 20 6c 65 73 73 65 72 2e 0a  red the lesser..
6570: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65  **.** Return -ve
6580: 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61   if pLeft is sma
6590: 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68 74  ller than pRight
65a0: 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  , 0 if they are 
65b0: 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20  equal or.** +ve 
65c0: 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d 61  if pRight is sma
65d0: 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e  ller than pLeft.
65e0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a   In other words:
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d  .**.**     res =
6600: 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68   *pLeft - *pRigh
6610: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
6620: 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
6630: 65 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c  e(Fts5Buffer *pL
6640: 65 66 74 2c 20 46 74 73 35 42 75 66 66 65 72 20  eft, Fts5Buffer 
6650: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  *pRight){.  int 
6660: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
6670: 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b  ->n, pRight->n);
6680: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
6690: 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52  cmp(pLeft->p, pR
66a0: 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a  ight->p, nCmp);.
66b0: 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30    return (res==0
66c0: 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 70   ? (pLeft->n - p
66d0: 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72 65 73 29  Right->n) : res)
66e0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ;.}.../*.** Clos
66f0: 65 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20  e the read-only 
6700: 62 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69 66 20  blob handle, if 
6710: 69 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73  it is open..*/.s
6720: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43  tatic void fts5C
6730: 6c 6f 73 65 52 65 61 64 65 72 28 46 74 73 35 49  loseReader(Fts5I
6740: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndex *p){.  if( 
6750: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
6760: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
6770: 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65 72 29  lose(p->pReader)
6780: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72  ;.    p->pReader
6790: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
67a0: 74 69 63 20 46 74 73 35 44 61 74 61 20 2a 66 74  tic Fts5Data *ft
67b0: 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66  s5DataReadOrBuff
67c0: 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  er(.  Fts5Index 
67d0: 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66 66 65  *p, .  Fts5Buffe
67e0: 72 20 2a 70 42 75 66 2c 20 0a 20 20 69 36 34 20  r *pBuf, .  i64 
67f0: 69 52 6f 77 69 64 0a 29 7b 0a 20 20 46 74 73 35  iRowid.){.  Fts5
6800: 44 61 74 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a  Data *pRet = 0;.
6810: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
6820: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
6830: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6840: 3b 0a 0a 23 69 66 20 30 0a 46 74 73 35 42 75 66  ;..#if 0.Fts5Buf
6850: 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 30 2c 30  fer buf = {0,0,0
6860: 7d 3b 0a 66 74 73 35 44 65 62 75 67 52 6f 77 69  };.fts5DebugRowi
6870: 64 28 26 72 63 2c 20 26 62 75 66 2c 20 69 52 6f  d(&rc, &buf, iRo
6880: 77 69 64 29 3b 0a 66 70 72 69 6e 74 66 28 73 74  wid);.fprintf(st
6890: 64 6f 75 74 2c 20 22 72 65 61 64 3a 20 25 73 5c  dout, "read: %s\
68a0: 6e 22 2c 20 62 75 66 2e 70 29 3b 0a 66 66 6c 75  n", buf.p);.fflu
68b0: 73 68 28 73 74 64 6f 75 74 29 3b 0a 73 71 6c 69  sh(stdout);.sqli
68c0: 74 65 33 5f 66 72 65 65 28 62 75 66 2e 70 29 3b  te3_free(buf.p);
68d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
68e0: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
68f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
6900: 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
6910: 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65 72  TE_ABORT if ther
6920: 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61 76  e has been a sav
6930: 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20  epoint.      ** 
6940: 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20 69  rollback since i
6950: 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
6960: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 20   In this case a 
6970: 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a  new blob handle.
6980: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
6990: 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ired.  */.      
69a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
69b0: 62 5f 72 65 6f 70 65 6e 28 70 2d 3e 70 52 65 61  b_reopen(p->pRea
69c0: 64 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  der, iRowid);.  
69d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
69e0: 54 45 5f 41 42 4f 52 54 20 29 7b 0a 20 20 20 20  TE_ABORT ){.    
69f0: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
6a00: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20  der(p);.        
6a10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
6a30: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f     /* If the blo
6a40: 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20  b handle is not 
6a50: 79 65 74 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 61  yet open, open a
6a60: 6e 64 20 73 65 65 6b 20 69 74 2e 20 4f 74 68 65  nd seek it. Othe
6a70: 72 77 69 73 65 2c 20 75 73 65 0a 20 20 20 20 2a  rwise, use.    *
6a80: 2a 20 74 68 65 20 62 6c 6f 62 5f 72 65 6f 70 65  * the blob_reope
6a90: 6e 28 29 20 41 50 49 20 74 6f 20 72 65 73 65 65  n() API to resee
6aa0: 6b 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62  k the existing b
6ab0: 6c 6f 62 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  lob handle.  */.
6ac0: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64      if( p->pRead
6ad0: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46  er==0 ){.      F
6ae0: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
6af0: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
6b00: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6b10: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43  te3_blob_open(pC
6b20: 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20  onfig->db, .    
6b30: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
6b40: 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c  Db, p->zDataTbl,
6b50: 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64   "block", iRowid
6b60: 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72  , 0, &p->pReader
6b70: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
6b80: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 66 74  .    if( rc ) ft
6b90: 73 35 4d 69 73 73 69 6e 67 44 61 74 61 28 29 3b  s5MissingData();
6ba0: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
6bb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6bc0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
6bd0: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
6be0: 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  p->pReader);.   
6bf0: 20 20 20 69 66 28 20 70 42 75 66 20 29 7b 0a 20     if( pBuf ){. 
6c00: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
6c10: 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 20  rZero(pBuf);.   
6c20: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47       fts5BufferG
6c30: 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20 6e  row(&rc, pBuf, n
6c40: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Byte);.        r
6c50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
6c60: 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72  _read(p->pReader
6c70: 2c 20 70 42 75 66 2d 3e 70 2c 20 6e 42 79 74 65  , pBuf->p, nByte
6c80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
6c90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6ca0: 29 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79 74  ) pBuf->n = nByt
6cb0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
6cc0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 28          pRet = (
6cd0: 46 74 73 35 44 61 74 61 2a 29 66 74 73 35 49 64  Fts5Data*)fts5Id
6ce0: 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
6cf0: 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e 42  f(Fts5Data) + nB
6d00: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
6d10: 28 20 21 70 52 65 74 20 29 20 72 65 74 75 72 6e  ( !pRet ) return
6d20: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 70 52 65   0;..        pRe
6d30: 74 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20  t->n = nByte;.  
6d40: 20 20 20 20 20 20 70 52 65 74 2d 3e 70 20 3d 20        pRet->p = 
6d50: 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20  (u8*)&pRet[1];. 
6d60: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52 65         pRet->nRe
6d70: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  f = 1;.        r
6d80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
6d90: 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72  _read(p->pReader
6da0: 2c 20 70 52 65 74 2d 3e 70 2c 20 6e 42 79 74 65  , pRet->p, nByte
6db0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
6dc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6dd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6de0: 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b  ite3_free(pRet);
6df0: 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20  .          pRet 
6e00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
6e10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6e20: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
6e30: 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d   p->nRead++;.  }
6e40: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
6e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
6e60: 76 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ve a record from
6e70: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
6e80: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
6e90: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
6ea0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
6eb0: 64 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74 20  d an error left 
6ec0: 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73 35 49  in the .** Fts5I
6ed0: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ndex object..*/.
6ee0: 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61 20  static Fts5Data 
6ef0: 2a 66 74 73 35 44 61 74 61 52 65 61 64 28 46 74  *fts5DataRead(Ft
6f00: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6f10: 69 52 6f 77 69 64 29 7b 0a 20 20 46 74 73 35 44  iRowid){.  Fts5D
6f20: 61 74 61 20 2a 70 52 65 74 20 3d 20 66 74 73 35  ata *pRet = fts5
6f30: 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72  DataReadOrBuffer
6f40: 28 70 2c 20 30 2c 20 69 52 6f 77 69 64 29 3b 0a  (p, 0, iRowid);.
6f50: 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74 3d    assert( (pRet=
6f60: 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51 4c  =0)==(p->rc!=SQL
6f70: 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65 74  ITE_OK) );.  ret
6f80: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
6f90: 2a 2a 20 52 65 61 64 20 61 20 72 65 63 6f 72 64  ** Read a record
6fa0: 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
6fb0: 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65 20   table into the 
6fc0: 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20  buffer supplied 
6fd0: 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  as the.** second
6fe0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
6ff0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
7000: 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 69 73  urs, an error is
7010: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 46 74 73   left in the Fts
7020: 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49  5Index object. I
7030: 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61  f an.** error ha
7040: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
7050: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
7060: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
7070: 20 69 74 20 69 73 20 61 20 0a 2a 2a 20 6e 6f 2d   it is a .** no-
7080: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
7090: 69 64 20 66 74 73 35 44 61 74 61 42 75 66 66 65  id fts5DataBuffe
70a0: 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  r(Fts5Index *p, 
70b0: 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
70c0: 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
70d0: 20 28 76 6f 69 64 29 66 74 73 35 44 61 74 61 52   (void)fts5DataR
70e0: 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 70  eadOrBuffer(p, p
70f0: 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 7d 0a  Buf, iRowid);.}.
7100: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
7110: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61   reference to da
7120: 74 61 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e  ta record return
7130: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
7140: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35   call to.** fts5
7150: 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73  DataRead()..*/.s
7160: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
7170: 61 74 61 52 65 6c 65 61 73 65 28 46 74 73 35 44  ataRelease(Fts5D
7180: 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 69  ata *pData){.  i
7190: 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
71a0: 61 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e 6e  assert( pData->n
71b0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 44 61  Ref>0 );.    pDa
71c0: 74 61 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  ta->nRef--;.    
71d0: 69 66 28 20 70 44 61 74 61 2d 3e 6e 52 65 66 3d  if( pData->nRef=
71e0: 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  =0 ) sqlite3_fre
71f0: 65 28 70 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a  e(pData);.  }.}.
7200: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7210: 35 44 61 74 61 52 65 66 65 72 65 6e 63 65 28 46  5DataReference(F
7220: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b  ts5Data *pData){
7230: 0a 20 20 70 44 61 74 61 2d 3e 6e 52 65 66 2b 2b  .  pData->nRef++
7240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52  ;.}../*.** INSER
7250: 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72  T OR REPLACE a r
7260: 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25  ecord into the %
7270: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  _data table..*/.
7280: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7290: 44 61 74 61 57 72 69 74 65 28 46 74 73 35 49 6e  DataWrite(Fts5In
72a0: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
72b0: 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  id, const u8 *pD
72c0: 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
72d0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
72e0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
72f0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69  ;..  if( p->pWri
7300: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ter==0 ){.    in
7310: 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f  t rc;.    Fts5Co
7320: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
7330: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
7340: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
7350: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
7360: 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49        "REPLACE I
7370: 4e 54 4f 20 27 25 71 27 2e 25 51 28 69 64 2c 20  NTO '%q'.%Q(id, 
7380: 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c  block) VALUES(?,
7390: 3f 29 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  ?)", pConfig->zD
73a0: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a 20  b, p->zDataTbl. 
73b0: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53     );.    if( zS
73c0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
73d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
73e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
73f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7400: 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66  prepare_v2(pConf
7410: 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ig->db, zSql, -1
7420: 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 30  , &p->pWriter, 0
7430: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7440: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
7450: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
7460: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7470: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
7480: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7490: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
74a0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
74b0: 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69  Writer, 1, iRowi
74c0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  d);.  sqlite3_bi
74d0: 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74  nd_blob(p->pWrit
74e0: 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44  er, 2, pData, nD
74f0: 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ata, SQLITE_STAT
7500: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  IC);.  sqlite3_s
7510: 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  tep(p->pWriter);
7520: 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
7530: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69  e3_reset(p->pWri
7540: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ter);.}../*.** E
7550: 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f  xecute the follo
7560: 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20  wing SQL:.**.** 
7570: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
7580: 25 5f 64 61 74 61 20 57 48 45 52 45 20 69 64 20  %_data WHERE id 
7590: 42 45 54 57 45 45 4e 20 24 69 46 69 72 73 74 20  BETWEEN $iFirst 
75a0: 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74  AND $iLast.*/.st
75b0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
75c0: 74 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e 64  taDelete(Fts5Ind
75d0: 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72 73  ex *p, i64 iFirs
75e0: 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a 20  t, i64 iLast){. 
75f0: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
7600: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a  TE_OK ) return;.
7610: 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65 74  .  if( p->pDelet
7620: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  er==0 ){.    int
7630: 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e   rc;.    Fts5Con
7640: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
7650: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63  ->pConfig;.    c
7660: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
7670: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
7680: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
7690: 4d 20 27 25 71 27 2e 25 51 20 57 48 45 52 45 20  M '%q'.%Q WHERE 
76a0: 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22  id>=? AND id<=?"
76b0: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20  , pConfig->zDb, 
76c0: 70 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20  p->zDataTbl.    
76d0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
76e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
76f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7710: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
7720: 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d  pare_v2(pConfig-
7730: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
7740: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30 29 3b  p->pDeleter, 0);
7750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7760: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
7770: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7780: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7790: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
77a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
77b0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62    }..  sqlite3_b
77c0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
77d0: 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72 73 74  leter, 1, iFirst
77e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
77f0: 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65  d_int64(p->pDele
7800: 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a  ter, 2, iLast);.
7810: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
7820: 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 70  ->pDeleter);.  p
7830: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
7840: 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74 65 72  eset(p->pDeleter
7850: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
7860: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  e the sqlite3_bl
7870: 6f 62 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74  ob handle used t
7880: 6f 20 72 65 61 64 20 72 65 63 6f 72 64 73 20 66  o read records f
7890: 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
78a0: 61 62 6c 65 2e 0a 2a 2a 20 41 6e 64 20 64 69 73  able..** And dis
78b0: 63 61 72 64 20 61 6e 79 20 63 61 63 68 65 64 20  card any cached 
78c0: 72 65 61 64 73 2e 20 54 68 69 73 20 66 75 6e 63  reads. This func
78d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
78e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  t the end of.** 
78f0: 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
7900: 6f 6e 20 6f 72 20 77 68 65 6e 20 61 6e 79 20 73  on or when any s
7910: 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
7920: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
7930: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7940: 73 35 44 61 74 61 52 65 73 65 74 28 46 74 73 35  s5DataReset(Fts5
7950: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28  Index *p){.  if(
7960: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
7970: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
7980: 63 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65 72  close(p->pReader
7990: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65  );.    p->pReade
79a0: 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  r = 0;.  }.}../*
79b0: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72  .** Remove all r
79c0: 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74 65  ecords associate
79d0: 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20 69  d with segment i
79e0: 53 65 67 69 64 20 69 6e 20 69 6e 64 65 78 20 69  Segid in index i
79f0: 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Idx..*/.static v
7a00: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f  oid fts5DataRemo
7a10: 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e  veSegment(Fts5In
7a20: 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78  dex *p, int iIdx
7a30: 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b 0a 20  , int iSegid){. 
7a40: 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 46 54   i64 iFirst = FT
7a50: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
7a60: 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30  (iIdx, iSegid, 0
7a70: 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73  , 0);.  i64 iLas
7a80: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
7a90: 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65  _ROWID(iIdx, iSe
7aa0: 67 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31 3b 0a  gid+1, 0, 0)-1;.
7ab0: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
7ac0: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
7ad0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  t);.}../*.** Des
7ae0: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74  erialize and ret
7af0: 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  urn the structur
7b00: 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74  e record current
7b10: 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65 72  ly stored in ser
7b20: 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20  ialized.** form 
7b30: 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70 44  within buffer pD
7b40: 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a  ata/nData..**.**
7b50: 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75   The Fts5Structu
7b60: 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20  re.aLevel[] and 
7b70: 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75  each Fts5Structu
7b80: 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61  reLevel.aSeg[] a
7b90: 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72  rray.** are over
7ba0: 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e  -allocated by on
7bb0: 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c  e slot. This all
7bc0: 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75 72  ows the structur
7bd0: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f  e contents.** to
7be0: 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20   be more easily 
7bf0: 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  edited..**.** If
7c00: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7c10: 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20  , *ppOut is set 
7c20: 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53  to NULL and an S
7c30: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
7c40: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  .** returned. Ot
7c50: 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74 20  herwise, *ppOut 
7c60: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
7c70: 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
7c80: 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  t and.** SQLITE_
7c90: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
7ca0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
7cb0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 0a  tructureDecode(.
7cc0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74    const u8 *pDat
7cd0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
7ce0: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
7cf0: 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  aining serialize
7d00: 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  d structure */. 
7d10: 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20   int nData,     
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
7d40: 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74 65  er pData in byte
7d50: 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  s */.  Fts5Struc
7d60: 74 75 72 65 20 2a 2a 70 70 4f 75 74 20 20 20 20  ture **ppOut    
7d70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
7d80: 65 73 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65  eserialized obje
7d90: 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ct */.){.  int r
7da0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7db0: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
7dc0: 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c  t iLvl;.  int nL
7dd0: 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  evel = 0;.  int 
7de0: 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  nSegment = 0;.  
7df0: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
7e20: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  e to allocate */
7e30: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
7e40: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a 20 20 2f   *pRet = 0;..  /
7e50: 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61 6c  * Read the total
7e60: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
7e70: 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20 66  s and segments f
7e80: 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
7e90: 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63 74   the.  ** struct
7ea0: 75 72 65 20 72 65 63 6f 72 64 2e 20 55 73 65 20  ure record. Use 
7eb0: 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
7ec0: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
7ed0: 6f 72 20 74 68 65 20 64 65 73 65 72 69 61 6c 69  or the deseriali
7ee0: 7a 65 64 0a 20 20 2a 2a 20 76 65 72 73 69 6f 6e  zed.  ** version
7ef0: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e 20   of the record. 
7f00: 2a 2f 0a 20 20 69 20 3d 20 67 65 74 56 61 72 69  */.  i = getVari
7f10: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7f20: 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20  nLevel);.  i += 
7f30: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  getVarint32(&pDa
7f40: 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29  ta[i], nSegment)
7f50: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  ;.  nByte = (.  
7f60: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7f70: 74 72 75 63 74 75 72 65 29 20 2b 20 0a 20 20 20  tructure) + .   
7f80: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7f90: 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20  ructureLevel) * 
7fa0: 28 6e 4c 65 76 65 6c 2b 31 29 20 2b 0a 20 20 20  (nLevel+1) +.   
7fb0: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7fc0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20  ructureSegment) 
7fd0: 2a 20 28 6e 53 65 67 6d 65 6e 74 2b 6e 4c 65 76  * (nSegment+nLev
7fe0: 65 6c 2b 31 29 0a 20 20 29 3b 0a 20 20 70 52 65  el+1).  );.  pRe
7ff0: 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  t = (Fts5Structu
8000: 72 65 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  re*)sqlite3_mall
8010: 6f 63 28 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66  oc(nByte);..  if
8020: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 75 38  ( pRet ){.    u8
8030: 20 2a 70 53 70 61 63 65 20 3d 20 28 75 38 2a 29   *pSpace = (u8*)
8040: 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c  &pRet->aLevel[nL
8050: 65 76 65 6c 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  evel+1];.    mem
8060: 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79  set(pRet, 0, nBy
8070: 74 65 29 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  te);.    pRet->n
8080: 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a  Level = nLevel;.
8090: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
80a0: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
80b0: 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69  [i], &pRet->nWri
80c0: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20  teCounter);.    
80d0: 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
80e0: 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  <nLevel; iLvl++)
80f0: 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
8100: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
8110: 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c   = &pRet->aLevel
8120: 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e  [iLvl];.      in
8130: 74 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  t nTotal;.      
8140: 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20  int iSeg;..     
8150: 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   i += getVarint3
8160: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
8170: 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20  l->nMerge);.    
8180: 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
8190: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
81a0: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  otal);.      ass
81b0: 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76  ert( nTotal>=pLv
81c0: 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20  l->nMerge );.   
81d0: 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20     pLvl->nSeg = 
81e0: 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 70 4c  nTotal;.      pL
81f0: 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  vl->aSeg = (Fts5
8200: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8210: 2a 29 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  *)pSpace;.      
8220: 70 53 70 61 63 65 20 2b 3d 20 28 28 6e 54 6f 74  pSpace += ((nTot
8230: 61 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 46  al+1) * sizeof(F
8240: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
8250: 65 6e 74 29 29 3b 0a 0a 20 20 20 20 20 20 66 6f  ent));..      fo
8260: 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e  r(iSeg=0; iSeg<n
8270: 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a  Total; iSeg++){.
8280: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74          i += get
8290: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
82a0: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
82b0: 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  Seg].iSegid);.  
82c0: 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61        i += getVa
82d0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
82e0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
82f0: 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  g].nHeight);.   
8300: 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72       i += getVar
8310: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
8320: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
8330: 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20  ].pgnoFirst);.  
8340: 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61        i += getVa
8350: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
8360: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
8370: 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  g].pgnoLast);.  
8380: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8390: 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65  pRet->aLevel[nLe
83a0: 76 65 6c 5d 2e 61 53 65 67 20 3d 20 28 46 74 73  vel].aSeg = (Fts
83b0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
83c0: 74 2a 29 70 53 70 61 63 65 3b 0a 20 20 7d 65 6c  t*)pSpace;.  }el
83d0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
83e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
83f0: 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b    *ppOut = pRet;
8400: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8410: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73  ./*.** Read, des
8420: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74  erialize and ret
8430: 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  urn the structur
8440: 65 20 72 65 63 6f 72 64 20 66 6f 72 20 69 6e 64  e record for ind
8450: 65 78 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54  ex iIdx..**.** T
8460: 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
8470: 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61  .aLevel[] and ea
8480: 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ch Fts5Structure
8490: 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72  Level.aSeg[] arr
84a0: 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61  ay.** are over-a
84b0: 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63  llocated as desc
84c0: 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69  ribed for functi
84d0: 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65  on fts5Structure
84e0: 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f  Decode() .** abo
84f0: 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ve..**.** If an 
8500: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
8510: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
8520: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
8530: 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20   left in the.** 
8540: 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
8550: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
8560: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
8570: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
8580: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
8590: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
85a0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  p..*/.static Fts
85b0: 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35  5Structure *fts5
85c0: 53 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74  StructureRead(Ft
85d0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
85e0: 69 49 64 78 29 7b 0a 20 20 46 74 73 35 43 6f 6e  iIdx){.  Fts5Con
85f0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
8600: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73  ->pConfig;.  Fts
8610: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
8620: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
8630: 4f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e  Object to return
8640: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
8650: 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
8660: 20 20 20 20 20 20 2f 2a 20 25 5f 64 61 74 61 20        /* %_data 
8670: 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  entry containing
8680: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
8690: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
86a0: 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
86b0: 50 72 65 66 69 78 20 29 3b 0a 20 20 70 44 61 74  Prefix );.  pDat
86c0: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
86d0: 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  (p, FTS5_STRUCTU
86e0: 52 45 5f 52 4f 57 49 44 28 69 49 64 78 29 29 3b  RE_ROWID(iIdx));
86f0: 0a 20 20 69 66 28 20 21 70 44 61 74 61 20 29 20  .  if( !pData ) 
8700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 72  return 0;.  p->r
8710: 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
8720: 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70  eDecode(pData->p
8730: 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26 70 52 65  , pData->n, &pRe
8740: 74 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52  t);..  fts5DataR
8750: 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
8760: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8770: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
8780: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
8790: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
87a0: 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20 62  bject returned b
87b0: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a  y an earlier .**
87c0: 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72   call to fts5Str
87d0: 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72 20  uctureRead() or 
87e0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
87f0: 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
8800: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8810: 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35 53  ureRelease(Fts5S
8820: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
8830: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t){.  sqlite3_fr
8840: 65 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a  ee(pStruct);.}..
8850: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8860: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
8870: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64   segments in ind
8880: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
8890: 72 75 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ruct..*/.static 
88a0: 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72  int fts5Structur
88b0: 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46  eCountSegments(F
88c0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
88d0: 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53  truct){.  int nS
88e0: 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  egment = 0;     
88f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
8900: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
8910: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
8920: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
8930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
8940: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
8950: 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
8960: 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69  .  for(iLvl=0; i
8970: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
8980: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
8990: 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53    nSegment += pS
89a0: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
89b0: 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 7d 0a 0a 20  vl].nSeg;.  }.. 
89c0: 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74   return nSegment
89d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61  ;.}../*.** Seria
89e0: 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74  lize and store t
89f0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
8a00: 65 63 6f 72 64 20 66 6f 72 20 69 6e 64 65 78 20  ecord for index 
8a10: 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iIdx..**.** If a
8a20: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8a30: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
8a40: 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49  ode in the Fts5I
8a50: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20  ndex object. If 
8a60: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20  an.** error has 
8a70: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
8a80: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
8a90: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
8aa0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
8ab0: 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74  tructureWrite(Ft
8ac0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
8ad0: 69 49 64 78 2c 20 46 74 73 35 53 74 72 75 63 74  iIdx, Fts5Struct
8ae0: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
8af0: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20   int nSegment;  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
8b20: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
8b30: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
8b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b50: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73    /* Buffer to s
8b60: 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20  erialize record 
8b70: 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  into */.  int iL
8b80: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
8b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8ba0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8bb0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 0a  ough levels */..
8bc0: 20 20 6e 53 65 67 6d 65 6e 74 20 3d 20 66 74 73    nSegment = fts
8bd0: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8be0: 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
8bf0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c  ;.  memset(&buf,
8c00: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
8c10: 75 66 66 65 72 29 29 3b 0a 20 20 66 74 73 35 42  uffer));.  fts5B
8c20: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
8c30: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
8c40: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29  pStruct->nLevel)
8c50: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
8c60: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
8c70: 63 2c 20 26 62 75 66 2c 20 6e 53 65 67 6d 65 6e  c, &buf, nSegmen
8c80: 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  t);.  fts5Buffer
8c90: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8ca0: 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36 34 29  >rc, &buf, (i64)
8cb0: 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
8cc0: 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 66 6f 72 28  ounter);..  for(
8cd0: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
8ce0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
8cf0: 76 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69  vl++){.    int i
8d00: 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
8d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
8d20: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
8d30: 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
8d40: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
8d50: 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
8d60: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8d70: 69 4c 76 6c 5d 3b 0a 20 20 20 20 66 74 73 35 42  iLvl];.    fts5B
8d80: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
8d90: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
8da0: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
8db0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
8dc0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
8dd0: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53  , &buf, pLvl->nS
8de0: 65 67 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eg);.    assert(
8df0: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
8e00: 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
8e10: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
8e20: 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
8e30: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  Seg++){.      ft
8e40: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
8e50: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
8e60: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
8e70: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
8e80: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
8e90: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
8ea0: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
8eb0: 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74  eg[iSeg].nHeight
8ec0: 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
8ed0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8ee0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
8ef0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
8f00: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
8f10: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8f20: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8f30: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
8f40: 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29  [iSeg].pgnoLast)
8f50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66  ;.    }.  }..  f
8f60: 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
8f70: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
8f80: 4f 57 49 44 28 69 49 64 78 29 2c 20 62 75 66 2e  OWID(iIdx), buf.
8f90: 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 66 74 73  p, buf.n);.  fts
8fa0: 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
8fb0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
8fc0: 74 68 65 20 70 49 74 65 72 2d 3e 69 4f 66 66 20  the pIter->iOff 
8fd0: 6f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79  offset currently
8fe0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
8ff0: 74 72 79 20 69 6e 64 69 63 61 74 69 6e 67 20 6f  try indicating o
9000: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 74 65  ne.** or more te
9010: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 2c 20 61  rm-less nodes, a
9020: 64 76 61 6e 63 65 20 70 61 73 74 20 69 74 20 61  dvance past it a
9030: 6e 64 20 73 65 74 20 70 49 74 65 72 2d 3e 6e 45  nd set pIter->nE
9040: 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  mpty to.** the n
9050: 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20 63  umber of empty c
9060: 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a 73  hild nodes..*/.s
9070: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e  tatic void fts5N
9080: 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d  odeIterGobbleNEm
9090: 70 74 79 28 46 74 73 35 4e 6f 64 65 49 74 65 72  pty(Fts5NodeIter
90a0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
90b0: 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 49 74 65  pIter->iOff<pIte
90c0: 72 2d 3e 6e 44 61 74 61 20 26 26 20 30 3d 3d 28  r->nData && 0==(
90d0: 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74  pIter->aData[pIt
90e0: 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78 66 65  er->iOff] & 0xfe
90f0: 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ) ){.    pIter->
9100: 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  bDlidx = pIter->
9110: 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66  aData[pIter->iOf
9120: 66 5d 20 26 20 30 78 30 31 3b 0a 20 20 20 20 70  f] & 0x01;.    p
9130: 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20  Iter->iOff++;.  
9140: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
9150: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49   getVarint32(&pI
9160: 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72  ter->aData[pIter
9170: 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72 2d 3e  ->iOff], pIter->
9180: 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c 73 65  nEmpty);.  }else
9190: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d  {.    pIter->nEm
91a0: 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  pty = 0;.    pIt
91b0: 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30 3b 0a  er->bDlidx = 0;.
91c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
91d0: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
91e0: 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20 74 68   entry within th
91f0: 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e node..*/.stati
9200: 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49  c void fts5NodeI
9210: 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70 52 63  terNext(int *pRc
9220: 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a  , Fts5NodeIter *
9230: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
9240: 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72  ter->iOff>=pIter
9250: 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 70  ->nData ){.    p
9260: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b  Iter->aData = 0;
9270: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69  .    pIter->iChi
9280: 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 45 6d  ld += pIter->nEm
9290: 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pty;.  }else{.  
92a0: 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e 65 77    int nPre, nNew
92b0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66  ;.    pIter->iOf
92c0: 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
92d0: 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70  (&pIter->aData[p
92e0: 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 50 72  Iter->iOff], nPr
92f0: 65 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  e);.    pIter->i
9300: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
9310: 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61  32(&pIter->aData
9320: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e  [pIter->iOff], n
9330: 4e 65 77 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  New);.    pIter-
9340: 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d 32  >term.n = nPre-2
9350: 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
9360: 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20  AppendBlob(pRc, 
9370: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e  &pIter->term, nN
9380: 65 77 2c 20 70 49 74 65 72 2d 3e 61 44 61 74 61  ew, pIter->aData
9390: 2b 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b 0a 20  +pIter->iOff);. 
93a0: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
93b0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65  = nNew;.    pIte
93c0: 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28 31 20  r->iChild += (1 
93d0: 2b 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29  + pIter->nEmpty)
93e0: 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74  ;.    fts5NodeIt
93f0: 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70  erGobbleNEmpty(p
9400: 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 2a  Iter);.    if( *
9410: 70 52 63 20 29 20 70 49 74 65 72 2d 3e 61 44 61  pRc ) pIter->aDa
9420: 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ta = 0;.  }.}...
9430: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
9440: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
9450: 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74  ject pIter to it
9460: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
9470: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73 65  e internal.** se
9480: 67 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20 70 44  gment node in pD
9490: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
94a0: 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72  oid fts5NodeIter
94b0: 49 6e 69 74 28 63 6f 6e 73 74 20 75 38 20 2a 61  Init(const u8 *a
94c0: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
94d0: 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70   Fts5NodeIter *p
94e0: 49 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28  Iter){.  memset(
94f0: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
9500: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
9510: 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 44 61 74  er->aData = aDat
9520: 61 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44 61 74  a;.  pIter->nDat
9530: 61 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70 49 74  a = nData;.  pIt
9540: 65 72 2d 3e 69 4f 66 66 20 3d 20 67 65 74 56 61  er->iOff = getVa
9550: 72 69 6e 74 33 32 28 61 44 61 74 61 2c 20 70 49  rint32(aData, pI
9560: 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20  ter->iChild);.  
9570: 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62  fts5NodeIterGobb
9580: 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b  leNEmpty(pIter);
9590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
95a0: 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ny memory alloca
95b0: 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61  ted by the itera
95c0: 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  tor object..*/.s
95d0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e  tatic void fts5N
95e0: 6f 64 65 49 74 65 72 46 72 65 65 28 46 74 73 35  odeIterFree(Fts5
95f0: 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72 29  NodeIter *pIter)
9600: 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  {.  fts5BufferFr
9610: 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29  ee(&pIter->term)
9620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
9630: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
9640: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
9650: 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c  ment has the fol
9660: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65  lowing fields se
9670: 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e  t.** as follows.
9680: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
9690: 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74 20  ets up the rest 
96a0: 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  of the iterator 
96b0: 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f  so that it.** po
96c0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
96d0: 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64  t rowid in the d
96e0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a  oclist-index..**
96f0: 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20 70 6f 69  .**   pData: poi
9700: 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d  nter to doclist-
9710: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a  index record, .*
9720: 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f 3a 20 70  *   iLeafPgno: p
9730: 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
9740: 74 68 69 73 20 64 6f 63 6c 69 73 74 2d 69 6e 64  this doclist-ind
9750: 65 78 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  ex is associated
9760: 20 77 69 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   with..*/.static
9770: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
9780: 65 72 46 69 72 73 74 28 46 74 73 35 44 6c 69 64  erFirst(Fts5Dlid
9790: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
97a0: 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
97b0: 20 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61 3b   = pIter->pData;
97c0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
97d0: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 61 74  ert( pIter->pDat
97e0: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
97f0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e  Iter->iLeafPgno>
9800: 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  0 );..  /* Count
9810: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
9820: 65 61 64 69 6e 67 20 30 78 30 30 20 62 79 74 65  eading 0x00 byte
9830: 73 2e 20 54 68 65 6e 20 73 65 74 20 69 4c 65 61  s. Then set iLea
9840: 66 50 67 6e 6f 2e 20 2a 2f 0a 20 20 66 6f 72 28  fPgno. */.  for(
9850: 69 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e 3b  i=0; i<pData->n;
9860: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 66 28 20   i++){ .    if( 
9870: 70 44 61 74 61 2d 3e 70 5b 69 5d 20 29 20 62 72  pData->p[i] ) br
9880: 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  eak;.  }.  pIter
9890: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28  ->iLeafPgno += (
98a0: 69 2b 31 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  i+1);.  pIter->i
98b0: 4f 66 66 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 55  Off = i;..  /* U
98c0: 6e 6c 65 73 73 20 77 65 20 61 72 65 20 61 6c 72  nless we are alr
98d0: 65 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20  eady at the end 
98e0: 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  of the doclist-i
98f0: 6e 64 65 78 2c 20 6c 6f 61 64 20 74 68 65 20 66  ndex, load the f
9900: 69 72 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 20  irst.  ** rowid 
9910: 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28  value.  */.  if(
9920: 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 44 61   pIter->iOff<pDa
9930: 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  ta->n ){.    pIt
9940: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56  er->iOff += getV
9950: 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
9960: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 28 75  pIter->iOff], (u
9970: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
9980: 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  id);.  }else{.  
9990: 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
99a0: 31 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  1;.  }.  pIter->
99b0: 69 46 69 72 73 74 4f 66 66 20 3d 20 70 49 74 65  iFirstOff = pIte
99c0: 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65 74 75 72  r->iOff;.  retur
99d0: 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d  n pIter->bEof;.}
99e0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
99f0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
9a00: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
9a10: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
9a20: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
9a30: 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6c  xIterNext(Fts5Dl
9a40: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
9a50: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
9a60: 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61 74  ta = pIter->pDat
9a70: 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  a;.  int iOff;..
9a80: 20 20 66 6f 72 28 69 4f 66 66 3d 70 49 74 65 72    for(iOff=pIter
9a90: 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61  ->iOff; iOff<pDa
9aa0: 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a  ta->n; iOff++){.
9ab0: 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70      if( pData->p
9ac0: 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 20  [iOff] ) break; 
9ad0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66  .  }..  if( iOff
9ae0: 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20  <pData->n ){.   
9af0: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 70   i64 iVal;.    p
9b00: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
9b10: 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49 74 65 72  += (iOff - pIter
9b20: 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20  ->iOff) + 1;.   
9b30: 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69   iOff += getVari
9b40: 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66  nt(&pData->p[iOf
9b50: 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29  f], (u64*)&iVal)
9b60: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
9b70: 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20  wid -= iVal;.   
9b80: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 69   pIter->iOff = i
9b90: 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Off;.  }else{.  
9ba0: 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
9bb0: 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
9bc0: 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a   pIter->bEof;.}.
9bd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
9be0: 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74 73  DlidxIterEof(Fts
9bf0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
9c00: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
9c10: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  {.  return (p->r
9c20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
9c30: 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d 0a  pIter->bEof);.}.
9c40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9c50: 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46  5DlidxIterLast(F
9c60: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
9c70: 74 65 72 29 7b 0a 20 20 69 66 28 20 66 74 73 35  ter){.  if( fts5
9c80: 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 70  DlidxIterFirst(p
9c90: 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Iter)==0 ){.    
9ca0: 77 68 69 6c 65 28 20 30 3d 3d 66 74 73 35 44 6c  while( 0==fts5Dl
9cb0: 69 64 78 49 74 65 72 4e 65 78 74 28 70 49 74 65  idxIterNext(pIte
9cc0: 72 29 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  r) );.    pIter-
9cd0: 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d  >bEof = 0;.  }.}
9ce0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
9cf0: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 46  5DlidxIterPrev(F
9d00: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
9d10: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  ter){.  int iOff
9d20: 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66 66 3b 0a   = pIter->iOff;.
9d30: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
9d40: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69  ->bEof==0 );.  i
9d50: 66 28 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e  f( iOff<=pIter->
9d60: 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20  iFirstOff ){.   
9d70: 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
9d80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
9d90: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 44  8 *a = pIter->pD
9da0: 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20  ata->p;.    i64 
9db0: 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c  iVal;.    int iL
9dc0: 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 43 75  imit;..    /* Cu
9dd0: 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69  rrently iOff poi
9de0: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
9df0: 20 62 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e   byte of a varin
9e00: 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20  t. This block . 
9e10: 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73     ** decrements
9e20: 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70   iOff until it p
9e30: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
9e40: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 70  st byte of the p
9e50: 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20  revious .    ** 
9e60: 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63  varint. Taking c
9e70: 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20  are not to read 
9e80: 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  any memory locat
9e90: 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a  ions that occur.
9ea0: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68      ** before th
9eb0: 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f  e buffer in memo
9ec0: 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d  ry.  */.    iLim
9ed0: 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69  it = (iOff>9 ? i
9ee0: 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20  Off-9 : 0);.    
9ef0: 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66  for(iOff--; iOff
9f00: 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29  >iLimit; iOff--)
9f10: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b 69  {.      if( (a[i
9f20: 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d  Off-1] & 0x80)==
9f30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
9f40: 0a 0a 20 20 20 20 67 65 74 56 61 72 69 6e 74 28  ..    getVarint(
9f50: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
9f60: 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 49 74 65  &iVal);.    pIte
9f70: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61  r->iRowid += iVa
9f80: 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  l;.    pIter->iL
9f90: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20  eafPgno--;..    
9fa0: 77 68 69 6c 65 28 20 69 4f 66 66 3e 70 49 74 65  while( iOff>pIte
9fb0: 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 0a 20 20  r->iFirstOff .  
9fc0: 20 20 20 20 20 20 26 26 20 61 5b 69 4f 66 66 2d        && a[iOff-
9fd0: 31 5d 3d 3d 30 78 30 30 20 26 26 20 28 61 5b 69  1]==0x00 && (a[i
9fe0: 4f 66 66 2d 32 5d 20 26 20 30 78 38 30 29 3d 3d  Off-2] & 0x80)==
9ff0: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
a000: 69 4f 66 66 2d 2d 3b 0a 20 20 20 20 20 20 70 49  iOff--;.      pI
a010: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d  ter->iLeafPgno--
a020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
a030: 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  r->iOff = iOff;.
a040: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
a050: 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  ter->bEof;.}..st
a060: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
a070: 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46  idxIterInit(.  F
a080: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a0a0: 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74  * Fts5 Backend t
a0b0: 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
a0c0: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
a0f0: 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a  r ORDER BY ASC *
a100: 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 69 6e  /.  int iIdx, in
a110: 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  t iSegid,       
a120: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
a130: 53 65 67 69 64 20 77 69 74 68 69 6e 20 69 6e 64  Segid within ind
a140: 65 78 20 69 49 64 78 20 2a 2f 0a 20 20 69 6e 74  ex iIdx */.  int
a150: 20 69 4c 65 61 66 50 67 6e 6f 2c 20 20 20 20 20   iLeafPgno,     
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a170: 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  Leaf page number
a180: 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66   to load dlidx f
a190: 6f 72 20 2a 2f 0a 20 20 46 74 73 35 44 6c 69 64  or */.  Fts5Dlid
a1a0: 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20  xIter **ppIter  
a1b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
a1c0: 50 6f 70 75 6c 61 74 65 64 20 69 74 65 72 61 74  Populated iterat
a1d0: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  or */.){.  Fts5D
a1e0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 20  lidxIter *pIter 
a1f0: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 46 74 73  = *ppIter;.  Fts
a200: 35 44 61 74 61 20 2a 70 44 6c 69 64 78 3b 0a 0a  5Data *pDlidx;..
a210: 20 20 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44    pDlidx = fts5D
a220: 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
a230: 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57 49  DOCLIST_IDX_ROWI
a240: 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
a250: 69 4c 65 61 66 50 67 6e 6f 29 29 3b 0a 20 20 69  iLeafPgno));.  i
a260: 66 28 20 70 44 6c 69 64 78 3d 3d 30 20 29 20 72  f( pDlidx==0 ) r
a270: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 49 74  eturn;.  if( pIt
a280: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70  er==0 ){.    *pp
a290: 49 74 65 72 20 3d 20 70 49 74 65 72 20 3d 20 28  Iter = pIter = (
a2a0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29 66  Fts5DlidxIter*)f
a2b0: 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
a2c0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
a2d0: 49 74 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  Iter));.    if( 
a2e0: 70 49 74 65 72 3d 3d 30 20 29 7b 20 0a 20 20 20  pIter==0 ){ .   
a2f0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
a300: 73 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  se(pDlidx);.    
a310: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
a320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
a330: 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
a340: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74  zeof(Fts5DlidxIt
a350: 65 72 29 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74  er));.  }..  pIt
a360: 65 72 2d 3e 70 44 61 74 61 20 3d 20 70 44 6c 69  er->pData = pDli
a370: 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  dx;.  pIter->iLe
a380: 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
a390: 6e 6f 3b 0a 20 20 69 66 28 20 62 52 65 76 3d 3d  no;.  if( bRev==
a3a0: 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69  0 ){.    fts5Dli
a3b0: 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65  dxIterFirst(pIte
a3c0: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
a3d0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
a3e0: 73 74 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  st(pIter);.  }.}
a3f0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64  ../*.** Free a d
a400: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65  oclist-index ite
a410: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c  rator object all
a420: 6f 63 61 74 65 64 20 62 79 20 66 74 73 35 44 6c  ocated by fts5Dl
a430: 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a  idxIterInit()..*
a440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
a450: 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
a460: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
a470: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
a480: 65 72 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61  er ){.    fts5Da
a490: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
a4a0: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  >pData);.    sql
a4b0: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
a4c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
a4d0: 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61  oad the next lea
a4e0: 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  f page into the 
a4f0: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
a500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a510: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
a520: 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
a530: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
a540: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
a550: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
a560: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
a570: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
a580: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
a590: 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
a5a0: 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  xt page */.){.  
a5b0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
a5c0: 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74  ment *pSeg = pIt
a5d0: 65 72 2d 3e 70 53 65 67 3b 0a 20 20 69 66 28 20  er->pSeg;.  if( 
a5e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 20 66  pIter->pLeaf ) f
a5f0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
a600: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
a610: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
a620: 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  ++;.  if( pIter-
a630: 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67  >iLeafPgno<=pSeg
a640: 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
a650: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
a660: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
a670: 20 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53   .        FTS5_S
a680: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 49 74  EGMENT_ROWID(pIt
a690: 65 72 2d 3e 69 49 64 78 2c 20 70 53 65 67 2d 3e  er->iIdx, pSeg->
a6a0: 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72  iSegid, 0, pIter
a6b0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ->iLeafPgno).   
a6c0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
a6d0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
a6e0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
a6f0: 4c 65 61 76 65 20 70 49 74 65 72 2d 3e 69 4c 65  Leave pIter->iLe
a700: 61 66 4f 66 66 73 65 74 20 61 73 20 74 68 65 20  afOffset as the 
a710: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 69  offset to the si
a720: 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
a730: 66 69 72 73 74 0a 2a 2a 20 70 6f 73 69 74 69 6f  first.** positio
a740: 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69  n list. The posi
a750: 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67  tion list belong
a760: 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20  ing to document 
a770: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 2e 0a 2a  pIter->iRowid..*
a780: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
a790: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
a7a0: 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  m(Fts5Index *p, 
a7b0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
a7c0: 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a  er, int nKeep){.
a7d0: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
a7e0: 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20  >pLeaf->p;      
a7f0: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72    /* Buffer to r
a800: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f  ead data from */
a810: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
a820: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
a830: 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20  ;  /* Offset to 
a840: 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74  read at */.  int
a850: 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a870: 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74  Bytes of new dat
a880: 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20  a */..  iOff += 
a890: 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  getVarint32(&a[i
a8a0: 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70  Off], nNew);.  p
a8b0: 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e  Iter->term.n = n
a8c0: 4b 65 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66  Keep;.  fts5Buff
a8d0: 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
a8e0: 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
a8f0: 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66  m, nNew, &a[iOff
a900: 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e  ]);.  iOff += nN
a910: 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65  ew;.  pIter->iTe
a920: 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  rmLeafOffset = i
a930: 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54  Off;.  pIter->iT
a940: 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49  ermLeafPgno = pI
a950: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  ter->iLeafPgno;.
a960: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65    if( iOff>=pIte
a970: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  r->pLeaf->n ){. 
a980: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
a990: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
a9a0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
a9b0: 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20  >pLeaf==0 ){.   
a9c0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
a9d0: 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
a9e0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
a9f0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
aa00: 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34    }.    iOff = 4
aa10: 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d  ;.    a = pIter-
aa20: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20  >pLeaf->p;.  }. 
aa30: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
aa40: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
aa50: 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
aa60: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49 74  ->iRowid);.  pIt
aa70: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
aa80: 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = iOff;.}../*.**
aa90: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
aaa0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
aab0: 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65  pIter to iterate
aac0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74   through the ent
aad0: 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65  ries in.** segme
aae0: 6e 74 20 70 53 65 67 20 77 69 74 68 69 6e 20 69  nt pSeg within i
aaf0: 6e 64 65 78 20 69 49 64 78 2e 20 54 68 65 20 69  ndex iIdx. The i
ab00: 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
ab10: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
ab20: 0a 2a 2a 20 66 69 72 73 74 20 65 6e 74 72 79 20  .** first entry 
ab30: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
ab40: 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  on returns..**.*
ab50: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
ab60: 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
ab70: 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
ab80: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
ab90: 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61  r code. If .** a
aba0: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
abb0: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
abc0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
abd0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
abe0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
abf0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
ac00: 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
ac10: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
ac20: 20 20 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20     .  int iIdx, 
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e        /* Config.
ac50: 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66  aHash[] index of
ac60: 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20   FTS index */.  
ac70: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
ac80: 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
ac90: 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
aca0: 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  f segment */.  F
acb0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
acc0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
acd0: 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
ace0: 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  late */.){.  if(
acf0: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
ad00: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
ad10: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 74 68  is happens if th
ad20: 65 20 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69  e segment is bei
ad30: 6e 67 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e  ng used as an in
ad40: 70 75 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d  put to an increm
ad50: 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72  ental.    ** mer
ad60: 67 65 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20  ge and all data 
ad70: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
ad80: 20 22 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20   "trimmed". See 
ad90: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  function.    ** 
ada0: 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
adb0: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  () for details. 
adc0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65 61  In this case lea
add0: 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
ade0: 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68  empty..    ** Th
adf0: 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65  e caller will se
ae00: 65 20 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c  e the (pIter->pL
ae10: 65 61 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75  eaf==0) and assu
ae20: 6d 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  me the iterator 
ae30: 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46  is.    ** at EOF
ae40: 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20   already. */.   
ae50: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
ae60: 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeaf==0 );.    
ae70: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
ae80: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
ae90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  _OK ){.    memse
aea0: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
aeb0: 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20  of(*pIter));.   
aec0: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
aed0: 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Seg;.    pIter->
aee0: 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 20  iIdx = iIdx;.   
aef0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
af00: 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  o = pSeg->pgnoFi
af10: 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53  rst-1;.    fts5S
af20: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
af30: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  , pIter);.  }.. 
af40: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
af50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38 20  TE_OK ){.    u8 
af60: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
af70: 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d  f->p;.    pIter-
af80: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
af90: 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29  ts5GetU16(&a[2])
afa0: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
afb0: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
afc0: 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  er, 0);.  }.}..s
afd0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c  tatic void fts5L
afe0: 65 61 66 48 65 61 64 65 72 28 46 74 73 35 44 61  eafHeader(Fts5Da
aff0: 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20 2a  ta *pLeaf, int *
b000: 70 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69  piRowid, int *pi
b010: 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77 69  Term){.  *piRowi
b020: 64 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65 74  d = (int)fts5Get
b030: 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d  U16(&pLeaf->p[0]
b040: 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20 28  );.  *piTerm = (
b050: 69 6e 74 29 66 74 73 35 47 65 74 55 31 36 28 26  int)fts5GetU16(&
b060: 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a  pLeaf->p[2]);.}.
b070: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b080: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
b090: 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  r called on iter
b0a0: 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79  ators created by
b0b0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73   calls to.** Fts
b0c0: 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69  5IndexQuery() wi
b0d0: 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58  th the FTS5INDEX
b0e0: 5f 51 55 45 52 59 5f 41 53 43 20 66 6c 61 67 20  _QUERY_ASC flag 
b0f0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  set..**.** When 
b100: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
b110: 20 63 61 6c 6c 65 64 2c 20 69 74 65 72 61 74 6f   called, iterato
b120: 72 20 70 49 74 65 72 20 70 6f 69 6e 74 73 20 74  r pIter points t
b130: 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
b140: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72  d.** on the curr
b150: 65 6e 74 20 6c 65 61 66 20 61 73 73 6f 63 69 61  ent leaf associa
b160: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 65 72  ted with the ter
b170: 6d 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 2e  m being queried.
b180: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
b190: 2a 20 61 64 76 61 6e 63 65 73 20 69 74 20 74 6f  * advances it to
b1a0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6c 61   point to the la
b1b0: 73 74 20 73 75 63 68 20 72 6f 77 69 64 20 61 6e  st such rowid an
b1c0: 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
b1d0: 20 69 6e 69 74 69 61 6c 69 7a 65 73 0a 2a 2a 20   initializes.** 
b1e0: 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65 74  the aRowidOffset
b1f0: 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66  [] and iRowidOff
b200: 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  set variables..*
b210: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
b220: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
b230: 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e 64  InitPage(Fts5Ind
b240: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
b250: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
b260: 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  t n = pIter->pLe
b270: 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20 3d  af->n;.  int i =
b280: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
b290: 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70  set;.  u8 *a = p
b2a0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
b2b0: 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73    int iRowidOffs
b2c0: 65 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  et = 0;..  while
b2d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
b2e0: 4f 4b 20 26 26 20 69 3c 6e 20 29 7b 0a 20 20 20  OK && i<n ){.   
b2f0: 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
b300: 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 0a  .    int nPos;..
b310: 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69      i += getVari
b320: 6e 74 33 32 28 26 61 5b 69 5d 2c 20 6e 50 6f 73  nt32(&a[i], nPos
b330: 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73  );.    i += nPos
b340: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29  ;.    if( i>=n )
b350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d   break;.    i +=
b360: 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d   getVarint(&a[i]
b370: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
b380: 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c 74 61  ;.    if( iDelta
b390: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b3a0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d   pIter->iRowid -
b3b0: 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 69  = iDelta;..    i
b3c0: 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e  f( iRowidOffset>
b3d0: 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66  =pIter->nRowidOf
b3e0: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  fset ){.      in
b3f0: 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e  t nNew = pIter->
b400: 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38  nRowidOffset + 8
b410: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65  ;.      int *aNe
b420: 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  w = (int*)sqlite
b430: 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d  3_realloc(pIter-
b440: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e  >aRowidOffset, n
b450: 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  New*sizeof(int))
b460: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77  ;.      if( aNew
b470: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
b480: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
b490: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  MEM;.        bre
b4a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b4b0: 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f    pIter->aRowidO
b4c0: 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20  ffset = aNew;.  
b4d0: 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69      pIter->nRowi
b4e0: 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a  dOffset = nNew;.
b4f0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72      }..    pIter
b500: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69  ->aRowidOffset[i
b510: 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d  RowidOffset++] =
b520: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
b530: 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  set;.    pIter->
b540: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b  iLeafOffset = i;
b550: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52  .  }.  pIter->iR
b560: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f  owidOffset = iRo
b570: 77 69 64 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  widOffset;.}../*
b580: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
b590: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
b5a0: 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73  verseNewPage(Fts
b5b0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
b5c0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
b5d0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
b5e0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
b5f0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
b600: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
b610: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
b620: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
b630: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
b640: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
b650: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65  f);.  pIter->pLe
b660: 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  af = 0;.  while(
b670: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b680: 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61  K && pIter->iLea
b690: 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65  fPgno>pIter->iTe
b6a0: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
b6b0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
b6c0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
b6d0: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e  afPgno--;.    pN
b6e0: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
b6f0: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
b700: 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20  T_ROWID(.       
b710: 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78 2c 20     pIter->iIdx, 
b720: 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
b730: 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69  gid, 0, pIter->i
b740: 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b  LeafPgno.    ));
b750: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
b760: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
b770: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74  ->iLeafPgno==pIt
b780: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
b790: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
b7a0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
b7b0: 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 6e 20  fOffset<pNew->n 
b7c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
b7d0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
b7e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
b7f0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
b800: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
b810: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  fOffset;.       
b820: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
b830: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
b840: 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a 20 20  idOff, dummy;.  
b850: 20 20 20 20 20 20 66 74 73 35 4c 65 61 66 48 65        fts5LeafHe
b860: 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f 77  ader(pNew, &iRow
b870: 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a  idOff, &dummy);.
b880: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
b890: 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  idOff ){.       
b8a0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
b8b0: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
b8c0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
b8d0: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
b8e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b8f0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
b900: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
b910: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26         u8 *a = &
b920: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
b930: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
b940: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  et];.        pIt
b950: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
b960: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61 2c 20  += getVarint(a, 
b970: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
b980: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62  owid);.        b
b990: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
b9a0: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  e{.        fts5D
b9b0: 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
b9c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b9d0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72    }..  if( pIter
b9e0: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 66  ->pLeaf ){.    f
b9f0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
ba00: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
ba10: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
ba20: 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
ba30: 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20  or pIter to the 
ba40: 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a  next entry. .**.
ba50: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
ba60: 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
ba70: 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
ba80: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
ba90: 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20  or code. It .** 
baa0: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
bab0: 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
bac0: 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68  e iterator reach
bad0: 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72  es EOF. If an er
bae0: 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
baf0: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
bb00: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
bb10: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
bb20: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
bb30: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
bb40: 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35  IterNext(.  Fts5
bb50: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
bb70: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
bb80: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
bb90: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
bba0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
bbb0: 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
bbc0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
bbd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bbe0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c     if( pIter->fl
bbf0: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
bc00: 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20  ER_REVERSE ){.  
bc10: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
bc20: 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29 7b  RowidOffset>0 ){
bc30: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d  .        u8 *a =
bc40: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
bc50: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
bc60: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ff;.        int 
bc70: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 36  nPos;.        i6
bc80: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
bc90: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
bca0: 66 66 73 65 74 2d 2d 3b 0a 0a 20 20 20 20 20 20  ffset--;..      
bcb0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
bcc0: 66 73 65 74 20 3d 20 69 4f 66 66 20 3d 20 70 49  fset = iOff = pI
bcd0: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
bce0: 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f  t[pIter->iRowidO
bcf0: 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  ffset];.        
bd00: 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
bd10: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 50  t32(&a[iOff], nP
bd20: 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  os);.        iOf
bd30: 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20  f += nPos;.     
bd40: 20 20 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b     getVarint(&a[
bd50: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
bd60: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70  elta);.        p
bd70: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
bd80: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d 65  iDelta;.      }e
bd90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
bda0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
bdb0: 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
bdc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
bdd0: 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 44  lse{.      Fts5D
bde0: 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
bdf0: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
be00: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
be10: 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
be20: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  0;.      int nKe
be30: 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ep = 0;..      /
be40: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
be50: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69   end of the posi
be60: 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e  tion list within
be70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
be80: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  e. */.      u8 *
be90: 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  a = pLeaf->p;.  
bea0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65 61      int n = pLea
beb0: 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f 66  f->n;..      iOf
bec0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
bed0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
bee0: 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
bef0: 20 20 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74      int nPoslist
bf00: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
bf10: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
bf20: 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73 74  [iOff], nPoslist
bf30: 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  );.        iOff 
bf40: 2b 3d 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20  += nPoslist;.   
bf50: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
bf60: 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  iOff<n ){.      
bf70: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e    /* The next en
bf80: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75  try is on the cu
bf90: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
bfa0: 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74 61        u64 iDelta
bfb0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
bfc0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
bfd0: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44  nt(&a[iOff], &iD
bfe0: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70  elta);.        p
bff0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c000: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
c010: 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
c020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65  ){.          bNe
c030: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
c040: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e       if( iOff>=n
c050: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c060: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
c070: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
c080: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
c090: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
c0a0: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  4;.          }el
c0b0: 73 65 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73  se if( iOff!=fts
c0c0: 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 20 29  5GetU16(&a[2]) )
c0d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
c0e0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c0f0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
c100: 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  &a[iOff], nKeep)
c110: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c120: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c130: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
c140: 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
c150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
c170: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
c180: 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69   /* Next entry i
c190: 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72  s not on the cur
c1a0: 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20  rent page */.   
c1b0: 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66       while( iOff
c1c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c1d0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
c1e0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
c1f0: 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20            pLeaf 
c200: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a  = pIter->pLeaf;.
c210: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
c220: 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
c230: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 69            if( (i
c240: 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
c250: 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20  (&pLeaf->p[0])) 
c260: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
c270: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
c280: 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
c290: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
c2a0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
c2c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
c2d0: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20   iOff;.         
c2e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
c2f0: 65 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74  e if( (iOff = ft
c300: 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
c310: 3e 70 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 20  >p[2])) ){.     
c320: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
c330: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
c340: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 4e  ;.            bN
c350: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
c360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c370: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
c380: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
c390: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77   iterator is now
c3a0: 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20   at EOF. If so, 
c3b0: 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
c3c0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
c3d0: 2d 3e 70 4c 65 61 66 20 26 26 20 62 4e 65 77 54  ->pLeaf && bNewT
c3e0: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  erm ){.        i
c3f0: 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  f( pIter->flags 
c400: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
c410: 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20  NETERM ){.      
c420: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
c430: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
c440: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
c450: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
c460: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c470: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
c480: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
c490: 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Iter, nKeep);.  
c4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c4b0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c4c0: 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
c4d0: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
c4e0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
c4f0: 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69  rowid in a docli
c500: 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  st. This.** func
c510: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74  tion sets the it
c520: 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61  erator up so tha
c530: 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72 65  t iterates in re
c540: 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f  verse order thro
c550: 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69  ugh.** the docli
c560: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
c570: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
c580: 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 20  verse(Fts5Index 
c590: 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74  *p, int iIdx, Ft
c5a0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
c5b0: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
c5c0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
c5d0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
c5e0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 69  leaf data */.  i
c5f0: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
c600: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f  >iLeafOffset;  /
c610: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69  * Byte offset wi
c620: 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61  thin current lea
c630: 66 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  f */.  Fts5Data 
c640: 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e  *pLast = 0;.  in
c650: 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a  t pgnoLast = 0;.
c660: 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 6f 20 74 68  .  /* Move to th
c670: 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
c680: 61 69 6e 73 20 74 68 65 20 6c 61 73 74 20 72 6f  ains the last ro
c690: 77 69 64 20 69 6e 20 74 68 69 73 20 64 6f 63 6c  wid in this docl
c6a0: 69 73 74 2e 20 2a 2f 0a 20 20 70 4c 65 61 66 20  ist. */.  pLeaf 
c6b0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a  = pIter->pLeaf;.
c6c0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44  .  if( pIter->pD
c6d0: 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  lidx ){.    int 
c6e0: 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e  iSegid = pIter->
c6f0: 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
c700: 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 49 74    pgnoLast = pIt
c710: 65 72 2d 3e 70 44 6c 69 64 78 2d 3e 69 4c 65 61  er->pDlidx->iLea
c720: 66 50 67 6e 6f 3b 0a 20 20 20 20 70 4c 61 73 74  fPgno;.    pLast
c730: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
c740: 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
c750: 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65 67  ROWID(iIdx, iSeg
c760: 69 64 2c 20 30 2c 20 70 67 6e 6f 4c 61 73 74 29  id, 0, pgnoLast)
c770: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c780: 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61  while( iOff<pLea
c790: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  f->n ){.      in
c7a0: 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 36  t nPos;.      i6
c7b0: 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 20  4 iDelta;..     
c7c0: 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73   /* Position lis
c7d0: 74 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  t size in bytes 
c7e0: 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  */.      iOff +=
c7f0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c   getVarint32(&pL
c800: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 50  eaf->p[iOff], nP
c810: 6f 73 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  os);.      iOff 
c820: 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69  += nPos;.      i
c830: 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e  f( iOff>=pLeaf->
c840: 6e 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  n ) break;..    
c850: 20 20 2f 2a 20 52 6f 77 69 64 20 64 65 6c 74 61    /* Rowid delta
c860: 2e 20 4f 72 2c 20 69 66 20 30 78 30 30 2c 20 74  . Or, if 0x00, t
c870: 68 65 20 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73  he end of doclis
c880: 74 20 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20 20 20  t marker. */.   
c890: 20 20 20 6e 50 6f 73 20 3d 20 67 65 74 56 61 72     nPos = getVar
c8a0: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
c8b0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
c8c0: 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ta);.      if( i
c8d0: 44 65 6c 74 61 3d 3d 30 20 29 20 62 72 65 61 6b  Delta==0 ) break
c8e0: 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
c8f0: 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  nPos;.    }..   
c900: 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66   if( iOff>=pLeaf
c910: 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 46 74 73  ->n ){.      Fts
c920: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
c930: 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d  t *pSeg = pIter-
c940: 3e 70 53 65 67 3b 0a 20 20 20 20 20 20 69 36 34  >pSeg;.      i64
c950: 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47   iAbs = FTS5_SEG
c960: 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c  MENT_ROWID(iIdx,
c970: 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30   pSeg->iSegid, 0
c980: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
c990: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69  no);.      i64 i
c9a0: 4c 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d  Last = FTS5_SEGM
c9b0: 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20  ENT_ROWID(iIdx, 
c9c0: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c  pSeg->iSegid, 0,
c9d0: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29   pSeg->pgnoLast)
c9e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
c9f0: 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  last rowid in th
ca00: 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f  e doclist may no
ca10: 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72  t be on the curr
ca20: 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63 68  ent page. Search
ca30: 0a 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61  .       ** forwa
ca40: 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70  rd to find the p
ca50: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
ca60: 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20  he last rowid.  
ca70: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 41 62  */.      for(iAb
ca80: 73 2b 2b 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  s++; p->rc==SQLI
ca90: 54 45 5f 4f 4b 20 26 26 20 69 41 62 73 3c 3d 69  TE_OK && iAbs<=i
caa0: 4c 61 73 74 3b 20 69 41 62 73 2b 2b 29 7b 0a 20  Last; iAbs++){. 
cab0: 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20         Fts5Data 
cac0: 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61  *pNew = fts5Data
cad0: 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20  Read(p, iAbs);. 
cae0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
caf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
cb00: 20 69 52 6f 77 69 64 2c 20 69 54 65 72 6d 3b 0a   iRowid, iTerm;.
cb10: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 4c 65            fts5Le
cb20: 61 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26  afHeader(pNew, &
cb30: 69 52 6f 77 69 64 2c 20 26 69 54 65 72 6d 29 3b  iRowid, &iTerm);
cb40: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
cb50: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
cb60: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
cb70: 54 6d 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20  Tmp = pLast;.   
cb80: 20 20 20 20 20 20 20 20 20 70 4c 61 73 74 20 3d           pLast =
cb90: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
cba0: 20 20 20 70 4e 65 77 20 3d 20 70 54 6d 70 3b 0a     pNew = pTmp;.
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f              pgno
cbc0: 4c 61 73 74 20 3d 20 69 41 62 73 20 26 20 28 28  Last = iAbs & ((
cbd0: 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
cbe0: 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29  ATA_PAGE_B) - 1)
cbf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
cc00: 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
cc10: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  m ){.           
cc20: 20 69 41 62 73 20 3d 20 69 4c 61 73 74 3b 0a 20   iAbs = iLast;. 
cc30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
cc40: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
cc50: 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
cc60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cc70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
cc80: 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61   pLast is NULL a
cc90: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
cca0: 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69  en the last rowi
ccb0: 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69  d for this docli
ccc0: 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20  st.  ** lies on 
ccd0: 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
cce0: 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ly indicated by 
ccf0: 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e  the iterator. In
cd00: 20 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a   this case .  **
cd10: 20 69 4c 61 73 74 4f 66 66 20 69 73 20 73 65 74   iLastOff is set
cd20: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
cd30: 61 74 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  at pIter->iLeafO
cd40: 66 66 73 65 74 20 77 69 6c 6c 20 74 61 6b 65 20  ffset will take 
cd50: 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 69 74  when.  ** the it
cd60: 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
cd70: 20 74 68 61 74 20 72 6f 77 69 64 2e 0a 20 20 2a   that rowid..  *
cd80: 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c  *.  ** Or, if pL
cd90: 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ast is non-NULL,
cda0: 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
cdb0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
cdc0: 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a  ns the last.  **
cdd0: 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69   rowid..  */.  i
cde0: 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  f( pLast ){.    
cdf0: 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 66  int dummy;.    f
ce00: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
ce10: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
ce20: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
ce30: 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65   pLast;.    pIte
ce40: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  r->iLeafPgno = p
ce50: 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 66 74 73  gnoLast;.    fts
ce60: 35 4c 65 61 66 48 65 61 64 65 72 28 70 4c 61 73  5LeafHeader(pLas
ce70: 74 2c 20 26 69 4f 66 66 2c 20 26 64 75 6d 6d 79  t, &iOff, &dummy
ce80: 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  );.    iOff += g
ce90: 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d  etVarint(&pLast-
cea0: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
ceb0: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
cec0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
ced0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
cee0: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
cef0: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
cf00: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  e(p, pIter);.}..
cf10: 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
cf20: 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
cf30: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
cf40: 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f  st rowid of a do
cf50: 63 6c 69 73 74 20 77 69 74 68 69 6e 0a 2a 2a 20  clist within.** 
cf60: 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68 65 72  index iIdx. Ther
cf70: 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
cf80: 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
cf90: 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74  with the final t
cfa0: 65 72 6d 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  erm on.** the cu
cfb0: 72 72 65 6e 74 20 70 61 67 65 2e 20 49 66 20 74  rrent page. If t
cfc0: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
cfd0: 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  is the last term
cfe0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 0a 2a   on the page, .*
cff0: 2a 20 6c 6f 61 64 20 74 68 65 20 64 6f 63 6c 69  * load the docli
d000: 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69  st-index from di
d010: 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  sk and initializ
d020: 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74  e an iterator at
d030: 20 0a 2a 2a 20 28 70 49 74 65 72 2d 3e 70 44 6c   .** (pIter->pDl
d040: 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  idx)..*/.static 
d050: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d060: 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e  LoadDlidx(Fts5In
d070: 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78  dex *p, int iIdx
d080: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
d090: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65  Iter){.  int iSe
d0a0: 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  gid = pIter->pSe
d0b0: 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  g->iSegid;.  int
d0c0: 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e   bRev = (pIter->
d0d0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
d0e0: 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20  ITER_REVERSE);. 
d0f0: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
d100: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
d110: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66   /* Current leaf
d120: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69   data */.  int i
d130: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
d140: 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 42 79  afOffset;  /* By
d150: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
d160: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
d170: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
d180: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
d190: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
d1a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
d1b0: 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b  er->pDlidx==0 );
d1c0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
d1d0: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
d1e0: 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73  ist ends on this
d1f0: 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65   page. If it doe
d200: 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65  s, return.  ** e
d210: 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61  arly without loa
d220: 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74  ding the doclist
d230: 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62 65  -index (as it be
d240: 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65  longs to a diffe
d250: 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  rent.  ** term. 
d260: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  */.  while( iOff
d270: 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  <pLeaf->n ){.   
d280: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   i64 iDelta;.   
d290: 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 0a   int nPoslist;..
d2a0: 20 20 20 20 2f 2a 20 69 4f 66 66 20 69 73 20 63      /* iOff is c
d2b0: 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f 66 66  urrently the off
d2c0: 73 65 74 20 6f 66 20 74 68 65 20 73 69 7a 65 20  set of the size 
d2d0: 66 69 65 6c 64 20 6f 66 20 61 20 70 6f 73 69 74  field of a posit
d2e0: 69 6f 6e 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20  ion list. */.   
d2f0: 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69   iOff += getVari
d300: 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
d310: 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73 74 29 3b  Off], nPoslist);
d320: 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f  .    iOff += nPo
d330: 73 6c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20  slist;..    if( 
d340: 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b  iOff<pLeaf->n ){
d350: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
d360: 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
d370: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
d380: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
d390: 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20  if( iDelta==0 ) 
d3a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
d3b0: 7d 0a 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74  }..  fts5DlidxIt
d3c0: 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20  erInit(p, bRev, 
d3d0: 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 70 49  iIdx, iSegid, pI
d3e0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2c 20  ter->iLeafPgno, 
d3f0: 26 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b  &pIter->pDlidx);
d400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
d410: 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20  lize the object 
d420: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74  pIter to point t
d430: 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  o term pTerm/nTe
d440: 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e  rm within segmen
d450: 74 0a 2a 2a 20 70 53 65 67 2c 20 69 6e 64 65 78  t.** pSeg, index
d460: 20 69 49 64 78 2e 20 49 66 20 74 68 65 72 65 20   iIdx. If there 
d470: 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20  is no such term 
d480: 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  in the index, th
d490: 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73  e iterator.** is
d4a0: 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a   set to EOF..**.
d4b0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d4c0: 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
d4d0: 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
d4e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
d4f0: 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20  or code. If .** 
d500: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
d510: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
d520: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d530: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
d540: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
d550: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d560: 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20  gIterSeekInit(. 
d570: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
d5a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e        /* Config.
d5d0: 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66  aHash[] index of
d5e0: 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20   FTS index */.  
d5f0: 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
d600: 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
d610: 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
d620: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
d630: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
d640: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
d650: 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
d660: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
d670: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
d680: 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
d690: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
d6a0: 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
d6b0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
d6c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
d6d0: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
d6e0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67   */.){.  int iPg
d6f0: 20 3d 20 31 3b 0a 20 20 69 6e 74 20 68 3b 0a 20   = 1;.  int h;. 
d700: 20 69 6e 74 20 62 47 65 20 3d 20 28 28 66 6c 61   int bGe = ((fla
d710: 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
d720: 55 45 52 59 5f 50 52 45 46 49 58 29 20 26 26 20  UERY_PREFIX) && 
d730: 69 49 64 78 3d 3d 30 29 3b 0a 20 20 69 6e 74 20  iIdx==0);.  int 
d740: 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20 20  bDlidx = 0;     
d750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d760: 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20  rue if there is 
d770: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
d780: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47  */..  assert( bG
d790: 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  e==0 || (flags &
d7a0: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
d7b0: 5f 41 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73  _ASC)==0 );.  as
d7c0: 73 65 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e  sert( pTerm && n
d7d0: 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74  Term );.  memset
d7e0: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
d7f0: 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
d800: 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
d810: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20  ;.  pIter->iIdx 
d820: 3d 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 54 68  = iIdx;..  /* Th
d830: 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74  is block sets st
d840: 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67  ack variable iPg
d850: 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
d860: 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61  e number that ma
d870: 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74  y.  ** contain t
d880: 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  erm (pTerm/nTerm
d890: 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  ), if it is pres
d8a0: 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65  ent in the segme
d8b0: 6e 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 68 3d 70  nt. */.  for(h=p
d8c0: 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20  Seg->nHeight-1; 
d8d0: 68 3e 30 3b 20 68 2d 2d 29 7b 0a 20 20 20 20 46  h>0; h--){.    F
d8e0: 74 73 35 4e 6f 64 65 49 74 65 72 20 6e 6f 64 65  ts5NodeIter node
d8f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
d900: 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20  * For iterating 
d910: 74 68 72 6f 75 67 68 20 69 6e 74 65 72 6e 61 6c  through internal
d920: 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 20 20 69 36   nodes */.    i6
d930: 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
d940: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
d950: 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  dx, pSeg->iSegid
d960: 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20 20 20 46  , h, iPg);.    F
d970: 74 73 35 44 61 74 61 20 2a 70 4e 6f 64 65 20 3d  ts5Data *pNode =
d980: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
d990: 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66   iRowid);.    if
d9a0: 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65  ( pNode==0 ) bre
d9b0: 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f 64  ak;..    fts5Nod
d9c0: 65 49 74 65 72 49 6e 69 74 28 70 4e 6f 64 65 2d  eIterInit(pNode-
d9d0: 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26 6e  >p, pNode->n, &n
d9e0: 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ode);.    assert
d9f0: 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d 30  ( node.term.n==0
da00: 20 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20 6e   );..    iPg = n
da10: 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20  ode.iChild;.    
da20: 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44  bDlidx = node.bD
da30: 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72 28 66 74  lidx;.    for(ft
da40: 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
da50: 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20  p->rc, &node);. 
da60: 20 20 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74         node.aDat
da70: 61 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43  a && fts5BufferC
da80: 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65  ompareBlob(&node
da90: 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54  .term, pTerm, nT
daa0: 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20  erm)<=0;.       
dab0: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
dac0: 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29  t(&p->rc, &node)
dad0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50  .    ){.      iP
dae0: 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b  g = node.iChild;
daf0: 0a 20 20 20 20 20 20 62 44 6c 69 64 78 20 3d 20  .      bDlidx = 
db00: 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20  node.bDlidx;.   
db10: 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49   }.    fts5NodeI
db20: 74 65 72 46 72 65 65 28 26 6e 6f 64 65 29 3b 0a  terFree(&node);.
db30: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
db40: 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a  ase(pNode);.  }.
db50: 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d  .  if( iPg<pSeg-
db60: 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20  >pgnoFirst ){.  
db70: 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67    iPg = pSeg->pg
db80: 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c  noFirst;.    bDl
db90: 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  idx = 0;.  }..  
dba0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
dbb0: 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74   = iPg - 1;.  ft
dbc0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
dbd0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  e(p, pIter);..  
dbe0: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
dbf0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   ){.    int res;
dc00: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
dc10: 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
dc20: 74 55 31 36 28 26 70 49 74 65 72 2d 3e 70 4c 65  tU16(&pIter->pLe
dc30: 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 66  af->p[2]);.    f
dc40: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
dc50: 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  rm(p, pIter, 0);
dc60: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
dc70: 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
dc80: 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74  CompareBlob(&pIt
dc90: 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c  er->term, pTerm,
dca0: 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69   nTerm);.      i
dcb0: 66 28 20 72 65 73 3e 3d 30 20 29 20 62 72 65 61  f( res>=0 ) brea
dcc0: 6b 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  k;.      fts5Seg
dcd0: 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
dce0: 72 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  r);.    }while( 
dcf0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  pIter->pLeaf );.
dd00: 0a 20 20 20 20 69 66 28 20 62 47 65 3d 3d 30 20  .    if( bGe==0 
dd10: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  && res ){.      
dd20: 2f 2a 20 53 65 74 20 69 74 65 72 61 74 6f 72 20  /* Set iterator 
dd30: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20  to point to EOF 
dd40: 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  */.      fts5Dat
dd50: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
dd60: 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49  pLeaf);.      pI
dd70: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
dd80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
dd90: 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70   bGe==0 ){.    p
dda0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
ddb0: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
ddc0: 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74  ERM;.    if( pIt
ddd0: 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
dde0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
ddf0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 41  TS5INDEX_QUERY_A
de00: 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  SC ){.        pI
de10: 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
de20: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
de30: 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
de40: 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a    if( bDlidx ){.
de50: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
de60: 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20  terLoadDlidx(p, 
de70: 69 49 64 78 2c 20 70 49 74 65 72 29 3b 0a 20 20  iIdx, pIter);.  
de80: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
de90: 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
dea0: 58 5f 51 55 45 52 59 5f 41 53 43 20 29 7b 0a 20  X_QUERY_ASC ){. 
deb0: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
dec0: 65 72 52 65 76 65 72 73 65 28 70 2c 20 69 49 64  erReverse(p, iId
ded0: 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  x, pIter);.     
dee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
def0: 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69  /*.** Zero the i
df00: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
df10: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
df20: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
df30: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43  oid fts5SegIterC
df40: 6c 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72  lear(Fts5SegIter
df50: 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35   *pIter){.  fts5
df60: 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65  BufferFree(&pIte
df70: 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  r->term);.  fts5
df80: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
df90: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73  r->pLeaf);.  fts
dfa0: 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
dfb0: 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20  Iter->pDlidx);. 
dfc0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
dfd0: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
dfe0: 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  t);.  memset(pIt
dff0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
e000: 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a  s5SegIter));.}..
e010: 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d  /*.** Do the com
e020: 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72  parison necessar
e030: 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49  y to populate pI
e040: 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
e050: 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  ]..**.** If the 
e060: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
e070: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
e080: 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65 78   it is the index
e090: 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20   of an entry.** 
e0a0: 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53  in the pIter->aS
e0b0: 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20  eg[] array that 
e0c0: 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f  is (a) not at EO
e0d0: 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74  F, and (b) point
e0e0: 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20  ing.** to a key 
e0f0: 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69 63  that is a duplic
e100: 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20  ate of another, 
e110: 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c  higher priority,
e120: 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65   .** segment-ite
e130: 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65  rator in the pSe
e140: 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e  g->aSeg[] array.
e150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
e160: 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
e170: 6d 70 61 72 65 28 46 74 73 35 4d 75 6c 74 69 53  mpare(Fts5MultiS
e180: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
e190: 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20  nt iOut){.  int 
e1a0: 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i1;             
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e1c0: 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e  ndex of left-han
e1d0: 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
e1e0: 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20  .  int i2;      
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
e210: 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
e220: 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  gIter */.  int i
e230: 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74  Res;.  Fts5SegIt
e240: 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20  er *p1;         
e250: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
e260: 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
e270: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
e280: 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20 20   *p2;           
e290: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61       /* Right-ha
e2a0: 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
e2b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75  /..  assert( iOu
e2c0: 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26  t<pIter->nSeg &&
e2d0: 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73   iOut>0 );.  ass
e2e0: 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76  ert( pIter->bRev
e2f0: 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52  ==0 || pIter->bR
e300: 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ev==1 );..  if( 
e310: 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53  iOut>=(pIter->nS
e320: 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20  eg/2) ){.    i1 
e330: 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d  = (iOut - pIter-
e340: 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20  >nSeg/2) * 2;.  
e350: 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20    i2 = i1 + 1;. 
e360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d   }else{.    i1 =
e370: 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
e380: 4f 75 74 2a 32 5d 3b 0a 20 20 20 20 69 32 20 3d  Out*2];.    i2 =
e390: 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
e3a0: 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a 20 20  Out*2+1];.  }.  
e3b0: 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
e3c0: 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70  g[i1];.  p2 = &p
e3d0: 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a  Iter->aSeg[i2];.
e3e0: 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66  .  if( p1->pLeaf
e3f0: 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
e400: 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74 20   /* If p1 is at 
e410: 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20  EOF */.    iRes 
e420: 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = i2;.  }else if
e430: 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
e440: 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20 69  {     /* If p2 i
e450: 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20  s at EOF */.    
e460: 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c  iRes = i1;.  }el
e470: 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20  se{.    int res 
e480: 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
e490: 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26  are(&p1->term, &
e4a0: 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69  p2->term);.    i
e4b0: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
e4c0: 20 20 20 61 73 73 65 72 74 28 20 69 32 3e 69 31     assert( i2>i1
e4d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e4e0: 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( i2!=0 );.     
e4f0: 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d   if( p1->iRowid=
e500: 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 20 72 65  =p2->iRowid ) re
e510: 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 72  turn i2;.      r
e520: 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69  es = ((p1->iRowi
e530: 64 20 3c 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d  d < p2->iRowid)=
e540: 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20  =pIter->bRev) ? 
e550: 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  -1 : +1;.    }. 
e560: 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d     assert( res!=
e570: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  0 );.    if( res
e580: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73  <0 ){.      iRes
e590: 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = i1;.    }else
e5a0: 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
e5b0: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
e5c0: 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
e5d0: 75 74 5d 20 3d 20 69 52 65 73 3b 0a 20 20 72 65  ut] = iRes;.  re
e5e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
e5f0: 20 46 72 65 65 20 74 68 65 20 69 74 65 72 61 74   Free the iterat
e600: 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  or object passed
e610: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
e620: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
e630: 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
e640: 69 49 74 65 72 46 72 65 65 28 46 74 73 35 49 6e  iIterFree(Fts5In
e650: 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74  dex *p, Fts5Mult
e660: 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  iSegIter *pIter)
e670: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
e680: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
e690: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
e6a0: 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
e6b0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43      fts5SegIterC
e6c0: 6c 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65  lear(&pIter->aSe
e6d0: 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[i]);.    }.   
e6e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
e6f0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
e700: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
e710: 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a  tiIterAdvanced(.
e720: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
e750: 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
e760: 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c  hin */.  Fts5Mul
e770: 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
e780: 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72  ,        /* Iter
e790: 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61  ator to update a
e7a0: 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f  First[] array fo
e7b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e  r */.  int iChan
e7c0: 67 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ged,            
e7d0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
e7e0: 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20  of sub-iterator 
e7f0: 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f  just advanced */
e800: 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20  .  int iMinset  
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e     /* Minimum en
e830: 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20  try in aFirst[] 
e840: 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69  to set */.){.  i
e850: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70  nt i;.  for(i=(p
e860: 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e  Iter->nSeg+iChan
e870: 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73  ged)/2; i>=iMins
e880: 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  et && p->rc==SQL
e890: 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a  ITE_OK; i=i/2){.
e8a0: 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
e8b0: 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35   if( (iEq = fts5
e8c0: 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
e8d0: 72 65 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b  re(pIter, i)) ){
e8e0: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
e8f0: 65 72 4e 65 78 74 28 70 2c 20 26 70 49 74 65 72  erNext(p, &pIter
e900: 2d 3e 61 53 65 67 5b 69 45 71 5d 29 3b 0a 20 20  ->aSeg[iEq]);.  
e910: 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e      i = pIter->n
e920: 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d  Seg + iEq;.    }
e930: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  .  }.}../*.** Mo
e940: 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72 20  ve the seg-iter 
e950: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
e960: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
e970: 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65  owid on page iLe
e980: 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73  afPgno..** It is
e990: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61   an error if lea
e9a0: 66 20 69 4c 65 61 66 50 67 6e 6f 20 63 6f 6e 74  f iLeafPgno cont
e9b0: 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 2e 0a 2a  ains no rowid..*
e9c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e9d0: 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
e9e0: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
e9f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
ea00: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
ea10: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
ea20: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
ea30: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
ea40: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
ea50: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
ea60: 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20   iLeafPgno.){.  
ea70: 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e  assert( iLeafPgn
ea80: 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
ea90: 6e 6f 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  no );.  if( p->r
eaa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
eab0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
eac0: 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f  Pgno = iLeafPgno
ead0: 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  -1;.    fts5SegI
eae0: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
eaf0: 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
eb00: 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
eb10: 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c  _OK || pIter->iL
eb20: 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67  eafPgno==iLeafPg
eb30: 6e 6f 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  no );.  }..  if(
eb40: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
eb50: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  K ){.    int iOf
eb60: 66 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  f;.    u8 *a = p
eb70: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
eb80: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65      int n = pIte
eb90: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20  r->pLeaf->n;..  
eba0: 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74    iOff = fts5Get
ebb0: 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20  U16(&a[0]);.    
ebc0: 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f  if( iOff<4 || iO
ebd0: 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 70  ff>=n ){.      p
ebe0: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
ebf0: 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UPT;.    }else{.
ec00: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65        iOff += ge
ec10: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
ec20: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
ec30: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70  iRowid);.      p
ec40: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ec50: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 0a  t = iOff;.    }.
ec60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
ec70: 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
ec80: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
ec90: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
eca0: 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f  until it is at o
ecb0: 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64  r .** past rowid
ecc0: 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65   iFrom. Regardle
ecd0: 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
ece0: 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74  of iFrom, the it
ecf0: 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77  erator is.** alw
ed00: 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74 20  ays advanced at 
ed10: 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73  least once..*/.s
ed20: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ed30: 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a  egIterNextFrom(.
ed40: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
ed70: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
ed80: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
ed90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
eda0: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
edb0: 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d  ance */.  i64 iM
edc0: 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  atch            
edd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
ede0: 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61 74  ance iterator at
edf0: 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72 20   least this far 
ee00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76  */.){.  int bRev
ee10: 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73   = (pIter->flags
ee20: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
ee30: 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35  REVERSE);.  Fts5
ee40: 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
ee50: 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  x = pIter->pDlid
ee60: 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  x;.  int iLeafPg
ee70: 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
ee80: 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f  fPgno;.  int bMo
ee90: 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72  ve = 1;..  asser
eea0: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
eeb0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
eec0: 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
eed0: 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
eee0: 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x );.  assert( p
eef0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a  Iter->pLeaf );..
ef00: 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b    if( bRev==0 ){
ef10: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
ef20: 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
ef30: 70 44 6c 69 64 78 29 3d 3d 30 20 26 26 20 69 4d  pDlidx)==0 && iM
ef40: 61 74 63 68 3c 70 44 6c 69 64 78 2d 3e 69 52 6f  atch<pDlidx->iRo
ef50: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 65  wid ){.      iLe
ef60: 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d  afPgno = pDlidx-
ef70: 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20  >iLeafPgno;.    
ef80: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
ef90: 65 78 74 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ext(pDlidx);.   
efa0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
efb0: 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d  LeafPgno>=pIter-
efc0: 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d  >iLeafPgno || p-
efd0: 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20 69  >rc );.    if( i
efe0: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
eff0: 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
f000: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 47 6f     fts5SegIterGo
f010: 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72 2c  toPage(p, pIter,
f020: 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20   iLeafPgno);.   
f030: 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20     bMove = 0;.  
f040: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
f050: 20 61 73 73 65 72 74 28 20 69 4d 61 74 63 68 3e   assert( iMatch>
f060: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b  pIter->iRowid );
f070: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
f080: 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
f090: 70 44 6c 69 64 78 29 3d 3d 30 20 26 26 20 69 4d  pDlidx)==0 && iM
f0a0: 61 74 63 68 3e 70 44 6c 69 64 78 2d 3e 69 52 6f  atch>pDlidx->iRo
f0b0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 66 74 73  wid ){.      fts
f0c0: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
f0d0: 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20  Dlidx);.    }.  
f0e0: 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 44    iLeafPgno = pD
f0f0: 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  lidx->iLeafPgno;
f100: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74  ..    assert( ft
f110: 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
f120: 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65  , pDlidx) || iLe
f130: 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69  afPgno<=pIter->i
f140: 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20  LeafPgno );..   
f150: 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70   if( iLeafPgno<p
f160: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
f170: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
f180: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61  iLeafPgno = iLea
f190: 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66  fPgno+1;.      f
f1a0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
f1b0: 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65  eNewPage(p, pIte
f1c0: 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20  r);.      bMove 
f1d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
f1e0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
f1f0: 20 20 69 66 28 20 62 4d 6f 76 65 20 29 20 66 74    if( bMove ) ft
f200: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
f210: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28   pIter);.    if(
f220: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
f230: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
f240: 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74  ( bRev==0 && pIt
f250: 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74  er->iRowid<=iMat
f260: 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
f270: 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70  if( bRev!=0 && p
f280: 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d  Iter->iRowid>=iM
f290: 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
f2a0: 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d    bMove = 1;.  }
f2b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
f2c0: 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
f2d0: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a  he next entry. .
f2e0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
f2f0: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
f300: 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
f310: 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e  in Fts5Index.rc.
f320: 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63   It is not .** c
f330: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
f340: 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
f350: 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20  or reaches EOF, 
f360: 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  or if it is alre
f370: 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77  ady at .** EOF w
f380: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
f390: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
f3a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
f3b0: 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20  MultiIterNext(. 
f3c0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
f3d0: 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
f3e0: 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74  er *pIter,.  int
f3f0: 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   bFrom,         
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f410: 54 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74  True if argument
f420: 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20   iFrom is valid 
f430: 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20  */.  i64 iFrom  
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20       /* Advance 
f460: 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20  at least as far 
f470: 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20  as this */.){.  
f480: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
f490: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
f4a0: 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e  iFirst = pIter->
f4b0: 61 46 69 72 73 74 5b 31 5d 3b 0a 20 20 20 20 46  aFirst[1];.    F
f4c0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
f4d0: 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
f4e0: 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 69 66 28  iFirst];.    if(
f4f0: 20 62 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e   bFrom && pSeg->
f500: 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  pDlidx ){.      
f510: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
f520: 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72  rom(p, pSeg, iFr
f530: 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  om);.    }else{.
f540: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
f550: 72 4e 65 78 74 28 70 2c 20 70 53 65 67 29 3b 0a  rNext(p, pSeg);.
f560: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75      }.    fts5Mu
f570: 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
f580: 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
f590: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
f5a0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
f5b0: 77 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  w Fts5MultiSegIt
f5c0: 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  er object..**.**
f5d0: 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
f5e0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
f5f0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
f600: 64 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72  data in structur
f610: 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66  e pStruct..** If
f620: 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20   iLevel is -ve, 
f630: 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e  then all data in
f640: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73   all segments is
f650: 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20   merged. Or, if 
f660: 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72  iLevel.** is zer
f670: 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61  o or greater, da
f680: 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  ta from the firs
f690: 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65  t nSegment segme
f6a0: 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65  nts on level iLe
f6b0: 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64  vel.** is merged
f6c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ..**.** The iter
f6d0: 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70  ator initially p
f6e0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
f6f0: 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e  st term/rowid en
f700: 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69  try in the .** i
f710: 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f  terated data..*/
f720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
f730: 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20  5MultiIterNew(. 
f740: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
f770: 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
f780: 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  in */.  Fts5Stru
f790: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20  cture *pStruct, 
f7a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63          /* Struc
f7b0: 74 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63  ture of specific
f7c0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
f7d0: 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
f7f0: 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e  onfig.aHash[] in
f800: 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78  dex of FTS index
f810: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
f840: 72 20 3e 3d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  r >= */.  const 
f850: 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
f860: 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
f870: 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72  m to seek to (or
f880: 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e   NULL/0) */.  in
f890: 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f8b0: 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74   Level to iterat
f8c0: 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a  e (-1 for all) *
f8d0: 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  /.  int nSegment
f8e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f8f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f900: 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
f910: 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a  ge (iLevel>=0) *
f920: 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  /.  Fts5MultiSeg
f930: 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20  Iter **ppOut    
f940: 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
f950: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53  t */.){.  int nS
f960: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
f970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f980: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
f990: 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  merged */.  int 
f9a0: 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f9c0: 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e  ower of two >= n
f9d0: 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74  Seg */.  int iIt
f9e0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
f9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20           /* */. 
fa00: 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20   int iSeg;      
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
fa30: 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d  ate through segm
fa40: 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 74  ents */.  Fts5St
fa50: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
fa60: 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  vl;.  Fts5MultiS
fa70: 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20  egIter *pNew;.. 
fa80: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d   assert( (pTerm=
fa90: 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20  =0 && nTerm==0) 
faa0: 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a  || iLevel<0 );..
fab0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
fac0: 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
fad0: 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74  multi-seg-iterat
fae0: 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65  or. */.  if( iLe
faf0: 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 6e 53 65  vel<0 ){.    nSe
fb00: 67 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  g = fts5Structur
fb10: 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70  eCountSegments(p
fb20: 53 74 72 75 63 74 29 3b 0a 20 20 7d 65 6c 73 65  Struct);.  }else
fb30: 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e  {.    nSeg = MIN
fb40: 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
fb50: 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e  [iLevel].nSeg, n
fb60: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  Segment);.  }.  
fb70: 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c  for(nSlot=2; nSl
fb80: 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e  ot<nSeg; nSlot=n
fb90: 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70 70 4f 75  Slot*2);.  *ppOu
fba0: 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35 49  t = pNew = fts5I
fbb0: 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20  dxMalloc(p, .   
fbc0: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 4d 75     sizeof(Fts5Mu
fbd0: 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20 20 20  ltiSegIter) +   
fbe0: 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a         /* pNew *
fbf0: 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
fc00: 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 6e 53  ts5SegIter) * nS
fc10: 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a 20 70  lot +       /* p
fc20: 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20  New->aSeg[] */. 
fc30: 20 20 20 20 20 73 69 7a 65 6f 66 28 75 31 36 29       sizeof(u16)
fc40: 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20   * nSlot        
fc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
fc60: 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20  ->aFirst[] */.  
fc70: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
fc80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65   ) return;.  pNe
fc90: 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b  w->nSeg = nSlot;
fca0: 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20 3d 20  .  pNew->aSeg = 
fcb0: 28 46 74 73 35 53 65 67 49 74 65 72 2a 29 26 70  (Fts5SegIter*)&p
fcc0: 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d 3e  New[1];.  pNew->
fcd0: 61 46 69 72 73 74 20 3d 20 28 75 31 36 2a 29 26  aFirst = (u16*)&
fce0: 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74  pNew->aSeg[nSlot
fcf0: 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20  ];.  pNew->bRev 
fd00: 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46  = (0!=(flags & F
fd10: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 41  TS5INDEX_QUERY_A
fd20: 53 43 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  SC));..  /* Init
fd30: 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74  ialize each of t
fd40: 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67  he component seg
fd50: 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20  ment iterators. 
fd60: 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c  */.  if( iLevel<
fd70: 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
fd80: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e  uctureLevel *pEn
fd90: 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  d = &pStruct->aL
fda0: 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c  evel[pStruct->nL
fdb0: 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 70  evel];.    for(p
fdc0: 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c  Lvl=&pStruct->aL
fdd0: 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45  evel[0]; pLvl<pE
fde0: 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20  nd; pLvl++){.   
fdf0: 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c     for(iSeg=pLvl
fe00: 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  ->nSeg-1; iSeg>=
fe10: 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
fe20: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
fe30: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
fe40: 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
fe50: 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  g];.        Fts5
fe60: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
fe70: 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
fe80: 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 69  er++];.        i
fe90: 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
fea0: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
feb0: 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78  IterInit(p, iIdx
fec0: 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
fed0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fee0: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
fef0: 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20  IterSeekInit(p, 
ff00: 69 49 64 78 2c 20 70 54 65 72 6d 2c 20 6e 54 65  iIdx, pTerm, nTe
ff10: 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
ff20: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
ff30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ff40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
ff50: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
ff60: 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20  Level[iLevel];. 
ff70: 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67     for(iSeg=nSeg
ff80: 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
ff90: 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35  g--){.      fts5
ffa0: 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69  SegIterInit(p, i
ffb0: 49 64 78 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Idx, &pLvl->aSeg
ffc0: 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61  [iSeg], &pNew->a
ffd0: 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20  Seg[iIter++]);. 
ffe0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
fff0: 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29  t( iIter==nSeg )
10000 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  ;..  /* If the a
10010 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73  bove was success
10020 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  ful, each compon
10030 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f  ent iterators no
10040 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74  w points .  ** t
10050 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
10060 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74  y in its segment
10070 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
10080 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20  nitialize the . 
10090 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72   ** aFirst[] arr
100a0 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ay. Or, if an er
100b0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
100c0 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61  , free the itera
100d0 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  tor.  ** object 
100e0 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70  and set the outp
100f0 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
10100 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
10110 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10120 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72  ){.    for(iIter
10130 3d 6e 53 6c 6f 74 2d 31 3b 20 69 49 74 65 72 3e  =nSlot-1; iIter>
10140 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20  0; iIter--){.   
10150 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20     int iEq;.    
10160 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
10170 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
10180 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29  are(pNew, iIter)
10190 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ) ){.        fts
101a0 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
101b0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d  &pNew->aSeg[iEq]
101c0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
101d0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
101e0 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69  (p, pNew, iEq, i
101f0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
10200 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
10210 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
10220 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ree(p, pNew);.  
10230 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20    *ppOut = 0;.  
10240 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
10250 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
10260 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46  erator is at EOF
10270 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
10280 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a  has occurred. .*
10290 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73  * False otherwis
102a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
102b0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
102c0 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  f(Fts5Index *p, 
102d0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
102e0 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
102f0 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74  rn (p->rc || pIt
10300 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
10310 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 70 4c 65  >aFirst[1] ].pLe
10320 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  af==0);.}../*.**
10330 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
10340 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
10350 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
10360 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
10370 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
10380 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
10390 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
103a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
103b0 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
103c0 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
103d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
103e0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
103f0 69 64 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49  id(Fts5MultiSegI
10400 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61  ter *pIter){.  a
10410 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53  ssert( pIter->aS
10420 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
10430 74 5b 31 5d 20 5d 2e 70 4c 65 61 66 20 29 3b 0a  t[1] ].pLeaf );.
10440 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
10450 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
10460 72 73 74 5b 31 5d 20 5d 2e 69 52 6f 77 69 64 3b  rst[1] ].iRowid;
10470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
10480 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
10490 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74  he next entry at
104a0 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d   or following iM
104b0 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  atch..*/.static 
104c0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
104d0 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
104e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
104f0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
10500 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69  *pIter, .  i64 i
10510 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65  Match.){.  while
10520 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ( 1 ){.    i64 i
10530 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d  Rowid;.    fts5M
10540 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
10550 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68  pIter, 1, iMatch
10560 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d  );.    if( fts5M
10570 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
10580 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20  Iter) ) break;. 
10590 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35     iRowid = fts5
105a0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
105b0 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
105c0 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26  Iter->bRev==0 &&
105d0 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
105e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
105f0 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20   pIter->bRev!=0 
10600 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  && iRowid>=iMatc
10610 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d  h ) break;.  }.}
10620 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
10630 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
10640 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
10650 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61  the term associa
10660 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  ted with the .**
10670 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
10680 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
10690 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  ly points to..*/
106a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
106b0 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54   *fts5MultiIterT
106c0 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53 65 67  erm(Fts5MultiSeg
106d0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
106e0 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67   *pn){.  Fts5Seg
106f0 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72  Iter *p = &pIter
10700 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
10710 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20 2a 70  First[1] ];.  *p
10720 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20  n = p->term.n;. 
10730 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e   return p->term.
10740 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
10750 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63  rn true if the c
10760 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 70 61  hunk iterator pa
10770 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
10780 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a  nd argument is.*
10790 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20  * at EOF. Or if 
107a0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
107b0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f  eady occurred. O
107c0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
107d0 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
107e0 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e 6b 49  c int fts5ChunkI
107f0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
10800 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b 49 74   *p, Fts5ChunkIt
10810 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
10820 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
10830 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 3b  Iter->pLeaf==0);
10840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
10850 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74 65 72  e the chunk-iter
10860 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
10870 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61 20 74   chunk of data t
10880 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69  o read..*/.stati
10890 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
108a0 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
108b0 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b  ex *p, Fts5Chunk
108c0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
108d0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 6e  assert( pIter->n
108e0 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20 29 3b  Rem>=pIter->n );
108f0 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20 2d  .  pIter->nRem -
10900 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20 66 74  = pIter->n;.  ft
10910 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
10920 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
10930 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
10940 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 30 3b  .  pIter->p = 0;
10950 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 52  .  if( pIter->nR
10960 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  em>0 ){.    Fts5
10970 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
10980 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
10990 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66 20  id++;.    pLeaf 
109a0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d  = pIter->pLeaf =
109b0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
109c0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
109d0 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  id);.    if( pLe
109e0 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  af ){.      pIte
109f0 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74 65 72  r->n = MIN(pIter
10a00 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d 3e 6e  ->nRem, pLeaf->n
10a10 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  -4);.      pIter
10a20 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 2b 34  ->p = pLeaf->p+4
10a30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
10a40 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65 20 74  *.** Intialize t
10a50 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f  he chunk iterato
10a60 72 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 6f  r to read the po
10a70 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61  sition list data
10a80 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a 20 74   for which .** t
10a90 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 69 73  he size field is
10aa0 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66 20   at offset iOff 
10ab0 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e 20 0a  of leaf pLeaf. .
10ac0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10ad0 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74  ts5ChunkIterInit
10ae0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
10af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10b00 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
10b10 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
10b20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
10b30 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
10b40 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65 72 61  /* Segment itera
10b50 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73 6c  tor to read posl
10b60 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74  ist from */.  Ft
10b70 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
10b80 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er            /*
10b90 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
10ba0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
10bb0 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e  int iId = pSeg->
10bc0 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
10bd0 69 36 34 20 72 6f 77 69 64 20 3d 20 46 54 53 35  i64 rowid = FTS5
10be0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
10bf0 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20  Seg->iIdx, iId, 
10c00 30 2c 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67  0, pSeg->iLeafPg
10c10 6e 6f 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20  no);.  Fts5Data 
10c20 2a 70 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  *pLeaf = pSeg->p
10c30 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Leaf;.  int iOff
10c40 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66   = pSeg->iLeafOf
10c50 66 73 65 74 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  fset;..  memset(
10c60 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
10c70 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
10c80 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 20 3d  er->iLeafRowid =
10c90 20 72 6f 77 69 64 3b 0a 20 20 69 66 28 20 69 4f   rowid;.  if( iO
10ca0 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  ff<pLeaf->n ){. 
10cb0 20 20 20 66 74 73 35 44 61 74 61 52 65 66 65 72     fts5DataRefer
10cc0 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ence(pLeaf);.   
10cd0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
10ce0 70 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeaf;.  }else{.
10cf0 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20      pIter->nRem 
10d00 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 43 68 75  = 1;.    fts5Chu
10d10 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  nkIterNext(p, pI
10d20 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ter);.    if( p-
10d30 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
10d40 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20    iOff = 4;.    
10d50 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
10d60 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 69 4f 66  Leaf;.  }..  iOf
10d70 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
10d80 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
10d90 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b 0a  , pIter->nRem);.
10da0 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e    pIter->n = MIN
10db0 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f 66 66  (pLeaf->n - iOff
10dc0 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b 0a  , pIter->nRem);.
10dd0 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 4c 65    pIter->p = pLe
10de0 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a 0a 20  af->p + iOff;.. 
10df0 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d 3d 30   if( pIter->n==0
10e00 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68 75 6e   ){.    fts5Chun
10e10 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  kIterNext(p, pIt
10e20 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
10e30 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e  ic void fts5Chun
10e40 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46 74 73  kIterRelease(Fts
10e50 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65  5ChunkIter *pIte
10e60 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61 52 65  r){.  fts5DataRe
10e70 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
10e80 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c  af);.  pIter->pL
10e90 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eaf = 0;.}../*.*
10ea0 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74 75 72  * Read and retur
10eb0 6e 20 74 68 65 20 6e 65 78 74 20 33 32 2d 62 69  n the next 32-bi
10ec0 74 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 74 68  t varint from th
10ed0 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
10ee0 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70 61 73  iterator .** pas
10ef0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
10f00 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
10f10 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
10f20 63 75 72 73 2c 20 7a 65 72 6f 20 69 73 20 72 65  curs, zero is re
10f30 74 75 72 6e 65 64 20 61 6e 20 61 6e 20 65 72 72  turned an an err
10f40 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20  or code left in 
10f50 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 2e 72 63  .** Fts5Index.rc
10f60 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
10f70 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
10f80 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
10f90 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
10fa0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
10fb0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
10fc0 20 66 74 73 35 50 6f 73 49 74 65 72 52 65 61 64   fts5PosIterRead
10fd0 56 61 72 69 6e 74 28 46 74 73 35 49 6e 64 65 78  Varint(Fts5Index
10fe0 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74 65 72   *p, Fts5PosIter
10ff0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
11000 69 56 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  iVal = 0;.  if( 
11010 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11020 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65   ){.    if( pIte
11030 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  r->iOff>=pIter->
11040 63 68 75 6e 6b 2e 6e 20 29 7b 0a 20 20 20 20 20  chunk.n ){.     
11050 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65   fts5ChunkIterNe
11060 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68  xt(p, &pIter->ch
11070 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unk);.      if( 
11080 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
11090 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e  (p, &pIter->chun
110a0 6b 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  k) ) return 0;. 
110b0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66       pIter->iOff
110c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
110d0 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67  pIter->iOff += g
110e0 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
110f0 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74 65 72  r->chunk.p[pIter
11100 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a  ->iOff], iVal);.
11110 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 56 61    }.  return iVa
11120 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  l;.}../*.** Adva
11130 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  nce the position
11140 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72 20 74   list iterator t
11150 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
11160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11170 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74   fts5PosIterNext
11180 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
11190 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74 65  ts5PosIter *pIte
111a0 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a  r){.  int iVal;.
111b0 20 20 61 73 73 65 72 74 28 20 66 74 73 35 43 68    assert( fts5Ch
111c0 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70  unkIterEof(p, &p
111d0 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30 20  Iter->chunk)==0 
111e0 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74 73 35  );.  iVal = fts5
111f0 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e  PosIterReadVarin
11200 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 69  t(p, pIter);.  i
11210 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  f( fts5ChunkIter
11220 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63  Eof(p, &pIter->c
11230 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hunk)==0 ){.    
11240 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20  if( iVal==1 ){. 
11250 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43 6f 6c       pIter->iCol
11260 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52 65   = fts5PosIterRe
11270 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74 65  adVarint(p, pIte
11280 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  r);.      pIter-
11290 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f 73 49  >iPos = fts5PosI
112a0 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 70 2c  terReadVarint(p,
112b0 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20 20 20   pIter) - 2;.   
112c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
112d0 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 69 56  ter->iPos += (iV
112e0 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d 0a 20  al - 2);.    }. 
112f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
11300 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73 35 50  ialize the Fts5P
11310 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20 70 61  osIter object pa
11320 73 73 65 64 20 61 73 20 74 68 65 20 66 69 6e 61  ssed as the fina
11330 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  l argument to it
11340 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
11350 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
11360 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  st associated wi
11370 74 68 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  th the index ent
11380 72 79 20 74 68 61 74 20 69 74 65 72 61 74 6f 72  ry that iterator
11390 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75 72 72   .** pMulti curr
113a0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
113b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
113c0 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74 28  fts5PosIterInit(
113d0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
11400 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
11410 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
11420 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20 20 2f  *pMulti,       /
11430 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74 65 72  * Multi-seg iter
11440 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73  ator to read pos
11450 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  -list from */.  
11460 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74  Fts5PosIter *pIt
11470 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
11480 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
11490 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
114a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
114b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
114c0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
114d0 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
114e0 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
114f0 31 5d 20 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  1] ];.    memset
11500 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
11510 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20  f(*pIter));.    
11520 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69  fts5ChunkIterIni
11530 74 28 70 2c 20 70 53 65 67 2c 20 26 70 49 74 65  t(p, pSeg, &pIte
11540 72 2d 3e 63 68 75 6e 6b 29 3b 0a 20 20 20 20 69  r->chunk);.    i
11550 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  f( fts5ChunkIter
11560 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63  Eof(p, &pIter->c
11570 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hunk)==0 ){.    
11580 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78    fts5PosIterNex
11590 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
115a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
115b0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
115c0 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 65 72  he position iter
115d0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
115e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
115f0 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f 46 2e  nt is.** at EOF.
11600 20 4f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   Or if an error 
11610 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
11620 72 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rred. Otherwise,
11630 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a   return false..*
11640 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
11650 35 50 6f 73 49 74 65 72 45 6f 66 28 46 74 73 35  5PosIterEof(Fts5
11660 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 50 6f  Index *p, Fts5Po
11670 73 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  sIter *pIter){. 
11680 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c   return (p->rc |
11690 7c 20 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e 70  | pIter->chunk.p
116a0 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Leaf==0);.}.../*
116b0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d  .** Allocate mem
116c0 6f 72 79 2e 20 54 68 65 20 64 69 66 66 65 72 65  ory. The differe
116d0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
116e0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 66 74   function and ft
116f0 73 35 49 64 78 4d 61 6c 6c 6f 63 28 29 0a 2a 2a  s5IdxMalloc().**
11700 20 69 73 20 74 68 61 74 20 74 68 69 73 20 69 6e   is that this in
11710 63 72 65 6d 65 6e 74 73 20 74 68 65 20 46 74 73  crements the Fts
11720 35 49 6e 64 65 78 2e 6e 50 65 6e 64 69 6e 67 44  5Index.nPendingD
11730 61 74 61 20 76 61 72 69 61 62 6c 65 20 62 79 20  ata variable by 
11740 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
11750 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
11760 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75  . It should be u
11770 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 6c 6c 6f  sed for all allo
11780 63 61 74 69 6f 6e 73 20 75 73 65 64 0a 2a 2a 20  cations used.** 
11790 74 6f 20 73 74 6f 72 65 20 70 65 6e 64 69 6e 67  to store pending
117a0 2d 64 61 74 61 20 77 69 74 68 69 6e 20 74 68 65  -data within the
117b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
117c0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
117d0 63 20 76 6f 69 64 20 2a 66 74 73 35 50 65 6e 64  c void *fts5Pend
117e0 69 6e 67 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e  ingMalloc(Fts5In
117f0 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  dex *p, int nByt
11800 65 29 7b 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e  e){.  p->nPendin
11810 67 44 61 74 61 20 2b 3d 20 6e 42 79 74 65 3b 0a  gData += nByte;.
11820 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 64 78    return fts5Idx
11830 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
11840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
11850 6e 20 65 6e 74 72 79 20 66 6f 72 20 28 69 52 6f  n entry for (iRo
11860 77 69 64 2f 69 43 6f 6c 2f 69 50 6f 73 29 20 74  wid/iCol/iPos) t
11870 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  o the doclist fo
11880 72 20 28 70 54 6f 6b 65 6e 2f 6e 54 6f 6b 65 6e  r (pToken/nToken
11890 29 0a 2a 2a 20 69 6e 20 68 61 73 68 20 74 61 62  ).** in hash tab
118a0 6c 65 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64  le for index iId
118b0 78 2e 20 49 66 20 69 49 64 78 20 69 73 20 7a 65  x. If iIdx is ze
118c0 72 6f 2c 20 74 68 69 73 20 69 73 20 74 68 65 20  ro, this is the 
118d0 6d 61 69 6e 20 74 65 72 6d 73 20 0a 2a 2a 20 69  main terms .** i
118e0 6e 64 65 78 2e 20 56 61 6c 75 65 73 20 6f 66 20  ndex. Values of 
118f0 31 20 61 6e 64 20 67 72 65 61 74 65 72 20 66 6f  1 and greater fo
11900 72 20 69 49 64 78 20 61 72 65 20 70 72 65 66 69  r iIdx are prefi
11910 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a 2a 2a  x indexes..**.**
11920 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
11930 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
11940 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
11950 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
11960 20 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79   .** accordingly
11970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11980 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48 61   fts5AddTermToHa
11990 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  sh(.  Fts5Index 
119a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
119b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
119c0 62 6a 65 63 74 20 74 6f 20 77 72 69 74 65 20 74  bject to write t
119d0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  o */.  int iIdx,
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72 79 20         /* Entry 
11a00 69 6e 20 70 2d 3e 61 48 61 73 68 5b 5d 20 74 6f  in p->aHash[] to
11a10 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 69 6e 74   update */.  int
11a20 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a40 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
11a50 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
11a60 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
11a70 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a90 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
11aa0 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
11ab0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11ac0 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
11ad0 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
11ae0 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
11af0 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
11b00 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  */.){.  Fts5Conf
11b10 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
11b20 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 33  >pConfig;.  Fts3
11b30 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 46  Hash *pHash;.  F
11b40 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
11b50 74 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 46  t *pDoclist;.  F
11b60 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73  ts5PendingPoslis
11b70 74 20 2a 70 50 6f 73 6c 69 73 74 3b 0a 20 20 69  t *pPoslist;.  i
11b80 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 69  64 iRowid = p->i
11b90 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
11ba0 2f 2a 20 52 6f 77 69 64 20 61 73 73 6f 63 69 61  /* Rowid associa
11bb0 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 74  ted with these t
11bc0 6f 6b 65 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49  okens */..  /* I
11bd0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
11be0 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64 20 74  lready occured t
11bf0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
11c00 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  -op. */.  if( p-
11c10 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
11c20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46   return;..  /* F
11c30 69 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  ind the hash tab
11c40 6c 65 20 74 6f 20 75 73 65 2e 20 49 74 20 68 61  le to use. It ha
11c50 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
11c60 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 61  llocated. */.  a
11c70 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43 6f  ssert( iIdx<=pCo
11c80 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 3b  nfig->nPrefix );
11c90 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3d  .  assert( iIdx=
11ca0 3d 30 20 7c 7c 20 6e 54 6f 6b 65 6e 3d 3d 70 43  =0 || nToken==pC
11cb0 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
11cc0 49 64 78 2d 31 5d 20 29 3b 0a 20 20 70 48 61 73  Idx-1] );.  pHas
11cd0 68 20 3d 20 26 70 2d 3e 61 48 61 73 68 5b 69 49  h = &p->aHash[iI
11ce0 64 78 5d 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  dx];..  /* Find 
11cf0 74 68 65 20 64 6f 63 6c 69 73 74 20 74 6f 20 61  the doclist to a
11d00 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c 6f 63 61  ppend to. Alloca
11d10 74 65 20 61 20 6e 65 77 20 64 6f 63 6c 69 73 74  te a new doclist
11d20 20 6f 62 6a 65 63 74 20 69 66 0a 20 20 2a 2a 20   object if.  ** 
11d30 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 70  required. */.  p
11d40 44 6f 63 6c 69 73 74 20 3d 20 28 46 74 73 35 50  Doclist = (Fts5P
11d50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 2a 29 66  endingDoclist*)f
11d60 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61 73  ts3HashFind(pHas
11d70 68 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  h, pToken, nToke
11d80 6e 29 3b 0a 20 20 69 66 28 20 70 44 6f 63 6c 69  n);.  if( pDocli
11d90 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  st==0 ){.    Fts
11da0 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20  5PendingDoclist 
11db0 2a 70 44 65 6c 3b 0a 20 20 20 20 70 44 6f 63 6c  *pDel;.    pDocl
11dc0 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e  ist = fts5Pendin
11dd0 67 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  gMalloc(p, sizeo
11de0 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63  f(Fts5PendingDoc
11df0 6c 69 73 74 29 20 2b 20 6e 54 6f 6b 65 6e 29 3b  list) + nToken);
11e00 0a 20 20 20 20 69 66 28 20 70 44 6f 63 6c 69 73  .    if( pDoclis
11e10 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
11e20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 70 54 65     pDoclist->pTe
11e30 72 6d 20 3d 20 28 75 38 2a 29 26 70 44 6f 63 6c  rm = (u8*)&pDocl
11e40 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 44 6f 63  ist[1];.    pDoc
11e50 6c 69 73 74 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54  list->nTerm = nT
11e60 6f 6b 65 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  oken;.    memcpy
11e70 28 70 44 6f 63 6c 69 73 74 2d 3e 70 54 65 72 6d  (pDoclist->pTerm
11e80 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
11e90 29 3b 0a 20 20 20 20 70 44 65 6c 20 3d 20 66 74  );.    pDel = ft
11ea0 73 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  s3HashInsert(pHa
11eb0 73 68 2c 20 70 44 6f 63 6c 69 73 74 2d 3e 70 54  sh, pDoclist->pT
11ec0 65 72 6d 2c 20 6e 54 6f 6b 65 6e 2c 20 70 44 6f  erm, nToken, pDo
11ed0 63 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  clist);.    if( 
11ee0 70 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 61 73  pDel ){.      as
11ef0 73 65 72 74 28 20 70 44 6f 63 6c 69 73 74 3d 3d  sert( pDoclist==
11f00 70 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  pDel );.      sq
11f10 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65 6c 29  lite3_free(pDel)
11f20 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
11f30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11f40 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11f50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  }.  }..  /* Find
11f60 20 74 68 65 20 70 6f 73 6c 69 73 74 20 74 6f 20   the poslist to 
11f70 61 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c 6f 63  append to. Alloc
11f80 61 74 65 20 61 20 6e 65 77 20 6f 62 6a 65 63 74  ate a new object
11f90 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
11fa0 0a 20 20 70 50 6f 73 6c 69 73 74 20 3d 20 70 44  .  pPoslist = pD
11fb0 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69 73 74  oclist->pPoslist
11fc0 3b 0a 20 20 69 66 28 20 70 50 6f 73 6c 69 73 74  ;.  if( pPoslist
11fd0 3d 3d 30 20 7c 7c 20 70 50 6f 73 6c 69 73 74 2d  ==0 || pPoslist-
11fe0 3e 69 52 6f 77 69 64 21 3d 69 52 6f 77 69 64 20  >iRowid!=iRowid 
11ff0 29 7b 0a 20 20 20 20 70 50 6f 73 6c 69 73 74 20  ){.    pPoslist 
12000 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4d 61 6c  = fts5PendingMal
12010 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
12020 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74  s5PendingPoslist
12030 29 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6f 73  ));.    if( pPos
12040 6c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  list==0 ) return
12050 3b 0a 20 20 20 20 70 50 6f 73 6c 69 73 74 2d 3e  ;.    pPoslist->
12060 70 4e 65 78 74 20 3d 20 70 44 6f 63 6c 69 73 74  pNext = pDoclist
12070 2d 3e 70 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  ->pPoslist;.    
12080 70 50 6f 73 6c 69 73 74 2d 3e 69 52 6f 77 69 64  pPoslist->iRowid
12090 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 70   = iRowid;.    p
120a0 44 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69 73  Doclist->pPoslis
120b0 74 20 3d 20 70 50 6f 73 6c 69 73 74 3b 0a 20 20  t = pPoslist;.  
120c0 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 43 6f 6c    pDoclist->iCol
120d0 20 3d 20 30 3b 0a 20 20 20 20 70 44 6f 63 6c 69   = 0;.    pDocli
120e0 73 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a 20 20  st->iPos = 0;.  
120f0 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
12100 68 65 20 76 61 6c 75 65 73 20 74 6f 20 74 68 65  he values to the
12110 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20   position list. 
12120 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  */.  if( iCol>=0
12130 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64   ){.    p->nPend
12140 69 6e 67 44 61 74 61 20 2d 3d 20 70 50 6f 73 6c  ingData -= pPosl
12150 69 73 74 2d 3e 62 75 66 2e 6e 53 70 61 63 65 3b  ist->buf.nSpace;
12160 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 21 3d 70  .    if( iCol!=p
12170 44 6f 63 6c 69 73 74 2d 3e 69 43 6f 6c 20 29 7b  Doclist->iCol ){
12180 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
12190 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
121a0 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73 74 2d  ->rc, &pPoslist-
121b0 3e 62 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  >buf, 1);.      
121c0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
121d0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
121e0 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2c 20 69  pPoslist->buf, i
121f0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 44 6f 63  Col);.      pDoc
12200 6c 69 73 74 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f  list->iCol = iCo
12210 6c 3b 0a 20 20 20 20 20 20 70 44 6f 63 6c 69 73  l;.      pDoclis
12220 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20  t->iPos = 0;.   
12230 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
12240 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
12250 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73 74 2d  ->rc, &pPoslist-
12260 3e 62 75 66 2c 20 69 50 6f 73 20 2b 20 32 20 2d  >buf, iPos + 2 -
12270 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50 6f 73 29   pDoclist->iPos)
12280 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e  ;.    p->nPendin
12290 67 44 61 74 61 20 2b 3d 20 70 50 6f 73 6c 69 73  gData += pPoslis
122a0 74 2d 3e 62 75 66 2e 6e 53 70 61 63 65 3b 0a 20  t->buf.nSpace;. 
122b0 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50 6f     pDoclist->iPo
122c0 73 20 3d 20 69 50 6f 73 3b 0a 20 20 7d 0a 7d 0a  s = iPos;.  }.}.
122d0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
122e0 70 65 6e 64 69 6e 67 2d 64 6f 63 6c 69 73 74 20  pending-doclist 
122f0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
12300 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
12310 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
12320 69 64 20 66 74 73 35 46 72 65 65 50 65 6e 64 69  id fts5FreePendi
12330 6e 67 44 6f 63 6c 69 73 74 28 46 74 73 35 50 65  ngDoclist(Fts5Pe
12340 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70 29  ndingDoclist *p)
12350 7b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 50  {.  Fts5PendingP
12360 6f 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69 73 74  oslist *pPoslist
12370 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 50  ;.  Fts5PendingP
12380 6f 73 6c 69 73 74 20 2a 70 4e 65 78 74 3b 0a 20  oslist *pNext;. 
12390 20 66 6f 72 28 70 50 6f 73 6c 69 73 74 3d 70 2d   for(pPoslist=p-
123a0 3e 70 50 6f 73 6c 69 73 74 3b 20 70 50 6f 73 6c  >pPoslist; pPosl
123b0 69 73 74 3b 20 70 50 6f 73 6c 69 73 74 3d 70 4e  ist; pPoslist=pN
123c0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
123d0 3d 20 70 50 6f 73 6c 69 73 74 2d 3e 70 4e 65 78  = pPoslist->pNex
123e0 74 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  t;.    fts5Buffe
123f0 72 46 72 65 65 28 26 70 50 6f 73 6c 69 73 74 2d  rFree(&pPoslist-
12400 3e 62 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  >buf);.    sqlit
12410 65 33 5f 66 72 65 65 28 70 50 6f 73 6c 69 73 74  e3_free(pPoslist
12420 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12430 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
12440 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d  ** Insert or rem
12450 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66  ove data to or f
12460 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45  rom the index. E
12470 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d  ach time a docum
12480 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64  ent is .** added
12490 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66   to or removed f
124a0 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74  rom the index, t
124b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
124c0 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  called one or mo
124d0 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a  re.** times..**.
124e0 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74  ** For an insert
124f0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
12500 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
12510 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e  h token in the n
12520 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20  ew document..** 
12530 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
12540 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74   is a delete, it
12550 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
12560 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20  (at least) once 
12570 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71  for each.** uniq
12580 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ue token in the 
12590 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  document with an
125a0 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73   iCol value less
125b0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20   than zero. The 
125c0 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iPos.** argument
125d0 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
125e0 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  a delete..*/.voi
125f0 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  d sqlite3Fts5Ind
12600 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
12610 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
12620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12630 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
12640 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
12670 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
12680 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
12690 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
126c0 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
126d0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
126e0 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
126f0 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
12700 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
12710 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
12720 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
12730 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12750 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
12760 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
12770 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  es */.  Fts5Conf
12780 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
12790 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 2f 2a 20  >pConfig;..  /* 
127a0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
127b0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64 20  already occured 
127c0 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
127d0 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70  o-op. */.  if( p
127e0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
127f0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
12800 41 6c 6c 6f 63 61 74 65 20 68 61 73 68 20 74 61  Allocate hash ta
12810 62 6c 65 73 20 69 66 20 74 68 65 79 20 68 61 76  bles if they hav
12820 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  e not already be
12830 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
12840 20 20 69 66 28 20 70 2d 3e 61 48 61 73 68 3d 3d    if( p->aHash==
12850 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 48 61  0 ){.    int nHa
12860 73 68 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 6e 50  sh = pConfig->nP
12870 72 65 66 69 78 20 2b 20 31 3b 0a 20 20 20 20 70  refix + 1;.    p
12880 2d 3e 61 48 61 73 68 20 3d 20 28 46 74 73 33 48  ->aHash = (Fts3H
12890 61 73 68 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ash*)sqlite3_mal
128a0 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 48  loc(sizeof(Fts3H
128b0 61 73 68 29 20 2a 20 6e 48 61 73 68 29 3b 0a 20  ash) * nHash);. 
128c0 20 20 20 69 66 28 20 70 2d 3e 61 48 61 73 68 3d     if( p->aHash=
128d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
128e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
128f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12900 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 48     for(i=0; i<nH
12910 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ash; i++){.     
12920 20 20 20 66 74 73 33 48 61 73 68 49 6e 69 74 28     fts3HashInit(
12930 26 70 2d 3e 61 48 61 73 68 5b 69 5d 2c 20 46 54  &p->aHash[i], FT
12940 53 33 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  S3_HASH_STRING, 
12950 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
12960 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  }.  }..  /* Add 
12970 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20 74 6f  the new token to
12980 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20   the main terms 
12990 68 61 73 68 20 74 61 62 6c 65 2e 20 41 6e 64 20  hash table. And 
129a0 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 20  to each of the. 
129b0 20 2a 2a 20 70 72 65 66 69 78 20 68 61 73 68 20   ** prefix hash 
129c0 74 61 62 6c 65 73 20 74 68 61 74 20 69 74 20 69  tables that it i
129d0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
129e0 6f 72 2e 20 2a 2f 0a 20 20 66 74 73 35 41 64 64  or. */.  fts5Add
129f0 54 65 72 6d 54 6f 48 61 73 68 28 70 2c 20 30 2c  TermToHash(p, 0,
12a00 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 6f   iCol, iPos, pTo
12a10 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
12a20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66  for(i=0; i<pConf
12a30 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b  ig->nPrefix; i++
12a40 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  ){.    if( nToke
12a50 6e 3e 3d 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  n>=pConfig->aPre
12a60 66 69 78 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  fix[i] ){.      
12a70 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48 61 73  fts5AddTermToHas
12a80 68 28 70 2c 20 69 2b 31 2c 20 69 43 6f 6c 2c 20  h(p, i+1, iCol, 
12a90 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 70 43  iPos, pToken, pC
12aa0 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
12ab0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ]);.    }.  }.}.
12ac0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
12ad0 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
12ae0 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
12af0 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 0a 2a  re pStruct..**.*
12b00 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
12b10 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
12b20 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
12b30 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20  n is a no-op. 0 
12b40 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
12b50 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
12b60 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
12b70 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46 74  AllocateSegid(Ft
12b80 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
12b90 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
12ba0 63 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ct){.  int i;.  
12bb0 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
12bc0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 30 3b  E_OK ) return 0;
12bd0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  ..  for(i=0; i<1
12be0 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  00; i++){.    in
12bf0 74 20 69 53 65 67 69 64 3b 0a 20 20 20 20 73 71  t iSegid;.    sq
12c00 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
12c10 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20 28 76  (sizeof(int), (v
12c20 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20  oid*)&iSegid);. 
12c30 20 20 20 69 53 65 67 69 64 20 3d 20 69 53 65 67     iSegid = iSeg
12c40 69 64 20 26 20 28 28 31 20 3c 3c 20 46 54 53 35  id & ((1 << FTS5
12c50 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31 29 3b 0a  _DATA_ID_B)-1);.
12c60 20 20 20 20 69 66 28 20 69 53 65 67 69 64 20 29      if( iSegid )
12c70 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
12c80 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 66 6f  , iSeg;.      fo
12c90 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
12ca0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
12cb0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
12cc0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
12cd0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
12ce0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
12cf0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
12d00 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70 53 74   if( iSegid==pSt
12d10 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
12d20 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
12d30 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  egid ){.        
12d40 20 20 20 20 69 53 65 67 69 64 20 3d 20 30 3b 0a      iSegid = 0;.
12d50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12d60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12d70 20 20 7d 0a 20 20 20 20 69 66 28 20 69 53 65 67    }.    if( iSeg
12d80 69 64 20 29 20 72 65 74 75 72 6e 20 69 53 65 67  id ) return iSeg
12d90 69 64 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63  id;.  }..  p->rc
12da0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
12db0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12dc0 73 74 61 74 69 63 20 46 74 73 35 50 65 6e 64 69  static Fts5Pendi
12dd0 6e 67 44 6f 63 6c 69 73 74 20 2a 66 74 73 35 50  ngDoclist *fts5P
12de0 65 6e 64 69 6e 67 4d 65 72 67 65 28 0a 20 20 46  endingMerge(.  F
12df0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
12e00 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69  Fts5PendingDocli
12e10 73 74 20 2a 70 4c 65 66 74 2c 0a 20 20 46 74 73  st *pLeft,.  Fts
12e20 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20  5PendingDoclist 
12e30 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 46 74 73  *pRight.){.  Fts
12e40 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20  5PendingDoclist 
12e50 2a 70 31 20 3d 20 70 4c 65 66 74 3b 0a 20 20 46  *p1 = pLeft;.  F
12e60 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
12e70 74 20 2a 70 32 20 3d 20 70 52 69 67 68 74 3b 0a  t *p2 = pRight;.
12e80 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63    Fts5PendingDoc
12e90 6c 69 73 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a  list *pRet = 0;.
12ea0 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63    Fts5PendingDoc
12eb0 6c 69 73 74 20 2a 2a 70 70 4f 75 74 20 3d 20 26  list **ppOut = &
12ec0 70 52 65 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20  pRet;..  while( 
12ed0 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20  p1 || p2 ){.    
12ee0 69 66 28 20 70 31 3d 3d 30 20 29 7b 0a 20 20 20  if( p1==0 ){.   
12ef0 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 32 3b 0a     *ppOut = p2;.
12f00 20 20 20 20 20 20 70 32 20 3d 20 30 3b 0a 20 20        p2 = 0;.  
12f10 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 3d 3d    }else if( p2==
12f20 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 75  0 ){.      *ppOu
12f30 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31  t = p1;.      p1
12f40 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
12f50 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20  .      int nCmp 
12f60 3d 20 4d 49 4e 28 70 31 2d 3e 6e 54 65 72 6d 2c  = MIN(p1->nTerm,
12f70 20 70 32 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20   p2->nTerm);.   
12f80 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d     int res = mem
12f90 63 6d 70 28 70 31 2d 3e 70 54 65 72 6d 2c 20 70  cmp(p1->pTerm, p
12fa0 32 2d 3e 70 54 65 72 6d 2c 20 6e 43 6d 70 29 3b  2->pTerm, nCmp);
12fb0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
12fc0 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 6e 54  0 ) res = p1->nT
12fd0 65 72 6d 20 2d 20 70 32 2d 3e 6e 54 65 72 6d 3b  erm - p2->nTerm;
12fe0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3e  ..      if( res>
12ff0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
13000 70 32 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f  p2 is smaller */
13010 0a 20 20 20 20 20 20 20 20 2a 70 70 4f 75 74 20  .        *ppOut 
13020 3d 20 70 32 3b 0a 20 20 20 20 20 20 20 20 70 70  = p2;.        pp
13030 4f 75 74 20 3d 20 26 70 32 2d 3e 70 4e 65 78 74  Out = &p2->pNext
13040 3b 0a 20 20 20 20 20 20 20 20 70 32 20 3d 20 70  ;.        p2 = p
13050 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  2->pNext;.      
13060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
13070 2a 20 70 31 20 69 73 20 73 6d 61 6c 6c 65 72 20  * p1 is smaller 
13080 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 70 4f 75  */.        *ppOu
13090 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20 20 20  t = p1;.        
130a0 70 70 4f 75 74 20 3d 20 26 70 31 2d 3e 70 4e 65  ppOut = &p1->pNe
130b0 78 74 3b 0a 20 20 20 20 20 20 20 20 70 31 20 3d  xt;.        p1 =
130c0 20 70 31 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   p1->pNext;.    
130d0 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 4f 75 74    }.      *ppOut
130e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
130f0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13100 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  }../*.** Extract
13110 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 66 72 6f 6d   all tokens from
13120 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73   hash table iHas
13130 68 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 6d 20  h and link them 
13140 69 6e 74 6f 20 61 20 6c 69 73 74 0a 2a 2a 20 69  into a list.** i
13150 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  n sorted order. 
13160 54 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69  The hash table i
13170 73 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  s cleared before
13180 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74 20 69   returning. It i
13190 73 0a 2a 2a 20 74 68 65 20 72 65 73 70 6f 6e 73  s.** the respons
131a0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
131b0 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
131c0 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
131d0 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 6c 69  e returned.** li
131e0 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  st..**.** If an 
131f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
13200 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
13210 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
13220 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
13230 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
13240 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
13250 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
13260 2f 0a 73 74 61 74 69 63 20 46 74 73 35 50 65 6e  /.static Fts5Pen
13270 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 66 74 73  dingDoclist *fts
13280 35 50 65 6e 64 69 6e 67 4c 69 73 74 28 46 74 73  5PendingList(Fts
13290 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
132a0 48 61 73 68 29 7b 0a 20 20 63 6f 6e 73 74 20 69  Hash){.  const i
132b0 6e 74 20 6e 4d 65 72 67 65 53 6c 6f 74 20 3d 20  nt nMergeSlot = 
132c0 33 32 3b 0a 20 20 46 74 73 33 48 61 73 68 20 2a  32;.  Fts3Hash *
132d0 70 48 61 73 68 3b 0a 20 20 46 74 73 33 48 61 73  pHash;.  Fts3Has
132e0 68 45 6c 65 6d 20 2a 70 45 3b 20 20 20 20 20 20  hElem *pE;      
132f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
13300 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
13310 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  .  Fts5PendingDo
13320 63 6c 69 73 74 20 2a 2a 61 70 3b 0a 20 20 46 74  clist **ap;.  Ft
13330 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  s5PendingDoclist
13340 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 69   *pList;.  int i
13350 3b 0a 0a 20 20 61 70 20 3d 20 66 74 73 35 49 64  ;..  ap = fts5Id
13360 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
13370 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63  f(Fts5PendingDoc
13380 6c 69 73 74 2a 29 20 2a 20 6e 4d 65 72 67 65 53  list*) * nMergeS
13390 6c 6f 74 29 3b 0a 20 20 69 66 28 20 21 61 70 20  lot);.  if( !ap 
133a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 70  ) return 0;..  p
133b0 48 61 73 68 20 3d 20 26 70 2d 3e 61 48 61 73 68  Hash = &p->aHash
133c0 5b 69 48 61 73 68 5d 3b 0a 20 20 66 6f 72 28 70  [iHash];.  for(p
133d0 45 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28  E=fts3HashFirst(
133e0 70 48 61 73 68 29 3b 20 70 45 3b 20 70 45 3d 66  pHash); pE; pE=f
133f0 74 73 33 48 61 73 68 4e 65 78 74 28 70 45 29 29  ts3HashNext(pE))
13400 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
13410 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
13420 69 73 74 20 2a 70 44 6f 63 6c 69 73 74 20 3d 20  ist *pDoclist = 
13430 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c  (Fts5PendingDocl
13440 69 73 74 2a 29 66 74 73 33 48 61 73 68 44 61 74  ist*)fts3HashDat
13450 61 28 70 45 29 3b 0a 20 20 20 20 61 73 73 65 72  a(pE);.    asser
13460 74 28 20 70 44 6f 63 6c 69 73 74 2d 3e 70 4e 65  t( pDoclist->pNe
13470 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  xt==0 );.    for
13480 28 69 3d 30 3b 20 61 70 5b 69 5d 3b 20 69 2b 2b  (i=0; ap[i]; i++
13490 29 7b 0a 20 20 20 20 20 20 70 44 6f 63 6c 69 73  ){.      pDoclis
134a0 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4d  t = fts5PendingM
134b0 65 72 67 65 28 70 2c 20 70 44 6f 63 6c 69 73 74  erge(p, pDoclist
134c0 2c 20 61 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ap[i]);.      
134d0 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ap[i] = 0;.    }
134e0 0a 20 20 20 20 61 70 5b 69 5d 20 3d 20 70 44 6f  .    ap[i] = pDo
134f0 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 70 4c  clist;.  }..  pL
13500 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ist = 0;.  for(i
13510 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 53 6c 6f 74  =0; i<nMergeSlot
13520 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73  ; i++){.    pLis
13530 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4d  t = fts5PendingM
13540 65 72 67 65 28 70 2c 20 70 4c 69 73 74 2c 20 61  erge(p, pList, a
13550 70 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  p[i]);.  }..  sq
13560 6c 69 74 65 33 5f 66 72 65 65 28 61 70 29 3b 0a  lite3_free(ap);.
13570 20 20 66 74 73 33 48 61 73 68 43 6c 65 61 72 28    fts3HashClear(
13580 70 48 61 73 68 29 3b 0a 20 20 72 65 74 75 72 6e  pHash);.  return
13590 20 70 4c 69 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pList;.}.../*.*
135a0 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61  * Discard all da
135b0 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  ta currently cac
135c0 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d  hed in the hash-
135d0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
135e0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
135f0 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73 35  DiscardData(Fts5
13600 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
13610 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
13620 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
13630 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
13640 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  0; i<=pConfig->n
13650 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20  Prefix; i++){.  
13660 20 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73    Fts3Hash *pHas
13670 68 20 3d 20 26 70 2d 3e 61 48 61 73 68 5b 69 5d  h = &p->aHash[i]
13680 3b 0a 20 20 20 20 46 74 73 33 48 61 73 68 45 6c  ;.    Fts3HashEl
13690 65 6d 20 2a 70 45 3b 20 20 20 20 20 20 20 20 20  em *pE;         
136a0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
136b0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
136c0 20 20 66 6f 72 28 70 45 3d 66 74 73 33 48 61 73    for(pE=fts3Has
136d0 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
136e0 45 3b 20 70 45 3d 66 74 73 33 48 61 73 68 4e 65  E; pE=fts3HashNe
136f0 78 74 28 70 45 29 29 7b 0a 20 20 20 20 20 20 46  xt(pE)){.      F
13700 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
13710 74 20 2a 70 44 6f 63 6c 69 73 74 20 3d 20 28 46  t *pDoclist = (F
13720 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
13730 74 2a 29 66 74 73 33 48 61 73 68 44 61 74 61 28  t*)fts3HashData(
13740 70 45 29 3b 0a 20 20 20 20 20 20 66 74 73 35 46  pE);.      fts5F
13750 72 65 65 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  reePendingDoclis
13760 74 28 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  t(pDoclist);.   
13770 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68 43   }.    fts3HashC
13780 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 7d  lear(pHash);.  }
13790 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  .  p->nPendingDa
137a0 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta = 0;.}../*.**
137b0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
137c0 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c 20   of the prefix, 
137d0 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20 62  in bytes, that b
137e0 75 66 66 65 72 20 28 6e 4e 65 77 2f 70 4e 65 77  uffer (nNew/pNew
137f0 29 20 73 68 61 72 65 73 0a 2a 2a 20 77 69 74 68  ) shares.** with
13800 20 62 75 66 66 65 72 20 28 6e 4f 6c 64 2f 70 4f   buffer (nOld/pO
13810 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ld)..*/.static i
13820 6e 74 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d  nt fts5PrefixCom
13830 70 72 65 73 73 28 0a 20 20 69 6e 74 20 6e 4f 6c  press(.  int nOl
13840 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c  d, const u8 *pOl
13850 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 63  d,.  int nNew, c
13860 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77 0a 29 7b  onst u8 *pNew.){
13870 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
13880 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20 69  i=0; i<nNew && i
13890 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
138a0 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e   if( pOld[i]!=pN
138b0 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ew[i] ) break;. 
138c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
138d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 22 6e  ../*.** If an "n
138e0 45 6d 70 74 79 22 20 72 65 63 6f 72 64 20 6d 75  Empty" record mu
138f0 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
13900 20 74 68 65 20 62 2d 74 72 65 65 20 62 65 66 6f   the b-tree befo
13910 72 65 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 74  re the next.** t
13920 65 72 6d 2c 20 77 72 69 74 65 20 69 74 20 6e 6f  erm, write it no
13930 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
13940 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
13950 4e 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78  NEmpty(Fts5Index
13960 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
13970 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
13980 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  if( pWriter->nEm
13990 70 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  pty ){.    int b
139a0 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 46 74  Flag = 0;.    Ft
139b0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
139c0 67 3b 0a 20 20 20 20 70 50 67 20 3d 20 26 70 57  g;.    pPg = &pW
139d0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 31  riter->aWriter[1
139e0 5d 3b 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  ];.    if( pWrit
139f0 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35  er->nEmpty>=FTS5
13a00 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
13a10 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65  ){.      i64 iKe
13a20 79 20 3d 20 46 54 53 35 5f 44 4f 43 4c 49 53 54  y = FTS5_DOCLIST
13a30 5f 49 44 58 5f 52 4f 57 49 44 28 0a 20 20 20 20  _IDX_ROWID(.    
13a40 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
13a50 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  Idx, pWriter->iS
13a60 65 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  egid, .         
13a70 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
13a80 72 5b 30 5d 2e 70 67 6e 6f 20 2d 20 31 20 2d 20  r[0].pgno - 1 - 
13a90 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 0a  pWriter->nEmpty.
13aa0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
13ab0 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
13ac0 64 6c 69 64 78 2e 6e 3e 30 20 29 3b 0a 20 20 20  dlidx.n>0 );.   
13ad0 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
13ae0 28 70 2c 20 69 4b 65 79 2c 20 70 57 72 69 74 65  (p, iKey, pWrite
13af0 72 2d 3e 64 6c 69 64 78 2e 70 2c 20 70 57 72 69  r->dlidx.p, pWri
13b00 74 65 72 2d 3e 64 6c 69 64 78 2e 6e 29 3b 0a 20  ter->dlidx.n);. 
13b10 20 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a       bFlag = 1;.
13b20 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
13b30 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
13b40 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62  (&p->rc, &pPg->b
13b50 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20 20 20 20  uf, bFlag);.    
13b60 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
13b70 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
13b80 70 50 67 2d 3e 62 75 66 2c 20 70 57 72 69 74 65  pPg->buf, pWrite
13b90 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20  r->nEmpty);.    
13ba0 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
13bb0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  = 0;.  }..  /* W
13bc0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74  hether or not it
13bd0 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
13be0 64 69 73 6b 2c 20 7a 65 72 6f 20 74 68 65 20 64  disk, zero the d
13bf0 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 61 74 20  oclist index at 
13c00 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 20  this.  ** point 
13c10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  */.  sqlite3Fts5
13c20 42 75 66 66 65 72 5a 65 72 6f 28 26 70 57 72 69  BufferZero(&pWri
13c30 74 65 72 2d 3e 64 6c 69 64 78 29 3b 0a 20 20 70  ter->dlidx);.  p
13c40 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72  Writer->bDlidxPr
13c50 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 7d 0a 0a  evValid = 0;.}..
13c60 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
13c70 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 46  WriteBtreeGrow(F
13c80 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
13c90 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
13ca0 74 65 72 29 7b 0a 20 20 46 74 73 35 50 61 67 65  ter){.  Fts5Page
13cb0 57 72 69 74 65 72 20 2a 61 4e 65 77 3b 0a 20 20  Writer *aNew;.  
13cc0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
13cd0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 65 77  pNew;.  int nNew
13ce0 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61   = sizeof(Fts5Pa
13cf0 67 65 57 72 69 74 65 72 29 20 2a 20 28 70 57 72  geWriter) * (pWr
13d00 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b 31 29  iter->nWriter+1)
13d10 3b 0a 0a 20 20 61 4e 65 77 20 3d 20 28 46 74 73  ;..  aNew = (Fts
13d20 35 50 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c  5PageWriter*)sql
13d30 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72  ite3_realloc(pWr
13d40 69 74 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e  iter->aWriter, n
13d50 4e 65 77 29 3b 0a 20 20 69 66 28 20 61 4e 65 77  New);.  if( aNew
13d60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
13d70 20 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 57   pNew = &aNew[pW
13d80 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 5d 3b  riter->nWriter];
13d90 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
13da0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61  0, sizeof(Fts5Pa
13db0 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20 70 4e  geWriter));.  pN
13dc0 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ew->pgno = 1;.  
13dd0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
13de0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
13df0 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29 3b 0a 0a  pNew->buf, 1);..
13e00 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74    pWriter->nWrit
13e10 65 72 2b 2b 3b 0a 20 20 70 57 72 69 74 65 72 2d  er++;.  pWriter-
13e20 3e 61 57 72 69 74 65 72 20 3d 20 61 4e 65 77 3b  >aWriter = aNew;
13e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
13e40 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  s called once fo
13e50 72 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65  r each leaf page
13e60 20 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73   except the firs
13e70 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  t that contains.
13e80 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
13e90 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28  term. Argument (
13ea0 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20  nTerm/pTerm) is 
13eb0 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20  the split-key - 
13ec0 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69  a term that.** i
13ed0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c  s larger than al
13ee0 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20  l terms written 
13ef0 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65  to earlier leave
13f00 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20  s, and equal to 
13f10 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68  or.** smaller th
13f20 61 6e 20 74 68 65 20 66 69 72 73 74 20 74 65 72  an the first ter
13f30 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61  m on the new lea
13f40 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  f..**.** If an e
13f50 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
13f60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
13f70 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e  ft in Fts5Index.
13f80 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a  rc. If an error.
13f90 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  ** has already o
13fa0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
13fb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13fc0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
13fd0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
13fe0 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
13ff0 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  eeTerm(.  Fts5In
14000 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
14010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
14020 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
14030 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
14040 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
14050 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
14060 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
14070 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20  nTerm, const u8 
14080 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46  *pTerm      /* F
14090 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77  irst term on new
140a0 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
140b0 74 20 69 48 65 69 67 68 74 3b 0a 20 20 66 6f 72  t iHeight;.  for
140c0 28 69 48 65 69 67 68 74 3d 31 3b 20 31 3b 20 69  (iHeight=1; 1; i
140d0 48 65 69 67 68 74 2b 2b 29 7b 0a 20 20 20 20 46  Height++){.    F
140e0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
140f0 50 61 67 65 3b 0a 0a 20 20 20 20 69 66 28 20 69  Page;..    if( i
14100 48 65 69 67 68 74 3e 3d 70 57 72 69 74 65 72 2d  Height>=pWriter-
14110 3e 6e 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20  >nWriter ){.    
14120 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
14130 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29  Grow(p, pWriter)
14140 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
14150 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  c ) return;.    
14160 7d 0a 20 20 20 20 70 50 61 67 65 20 3d 20 26 70  }.    pPage = &p
14170 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
14180 69 48 65 69 67 68 74 5d 3b 0a 0a 20 20 20 20 66  iHeight];..    f
14190 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d  ts5WriteBtreeNEm
141a0 70 74 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b  pty(p, pWriter);
141b0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ..    if( pPage-
141c0 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73 7a 20  >buf.n>=p->pgsz 
141d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
141e0 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  e will be writte
141f0 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 74  n to disk. The t
14200 65 72 6d 20 77 69 6c 6c 20 62 65 20 77 72 69 74  erm will be writ
14210 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ten into the.   
14220 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6f 66 20     ** parent of 
14230 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20  pPage.  */.     
14240 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54   i64 iRowid = FT
14250 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
14260 28 0a 20 20 20 20 20 20 20 20 20 20 70 57 72 69  (.          pWri
14270 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74  ter->iIdx, pWrit
14280 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 48 65 69  er->iSegid, iHei
14290 67 68 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ght, pPage->pgno
142a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
142b0 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
142c0 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e   iRowid, pPage->
142d0 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75  buf.p, pPage->bu
142e0 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  f.n);.      fts5
142f0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
14300 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 66  e->buf);.      f
14310 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
14320 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20 20 20  Page->term);.   
14330 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
14340 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
14350 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70  , &pPage->buf, p
14360 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a  Page[-1].pgno);.
14370 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
14380 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o++;.    }else{.
14390 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d        int nPre =
143a0 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
143b0 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e  ess(pPage->term.
143c0 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
143d0 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
143e0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
143f0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
14400 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
14410 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20 20 20 20  f, nPre+2);.    
14420 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
14430 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
14440 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
14450 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20 20 20 20  erm-nPre);.     
14460 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
14470 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
14480 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
14490 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b 6e 50 72  -nPre, pTerm+nPr
144a0 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  e);.      fts5Bu
144b0 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
144c0 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54  &pPage->term, nT
144d0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
144e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
144f0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
14500 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
14510 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49  eNoTerm(.  Fts5I
14520 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
14530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
14540 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
14550 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
14560 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20  iter *pWriter   
14570 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
14580 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
14590 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
145a0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
145b0 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72 6f 77 69  {.    /* No rowi
145c0 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  ds on this page.
145d0 20 41 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20   Append an 0x00 
145e0 62 79 74 65 20 74 6f 20 74 68 65 20 63 75 72 72  byte to the curr
145f0 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64 6f 63 6c  ent .    ** docl
14600 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist-index */.   
14610 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
14620 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
14630 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
14640 3e 64 6c 69 64 78 2c 20 30 29 3b 0a 20 20 7d 0a  >dlidx, 0);.  }.
14650 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74    pWriter->nEmpt
14660 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  y++;.}../*.** Ro
14670 77 69 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a  wid iRowid has j
14680 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ust been appende
14690 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
146a0 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73 20 69   leaf page. As i
146b0 74 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  t is.** the firs
146c0 74 20 6f 6e 20 69 74 73 20 70 61 67 65 2c 20 61  t on its page, a
146d0 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79 20 74  ppend an entry t
146e0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  o the current do
146f0 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a  clist-index..*/.
14700 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14710 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
14720 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
14730 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
14740 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20  er *pWriter, .  
14750 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20  i64 iRowid.){.  
14760 69 36 34 20 69 56 61 6c 3b 0a 20 20 69 66 28 20  i64 iVal;.  if( 
14770 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50  pWriter->bDlidxP
14780 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  revValid ){.    
14790 69 56 61 6c 20 3d 20 70 57 72 69 74 65 72 2d 3e  iVal = pWriter->
147a0 69 44 6c 69 64 78 50 72 65 76 20 2d 20 69 52 6f  iDlidxPrev - iRo
147b0 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
147c0 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b    iVal = iRowid;
147d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
147e0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
147f0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57  rint(&p->rc, &pW
14800 72 69 74 65 72 2d 3e 64 6c 69 64 78 2c 20 69 56  riter->dlidx, iV
14810 61 6c 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  al);.  pWriter->
14820 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 20  bDlidxPrevValid 
14830 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
14840 69 44 6c 69 64 78 50 72 65 76 20 3d 20 69 52 6f  iDlidxPrev = iRo
14850 77 69 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  wid;.}..static v
14860 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75  oid fts5WriteFlu
14870 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78  shLeaf(Fts5Index
14880 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
14890 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
148a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
148b0 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
148c0 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
148d0 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57  0 };.  Fts5PageW
148e0 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
148f0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
14900 5b 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  [0];.  i64 iRowi
14910 64 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  d;..  if( pPage-
14920 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  >term.n==0 ){.  
14930 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73    /* No term was
14940 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
14950 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
14960 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74  sert( 0==fts5Get
14970 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
14980 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66 74 73  p[2]) );.    fts
14990 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72  5WriteBtreeNoTer
149a0 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  m(p, pWriter);. 
149b0 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
149c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
149d0 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a 20 20  to the db. */.  
149e0 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
149f0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
14a00 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74  ter->iIdx, pWrit
14a10 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  er->iSegid, 0, p
14a20 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66  Page->pgno);.  f
14a30 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
14a40 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62  iRowid, pPage->b
14a50 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66  uf.p, pPage->buf
14a60 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .n);..  /* Initi
14a70 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70  alize the next p
14a80 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
14a90 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
14aa0 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
14ab0 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e  ferZero(&pPage->
14ac0 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66  term);.  fts5Buf
14ad0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
14ae0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
14af0 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70  f, 4, zero);.  p
14b00 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20  Page->pgno++;.. 
14b10 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
14b20 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
14b30 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72  counter */.  pWr
14b40 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74  iter->nLeafWritt
14b50 65 6e 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  en++;.}../*.** A
14b60 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d  ppend term pTerm
14b70 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65  /nTerm to the se
14b80 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
14b90 74 65 6e 20 62 79 20 74 68 65 20 77 72 69 74 65  ten by the write
14ba0 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
14bb0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14bc0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
14bd0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
14be0 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
14bf0 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
14c00 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
14c10 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
14c20 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
14c30 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
14c40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14c50 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
14c60 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
14c70 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
14c80 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
14c90 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74  int nTerm, const
14ca0 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20   u8 *pTerm .){. 
14cb0 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65   /* Bytes of pre
14ce0 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  fix compression 
14cf0 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74  for term */.  Ft
14d00 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
14d10 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
14d20 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 61  aWriter[0];..  a
14d30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
14d40 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  f.n==0 || pPage-
14d50 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20 69 66  >buf.n>4 );.  if
14d60 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d  ( pPage->buf.n==
14d70 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f  0 ){.    /* Zero
14d80 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
14d90 61 6e 64 20 66 69 72 73 74 20 64 6f 63 69 64 20  and first docid 
14da0 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74  fields */.    st
14db0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
14dc0 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30  ro[] = { 0x00, 0
14dd0 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
14de0 7d 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  };.    fts5Buffe
14df0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
14e00 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
14e10 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61   4, zero);.    a
14e20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 74 65  ssert( pPage->te
14e30 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  rm.n==0 );.  }. 
14e40 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
14e50 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28 20 70 50  urn;.  .  if( pP
14e60 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29  age->term.n==0 )
14e70 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  {.    /* Update 
14e80 74 68 65 20 22 66 69 72 73 74 20 74 65 72 6d 22  the "first term"
14e90 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
14ea0 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  ge header. */.  
14eb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
14ec0 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20  >buf.p[2]==0 && 
14ed0 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d  pPage->buf.p[3]=
14ee0 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75  =0 );.    fts5Pu
14ef0 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
14f00 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75  .p[2], pPage->bu
14f10 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66 69  f.n);.    nPrefi
14f20 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
14f30 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
14f40 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20  0].pgno!=1 ){.  
14f50 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
14f60 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  eeTerm(p, pWrite
14f70 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  r, nTerm, pTerm)
14f80 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
14f90 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
14fa0 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  r[0];.    }.  }e
14fb0 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78  lse{.    nPrefix
14fc0 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
14fd0 70 72 65 73 73 28 0a 20 20 20 20 20 20 20 20 70  press(.        p
14fe0 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50  Page->term.n, pP
14ff0 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65  age->term.p, nTe
15000 72 6d 2c 20 70 54 65 72 6d 0a 20 20 20 20 29 3b  rm, pTerm.    );
15010 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
15020 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
15030 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
15040 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a   nPrefix);.  }..
15050 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
15060 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
15070 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65  of new data, the
15080 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20  n the term data 
15090 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74  itself.  ** to t
150a0 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  he page. */.  ft
150b0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
150c0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
150d0 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
150e0 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74  - nPrefix);.  ft
150f0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
15100 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
15110 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
15120 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b  nPrefix, &pTerm[
15130 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a  nPrefix]);..  /*
15140 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
15150 50 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20  PageWriter.term 
15160 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35  field. */.  fts5
15170 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
15180 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
15190 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 0a  nTerm, pTerm);..
151a0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
151b0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
151c0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
151d0 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
151e0 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 1;..  /* If 
151f0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
15200 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66   page is full, f
15210 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e  lush it to disk.
15220 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
15230 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73 7a 20  >buf.n>=p->pgsz 
15240 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ){.    fts5Write
15250 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
15260 69 74 65 72 29 3b 0a 20 20 20 20 70 57 72 69 74  iter);.    pWrit
15270 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
15280 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d  nPage = 1;.  }.}
15290 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
152a0 20 64 6f 63 69 64 20 74 6f 20 74 68 65 20 77 72   docid to the wr
152b0 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a  iters output. .*
152c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
152d0 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
152e0 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  id(.  Fts5Index 
152f0 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
15300 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
15310 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20   i64 iRowid.){. 
15320 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
15330 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
15340 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a  r->aWriter[0];..
15350 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
15360 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
15370 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
15380 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
15390 68 65 20 0a 20 20 2a 2a 20 64 6f 63 69 64 2d 70  he .  ** docid-p
153a0 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
153b0 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20  ge-header. Also 
153c0 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74  append a value t
153d0 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20 2a 2a  o the dlidx.  **
153e0 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65   buffer, in case
153f0 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
15400 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
15410 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
15420 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
15430 67 65 20 29 7b 0a 20 20 20 20 66 74 73 35 50 75  ge ){.    fts5Pu
15440 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e  tU16(pPage->buf.
15450 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->buf.n)
15460 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 44  ;.    fts5WriteD
15470 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57  lidxAppend(p, pW
15480 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a  riter, iRowid);.
15490 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
154a0 74 68 65 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20  the docid. */.  
154b0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
154c0 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
154d0 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  t || pWriter->bF
154e0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
154f0 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
15500 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
15510 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
15520 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65  f, iRowid);.  }e
15530 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
15540 20 69 52 6f 77 69 64 3c 70 57 72 69 74 65 72 2d   iRowid<pWriter-
15550 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20  >iPrevRowid );. 
15560 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
15570 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
15580 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70  , &pPage->buf, p
15590 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
155a0 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20  id - iRowid);.  
155b0 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72  }.  pWriter->iPr
155c0 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  evRowid = iRowid
155d0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
155e0 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
155f0 74 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72  t = 0;.  pWriter
15600 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
15610 61 67 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  age = 0;..  if( 
15620 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d  pPage->buf.n>=p-
15630 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66 74 73  >pgsz ){.    fts
15640 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
15650 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
15660 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
15670 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
15680 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
15690 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
156a0 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 0a 20  endPoslistInt(. 
156b0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
156c0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
156d0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
156e0 69 56 61 6c 0a 29 7b 0a 20 20 46 74 73 35 50 61  iVal.){.  Fts5Pa
156f0 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
15700 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
15710 74 65 72 5b 30 5d 3b 0a 20 20 66 74 73 35 42 75  ter[0];.  fts5Bu
15720 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
15730 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
15740 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 69  >buf, iVal);.  i
15750 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
15760 3d 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  =p->pgsz ){.    
15770 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
15780 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
15790 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
157a0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
157b0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   1;.  }.}..stati
157c0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
157d0 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 46  AppendZerobyte(F
157e0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
157f0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
15800 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66  ter){.  fts5Buff
15810 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
15820 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
15830 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 2c  >aWriter[0].buf,
15840 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   0);.}../*.** Wr
15850 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
15860 20 6f 66 20 70 65 6e 64 69 6e 67 2d 64 6f 63 6c   of pending-docl
15870 69 73 74 20 6f 62 6a 65 63 74 20 70 44 6f 63 6c  ist object pDocl
15880 69 73 74 20 74 6f 20 77 72 69 74 65 72 20 70 57  ist to writer pW
15890 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  riter..**.** If 
158a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
158b0 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
158c0 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
158d0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
158e0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
158f0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
15900 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
15910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15920 20 66 74 73 35 57 72 69 74 65 50 65 6e 64 69 6e   fts5WritePendin
15930 67 44 6f 63 6c 69 73 74 28 0a 20 20 46 74 73 35  gDoclist(.  Fts5
15940 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
15950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15960 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
15970 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
15980 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
15990 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
159a0 20 74 6f 20 74 68 69 73 20 77 72 69 74 65 72 20   to this writer 
159b0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
159c0 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a  PendingDoclist *
159d0 70 44 6f 63 6c 69 73 74 20 20 20 20 2f 2a 20 44  pDoclist    /* D
159e0 6f 63 6c 69 73 74 20 74 6f 20 77 72 69 74 65 20  oclist to write 
159f0 74 6f 20 70 57 72 69 74 65 72 20 2a 2f 0a 29 7b  to pWriter */.){
15a00 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 50 6f  .  Fts5PendingPo
15a10 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69 73 74 3b  slist *pPoslist;
15a20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
15a30 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
15a40 65 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20  e doclist */..  
15a50 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 65  /* Append the te
15a60 72 6d 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74  rm */.  fts5Writ
15a70 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 70  eAppendTerm(p, p
15a80 57 72 69 74 65 72 2c 20 70 44 6f 63 6c 69 73 74  Writer, pDoclist
15a90 2d 3e 6e 54 65 72 6d 2c 20 70 44 6f 63 6c 69 73  ->nTerm, pDoclis
15aa0 74 2d 3e 70 54 65 72 6d 29 3b 0a 0a 20 20 2f 2a  t->pTerm);..  /*
15ab0 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69   Append the posi
15ac0 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 65 61  tion list for ea
15ad0 63 68 20 72 6f 77 69 64 20 2a 2f 0a 20 20 66 6f  ch rowid */.  fo
15ae0 72 28 70 50 6f 73 6c 69 73 74 3d 70 44 6f 63 6c  r(pPoslist=pDocl
15af0 69 73 74 2d 3e 70 50 6f 73 6c 69 73 74 3b 20 70  ist->pPoslist; p
15b00 50 6f 73 6c 69 73 74 3b 20 70 50 6f 73 6c 69 73  Poslist; pPoslis
15b10 74 3d 70 50 6f 73 6c 69 73 74 2d 3e 70 4e 65 78  t=pPoslist->pNex
15b20 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20  t){.    int i = 
15b30 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  0;..    /* Appen
15b40 64 20 74 68 65 20 72 6f 77 69 64 20 69 74 73 65  d the rowid itse
15b50 6c 66 20 2a 2f 0a 20 20 20 20 66 74 73 35 57 72  lf */.    fts5Wr
15b60 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70  iteAppendRowid(p
15b70 2c 20 70 57 72 69 74 65 72 2c 20 70 50 6f 73 6c  , pWriter, pPosl
15b80 69 73 74 2d 3e 69 52 6f 77 69 64 29 3b 0a 0a 20  ist->iRowid);.. 
15b90 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
15ba0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 6f 73   size of the pos
15bb0 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62 79  ition list in by
15bc0 74 65 73 20 2a 2f 0a 20 20 20 20 66 74 73 35 57  tes */.    fts5W
15bd0 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
15be0 74 49 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2c  tInt(p, pWriter,
15bf0 20 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2e 6e   pPoslist->buf.n
15c00 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  );..    /* Copy 
15c10 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
15c20 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  t to the output 
15c30 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 77  segment */.    w
15c40 68 69 6c 65 28 20 69 3c 70 50 6f 73 6c 69 73 74  hile( i<pPoslist
15c50 2d 3e 62 75 66 2e 6e 29 7b 0a 20 20 20 20 20 20  ->buf.n){.      
15c60 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  int iVal;.      
15c70 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
15c80 28 26 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2e  (&pPoslist->buf.
15c90 70 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  p[i], iVal);.   
15ca0 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
15cb0 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 70 2c 20  ndPoslistInt(p, 
15cc0 70 57 72 69 74 65 72 2c 20 69 56 61 6c 29 3b 0a  pWriter, iVal);.
15cd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15ce0 57 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73  Write the doclis
15cf0 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  t terminator */.
15d00 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
15d10 64 5a 65 72 6f 62 79 74 65 28 70 2c 20 70 57 72  dZerobyte(p, pWr
15d20 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iter);.}../*.** 
15d30 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63  Flush any data c
15d40 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69  ached by the wri
15d50 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ter object to th
15d60 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65  e database. Free
15d70 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   any.** allocati
15d80 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
15d90 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a  ith the writer..
15da0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15db0 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a  ts5WriteFinish(.
15dc0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
15dd0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
15de0 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
15df0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
15e00 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ect */.  int *pn
15e10 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
15e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15e30 20 48 65 69 67 68 74 20 6f 66 20 74 68 65 20 62   Height of the b
15e40 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  -tree */.  int *
15e50 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20  pnLeaf          
15e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15e70 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  T: Number of lea
15e80 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65  f pages in b-tre
15e90 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
15ea0 0a 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 57 72  .  *pnLeaf = pWr
15eb0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
15ec0 2e 70 67 6e 6f 3b 0a 20 20 69 66 28 20 2a 70 6e  .pgno;.  if( *pn
15ed0 4c 65 61 66 3d 3d 31 20 26 26 20 70 57 72 69 74  Leaf==1 && pWrit
15ee0 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62  er->aWriter[0].b
15ef0 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  uf.n==0 ){.    *
15f00 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  pnLeaf = 0;.    
15f10 2a 70 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  *pnHeight = 0;. 
15f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
15f30 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
15f40 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
15f50 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 57 72  if( pWriter->nWr
15f60 69 74 65 72 3d 3d 31 20 26 26 20 70 57 72 69 74  iter==1 && pWrit
15f70 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35  er->nEmpty>=FTS5
15f80 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
15f90 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
15fa0 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c 20 70  teBtreeGrow(p, p
15fb0 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Writer);.    }. 
15fc0 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
15fd0 6e 57 72 69 74 65 72 3e 31 20 29 7b 0a 20 20 20  nWriter>1 ){.   
15fe0 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65     fts5WriteBtre
15ff0 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69 74  eNEmpty(p, pWrit
16000 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  er);.    }.    *
16010 70 6e 48 65 69 67 68 74 20 3d 20 70 57 72 69 74  pnHeight = pWrit
16020 65 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a 20 20  er->nWriter;..  
16030 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 57 72    for(i=1; i<pWr
16040 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69  iter->nWriter; i
16050 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 50  ++){.      Fts5P
16060 61 67 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d  ageWriter *pPg =
16070 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
16080 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73  er[i];.      fts
16090 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
160a0 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45           FTS5_SE
160b0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
160c0 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74  ter->iIdx, pWrit
160d0 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
160e0 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20 20 20  Pg->pgno), .    
160f0 20 20 20 20 20 20 70 50 67 2d 3e 62 75 66 2e 70        pPg->buf.p
16100 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 0a 20 20 20  , pPg->buf.n.   
16110 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
16120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72    for(i=0; i<pWr
16130 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69  iter->nWriter; i
16140 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  ++){.    Fts5Pag
16150 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
16160 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
16170 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 42 75 66  [i];.    fts5Buf
16180 66 65 72 46 72 65 65 28 26 70 50 67 2d 3e 74 65  ferFree(&pPg->te
16190 72 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  rm);.    fts5Buf
161a0 66 65 72 46 72 65 65 28 26 70 50 67 2d 3e 62 75  ferFree(&pPg->bu
161b0 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  f);.  }.  sqlite
161c0 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e  3_free(pWriter->
161d0 61 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  aWriter);.  sqli
161e0 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
161f0 65 28 26 70 57 72 69 74 65 72 2d 3e 64 6c 69 64  e(&pWriter->dlid
16200 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  x);.}..static vo
16210 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  id fts5WriteInit
16220 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16230 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
16240 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20  er *pWriter, .  
16250 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53  int iIdx, int iS
16260 65 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  egid.){.  memset
16270 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (pWriter, 0, siz
16280 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
16290 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  r));.  pWriter->
162a0 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70  iIdx = iIdx;.  p
162b0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d  Writer->iSegid =
162c0 20 69 53 65 67 69 64 3b 0a 0a 20 20 70 57 72 69   iSegid;..  pWri
162d0 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 28  ter->aWriter = (
162e0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29  Fts5PageWriter*)
162f0 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
16300 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57  sizeof(Fts5PageW
16310 72 69 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70  riter));.  if( p
16320 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 3d  Writer->aWriter=
16330 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
16340 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20  Writer->nWriter 
16350 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
16360 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20  aWriter[0].pgno 
16370 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  = 1;.}..static v
16380 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69  oid fts5WriteIni
16390 74 46 6f 72 41 70 70 65 6e 64 28 0a 20 20 46 74  tForAppend(.  Ft
163a0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
163c0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
163d0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
163e0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
163f0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
16400 74 65 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ter to initializ
16410 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  e */.  int iIdx,
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
16440 73 65 67 6d 65 6e 74 20 69 73 20 61 20 70 61 72  segment is a par
16450 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53 74  t of */.  Fts5St
16460 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
16470 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
16480 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f 20 61  ment object to a
16490 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  ppend to */.){. 
164a0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 53 65   int nByte = pSe
164b0 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73 69 7a  g->nHeight * siz
164c0 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
164d0 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 57  er);.  memset(pW
164e0 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
164f0 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
16500 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64  ;.  pWriter->iId
16510 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57 72 69  x = iIdx;.  pWri
16520 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 70 53  ter->iSegid = pS
16530 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 70 57  eg->iSegid;.  pW
16540 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d  riter->aWriter =
16550 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72   (Fts5PageWriter
16560 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
16570 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 57 72  p, nByte);.  pWr
16580 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20  iter->nWriter = 
16590 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b 0a 0a  pSeg->nHeight;..
165a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
165b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
165c0 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20  t pgno = 1;.    
165d0 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72 69 74  int i;.    pWrit
165e0 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70  er->aWriter[0].p
165f0 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
16600 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f 72 28  Last+1;.    for(
16610 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d  i=pSeg->nHeight-
16620 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
16630 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
16640 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
16650 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64  WID(pWriter->iId
16660 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
16670 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a 20 20  id, i, pgno);.  
16680 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
16690 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74  er *pPg = &pWrit
166a0 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a  er->aWriter[i];.
166b0 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20        pPg->pgno 
166c0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74  = pgno;.      ft
166d0 73 35 44 61 74 61 42 75 66 66 65 72 28 70 2c 20  s5DataBuffer(p, 
166e0 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f 77 69  &pPg->buf, iRowi
166f0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  d);.      if( p-
16700 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
16710 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 4e 6f  {.        Fts5No
16720 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20 20  deIter ss;.     
16730 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49     fts5NodeIterI
16740 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70 2c 20  nit(pPg->buf.p, 
16750 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73 73 29  pPg->buf.n, &ss)
16760 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
16770 20 73 73 2e 61 44 61 74 61 20 29 20 66 74 73 35   ss.aData ) fts5
16780 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
16790 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20 20 20  >rc, &ss);.     
167a0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
167b0 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 74  (&p->rc, &pPg->t
167c0 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c 20  erm, ss.term.n, 
167d0 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20  ss.term.p);.    
167e0 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e 69 43      pgno = ss.iC
167f0 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 66 74  hild;.        ft
16800 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26  s5NodeIterFree(&
16810 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ss);.      }.   
16820 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d   }.    if( pSeg-
16830 3e 6e 48 65 69 67 68 74 3d 3d 31 20 29 7b 0a 20  >nHeight==1 ){. 
16840 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 45       pWriter->nE
16850 6d 70 74 79 20 3d 20 70 53 65 67 2d 3e 70 67 6e  mpty = pSeg->pgn
16860 6f 4c 61 73 74 2d 31 3b 0a 20 20 20 20 7d 0a 20  oLast-1;.    }. 
16870 20 20 20 61 73 73 65 72 74 28 20 28 70 67 6e 6f     assert( (pgno
16880 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79  +pWriter->nEmpty
16890 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  )==pSeg->pgnoLas
168a0 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t );.  }.}../*.*
168b0 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
168c0 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
168d0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
168e0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
168f0 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
16900 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
16910 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
16920 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
16930 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
16940 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
16950 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
16960 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
16970 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
16980 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
16990 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
169a0 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
169b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
169c0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
169d0 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
169e0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
169f0 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66  f;.  memset(&buf
16a00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
16a10 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72 28  Buffer));.  for(
16a20 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
16a30 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  eg; i++){.    Ft
16a40 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
16a50 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
16a60 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ];.    if( pSeg-
16a70 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >pSeg==0 ){.    
16a80 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
16a90 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 67    }else if( pSeg
16aa0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
16ab0 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
16ac0 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20  pgnoLast = 0;.  
16ad0 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
16ae0 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20  pgnoFirst = 0;. 
16af0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16b00 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d  int iOff = pSeg-
16b10 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
16b20 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ;     /* Offset 
16b30 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61  on new first lea
16b40 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  f page */.      
16b50 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a  i64 iLeafRowid;.
16b60 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
16b70 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74  pData;.      int
16b80 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65   iId = pSeg->pSe
16b90 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
16ba0 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30   u8 aHdr[4] = {0
16bb0 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
16bc0 20 30 78 30 34 7d 3b 0a 0a 20 20 20 20 20 20 69   0x04};..      i
16bd0 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35  LeafRowid = FTS5
16be0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
16bf0 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20  Seg->iIdx, iId, 
16c00 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65  0, pSeg->iTermLe
16c10 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  afPgno);.      p
16c20 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
16c30 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ead(p, iLeafRowi
16c40 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  d);.      if( pD
16c50 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ata ){.        f
16c60 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62  ts5BufferZero(&b
16c70 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  uf);.        fts
16c80 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
16c90 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
16ca0 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61 48  sizeof(aHdr), aH
16cb0 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  dr);.        fts
16cc0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
16cd0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
16ce0 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b  , pSeg->term.n);
16cf0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
16d00 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
16d10 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67  ->rc, &buf, pSeg
16d20 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e  ->term.n, pSeg->
16d30 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20  term.p);.       
16d40 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
16d50 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
16d60 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20 69  uf, pData->n - i
16d70 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69  Off, &pData->p[i
16d80 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  Off]);.        f
16d90 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
16da0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70  Data);.        p
16db0 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46  Seg->pSeg->pgnoF
16dc0 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65  irst = pSeg->iTe
16dd0 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20  rmLeafPgno;.    
16de0 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c 65      fts5DataDele
16df0 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  te(p, FTS5_SEGME
16e00 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
16e10 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 31 29 2c  Idx, iId, 0, 1),
16e20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
16e30 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
16e40 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64  te(p, iLeafRowid
16e50 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b  , buf.p, buf.n);
16e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16e70 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
16e80 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a  ree(&buf);.}../*
16e90 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
16ea0 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67  id fts5IndexMerg
16eb0 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e  eLevel(.  Fts5In
16ec0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
16ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
16ee0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
16ef0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f10 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
16f20 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46  o work on */.  F
16f30 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
16f40 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f  truct,         /
16f50 2a 20 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e  * Stucture of in
16f60 64 65 78 20 69 49 64 78 20 2a 2f 0a 20 20 69 6e  dex iIdx */.  in
16f70 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20  t iLvl,         
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f90 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69   Level to read i
16fa0 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  nput from */.  i
16fb0 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20  nt *pnRem       
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fd0 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68  * Write up to th
16fe0 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c  is many output l
16ff0 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74  eaves */.){.  Ft
17000 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
17010 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
17020 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
17030 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
17040 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 20 3d  Level *pLvlOut =
17050 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
17060 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 46 74 73  l[iLvl+1];.  Fts
17070 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
17080 49 74 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Iter = 0;    /* 
17090 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64  Iterator to read
170a0 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20   input data */. 
170b0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 2a 70 6e 52   int nRem = *pnR
170c0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
170d0 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20   /* Output leaf 
170e0 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72  pages left to wr
170f0 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ite */.  int nIn
17100 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  put;            
17110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17120 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
17130 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65  ents */.  Fts5Se
17140 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
17150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
17160 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
17170 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
17180 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
17190 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e  /* Output segmen
171a0 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
171b0 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 52  r term;.  int bR
171c0 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72  equireDoclistTer
171d0 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f 63  m = 0;    /* Doc
171e0 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20  list terminator 
171f0 28 30 78 30 30 29 20 72 65 71 75 69 72 65 64 20  (0x00) required 
17200 2a 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74  */.  int bOldest
17210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17220 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17230 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
17240 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74  nt is the oldest
17250 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
17260 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
17270 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  vel );.  assert(
17280 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
17290 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
172a0 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20  memset(&writer, 
172b0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
172c0 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d  gWriter));.  mem
172d0 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
172e0 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
172f0 29 3b 0a 20 20 77 72 69 74 65 72 2e 69 49 64 78  );.  writer.iIdx
17300 20 3d 20 69 49 64 78 3b 0a 20 20 69 66 28 20 70   = iIdx;.  if( p
17310 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
17320 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f     assert( pLvlO
17330 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20  ut->nSeg>0 );.  
17340 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d    nInput = pLvl-
17350 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 66 74 73  >nMerge;.    fts
17360 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70 70  5WriteInitForApp
17370 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  end(p, &writer, 
17380 69 49 64 78 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e  iIdx, &pLvlOut->
17390 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53  aSeg[pLvlOut->nS
173a0 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53 65 67  eg-1]);.    pSeg
173b0 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
173c0 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
173d0 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1];.  }else{.   
173e0 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74   int iSegid = ft
173f0 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
17400 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  p, pStruct);.   
17410 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
17420 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c  , &writer, iIdx,
17430 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f   iSegid);..    /
17440 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65  * Add the new se
17450 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  gment to the out
17460 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
17470 20 69 66 28 20 69 4c 76 6c 2b 31 3d 3d 70 53 74   if( iLvl+1==pSt
17480 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 20 70  ruct->nLevel ) p
17490 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b  Struct->nLevel++
174a0 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  ;.    pSeg = &pL
174b0 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
174c0 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20  Out->nSeg];.    
174d0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b  pLvlOut->nSeg++;
174e0 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46  .    pSeg->pgnoF
174f0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53  irst = 1;.    pS
17500 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  eg->iSegid = iSe
17510 67 69 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  gid;..    /* Rea
17520 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c  d input from all
17530 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
17540 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
17550 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
17560 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62  l->nSeg;.  }.  b
17570 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75  Oldest = (pLvlOu
17580 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53  t->nSeg==1 && pS
17590 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69  truct->nLevel==i
175a0 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66 20 30 0a 66  Lvl+2);..#if 0.f
175b0 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
175c0 6d 65 72 67 69 6e 67 20 25 64 20 73 65 67 6d 65  merging %d segme
175d0 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65 6c 20 25  nts from level %
175e0 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20 69 4c 76  d!", nInput, iLv
175f0 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75  l);.fflush(stdou
17600 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f  t);.#endif..  fo
17610 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
17620 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 69  ew(p, pStruct, i
17630 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c  Idx, 0, 0, 0, iL
17640 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74  vl, nInput, &pIt
17650 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  er);.      fts5M
17660 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
17670 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  Iter)==0;.      
17680 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
17690 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
176a0 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53  ).  ){.    Fts5S
176b0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
176c0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
176d0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b  er->aFirst[1] ];
176e0 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49 74  .    Fts5ChunkIt
176f0 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20  er sPos;        
17700 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
17710 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f  erate through po
17720 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a  sition list */..
17730 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
17740 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
17750 74 65 6e 20 69 73 20 74 68 65 20 6f 6c 64 65 73  ten is the oldes
17760 74 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  t in the entire 
17770 69 6e 64 65 78 20 61 6e 64 0a 20 20 20 20 2a 2a  index and.    **
17780 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
17790 73 74 20 69 73 20 65 6d 70 74 79 20 28 69 2e 65  st is empty (i.e
177a0 2e 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 61  . the entry is a
177b0 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 29 2c   delete marker),
177c0 20 6e 6f 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79   no.    ** entry
177d0 20 6e 65 65 64 20 62 65 20 77 72 69 74 74 65 6e   need be written
177e0 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20   to the output. 
177f0 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e   */.    fts5Chun
17800 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
17810 67 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20 20 69  g, &sPos);.    i
17820 66 28 20 62 4f 6c 64 65 73 74 3d 3d 30 20 7c 7c  f( bOldest==0 ||
17830 20 73 50 6f 73 2e 6e 52 65 6d 3e 30 20 29 7b 0a   sPos.nRem>0 ){.
17840 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
17850 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
17860 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c  *pTerm = fts5Mul
17870 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
17880 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  , &nTerm);.     
17890 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d   if( nTerm!=term
178a0 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65  .n || memcmp(pTe
178b0 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72  rm, term.p, nTer
178c0 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m) ){.        if
178d0 28 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72  ( writer.nLeafWr
178e0 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20  itten>nRem ){.  
178f0 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e          fts5Chun
17900 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26 73 50  kIterRelease(&sP
17910 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  os);.          b
17920 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
17930 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
17940 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20   is a new term. 
17950 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f  Append a term to
17960 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
17970 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ent. */.        
17980 69 66 28 20 62 52 65 71 75 69 72 65 44 6f 63 6c  if( bRequireDocl
17990 69 73 74 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  istTerm ){.     
179a0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
179b0 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2c 20  pendZerobyte(p, 
179c0 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  &writer);.      
179d0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 74 73 35    }.        fts5
179e0 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
179f0 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72  p, &writer, nTer
17a00 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
17a10 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
17a20 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20  (&p->rc, &term, 
17a30 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
17a40 20 20 20 20 20 20 20 62 52 65 71 75 69 72 65 44         bRequireD
17a50 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 31 3b 0a  oclistTerm = 1;.
17a60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
17a70 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f 77  * Append the row
17a80 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  id to the output
17a90 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72   */.      fts5Wr
17aa0 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70  iteAppendRowid(p
17ab0 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d  , &writer, fts5M
17ac0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
17ad0 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ter));..      /*
17ae0 20 43 6f 70 79 20 74 68 65 20 70 6f 73 69 74 69   Copy the positi
17af0 6f 6e 20 6c 69 73 74 20 66 72 6f 6d 20 69 6e 70  on list from inp
17b00 75 74 20 74 6f 20 6f 75 74 70 75 74 20 2a 2f 0a  ut to output */.
17b10 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
17b20 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28  ppendPoslistInt(
17b30 70 2c 20 26 77 72 69 74 65 72 2c 20 73 50 6f 73  p, &writer, sPos
17b40 2e 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20 66 6f  .nRem);.      fo
17b50 72 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b 20 21 66  r(/* noop */; !f
17b60 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28  ts5ChunkIterEof(
17b70 70 2c 20 26 73 50 6f 73 29 3b 20 66 74 73 35 43  p, &sPos); fts5C
17b80 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20  hunkIterNext(p, 
17b90 26 73 50 6f 73 29 29 7b 0a 20 20 20 20 20 20 20  &sPos)){.       
17ba0 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
17bb0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f         while( iO
17bc0 66 66 3c 73 50 6f 73 2e 6e 20 29 7b 0a 20 20 20  ff<sPos.n ){.   
17bd0 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 3b         int iVal;
17be0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
17bf0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
17c00 73 50 6f 73 2e 70 5b 69 4f 66 66 5d 2c 20 69 56  sPos.p[iOff], iV
17c10 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  al);.          f
17c20 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
17c30 73 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72 69  slistInt(p, &wri
17c40 74 65 72 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  ter, iVal);.    
17c50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17c60 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 43 68 75    }..    fts5Chu
17c70 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26 73  nkIterRelease(&s
17c80 50 6f 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Pos);.  }..  /* 
17c90 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20 6c  Flush the last l
17ca0 65 61 66 20 70 61 67 65 20 74 6f 20 64 69 73 6b  eaf page to disk
17cb0 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  . Set the output
17cc0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
17cd0 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20  height.  ** and 
17ce0 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  last leaf page n
17cf0 75 6d 62 65 72 20 61 74 20 74 68 65 20 73 61 6d  umber at the sam
17d00 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74  e time.  */.  ft
17d10 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
17d20 20 26 77 72 69 74 65 72 2c 20 26 70 53 65 67 2d   &writer, &pSeg-
17d30 3e 6e 48 65 69 67 68 74 2c 20 26 70 53 65 67 2d  >nHeight, &pSeg-
17d40 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69  >pgnoLast);..  i
17d50 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
17d60 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 7b  Eof(p, pIter) ){
17d70 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
17d80 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
17d90 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
17da0 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  s from the %_dat
17db0 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66  a table */.    f
17dc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74  or(i=0; i<nInput
17dd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
17de0 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
17df0 65 6e 74 28 70 2c 20 69 49 64 78 2c 20 70 4c 76  ent(p, iIdx, pLv
17e00 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69  l->aSeg[i].iSegi
17e10 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
17e20 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64  * Remove the red
17e30 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20  undant segments 
17e40 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c  from the input l
17e50 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20  evel */.    if( 
17e60 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70  pLvl->nSeg!=nInp
17e70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
17e80 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nMove = (pLvl->n
17e90 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20  Seg - nInput) * 
17ea0 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
17eb0 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
17ec0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c      memmove(pLvl
17ed0 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61  ->aSeg, &pLvl->a
17ee0 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f  Seg[nInput], nMo
17ef0 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ve);.    }.    p
17f00 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e  Lvl->nSeg -= nIn
17f10 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  put;.    pLvl->n
17f20 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69  Merge = 0;.    i
17f30 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  f( pSeg->pgnoLas
17f40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  t==0 ){.      pL
17f50 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20  vlOut->nSeg--;. 
17f60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
17f70 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e    assert( pSeg->
17f80 6e 48 65 69 67 68 74 3e 30 20 26 26 20 70 53 65  nHeight>0 && pSe
17f90 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b  g->pgnoLast>0 );
17fa0 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67  .    fts5TrimSeg
17fb0 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b  ments(p, pIter);
17fc0 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
17fd0 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a  e = nInput;.  }.
17fe0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
17ff0 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Free(p, pIter);.
18000 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
18010 28 26 74 65 72 6d 29 3b 0a 20 20 2a 70 6e 52 65  (&term);.  *pnRe
18020 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61  m -= writer.nLea
18030 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a  fWritten;.}../*.
18040 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c  ** A total of nL
18050 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f  eaf leaf pages o
18060 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20  f data has just 
18070 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20  been flushed to 
18080 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67  a level-0.** seg
18090 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 69  ments in index i
180a0 49 64 78 20 77 69 74 68 20 73 74 72 75 63 74 75  Idx with structu
180b0 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69 73  re pStruct. This
180c0 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65   function update
180d0 73 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 2d 63  s the.** write-c
180e0 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67  ounter according
180f0 6c 79 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ly and, if neces
18100 73 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69  sary, performs i
18110 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
18120 0a 2a 2a 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20  .** work..**.** 
18130 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
18140 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
18150 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
18160 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
18170 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
18180 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
18190 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
181a0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
181b0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 57 6f 72  oid fts5IndexWor
181c0 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
181d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
181e0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
181f0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
18200 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18220 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72   /* Index to wor
18230 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74  k on */.  Fts5St
18240 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
18250 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ,         /* Cur
18260 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
18270 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
18280 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   nLeaf          
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
182a0 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
182b0 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69   leaves just wri
182c0 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  tten */.){.  i64
182d0 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
182f0 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
18300 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a   write-counter *
18310 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20  /.  int nWork;  
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18330 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18340 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20   work-quanta to 
18350 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74  perform */.  int
18360 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18380 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
18390 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
183a0 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55 70 64 61  te */..  /* Upda
183b0 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  te the write-cou
183c0 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e  nter. While doin
183d0 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e  g so, set nWork.
183e0 20 2a 2f 0a 20 20 6e 57 72 69 74 65 20 3d 20 70   */.  nWrite = p
183f0 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
18400 75 6e 74 65 72 3b 0a 20 20 6e 57 6f 72 6b 20 3d  unter;.  nWork =
18410 20 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61   ((nWrite + nLea
18420 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  f) / p->nWorkUni
18430 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70  t) - (nWrite / p
18440 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 3b 0a 20 20  ->nWorkUnit);.  
18450 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
18460 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b  ounter += nLeaf;
18470 0a 20 20 6e 52 65 6d 20 3d 20 70 2d 3e 6e 57 6f  .  nRem = p->nWo
18480 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
18490 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
184a0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d  ;..  while( nRem
184b0 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  >0 ){.    int iL
184c0 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
184d0 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
184e0 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
184f0 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  ls */.    int iB
18500 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20  estLvl = 0;     
18510 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
18520 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74  ffering the most
18530 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
18540 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74  */.    int nBest
18550 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
18560 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18570 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
18580 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
18590 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73  .    /* Set iBes
185a0 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
185b0 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
185c0 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
185d0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
185e0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
185f0 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
18600 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
18610 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
18620 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
18630 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
18640 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
18650 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
18660 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
18670 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
18680 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
18690 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
186a0 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
186b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73  ;.          nBes
186c0 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
186d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
186e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
186f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76   }.      if( pLv
18700 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b  l->nSeg>nBest ){
18710 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d  .        nBest =
18720 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20   pLvl->nSeg;.   
18730 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
18740 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iLvl;.      }.  
18750 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
18760 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
18770 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
18780 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
18790 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
187a0 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c  DEBUG.    for(iL
187b0 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26  vl=0; nBest==0 &
187c0 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
187d0 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
187e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
187f0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
18800 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
18810 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
18820 20 20 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 6e    if( nBest<p->n
18830 4d 69 6e 4d 65 72 67 65 20 26 26 20 70 53 74 72  MinMerge && pStr
18840 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73  uct->aLevel[iBes
18850 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20  tLvl].nMerge==0 
18860 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 66 74 73  ) break;.    fts
18870 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
18880 28 70 2c 20 69 49 64 78 2c 20 70 53 74 72 75 63  (p, iIdx, pStruc
18890 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52  t, iBestLvl, &nR
188a0 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  em);.    assert(
188b0 20 6e 52 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 72   nRem==0 || p->r
188c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
188d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75    }.}../*.** Flu
188e0 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
188f0 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  of in-memory has
18900 68 20 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f  h table iHash to
18910 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a   a new level-0 .
18920 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69  ** segment on di
18930 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20  sk. Also update 
18940 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
18950 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  g structure reco
18960 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rd..**.** If an 
18970 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
18980 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
18990 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
189a0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
189b0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
189c0 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
189d0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
189e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
189f0 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46  s5FlushOneHash(F
18a00 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
18a10 20 69 48 61 73 68 2c 20 69 6e 74 20 2a 70 6e 4c   iHash, int *pnL
18a20 65 61 66 29 7b 0a 20 20 46 74 73 35 53 74 72 75  eaf){.  Fts5Stru
18a30 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
18a40 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
18a50 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
18a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18a70 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70    /* Last leaf p
18a80 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
18a90 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  gment */..  /* O
18aa0 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
18ab0 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73  e to the index s
18ac0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
18ad0 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
18ae0 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20  ent-id.  ** for 
18af0 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20  the new level-0 
18b00 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70  segment.  */.  p
18b10 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
18b20 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69 48  uctureRead(p, iH
18b30 61 73 68 29 3b 0a 20 20 69 53 65 67 69 64 20 3d  ash);.  iSegid =
18b40 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
18b50 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
18b60 0a 20 20 69 66 28 20 69 53 65 67 69 64 20 29 7b  .  if( iSegid ){
18b70 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69 74  .    Fts5SegWrit
18b80 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 46  er writer;.    F
18b90 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
18ba0 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 46 74  t *pList;.    Ft
18bb0 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  s5PendingDoclist
18bc0 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 46 74 73   *pIter;.    Fts
18bd0 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20  5PendingDoclist 
18be0 2a 70 4e 65 78 74 3b 0a 0a 20 20 20 20 46 74 73  *pNext;..    Fts
18bf0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
18c00 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65  t *pSeg;   /* Ne
18c10 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e  w segment within
18c20 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20   pStruct */.    
18c30 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20  int nHeight;    
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c50 20 48 65 69 67 68 74 20 6f 66 20 6e 65 77 20 73   Height of new s
18c60 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f  egment b-tree */
18c70 0a 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 66 74  ..    pList = ft
18c80 73 35 50 65 6e 64 69 6e 67 4c 69 73 74 28 70 2c  s5PendingList(p,
18c90 20 69 48 61 73 68 29 3b 0a 20 20 20 20 61 73 73   iHash);.    ass
18ca0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
18cb0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
18cc0 4b 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  K );.    fts5Wri
18cd0 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
18ce0 72 2c 20 69 48 61 73 68 2c 20 69 53 65 67 69 64  r, iHash, iSegid
18cf0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70 49 74 65  );..    for(pIte
18d00 72 3d 70 4c 69 73 74 3b 20 70 49 74 65 72 3b 20  r=pList; pIter; 
18d10 70 49 74 65 72 3d 70 4e 65 78 74 29 7b 0a 20 20  pIter=pNext){.  
18d20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 74 65      pNext = pIte
18d30 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
18d40 66 74 73 35 57 72 69 74 65 50 65 6e 64 69 6e 67  fts5WritePending
18d50 44 6f 63 6c 69 73 74 28 70 2c 20 26 77 72 69 74  Doclist(p, &writ
18d60 65 72 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  er, pIter);.    
18d70 20 20 66 74 73 35 46 72 65 65 50 65 6e 64 69 6e    fts5FreePendin
18d80 67 44 6f 63 6c 69 73 74 28 70 49 74 65 72 29 3b  gDoclist(pIter);
18d90 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 57  .    }.    fts5W
18da0 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77  riteFinish(p, &w
18db0 72 69 74 65 72 2c 20 26 6e 48 65 69 67 68 74 2c  riter, &nHeight,
18dc0 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20   &pgnoLast);..  
18dd0 20 20 2f 2a 20 45 64 69 74 20 74 68 65 20 46 74    /* Edit the Ft
18de0 73 35 53 74 72 75 63 74 75 72 65 20 61 6e 64 20  s5Structure and 
18df0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
18e00 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a   the database. *
18e10 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  /.    if( pStruc
18e20 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 20 70  t->nLevel==0 ) p
18e30 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 3d  Struct->nLevel =
18e40 20 31 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26   1;.    pSeg = &
18e50 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
18e60 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74  0].aSeg[ pStruct
18e70 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67  ->aLevel[0].nSeg
18e80 2b 2b 20 5d 3b 0a 20 20 20 20 70 53 65 67 2d 3e  ++ ];.    pSeg->
18e90 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
18ea0 0a 20 20 20 20 70 53 65 67 2d 3e 6e 48 65 69 67  .    pSeg->nHeig
18eb0 68 74 20 3d 20 6e 48 65 69 67 68 74 3b 0a 20 20  ht = nHeight;.  
18ec0 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
18ed0 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d  t = 1;.    pSeg-
18ee0 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f  >pgnoLast = pgno
18ef0 4c 61 73 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  Last;.  }..  fts
18f00 35 49 6e 64 65 78 57 6f 72 6b 28 70 2c 20 69 48  5IndexWork(p, iH
18f10 61 73 68 2c 20 70 53 74 72 75 63 74 2c 20 70 67  ash, pStruct, pg
18f20 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 53  noLast);.  fts5S
18f30 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
18f40 20 69 48 61 73 68 2c 20 70 53 74 72 75 63 74 29   iHash, pStruct)
18f50 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
18f60 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
18f70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  );.}../*.** Flus
18f80 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  h any data store
18f90 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
18fa0 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74  ry hash tables t
18fb0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
18fc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18fd0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74  ts5IndexFlush(Ft
18fe0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
18ff0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
19000 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
19010 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19030 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
19040 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e  erate through in
19050 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  dexes */.  int n
19060 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20 20 20  Leaf = 0;       
19070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19080 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 77  mber of leaves w
19090 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ritten */..  /* 
190a0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
190b0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64 20  already occured 
190c0 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
190d0 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70  o-op. */.  if( p
190e0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
190f0 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  || p->nPendingDa
19100 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ta==0 ) return;.
19110 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 48 61    assert( p->aHa
19120 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c 75 73  sh );..  /* Flus
19130 68 20 74 68 65 20 74 65 72 6d 73 20 61 6e 64 20  h the terms and 
19140 65 61 63 68 20 70 72 65 66 69 78 20 69 6e 64 65  each prefix inde
19150 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 66  x to disk */.  f
19160 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66  or(i=0; i<=pConf
19170 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b  ig->nPrefix; i++
19180 29 7b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68  ){.    fts5Flush
19190 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c 20 26 6e  OneHash(p, i, &n
191a0 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Leaf);.  }.  p->
191b0 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
191c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
191d0 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ate that all sub
191e0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
191f0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
19200 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e  xWrite() pertain
19210 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d  .** to the docum
19220 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69  ent with rowid i
19230 52 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Rowid..*/.void s
19240 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42  qlite3Fts5IndexB
19250 65 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e  eginWrite(Fts5In
19260 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
19270 69 64 29 7b 0a 20 20 69 66 28 20 69 52 6f 77 69  id){.  if( iRowi
19280 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  d<=p->iWriteRowi
19290 64 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64  d ){.    fts5Ind
192a0 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a  exFlush(p);.  }.
192b0 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
192c0 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a   = iRowid;.}../*
192d0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20  .** Commit data 
192e0 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
192f0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
19300 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a  Sync(Fts5Index *
19310 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  p, int bCommit){
19320 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
19330 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d  h(p);.  if( bCom
19340 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52  mit ) fts5CloseR
19350 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75  eader(p);.  retu
19360 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
19370 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64  ** Discard any d
19380 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
19390 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
193a0 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20   tables. Do not 
193b0 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74  write it.** to t
193c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
193d0 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  itionally, assum
193e0 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  e that the conte
193f0 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
19400 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68  a.** table may h
19410 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64  ave changed on d
19420 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d  isk. So any in-m
19430 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20  emory caches of 
19440 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72  %_data .** recor
19450 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
19460 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  idated..*/.int s
19470 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
19480 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65  ollback(Fts5Inde
19490 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f  x *p){.  fts5Clo
194a0 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66  seReader(p);.  f
194b0 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
194c0 61 74 61 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ata(p);.  return
194d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
194e0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
194f0 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
19500 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65  . If the bCreate
19510 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
19520 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64  e, create.** and
19530 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
19540 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74  underlying %_dat
19550 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
19560 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
19570 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
19580 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
19590 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
195a0 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77  TE_OK..** Otherw
195b0 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ise, set *pp to 
195c0 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20  NULL and return 
195d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
195e0 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
195f0 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
19600 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  n(.  Fts5Config 
19610 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74  *pConfig, .  int
19620 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73   bCreate, .  Fts
19630 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63  5Index **pp,.  c
19640 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
19650 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19660 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  _OK;.  Fts5Index
19670 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
19680 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
19690 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d  ject */..  *pp =
196a0 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a   p = (Fts5Index*
196b0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
196c0 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
196d0 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72  ));.  if( !p ) r
196e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
196f0 45 4d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c  EM;..  memset(p,
19700 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49   0, sizeof(Fts5I
19710 6e 64 65 78 29 29 3b 0a 20 20 70 2d 3e 70 43 6f  ndex));.  p->pCo
19720 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a  nfig = pConfig;.
19730 20 20 70 2d 3e 70 67 73 7a 20 3d 20 31 30 30 30    p->pgsz = 1000
19740 3b 0a 20 20 70 2d 3e 6e 4d 69 6e 4d 65 72 67 65  ;.  p->nMinMerge
19750 20 3d 20 46 54 53 35 5f 4d 49 4e 5f 4d 45 52 47   = FTS5_MIN_MERG
19760 45 3b 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  E;.  p->nWorkUni
19770 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e  t = FTS5_WORK_UN
19780 49 54 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65 6e  IT;.  p->nMaxPen
19790 64 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a  dingData = 1024*
197a0 31 30 32 34 3b 0a 20 20 70 2d 3e 7a 44 61 74 61  1024;.  p->zData
197b0 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tbl = sqlite3_mp
197c0 72 69 6e 74 66 28 22 25 73 5f 64 61 74 61 22 2c  rintf("%s_data",
197d0 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29   pConfig->zName)
197e0 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61  ;.  if( p->zData
197f0 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Tbl==0 ){.    rc
19800 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
19810 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43 72  .  }else if( bCr
19820 65 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  eate ){.    int 
19830 69 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  i;.    Fts5Struc
19840 74 75 72 65 20 73 3b 0a 20 20 20 20 72 63 20 3d  ture s;.    rc =
19850 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61   sqlite3Fts5Crea
19860 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20  teTable(.       
19870 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22   pConfig, "data"
19880 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52  , "id INTEGER PR
19890 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b  IMARY KEY, block
198a0 20 42 4c 4f 42 22 2c 20 70 7a 45 72 72 0a 20 20   BLOB", pzErr.  
198b0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
198c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
198d0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30      memset(&s, 0
198e0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
198f0 75 63 74 75 72 65 29 29 3b 0a 20 20 20 20 20 20  ucture));.      
19900 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66  for(i=0; i<pConf
19910 69 67 2d 3e 6e 50 72 65 66 69 78 2b 31 3b 20 69  ig->nPrefix+1; i
19920 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ++){.        fts
19930 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
19940 70 2c 20 69 2c 20 26 73 29 3b 0a 20 20 20 20 20  p, i, &s);.     
19950 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d   }.      rc = p-
19960 3e 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  >rc;.    }.    s
19970 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
19980 65 74 41 76 65 72 61 67 65 73 28 70 2c 20 28 63  etAverages(p, (c
19990 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b  onst u8*)"", 0);
199a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29  .  }..  if( rc )
199b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
199c0 35 49 6e 64 65 78 43 6c 6f 73 65 28 70 2c 20 30  5IndexClose(p, 0
199d0 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  );.    *pp = 0;.
199e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
199f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
19a00 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20  a handle opened 
19a10 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
19a20 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ll to sqlite3Fts
19a30 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f  5IndexOpen()..*/
19a40 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
19a50 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49  IndexClose(Fts5I
19a60 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44 65  ndex *p, int bDe
19a70 73 74 72 6f 79 29 7b 0a 20 20 69 6e 74 20 72 63  stroy){.  int rc
19a80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19a90 69 66 28 20 62 44 65 73 74 72 6f 79 20 29 7b 0a  if( bDestroy ){.
19aa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19ab0 46 74 73 35 44 72 6f 70 54 61 62 6c 65 28 70 2d  Fts5DropTable(p-
19ac0 3e 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22  >pConfig, "data"
19ad0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
19ae0 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
19af0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
19b00 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29  lize(p->pWriter)
19b10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
19b20 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72  lize(p->pDeleter
19b30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
19b40 65 28 70 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73  e(p->aHash);.  s
19b50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
19b60 44 61 74 61 54 62 6c 29 3b 0a 20 20 73 71 6c 69  DataTbl);.  sqli
19b70 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
19b80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19b90 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70  ** Return a simp
19ba0 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  le checksum valu
19bb0 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61  e based on the a
19bc0 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  rguments..*/.sta
19bd0 74 69 63 20 75 36 34 20 66 74 73 35 49 6e 64 65  tic u64 fts5Inde
19be0 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69  xEntryCksum(.  i
19bf0 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e  64 iRowid, .  in
19c00 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69  t iCol, .  int i
19c10 50 6f 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Pos, .  const ch
19c20 61 72 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69 6e  ar *pTerm, .  in
19c30 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74  t nTerm.){.  int
19c40 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20   i;.  u64 ret = 
19c50 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d  iRowid;.  ret +=
19c60 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c   (ret<<3) + iCol
19c70 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
19c80 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f  <3) + iPos;.  fo
19c90 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
19ca0 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74  i++) ret += (ret
19cb0 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b  <<3) + pTerm[i];
19cc0 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
19cd0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74  ../*.** Calculat
19ce0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
19cf0 68 65 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20  hecksum that is 
19d00 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69  the XOR of the i
19d10 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68  ndex entry.** ch
19d20 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e  ecksum of all en
19d30 74 72 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64  tries that would
19d40 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79   be generated by
19d50 20 74 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69   the token speci
19d60 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66  fied.** by the f
19d70 69 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73  inal 5 arguments
19d80 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  ..*/.u64 sqlite3
19d90 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a  Fts5IndexCksum(.
19da0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
19db0 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20  onfig,          
19dc0 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
19dd0 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  on object */.  i
19de0 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e00 2a 20 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20  * Document term 
19e10 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20  appears in */.  
19e20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61  /* Column term a
19e50 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69  ppears in */.  i
19e60 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e80 2a 20 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20  * Position term 
19e90 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20  appears in */.  
19ea0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72  const char *pTer
19eb0 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20  m, int nTerm    
19ec0 2f 2a 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20  /* Term at iPos 
19ed0 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20  */.){.  u64 ret 
19ee0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
19ef0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
19f00 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  n value */.  int
19f10 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f30 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
19f40 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f  rough indexes */
19f50 0a 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20  ..  for(iIdx=0; 
19f60 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
19f70 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
19f80 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 28 69  .    int n = ((i
19f90 49 64 78 3d 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx==pConfig->nP
19fa0 72 65 66 69 78 29 20 3f 20 6e 54 65 72 6d 20 3a  refix) ? nTerm :
19fb0 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
19fc0 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66  x[iIdx]);.    if
19fd0 28 20 6e 3c 3d 6e 54 65 72 6d 20 29 7b 0a 20 20  ( n<=nTerm ){.  
19fe0 20 20 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49      ret ^= fts5I
19ff0 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69  ndexEntryCksum(i
1a000 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
1a010 73 2c 20 70 54 65 72 6d 2c 20 6e 29 3b 0a 20 20  s, pTerm, n);.  
1a020 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1a030 6e 20 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  n ret;.}..static
1a040 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49   void fts5BtreeI
1a050 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
1a060 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20  ndex *p, .  int 
1a070 69 49 64 78 2c 0a 20 20 46 74 73 35 53 74 72 75  iIdx,.  Fts5Stru
1a080 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
1a090 65 67 2c 20 0a 20 20 46 74 73 35 42 74 72 65 65  eg, .  Fts5Btree
1a0a0 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20  Iter *pIter.){. 
1a0b0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
1a0c0 74 20 69 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  t i;.  nByte = s
1a0d0 69 7a 65 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76  izeof(pIter->aLv
1a0e0 6c 5b 30 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e  l[0]) * (pSeg->n
1a0f0 48 65 69 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d  Height-1);.  mem
1a100 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
1a110 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
1a120 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70   pIter->nLvl = p
1a130 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 0a  Seg->nHeight-1;.
1a140 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20    pIter->iIdx = 
1a150 69 49 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 70  iIdx;.  pIter->p
1a160 20 3d 20 70 3b 0a 20 20 70 49 74 65 72 2d 3e 70   = p;.  pIter->p
1a170 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 69 66  Seg = pSeg;.  if
1a180 28 20 6e 42 79 74 65 20 26 26 20 70 2d 3e 72 63  ( nByte && p->rc
1a190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a1a0 20 20 20 70 49 74 65 72 2d 3e 61 4c 76 6c 20 3d     pIter->aLvl =
1a1b0 20 28 46 74 73 35 42 74 72 65 65 49 74 65 72 4c   (Fts5BtreeIterL
1a1c0 65 76 65 6c 2a 29 66 74 73 35 49 64 78 4d 61 6c  evel*)fts5IdxMal
1a1d0 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20  loc(p, nByte);. 
1a1e0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d   }.  for(i=0; p-
1a1f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1a200 26 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  & i<pIter->nLvl;
1a210 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69   i++){.    i64 i
1a220 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
1a230 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c  MENT_ROWID(iIdx,
1a240 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69   pSeg->iSegid, i
1a250 2b 31 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35  +1, 1);.    Fts5
1a260 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
1a270 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e   pIter->aLvl[i].
1a280 70 44 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20  pData = pData = 
1a290 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1a2a0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  iRowid);.    if(
1a2b0 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
1a2c0 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
1a2d0 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61  (pData->p, pData
1a2e0 2d 3e 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76  ->n, &pIter->aLv
1a2f0 6c 5b 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20  l[i].s);.    }. 
1a300 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d   }..  if( pIter-
1a310 3e 6e 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72  >nLvl==0 || p->r
1a320 63 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  c ){.    pIter->
1a330 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49  bEof = 1;.    pI
1a340 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65  ter->iLeaf = pSe
1a350 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d  g->pgnoLast;.  }
1a360 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
1a370 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d  >nEmpty = pIter-
1a380 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74  >aLvl[0].s.nEmpt
1a390 79 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  y;.    pIter->iL
1a3a0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  eaf = pIter->aLv
1a3b0 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20  l[0].s.iChild;. 
1a3c0 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78     pIter->bDlidx
1a3d0 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30   = pIter->aLvl[0
1a3e0 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a  ].s.bDlidx;.  }.
1a3f0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1a400 74 73 35 42 74 72 65 65 49 74 65 72 4e 65 78 74  ts5BtreeIterNext
1a410 28 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a  (Fts5BtreeIter *
1a420 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e  pIter){.  Fts5In
1a430 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e  dex *p = pIter->
1a440 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  p;.  int i;..  a
1a450 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45  ssert( pIter->bE
1a460 6f 66 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  of==0 && pIter->
1a470 61 4c 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20  aLvl[0].s.aData 
1a480 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1a490 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70  pIter->nLvl && p
1a4a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
1a4b0 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42   i++){.    Fts5B
1a4c0 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70  treeIterLevel *p
1a4d0 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
1a4e0 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e  vl[i];.    fts5N
1a4f0 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e  odeIterNext(&p->
1a500 72 63 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20  rc, &pLvl->s);. 
1a510 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61     if( pLvl->s.a
1a520 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74  Data ){.      ft
1a530 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1a540 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
1a550 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e  , pLvl->s.term.n
1a560 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70  , pLvl->s.term.p
1a570 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a590 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65   fts5NodeIterFre
1a5a0 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  e(&pLvl->s);.   
1a5b0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
1a5c0 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b  se(pLvl->pData);
1a5d0 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61  .      pLvl->pDa
1a5e0 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ta = 0;.    }.  
1a5f0 7d 0a 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72  }.  if( i==pIter
1a600 2d 3e 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20  ->nLvl || p->rc 
1a610 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  ){.    pIter->bE
1a620 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
1a630 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20  .    int iSegid 
1a640 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69  = pIter->pSeg->i
1a650 53 65 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69  Segid;.    for(i
1a660 2d 2d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  --; i>=0; i--){.
1a670 20 20 20 20 20 20 46 74 73 35 42 74 72 65 65 49        Fts5BtreeI
1a680 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  terLevel *pLvl =
1a690 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d   &pIter->aLvl[i]
1a6a0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  ;.      i64 iRow
1a6b0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1a6c0 54 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69  T_ROWID(pIter->i
1a6d0 49 64 78 2c 69 53 65 67 69 64 2c 69 2b 31 2c 70  Idx,iSegid,i+1,p
1a6e0 4c 76 6c 5b 31 5d 2e 73 2e 69 43 68 69 6c 64 29  Lvl[1].s.iChild)
1a6f0 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
1a700 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
1a710 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ad(p, iRowid);. 
1a720 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
1a730 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
1a740 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
1a750 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 2c  (pLvl->pData->p,
1a760 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 6e 2c   pLvl->pData->n,
1a770 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20   &pLvl->s);.    
1a780 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1a790 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d   pIter->nEmpty =
1a7a0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
1a7b0 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 70 49 74 65  s.nEmpty;.  pIte
1a7c0 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65  r->bDlidx = pIte
1a7d0 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c  r->aLvl[0].s.bDl
1a7e0 69 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  idx;.  pIter->iL
1a7f0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  eaf = pIter->aLv
1a800 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20  l[0].s.iChild;. 
1a810 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1a820 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
1a830 65 72 2d 3e 62 45 6f 66 20 29 3b 0a 7d 0a 0a 73  er->bEof );.}..s
1a840 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
1a850 74 72 65 65 49 74 65 72 46 72 65 65 28 46 74 73  treeIterFree(Fts
1a860 35 42 74 72 65 65 49 74 65 72 20 2a 70 49 74 65  5BtreeIter *pIte
1a870 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
1a880 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1a890 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
1a8a0 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65   Fts5BtreeIterLe
1a8b0 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  vel *pLvl = &pIt
1a8c0 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  er->aLvl[i];.   
1a8d0 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65   fts5NodeIterFre
1a8e0 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  e(&pLvl->s);.   
1a8f0 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
1a900 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61   ){.      fts5Da
1a910 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
1a920 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c  pData);.      pL
1a930 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20  vl->pData = 0;. 
1a940 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1a950 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
1a960 4c 76 6c 29 3b 0a 20 20 66 74 73 35 42 75 66 66  Lvl);.  fts5Buff
1a970 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74  erFree(&pIter->t
1a980 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  erm);.}../*.** T
1a990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a9a0 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e  purely an intern
1a9b0 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73  al test. It does
1a9c0 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
1a9d0 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74  to .** FTS funct
1a9e0 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65  ionality, or eve
1a9f0 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
1aa00 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61  check, in any wa
1aa10 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  y..**.** Instead
1aa20 2c 20 69 74 20 74 65 73 74 73 20 74 68 61 74 20  , it tests that 
1aa30 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
1aa40 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69  pgno/rowid combi
1aa50 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20  nations are .** 
1aa60 76 69 73 69 74 65 64 20 72 65 67 61 72 64 6c 65  visited regardle
1aa70 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
1aa80 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
1aa90 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1aaa0 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69 49 64 78  rameters.** iIdx
1aab0 2f 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73  /iSegid/iLeaf is
1aac0 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72   iterated in for
1aad0 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73 65  wards or reverse
1aae0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 69 66 64 65   order..*/.#ifde
1aaf0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
1ab00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
1ab10 6c 69 64 78 49 74 65 72 54 65 73 74 52 65 76 65  lidxIterTestReve
1ab20 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rse(.  Fts5Index
1ab30 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78   *p, .  int iIdx
1ab40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ab50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1ab60 20 74 6f 20 6c 6f 61 64 20 64 6f 63 6c 69 73 74   to load doclist
1ab70 2d 69 6e 64 65 78 20 66 72 6f 6d 20 2a 2f 0a 20  -index from */. 
1ab80 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74   /* Segment id t
1abb0 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o load from */. 
1abc0 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20   int iLeaf      
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74   /* Load doclist
1abf0 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20  -index for this 
1ac00 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  leaf */.){.  Fts
1ac10 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
1ac20 64 78 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 6b  dx = 0;.  i64 ck
1ac30 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 69 36 34  sum1 = 13;.  i64
1ac40 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20   cksum2 = 13;.. 
1ac50 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74   for(fts5DlidxIt
1ac60 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64  erInit(p, 0, iId
1ac70 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  x, iSegid, iLeaf
1ac80 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  , &pDlidx);.    
1ac90 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
1aca0 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
1acb0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
1acc0 78 49 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78  xIterNext(pDlidx
1acd0 29 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ).  ){.    asser
1ace0 74 28 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66  t( pDlidx->iLeaf
1acf0 50 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20  Pgno>iLeaf );.  
1ad00 20 20 63 6b 73 75 6d 31 20 3d 20 28 63 6b 73 75    cksum1 = (cksu
1ad10 6d 31 20 5e 20 28 20 28 69 36 34 29 28 70 44 6c  m1 ^ ( (i64)(pDl
1ad20 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20  idx->iLeafPgno) 
1ad30 3c 3c 20 33 32 20 29 29 3b 0a 20 20 20 20 63 6b  << 32 ));.    ck
1ad40 73 75 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e  sum1 = (cksum1 ^
1ad50 20 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29   pDlidx->iRowid)
1ad60 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64  ;.  }.  fts5Dlid
1ad70 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
1ad80 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b  );.  pDlidx = 0;
1ad90 0a 0a 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64  ..  for(fts5Dlid
1ada0 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20  xIterInit(p, 1, 
1adb0 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c  iIdx, iSegid, iL
1adc0 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20  eaf, &pDlidx);. 
1add0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1ade0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
1adf0 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ==0;.      fts5D
1ae00 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 44 6c  lidxIterPrev(pDl
1ae10 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 61 73  idx).  ){.    as
1ae20 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 69 4c  sert( pDlidx->iL
1ae30 65 61 66 50 67 6e 6f 3e 69 4c 65 61 66 20 29 3b  eafPgno>iLeaf );
1ae40 0a 20 20 20 20 63 6b 73 75 6d 32 20 3d 20 28 63  .    cksum2 = (c
1ae50 6b 73 75 6d 32 20 5e 20 28 20 28 69 36 34 29 28  ksum2 ^ ( (i64)(
1ae60 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e  pDlidx->iLeafPgn
1ae70 6f 29 20 3c 3c 20 33 32 20 29 29 3b 0a 20 20 20  o) << 32 ));.   
1ae80 20 63 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d   cksum2 = (cksum
1ae90 32 20 5e 20 70 44 6c 69 64 78 2d 3e 69 52 6f 77  2 ^ pDlidx->iRow
1aea0 69 64 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  id);.  }.  fts5D
1aeb0 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
1aec0 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
1aed0 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
1aee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1aef0 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20  ksum1!=cksum2 ) 
1af00 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1af10 52 55 50 54 3b 20 0a 7d 0a 23 65 6c 73 65 0a 23  RUPT; .}.#else.#
1af20 20 64 65 66 69 6e 65 20 66 74 73 35 44 6c 69 64   define fts5Dlid
1af30 78 49 74 65 72 54 65 73 74 52 65 76 65 72 73 65  xIterTestReverse
1af40 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  (w,x,y,z).#endif
1af50 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1af60 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
1af70 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20  CheckSegment(.  
1af80 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afa0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1afb0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1afc0 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1afe0 6e 64 65 78 20 74 68 61 74 20 70 53 65 67 20 69  ndex that pSeg i
1aff0 73 20 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20  s a part of */. 
1b000 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
1b010 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20  gment *pSeg     
1b020 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63   /* Segment to c
1b030 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f  heck internal co
1b040 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a  nsistency */.){.
1b050 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20    Fts5BtreeIter 
1b060 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
1b070 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
1b080 72 61 74 65 20 74 68 72 6f 75 67 68 20 62 2d 74  rate through b-t
1b090 72 65 65 20 68 69 65 72 61 72 63 68 79 20 2a 2f  ree hierarchy */
1b0a0 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74  ..  /* Iterate t
1b0b0 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65  hrough the b-tre
1b0c0 65 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f  e hierarchy.  */
1b0d0 0a 20 20 66 6f 72 28 66 74 73 35 42 74 72 65 65  .  for(fts5Btree
1b0e0 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78  IterInit(p, iIdx
1b0f0 2c 20 70 53 65 67 2c 20 26 69 74 65 72 29 3b 0a  , pSeg, &iter);.
1b100 20 20 20 20 20 20 69 74 65 72 2e 62 45 6f 66 3d        iter.bEof=
1b110 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 42 74  =0;.      fts5Bt
1b120 72 65 65 49 74 65 72 4e 65 78 74 28 26 69 74 65  reeIterNext(&ite
1b130 72 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  r).  ){.    i64 
1b140 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  iRow;           
1b150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
1b160 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  id for this leaf
1b170 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61   */.    Fts5Data
1b180 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
1b190 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
1b1a0 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20  r this leaf */. 
1b1b0 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20     int iOff;    
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1d0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1b1e0 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66  rst term on leaf
1b1f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   */.    int i;  
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1b220 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1b230 20 65 6d 70 74 79 20 6c 65 61 76 65 73 20 2a 2f   empty leaves */
1b240 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1b250 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e  leaf in question
1b260 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1b270 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74  n trimmed from t
1b280 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20  he segment, .   
1b290 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20   ** ignore this 
1b2a0 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74  b-tree entry. Ot
1b2b0 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74  herwise, load it
1b2c0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f   into memory. */
1b2d0 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e 69 4c  .    if( iter.iL
1b2e0 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eaf<pSeg->pgnoFi
1b2f0 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rst ) continue;.
1b300 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f      iRow = FTS5_
1b310 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1b320 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  dx, pSeg->iSegid
1b330 2c 20 30 2c 20 69 74 65 72 2e 69 4c 65 61 66 29  , 0, iter.iLeaf)
1b340 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
1b350 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
1b360 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ow);.    if( pLe
1b370 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  af==0 ) break;..
1b380 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
1b390 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61  t the leaf conta
1b3a0 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
1b3b0 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20   term, and that 
1b3c0 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20  it is equal.    
1b3d0 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20  ** to or larger 
1b3e0 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b  than the split-k
1b3f0 65 79 20 69 6e 20 69 74 65 72 2e 74 65 72 6d 2e  ey in iter.term.
1b400 20 20 2a 2f 0a 20 20 20 20 69 4f 66 66 20 3d 20    */.    iOff = 
1b410 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
1b420 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 69 66  f->p[2]);.    if
1b430 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( iOff==0 ){.   
1b440 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
1b450 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c  CORRUPT;.    }el
1b460 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  se{.      int nT
1b470 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
1b480 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b490 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e   term on leaf in
1b4a0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
1b4b0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b4d0 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72  omparison of ter
1b4e0 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20  m and split-key 
1b4f0 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  */.      iOff +=
1b500 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c   getVarint32(&pL
1b510 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54  eaf->p[iOff], nT
1b520 65 72 6d 29 3b 0a 20 20 20 20 20 20 72 65 73 20  erm);.      res 
1b530 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d  = memcmp(&pLeaf-
1b540 3e 70 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74  >p[iOff], iter.t
1b550 65 72 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d  erm.p, MIN(nTerm
1b560 2c 20 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b  , iter.term.n));
1b570 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
1b580 30 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20  0 ) res = nTerm 
1b590 2d 20 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20  - iter.term.n;. 
1b5a0 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
1b5b0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
1b5c0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
1b5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b5e0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1b5f0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66  e(pLeaf);.    if
1b600 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
1b610 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65  ..    /* Now che
1b620 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ck that the iter
1b630 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66  .nEmpty leaves f
1b640 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72  ollowing the cur
1b650 72 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a  rent leaf.    **
1b660 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28   (a) exist and (
1b670 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  b) contain no te
1b680 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  rms. */.    for(
1b690 69 3d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=1; p->rc==SQLI
1b6a0 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72  TE_OK && i<=iter
1b6b0 2e 6e 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20  .nEmpty; i++){. 
1b6c0 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
1b6d0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f  5DataRead(p, iRo
1b6e0 77 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  w+i);.      if( 
1b6f0 70 4c 65 61 66 20 26 26 20 30 21 3d 66 74 73 35  pLeaf && 0!=fts5
1b700 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
1b710 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [2]) ){.        
1b720 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1b730 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
1b740 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
1b750 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
1b760 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1b770 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
1b780 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61  index, check tha
1b790 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74  t it looks right
1b7a0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65  . */.    if( ite
1b7b0 72 2e 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  r.bDlidx ){.    
1b7c0 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
1b7d0 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a  *pDlidx = 0;  /*
1b7e0 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
1b7f0 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69  hrough doclist i
1b800 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
1b810 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 74  t iPrevLeaf = it
1b820 65 72 2e 69 4c 65 61 66 3b 0a 20 20 20 20 20 20  er.iLeaf;.      
1b830 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53 65  int iSegid = pSe
1b840 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
1b850 20 69 6e 74 20 69 50 67 3b 0a 20 20 20 20 20 20   int iPg;.      
1b860 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20  i64 iKey;..     
1b870 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74   for(fts5DlidxIt
1b880 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64  erInit(p, 0, iId
1b890 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e  x, iSegid, iter.
1b8a0 69 4c 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b  iLeaf, &pDlidx);
1b8b0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
1b8c0 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
1b8d0 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
1b8e0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1b8f0 65 72 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20  erNext(pDlidx). 
1b900 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20       ){..       
1b910 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f   /* Check any ro
1b920 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74  wid-less pages t
1b930 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
1b940 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1b950 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  f. */.        fo
1b960 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b  r(iPg=iPrevLeaf+
1b970 31 3b 20 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69  1; iPg<pDlidx->i
1b980 4c 65 61 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29  LeafPgno; iPg++)
1b990 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79  {.          iKey
1b9a0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1b9b0 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65 67  ROWID(iIdx, iSeg
1b9c0 69 64 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20  id, 0, iPg);.   
1b9d0 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
1b9e0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
1b9f0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1ba00 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
1ba10 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
1ba20 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
1ba30 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63  p[0])!=0 ) p->rc
1ba40 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
1ba50 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1ba60 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
1ba70 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  af);.          }
1ba80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba90 20 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 70     iPrevLeaf = p
1baa0 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
1bab0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
1bac0 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61  eck that the lea
1bad0 66 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64  f page indicated
1bae0 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
1baf0 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20   really does.   
1bb00 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20       ** contain 
1bb10 74 68 65 20 72 6f 77 69 64 20 73 75 67 67 65 73  the rowid sugges
1bb20 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e  ted by the same.
1bb30 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79   */.        iKey
1bb40 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1bb50 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65 67  ROWID(iIdx, iSeg
1bb60 69 64 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69  id, 0, pDlidx->i
1bb70 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
1bb80 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1bb90 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
1bba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
1bbb0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1bbc0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
1bbd0 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
1bbe0 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  dOff = fts5GetU1
1bbf0 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b  6(&pLeaf->p[0]);
1bc00 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 56 61  .          getVa
1bc10 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
1bc20 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a  RowidOff], (u64*
1bc30 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  )&iRowid);.     
1bc40 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21       if( iRowid!
1bc50 3d 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  =pDlidx->iRowid 
1bc60 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
1bc70 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
1bc80 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1bc90 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
1bca0 20 20 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20    }..      }..  
1bcb0 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65      for(iPg=iPre
1bcc0 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69  vLeaf+1; iPg<=(i
1bcd0 74 65 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72  ter.iLeaf + iter
1bce0 2e 6e 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29  .nEmpty); iPg++)
1bcf0 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  {.        iKey =
1bd00 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1bd10 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1bd20 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20  , 0, iPg);.     
1bd30 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1bd40 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
1bd50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
1bd60 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1bd70 20 69 66 28 20 66 74 73 35 47 65 74 55 31 36 28   if( fts5GetU16(
1bd80 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30  &pLeaf->p[0])!=0
1bd90 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
1bda0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
1bdb0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
1bdc0 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
1bdd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1bde0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
1bdf0 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
1be00 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1be10 65 72 54 65 73 74 52 65 76 65 72 73 65 28 70 2c  erTestReverse(p,
1be20 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69   iIdx, iSegid, i
1be30 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
1be40 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
1be50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1be60 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65   iter.iLeaf!=pSe
1be70 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
1be80 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
1be90 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20  CORRUPT;.  }..  
1bea0 66 74 73 35 42 74 72 65 65 49 74 65 72 46 72 65  fts5BtreeIterFre
1beb0 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  e(&iter);.}../*.
1bec0 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20  ** Run internal 
1bed0 63 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65  checks to ensure
1bee0 20 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e   that the FTS in
1bef0 64 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72  dex (a) is inter
1bf00 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73  nally .** consis
1bf10 74 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  tent and (b) con
1bf20 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
1bf30 72 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20  r which the XOR 
1bf40 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  of the checksums
1bf50 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65  .** as calculate
1bf60 64 20 62 79 20 66 74 73 35 49 6e 64 65 78 45 6e  d by fts5IndexEn
1bf70 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b  tryCksum() is ck
1bf80 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  sum..**.** Retur
1bf90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1bfa0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69   if any of the i
1bfb0 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66  nternal checks f
1bfc0 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a  ail, or if the.*
1bfd0 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20  * checksum does 
1bfe0 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72  not match. Retur
1bff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
1c000 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20 77  ll checks pass w
1c010 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c  ithout.** error,
1c020 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53   or some other S
1c030 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1c040 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f   if another erro
1c050 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20  r (e.g. OOM).** 
1c060 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
1c070 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
1c080 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74  ntegrityCheck(Ft
1c090 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20  s5Index *p, u64 
1c0a0 63 6b 73 75 6d 29 7b 0a 20 20 46 74 73 35 43 6f  cksum){.  Fts5Co
1c0b0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
1c0c0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e  p->pConfig;.  in
1c0d0 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c0f0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
1c100 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73   through indexes
1c110 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c130 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1c140 63 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b  code */.  u64 ck
1c150 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20  sum2 = 0;       
1c160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
1c170 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63  cksum based on c
1c180 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78  ontents of index
1c190 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  es */..  /* Chec
1c1a0 6b 20 74 68 61 74 20 74 68 65 20 63 68 65 63 6b  k that the check
1c1b0 73 75 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78  sum of the index
1c1c0 20 6d 61 74 63 68 65 73 20 74 68 65 20 61 72 67   matches the arg
1c1d0 75 6d 65 6e 74 20 63 68 65 63 6b 73 75 6d 20 2a  ument checksum *
1c1e0 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20  /.  for(iIdx=0; 
1c1f0 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
1c200 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
1c210 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69 53 65  .    Fts5MultiSe
1c220 67 49 74 65 72 20 2a 70 49 74 65 72 3b 0a 20 20  gIter *pIter;.  
1c230 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1c240 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
1c250 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
1c260 69 49 64 78 29 3b 0a 20 20 20 20 66 6f 72 28 66  iIdx);.    for(f
1c270 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
1c280 70 2c 20 70 53 74 72 75 63 74 2c 20 69 49 64 78  p, pStruct, iIdx
1c290 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30  , 0, 0, 0, -1, 0
1c2a0 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
1c2b0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1c2c0 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30  Eof(p, pIter)==0
1c2d0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
1c2e0 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
1c2f0 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 20 20  Iter, 0, 0).    
1c300 29 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73  ){.      Fts5Pos
1c310 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20  Iter sPos;      
1c320 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1c330 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1c340 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
1c350 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  .      int n;   
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
1c380 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
1c390 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
1c3a0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
1c3b0 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
1c3c0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
1c3d0 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
1c3e0 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29  rTerm(pIter, &n)
1c3f0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73  ;..      for(fts
1c400 35 50 6f 73 49 74 65 72 49 6e 69 74 28 70 2c 20  5PosIterInit(p, 
1c410 70 49 74 65 72 2c 20 26 73 50 6f 73 29 3b 0a 20  pIter, &sPos);. 
1c420 20 20 20 20 20 20 20 20 20 66 74 73 35 50 6f 73           fts5Pos
1c430 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73  IterEof(p, &sPos
1c440 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
1c450 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28  fts5PosIterNext(
1c460 70 2c 20 26 73 50 6f 73 29 0a 20 20 20 20 20 20  p, &sPos).      
1c470 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  ){.        cksum
1c480 32 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  2 ^= fts5IndexEn
1c490 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
1c4a0 20 73 50 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f 73   sPos.iCol, sPos
1c4b0 2e 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 23 69  .iPos, z, n);.#i
1c4c0 66 20 30 0a 20 20 20 20 20 20 20 20 66 70 72 69  f 0.        fpri
1c4d0 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72 6f 77  ntf(stdout, "row
1c4e0 69 64 3d 25 64 20 22 2c 20 28 69 6e 74 29 69 52  id=%d ", (int)iR
1c4f0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
1c500 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
1c510 74 65 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e 2c 20  term=%.*s ", n, 
1c520 7a 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  z);.        fpri
1c530 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 63 6f 6c  ntf(stdout, "col
1c540 3d 25 64 20 22 2c 20 73 50 6f 73 2e 69 43 6f 6c  =%d ", sPos.iCol
1c550 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
1c560 74 66 28 73 74 64 6f 75 74 2c 20 22 6f 66 66 3d  tf(stdout, "off=
1c570 25 64 5c 6e 22 2c 20 73 50 6f 73 2e 69 50 6f 73  %d\n", sPos.iPos
1c580 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
1c590 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69  h(stdout);.#endi
1c5a0 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  f.      }.    }.
1c5b0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1c5c0 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b  rFree(p, pIter);
1c5d0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1c5e0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1c5f0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  t);.  }.  rc = p
1c600 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ->rc;.  if( rc==
1c610 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
1c620 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 72 63 20  um!=cksum2 ) rc 
1c630 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
1c640 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1c650 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
1c660 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d  des of each segm
1c670 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65  ent match the le
1c680 61 76 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 49  aves */.  for(iI
1c690 64 78 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  dx=0; rc==SQLITE
1c6a0 5f 4f 4b 20 26 26 20 69 49 64 78 3c 3d 70 43 6f  _OK && iIdx<=pCo
1c6b0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
1c6c0 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  Idx++){.    Fts5
1c6d0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1c6e0 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1c6f0 72 65 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b  reRead(p, iIdx);
1c700 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
1c710 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
1c720 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
1c730 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
1c740 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1c750 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1c760 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1c770 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1c780 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1c790 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1c7a0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1c7b0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
1c7c0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1c7d0 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
1c7e0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ];.          fts
1c7f0 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
1c800 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 69  heckSegment(p, i
1c810 49 64 78 2c 20 70 53 65 67 29 3b 0a 20 20 20 20  Idx, pSeg);.    
1c820 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c830 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
1c840 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1c850 72 75 63 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ruct);.    rc = 
1c860 70 2d 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65  p->rc;.  }..  re
1c870 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c880 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1c890 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
1c8a0 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1c8d0 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
1c8e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1c8f0 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42  ,.  const u8 *pB
1c900 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29  lob, int nBlob.)
1c910 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c930 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1c940 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  de */.  int iLvl
1c950 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  , iSeg;         
1c960 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
1c970 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
1c980 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  s, segments */. 
1c990 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1c9a0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
1c9b0 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75   /* Decoded stru
1c9c0 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cture object */.
1c9d0 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75  .  rc = fts5Stru
1c9e0 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f  ctureDecode(pBlo
1c9f0 62 2c 20 6e 42 6c 6f 62 2c 20 26 70 29 3b 0a 20  b, nBlob, &p);. 
1ca00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ca10 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
1ca20 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
1ca30 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4c 76 6c  .  }..  for(iLvl
1ca40 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76  =0; iLvl<p->nLev
1ca50 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1ca60 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
1ca70 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e  vel *pLvl = &p->
1ca80 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1ca90 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1caa0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
1cab0 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20  pRc, pBuf, .    
1cac0 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d      " {lvl=%d nM
1cad0 65 72 67 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20  erge=%d", iLvl, 
1cae0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20  pLvl->nMerge.   
1caf0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67   );.    for(iSeg
1cb00 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
1cb10 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
1cb20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1cb30 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
1cb40 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
1cb50 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g];.      sqlite
1cb60 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1cb70 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
1cb80 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20  f, .          " 
1cb90 7b 69 64 3d 25 64 20 68 3d 25 64 20 6c 65 61 76  {id=%d h=%d leav
1cba0 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65  es=%d..%d}", pSe
1cbb0 67 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d  g->iSegid, pSeg-
1cbc0 3e 6e 48 65 69 67 68 74 2c 20 0a 20 20 20 20 20  >nHeight, .     
1cbd0 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
1cbe0 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f  irst, pSeg->pgno
1cbf0 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  Last.      );.  
1cc00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
1cc10 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
1cc20 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
1cc30 20 22 7d 22 29 3b 0a 20 20 7d 0a 0a 20 20 66 74   "}");.  }..  ft
1cc40 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1cc50 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  se(p);.}../*.** 
1cc60 42 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20  Buffer (a/n) is 
1cc70 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
1cc80 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72  in a list of ser
1cc90 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e  ialized varints.
1cca0 20 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61   Read.** each va
1ccb0 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20  rint and append 
1ccc0 69 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65  its string repre
1ccd0 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66  sentation to buf
1cce0 66 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e  fer pBuf. Return
1ccf0 0a 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72  .** after either
1cd00 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
1cd10 72 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f  r is exhausted o
1cd20 72 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72  r a 0 value is r
1cd30 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ead..**.** The r
1cd40 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1cd50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1cd60 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
1cd70 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
1cd80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1cd90 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69  5DecodePoslist(i
1cda0 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
1cdb0 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
1cdc0 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
1cdd0 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
1cde0 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20    while( iOff<n 
1cdf0 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b  ){.    int iVal;
1ce00 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74  .    iOff += get
1ce10 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
1ce20 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  ], iVal);.    sq
1ce30 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1ce40 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
1ce50 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56   pBuf, " %d", iV
1ce60 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  al);.  }.  retur
1ce70 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
1ce80 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75   The start of bu
1ce90 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61  ffer (a/n) conta
1cea0 69 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66  ins the start of
1ceb0 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20   a doclist. The 
1cec0 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f  doclist.** may o
1ced0 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68  r may not finish
1cee0 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
1cef0 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
1cf00 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74  n appends a text
1cf10 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69  .** representati
1cf20 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f  on of the part o
1cf30 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68  f the doclist th
1cf40 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f  at is present to
1cf50 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e   buffer.** pBuf.
1cf60 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75   .**.** The retu
1cf70 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
1cf80 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1cf90 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
1cfa0 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73  put buffer..*/.s
1cfb0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65  tatic int fts5De
1cfc0 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20  codeDoclist(int 
1cfd0 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
1cfe0 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38   *pBuf, const u8
1cff0 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *a, int n){.  i
1d000 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74  64 iDocid;.  int
1d010 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66   iOff = 0;..  if
1d020 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
1d030 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
1d040 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
1d050 5d 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64  ], (u64*)&iDocid
1d060 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
1d070 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
1d080 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
1d090 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69  " rowid=%lld", i
1d0a0 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68  Docid);.  }.  wh
1d0b0 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
1d0c0 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
1d0d0 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69   iOff += getVari
1d0e0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
1d0f0 50 6f 73 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  Pos);.    iOff +
1d100 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  = fts5DecodePosl
1d110 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26  ist(pRc, pBuf, &
1d120 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69  a[iOff], MIN(n-i
1d130 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20  Off, nPos));.   
1d140 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
1d150 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
1d160 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  .      iOff += s
1d170 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
1d180 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
1d190 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
1d1a0 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20  if( iDelta==0 ) 
1d1b0 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20  return iOff;.   
1d1c0 20 20 20 69 44 6f 63 69 64 20 2d 3d 20 69 44 65     iDocid -= iDe
1d1d0 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lta;.      sqlit
1d1e0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1d1f0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
1d200 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64  uf, " rowid=%lld
1d210 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  ", iDocid);.    
1d220 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1d230 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
1d240 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1d250 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
1d260 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
1d270 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e  n fts5_decode().
1d280 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d290 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
1d2a0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
1d2b0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
1d2c0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
1d2d0 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
1d2e0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d300 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d310 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
1d320 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
1d330 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
1d340 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
1d350 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
1d360 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  {.  i64 iRowid; 
1d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d380 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
1d390 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
1d3a0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
1d3b0 49 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67  Idx,iSegid,iHeig
1d3c0 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f  ht,iPgno;  /* Ro
1d3d0 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a  wid components *
1d3e0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b  /.  const u8 *a;
1d3f0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
1d400 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f      /* Record to
1d410 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73   decode */.  Fts
1d420 35 42 75 66 66 65 72 20 73 3b 20 20 20 20 20 20  5Buffer s;      
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d440 42 75 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f  Build up text to
1d450 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a   return here */.
1d460 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d470 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1d480 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d490 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   */..  assert( n
1d4a0 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73  Arg==2 );.  mems
1d4b0 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
1d4c0 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
1d4d0 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65   iRowid = sqlite
1d4e0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
1d4f0 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73  Val[0]);.  n = s
1d500 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
1d510 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  es(apVal[1]);.  
1d520 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  a = sqlite3_valu
1d530 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29  e_blob(apVal[1])
1d540 3b 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f  ;.  fts5DecodeRo
1d550 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69 49 64  wid(iRowid, &iId
1d560 78 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65  x, &iSegid, &iHe
1d570 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a  ight, &iPgno);..
1d580 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64    fts5DebugRowid
1d590 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64  (&rc, &s, iRowid
1d5a0 29 3b 0a 20 20 69 66 28 20 69 48 65 69 67 68 74  );.  if( iHeight
1d5b0 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d  ==FTS5_SEGMENT_M
1d5c0 41 58 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20  AX_HEIGHT ){.   
1d5d0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
1d5e0 69 36 34 20 69 50 72 65 76 3b 0a 20 20 20 20 69  i64 iPrev;.    i
1d5f0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( n>0 ){.      
1d600 69 20 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61  i = getVarint(&a
1d610 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 50 72 65  [i], (u64*)&iPre
1d620 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1d630 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d640 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
1d650 20 22 20 25 6c 6c 64 22 2c 20 69 50 72 65 76 29   " %lld", iPrev)
1d660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
1d670 65 28 20 69 3c 6e 20 29 7b 0a 20 20 20 20 20 20  e( i<n ){.      
1d680 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  i64 iVal;.      
1d690 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  i += getVarint(&
1d6a0 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  a[i], (u64*)&iVa
1d6b0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 56  l);.      if( iV
1d6c0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  al==0 ){.       
1d6d0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d6e0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
1d6f0 72 63 2c 20 26 73 2c 20 22 20 78 22 29 3b 0a 20  rc, &s, " x");. 
1d700 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d710 20 20 20 20 69 50 72 65 76 20 3d 20 69 50 72 65      iPrev = iPre
1d720 76 20 2d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  v - iVal;.      
1d730 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d740 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
1d750 26 72 63 2c 20 26 73 2c 20 22 20 25 6c 6c 64 22  &rc, &s, " %lld"
1d760 2c 20 69 50 72 65 76 29 3b 0a 20 20 20 20 20 20  , iPrev);.      
1d770 7d 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  }.    }..  }else
1d780 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30  .  if( iSegid==0
1d790 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77   ){.    if( iRow
1d7a0 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  id==FTS5_AVERAGE
1d7b0 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
1d7c0 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20   /* todo */.    
1d7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
1d7e0 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65  5DecodeStructure
1d7f0 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b  (&rc, &s, a, n);
1d800 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1d810 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
1d820 74 65 72 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  term;.    memset
1d830 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&term, 0, sizeo
1d840 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
1d850 0a 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74  .    if( iHeight
1d860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1d870 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20   iTermOff = 0;. 
1d880 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
1d890 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ff = 0;.      in
1d8a0 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e  t iOff;.      in
1d8b0 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20  t nKeep = 0;..  
1d8c0 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
1d8d0 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d  fts5GetU16(&a[0]
1d8e0 29 3b 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66  );.      iTermOf
1d8f0 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
1d900 61 5b 32 5d 29 3b 0a 0a 20 20 20 20 20 20 69 66  a[2]);..      if
1d910 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20  ( iRowidOff ){. 
1d920 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52         iOff = iR
1d930 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 7d  owidOff;.      }
1d940 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66  else if( iTermOf
1d950 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  f ){.        iOf
1d960 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  f = iTermOff;.  
1d970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d980 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a 20 20 20     iOff = n;.   
1d990 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44     }.      fts5D
1d9a0 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63  ecodePoslist(&rc
1d9b0 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66  , &s, &a[4], iOf
1d9c0 66 2d 34 29 3b 0a 0a 0a 20 20 20 20 20 20 61 73  f-4);...      as
1d9d0 73 65 72 74 28 20 69 52 6f 77 69 64 4f 66 66 3d  sert( iRowidOff=
1d9e0 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77  =0 || iOff==iRow
1d9f0 69 64 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 69  idOff );.      i
1da00 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
1da10 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
1da20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
1da30 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
1da40 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20  ff], n-iOff);.  
1da50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
1da60 65 72 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30  ert( iTermOff==0
1da70 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f   || iOff==iTermO
1da80 66 66 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ff );.      whil
1da90 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
1daa0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a       int nByte;.
1dab0 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
1dac0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  getVarint32(&a[i
1dad0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
1dae0 20 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b        term.n= nK
1daf0 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73  eep;.        fts
1db00 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1db10 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42  b(&rc, &term, nB
1db20 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  yte, &a[iOff]);.
1db30 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
1db40 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20  nByte;..        
1db50 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1db60 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20  rAppendPrintf(. 
1db70 20 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20             &rc, 
1db80 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22  &s, " term=%.*s"
1db90 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74  , term.n, (const
1dba0 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20   char*)term.p.  
1dbb0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1dbc0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63   iOff += fts5Dec
1dbd0 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20  odeDoclist(&rc, 
1dbe0 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d  &s, &a[iOff], n-
1dbf0 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  iOff);.        i
1dc00 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
1dc10 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67         iOff += g
1dc20 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
1dc30 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
1dc40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1dc50 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46       fts5BufferF
1dc60 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20  ree(&term);.    
1dc70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73  }else{.      Fts
1dc80 35 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20  5NodeIter ss;.  
1dc90 20 20 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65      for(fts5Node
1dca0 49 74 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26  IterInit(a, n, &
1dcb0 73 73 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66  ss); ss.aData; f
1dcc0 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
1dcd0 26 72 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20  &rc, &ss)){.    
1dce0 20 20 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e      if( ss.term.
1dcf0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1dd00 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1dd10 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
1dd20 26 72 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d  &rc, &s, " left=
1dd30 25 64 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b  %d", ss.iChild);
1dd40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1dd50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1dd60 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1dd70 64 50 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20  dPrintf(&rc,&s, 
1dd80 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20  " \"%.*s\"", .  
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e 74              ss.t
1dda0 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70  erm.n, ss.term.p
1ddb0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1ddc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ddd0 69 66 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b  if( ss.nEmpty ){
1dde0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1ddf0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1de00 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73  ndPrintf(&rc, &s
1de10 2c 20 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c  , " empty=%d%s",
1de20 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20   ss.nEmpty,.    
1de30 20 20 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c            ss.bDl
1de40 69 64 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20  idx ? "*" : "". 
1de50 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1de60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1de70 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
1de80 46 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d  Free(&ss);.    }
1de90 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
1dea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1deb0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1dec0 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f  t_text(pCtx, (co
1ded0 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73  nst char*)s.p, s
1dee0 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  .n, SQLITE_TRANS
1def0 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
1df00 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1df10 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
1df20 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66  tx, rc);.  }.  f
1df30 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73  ts5BufferFree(&s
1df40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1df50 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
1df60 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  rt of registerin
1df70 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c  g the FTS5 modul
1df80 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a  e with database.
1df90 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
1dfa0 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73  . It registers s
1dfb0 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69  everal user-defi
1dfc0 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
1dfd0 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77  ions useful.** w
1dfe0 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20  ith FTS5..**.** 
1dff0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
1e000 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e010 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
1e020 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f  r occurs, some o
1e030 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65  ther.** SQLite e
1e040 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1e050 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
1e060 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1e070 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74  5IndexInit(sqlit
1e080 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
1e090 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
1e0a0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
1e0b0 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63     db, "fts5_dec
1e0c0 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ode", 2, SQLITE_
1e0d0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63  UTF8, 0, fts5Dec
1e0e0 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
1e0f0 30 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  0.  );.  return 
1e100 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
1e110 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
1e120 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 69 6e   size for the in
1e130 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  dex object..*/.v
1e140 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49  oid sqlite3Fts5I
1e150 6e 64 65 78 50 67 73 7a 28 46 74 73 35 49 6e 64  ndexPgsz(Fts5Ind
1e160 65 78 20 2a 70 2c 20 69 6e 74 20 70 67 73 7a 29  ex *p, int pgsz)
1e170 7b 0a 20 20 70 2d 3e 70 67 73 7a 20 3d 20 70 67  {.  p->pgsz = pg
1e180 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  sz;.}../*.** Ite
1e190 72 61 74 6f 72 20 70 4d 75 6c 74 69 20 63 75 72  rator pMulti cur
1e1a0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1e1b0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28   a valid entry (
1e1c0 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a  not EOF). This.*
1e1d0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  * function appen
1e1e0 64 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ds a copy of the
1e1f0 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 6f   position-list o
1e200 66 20 74 68 65 20 65 6e 74 72 79 20 70 4d 75 6c  f the entry pMul
1e210 74 69 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ti .** currently
1e220 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 62 75   points to to bu
1e230 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
1e240 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1e250 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1e260 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d  de is left in p-
1e270 3e 72 63 2e 20 49 74 20 69 73 20 61 73 73 75 6d  >rc. It is assum
1e280 65 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 68  ed.** no error h
1e290 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
1e2a0 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
1e2b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e2c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e2d0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f   fts5MultiIterPo
1e2e0 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64  slist(.  Fts5Ind
1e2f0 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 4d 75 6c  ex *p,.  Fts5Mul
1e300 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74  tiSegIter *pMult
1e310 69 2c 0a 20 20 69 6e 74 20 62 53 7a 2c 0a 20 20  i,.  int bSz,.  
1e320 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1e330 0a 29 7b 0a 20 20 46 74 73 35 43 68 75 6e 6b 49  .){.  Fts5ChunkI
1e340 74 65 72 20 69 74 65 72 3b 0a 20 20 46 74 73 35  ter iter;.  Fts5
1e350 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
1e360 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70  &pMulti->aSeg[ p
1e370 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d  Multi->aFirst[1]
1e380 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74   ];.  assert( ft
1e390 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
1e3a0 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a  , pMulti)==0 );.
1e3b0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49    fts5ChunkIterI
1e3c0 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 69 74  nit(p, pSeg, &it
1e3d0 65 72 29 3b 0a 20 20 69 66 28 20 66 74 73 35 43  er);.  if( fts5C
1e3e0 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
1e3f0 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iter)==0 ){.    
1e400 69 66 28 20 62 53 7a 20 29 7b 0a 20 20 20 20 20  if( bSz ){.     
1e410 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1e420 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1e430 70 42 75 66 2c 20 69 74 65 72 2e 6e 52 65 6d 29  pBuf, iter.nRem)
1e440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
1e450 65 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  e( fts5ChunkIter
1e460 45 6f 66 28 70 2c 20 26 69 74 65 72 29 3d 3d 30  Eof(p, &iter)==0
1e470 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
1e480 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1e490 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65  p->rc, pBuf, ite
1e4a0 72 2e 6e 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20  r.n, iter.p);.  
1e4b0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1e4c0 72 4e 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b  rNext(p, &iter);
1e4d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73  .    }.  }.  fts
1e4e0 35 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73  5ChunkIterReleas
1e4f0 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 73 74 61  e(&iter);.}..sta
1e500 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
1e510 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73  listIterNext(Fts
1e520 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
1e530 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
1e540 72 2d 3e 69 3c 70 49 74 65 72 2d 3e 6e 20 29 7b  r->i<pIter->n ){
1e550 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
1e560 69 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  i ){.      i64 i
1e570 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 70 49 74  Delta;.      pIt
1e580 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69  er->i += getVari
1e590 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74  nt(&pIter->a[pIt
1e5a0 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 69  er->i], (u64*)&i
1e5b0 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66  Delta);.      if
1e5c0 28 20 70 49 74 65 72 2d 3e 62 41 73 63 20 29 7b  ( pIter->bAsc ){
1e5d0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
1e5e0 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
1e5f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e600 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
1e610 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
1e620 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1e630 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
1e640 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  i += getVarint(&
1e650 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e  pIter->a[pIter->
1e660 69 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  i], (u64*)&pIter
1e670 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  ->iRowid);.    }
1e680 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d  .    pIter->i +=
1e690 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49   getVarint32(&pI
1e6a0 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d  ter->a[pIter->i]
1e6b0 2c 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73  , pIter->nPoslis
1e6c0 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  t);.    pIter->a
1e6d0 50 6f 73 6c 69 73 74 20 3d 20 26 70 49 74 65 72  Poslist = &pIter
1e6e0 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 3b 0a 20  ->a[pIter->i];. 
1e6f0 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 70     pIter->i += p
1e700 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a  Iter->nPoslist;.
1e710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
1e720 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30  er->aPoslist = 0
1e730 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1e740 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
1e750 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
1e760 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20  Buffer *pBuf, . 
1e770 20 69 6e 74 20 62 41 73 63 2c 20 0a 20 20 46 74   int bAsc, .  Ft
1e780 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
1e790 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  Iter.){.  memset
1e7a0 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
1e7b0 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
1e7c0 74 65 72 2d 3e 61 20 3d 20 70 42 75 66 2d 3e 70  ter->a = pBuf->p
1e7d0 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 70  ;.  pIter->n = p
1e7e0 42 75 66 2d 3e 6e 3b 0a 20 20 70 49 74 65 72 2d  Buf->n;.  pIter-
1e7f0 3e 62 41 73 63 20 3d 20 62 41 73 63 3b 0a 20 20  >bAsc = bAsc;.  
1e800 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
1e810 65 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  ext(pIter);.}../
1e820 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f  *.** Append a do
1e830 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20  clist to buffer 
1e840 70 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pBuf..*/.static 
1e850 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70  void fts5MergeAp
1e860 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74  pendDocid(.  int
1e870 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e890 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
1e8a0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63  de */.  int bAsc
1e8b0 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1e8c0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1e8d0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
1e8e0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
1e8f0 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c  64 *piLastRowid,
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e910 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f  * IN/OUT: Previo
1e920 75 73 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e  us rowid written
1e930 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69   (if any) */.  i
1e940 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20 20  64 iRowid       
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e960 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e  * Rowid to appen
1e970 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42  d */.){.  if( pB
1e980 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  uf->n==0 ){.    
1e990 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1e9a0 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66  Varint(pRc, pBuf
1e9b0 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  , iRowid);.  }el
1e9c0 73 65 20 69 66 28 20 62 41 73 63 3d 3d 30 20 29  se if( bAsc==0 )
1e9d0 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
1e9e0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63  AppendVarint(pRc
1e9f0 2c 20 70 42 75 66 2c 20 2a 70 69 4c 61 73 74 52  , pBuf, *piLastR
1ea00 6f 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a  owid - iRowid);.
1ea10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
1ea20 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1ea30 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69  int(pRc, pBuf, i
1ea40 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52  Rowid - *piLastR
1ea50 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69  owid);.  }.  *pi
1ea60 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
1ea70 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66  id;.}../*.** Buf
1ea80 66 65 72 73 20 70 31 20 61 6e 64 20 70 32 20 63  fers p1 and p2 c
1ea90 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e  ontain doclists.
1eaa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1eab0 65 72 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  erges the conten
1eac0 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20  t.** of the two 
1ead0 64 6f 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65  doclists togethe
1eae0 72 20 61 6e 64 20 73 65 74 73 20 62 75 66 66 65  r and sets buffe
1eaf0 72 20 70 31 20 74 6f 20 74 68 65 20 72 65 73 75  r p1 to the resu
1eb00 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74  lt before.** ret
1eb10 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
1eb20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1eb30 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1eb40 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63  is left in p->rc
1eb50 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
1eb60 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63  s.** already occ
1eb70 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
1eb80 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1eb90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1eba0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
1ebb0 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65  ists(.  Fts5Inde
1ebc0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
1ebd0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
1ebe0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
1ebf0 2f 0a 20 20 69 6e 74 20 62 41 73 63 2c 0a 20 20  /.  int bAsc,.  
1ec00 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
1ec30 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
1ec40 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ec60 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
1ec70 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  rge */.){.  if( 
1ec80 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34  p2->n ){.    i64
1ec90 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
1eca0 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
1ecb0 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73  Iter i1;.    Fts
1ecc0 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b  5DoclistIter i2;
1ecd0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
1ece0 6f 75 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66  out;.    Fts5Buf
1ecf0 66 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d  fer tmp;.    mem
1ed00 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a  set(&out, 0, siz
1ed10 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d  eof(out));.    m
1ed20 65 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73  emset(&tmp, 0, s
1ed30 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20  izeof(tmp));..  
1ed40 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
1ed50 72 49 6e 69 74 28 70 31 2c 20 62 41 73 63 2c 20  rInit(p1, bAsc, 
1ed60 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f  &i1);.    fts5Do
1ed70 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32  clistIterInit(p2
1ed80 2c 20 62 41 73 63 2c 20 26 69 32 29 3b 0a 20 20  , bAsc, &i2);.  
1ed90 20 20 77 68 69 6c 65 28 20 69 31 2e 61 50 6f 73    while( i1.aPos
1eda0 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50  list!=0 || i2.aP
1edb0 6f 73 6c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  oslist!=0 ){.   
1edc0 20 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69     if( i2.aPosli
1edd0 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50 6f  st==0 || (i1.aPo
1ede0 73 6c 69 73 74 20 26 26 20 0a 20 20 20 20 20 20  slist && .      
1edf0 20 20 20 20 20 28 20 28 21 62 41 73 63 20 26 26       ( (!bAsc &&
1ee00 20 69 31 2e 69 52 6f 77 69 64 3e 69 32 2e 69 52   i1.iRowid>i2.iR
1ee10 6f 77 69 64 29 20 7c 7c 20 28 62 41 73 63 20 26  owid) || (bAsc &
1ee20 26 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69  & i1.iRowid<i2.i
1ee30 52 6f 77 69 64 29 20 29 0a 20 20 20 20 20 20 29  Rowid) ).      )
1ee40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
1ee50 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31  py entry from i1
1ee60 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
1ee70 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
1ee80 28 26 70 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26  (&p->rc, bAsc, &
1ee90 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64  out, &iLastRowid
1eea0 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i1.iRowid);.  
1eeb0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1eec0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1eed0 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50  >rc, &out, i1.nP
1eee0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
1eef0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ef00 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f  dBlob(&p->rc, &o
1ef10 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  ut, i1.nPoslist,
1ef20 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20   i1.aPoslist);. 
1ef30 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69         fts5Docli
1ef40 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b  stIterNext(&i1);
1ef50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
1ef60 6c 73 65 20 69 66 28 20 69 31 2e 61 50 6f 73 6c  lse if( i1.aPosl
1ef70 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f  ist==0 || i2.iRo
1ef80 77 69 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29  wid!=i1.iRowid )
1ef90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  {.        /* Cop
1efa0 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20  y entry from i2 
1efb0 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  */.        fts5M
1efc0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
1efd0 26 70 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f  &p->rc, bAsc, &o
1efe0 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c  ut, &iLastRowid,
1eff0 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
1f000 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f010 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1f020 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f  rc, &out, i2.nPo
1f030 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  slist);.        
1f040 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1f050 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75  Blob(&p->rc, &ou
1f060 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i2.nPoslist, 
1f070 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i2.aPoslist);.  
1f080 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
1f090 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
1f0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
1f0b0 73 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  se{.        Fts5
1f0c0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72 31  PoslistReader r1
1f0d0 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  ;.        Fts5Po
1f0e0 73 6c 69 73 74 52 65 61 64 65 72 20 72 32 3b 0a  slistReader r2;.
1f0f0 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
1f100 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
1f110 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ;..        memse
1f120 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69  t(&writer, 0, si
1f130 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a  zeof(writer));..
1f140 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65          /* Merge
1f150 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f   the two positio
1f160 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20  n lists. */ .   
1f170 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
1f180 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63  pendDocid(&p->rc
1f190 2c 20 62 41 73 63 2c 20 26 6f 75 74 2c 20 26 69  , bAsc, &out, &i
1f1a0 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
1f1b0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
1f1c0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74  ts5BufferZero(&t
1f1d0 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mp);.        sql
1f1e0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
1f1f0 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31  eaderInit(-1, i1
1f200 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50  .aPoslist, i1.nP
1f210 6f 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20  oslist, &r1);.  
1f220 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1f230 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
1f240 69 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69  it(-1, i2.aPosli
1f250 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c  st, i2.nPoslist,
1f260 20 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77   &r2);.        w
1f270 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1f280 49 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45  ITE_OK && (r1.bE
1f290 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66  of==0 || r2.bEof
1f2a0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
1f2b0 20 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20    i64 iNew;.    
1f2c0 20 20 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f        if( r2.bEo
1f2d0 66 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30  f || (r1.bEof==0
1f2e0 20 26 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69   && r1.iPos<r2.i
1f2f0 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos) ){.        
1f300 20 20 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50      iNew = r1.iP
1f310 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
1f320 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1f330 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31  stReaderNext(&r1
1f340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1f350 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1f360 69 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a  iNew = r2.iPos;.
1f370 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f380 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
1f390 61 64 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20  aderNext(&r2);. 
1f3a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1f3b0 31 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20  1.iPos==r2.iPos 
1f3c0 29 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  ) sqlite3Fts5Pos
1f3d0 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26  listReaderNext(&
1f3e0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r1);.          }
1f3f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
1f400 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f   = sqlite3Fts5Po
1f410 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e  slistWriterAppen
1f420 64 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c  d(&tmp, &writer,
1f430 20 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   iNew);.        
1f440 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  }..        fts5B
1f450 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1f460 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  t(&p->rc, &out, 
1f470 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  tmp.n);.        
1f480 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1f490 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75  Blob(&p->rc, &ou
1f4a0 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70 29  t, tmp.n, tmp.p)
1f4b0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
1f4c0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
1f4d0 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  1);.        fts5
1f4e0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
1f4f0 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &i2);.      }.  
1f500 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66    }..    fts5Buf
1f510 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70  ferSet(&p->rc, p
1f520 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29  1, out.n, out.p)
1f530 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
1f540 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20  Free(&tmp);.    
1f550 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1f560 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  out);.  }.}..sta
1f570 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66  tic void fts5Buf
1f580 66 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66  ferSwap(Fts5Buff
1f590 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66  er *p1, Fts5Buff
1f5a0 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42  er *p2){.  Fts5B
1f5b0 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b  uffer tmp = *p1;
1f5c0 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20  .  *p1 = *p2;.  
1f5d0 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74  *p2 = tmp;.}..st
1f5e0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
1f5f0 74 75 70 50 72 65 66 69 78 49 74 65 72 28 0a 20  tupPrefixIter(. 
1f600 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61   /* Index to rea
1f630 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
1f640 62 41 73 63 2c 20 20 20 20 20 20 20 20 20 20 20  bAsc,           
1f650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f660 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42  rue for "ORDER B
1f670 59 20 72 6f 77 69 64 20 41 53 43 22 20 2a 2f 0a  Y rowid ASC" */.
1f680 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b    const u8 *pTok
1f690 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1f6a0 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
1f6b0 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f  aining prefix to
1f6c0 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20   match */.  int 
1f6d0 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  nToken,         
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1f6f0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54  ize of buffer pT
1f700 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  oken in bytes */
1f710 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
1f720 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
1f730 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
1f740 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
1f750 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1f760 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
1f770 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20  5Buffer *aBuf;. 
1f780 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20   const int nBuf 
1f790 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66 20 3d 20  = 32;..  aBuf = 
1f7a0 28 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73  (Fts5Buffer*)fts
1f7b0 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
1f7c0 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
1f7d0 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63  *nBuf);.  pStruc
1f7e0 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
1f7f0 65 52 65 61 64 28 70 2c 20 30 29 3b 0a 0a 20 20  eRead(p, 0);..  
1f800 69 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72  if( aBuf && pStr
1f810 75 63 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44  uct ){.    Fts5D
1f820 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63  oclistIter *pDoc
1f830 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  list;.    int i;
1f840 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
1f850 77 69 64 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c  wid;.    Fts5Mul
1f860 74 69 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  tiSegIter *p1 = 
1f870 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74  0;     /* Iterat
1f880 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65  or used to gathe
1f890 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65  r data from inde
1f8a0 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66  x */.    Fts5Buf
1f8b0 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20  fer doclist;..  
1f8c0 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73    memset(&doclis
1f8d0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63  t, 0, sizeof(doc
1f8e0 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 6f 72 28  list));.    for(
1f8f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
1f900 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20  (p, pStruct, 0, 
1f910 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  1, pToken, nToke
1f920 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a  n, -1, 0, &p1);.
1f930 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
1f940 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d  iIterEof(p, p1)=
1f950 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
1f960 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1f970 20 70 31 2c 20 30 2c 20 30 29 0a 20 20 20 20 29   p1, 0, 0).    )
1f980 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
1f990 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
1f9a0 65 72 52 6f 77 69 64 28 70 31 29 3b 0a 20 20 20  erRowid(p1);.   
1f9b0 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20     int nTerm;.  
1f9c0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54      const u8 *pT
1f9d0 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  erm = fts5MultiI
1f9e0 74 65 72 54 65 72 6d 28 70 31 2c 20 26 6e 54 65  terTerm(p1, &nTe
1f9f0 72 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  rm);.      asser
1fa00 74 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e  t( memcmp(pToken
1fa10 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f  , pTerm, MIN(nTo
1fa20 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20  ken, nTerm))<=0 
1fa30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65  );.      if( nTe
1fa40 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d  rm<nToken || mem
1fa50 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
1fa60 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65  m, nToken) ) bre
1fa70 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 64  ak;..      if( d
1fa80 6f 63 6c 69 73 74 2e 6e 3e 30 20 0a 20 20 20 20  oclist.n>0 .    
1fa90 20 20 20 26 26 20 28 28 21 62 41 73 63 20 26 26     && ((!bAsc &&
1faa0 20 69 52 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f   iRowid>=iLastRo
1fab0 77 69 64 29 20 7c 7c 20 28 62 41 73 63 20 26 26  wid) || (bAsc &&
1fac0 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f   iRowid<=iLastRo
1fad0 77 69 64 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a  wid)).      ){..
1fae0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1faf0 20 64 6f 63 6c 69 73 74 2e 6e 20 26 26 20 70 2d   doclist.n && p-
1fb00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
1fb10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1fb20 61 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29  assert( i<nBuf )
1fb30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1fb40 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a  aBuf[i].n==0 ){.
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1fb60 42 75 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c  BufferSwap(&docl
1fb70 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1fb90 42 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c  BufferZero(&docl
1fba0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
1fbb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fbc0 20 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66     fts5MergePref
1fbd0 69 78 4c 69 73 74 73 28 70 2c 20 62 41 73 63 2c  ixLists(p, bAsc,
1fbe0 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66   &doclist, &aBuf
1fbf0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
1fc00 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
1fc10 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20  (&aBuf[i]);.    
1fc20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fc30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1fc40 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30  if( doclist.n==0
1fc50 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
1fc60 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1fc70 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c  nt(&p->rc, &docl
1fc80 69 73 74 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  ist, iRowid);.  
1fc90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 41      }else if( bA
1fca0 73 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sc==0 ){.       
1fcb0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1fcc0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1fcd0 26 64 6f 63 6c 69 73 74 2c 20 69 4c 61 73 74 52  &doclist, iLastR
1fce0 6f 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a  owid - iRowid);.
1fcf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fd00 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1fd10 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1fd20 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 52  rc, &doclist, iR
1fd30 6f 77 69 64 20 2d 20 69 4c 61 73 74 52 6f 77 69  owid - iLastRowi
1fd40 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
1fd50 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69    iLastRowid = i
1fd60 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 66 74 73  Rowid;.      fts
1fd70 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73  5MultiIterPoslis
1fd80 74 28 70 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63  t(p, p1, 1, &doc
1fd90 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  list);.    }..  
1fda0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75    for(i=0; i<nBu
1fdb0 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  f; i++){.      f
1fdc0 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
1fdd0 73 74 73 28 70 2c 20 62 41 73 63 2c 20 26 64 6f  sts(p, bAsc, &do
1fde0 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
1fdf0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
1fe00 65 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29  erFree(&aBuf[i])
1fe10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
1fe20 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c  MultiIterFree(p,
1fe30 20 70 31 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c   p1);..    pDocl
1fe40 69 73 74 20 3d 20 28 46 74 73 35 44 6f 63 6c 69  ist = (Fts5Docli
1fe50 73 74 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d  stIter*)fts5IdxM
1fe60 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
1fe70 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 29  Fts5DoclistIter)
1fe80 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 63  );.    if( !pDoc
1fe90 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74  list ){.      ft
1fea0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f  s5BufferFree(&do
1feb0 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  clist);.    }els
1fec0 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
1fed0 70 44 6f 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c  pDoclist = pDocl
1fee0 69 73 74 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ist;.      fts5D
1fef0 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 26  oclistIterInit(&
1ff00 64 6f 63 6c 69 73 74 2c 20 62 41 73 63 2c 20 70  doclist, bAsc, p
1ff10 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b  Iter->pDoclist);
1ff20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
1ff30 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1ff40 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73  se(pStruct);.  s
1ff50 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66  qlite3_free(aBuf
1ff60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
1ff70 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20   a new iterator 
1ff80 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67  to iterate thoug
1ff90 68 20 61 6c 6c 20 64 6f 63 69 64 73 20 74 68 61  h all docids tha
1ffa0 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20  t match the .** 
1ffb0 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20  specified token 
1ffc0 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e  or token prefix.
1ffd0 0a 2a 2f 0a 46 74 73 35 49 6e 64 65 78 49 74 65  .*/.Fts5IndexIte
1ffe0 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 6e  r *sqlite3Fts5In
1fff0 64 65 78 51 75 65 72 79 28 0a 20 20 46 74 73 35  dexQuery(.  Fts5
20000 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
20010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20020 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72  TS index to quer
20030 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
20040 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
20050 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20  Token, /* Token 
20060 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20 71  (or prefix) to q
20070 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  uery for */.  in
20080 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
200a0 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44   Mask of FTS5IND
200b0 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73  EX_QUERY_X flags
200c0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64   */.){.  Fts5Ind
200d0 65 78 49 74 65 72 20 2a 70 52 65 74 3b 0a 20 20  exIter *pRet;.  
200e0 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 0a 20  int iIdx = 0;.. 
200f0 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
20100 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
20110 46 49 58 20 29 7b 0a 20 20 20 20 46 74 73 35 43  FIX ){.    Fts5C
20120 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
20130 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
20140 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64   for(iIdx=1; iId
20150 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x<=pConfig->nPre
20160 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20  fix; iIdx++){.  
20170 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
20180 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d  >aPrefix[iIdx-1]
20190 3d 3d 6e 54 6f 6b 65 6e 20 29 20 62 72 65 61 6b  ==nToken ) break
201a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
201b0 69 49 64 78 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50  iIdx>pConfig->nP
201c0 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 69  refix ){.      i
201d0 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Idx = -1;.    }.
201e0 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 28 46    }..  pRet = (F
201f0 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 73 71  ts5IndexIter*)sq
20200 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
20210 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65  eof(Fts5IndexIte
20220 72 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20  r));.  if( pRet 
20230 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52  ){.    memset(pR
20240 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  et, 0, sizeof(Ft
20250 73 35 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 0a  s5IndexIter));..
20260 20 20 20 20 70 52 65 74 2d 3e 70 49 6e 64 65 78      pRet->pIndex
20270 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 69 49   = p;.    if( iI
20280 64 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  dx>=0 ){.      p
20290 52 65 74 2d 3e 70 53 74 72 75 63 74 20 3d 20 66  Ret->pStruct = f
202a0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
202b0 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 20  (p, iIdx);.     
202c0 20 69 66 28 20 70 52 65 74 2d 3e 70 53 74 72 75   if( pRet->pStru
202d0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ct ){.        ft
202e0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
202f0 2c 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74 2c  , pRet->pStruct,
20300 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49   .            iI
20310 64 78 2c 20 66 6c 61 67 73 2c 20 28 63 6f 6e 73  dx, flags, (cons
20320 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54  t u8*)pToken, nT
20330 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 52  oken, -1, 0, &pR
20340 65 74 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20 20  et->pMulti.     
20350 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
20360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
20370 6e 74 20 62 41 73 63 20 3d 20 28 66 6c 61 67 73  nt bAsc = (flags
20380 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
20390 52 59 5f 41 53 43 29 21 3d 30 3b 0a 20 20 20 20  RY_ASC)!=0;.    
203a0 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69    fts5SetupPrefi
203b0 78 49 74 65 72 28 70 2c 20 62 41 73 63 2c 20 28  xIter(p, bAsc, (
203c0 63 6f 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e  const u8*)pToken
203d0 2c 20 6e 54 6f 6b 65 6e 2c 20 70 52 65 74 29 3b  , nToken, pRet);
203e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
203f0 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73  ( p->rc ){.    s
20400 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
20410 6f 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70  ose(pRet);.    p
20420 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Ret = 0;.  }.  r
20430 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
20440 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
20450 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
20460 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
20470 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nly argument is 
20480 61 74 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73  at EOF..*/.int s
20490 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
204a0 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  f(Fts5IndexIter 
204b0 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
204c0 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29  Iter->pDoclist )
204d0 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49  { .    return pI
204e0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61  ter->pDoclist->a
204f0 50 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a 20 20 7d  Poslist==0; .  }
20500 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
20510 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
20520 66 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  f(pIter->pIndex,
20530 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b   pIter->pMulti);
20540 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  .  }.}../*.** Mo
20550 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
20560 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a  atching rowid. .
20570 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
20580 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
20590 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
205a0 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ){.  if( pIter->
205b0 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  pDoclist ){.    
205c0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
205d0 65 78 74 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c  ext(pIter->pDocl
205e0 69 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ist);.  }else{. 
205f0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
20600 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  o(&pIter->poslis
20610 74 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  t);.    fts5Mult
20620 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d  iIterNext(pIter-
20630 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e  >pIndex, pIter->
20640 70 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20  pMulti, 0, 0);. 
20650 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65   }.}../*.** Move
20660 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
20670 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74  ching rowid that
20680 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66   occurs at or af
20690 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a  ter iMatch. The.
206a0 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  ** definition of
206b0 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20 64   "at or after" d
206c0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
206d0 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  r this iterator 
206e0 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61  iterates.** in a
206f0 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63  scending or desc
20700 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64  ending rowid ord
20710 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
20720 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
20730 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  rom(Fts5IndexIte
20740 72 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d  r *pIter, i64 iM
20750 61 74 63 68 29 7b 0a 20 20 69 66 28 20 70 49 74  atch){.  if( pIt
20760 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a  er->pDoclist ){.
20770 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
20780 0a 20 20 20 20 2f 2a 20 66 74 73 35 44 6f 63 6c  .    /* fts5Docl
20790 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  istIterNextFrom(
207a0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2c  pIter->pDoclist,
207b0 20 69 4d 61 74 63 68 29 3b 20 2a 2f 0a 20 20 7d   iMatch); */.  }
207c0 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75  else{.    fts5Mu
207d0 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ltiIterNextFrom(
207e0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
207f0 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d  Iter->pMulti, iM
20800 61 74 63 68 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  atch);.  }.}../*
20810 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
20820 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f  urrent rowid..*/
20830 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35  .i64 sqlite3Fts5
20840 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e  IterRowid(Fts5In
20850 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
20860 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44  .  if( pIter->pD
20870 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 72 65  oclist ){.    re
20880 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63  turn pIter->pDoc
20890 6c 69 73 74 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  list->iRowid;.  
208a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
208b0 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  n fts5MultiIterR
208c0 6f 77 69 64 28 70 49 74 65 72 2d 3e 70 4d 75 6c  owid(pIter->pMul
208d0 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ti);.  }.}.../*.
208e0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
208f0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
20900 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f 70  containing a cop
20910 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  y of the positio
20920 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68  n list for.** th
20930 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
20940 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
20950 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f 20 74   *pn is set to t
20960 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
20970 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74  uffer .** in byt
20980 65 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  es before return
20990 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ing..**.** The r
209a0 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 20 64  eturned buffer d
209b0 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
209c0 74 68 65 20 30 78 30 30 20 74 65 72 6d 69 6e 61  the 0x00 termina
209d0 74 6f 72 20 62 79 74 65 20 73 74 6f 72 65 64 20  tor byte stored 
209e0 6f 6e 0a 2a 2a 20 64 69 73 6b 2e 0a 2a 2f 0a 63  on.** disk..*/.c
209f0 6f 6e 73 74 20 75 38 20 2a 73 71 6c 69 74 65 33  onst u8 *sqlite3
20a00 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28  Fts5IterPoslist(
20a10 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
20a20 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  Iter, int *pn){.
20a30 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
20a40 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 6e  clist ){.    *pn
20a50 20 3d 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69   = pIter->pDocli
20a60 73 74 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20  st->nPoslist;.  
20a70 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
20a80 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69  pDoclist->aPosli
20a90 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
20aa0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20   Fts5Index *p = 
20ab0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20  pIter->pIndex;. 
20ac0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
20ad0 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  o(&pIter->poslis
20ae0 74 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  t);.    fts5Mult
20af0 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  iIterPoslist(p, 
20b00 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30  pIter->pMulti, 0
20b10 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
20b20 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
20b30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
20b40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   );.    if( p->r
20b50 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  c ) return 0;.  
20b60 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70    *pn = pIter->p
20b70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 72 65  oslist.n;.    re
20b80 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 6f 73 6c  turn pIter->posl
20b90 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ist.p;.  }.}../*
20ba0 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65  .** Close an ite
20bb0 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  rator opened by 
20bc0 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
20bd0 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  to sqlite3Fts5In
20be0 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76  dexQuery()..*/.v
20bf0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49  oid sqlite3Fts5I
20c00 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64  terClose(Fts5Ind
20c10 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
20c20 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20    if( pIter ){. 
20c30 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44     if( pIter->pD
20c40 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
20c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
20c60 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 29  er->pDoclist->a)
20c70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
20c80 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f 63  free(pIter->pDoc
20c90 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  list);.    }else
20ca0 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  {.      fts5Mult
20cb0 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d  iIterFree(pIter-
20cc0 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e  >pIndex, pIter->
20cd0 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66  pMulti);.      f
20ce0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
20cf0 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75  ase(pIter->pStru
20d00 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  ct);.      fts5B
20d10 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
20d20 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
20d30 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52  }.    fts5CloseR
20d40 65 61 64 65 72 28 70 49 74 65 72 2d 3e 70 49 6e  eader(pIter->pIn
20d50 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
20d60 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
20d70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
20d80 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20   the "averages" 
20d90 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
20da0 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20  buffer supplied 
20db0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
20dc0 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  * argument. Retu
20dd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
20de0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
20df0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
20e00 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72  ode.** if an err
20e10 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  or occurs..*/.in
20e20 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
20e30 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74  exGetAverages(Ft
20e40 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
20e50 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20  Buffer *pBuf){. 
20e60 20 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42   fts5DataReadOrB
20e70 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46  uffer(p, pBuf, F
20e80 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
20e90 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ID);.  return p-
20ea0 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >rc;.}../*.** Re
20eb0 70 6c 61 63 65 20 74 68 65 20 63 75 72 72 65 6e  place the curren
20ec0 74 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  t "averages" rec
20ed0 6f 72 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ord with the con
20ee0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66  tents of the buf
20ef0 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64  fer .** supplied
20f00 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
20f10 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
20f20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
20f30 53 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35  SetAverages(Fts5
20f40 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20  Index *p, const 
20f50 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *pData, int n
20f60 44 61 74 61 29 7b 0a 20 20 66 74 73 35 44 61 74  Data){.  fts5Dat
20f70 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41  aWrite(p, FTS5_A
20f80 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70  VERAGES_ROWID, p
20f90 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
20fa0 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
20fb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
20fc0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
20fd0 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f  f blocks this mo
20fe0 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72  dule has read fr
20ff0 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  om the %_data.**
21000 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20   table since it 
21010 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  was created..*/.
21020 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
21030 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e  ndexReads(Fts5In
21040 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  dex *p){.  retur
21050 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a     n p->nRead;.}..