/ Hex Artifact Content
Login

Artifact 13f9dd9788f90c419ea33db0fcb2214c2f1290ef:


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: 4d 75 6c 74 69 53 65 67 49 74 65 72 20 46 74 73  MultiSegIter Fts
2620: 35 4d 75 6c 74 69 53 65 67 49 74 65 72 3b 0a 74  5MultiSegIter;.t
2630: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2640: 73 35 4e 6f 64 65 49 74 65 72 20 46 74 73 35 4e  s5NodeIter Fts5N
2650: 6f 64 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66  odeIter;.typedef
2660: 20 73 74 72 75 63 74 20 46 74 73 35 50 61 67 65   struct Fts5Page
2670: 57 72 69 74 65 72 20 46 74 73 35 50 61 67 65 57  Writer Fts5PageW
2680: 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  riter;.typedef s
2690: 74 72 75 63 74 20 46 74 73 35 50 65 6e 64 69 6e  truct Fts5Pendin
26a0: 67 44 6f 63 6c 69 73 74 20 46 74 73 35 50 65 6e  gDoclist Fts5Pen
26b0: 64 69 6e 67 44 6f 63 6c 69 73 74 3b 0a 74 79 70  dingDoclist;.typ
26c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
26d0: 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20 46  PendingPoslist F
26e0: 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73  ts5PendingPoslis
26f0: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
2700: 74 20 46 74 73 35 50 6f 73 49 74 65 72 20 46 74  t Fts5PosIter Ft
2710: 73 35 50 6f 73 49 74 65 72 3b 0a 74 79 70 65 64  s5PosIter;.typed
2720: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2730: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2740: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2750: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2760: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2770: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2780: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2790: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.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 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
27c0: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.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 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
27f0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
2800: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2810: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2820: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2830: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 0a 2f 2a 0a  reSegment;.../*.
2840: 2a 2a 20 4f 6e 65 20 6f 62 6a 65 63 74 20 70 65  ** One object pe
2850: 72 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  r %_data table..
2860: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e  */.struct Fts5In
2870: 64 65 78 20 7b 0a 20 20 46 74 73 35 43 6f 6e 66  dex {.  Fts5Conf
2880: 69 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20 20 20  ig *pConfig;    
2890: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
28a0: 61 6c 20 74 61 62 6c 65 20 63 6f 6e 66 69 67 75  al table configu
28b0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72  ration */.  char
28c0: 20 2a 7a 44 61 74 61 54 62 6c 3b 20 20 20 20 20   *zDataTbl;     
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28e0: 61 6d 65 20 6f 66 20 25 5f 64 61 74 61 20 74 61  ame of %_data ta
28f0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ble */.  int pgs
2900: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
2910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 72 67           /* Targ
2920: 65 74 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  et page size for
2930: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20   this index */. 
2940: 20 69 6e 74 20 6e 4d 69 6e 4d 65 72 67 65 3b 20   int nMinMerge; 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 69 6e 70 75   /* Minimum inpu
2970: 74 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 61 20  t segments in a 
2980: 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  merge */.  int n
2990: 57 6f 72 6b 55 6e 69 74 3b 20 20 20 20 20 20 20  WorkUnit;       
29a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
29b0: 61 66 20 70 61 67 65 73 20 69 6e 20 61 20 22 75  af pages in a "u
29c0: 6e 69 74 22 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a  nit" of work */.
29d0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  /*.  ** Varia
29e0: 62 6c 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20  bles related to 
29f0: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e  the accumulation
2a00: 20 6f 66 20 74 6f 6b 65 6e 73 20 61 6e 64 20 64   of tokens and d
2a10: 6f 63 6c 69 73 74 73 20 77 69 74 68 69 6e 20 74  oclists within t
2a20: 68 65 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  he.  ** in-memor
2a30: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 65  y hash tables be
2a40: 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 66 6c  fore they are fl
2a50: 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 20  ushed to disk.. 
2a60: 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 20 2a   */.  Fts3Hash *
2a70: 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  aHash;          
2a80: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 68 61 73        /* One has
2a90: 68 20 66 6f 72 20 74 65 72 6d 73 2c 20 6f 6e 65  h for terms, one
2aa0: 20 66 6f 72 20 65 61 63 68 20 70 72 65 66 69 78   for each prefix
2ab0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65   */.  int nMaxPe
2ac0: 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20  ndingData;      
2ad0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e        /* Max pen
2ae0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
2af0: 20 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20 2a   flush to disk *
2b00: 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67  /.  int nPending
2b10: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2b20: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
2b30: 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20  ytes of pending 
2b40: 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57  data */.  i64 iW
2b50: 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20  riteRowid;      
2b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
2b70: 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64  id for current d
2b80: 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  oc being written
2b90: 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20   */..  /* Error 
2ba0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20  state. */.  int 
2bb0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2bd0: 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  urrent error cod
2be0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65  e */..  /* State
2bf0: 20 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73   used by the fts
2c00: 35 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74  5DataXXX() funct
2c10: 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ions. */.  sqlit
2c20: 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72  e3_blob *pReader
2c30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f  ;          /* RO
2c40: 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20   incr-blob open 
2c50: 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  on %_data table 
2c60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2c70: 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20  t *pWriter;     
2c80: 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20       /* "INSERT 
2c90: 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45  ... %_data VALUE
2ca0: 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c  S(?,?)" */.  sql
2cb0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65  ite3_stmt *pDele
2cc0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ter;         /* 
2cd0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64  "DELETE FROM %_d
2ce0: 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e  ata ... id>=? AN
2cf0: 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 7d 3b 0a 0a  D id<=?" */.};..
2d00: 73 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69  struct Fts5Docli
2d10: 73 74 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 62  stIter {.  int b
2d20: 41 73 63 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20  Asc;.  u8 *a;.  
2d30: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  int n;.  int i;.
2d40: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
2d50: 69 61 62 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74  iables. aPoslist
2d60: 3d 3d 30 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20  ==0 at EOF */.  
2d70: 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 75 38  i64 iRowid;.  u8
2d80: 20 2a 61 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e   *aPoslist;.  in
2d90: 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a  t nPoslist;.};..
2da0: 73 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78  struct Fts5Index
2db0: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64  Iter {.  Fts5Ind
2dc0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 46 74  ex *pIndex;.  Ft
2dd0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
2de0: 72 75 63 74 3b 0a 20 20 46 74 73 35 4d 75 6c 74  ruct;.  Fts5Mult
2df0: 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69  iSegIter *pMulti
2e00: 3b 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ;.  Fts5DoclistI
2e10: 74 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20  ter *pDoclist;. 
2e20: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
2e30: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
2e40: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
2e50: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
2e60: 73 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  slist */.};../*.
2e70: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 72 65 63 6f  ** A single reco
2e80: 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
2e90: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
2ea0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 61 74  /.struct Fts5Dat
2eb0: 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20 20 20 20  a {.  u8 *p;    
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2ee0: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
2ef0: 69 6e 69 6e 67 20 72 65 63 6f 72 64 20 2a 2f 0a  ining record */.
2f00: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
2f30: 6f 72 64 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ord in bytes */.
2f40: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 2f 2a 20 52 65 66 20 63 6f 75 6e 74 20 2a    /* Ref count *
2f70: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 65 66 6f  /.};../*.** Befo
2f80: 72 65 20 69 74 20 69 73 20 66 6c 75 73 68 65 64  re it is flushed
2f90: 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 20 73 65   to a level-0 se
2fa0: 67 6d 65 6e 74 2c 20 74 65 72 6d 20 64 61 74 61  gment, term data
2fb0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
2fc0: 0a 2a 2a 20 74 68 65 20 68 61 73 68 20 74 61 62  .** the hash tab
2fd0: 6c 65 73 20 69 6e 20 74 68 65 20 46 74 73 35 49  les in the Fts5I
2fe0: 6e 64 65 78 2e 61 48 61 73 68 5b 5d 20 61 72 72  ndex.aHash[] arr
2ff0: 61 79 2e 20 48 61 73 68 20 74 61 62 6c 65 20 6b  ay. Hash table k
3000: 65 79 73 20 61 72 65 0a 2a 2a 20 74 65 72 6d 73  eys are.** terms
3010: 20 28 6f 72 2c 20 66 6f 72 20 70 72 65 66 69 78   (or, for prefix
3020: 20 69 6e 64 65 78 65 73 2c 20 74 65 72 6d 20 70   indexes, term p
3030: 72 65 66 69 78 65 73 29 20 61 6e 64 20 76 61 6c  refixes) and val
3040: 75 65 73 20 61 72 65 20 69 6e 73 74 61 6e 63 65  ues are instance
3050: 73 0a 2a 2a 20 6f 66 20 74 79 70 65 20 46 74 73  s.** of type Fts
3060: 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 2e  5PendingDoclist.
3070: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50  .*/.struct Fts5P
3080: 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 7b 0a  endingDoclist {.
3090: 20 20 75 38 20 2a 70 54 65 72 6d 3b 20 20 20 20    u8 *pTerm;    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 2f 2a 20 54 65 72 6d 20 66 6f 72 20 74 68    /* Term for th
30c0: 69 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  is entry */.  in
30d0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30f0: 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   Bytes of data a
3100: 74 20 70 54 65 72 6d 20 2a 2f 0a 20 20 46 74 73  t pTerm */.  Fts
3110: 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20  5PendingPoslist 
3120: 2a 70 50 6f 73 6c 69 73 74 3b 20 20 20 2f 2a 20  *pPoslist;   /* 
3130: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  Linked list of p
3140: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 20 2a 2f  osition lists */
3150: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72     /* Column for
3180: 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 70   last entry in p
3190: 50 65 6e 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  Pending */.  int
31a0: 20 69 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   iPos;          
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c0: 50 6f 73 20 76 61 6c 75 65 20 66 6f 72 20 6c 61  Pos value for la
31d0: 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 65 6e  st entry in pPen
31e0: 64 69 6e 67 20 2a 2f 0a 20 20 46 74 73 35 50 65  ding */.  Fts5Pe
31f0: 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70 4e  ndingDoclist *pN
3200: 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 55 73 65  ext;      /* Use
3210: 64 20 64 75 72 69 6e 67 20 6d 65 72 67 65 20 73  d during merge s
3220: 6f 72 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74  ort */.};.struct
3230: 20 46 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c   Fts5PendingPosl
3240: 69 73 74 20 7b 0a 20 20 69 36 34 20 69 52 6f 77  ist {.  i64 iRow
3250: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3260: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
3270: 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73   for this doclis
3280: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 46 74 73  t entry */.  Fts
3290: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b0: 43 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20  Current doclist 
32c0: 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 46 74  contents */.  Ft
32d0: 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74  s5PendingPoslist
32e0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a   *pNext;      /*
32f0: 20 50 72 65 76 69 6f 75 73 20 70 6f 73 6c 69 73   Previous poslis
3300: 74 20 66 6f 72 20 73 61 6d 65 20 74 65 72 6d 20  t for same term 
3310: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
3320: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3330: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
3340: 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ord for each ind
3350: 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ex are represent
3360: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46  ed.** using an F
3370: 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63  ts5Structure rec
3380: 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57  ord in memory. W
3390: 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e  hich uses instan
33a0: 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f  ces of the .** o
33b0: 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75  ther Fts5Structu
33c0: 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63  reXXX types as c
33d0: 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74  omponents..*/.st
33e0: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
33f0: 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e  reSegment {.  in
3400: 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20  t iSegid;       
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3420: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
3430: 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20   int nHeight;   
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73 65   /* Height of se
3460: 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a  gment b-tree */.
3470: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3490: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
34a0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
34b0: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
34c0: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
34e0: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
34f0: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
3500: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3510: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
3520: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3550: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
3560: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
3570: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3590: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
35a0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
35b0: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
35c0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
35d0: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
35e0: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
35f0: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3600: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3610: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 75  5Structure {.  u
3620: 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  64 nWriteCounter
3630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3640: 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77  * Total leaves w
3650: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
3660: 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65  0 */.  int nLeve
3670: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3680: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3690: 20 6f 66 20 6c 65 76 65 6c 73 20 69 6e 20 74 68   of levels in th
36a0: 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74  is index */.  Ft
36b0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
36c0: 20 61 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a   aLevel[0];   /*
36d0: 20 41 72 72 61 79 20 6f 66 20 6e 4c 65 76 65 6c   Array of nLevel
36e0: 20 6c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 2a   level objects *
36f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f  /.};../*.** An o
3700: 62 6a 65 63 74 20 6f 66 20 74 79 70 65 20 46 74  bject of type Ft
3710: 73 35 53 65 67 57 72 69 74 65 72 20 69 73 20 75  s5SegWriter is u
3720: 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  sed to write to 
3730: 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72  segments..*/.str
3740: 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69 74  uct Fts5PageWrit
3750: 65 72 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b  er {.  int pgno;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
3780: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
3790: 61 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  age */.  Fts5Buf
37a0: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
37b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
37c0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61  er containing pa
37d0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73  ge data */.  Fts
37e0: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3800: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3810: 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  g previous term 
3820: 6f 6e 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74  on page */.};.st
3830: 72 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74  ruct Fts5SegWrit
3840: 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78 3b  er {.  int iIdx;
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3870: 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
3880: 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20   int iSegid;    
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 2f 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69   /* Segid to wri
38b0: 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  te to */.  int n
38c0: 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  Writer;         
38d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
38e0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
38f0: 69 6e 20 61 57 72 69 74 65 72 20 2a 2f 0a 20 20  in aWriter */.  
3900: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
3910: 61 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20  aWriter;        
3920: 2f 2a 20 41 72 72 61 79 20 6f 66 20 50 61 67 65  /* Array of Page
3930: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a  Writer objects *
3940: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77  /.  i64 iPrevRow
3950: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3960: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
3970: 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
3980: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
3990: 0a 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69  .  u8 bFirstRowi
39a0: 64 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  dInDoclist;     
39b0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
39c0: 78 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73  xt rowid is firs
39d0: 74 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  t in doclist */.
39e0: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
39f0: 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  InPage;         
3a00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
3a10: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
3a20: 20 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e   in page */.  in
3a30: 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 20  t nLeafWritten; 
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a50: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
3a60: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f  pages written */
3a70: 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20  .  int nEmpty;  
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3aa0: 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72 6d 2d  contiguous term-
3ab0: 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 20 20  less nodes */.  
3ac0: 46 74 73 35 42 75 66 66 65 72 20 64 6c 69 64 78  Fts5Buffer dlidx
3ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3ae0: 2f 2a 20 44 6f 63 6c 69 73 74 20 69 6e 64 65 78  /* Doclist index
3af0: 20 2a 2f 0a 20 20 69 36 34 20 69 44 6c 69 64 78   */.  i64 iDlidx
3b00: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
3b10: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
3b20: 73 20 72 6f 77 69 64 20 61 70 70 65 6e 64 65 64  s rowid appended
3b30: 20 74 6f 20 64 6c 69 64 78 20 2a 2f 0a 20 20 69   to dlidx */.  i
3b40: 6e 74 20 62 44 6c 69 64 78 50 72 65 76 56 61 6c  nt bDlidxPrevVal
3b50: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  id;            /
3b60: 2a 20 54 72 75 65 20 69 66 20 69 44 6c 69 64 78  * True if iDlidx
3b70: 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f  Prev is valid */
3b80: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
3b90: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
3ba0: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67  through the merg
3bb0: 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e  ed results of on
3bc0: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
3bd0: 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20  ts,.** visiting 
3be0: 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 20  each term/docid 
3bf0: 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67  pair in the merg
3c00: 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e  ed data..**.** n
3c10: 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20  Seg is always a 
3c20: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65  power of two gre
3c30: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
3c40: 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  al to the number
3c50: 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20   of.** segments 
3c60: 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74  that this object
3c70: 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61   is merging data
3c80: 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20   from. Both the 
3c90: 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46  aSeg[] and.** aF
3ca0: 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72  irst[] arrays ar
3cb0: 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20  e sized at nSeg 
3cc0: 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65  entries. The aSe
3cd0: 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64  g[] array is pad
3ce0: 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f  ded.** with zero
3cf0: 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65  ed objects - the
3d00: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61  se are handled a
3d10: 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69  s if they were i
3d20: 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a  terators opened.
3d30: 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d  ** on empty segm
3d40: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
3d50: 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
3d60: 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53  ring segments aS
3d70: 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e  eg[N] and aSeg[N
3d80: 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20  +1], where N is 
3d90: 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65  an.** even numbe
3da0: 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  r, is stored in 
3db0: 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f  aFirst[(nSeg+N)/
3dc0: 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22  2]. The "result"
3dd0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70   of the .** comp
3de0: 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63  arison in this c
3df0: 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e  ontext is the in
3e00: 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61  dex of the itera
3e10: 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74  tor that current
3e20: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
3e30: 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d  the smaller term
3e40: 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
3e50: 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74  on. Iterators at
3e60: 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73   EOF are.** cons
3e70: 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65  idered to be gre
3e80: 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74  ater than all ot
3e90: 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  her iterators..*
3ea0: 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63  *.** aFirst[1] c
3eb0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
3ec0: 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74  x in aSeg[] of t
3ed0: 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  he iterator that
3ee0: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
3ef0: 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f  e smallest key o
3f00: 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30  verall. aFirst[0
3f10: 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f  ] is unused. .*/
3f20: 0a 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c 74  .struct Fts5Mult
3f30: 69 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e 74  iSegIter {.  int
3f40: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f60: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
3f70: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
3f80: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
3f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3fa0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
3fb0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
3fc0: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
3fd0: 61 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  aSeg;           
3fe0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
3ff0: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4000: 20 2a 2f 0a 20 20 75 31 36 20 2a 61 46 69 72 73   */.  u16 *aFirs
4010: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4020: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4030: 20 6d 65 72 67 65 20 73 74 61 74 65 20 28 73 65   merge state (se
4040: 65 20 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a  e above) */.};..
4050: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
4060: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
4070: 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  gh a single segm
4080: 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61  ent, visiting ea
4090: 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a  ch term/docid.**
40a0: 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67   pair in the seg
40b0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67  ment..**.** pSeg
40c0: 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65  :.**   The segme
40d0: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
40e0: 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  rough..**.** iLe
40f0: 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72  afPgno:.**   Cur
4100: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
4110: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67  umber within seg
4120: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ment..**.** iLea
4130: 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79  fOffset:.**   By
4140: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
4150: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
4160: 66 20 74 68 61 74 20 69 73 20 6f 6e 65 20 62 79  f that is one by
4170: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
4180: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 72 6f 77 69  of the.**   rowi
4190: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
41a0: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
41b0: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
41c0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
41d0: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
41e0: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
41f0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
4200: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
4210: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
4220: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
4230: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
4240: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
4250: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
4260: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
4270: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
4280: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
4290: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
42a0: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
42b0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
42c0: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
42d0: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
42e0: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
42f0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
4300: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
4310: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
4320: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
4330: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
4340: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
4350: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
4360: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
4370: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
4380: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
4390: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
43a0: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
43b0: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
43c0: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
43d0: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
43e0: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
43f0: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
4400: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
4410: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
4420: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
4430: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
4440: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
4450: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
4460: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
4470: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
4480: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
4490: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
44a0: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
44b0: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
44c0: 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73 20   through docids 
44d0: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
44e0: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  er instead of th
44f0: 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74  e.**     default
4500: 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65   descending orde
4510: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
4520: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
4530: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
4540: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
4550: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
4560: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4570: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
4580: 2a 2a 0a 2a 2a 20 20 20 20 20 45 61 63 68 20 74  **.**     Each t
4590: 69 6d 65 20 61 20 6e 65 77 20 70 61 67 65 20 69  ime a new page i
45a0: 73 20 6c 6f 61 64 65 64 2c 20 74 68 65 20 69 74  s loaded, the it
45b0: 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  erator is set to
45c0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
45d0: 20 20 20 20 20 66 69 6e 61 6c 20 72 6f 77 69 64       final rowid
45e0: 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
45f0: 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65 74  the aRowidOffset
4600: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  [] array is popu
4610: 6c 61 74 65 64 20 0a 2a 2a 20 20 20 20 20 77 69  lated .**     wi
4620: 74 68 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  th the byte offs
4630: 65 74 73 20 6f 66 20 61 6c 6c 20 72 65 6c 65 76  ets of all relev
4640: 61 6e 74 20 72 6f 77 69 64 20 66 69 65 6c 64 73  ant rowid fields
4650: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 2a   on the page. .*
4660: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67  /.struct Fts5Seg
4670: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 53 74 72  Iter {.  Fts5Str
4680: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
4690: 53 65 67 3b 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg;     /* Segm
46a0: 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ent to iterate t
46b0: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
46c0: 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
46e0: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
46f0: 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  n current leaf *
4700: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
4730: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
4740: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
4750: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4760: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4770: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4780: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4790: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
47a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
47b0: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
47c0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
47d0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
47e0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
47f0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
4800: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
4810: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4820: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4830: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4840: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4850: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4860: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4870: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
4880: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
4890: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
48a0: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
48b0: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
48c0: 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  t;..  /* The fol
48d0: 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20  lowing are only 
48e0: 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35  used if the FTS5
48f0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
4900: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f   flag is set. */
4910: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
4920: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4930: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e     /* Current en
4940: 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66  try in aRowidOff
4950: 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  set[] */.  int n
4960: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4980: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4990: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
49a0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  rray */.  int *a
49b0: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
49c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
49d0: 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20  ay of offset to 
49e0: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a  rowid fields */.
49f0: 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20  .  /* Variables 
4a00: 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
4a10: 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  on current entry
4a20: 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  . */.  Fts5Buffe
4a30: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
4a40: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4a50: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20  t term */.  i64 
4a60: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4a80: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
4a90: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  };..#define FTS5
4aa0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
4ab0: 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54   0x01.#define FT
4ac0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4ad0: 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20  SE 0x02.../*.** 
4ae0: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4af0: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 70 61 67  ting through pag
4b00: 69 6e 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  inated data..*/.
4b10: 73 74 72 75 63 74 20 46 74 73 35 43 68 75 6e 6b  struct Fts5Chunk
4b20: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74  Iter {.  Fts5Dat
4b30: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4b50: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 2e 20 4e  ent leaf data. N
4b60: 55 4c 4c 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a 20  ULL -> EOF. */. 
4b70: 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b   i64 iLeafRowid;
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 72 6f 77   /* Absolute row
4ba0: 69 64 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65  id of current le
4bb0: 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  af */.  int nRem
4bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4bd0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69          /* Remai
4be0: 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61  ning bytes of da
4bf0: 74 61 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  ta to read */.. 
4c00: 20 2f 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d   /* Output param
4c10: 65 74 65 72 73 20 2a 2f 0a 20 20 75 38 20 2a 70  eters */.  u8 *p
4c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
4c40: 69 6e 74 65 72 20 74 6f 20 63 68 75 6e 6b 20 6f  inter to chunk o
4c50: 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  f data */.  int 
4c60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4c80: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 20  ize of buffer p 
4c90: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a  in bytes */.};..
4ca0: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
4cb0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
4cc0: 67 68 20 61 20 73 69 6e 67 6c 65 20 70 6f 73 69  gh a single posi
4cd0: 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69 73  tion list on dis
4ce0: 6b 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  k..*/.struct Fts
4cf0: 35 50 6f 73 49 74 65 72 20 7b 0a 20 20 46 74 73  5PosIter {.  Fts
4d00: 35 43 68 75 6e 6b 49 74 65 72 20 63 68 75 6e 6b  5ChunkIter chunk
4d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4d20: 43 75 72 72 65 6e 74 20 63 68 75 6e 6b 20 6f 66  Current chunk of
4d30: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69   data */.  int i
4d40: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
4d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
4d60: 66 73 65 74 20 77 69 74 68 69 6e 20 63 68 75 6e  fset within chun
4d70: 6b 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 6e 74  k data */..  int
4d80: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 50 6f   iCol;.  int iPo
4d90: 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  s;.};../*.** Obj
4da0: 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e  ect for iteratin
4db0: 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  g through the co
4dc0: 6e 65 6e 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  nents of a singl
4dd0: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
4de0: 69 6e 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a  in .** memory..*
4df0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4e 6f 64  /.struct Fts5Nod
4e00: 65 49 74 65 72 20 7b 0a 20 20 2f 2a 20 49 6e 74  eIter {.  /* Int
4e10: 65 72 6e 61 6c 2e 20 53 65 74 20 61 6e 64 20 6d  ernal. Set and m
4e20: 61 6e 61 67 65 64 20 62 79 20 66 74 73 35 4e 6f  anaged by fts5No
4e30: 64 65 49 74 65 72 58 58 58 28 29 20 66 75 6e 63  deIterXXX() func
4e40: 74 69 6f 6e 73 2e 20 45 78 63 65 70 74 2c 20 0a  tions. Except, .
4e50: 20 20 2a 2a 20 74 68 65 20 45 4f 46 20 74 65 73    ** the EOF tes
4e60: 74 20 66 6f 72 20 74 68 65 20 69 74 65 72 61 74  t for the iterat
4e70: 6f 72 20 69 73 20 28 46 74 73 35 4e 6f 64 65 49  or is (Fts5NodeI
4e80: 74 65 72 2e 61 44 61 74 61 3d 3d 30 29 2e 20 20  ter.aData==0).  
4e90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
4ea0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74  Data;.  int nDat
4eb0: 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  a;.  int iOff;..
4ec0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
4ed0: 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  ables */.  Fts5B
4ee0: 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e  uffer term;.  in
4ef0: 74 20 6e 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20  t nEmpty;.  int 
4f00: 69 43 68 69 6c 64 3b 0a 20 20 69 6e 74 20 62 44  iChild;.  int bD
4f10: 6c 69 64 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  lidx;.};../*.** 
4f20: 41 6e 20 46 74 73 35 42 74 72 65 65 49 74 65 72  An Fts5BtreeIter
4f30: 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20   object is used 
4f40: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
4f50: 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  gh all entries i
4f60: 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65 20  n the.** b-tree 
4f70: 68 69 65 72 61 72 63 68 79 20 62 65 6c 6f 6e 67  hierarchy belong
4f80: 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ing to a single 
4f90: 66 74 73 35 20 73 65 67 6d 65 6e 74 2e 20 49 6e  fts5 segment. In
4fa0: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 0a 2a   this case the.*
4fb0: 2a 20 22 62 2d 74 72 65 65 20 68 69 65 72 61 72  * "b-tree hierar
4fc0: 63 68 79 22 20 69 73 20 61 6c 6c 20 62 2d 74 72  chy" is all b-tr
4fd0: 65 65 20 6e 6f 64 65 73 20 65 78 63 65 70 74 20  ee nodes except 
4fe0: 6c 65 61 76 65 73 2e 20 45 61 63 68 20 65 6e 74  leaves. Each ent
4ff0: 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74  ry in the.** b-t
5000: 72 65 65 20 68 69 65 72 61 72 63 68 79 20 63 6f  ree hierarchy co
5010: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 66 6f  nsists of the fo
5020: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
5030: 20 69 4c 65 61 66 3a 20 20 54 68 65 20 70 61 67   iLeaf:  The pag
5040: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
5050: 6c 65 61 66 20 70 61 67 65 20 74 68 65 20 65 6e  leaf page the en
5060: 74 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  try points to..*
5070: 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20 20 41  *.**   term:   A
5080: 20 73 70 6c 69 74 2d 6b 65 79 20 74 68 61 74 20   split-key that 
5090: 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c 65 61  all terms on lea
50a0: 66 20 70 61 67 65 20 24 69 4c 65 61 66 20 6d 75  f page $iLeaf mu
50b0: 73 74 20 62 65 20 67 72 65 61 74 65 72 0a 2a 2a  st be greater.**
50c0: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 6e 20             than 
50d0: 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20 54 68 65  or equal to. The
50e0: 20 22 74 65 72 6d 22 20 61 73 73 6f 63 69 61 74   "term" associat
50f0: 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
5100: 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 20  t b-tree.**     
5110: 20 20 20 20 20 20 68 69 65 72 61 72 63 68 79 20        hierarchy 
5120: 65 6e 74 72 79 20 28 74 68 65 20 6f 6e 65 20 74  entry (the one t
5130: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c 65  hat points to le
5140: 61 66 20 70 61 67 65 20 31 29 20 69 73 20 61 6c  af page 1) is al
5150: 77 61 79 73 20 0a 2a 2a 20 20 20 20 20 20 20 20  ways .**        
5160: 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69     an empty stri
5170: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d 70  ng..**.**   nEmp
5180: 74 79 3a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ty: The number o
5190: 66 20 65 6d 70 74 79 20 28 74 65 72 6d 6c 65 73  f empty (termles
51a0: 73 29 20 6c 65 61 66 20 70 61 67 65 73 20 74 68  s) leaf pages th
51b0: 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  at immediately.*
51c0: 2a 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c 6c  *           foll
51d0: 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a 0a  owing iLeaf..**.
51e0: 2a 2a 20 54 68 65 20 46 74 73 35 42 74 72 65 65  ** The Fts5Btree
51f0: 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  Iter object is o
5200: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
5210: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
5220: 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a 2f  y-check code..*/
5230: 0a 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65  .struct Fts5Btre
5240: 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20 46  eIterLevel {.  F
5250: 74 73 35 4e 6f 64 65 49 74 65 72 20 73 3b 20 20  ts5NodeIter s;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5270: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 74  * Iterator for t
5280: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
5290: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
52a0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
52b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
52c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
52d0: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
52e0: 74 73 35 42 74 72 65 65 49 74 65 72 20 7b 0a 20  ts5BtreeIter {. 
52f0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20   Fts5Index *p;  
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
5320: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
5330: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
5340: 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
5350: 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
5360: 74 68 69 73 20 73 65 67 6d 65 6e 74 27 73 20 62  this segment's b
5370: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  -tree */.  int i
5380: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
53a0: 64 65 78 20 70 53 65 67 20 62 65 6c 6f 6e 67 73  dex pSeg belongs
53b0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 76   to */.  int nLv
53c0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
53d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
53e0: 20 6f 66 20 61 4c 76 6c 5b 5d 20 61 72 72 61 79   of aLvl[] array
53f0: 20 2a 2f 0a 20 20 46 74 73 35 42 74 72 65 65 49   */.  Fts5BtreeI
5400: 74 65 72 4c 65 76 65 6c 20 2a 61 4c 76 6c 3b 20  terLevel *aLvl; 
5410: 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 66        /* Level f
5420: 6f 72 20 65 61 63 68 20 74 69 65 72 20 6f 66 20  or each tier of 
5430: 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 2f 2a 20  b-tree */..  /* 
5440: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
5450: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
5460: 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
5470: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
5480: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   term */.  int i
5490: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
54a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
54b0: 61 66 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65  af containing te
54c0: 72 6d 73 20 3e 3d 20 63 75 72 72 65 6e 74 20 74  rms >= current t
54d0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d  erm */.  int nEm
54e0: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
54f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5500: 65 72 20 6f 66 20 22 65 6d 70 74 79 22 20 6c 65  er of "empty" le
5510: 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  aves following i
5520: 4c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 62 45  Leaf */.  int bE
5530: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
5540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
5550: 20 74 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20   to true at EOF 
5560: 2a 2f 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b  */.  int bDlidx;
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5590: 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 64  there exists a d
55a0: 6c 69 64 78 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74  lidx */.};..stat
55b0: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
55c0: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
55d0: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
55e0: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
55f0: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
5600: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
5610: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
5620: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5630: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5640: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5650: 49 6e 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  In[1];.}../*.** 
5660: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
5670: 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74 20  urn a buffer at 
5680: 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65  least nByte byte
5690: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
56a0: 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
56b0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
56c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
56d0: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63   set the error c
56e0: 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74  ode in.** the Ft
56f0: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70  s5Index handle p
5700: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5710: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
5720: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
5730: 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49  5IdxMalloc(Fts5I
5740: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79  ndex *p, int nBy
5750: 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  te){.  void *pRe
5760: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  t;.  assert( p->
5770: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5780: 0a 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65  .  pRet = sqlite
5790: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
57a0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
57b0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
57c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
57d0: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
57e0: 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  pRet, 0, nByte);
57f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
5800: 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  et;.}.../*.** Co
5810: 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
5820: 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20  ts of the pLeft 
5830: 62 75 66 66 65 72 20 77 69 74 68 20 74 68 65 20  buffer with the 
5840: 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c  pRight/nRight bl
5850: 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ob..**.** Return
5860: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
5870: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
5880: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
5890: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
58a0: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
58b0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
58c0: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
58d0: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
58e0: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
58f0: 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20  Right.*/.static 
5900: 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f  int fts5BufferCo
5910: 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73  mpareBlob(.  Fts
5920: 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20  5Buffer *pLeft, 
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5940: 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  Left hand side o
5950: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a  f comparison */.
5960: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67    const u8 *pRig
5970: 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20  ht, int nRight  
5980: 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20    /* Right hand 
5990: 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  side of comparis
59a0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  on */.){.  int n
59b0: 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d  Cmp = MIN(pLeft-
59c0: 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69  >n, nRight);.  i
59d0: 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
59e0: 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74  pLeft->p, pRight
59f0: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
5a00: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
5a10: 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20  ft->n - nRight) 
5a20: 3a 20 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 20 30  : res);.}..#if 0
5a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
5a40: 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 63  CompareBlob(.  c
5a50: 6f 6e 73 74 20 75 38 20 2a 70 4c 65 66 74 2c 20  onst u8 *pLeft, 
5a60: 69 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e  int nLeft,.  con
5a70: 73 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69  st u8 *pRight, i
5a80: 6e 74 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69  nt nRight.){.  i
5a90: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c  nt nCmp = MIN(nL
5aa0: 65 66 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  eft, nRight);.  
5ab0: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
5ac0: 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20  (pLeft, pRight, 
5ad0: 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCmp);.  return 
5ae0: 28 72 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74  (res==0 ? (nLeft
5af0: 20 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73   - nRight) : res
5b00: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
5b10: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63  ** Compare the c
5b20: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74  ontents of the t
5b30: 77 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e 67  wo buffers using
5b40: 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e   memcmp(). If on
5b50: 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20 61  e buffer.** is a
5b60: 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
5b70: 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73  ther, it is cons
5b80: 69 64 65 72 65 64 20 74 68 65 20 6c 65 73 73 65  idered the lesse
5b90: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
5ba0: 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20  -ve if pLeft is 
5bb0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69  smaller than pRi
5bc0: 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61  ght, 0 if they a
5bd0: 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b  re equal or.** +
5be0: 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20  ve if pRight is 
5bf0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65  smaller than pLe
5c00: 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ft. In other wor
5c10: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65  ds:.**.**     re
5c20: 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52  s = *pLeft - *pR
5c30: 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ight.*/.static i
5c40: 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  nt fts5BufferCom
5c50: 70 61 72 65 28 46 74 73 35 42 75 66 66 65 72 20  pare(Fts5Buffer 
5c60: 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66 66  *pLeft, Fts5Buff
5c70: 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  er *pRight){.  i
5c80: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
5c90: 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e  eft->n, pRight->
5ca0: 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  n);.  int res = 
5cb0: 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c  memcmp(pLeft->p,
5cc0: 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70   pRight->p, nCmp
5cd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73  );.  return (res
5ce0: 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20  ==0 ? (pLeft->n 
5cf0: 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72  - pRight->n) : r
5d00: 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  es);.}.../*.** C
5d10: 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d 6f 6e  lose the read-on
5d20: 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c 20  ly blob handle, 
5d30: 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a 2a  if it is open..*
5d40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
5d50: 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 46 74  s5CloseReader(Ft
5d60: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
5d70: 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b  f( p->pReader ){
5d80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
5d90: 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64  b_close(p->pRead
5da0: 65 72 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61  er);.    p->pRea
5db0: 64 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  der = 0;.  }.}..
5dc0: 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61 20  static Fts5Data 
5dd0: 2a 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42  *fts5DataReadOrB
5de0: 75 66 66 65 72 28 0a 20 20 46 74 73 35 49 6e 64  uffer(.  Fts5Ind
5df0: 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75  ex *p, .  Fts5Bu
5e00: 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 69  ffer *pBuf, .  i
5e10: 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 46  64 iRowid.){.  F
5e20: 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20  ts5Data *pRet = 
5e30: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
5e40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e50: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a   int rc;..    /*
5e60: 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e   If the blob han
5e70: 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  dle is not yet o
5e80: 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65  pen, open and se
5e90: 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  ek it. Otherwise
5ea0: 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  , use.    ** the
5eb0: 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41   blob_reopen() A
5ec0: 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65  PI to reseek the
5ed0: 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68   existing blob h
5ee0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  andle.  */.    i
5ef0: 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  f( p->pReader==0
5f00: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f   ){.      Fts5Co
5f10: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
5f20: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
5f30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5f40: 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
5f50: 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  ->db, .         
5f60: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
5f70: 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f  ->zDataTbl, "blo
5f80: 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20  ck", iRowid, 0, 
5f90: 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20  &p->pReader.    
5fa0: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
5fb0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5fc0: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70  e3_blob_reopen(p
5fd0: 2d 3e 70 52 65 61 64 65 72 2c 20 69 52 6f 77 69  ->pReader, iRowi
5fe0: 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  d);.    }..    i
5ff0: 66 28 20 72 63 20 29 20 66 74 73 35 4d 69 73 73  f( rc ) fts5Miss
6000: 69 6e 67 44 61 74 61 28 29 3b 0a 0a 20 20 20 20  ingData();..    
6010: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6020: 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
6030: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
6040: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65  lob_bytes(p->pRe
6050: 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ader);.      if(
6060: 20 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20   pBuf ){.       
6070: 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
6080: 70 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  pBuf);.        f
6090: 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 72  ts5BufferGrow(&r
60a0: 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  c, pBuf, nByte);
60b0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
60c0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
60d0: 70 2d 3e 70 52 65 61 64 65 72 2c 20 70 42 75 66  p->pReader, pBuf
60e0: 2d 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  ->p, nByte, 0);.
60f0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
6100: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 42 75 66  SQLITE_OK ) pBuf
6110: 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ->n = nByte;.   
6120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6130: 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61    pRet = (Fts5Da
6140: 74 61 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  ta*)fts5IdxMallo
6150: 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
6160: 44 61 74 61 29 20 2b 20 6e 42 79 74 65 29 3b 0a  Data) + nByte);.
6170: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 52 65          if( !pRe
6180: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
6190: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20 3d         pRet->n =
61a0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
61b0: 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26  pRet->p = (u8*)&
61c0: 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pRet[1];.       
61d0: 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b   pRet->nRef = 1;
61e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
61f0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
6200: 70 2d 3e 70 52 65 61 64 65 72 2c 20 70 52 65 74  p->pReader, pRet
6210: 2d 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  ->p, nByte, 0);.
6220: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
6230: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
6250: 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ree(pRet);.     
6260: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
6270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6280: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63  .    }.    p->rc
6290: 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65   = rc;.  }..  re
62a0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
62b0: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72  .** Retrieve a r
62c0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
62d0: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
62e0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
62f0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
6300: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
6310: 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65  rror left in the
6320: 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f   .** Fts5Index o
6330: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
6340: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
6350: 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65  ataRead(Fts5Inde
6360: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
6370: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
6380: 52 65 74 20 3d 20 66 74 73 35 44 61 74 61 52 65  Ret = fts5DataRe
6390: 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c  adOrBuffer(p, 0,
63a0: 20 69 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65   iRowid);.  asse
63b0: 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28  rt( (pRet==0)==(
63c0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
63d0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ) );.  return pR
63e0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  et;.}../*.** Rea
63f0: 64 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  d a record from 
6400: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
6410: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
6420: 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
6430: 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  .** second argum
6440: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ent..**.** If an
6450: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
6460: 6e 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20  n error is left 
6470: 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  in the Fts5Index
6480: 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a   object. If an.*
6490: 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  * error has alre
64a0: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
64b0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
64c0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
64d0: 20 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f   a .** no-op..*/
64e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
64f0: 35 44 61 74 61 42 75 66 66 65 72 28 46 74 73 35  5DataBuffer(Fts5
6500: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75  Index *p, Fts5Bu
6510: 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20  ffer *pBuf, i64 
6520: 69 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64  iRowid){.  (void
6530: 29 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42  )fts5DataReadOrB
6540: 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69  uffer(p, pBuf, i
6550: 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Rowid);.}../*.**
6560: 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
6570: 65 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63  ence to data rec
6580: 6f 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  ord returned by 
6590: 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
65a0: 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65  to.** fts5DataRe
65b0: 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ad()..*/.static 
65c0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c  void fts5DataRel
65d0: 65 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70  ease(Fts5Data *p
65e0: 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61  Data){.  if( pDa
65f0: 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ta ){.    assert
6600: 28 20 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30 20  ( pData->nRef>0 
6610: 29 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 52  );.    pData->nR
6620: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44  ef--;.    if( pD
6630: 61 74 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ata->nRef==0 ) s
6640: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
6650: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  a);.  }.}..stati
6660: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
6670: 65 66 65 72 65 6e 63 65 28 46 74 73 35 44 61 74  eference(Fts5Dat
6680: 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 70 44 61  a *pData){.  pDa
6690: 74 61 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f  ta->nRef++;.}../
66a0: 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52  *.** INSERT OR R
66b0: 45 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20  EPLACE a record 
66c0: 69 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20  into the %_data 
66d0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
66e0: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 57 72   void fts5DataWr
66f0: 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ite(Fts5Index *p
6700: 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f  , i64 iRowid, co
6710: 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
6720: 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28  nt nData){.  if(
6730: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
6740: 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  K ) return;..  i
6750: 66 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30  f( p->pWriter==0
6760: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
6770: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
6780: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
6790: 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nfig;.    char *
67a0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
67b0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
67c0: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25  "REPLACE INTO '%
67d0: 71 27 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29  q'.%Q(id, block)
67e0: 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70   VALUES(?,?)", p
67f0: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
6800: 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a  zDataTbl.    );.
6810: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
6820: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6830: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6840: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
6850: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6860: 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62  e_v2(pConfig->db
6870: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e  , zSql, -1, &p->
6880: 70 57 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 20  pWriter, 0);.   
6890: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
68a0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
68b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
68c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  OK ){.      p->r
68d0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
68e0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
68f0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6900: 69 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72  int64(p->pWriter
6910: 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  , 1, iRowid);.  
6920: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
6930: 62 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c  b(p->pWriter, 2,
6940: 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53   pData, nData, S
6950: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
6960: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
6970: 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e  >pWriter);.  p->
6980: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
6990: 65 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  et(p->pWriter);.
69a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
69b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
69c0: 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45  QL:.**.**     DE
69d0: 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61  LETE FROM %_data
69e0: 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45 45   WHERE id BETWEE
69f0: 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24 69  N $iFirst AND $i
6a00: 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Last.*/.static v
6a10: 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c 65  oid fts5DataDele
6a20: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
6a30: 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36 34   i64 iFirst, i64
6a40: 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70   iLast){.  if( p
6a50: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
6a60: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
6a70: 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20   p->pDeleter==0 
6a80: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
6a90: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6aa0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6ab0: 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  fig;.    char *z
6ac0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
6ad0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
6ae0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27  DELETE FROM '%q'
6af0: 2e 25 51 20 57 48 45 52 45 20 69 64 3e 3d 3f 20  .%Q WHERE id>=? 
6b00: 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e  AND id<=?", pCon
6b10: 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
6b20: 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20  taTbl.    );.   
6b30: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
6b40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6b50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
6b60: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
6b70: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6b80: 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a  2(pConfig->db, z
6b90: 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65  Sql, -1, &p->pDe
6ba0: 6c 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  leter, 0);.     
6bb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
6bc0: 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
6bd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6be0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6bf0: 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
6c00: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
6c10: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
6c20: 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c  t64(p->pDeleter,
6c30: 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73   1, iFirst);.  s
6c40: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
6c50: 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32  4(p->pDeleter, 2
6c60: 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69  , iLast);.  sqli
6c70: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c  te3_step(p->pDel
6c80: 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  eter);.  p->rc =
6c90: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
6ca0: 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a  ->pDeleter);.}..
6cb0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
6cc0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e  sqlite3_blob han
6cd0: 64 6c 65 20 75 73 65 64 20 74 6f 20 72 65 61 64  dle used to read
6ce0: 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
6cf0: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
6d00: 2a 2a 20 41 6e 64 20 64 69 73 63 61 72 64 20 61  ** And discard a
6d10: 6e 79 20 63 61 63 68 65 64 20 72 65 61 64 73 2e  ny cached reads.
6d20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6d30: 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
6d40: 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64  end of.** a read
6d50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
6d60: 77 68 65 6e 20 61 6e 79 20 73 75 62 2d 74 72 61  when any sub-tra
6d70: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
6d80: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
6d90: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
6da0: 52 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20  Reset(Fts5Index 
6db0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52  *p){.  if( p->pR
6dc0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  eader ){.    sql
6dd0: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
6de0: 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  p->pReader);.   
6df0: 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b   p->pReader = 0;
6e00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6e10: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
6e20: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6e30: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 20   segment iSegid 
6e40: 69 6e 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a  in index iIdx..*
6e50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6e60: 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
6e70: 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ent(Fts5Index *p
6e80: 2c 20 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20  , int iIdx, int 
6e90: 69 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69  iSegid){.  i64 i
6ea0: 46 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47  First = FTS5_SEG
6eb0: 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c  MENT_ROWID(iIdx,
6ec0: 20 69 53 65 67 69 64 2c 20 30 2c 20 30 29 3b 0a   iSegid, 0, 0);.
6ed0: 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54    i64 iLast = FT
6ee0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
6ef0: 28 69 49 64 78 2c 20 69 53 65 67 69 64 2b 31 2c  (iIdx, iSegid+1,
6f00: 20 30 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35   0, 0)-1;.  fts5
6f10: 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46  DataDelete(p, iF
6f20: 69 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a  irst, iLast);.}.
6f30: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
6f40: 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ze and return th
6f50: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  e structure reco
6f60: 72 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  rd currently sto
6f70: 72 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65  red in serialize
6f80: 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e  d.** form within
6f90: 20 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44   buffer pData/nD
6fa0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46  ata..**.** The F
6fb0: 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65  ts5Structure.aLe
6fc0: 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46  vel[] and each F
6fd0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
6fe0: 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a  l.aSeg[] array.*
6ff0: 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63  * are over-alloc
7000: 61 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74  ated by one slot
7010: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
7020: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
7030: 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f  ents.** to be mo
7040: 72 65 20 65 61 73 69 6c 79 20 65 64 69 74 65 64  re easily edited
7050: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
7060: 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f  ror occurs, *ppO
7070: 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ut is set to NUL
7080: 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20  L and an SQLite 
7090: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65  error code.** re
70a0: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
70b0: 65 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  e, *ppOut is set
70c0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
70d0: 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a   new object and.
70e0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
70f0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
7100: 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75   int fts5Structu
7110: 72 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73  reDecode(.  cons
7120: 74 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20  t u8 *pData,    
7130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7140: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
7150: 20 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75   serialized stru
7160: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
7170: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
7180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
7190: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 44 61  ze of buffer pDa
71a0: 74 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ta in bytes */. 
71b0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
71c0: 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
71d0: 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61   /* OUT: Deseria
71e0: 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  lized object */.
71f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
7200: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
7210: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c   = 0;.  int iLvl
7220: 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d  ;.  int nLevel =
7230: 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   0;.  int nSegme
7240: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42  nt = 0;.  int nB
7250: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
7260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
7270: 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61  es of space to a
7280: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 46 74 73  llocate */.  Fts
7290: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
72a0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 61 64   = 0;..  /* Read
72b0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
72c0: 72 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20  r of levels and 
72d0: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
72e0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20  e start of the. 
72f0: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72 65   ** structure re
7300: 63 6f 72 64 2e 20 55 73 65 20 74 68 65 73 65 20  cord. Use these 
7310: 76 61 6c 75 65 73 20 74 6f 20 61 6c 6c 6f 63 61  values to alloca
7320: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
7330: 20 64 65 73 65 72 69 61 6c 69 7a 65 64 0a 20 20   deserialized.  
7340: 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ** version of th
7350: 65 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69  e record. */.  i
7360: 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26   = getVarint32(&
7370: 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c  pData[i], nLevel
7380: 29 3b 0a 20 20 69 20 2b 3d 20 67 65 74 56 61 72  );.  i += getVar
7390: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
73a0: 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42   nSegment);.  nB
73b0: 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69  yte = (.      si
73c0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
73d0: 72 65 29 20 2b 20 0a 20 20 20 20 20 20 73 69 7a  re) + .      siz
73e0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
73f0: 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65  eLevel) * (nLeve
7400: 6c 2b 31 29 20 2b 0a 20 20 20 20 20 20 73 69 7a  l+1) +.      siz
7410: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7420: 65 53 65 67 6d 65 6e 74 29 20 2a 20 28 6e 53 65  eSegment) * (nSe
7430: 67 6d 65 6e 74 2b 6e 4c 65 76 65 6c 2b 31 29 0a  gment+nLevel+1).
7440: 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46    );.  pRet = (F
7450: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
7460: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
7470: 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74  te);..  if( pRet
7480: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
7490: 63 65 20 3d 20 28 75 38 2a 29 26 70 52 65 74 2d  ce = (u8*)&pRet-
74a0: 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 2b 31  >aLevel[nLevel+1
74b0: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52  ];.    memset(pR
74c0: 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  et, 0, nByte);. 
74d0: 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20     pRet->nLevel 
74e0: 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 20  = nLevel;.    i 
74f0: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
7500: 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26  int(&pData[i], &
7510: 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  pRet->nWriteCoun
7520: 74 65 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c  ter);.    for(iL
7530: 76 6c 3d 30 3b 20 69 4c 76 6c 3c 6e 4c 65 76 65  vl=0; iLvl<nLeve
7540: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
7550: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
7560: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52  evel *pLvl = &pR
7570: 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  et->aLevel[iLvl]
7580: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74  ;.      int nTot
7590: 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  al;.      int iS
75a0: 65 67 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20  eg;..      i += 
75b0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  getVarint32(&pDa
75c0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
75d0: 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  rge);.      i +=
75e0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44   getVarint32(&pD
75f0: 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b  ata[i], nTotal);
7600: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
7610: 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65  Total>=pLvl->nMe
7620: 72 67 65 20 29 3b 0a 20 20 20 20 20 20 70 4c 76  rge );.      pLv
7630: 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c  l->nSeg = nTotal
7640: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53  ;.      pLvl->aS
7650: 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
7660: 75 72 65 53 65 67 6d 65 6e 74 2a 29 70 53 70 61  ureSegment*)pSpa
7670: 63 65 3b 0a 20 20 20 20 20 20 70 53 70 61 63 65  ce;.      pSpace
7680: 20 2b 3d 20 28 28 6e 54 6f 74 61 6c 2b 31 29 20   += ((nTotal+1) 
7690: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
76a0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b  uctureSegment));
76b0: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  ..      for(iSeg
76c0: 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b  =0; iSeg<nTotal;
76d0: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
76e0: 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
76f0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7700: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl->aSeg[iSeg].i
7710: 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
7720: 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
7730: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
7740: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65  ->aSeg[iSeg].nHe
7750: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 69  ight);.        i
7760: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7770: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7780: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
7790: 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
77a0: 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
77b0: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
77c0: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
77d0: 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  oLast);.      }.
77e0: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74 2d 3e      }.    pRet->
77f0: 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2e 61  aLevel[nLevel].a
7800: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
7810: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 70 53 70  tureSegment*)pSp
7820: 61 63 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ace;.  }else{.  
7830: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
7840: 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f  MEM;.  }..  *ppO
7850: 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74  ut = pRet;.  ret
7860: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7870: 20 52 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69   Read, deseriali
7880: 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ze and return th
7890: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  e structure reco
78a0: 72 64 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64  rd for index iId
78b0: 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  x..**.** The Fts
78c0: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
78d0: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
78e0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
78f0: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
7900: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
7910: 65 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ed as described 
7920: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  for function fts
7930: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
7940: 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a  () .** above..**
7950: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
7960: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
7970: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
7980: 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20  error code left 
7990: 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e  in the.** Fts5In
79a0: 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61  dex handle. If a
79b0: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
79c0: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
79d0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
79e0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ** is called, it
79f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
7a00: 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
7a10: 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74  ture *fts5Struct
7a20: 75 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65  ureRead(Fts5Inde
7a30: 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 29 7b  x *p, int iIdx){
7a40: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
7a50: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
7a60: 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  fig;.  Fts5Struc
7a70: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
7a80: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
7a90: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
7aa0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ac0: 2f 2a 20 25 5f 64 61 74 61 20 65 6e 74 72 79 20  /* %_data entry 
7ad0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 74 72 75 63  containing struc
7ae0: 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a 0a  ture record */..
7af0: 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
7b00: 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
7b10: 20 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74   );.  pData = ft
7b20: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
7b30: 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
7b40: 49 44 28 69 49 64 78 29 29 3b 0a 20 20 69 66 28  ID(iIdx));.  if(
7b50: 20 21 70 44 61 74 61 20 29 20 72 65 74 75 72 6e   !pData ) return
7b60: 20 30 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74   0;.  p->rc = ft
7b70: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
7b80: 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74  e(pData->p, pDat
7b90: 61 2d 3e 6e 2c 20 26 70 52 65 74 29 3b 0a 0a 20  a->n, &pRet);.. 
7ba0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
7bb0: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
7bc0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
7bd0: 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
7be0: 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53  ence to an Fts5S
7bf0: 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
7c00: 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65  returned by an e
7c10: 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20  arlier .** call 
7c20: 74 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65  to fts5Structure
7c30: 52 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74  Read() or fts5St
7c40: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e  ructureDecode().
7c50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7c60: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
7c70: 65 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75  ease(Fts5Structu
7c80: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
7c90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
7ca0: 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ruct);.}../*.** 
7cb0: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
7cc0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
7cd0: 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72  nts in index str
7ce0: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a  ucture pStruct..
7cf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
7d00: 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
7d10: 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72  Segments(Fts5Str
7d20: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
7d30: 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  {.  int nSegment
7d40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
7d50: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
7d60: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
7d70: 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  */.  int iLvl;  
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
7da0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
7db0: 6c 65 76 65 6c 73 20 2a 2f 0a 0a 20 20 66 6f 72  levels */..  for
7dc0: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
7dd0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
7de0: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 6e 53 65 67  Lvl++){.    nSeg
7df0: 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d  ment += pStruct-
7e00: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
7e10: 65 67 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  eg;.  }..  retur
7e20: 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f  n nSegment;.}../
7e30: 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61  *.** Serialize a
7e40: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74  nd store the "st
7e50: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20  ructure" record 
7e60: 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a  for index iIdx..
7e70: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
7e80: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
7e90: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  an error code in
7ea0: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
7eb0: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
7ec0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
7ed0: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
7ee0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
7ef0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
7f00: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7f10: 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  reWrite(Fts5Inde
7f20: 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20  x *p, int iIdx, 
7f30: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7f40: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e  Struct){.  int n
7f50: 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20  Segment;        
7f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
7f70: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
7f80: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35  gments */.  Fts5
7f90: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7fb0: 75 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69  uffer to seriali
7fc0: 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a  ze record into *
7fd0: 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20  /.  int iLvl;   
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
8000: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
8010: 65 76 65 6c 73 20 2a 2f 0a 0a 20 20 6e 53 65 67  evels */..  nSeg
8020: 6d 65 6e 74 20 3d 20 66 74 73 35 53 74 72 75 63  ment = fts5Struc
8030: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
8040: 73 28 70 53 74 72 75 63 74 29 3b 0a 20 20 6d 65  s(pStruct);.  me
8050: 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
8060: 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
8070: 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
8080: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8090: 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63  rc, &buf, pStruc
80a0: 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 66 74  t->nLevel);.  ft
80b0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
80c0: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
80d0: 66 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20  f, nSegment);.  
80e0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
80f0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8100: 62 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63  buf, (i64)pStruc
8110: 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
8120: 29 3b 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30  );..  for(iLvl=0
8130: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
8140: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
8150: 0a 20 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20  .    int iSeg;  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
8180: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65  erate through se
8190: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 46 74  gments */.    Ft
81a0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
81b0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
81c0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
81d0: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
81e0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
81f0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
8200: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 66 74 73  nMerge);.    fts
8210: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
8220: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
8230: 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 0a  , pLvl->nSeg);..
8240: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
8250: 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
8260: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
8270: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8280: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8290: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
82a0: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
82b0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
82c0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
82d0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
82e0: 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67  aSeg[iSeg].nHeig
82f0: 68 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  ht);.      fts5B
8300: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
8310: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
8320: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
8330: 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20  .pgnoFirst);.   
8340: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
8350: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
8360: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
8370: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73  eg[iSeg].pgnoLas
8380: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
8390: 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
83a0: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
83b0: 5f 52 4f 57 49 44 28 69 49 64 78 29 2c 20 62 75  _ROWID(iIdx), bu
83c0: 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 66  f.p, buf.n);.  f
83d0: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
83e0: 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  uf);.}.../*.** I
83f0: 66 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f 66  f the pIter->iOf
8400: 66 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e 74  f offset current
8410: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ly points to an 
8420: 65 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e 67  entry indicating
8430: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
8440: 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 2c  term-less nodes,
8450: 20 61 64 76 61 6e 63 65 20 70 61 73 74 20 69 74   advance past it
8460: 20 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d 3e   and set pIter->
8470: 6e 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68 65  nEmpty to.** the
8480: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79   number of empty
8490: 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f   child nodes..*/
84a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
84b0: 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e  5NodeIterGobbleN
84c0: 45 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49 74  Empty(Fts5NodeIt
84d0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
84e0: 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 49  ( pIter->iOff<pI
84f0: 74 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30 3d  ter->nData && 0=
8500: 3d 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70  =(pIter->aData[p
8510: 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78  Iter->iOff] & 0x
8520: 66 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72  fe) ){.    pIter
8530: 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72  ->bDlidx = pIter
8540: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
8550: 4f 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20 20  Off] & 0x01;.   
8560: 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a   pIter->iOff++;.
8570: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
8580: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
8590: 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74  pIter->aData[pIt
85a0: 65 72 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72  er->iOff], pIter
85b0: 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c  ->nEmpty);.  }el
85c0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e  se{.    pIter->n
85d0: 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Empty = 0;.    p
85e0: 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30  Iter->bDlidx = 0
85f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
8600: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
8610: 78 74 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20  xt entry within 
8620: 74 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61  the node..*/.sta
8630: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64  tic void fts5Nod
8640: 65 49 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70  eIterNext(int *p
8650: 52 63 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72  Rc, Fts5NodeIter
8660: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
8670: 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74  pIter->iOff>=pIt
8680: 65 72 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20  er->nData ){.   
8690: 20 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20   pIter->aData = 
86a0: 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43  0;.    pIter->iC
86b0: 68 69 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e  hild += pIter->n
86c0: 45 6d 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Empty;.  }else{.
86d0: 20 20 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e      int nPre, nN
86e0: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ew;.    pIter->i
86f0: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
8700: 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61  32(&pIter->aData
8710: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e  [pIter->iOff], n
8720: 50 72 65 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  Pre);.    pIter-
8730: 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69  >iOff += getVari
8740: 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61  nt32(&pIter->aDa
8750: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  ta[pIter->iOff],
8760: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 49 74 65   nNew);.    pIte
8770: 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65  r->term.n = nPre
8780: 2d 32 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  -2;.    fts5Buff
8790: 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63  erAppendBlob(pRc
87a0: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
87b0: 6e 4e 65 77 2c 20 70 49 74 65 72 2d 3e 61 44 61  nNew, pIter->aDa
87c0: 74 61 2b 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b  ta+pIter->iOff);
87d0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
87e0: 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49   += nNew;.    pI
87f0: 74 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28  ter->iChild += (
8800: 31 20 2b 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74  1 + pIter->nEmpt
8810: 79 29 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65  y);.    fts5Node
8820: 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79  IterGobbleNEmpty
8830: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28  (pIter);.    if(
8840: 20 2a 70 52 63 20 29 20 70 49 74 65 72 2d 3e 61   *pRc ) pIter->a
8850: 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Data = 0;.  }.}.
8860: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
8870: 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ze the iterator 
8880: 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
8890: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
88a0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
88b0: 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20  segment node in 
88c0: 70 44 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  pData..*/.static
88d0: 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74   void fts5NodeIt
88e0: 65 72 49 6e 69 74 28 63 6f 6e 73 74 20 75 38 20  erInit(const u8 
88f0: 2a 61 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *aData, int nDat
8900: 61 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20  a, Fts5NodeIter 
8910: 2a 70 49 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65  *pIter){.  memse
8920: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
8930: 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
8940: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 44  Iter->aData = aD
8950: 61 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44  ata;.  pIter->nD
8960: 61 74 61 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70  ata = nData;.  p
8970: 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 67 65 74  Iter->iOff = get
8980: 56 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c 20  Varint32(aData, 
8990: 70 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a  pIter->iChild);.
89a0: 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f    fts5NodeIterGo
89b0: 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72  bbleNEmpty(pIter
89c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
89d0: 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   any memory allo
89e0: 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
89f0: 72 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f  rator object..*/
8a00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8a10: 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46 74  5NodeIterFree(Ft
8a20: 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65  s5NodeIter *pIte
8a30: 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r){.  fts5Buffer
8a40: 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72  Free(&pIter->ter
8a50: 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  m);.}../*.** Loa
8a60: 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20  d the next leaf 
8a70: 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65  page into the se
8a80: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a  gment iterator..
8a90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
8aa0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
8ab0: 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
8ac0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
8ad0: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
8ae0: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
8af0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
8b00: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
8b10: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
8b20: 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74   advance to next
8b30: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74   page */.){.  Ft
8b40: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8b50: 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
8b60: 2d 3e 70 53 65 67 3b 0a 20 20 69 66 28 20 70 49  ->pSeg;.  if( pI
8b70: 74 65 72 2d 3e 70 4c 65 61 66 20 29 20 66 74 73  ter->pLeaf ) fts
8b80: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
8b90: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
8ba0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b  ter->iLeafPgno++
8bb0: 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  ;.  if( pIter->i
8bc0: 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e  LeafPgno<=pSeg->
8bd0: 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20  pgnoLast ){.    
8be0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66  pIter->pLeaf = f
8bf0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
8c00: 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47          FTS5_SEG
8c10: 4d 45 4e 54 5f 52 4f 57 49 44 28 70 49 74 65 72  MENT_ROWID(pIter
8c20: 2d 3e 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53  ->iIdx, pSeg->iS
8c30: 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e  egid, 0, pIter->
8c40: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29  iLeafPgno).    )
8c50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8c60: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
8c70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 65  .  }.}../*.** Le
8c80: 61 76 65 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ave pIter->iLeaf
8c90: 4f 66 66 73 65 74 20 61 73 20 74 68 65 20 6f 66  Offset as the of
8ca0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65  fset to the size
8cb0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 66 69   field of the fi
8cc0: 72 73 74 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20  rst.** position 
8cd0: 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69  list. The positi
8ce0: 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e  on list belongin
8cf0: 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 70 49  g to document pI
8d00: 74 65 72 2d 3e 69 52 6f 77 69 64 2e 0a 2a 2f 0a  ter->iRowid..*/.
8d10: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
8d20: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
8d30: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
8d40: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
8d50: 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20  , int nKeep){.  
8d60: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
8d70: 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20  Leaf->p;        
8d80: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61  /* Buffer to rea
8d90: 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20  d data from */. 
8da0: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
8db0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
8dc0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65   /* Offset to re
8dd0: 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ad at */.  int n
8de0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
8df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
8e00: 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20  tes of new data 
8e10: 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 67 65  */..  iOff += ge
8e20: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
8e30: 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74  f], nNew);.  pIt
8e40: 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65  er->term.n = nKe
8e50: 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  ep;.  fts5Buffer
8e60: 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
8e70: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
8e80: 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
8e90: 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77  ;.  iOff += nNew
8ea0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
8eb0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
8ec0: 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  f;.  pIter->iTer
8ed0: 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  mLeafPgno = pIte
8ee0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  r->iLeafPgno;.  
8ef0: 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d  if( iOff>=pIter-
8f00: 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  >pLeaf->n ){.   
8f10: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
8f20: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
8f30: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
8f40: 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
8f50: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
8f60: 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
8f70: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
8f80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8f90: 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  }.    iOff = 4;.
8fa0: 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
8fb0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69  Leaf->p;.  }.  i
8fc0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
8fd0: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
8fe0: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
8ff0: 69 52 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72  iRowid);.  pIter
9000: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
9010: 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  iOff;.}../*.** I
9020: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74  nitialize the it
9030: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49  erator object pI
9040: 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  ter to iterate t
9050: 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74 72 69  hrough the entri
9060: 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74  es in.** segment
9070: 20 70 53 65 67 20 77 69 74 68 69 6e 20 69 6e 64   pSeg within ind
9080: 65 78 20 69 49 64 78 2e 20 54 68 65 20 69 74 65  ex iIdx. The ite
9090: 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  rator is left po
90a0: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a  inting to the .*
90b0: 2a 20 66 69 72 73 74 20 65 6e 74 72 79 20 77 68  * first entry wh
90c0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
90d0: 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
90e0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
90f0: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
9100: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
9110: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
9120: 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
9130: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
9140: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
9150: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
9160: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
9170: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
9180: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
9190: 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  erInit(.  Fts5In
91a0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
91b0: 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20   .  int iIdx,   
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48      /* Config.aH
91e0: 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46  ash[] index of F
91f0: 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74  TS index */.  Ft
9200: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
9210: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
9220: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
9230: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
9240: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9260: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
9270: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
9280: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
9290: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
92a0: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
92b0: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
92c0: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
92d0: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
92e0: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
92f0: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
9300: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
9310: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
9320: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
9330: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
9340: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
9350: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
9360: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
9370: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
9380: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
9390: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
93a0: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
93b0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
93c0: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
93d0: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
93e0: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
93f0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
9400: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
9410: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
9420: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
9430: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
9440: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70  (*pIter));.    p
9450: 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
9460: 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 49  g;.    pIter->iI
9470: 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 70  dx = iIdx;.    p
9480: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
9490: 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
94a0: 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  t-1;.    fts5Seg
94b0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
94c0: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  pIter);.  }..  i
94d0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
94e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38 20 2a 61  _OK ){.    u8 *a
94f0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
9500: 3e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  >p;.    pIter->i
9510: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
9520: 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a  5GetU16(&a[2]);.
9530: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
9540: 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
9550: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  , 0);.  }.}..sta
9560: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61  tic void fts5Lea
9570: 66 48 65 61 64 65 72 28 46 74 73 35 44 61 74 61  fHeader(Fts5Data
9580: 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20 2a 70 69   *pLeaf, int *pi
9590: 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69 54 65  Rowid, int *piTe
95a0: 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77 69 64 20  rm){.  *piRowid 
95b0: 3d 20 28 69 6e 74 29 66 74 73 35 47 65 74 55 31  = (int)fts5GetU1
95c0: 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b  6(&pLeaf->p[0]);
95d0: 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20 28 69 6e  .  *piTerm = (in
95e0: 74 29 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  t)fts5GetU16(&pL
95f0: 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a 2f  eaf->p[2]);.}../
9600: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9610: 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  on is only ever 
9620: 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61 74  called on iterat
9630: 6f 72 73 20 63 72 65 61 74 65 64 20 62 79 20 63  ors created by c
9640: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49  alls to.** Fts5I
9650: 6e 64 65 78 51 75 65 72 79 28 29 20 77 69 74 68  ndexQuery() with
9660: 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51   the FTS5INDEX_Q
9670: 55 45 52 59 5f 41 53 43 20 66 6c 61 67 20 73 65  UERY_ASC flag se
9680: 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  t..**.** When th
9690: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
96a0: 61 6c 6c 65 64 2c 20 69 74 65 72 61 74 6f 72 20  alled, iterator 
96b0: 70 49 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  pIter points to 
96c0: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 0a  the first rowid.
96d0: 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
96e0: 74 20 6c 65 61 66 20 61 73 73 6f 63 69 61 74 65  t leaf associate
96f0: 64 20 77 69 74 68 20 74 68 65 20 74 65 72 6d 20  d with the term 
9700: 62 65 69 6e 67 20 71 75 65 72 69 65 64 2e 20 54  being queried. T
9710: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
9720: 61 64 76 61 6e 63 65 73 20 69 74 20 74 6f 20 70  advances it to p
9730: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74  oint to the last
9740: 20 73 75 63 68 20 72 6f 77 69 64 20 61 6e 64 2c   such rowid and,
9750: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69   if necessary, i
9760: 6e 69 74 69 61 6c 69 7a 65 73 0a 2a 2a 20 74 68  nitializes.** th
9770: 65 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  e aRowidOffset[]
9780: 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65   and iRowidOffse
9790: 74 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a  t variables..*/.
97a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
97b0: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
97c0: 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  itPage(Fts5Index
97d0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
97e0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
97f0: 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
9800: 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  ->n;.  int i = p
9810: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
9820: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
9830: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
9840: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
9850: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
9860: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9870: 20 26 26 20 69 3c 6e 20 29 7b 0a 20 20 20 20 69   && i<n ){.    i
9880: 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20  64 iDelta = 0;. 
9890: 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 0a 20 20     int nPos;..  
98a0: 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
98b0: 33 32 28 26 61 5b 69 5d 2c 20 6e 50 6f 73 29 3b  32(&a[i], nPos);
98c0: 0a 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a  .    i += nPos;.
98d0: 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29 20 62      if( i>=n ) b
98e0: 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 67  reak;.    i += g
98f0: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20  etVarint(&a[i], 
9900: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
9910: 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
9920: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
9930: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20  Iter->iRowid -= 
9940: 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28  iDelta;..    if(
9950: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70   iRowidOffset>=p
9960: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
9970: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
9980: 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52  nNew = pIter->nR
9990: 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a  owidOffset + 8;.
99a0: 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20        int *aNew 
99b0: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
99c0: 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61  realloc(pIter->a
99d0: 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65  RowidOffset, nNe
99e0: 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  w*sizeof(int));.
99f0: 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
9a00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
9a10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
9a20: 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  M;.        break
9a30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9a40: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
9a50: 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  set = aNew;.    
9a60: 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f    pIter->nRowidO
9a70: 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20  ffset = nNew;.  
9a80: 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e    }..    pIter->
9a90: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f  aRowidOffset[iRo
9aa0: 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70  widOffset++] = p
9ab0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
9ac0: 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
9ad0: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  eafOffset = i;. 
9ae0: 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77   }.  pIter->iRow
9af0: 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69  idOffset = iRowi
9b00: 64 4f 66 66 73 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  dOffset;.}.../*.
9b10: 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61  ** Advance itera
9b20: 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65  tor pIter to the
9b30: 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a   next entry. .**
9b40: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
9b50: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
9b60: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
9b70: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
9b80: 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a  ror code. It .**
9b90: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
9ba0: 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
9bb0: 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
9bc0: 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65  hes EOF. If an e
9bd0: 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
9be0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
9bf0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
9c00: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
9c10: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
9c20: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
9c30: 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  gIterNext(.  Fts
9c40: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c60: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
9c70: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
9c80: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
9c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
9ca0: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
9cb0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
9cc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9cd0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66      if( pIter->f
9ce0: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
9cf0: 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20  TER_REVERSE ){. 
9d00: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
9d10: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
9d20: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20  {.        u8 *a 
9d30: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
9d40: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
9d50: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Off;.        int
9d60: 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69   nPos;.        i
9d70: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
9d80: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
9d90: 4f 66 66 73 65 74 2d 2d 3b 0a 0a 20 20 20 20 20  Offset--;..     
9da0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
9db0: 66 66 73 65 74 20 3d 20 69 4f 66 66 20 3d 20 70  ffset = iOff = p
9dc0: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
9dd0: 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  et[pIter->iRowid
9de0: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20  Offset];.       
9df0: 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69   iOff += getVari
9e00: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
9e10: 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  Pos);.        iO
9e20: 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  ff += nPos;.    
9e30: 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 26 61      getVarint(&a
9e40: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
9e50: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
9e60: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
9e70: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d   iDelta;.      }
9e80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
9e90: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
9ea0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
9eb0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
9ec0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  f = 0;.        w
9ed0: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
9ee0: 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
9ef0: 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72  >iLeafPgno>pIter
9f00: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
9f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
9f20: 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20  5Data *pNew;.   
9f30: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
9f40: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  eafPgno--;.     
9f50: 20 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35       pNew = fts5
9f60: 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
9f70: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a  _SEGMENT_ROWID(.
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 70 49 74 65 72 2d 3e 69 49 64 78 2c 20 70 49 74  pIter->iIdx, pIt
9fa0: 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
9fb0: 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  , 0, pIter->iLea
9fc0: 66 50 67 6e 6f 0a 20 20 20 20 20 20 20 20 20 20  fPgno.          
9fd0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
9fe0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
9ff0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
a000: 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  >iLeafPgno==pIte
a010: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
a020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a030: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
a040: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65  rmLeafOffset<pNe
a050: 77 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  w->n ){.        
a060: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
a070: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
a090: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
a0a0: 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  = pIter->iTermLe
a0b0: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  afOffset;.      
a0c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a0d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a0e0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
a0f0: 52 6f 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b  RowidOff, dummy;
a100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
a110: 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4e  ts5LeafHeader(pN
a120: 65 77 2c 20 26 69 52 6f 77 69 64 4f 66 66 2c 20  ew, &iRowidOff, 
a130: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  &dummy);.       
a140: 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
a150: 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dOff ){.        
a160: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
a170: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
a190: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
a1a0: 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  = iRowidOff;.   
a1b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
a1c0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
a1d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
a1e0: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
a1f0: 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 20            u8 *a 
a200: 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  = &pIter->pLeaf-
a210: 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  >p[pIter->iLeafO
a220: 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  ffset];.        
a230: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
a240: 61 66 4f 66 66 73 65 74 20 2b 3d 20 67 65 74 56  afOffset += getV
a250: 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
a260: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a280: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
a290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a2a0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
a2b0: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
a2c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a2d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a2e0: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ..        if( pI
a2f0: 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
a300: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
a310: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
a320: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
a330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a350: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
a360: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
a370: 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
a380: 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
a390: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  erm = 0;.      i
a3a0: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20  nt nKeep = 0;.. 
a3b0: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
a3c0: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
a3d0: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
a3e0: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
a3f0: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
a400: 20 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d    u8 *a = pLeaf-
a410: 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  >p;.      int n 
a420: 3d 20 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20  = pLeaf->n;..   
a430: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
a440: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
a450: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
a460: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50  {.        int nP
a470: 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  oslist;.        
a480: 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
a490: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 50  t32(&a[iOff], nP
a4a0: 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
a4b0: 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 6c 69 73   iOff += nPoslis
a4c0: 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
a4d0: 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
a4e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
a4f0: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20  ext entry is on 
a500: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
a510: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 36 34 20   */.        u64 
a520: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
a530: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
a540: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
a550: 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  ], &iDelta);.   
a560: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
a570: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
a580: 20 20 20 20 20 20 20 20 69 66 28 20 69 44 65 6c          if( iDel
a590: 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
a5a0: 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b     bNewTerm = 1;
a5b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
a5c0: 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
a5d0: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
a5e0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
a5f0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
a600: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
a610: 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  set = 4;.       
a620: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 4f 66     }else if( iOf
a630: 66 21 3d 66 74 73 35 47 65 74 55 31 36 28 26 61  f!=fts5GetU16(&a
a640: 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [2]) ){.        
a650: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
a660: 4f 66 66 73 65 74 20 2b 3d 20 67 65 74 56 61 72  Offset += getVar
a670: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
a680: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20  nKeep);.        
a690: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
a6a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  e{.          pIt
a6b0: 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44  er->iRowid -= iD
a6c0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a  elta;.        }.
a6d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a6e0: 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20       iOff = 0;. 
a6f0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65         /* Next e
a700: 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74  ntry is not on t
a710: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
a720: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
a730: 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( iOff==0 ){.   
a740: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
a750: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
a760: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
a770: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
a780: 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 20 20  Leaf;.          
a790: 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62  if( pLeaf==0 ) b
a7a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a7b0: 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35  if( (iOff = fts5
a7c0: 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
a7d0: 5b 30 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20  [0])) ){.       
a7e0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
a7f0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 70  ite3GetVarint(&p
a800: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Leaf->p[iOff], (
a810: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
a820: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
a830: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
a840: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
a850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a860: 20 20 20 65 6c 73 65 20 69 66 28 20 28 69 4f 66     else if( (iOf
a870: 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
a880: 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 29 20 29 7b  pLeaf->p[2])) ){
a890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
a8a0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
a8b0: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
a8c0: 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31      bNewTerm = 1
a8d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a8f0: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
a900: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
a910: 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49  is now at EOF. I
a920: 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72  f so, return ear
a930: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ly. */.      if(
a940: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 26 26   pIter->pLeaf &&
a950: 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20   bNewTerm ){.   
a960: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
a970: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
a980: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a  ITER_ONETERM ){.
a990: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
a9a0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
a9b0: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  >pLeaf);.       
a9c0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
a9d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
a9e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74  se{.          ft
a9f0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
aa00: 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65  m(p, pIter, nKee
aa10: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
aa20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aa30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
aa40: 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
aa50: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
aa60: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61  first rowid in a
aa70: 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a   doclist. This.*
aa80: 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  * function sets 
aa90: 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70 20  the iterator up 
aaa0: 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65 73  so that iterates
aab0: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
aac0: 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65  r through.** the
aad0: 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61   doclist..*/.sta
aae0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
aaf0: 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73 35  IterReverse(Fts5
ab00: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49  Index *p, int iI
ab10: 64 78 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  dx, Fts5SegIter 
ab20: 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44  *pIter){.  Fts5D
ab30: 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
ab40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
ab50: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
ab60: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  */.  int iOff = 
ab70: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ab80: 65 74 3b 20 20 2f 2a 20 42 79 74 65 20 6f 66 66  et;  /* Byte off
ab90: 73 65 74 20 77 69 74 68 69 6e 20 63 75 72 72 65  set within curre
aba0: 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 46 74 73  nt leaf */.  Fts
abb0: 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30  5Data *pLast = 0
abc0: 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  ;.  int pgnoLast
abd0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65   = 0;..  /* Move
abe0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 74 68 61   to the page tha
abf0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  t contains the l
ac00: 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 69  ast rowid in thi
ac10: 73 20 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20 20  s doclist. */.  
ac20: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
ac30: 4c 65 61 66 3b 0a 0a 20 20 77 68 69 6c 65 28 20  Leaf;..  while( 
ac40: 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b  iOff<pLeaf->n ){
ac50: 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
ac60: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a     i64 iDelta;..
ac70: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
ac80: 6c 69 73 74 20 73 69 7a 65 20 69 6e 20 62 79 74  list size in byt
ac90: 65 73 20 2a 2f 0a 20 20 20 20 69 4f 66 66 20 2b  es */.    iOff +
aca0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
acb0: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
acc0: 50 6f 73 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  Pos);.    iOff +
acd0: 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 69 66 28 20  = nPos;.    if( 
ace0: 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29  iOff>=pLeaf->n )
acf0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
ad00: 52 6f 77 69 64 20 64 65 6c 74 61 2e 20 4f 72 2c  Rowid delta. Or,
ad10: 20 69 66 20 30 78 30 30 2c 20 74 68 65 20 65 6e   if 0x00, the en
ad20: 64 20 6f 66 20 64 6f 63 6c 69 73 74 20 6d 61 72  d of doclist mar
ad30: 6b 65 72 2e 20 2a 2f 0a 20 20 20 20 6e 50 6f 73  ker. */.    nPos
ad40: 20 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c   = getVarint(&pL
ad50: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
ad60: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
ad70: 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
ad80: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 4f 66  ) break;.    iOf
ad90: 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 7d 0a 0a  f += nPos;.  }..
ada0: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61    if( iOff>=pLea
adb0: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 46 74 73 35  f->n ){.    Fts5
adc0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
add0: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
ade0: 70 53 65 67 3b 0a 20 20 20 20 69 36 34 20 69 41  pSeg;.    i64 iA
adf0: 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  bs = FTS5_SEGMEN
ae00: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53  T_ROWID(iIdx, pS
ae10: 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  eg->iSegid, 0, p
ae20: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  Iter->iLeafPgno)
ae30: 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 20  ;.    i64 iLast 
ae40: 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
ae50: 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d  OWID(iIdx, pSeg-
ae60: 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 53 65 67  >iSegid, 0, pSeg
ae70: 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20  ->pgnoLast);..  
ae80: 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f    /* The last ro
ae90: 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
aea0: 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e  st may not be on
aeb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
aec0: 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 2a 2a  e. Search.    **
aed0: 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64   forward to find
aee0: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
aef0: 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f  ning the last ro
af00: 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  wid.  */.    for
af10: 28 69 41 62 73 2b 2b 3b 20 70 2d 3e 72 63 3d 3d  (iAbs++; p->rc==
af20: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 41 62  SQLITE_OK && iAb
af30: 73 3c 3d 69 4c 61 73 74 3b 20 69 41 62 73 2b 2b  s<=iLast; iAbs++
af40: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74  ){.      Fts5Dat
af50: 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61  a *pNew = fts5Da
af60: 74 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b  taRead(p, iAbs);
af70: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
af80: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
af90: 52 6f 77 69 64 2c 20 69 54 65 72 6d 3b 0a 20 20  Rowid, iTerm;.  
afa0: 20 20 20 20 20 20 66 74 73 35 4c 65 61 66 48 65        fts5LeafHe
afb0: 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f 77  ader(pNew, &iRow
afc0: 69 64 2c 20 26 69 54 65 72 6d 29 3b 0a 20 20 20  id, &iTerm);.   
afd0: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 20       if( iRowid 
afe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
aff0: 35 44 61 74 61 20 2a 70 54 6d 70 20 3d 20 70 4c  5Data *pTmp = pL
b000: 61 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ast;.          p
b010: 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Last = pNew;.   
b020: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54         pNew = pT
b030: 6d 70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 67  mp;.          pg
b040: 6e 6f 4c 61 73 74 20 3d 20 69 41 62 73 20 26 20  noLast = iAbs & 
b050: 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
b060: 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20  _DATA_PAGE_B) - 
b070: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
b080: 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 20        if( iTerm 
b090: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 41 62  ){.          iAb
b0a0: 73 20 3d 20 69 4c 61 73 74 3b 0a 20 20 20 20 20  s = iLast;.     
b0b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 74 73     }.        fts
b0c0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
b0d0: 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
b0e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
b0f0: 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20  Last is NULL at 
b100: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
b110: 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   the last rowid 
b120: 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74  for this doclist
b130: 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68  .  ** lies on th
b140: 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
b150: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
b160: 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74  e iterator. In t
b170: 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 69  his case .  ** i
b180: 4c 61 73 74 4f 66 66 20 69 73 20 73 65 74 20 74  LastOff is set t
b190: 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
b1a0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
b1b0: 73 65 74 20 77 69 6c 6c 20 74 61 6b 65 20 77 68  set will take wh
b1c0: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 69 74 65 72  en.  ** the iter
b1d0: 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ator points to t
b1e0: 68 61 74 20 72 6f 77 69 64 2e 0a 20 20 2a 2a 0a  hat rowid..  **.
b1f0: 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73    ** Or, if pLas
b200: 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
b210: 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70 61  hen it is the pa
b220: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
b230: 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72   the last.  ** r
b240: 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  owid..  */.  if(
b250: 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e   pLast ){.    in
b260: 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 66 74 73  t dummy;.    fts
b270: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
b280: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
b290: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
b2a0: 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  Last;.    pIter-
b2b0: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e  >iLeafPgno = pgn
b2c0: 6f 4c 61 73 74 3b 0a 20 20 20 20 66 74 73 35 4c  oLast;.    fts5L
b2d0: 65 61 66 48 65 61 64 65 72 28 70 4c 61 73 74 2c  eafHeader(pLast,
b2e0: 20 26 69 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b   &iOff, &dummy);
b2f0: 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74  .    iOff += get
b300: 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70  Varint(&pLast->p
b310: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
b320: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
b330: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
b340: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
b350: 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
b360: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
b370: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 70 49 74  p, pIter);.  pIt
b380: 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
b390: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
b3a0: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  E;.}../*.** Init
b3b0: 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
b3c0: 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
b3d0: 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
b3e0: 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d  Term within segm
b3f0: 65 6e 74 0a 2a 2a 20 70 53 65 67 2c 20 69 6e 64  ent.** pSeg, ind
b400: 65 78 20 69 49 64 78 2e 20 49 66 20 74 68 65 72  ex iIdx. If ther
b410: 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72  e is no such ter
b420: 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  m in the index, 
b430: 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20  the iterator.** 
b440: 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
b450: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
b460: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
b470: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
b480: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
b490: 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
b4a0: 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
b4b0: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
b4c0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
b4d0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
b4e0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
b4f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b500: 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
b510: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
b540: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  nd */.  int iIdx
b550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b560: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
b570: 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20  g.aHash[] index 
b580: 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a  of FTS index */.
b590: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
b5a0: 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
b5b0: 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
b5c0: 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  k to */.  int fl
b5d0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
b5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
b5f0: 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58  k of FTS5INDEX_X
b600: 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  XX flags */.  Ft
b610: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
b620: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
b630: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
b640: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
b650: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b670: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
b680: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
b690: 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 68 3b  Pg = 1;.  int h;
b6a0: 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28 28 66  .  int bGe = ((f
b6b0: 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
b6c0: 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29 20 26  _QUERY_PREFIX) &
b6d0: 26 20 69 49 64 78 3d 3d 30 29 3b 0a 0a 20 20 61  & iIdx==0);..  a
b6e0: 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c  ssert( bGe==0 ||
b6f0: 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
b700: 44 45 58 5f 51 55 45 52 59 5f 41 53 43 29 3d 3d  DEX_QUERY_ASC)==
b710: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
b720: 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b  Term && nTerm );
b730: 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
b740: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
b750: 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53  r));.  pIter->pS
b760: 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 70 49 74  eg = pSeg;.  pIt
b770: 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b  er->iIdx = iIdx;
b780: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63  ..  /* This bloc
b790: 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76 61 72  k sets stack var
b7a0: 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65  iable iPg to the
b7b0: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
b7c0: 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20  r that may.  ** 
b7d0: 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54  contain term (pT
b7e0: 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69  erm/nTerm), if i
b7f0: 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  t is present in 
b800: 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a  the segment. */.
b810: 20 20 66 6f 72 28 68 3d 70 53 65 67 2d 3e 6e 48    for(h=pSeg->nH
b820: 65 69 67 68 74 2d 31 3b 20 68 3e 30 3b 20 68 2d  eight-1; h>0; h-
b830: 2d 29 7b 0a 20 20 20 20 46 74 73 35 4e 6f 64 65  -){.    Fts5Node
b840: 49 74 65 72 20 6e 6f 64 65 3b 20 20 20 20 20 20  Iter node;      
b850: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69          /* For i
b860: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
b870: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20   internal nodes 
b880: 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  */.    i64 iRowi
b890: 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
b8a0: 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65  _ROWID(iIdx, pSe
b8b0: 67 2d 3e 69 53 65 67 69 64 2c 20 68 2c 20 69 50  g->iSegid, h, iP
b8c0: 67 29 3b 0a 20 20 20 20 46 74 73 35 44 61 74 61  g);.    Fts5Data
b8d0: 20 2a 70 4e 6f 64 65 20 3d 20 66 74 73 35 44 61   *pNode = fts5Da
b8e0: 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64  taRead(p, iRowid
b8f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65  );.    if( pNode
b900: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
b910: 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e    fts5NodeIterIn
b920: 69 74 28 70 4e 6f 64 65 2d 3e 70 2c 20 70 4e 6f  it(pNode->p, pNo
b930: 64 65 2d 3e 6e 2c 20 26 6e 6f 64 65 29 3b 0a 20  de->n, &node);. 
b940: 20 20 20 61 73 73 65 72 74 28 20 6e 6f 64 65 2e     assert( node.
b950: 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20  term.n==0 );..  
b960: 20 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68    iPg = node.iCh
b970: 69 6c 64 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  ild;.    for(fts
b980: 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70  5NodeIterNext(&p
b990: 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20 20  ->rc, &node);.  
b9a0: 20 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74 61        node.aData
b9b0: 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f   && fts5BufferCo
b9c0: 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65 2e  mpareBlob(&node.
b9d0: 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
b9e0: 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20 20  rm)<=0;.        
b9f0: 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74  fts5NodeIterNext
ba00: 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 0a  (&p->rc, &node).
ba10: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 67      ){.      iPg
ba20: 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a   = node.iChild;.
ba30: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f      }.    fts5No
ba40: 64 65 49 74 65 72 46 72 65 65 28 26 6e 6f 64 65  deIterFree(&node
ba50: 29 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  );.    fts5DataR
ba60: 65 6c 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20  elease(pNode);. 
ba70: 20 7d 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53   }..  if( iPg<pS
ba80: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b  eg->pgnoFirst ){
ba90: 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d  .    iPg = pSeg-
baa0: 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 7d 0a  >pgnoFirst;.  }.
bab0: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
bac0: 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20  gno = iPg - 1;. 
bad0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
bae0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
baf0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
bb00: 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eaf ){.    int r
bb10: 65 73 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  es;.    pIter->i
bb20: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
bb30: 35 47 65 74 55 31 36 28 26 70 49 74 65 72 2d 3e  5GetU16(&pIter->
bb40: 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20  pLeaf->p[2]);.  
bb50: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
bb60: 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20  dTerm(p, pIter, 
bb70: 30 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  0);.    do {.   
bb80: 20 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66     res = fts5Buf
bb90: 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
bba0: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
bbb0: 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
bbc0: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62    if( res>=0 ) b
bbd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 74 73 35  reak;.      fts5
bbe0: 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70  SegIterNext(p, p
bbf0: 49 74 65 72 29 3b 0a 20 20 20 20 7d 77 68 69 6c  Iter);.    }whil
bc00: 65 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  e( pIter->pLeaf 
bc10: 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 47 65 3d  );..    if( bGe=
bc20: 3d 30 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  =0 && res ){.   
bc30: 20 20 20 2f 2a 20 53 65 74 20 69 74 65 72 61 74     /* Set iterat
bc40: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45  or to point to E
bc50: 4f 46 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35  OF */.      fts5
bc60: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
bc70: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
bc80: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
bc90: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
bca0: 69 66 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20  if( bGe==0 ){.  
bcb0: 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
bcc0: 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
bcd0: 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
bce0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 26 26 20  pIter->pLeaf && 
bcf0: 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
bd00: 45 58 5f 51 55 45 52 59 5f 41 53 43 29 20 29 7b  EX_QUERY_ASC) ){
bd10: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
bd20: 65 72 52 65 76 65 72 73 65 28 70 2c 20 69 49 64  erReverse(p, iId
bd30: 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  x, pIter);.    }
bd40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65  .  }.}../*.** Ze
bd50: 72 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ro the iterator 
bd60: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
bd70: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
bd80: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
bd90: 53 65 67 49 74 65 72 43 6c 65 61 72 28 46 74 73  SegIterClear(Fts
bda0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
bdb0: 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  {.  fts5BufferFr
bdc0: 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29  ee(&pIter->term)
bdd0: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
bde0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
bdf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
be00: 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e(pIter->aRowidO
be10: 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74  ffset);.  memset
be20: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
be30: 66 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b  f(Fts5SegIter));
be40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65  .}../*.** Do the
be50: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65   comparison nece
be60: 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74  ssary to populat
be70: 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
be80: 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  iOut]..**.** If 
be90: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
bea0: 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ue is non-zero, 
beb0: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69  then it is the i
bec0: 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79  ndex of an entry
bed0: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72  .** in the pIter
bee0: 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74  ->aSeg[] array t
bef0: 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61  hat is (a) not a
bf00: 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70  t EOF, and (b) p
bf10: 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
bf20: 6b 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75  key that is a du
bf30: 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
bf40: 65 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72  er, higher prior
bf50: 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  ity, .** segment
bf60: 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65  -iterator in the
bf70: 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72   pSeg->aSeg[] ar
bf80: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
bf90: 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
bfa0: 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 4d 75  DoCompare(Fts5Mu
bfb0: 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
bfc0: 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20  r, int iOut){.  
bfd0: 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20 20  int i1;         
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74  /* Index of left
c000: 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
c010: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20  r */.  int i2;  
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
c040: 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74  of right-hand Ft
c050: 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
c060: 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53  nt iRes;.  Fts5S
c070: 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20  egIter *p1;     
c080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
c090: 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
c0a0: 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ter */.  Fts5Seg
c0b0: 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20  Iter *p2;       
c0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
c0d0: 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
c0e0: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
c0f0: 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65   iOut<pIter->nSe
c100: 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20  g && iOut>0 );. 
c110: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
c120: 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72  bRev==0 || pIter
c130: 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20  ->bRev==1 );..  
c140: 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72  if( iOut>=(pIter
c150: 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20  ->nSeg/2) ){.   
c160: 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49   i1 = (iOut - pI
c170: 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32  ter->nSeg/2) * 2
c180: 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20  ;.    i2 = i1 + 
c190: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
c1a0: 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  i1 = pIter->aFir
c1b0: 73 74 5b 69 4f 75 74 2a 32 5d 3b 0a 20 20 20 20  st[iOut*2];.    
c1c0: 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  i2 = pIter->aFir
c1d0: 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20  st[iOut*2+1];.  
c1e0: 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d  }.  p1 = &pIter-
c1f0: 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20  >aSeg[i1];.  p2 
c200: 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
c210: 32 5d 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70  2];..  if( p1->p
c220: 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20  Leaf==0 ){      
c230: 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73       /* If p1 is
c240: 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
c250: 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73  Res = i2;.  }els
c260: 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d  e if( p2->pLeaf=
c270: 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20  =0 ){     /* If 
c280: 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p2 is at EOF */.
c290: 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
c2a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
c2b0: 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
c2c0: 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72  Compare(&p1->ter
c2d0: 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20  m, &p2->term);. 
c2e0: 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
c2f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
c300: 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73  2>i1 );.      as
c310: 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20  sert( i2!=0 );. 
c320: 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f       if( p1->iRo
c330: 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20  wid==p2->iRowid 
c340: 29 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20  ) return i2;.   
c350: 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69     res = ((p1->i
c360: 52 6f 77 69 64 20 3c 20 70 32 2d 3e 69 52 6f 77  Rowid < p2->iRow
c370: 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
c380: 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20  ) ? -1 : +1;.   
c390: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
c3a0: 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  es!=0 );.    if(
c3b0: 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
c3c0: 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d  iRes = i1;.    }
c3d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73  else{.      iRes
c3e0: 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   = i2;.    }.  }
c3f0: 0a 0a 20 20 70 49 74 65 72 2d 3e 61 46 69 72 73  ..  pIter->aFirs
c400: 74 5b 69 4f 75 74 5d 20 3d 20 69 52 65 73 3b 0a  t[iOut] = iRes;.
c410: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c420: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74  *.** Free the it
c430: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
c440: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
c450: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
c460: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c470: 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74  MultiIterFree(Ft
c480: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
c490: 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
c4a0: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
c4b0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
c4c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c4d0: 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
c4e0: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
c4f0: 74 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d  terClear(&pIter-
c500: 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d  >aSeg[i]);.    }
c510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c520: 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
c530: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c540: 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
c550: 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ed(.  Fts5Index 
c560: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c570: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
c580: 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
c590: 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
c5a0: 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
c5b0: 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Iter,        /* 
c5c0: 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
c5d0: 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
c5e0: 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
c5f0: 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20  Changed,        
c600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c610: 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
c620: 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
c630: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73  d */.  int iMins
c640: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
c650: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
c660: 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73  m entry in aFirs
c670: 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b  t[] to set */.){
c680: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
c690: 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69  i=(pIter->nSeg+i
c6a0: 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69  Changed)/2; i>=i
c6b0: 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d  Minset && p->rc=
c6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f  =SQLITE_OK; i=i/
c6d0: 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b  2){.    int iEq;
c6e0: 0a 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20  .    if( (iEq = 
c6f0: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
c700: 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29  ompare(pIter, i)
c710: 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  ) ){.      fts5S
c720: 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70  egIterNext(p, &p
c730: 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 29  Iter->aSeg[iEq])
c740: 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74 65  ;.      i = pIte
c750: 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20  r->nSeg + iEq;. 
c760: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c770: 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
c780: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
c790: 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  entry. .**.** If
c7a0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c7b0: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
c7c0: 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49  is left in Fts5I
c7d0: 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e  ndex.rc. It is n
c7e0: 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  ot .** considere
c7f0: 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
c800: 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68  e iterator reach
c810: 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74  es EOF, or if it
c820: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a   is already at .
c830: 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  ** EOF when this
c840: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
c850: 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
c860: 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
c870: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20  rNext(Fts5Index 
c880: 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
c890: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
c8a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c8b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
c8c0: 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e  iFirst = pIter->
c8d0: 61 46 69 72 73 74 5b 31 5d 3b 0a 20 20 20 20 66  aFirst[1];.    f
c8e0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
c8f0: 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  , &pIter->aSeg[i
c900: 46 69 72 73 74 5d 29 3b 0a 20 20 20 20 66 74 73  First]);.    fts
c910: 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
c920: 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  ed(p, pIter, iFi
c930: 72 73 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  rst, 1);.  }.}..
c940: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
c950: 20 6e 65 77 20 46 74 73 35 4d 75 6c 74 69 53 65   new Fts5MultiSe
c960: 67 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  gIter object..**
c970: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
c980: 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ct will be used 
c990: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
c9a0: 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63  gh data in struc
c9b0: 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a  ture pStruct..**
c9c0: 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76   If iLevel is -v
c9d0: 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61  e, then all data
c9e0: 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73   in all segments
c9f0: 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20   is merged. Or, 
ca00: 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  if iLevel.** is 
ca10: 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c  zero or greater,
ca20: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66   data from the f
ca30: 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65  irst nSegment se
ca40: 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20  gments on level 
ca50: 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72  iLevel.** is mer
ca60: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ged..**.** The i
ca70: 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c  terator initiall
ca80: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
ca90: 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64  first term/rowid
caa0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a   entry in the .*
cab0: 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e  * iterated data.
cac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cad0: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
cae0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
caf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cb00: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
cb10: 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
cb20: 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53  ithin */.  Fts5S
cb30: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
cb40: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  t,         /* St
cb50: 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69  ructure of speci
cb60: 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  fic index */.  i
cb70: 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb90: 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d  * Config.aHash[]
cba0: 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e   index of FTS in
cbb0: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dex */.  int fla
cbc0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
cbd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cbe0: 20 66 6f 72 20 3e 3d 20 2a 2f 0a 20 20 63 6f 6e   for >= */.  con
cbf0: 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
cc00: 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
cc10: 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
cc20: 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20  (or NULL/0) */. 
cc30: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65   /* Level to ite
cc60: 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c  rate (-1 for all
cc70: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  ) */.  int nSegm
cc80: 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
cc90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cca0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
ccb0: 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30  merge (iLevel>=0
ccc0: 29 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69  ) */.  Fts5Multi
ccd0: 53 65 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20  SegIter **ppOut 
cce0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
ccf0: 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
cd00: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd20: 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
cd30: 74 73 20 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69  ts merged */.  i
cd40: 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd60: 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e  * Power of two >
cd70: 3d 20 6e 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20  = nSeg */.  int 
cd80: 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  iIter = 0;      
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a              /* *
cda0: 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20  /.  int iSeg;   
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
cdd0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
cde0: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73  egments */.  Fts
cdf0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
ce00: 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c  *pLvl;.  Fts5Mul
ce10: 74 69 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b  tiSegIter *pNew;
ce20: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  ..  assert( (pTe
ce30: 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d  rm==0 && nTerm==
ce40: 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29  0) || iLevel<0 )
ce50: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
ce60: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
ce70: 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65  ew multi-seg-ite
ce80: 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20  rator. */.  if( 
ce90: 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
cea0: 6e 53 65 67 20 3d 20 66 74 73 35 53 74 72 75 63  nSeg = fts5Struc
ceb0: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
cec0: 73 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 65  s(pStruct);.  }e
ced0: 6c 73 65 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20  lse{.    nSeg = 
cee0: 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65  MIN(pStruct->aLe
cef0: 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67  vel[iLevel].nSeg
cf00: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d  , nSegment);.  }
cf10: 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20  .  for(nSlot=2; 
cf20: 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f  nSlot<nSeg; nSlo
cf30: 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70  t=nSlot*2);.  *p
cf40: 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74  pOut = pNew = ft
cf50: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a  s5IdxMalloc(p, .
cf60: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
cf70: 35 4d 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b  5MultiSegIter) +
cf80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
cf90: 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  w */.      sizeo
cfa0: 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20 2a  f(Fts5SegIter) *
cfb0: 20 6e 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f   nSlot +       /
cfc0: 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a  * pNew->aSeg[] *
cfd0: 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75  /.      sizeof(u
cfe0: 31 36 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20  16) * nSlot     
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
d000: 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f  New->aFirst[] */
d010: 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  .  );.  if( pNew
d020: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d030: 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c  pNew->nSeg = nSl
d040: 6f 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67  ot;.  pNew->aSeg
d050: 20 3d 20 28 46 74 73 35 53 65 67 49 74 65 72 2a   = (Fts5SegIter*
d060: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65  )&pNew[1];.  pNe
d070: 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 75 31 36  w->aFirst = (u16
d080: 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53  *)&pNew->aSeg[nS
d090: 6c 6f 74 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62 52  lot];.  pNew->bR
d0a0: 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ev = (0!=(flags 
d0b0: 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
d0c0: 59 5f 41 53 43 29 29 3b 0a 0a 20 20 2f 2a 20 49  Y_ASC));..  /* I
d0d0: 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f  nitialize each o
d0e0: 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  f the component 
d0f0: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
d100: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76  s. */.  if( iLev
d110: 65 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35  el<0 ){.    Fts5
d120: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
d130: 70 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d  pEnd = &pStruct-
d140: 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d  >aLevel[pStruct-
d150: 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f  >nLevel];.    fo
d160: 72 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d  r(pLvl=&pStruct-
d170: 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c  >aLevel[0]; pLvl
d180: 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a  <pEnd; pLvl++){.
d190: 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70        for(iSeg=p
d1a0: 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65  Lvl->nSeg-1; iSe
d1b0: 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
d1c0: 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63         Fts5Struc
d1d0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
d1e0: 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  g = &pLvl->aSeg[
d1f0: 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46  iSeg];.        F
d200: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
d210: 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
d220: 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20  iIter++];.      
d230: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
d240: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
d250: 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69  SegIterInit(p, i
d260: 49 64 78 2c 20 70 53 65 67 2c 20 70 49 74 65 72  Idx, pSeg, pIter
d270: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d280: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
d290: 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
d2a0: 70 2c 20 69 49 64 78 2c 20 70 54 65 72 6d 2c 20  p, iIdx, pTerm, 
d2b0: 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53  nTerm, flags, pS
d2c0: 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
d2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d2e0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
d2f0: 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74   pLvl = &pStruct
d300: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d  ->aLevel[iLevel]
d310: 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e  ;.    for(iSeg=n
d320: 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20  Seg-1; iSeg>=0; 
d330: 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66  iSeg--){.      f
d340: 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70  ts5SegIterInit(p
d350: 2c 20 69 49 64 78 2c 20 26 70 4c 76 6c 2d 3e 61  , iIdx, &pLvl->a
d360: 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77  Seg[iSeg], &pNew
d370: 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29  ->aSeg[iIter++])
d380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
d390: 73 65 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65  sert( iIter==nSe
d3a0: 67 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  g );..  /* If th
d3b0: 65 20 61 62 6f 76 65 20 77 61 73 20 73 75 63 63  e above was succ
d3c0: 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d  essful, each com
d3d0: 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73  ponent iterators
d3e0: 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a   now points .  *
d3f0: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
d400: 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d  ntry in its segm
d410: 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ent. In this cas
d420: 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  e initialize the
d430: 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20   .  ** aFirst[] 
d440: 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e  array. Or, if an
d450: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
d460: 72 65 64 2c 20 66 72 65 65 20 74 68 65 20 69 74  red, free the it
d470: 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65  erator.  ** obje
d480: 63 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f  ct and set the o
d490: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
d4a0: 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
d4b0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d4c0: 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49  OK ){.    for(iI
d4d0: 74 65 72 3d 6e 53 6c 6f 74 2d 31 3b 20 69 49 74  ter=nSlot-1; iIt
d4e0: 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a  er>0; iIter--){.
d4f0: 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20        int iEq;. 
d500: 20 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20       if( (iEq = 
d510: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
d520: 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74  ompare(pNew, iIt
d530: 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  er)) ){.        
d540: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
d550: 70 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  p, &pNew->aSeg[i
d560: 45 71 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Eq]);.        ft
d570: 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
d580: 63 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71  ced(p, pNew, iEq
d590: 2c 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , iIter);.      
d5a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
d5b0: 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
d5c0: 65 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b  erFree(p, pNew);
d5d0: 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b  .    *ppOut = 0;
d5e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
d5f0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
d600: 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20   iterator is at 
d610: 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72  EOF or if an err
d620: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
d630: 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72   .** False other
d640: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
d650: 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
d660: 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
d670: 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  p, Fts5MultiSegI
d680: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
d690: 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20  eturn (p->rc || 
d6a0: 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
d6b0: 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e  er->aFirst[1] ].
d6c0: 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  pLeaf==0);.}../*
d6d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
d6e0: 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72  owid of the entr
d6f0: 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  y that the itera
d700: 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tor currently po
d710: 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74  ints.** to. If t
d720: 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
d730: 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74  ts to EOF when t
d740: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d750: 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65  called the.** re
d760: 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69  sults are undefi
d770: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
d780: 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  64 fts5MultiIter
d790: 52 6f 77 69 64 28 46 74 73 35 4d 75 6c 74 69 53  Rowid(Fts5MultiS
d7a0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
d7b0: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
d7c0: 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
d7d0: 72 73 74 5b 31 5d 20 5d 2e 69 52 6f 77 69 64 3b  rst[1] ].iRowid;
d7e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d7f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
d800: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
d810: 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63  g the term assoc
d820: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a  iated with the .
d830: 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  ** entry that th
d840: 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65  e iterator curre
d850: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
d860: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
d870: 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65  u8 *fts5MultiIte
d880: 72 54 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53  rTerm(Fts5MultiS
d890: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
d8a0: 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53  nt *pn){.  Fts5S
d8b0: 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74  egIter *p = &pIt
d8c0: 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
d8d0: 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20  >aFirst[1] ];.  
d8e0: 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b  *pn = p->term.n;
d8f0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72  .  return p->ter
d900: 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  m.p;.}../*.** Re
d910: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
d920: 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20   chunk iterator 
d930: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
d940: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
d950: 0a 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69  .** at EOF. Or i
d960: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
d970: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e  lready occurred.
d980: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
d990: 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61  rn false..*/.sta
d9a0: 74 69 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e  tic int fts5Chun
d9b0: 6b 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  kIterEof(Fts5Ind
d9c0: 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b  ex *p, Fts5Chunk
d9d0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
d9e0: 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c  return (p->rc ||
d9f0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
da00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
da10: 6e 63 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74  nce the chunk-it
da20: 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
da30: 78 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61  xt chunk of data
da40: 20 74 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61   to read..*/.sta
da50: 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
da60: 6e 6b 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  nkIterNext(Fts5I
da70: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75  ndex *p, Fts5Chu
da80: 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  nkIter *pIter){.
da90: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
daa0: 3e 6e 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20  >nRem>=pIter->n 
dab0: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d  );.  pIter->nRem
dac0: 20 2d 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20   -= pIter->n;.  
dad0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
dae0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
daf0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
db00: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20  0;.  pIter->p = 
db10: 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  0;.  if( pIter->
db20: 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74  nRem>0 ){.    Ft
db30: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
db40: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52     pIter->iLeafR
db50: 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61  owid++;.    pLea
db60: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
db70: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
db80: 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52  p, pIter->iLeafR
db90: 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70  owid);.    if( p
dba0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49  Leaf ){.      pI
dbb0: 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74  ter->n = MIN(pIt
dbc0: 65 72 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d  er->nRem, pLeaf-
dbd0: 3e 6e 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74  >n-4);.      pIt
dbe0: 65 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70  er->p = pLeaf->p
dbf0: 2b 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  +4;.    }.  }.}.
dc00: 0a 2f 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65  ./*.** Intialize
dc10: 20 74 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61   the chunk itera
dc20: 74 6f 72 20 74 6f 20 72 65 61 64 20 74 68 65 20  tor to read the 
dc30: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
dc40: 74 61 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a  ta for which .**
dc50: 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20   the size field 
dc60: 69 73 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66  is at offset iOf
dc70: 66 20 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e  f of leaf pLeaf.
dc80: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
dc90: 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e   fts5ChunkIterIn
dca0: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
dcb0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
dcc0: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
dcd0: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
dce0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
dcf0: 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
dd00: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65    /* Segment ite
dd10: 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f  rator to read po
dd20: 73 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  slist from */.  
dd30: 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70  Fts5ChunkIter *p
dd40: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
dd50: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
dd60: 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
dd70: 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67    int iId = pSeg
dd80: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
dd90: 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 46 54    i64 rowid = FT
dda0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
ddb0: 28 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64  (pSeg->iIdx, iId
ddc0: 2c 20 30 2c 20 70 53 65 67 2d 3e 69 4c 65 61 66  , 0, pSeg->iLeaf
ddd0: 50 67 6e 6f 29 3b 0a 20 20 46 74 73 35 44 61 74  Pgno);.  Fts5Dat
dde0: 61 20 2a 70 4c 65 61 66 20 3d 20 70 53 65 67 2d  a *pLeaf = pSeg-
ddf0: 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f  >pLeaf;.  int iO
de00: 66 66 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66  ff = pSeg->iLeaf
de10: 4f 66 66 73 65 74 3b 0a 0a 20 20 6d 65 6d 73 65  Offset;..  memse
de20: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
de30: 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
de40: 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64  Iter->iLeafRowid
de50: 20 3d 20 72 6f 77 69 64 3b 0a 20 20 69 66 28 20   = rowid;.  if( 
de60: 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b  iOff<pLeaf->n ){
de70: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 66  .    fts5DataRef
de80: 65 72 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20  erence(pLeaf);. 
de90: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
dea0: 3d 20 70 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  = pLeaf;.  }else
deb0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 65  {.    pIter->nRe
dec0: 6d 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 43  m = 1;.    fts5C
ded0: 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20  hunkIterNext(p, 
dee0: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
def0: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
df00: 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20      iOff = 4;.  
df10: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
df20: 3e 70 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 69  >pLeaf;.  }..  i
df30: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
df40: 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
df50: 66 5d 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29  f], pIter->nRem)
df60: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d  ;.  pIter->n = M
df70: 49 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f  IN(pLeaf->n - iO
df80: 66 66 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29  ff, pIter->nRem)
df90: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70  ;.  pIter->p = p
dfa0: 4c 65 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a  Leaf->p + iOff;.
dfb0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d  .  if( pIter->n=
dfc0: 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68  =0 ){.    fts5Ch
dfd0: 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70  unkIterNext(p, p
dfe0: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
dff0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68  atic void fts5Ch
e000: 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46  unkIterRelease(F
e010: 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49  ts5ChunkIter *pI
e020: 74 65 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61  ter){.  fts5Data
e030: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
e040: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
e050: 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pLeaf = 0;.}../*
e060: 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74  .** Read and ret
e070: 75 72 6e 20 74 68 65 20 6e 65 78 74 20 33 32 2d  urn the next 32-
e080: 62 69 74 20 76 61 72 69 6e 74 20 66 72 6f 6d 20  bit varint from 
e090: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
e0a0: 74 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70  t iterator .** p
e0b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
e0c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
e0d0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
e0e0: 6f 63 63 75 72 73 2c 20 7a 65 72 6f 20 69 73 20  occurs, zero is 
e0f0: 72 65 74 75 72 6e 65 64 20 61 6e 20 61 6e 20 65  returned an an e
e100: 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
e110: 6e 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 2e  n .** Fts5Index.
e120: 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rc. If an error 
e130: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
e140: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
e150: 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
e160: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
e170: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
e180: 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72 52 65  nt fts5PosIterRe
e190: 61 64 56 61 72 69 6e 74 28 46 74 73 35 49 6e 64  adVarint(Fts5Ind
e1a0: 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74  ex *p, Fts5PosIt
e1b0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
e1c0: 74 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 69 66  t iVal = 0;.  if
e1d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
e1e0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  OK ){.    if( pI
e1f0: 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72  ter->iOff>=pIter
e200: 2d 3e 63 68 75 6e 6b 2e 6e 20 29 7b 0a 20 20 20  ->chunk.n ){.   
e210: 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
e220: 4e 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e  Next(p, &pIter->
e230: 63 68 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66  chunk);.      if
e240: 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45  ( fts5ChunkIterE
e250: 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68  of(p, &pIter->ch
e260: 75 6e 6b 29 20 29 20 72 65 74 75 72 6e 20 30 3b  unk) ) return 0;
e270: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4f  .      pIter->iO
e280: 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ff = 0;.    }.  
e290: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
e2a0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49   getVarint32(&pI
e2b0: 74 65 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74  ter->chunk.p[pIt
e2c0: 65 72 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29  er->iOff], iVal)
e2d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
e2e0: 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  Val;.}../*.** Ad
e2f0: 76 61 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69  vance the positi
e300: 6f 6e 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72  on list iterator
e310: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
e320: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
e330: 69 64 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65  id fts5PosIterNe
e340: 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
e350: 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49   Fts5PosIter *pI
e360: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c  ter){.  int iVal
e370: 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35  ;.  assert( fts5
e380: 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20  ChunkIterEof(p, 
e390: 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d  &pIter->chunk)==
e3a0: 30 20 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74  0 );.  iVal = ft
e3b0: 73 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72  s5PosIterReadVar
e3c0: 69 6e 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  int(p, pIter);. 
e3d0: 20 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74   if( fts5ChunkIt
e3e0: 65 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d  erEof(p, &pIter-
e3f0: 3e 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20  >chunk)==0 ){.  
e400: 20 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b    if( iVal==1 ){
e410: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43  .      pIter->iC
e420: 6f 6c 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72  ol = fts5PosIter
e430: 52 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49  ReadVarint(p, pI
e440: 74 65 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ter);.      pIte
e450: 72 2d 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f  r->iPos = fts5Po
e460: 73 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28  sIterReadVarint(
e470: 70 2c 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20  p, pIter) - 2;. 
e480: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e490: 70 49 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28  pIter->iPos += (
e4a0: 69 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d  iVal - 2);.    }
e4b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
e4c0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73  itialize the Fts
e4d0: 35 50 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20  5PosIter object 
e4e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
e4f0: 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  nal argument to 
e500: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
e510: 67 68 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  gh the position-
e520: 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 20  list associated 
e530: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 65  with the index e
e540: 6e 74 72 79 20 74 68 61 74 20 69 74 65 72 61 74  ntry that iterat
e550: 6f 72 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75  or .** pMulti cu
e560: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
e570: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
e580: 64 20 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69  d fts5PosIterIni
e590: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
e5a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e5b0: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
e5c0: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
e5d0: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
e5e0: 72 20 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20  r *pMulti,      
e5f0: 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74   /* Multi-seg it
e600: 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70  erator to read p
e610: 6f 73 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a  os-list from */.
e620: 20 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70    Fts5PosIter *p
e630: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
e640: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
e650: 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  this object */.)
e660: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
e670: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e680: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
e690: 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65  g = &pMulti->aSe
e6a0: 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73  g[ pMulti->aFirs
e6b0: 74 5b 31 5d 20 5d 3b 0a 20 20 20 20 6d 65 6d 73  t[1] ];.    mems
e6c0: 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
e6d0: 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
e6e0: 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49    fts5ChunkIterI
e6f0: 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 70 49  nit(p, pSeg, &pI
e700: 74 65 72 2d 3e 63 68 75 6e 6b 29 3b 0a 20 20 20  ter->chunk);.   
e710: 20 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74   if( fts5ChunkIt
e720: 65 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d  erEof(p, &pIter-
e730: 3e 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20  >chunk)==0 ){.  
e740: 20 20 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e      fts5PosIterN
e750: 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
e760: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e770: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
e780: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
e790: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
e7a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e7b0: 6d 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f  ment is.** at EO
e7c0: 46 2e 20 4f 72 20 69 66 20 61 6e 20 65 72 72 6f  F. Or if an erro
e7d0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
e7e0: 63 75 72 72 65 64 2e 20 4f 74 68 65 72 77 69 73  curred. Otherwis
e7f0: 65 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  e, return false.
e800: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
e810: 74 73 35 50 6f 73 49 74 65 72 45 6f 66 28 46 74  ts5PosIterEof(Ft
e820: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
e830: 50 6f 73 49 74 65 72 20 2a 70 49 74 65 72 29 7b  PosIter *pIter){
e840: 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
e850: 20 7c 7c 20 70 49 74 65 72 2d 3e 63 68 75 6e 6b   || pIter->chunk
e860: 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 0a  .pLeaf==0);.}...
e870: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  /*.** Allocate m
e880: 65 6d 6f 72 79 2e 20 54 68 65 20 64 69 66 66 65  emory. The diffe
e890: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
e8a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
e8b0: 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 29 0a  fts5IdxMalloc().
e8c0: 2a 2a 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ** is that this 
e8d0: 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 46  increments the F
e8e0: 74 73 35 49 6e 64 65 78 2e 6e 50 65 6e 64 69 6e  ts5Index.nPendin
e8f0: 67 44 61 74 61 20 76 61 72 69 61 62 6c 65 20 62  gData variable b
e900: 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  y the.** number 
e910: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
e920: 65 64 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  ed. It should be
e930: 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 6c   used for all al
e940: 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 0a 2a  locations used.*
e950: 2a 20 74 6f 20 73 74 6f 72 65 20 70 65 6e 64 69  * to store pendi
e960: 6e 67 2d 64 61 74 61 20 77 69 74 68 69 6e 20 74  ng-data within t
e970: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
e980: 68 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  h tables..*/.sta
e990: 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 50 65  tic void *fts5Pe
e9a0: 6e 64 69 6e 67 4d 61 6c 6c 6f 63 28 46 74 73 35  ndingMalloc(Fts5
e9b0: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42  Index *p, int nB
e9c0: 79 74 65 29 7b 0a 20 20 70 2d 3e 6e 50 65 6e 64  yte){.  p->nPend
e9d0: 69 6e 67 44 61 74 61 20 2b 3d 20 6e 42 79 74 65  ingData += nByte
e9e0: 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
e9f0: 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74  dxMalloc(p, nByt
ea00: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  e);.}../*.** Add
ea10: 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 28 69   an entry for (i
ea20: 52 6f 77 69 64 2f 69 43 6f 6c 2f 69 50 6f 73 29  Rowid/iCol/iPos)
ea30: 20 74 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20   to the doclist 
ea40: 66 6f 72 20 28 70 54 6f 6b 65 6e 2f 6e 54 6f 6b  for (pToken/nTok
ea50: 65 6e 29 0a 2a 2a 20 69 6e 20 68 61 73 68 20 74  en).** in hash t
ea60: 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 20 69  able for index i
ea70: 49 64 78 2e 20 49 66 20 69 49 64 78 20 69 73 20  Idx. If iIdx is 
ea80: 7a 65 72 6f 2c 20 74 68 69 73 20 69 73 20 74 68  zero, this is th
ea90: 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 0a 2a 2a  e main terms .**
eaa0: 20 69 6e 64 65 78 2e 20 56 61 6c 75 65 73 20 6f   index. Values o
eab0: 66 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 20  f 1 and greater 
eac0: 66 6f 72 20 69 49 64 78 20 61 72 65 20 70 72 65  for iIdx are pre
ead0: 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a  fix indexes..**.
eae0: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
eaf0: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
eb00: 64 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  d, set the Fts5I
eb10: 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
eb20: 64 65 20 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  de .** according
eb30: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
eb40: 69 64 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f  id fts5AddTermTo
eb50: 48 61 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  Hash(.  Fts5Inde
eb60: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
eb70: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
eb80: 20 6f 62 6a 65 63 74 20 74 6f 20 77 72 69 74 65   object to write
eb90: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64   to */.  int iId
eba0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
ebb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72           /* Entr
ebc0: 79 20 69 6e 20 70 2d 3e 61 48 61 73 68 5b 5d 20  y in p->aHash[] 
ebd0: 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 69  to update */.  i
ebe0: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ec00: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
ec10: 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
ec20: 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
ec30: 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ec50: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
ec60: 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
ec70: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
ec80: 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
ec90: 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
eca0: 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
ecb0: 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
ecc0: 78 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f  x */.){.  Fts5Co
ecd0: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
ece0: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74  p->pConfig;.  Ft
ecf0: 73 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20  s3Hash *pHash;. 
ed00: 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
ed10: 69 73 74 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20  ist *pDoclist;. 
ed20: 20 46 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c   Fts5PendingPosl
ed30: 69 73 74 20 2a 70 50 6f 73 6c 69 73 74 3b 0a 20  ist *pPoslist;. 
ed40: 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d   i64 iRowid = p-
ed50: 3e 69 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20  >iWriteRowid;   
ed60: 20 20 2f 2a 20 52 6f 77 69 64 20 61 73 73 6f 63    /* Rowid assoc
ed70: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
ed80: 20 74 6f 6b 65 6e 73 20 2a 2f 0a 0a 20 20 2f 2a   tokens */..  /*
ed90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
eda0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64   already occured
edb0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
edc0: 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
edd0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
ede0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
edf0: 20 46 69 6e 64 20 74 68 65 20 68 61 73 68 20 74   Find the hash t
ee00: 61 62 6c 65 20 74 6f 20 75 73 65 2e 20 49 74 20  able to use. It 
ee10: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
ee20: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20   allocated. */. 
ee30: 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
ee40: 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
ee50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  );.  assert( iId
ee60: 78 3d 3d 30 20 7c 7c 20 6e 54 6f 6b 65 6e 3d 3d  x==0 || nToken==
ee70: 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
ee80: 5b 69 49 64 78 2d 31 5d 20 29 3b 0a 20 20 70 48  [iIdx-1] );.  pH
ee90: 61 73 68 20 3d 20 26 70 2d 3e 61 48 61 73 68 5b  ash = &p->aHash[
eea0: 69 49 64 78 5d 3b 0a 0a 20 20 2f 2a 20 46 69 6e  iIdx];..  /* Fin
eeb0: 64 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 6f  d the doclist to
eec0: 20 61 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c 6f   append to. Allo
eed0: 63 61 74 65 20 61 20 6e 65 77 20 64 6f 63 6c 69  cate a new docli
eee0: 73 74 20 6f 62 6a 65 63 74 20 69 66 0a 20 20 2a  st object if.  *
eef0: 2a 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  * required. */. 
ef00: 20 70 44 6f 63 6c 69 73 74 20 3d 20 28 46 74 73   pDoclist = (Fts
ef10: 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 2a  5PendingDoclist*
ef20: 29 66 74 73 33 48 61 73 68 46 69 6e 64 28 70 48  )fts3HashFind(pH
ef30: 61 73 68 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  ash, pToken, nTo
ef40: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 44 6f 63  ken);.  if( pDoc
ef50: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46  list==0 ){.    F
ef60: 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
ef70: 74 20 2a 70 44 65 6c 3b 0a 20 20 20 20 70 44 6f  t *pDel;.    pDo
ef80: 63 6c 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64  clist = fts5Pend
ef90: 69 6e 67 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  ingMalloc(p, siz
efa0: 65 6f 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44  eof(Fts5PendingD
efb0: 6f 63 6c 69 73 74 29 20 2b 20 6e 54 6f 6b 65 6e  oclist) + nToken
efc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 44 6f 63 6c  );.    if( pDocl
efd0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
efe0: 0a 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 70  .    pDoclist->p
eff0: 54 65 72 6d 20 3d 20 28 75 38 2a 29 26 70 44 6f  Term = (u8*)&pDo
f000: 63 6c 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 44  clist[1];.    pD
f010: 6f 63 6c 69 73 74 2d 3e 6e 54 65 72 6d 20 3d 20  oclist->nTerm = 
f020: 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 6d 65 6d 63  nToken;.    memc
f030: 70 79 28 70 44 6f 63 6c 69 73 74 2d 3e 70 54 65  py(pDoclist->pTe
f040: 72 6d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  rm, pToken, nTok
f050: 65 6e 29 3b 0a 20 20 20 20 70 44 65 6c 20 3d 20  en);.    pDel = 
f060: 66 74 73 33 48 61 73 68 49 6e 73 65 72 74 28 70  fts3HashInsert(p
f070: 48 61 73 68 2c 20 70 44 6f 63 6c 69 73 74 2d 3e  Hash, pDoclist->
f080: 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 2c 20 70  pTerm, nToken, p
f090: 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 69 66  Doclist);.    if
f0a0: 28 20 70 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pDel ){.      
f0b0: 61 73 73 65 72 74 28 20 70 44 6f 63 6c 69 73 74  assert( pDoclist
f0c0: 3d 3d 70 44 65 6c 20 29 3b 0a 20 20 20 20 20 20  ==pDel );.      
f0d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65  sqlite3_free(pDe
f0e0: 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20  l);.      p->rc 
f0f0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
f100: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
f110: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
f120: 6e 64 20 74 68 65 20 70 6f 73 6c 69 73 74 20 74  nd the poslist t
f130: 6f 20 61 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c  o append to. All
f140: 6f 63 61 74 65 20 61 20 6e 65 77 20 6f 62 6a 65  ocate a new obje
f150: 63 74 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  ct if required. 
f160: 2a 2f 0a 20 20 70 50 6f 73 6c 69 73 74 20 3d 20  */.  pPoslist = 
f170: 70 44 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69  pDoclist->pPosli
f180: 73 74 3b 0a 20 20 69 66 28 20 70 50 6f 73 6c 69  st;.  if( pPosli
f190: 73 74 3d 3d 30 20 7c 7c 20 70 50 6f 73 6c 69 73  st==0 || pPoslis
f1a0: 74 2d 3e 69 52 6f 77 69 64 21 3d 69 52 6f 77 69  t->iRowid!=iRowi
f1b0: 64 20 29 7b 0a 20 20 20 20 70 50 6f 73 6c 69 73  d ){.    pPoslis
f1c0: 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4d  t = fts5PendingM
f1d0: 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
f1e0: 46 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69  Fts5PendingPosli
f1f0: 73 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 50  st));.    if( pP
f200: 6f 73 6c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  oslist==0 ) retu
f210: 72 6e 3b 0a 20 20 20 20 70 50 6f 73 6c 69 73 74  rn;.    pPoslist
f220: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 6f 63 6c 69  ->pNext = pDocli
f230: 73 74 2d 3e 70 50 6f 73 6c 69 73 74 3b 0a 20 20  st->pPoslist;.  
f240: 20 20 70 50 6f 73 6c 69 73 74 2d 3e 69 52 6f 77    pPoslist->iRow
f250: 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  id = iRowid;.   
f260: 20 70 44 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c   pDoclist->pPosl
f270: 69 73 74 20 3d 20 70 50 6f 73 6c 69 73 74 3b 0a  ist = pPoslist;.
f280: 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 43      pDoclist->iC
f290: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 44 6f 63  ol = 0;.    pDoc
f2a0: 6c 69 73 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a  list->iPos = 0;.
f2b0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
f2c0: 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 74   the values to t
f2d0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
f2e0: 2e 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3e  . */.  if( iCol>
f2f0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65  =0 ){.    p->nPe
f300: 6e 64 69 6e 67 44 61 74 61 20 2d 3d 20 70 50 6f  ndingData -= pPo
f310: 73 6c 69 73 74 2d 3e 62 75 66 2e 6e 53 70 61 63  slist->buf.nSpac
f320: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 21  e;.    if( iCol!
f330: 3d 70 44 6f 63 6c 69 73 74 2d 3e 69 43 6f 6c 20  =pDoclist->iCol 
f340: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
f350: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
f360: 26 70 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73  &p->rc, &pPoslis
f370: 74 2d 3e 62 75 66 2c 20 31 29 3b 0a 20 20 20 20  t->buf, 1);.    
f380: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
f390: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
f3a0: 20 26 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2c   &pPoslist->buf,
f3b0: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 44   iCol);.      pD
f3c0: 6f 63 6c 69 73 74 2d 3e 69 43 6f 6c 20 3d 20 69  oclist->iCol = i
f3d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 44 6f 63 6c  Col;.      pDocl
f3e0: 69 73 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a 20  ist->iPos = 0;. 
f3f0: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
f400: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
f410: 26 70 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73  &p->rc, &pPoslis
f420: 74 2d 3e 62 75 66 2c 20 69 50 6f 73 20 2b 20 32  t->buf, iPos + 2
f430: 20 2d 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50 6f   - pDoclist->iPo
f440: 73 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64  s);.    p->nPend
f450: 69 6e 67 44 61 74 61 20 2b 3d 20 70 50 6f 73 6c  ingData += pPosl
f460: 69 73 74 2d 3e 62 75 66 2e 6e 53 70 61 63 65 3b  ist->buf.nSpace;
f470: 0a 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69  .    pDoclist->i
f480: 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20 7d 0a  Pos = iPos;.  }.
f490: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
f4a0: 65 20 70 65 6e 64 69 6e 67 2d 64 6f 63 6c 69 73  e pending-doclis
f4b0: 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  t object passed 
f4c0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
f4d0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
f4e0: 76 6f 69 64 20 66 74 73 35 46 72 65 65 50 65 6e  void fts5FreePen
f4f0: 64 69 6e 67 44 6f 63 6c 69 73 74 28 46 74 73 35  dingDoclist(Fts5
f500: 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a  PendingDoclist *
f510: 70 29 7b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e  p){.  Fts5Pendin
f520: 67 50 6f 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69  gPoslist *pPosli
f530: 73 74 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e  st;.  Fts5Pendin
f540: 67 50 6f 73 6c 69 73 74 20 2a 70 4e 65 78 74 3b  gPoslist *pNext;
f550: 0a 20 20 66 6f 72 28 70 50 6f 73 6c 69 73 74 3d  .  for(pPoslist=
f560: 70 2d 3e 70 50 6f 73 6c 69 73 74 3b 20 70 50 6f  p->pPoslist; pPo
f570: 73 6c 69 73 74 3b 20 70 50 6f 73 6c 69 73 74 3d  slist; pPoslist=
f580: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
f590: 74 20 3d 20 70 50 6f 73 6c 69 73 74 2d 3e 70 4e  t = pPoslist->pN
f5a0: 65 78 74 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ext;.    fts5Buf
f5b0: 66 65 72 46 72 65 65 28 26 70 50 6f 73 6c 69 73  ferFree(&pPoslis
f5c0: 74 2d 3e 62 75 66 29 3b 0a 20 20 20 20 73 71 6c  t->buf);.    sql
f5d0: 69 74 65 33 5f 66 72 65 65 28 70 50 6f 73 6c 69  ite3_free(pPosli
f5e0: 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  st);.  }.  sqlit
f5f0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  e3_free(p);.}../
f600: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
f610: 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72  emove data to or
f620: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
f630: 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63   Each time a doc
f640: 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64  ument is .** add
f650: 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64  ed to or removed
f660: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c   from the index,
f670: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
f680: 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20  s called one or 
f690: 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  more.** times..*
f6a0: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  *.** For an inse
f6b0: 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
f6c0: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
f6d0: 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
f6e0: 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a   new document..*
f6f0: 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
f700: 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  on is a delete, 
f710: 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
f720: 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63  d (at least) onc
f730: 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e  e for each.** un
f740: 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
f750: 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
f760: 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
f770: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
f780: 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65  e iPos.** argume
f790: 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  nt is ignored fo
f7a0: 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 76  r a delete..*/.v
f7b0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49  oid sqlite3Fts5I
f7c0: 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73  ndexWrite(.  Fts
f7d0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f7f0: 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74  Index to write t
f800: 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  o */.  int iCol,
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
f830: 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69   token appears i
f840: 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65  n (-ve -> delete
f850: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c  ) */.  int iPos,
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
f880: 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68  on of token with
f890: 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  in column */.  c
f8a0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
f8b0: 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f  n, int nToken  /
f8c0: 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f  * Token to add o
f8d0: 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66  r remove to or f
f8e0: 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  rom index */.){.
f8f0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
f920: 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64  rate through ind
f930: 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  exes */.  Fts5Co
f940: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
f950: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 2f  p->pConfig;..  /
f960: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
f970: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65  s already occure
f980: 64 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  d this call is a
f990: 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
f9a0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
f9b0: 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  K ) return;..  /
f9c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 68 61 73 68 20  * Allocate hash 
f9d0: 74 61 62 6c 65 73 20 69 66 20 74 68 65 79 20 68  tables if they h
f9e0: 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  ave not already 
f9f0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
fa00: 2f 0a 20 20 69 66 28 20 70 2d 3e 61 48 61 73 68  /.  if( p->aHash
fa10: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
fa20: 48 61 73 68 20 3d 20 70 43 6f 6e 66 69 67 2d 3e  Hash = pConfig->
fa30: 6e 50 72 65 66 69 78 20 2b 20 31 3b 0a 20 20 20  nPrefix + 1;.   
fa40: 20 70 2d 3e 61 48 61 73 68 20 3d 20 28 46 74 73   p->aHash = (Fts
fa50: 33 48 61 73 68 2a 29 73 71 6c 69 74 65 33 5f 6d  3Hash*)sqlite3_m
fa60: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73  alloc(sizeof(Fts
fa70: 33 48 61 73 68 29 20 2a 20 6e 48 61 73 68 29 3b  3Hash) * nHash);
fa80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 48 61 73  .    if( p->aHas
fa90: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  h==0 ){.      p-
faa0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
fab0: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
fac0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
fad0: 6e 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20  nHash; i++){.   
fae0: 20 20 20 20 20 66 74 73 33 48 61 73 68 49 6e 69       fts3HashIni
faf0: 74 28 26 70 2d 3e 61 48 61 73 68 5b 69 5d 2c 20  t(&p->aHash[i], 
fb00: 46 54 53 33 5f 48 41 53 48 5f 53 54 52 49 4e 47  FTS3_HASH_STRING
fb10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
fb20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64    }.  }..  /* Ad
fb30: 64 20 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20  d the new token 
fb40: 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d  to the main term
fb50: 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20 41 6e  s hash table. An
fb60: 64 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  d to each of the
fb70: 0a 20 20 2a 2a 20 70 72 65 66 69 78 20 68 61 73  .  ** prefix has
fb80: 68 20 74 61 62 6c 65 73 20 74 68 61 74 20 69 74  h tables that it
fb90: 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
fba0: 20 66 6f 72 2e 20 2a 2f 0a 20 20 66 74 73 35 41   for. */.  fts5A
fbb0: 64 64 54 65 72 6d 54 6f 48 61 73 68 28 70 2c 20  ddTermToHash(p, 
fbc0: 30 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70  0, iCol, iPos, p
fbd0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
fbe0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
fbf0: 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
fc00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 6f  ++){.    if( nTo
fc10: 6b 65 6e 3e 3d 70 43 6f 6e 66 69 67 2d 3e 61 50  ken>=pConfig->aP
fc20: 72 65 66 69 78 5b 69 5d 20 29 7b 0a 20 20 20 20  refix[i] ){.    
fc30: 20 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48    fts5AddTermToH
fc40: 61 73 68 28 70 2c 20 69 2b 31 2c 20 69 43 6f 6c  ash(p, i+1, iCol
fc50: 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20  , iPos, pToken, 
fc60: 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
fc70: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [i]);.    }.  }.
fc80: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
fc90: 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
fca0: 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
fcb0: 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a  ture pStruct..**
fcc0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
fcd0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
fce0: 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
fcf0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
fd00: 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  0 is .** returne
fd10: 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
fd20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
fd30: 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
fd40: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
fd50: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
fd60: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ruct){.  int i;.
fd70: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
fd80: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
fd90: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
fda0: 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <100; i++){.    
fdb0: 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 20 20  int iSegid;.    
fdc0: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
fdd0: 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20  ss(sizeof(int), 
fde0: 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b  (void*)&iSegid);
fdf0: 0a 20 20 20 20 69 53 65 67 69 64 20 3d 20 69 53  .    iSegid = iS
fe00: 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20 46 54  egid & ((1 << FT
fe10: 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31 29  S5_DATA_ID_B)-1)
fe20: 3b 0a 20 20 20 20 69 66 28 20 69 53 65 67 69 64  ;.    if( iSegid
fe30: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
fe40: 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
fe50: 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
fe60: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
fe70: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
fe80: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
fe90: 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
fea0: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
feb0: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
fec0: 20 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70     if( iSegid==p
fed0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
fee0: 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl].aSeg[iSeg].
fef0: 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20  iSegid ){.      
ff00: 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 30        iSegid = 0
ff10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ff20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ff30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 53      }.    if( iS
ff40: 65 67 69 64 20 29 20 72 65 74 75 72 6e 20 69 53  egid ) return iS
ff50: 65 67 69 64 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  egid;.  }..  p->
ff60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
ff70: 52 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  R;.  return 0;.}
ff80: 0a 0a 73 74 61 74 69 63 20 46 74 73 35 50 65 6e  ..static Fts5Pen
ff90: 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 66 74 73  dingDoclist *fts
ffa0: 35 50 65 6e 64 69 6e 67 4d 65 72 67 65 28 0a 20  5PendingMerge(. 
ffb0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
ffc0: 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63    Fts5PendingDoc
ffd0: 6c 69 73 74 20 2a 70 4c 65 66 74 2c 0a 20 20 46  list *pLeft,.  F
ffe0: 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
fff0: 74 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 46  t *pRight.){.  F
10000 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
10010 74 20 2a 70 31 20 3d 20 70 4c 65 66 74 3b 0a 20  t *p1 = pLeft;. 
10020 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
10030 69 73 74 20 2a 70 32 20 3d 20 70 52 69 67 68 74  ist *p2 = pRight
10040 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44  ;.  Fts5PendingD
10050 6f 63 6c 69 73 74 20 2a 70 52 65 74 20 3d 20 30  oclist *pRet = 0
10060 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44  ;.  Fts5PendingD
10070 6f 63 6c 69 73 74 20 2a 2a 70 70 4f 75 74 20 3d  oclist **ppOut =
10080 20 26 70 52 65 74 3b 0a 0a 20 20 77 68 69 6c 65   &pRet;..  while
10090 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
100a0 20 20 69 66 28 20 70 31 3d 3d 30 20 29 7b 0a 20    if( p1==0 ){. 
100b0 20 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 32       *ppOut = p2
100c0 3b 0a 20 20 20 20 20 20 70 32 20 3d 20 30 3b 0a  ;.      p2 = 0;.
100d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32      }else if( p2
100e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==0 ){.      *pp
100f0 4f 75 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20  Out = p1;.      
10100 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p1 = 0;.    }els
10110 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d  e{.      int nCm
10120 70 20 3d 20 4d 49 4e 28 70 31 2d 3e 6e 54 65 72  p = MIN(p1->nTer
10130 6d 2c 20 70 32 2d 3e 6e 54 65 72 6d 29 3b 0a 20  m, p2->nTerm);. 
10140 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d       int res = m
10150 65 6d 63 6d 70 28 70 31 2d 3e 70 54 65 72 6d 2c  emcmp(p1->pTerm,
10160 20 70 32 2d 3e 70 54 65 72 6d 2c 20 6e 43 6d 70   p2->pTerm, nCmp
10170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
10180 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e  ==0 ) res = p1->
10190 6e 54 65 72 6d 20 2d 20 70 32 2d 3e 6e 54 65 72  nTerm - p2->nTer
101a0 6d 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65  m;..      if( re
101b0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  s>0 ){.        /
101c0 2a 20 70 32 20 69 73 20 73 6d 61 6c 6c 65 72 20  * p2 is smaller 
101d0 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 70 4f 75  */.        *ppOu
101e0 74 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 20 20  t = p2;.        
101f0 70 70 4f 75 74 20 3d 20 26 70 32 2d 3e 70 4e 65  ppOut = &p2->pNe
10200 78 74 3b 0a 20 20 20 20 20 20 20 20 70 32 20 3d  xt;.        p2 =
10210 20 70 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   p2->pNext;.    
10220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10230 20 2f 2a 20 70 31 20 69 73 20 73 6d 61 6c 6c 65   /* p1 is smalle
10240 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 70  r */.        *pp
10250 4f 75 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20  Out = p1;.      
10260 20 20 70 70 4f 75 74 20 3d 20 26 70 31 2d 3e 70    ppOut = &p1->p
10270 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 31  Next;.        p1
10280 20 3d 20 70 31 2d 3e 70 4e 65 78 74 3b 0a 20 20   = p1->pNext;.  
10290 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 4f      }.      *ppO
102a0 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
102b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
102c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61  ;.}../*.** Extra
102d0 63 74 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 66 72  ct all tokens fr
102e0 6f 6d 20 68 61 73 68 20 74 61 62 6c 65 20 69 48  om hash table iH
102f0 61 73 68 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  ash and link the
10300 6d 20 69 6e 74 6f 20 61 20 6c 69 73 74 0a 2a 2a  m into a list.**
10310 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
10320 2e 20 54 68 65 20 68 61 73 68 20 74 61 62 6c 65  . The hash table
10330 20 69 73 20 63 6c 65 61 72 65 64 20 62 65 66 6f   is cleared befo
10340 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
10350 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 70 6f   is.** the respo
10360 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
10370 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20   caller to free 
10380 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
10390 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
103a0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  list..**.** If a
103b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
103c0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
103d0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
103e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
103f0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
10400 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
10410 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
10420 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 50  .*/.static Fts5P
10430 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 66  endingDoclist *f
10440 74 73 35 50 65 6e 64 69 6e 67 4c 69 73 74 28 46  ts5PendingList(F
10450 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
10460 20 69 48 61 73 68 29 7b 0a 20 20 63 6f 6e 73 74   iHash){.  const
10470 20 69 6e 74 20 6e 4d 65 72 67 65 53 6c 6f 74 20   int nMergeSlot 
10480 3d 20 33 32 3b 0a 20 20 46 74 73 33 48 61 73 68  = 32;.  Fts3Hash
10490 20 2a 70 48 61 73 68 3b 0a 20 20 46 74 73 33 48   *pHash;.  Fts3H
104a0 61 73 68 45 6c 65 6d 20 2a 70 45 3b 20 20 20 20  ashElem *pE;    
104b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
104c0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
104d0 2a 2f 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67  */.  Fts5Pending
104e0 44 6f 63 6c 69 73 74 20 2a 2a 61 70 3b 0a 20 20  Doclist **ap;.  
104f0 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69  Fts5PendingDocli
10500 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  st *pList;.  int
10510 20 69 3b 0a 0a 20 20 61 70 20 3d 20 66 74 73 35   i;..  ap = fts5
10520 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
10530 65 6f 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44  eof(Fts5PendingD
10540 6f 63 6c 69 73 74 2a 29 20 2a 20 6e 4d 65 72 67  oclist*) * nMerg
10550 65 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 21 61  eSlot);.  if( !a
10560 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  p ) return 0;.. 
10570 20 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 48 61   pHash = &p->aHa
10580 73 68 5b 69 48 61 73 68 5d 3b 0a 20 20 66 6f 72  sh[iHash];.  for
10590 28 70 45 3d 66 74 73 33 48 61 73 68 46 69 72 73  (pE=fts3HashFirs
105a0 74 28 70 48 61 73 68 29 3b 20 70 45 3b 20 70 45  t(pHash); pE; pE
105b0 3d 66 74 73 33 48 61 73 68 4e 65 78 74 28 70 45  =fts3HashNext(pE
105c0 29 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  )){.    int i;. 
105d0 20 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f     Fts5PendingDo
105e0 63 6c 69 73 74 20 2a 70 44 6f 63 6c 69 73 74 20  clist *pDoclist 
105f0 3d 20 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  = (Fts5PendingDo
10600 63 6c 69 73 74 2a 29 66 74 73 33 48 61 73 68 44  clist*)fts3HashD
10610 61 74 61 28 70 45 29 3b 0a 20 20 20 20 61 73 73  ata(pE);.    ass
10620 65 72 74 28 20 70 44 6f 63 6c 69 73 74 2d 3e 70  ert( pDoclist->p
10630 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66  Next==0 );.    f
10640 6f 72 28 69 3d 30 3b 20 61 70 5b 69 5d 3b 20 69  or(i=0; ap[i]; i
10650 2b 2b 29 7b 0a 20 20 20 20 20 20 70 44 6f 63 6c  ++){.      pDocl
10660 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e  ist = fts5Pendin
10670 67 4d 65 72 67 65 28 70 2c 20 70 44 6f 63 6c 69  gMerge(p, pDocli
10680 73 74 2c 20 61 70 5b 69 5d 29 3b 0a 20 20 20 20  st, ap[i]);.    
10690 20 20 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20    ap[i] = 0;.   
106a0 20 7d 0a 20 20 20 20 61 70 5b 69 5d 20 3d 20 70   }.    ap[i] = p
106b0 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Doclist;.  }..  
106c0 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72  pList = 0;.  for
106d0 28 69 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 53 6c  (i=0; i<nMergeSl
106e0 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  ot; i++){.    pL
106f0 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e  ist = fts5Pendin
10700 67 4d 65 72 67 65 28 70 2c 20 70 4c 69 73 74 2c  gMerge(p, pList,
10710 20 61 70 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20   ap[i]);.  }..  
10720 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 29  sqlite3_free(ap)
10730 3b 0a 20 20 66 74 73 33 48 61 73 68 43 6c 65 61  ;.  fts3HashClea
10740 72 28 70 48 61 73 68 29 3b 0a 20 20 72 65 74 75  r(pHash);.  retu
10750 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
10760 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
10770 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  ze of the prefix
10780 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74  , in bytes, that
10790 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70 4e   buffer (nNew/pN
107a0 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77 69  ew) shares.** wi
107b0 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64 2f  th buffer (nOld/
107c0 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  pOld)..*/.static
107d0 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78 43   int fts5PrefixC
107e0 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20 6e  ompress(.  int n
107f0 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  Old, const u8 *p
10800 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77 2c  Old,.  int nNew,
10810 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77 0a   const u8 *pNew.
10820 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
10830 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26  r(i=0; i<nNew &&
10840 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
10850 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d     if( pOld[i]!=
10860 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b  pNew[i] ) break;
10870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
10880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  .}../*.** If an 
10890 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72 64 20  "nEmpty" record 
108a0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
108b0 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 62 65  to the b-tree be
108c0 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a 2a 2a  fore the next.**
108d0 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69 74 20   term, write it 
108e0 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  now..*/.static v
108f0 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
10900 65 65 4e 45 6d 70 74 79 28 46 74 73 35 49 6e 64  eeNEmpty(Fts5Ind
10910 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
10920 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
10930 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
10940 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 69 6e 74  Empty ){.    int
10950 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20   bFlag = 0;.    
10960 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
10970 70 50 67 3b 0a 20 20 20 20 70 50 67 20 3d 20 26  pPg;.    pPg = &
10980 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
10990 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 57 72  [1];.    if( pWr
109a0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54  iter->nEmpty>=FT
109b0 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
109c0 45 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  E ){.      i64 i
109d0 4b 65 79 20 3d 20 46 54 53 35 5f 44 4f 43 4c 49  Key = FTS5_DOCLI
109e0 53 54 5f 49 44 58 5f 52 4f 57 49 44 28 0a 20 20  ST_IDX_ROWID(.  
109f0 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
10a00 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e  >iIdx, pWriter->
10a10 69 53 65 67 69 64 2c 20 0a 20 20 20 20 20 20 20  iSegid, .       
10a20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69     pWriter->aWri
10a30 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 2d 20 31 20  ter[0].pgno - 1 
10a40 2d 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  - pWriter->nEmpt
10a50 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  y.      );.     
10a60 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
10a70 2d 3e 64 6c 69 64 78 2e 6e 3e 30 20 29 3b 0a 20  ->dlidx.n>0 );. 
10a80 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
10a90 74 65 28 70 2c 20 69 4b 65 79 2c 20 70 57 72 69  te(p, iKey, pWri
10aa0 74 65 72 2d 3e 64 6c 69 64 78 2e 70 2c 20 70 57  ter->dlidx.p, pW
10ab0 72 69 74 65 72 2d 3e 64 6c 69 64 78 2e 6e 29 3b  riter->dlidx.n);
10ac0 0a 20 20 20 20 20 20 62 46 6c 61 67 20 3d 20 31  .      bFlag = 1
10ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
10ae0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
10af0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d  nt(&p->rc, &pPg-
10b00 3e 62 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20 20  >buf, bFlag);.  
10b10 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
10b20 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
10b30 20 26 70 50 67 2d 3e 62 75 66 2c 20 70 57 72 69   &pPg->buf, pWri
10b40 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20  ter->nEmpty);.  
10b50 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74    pWriter->nEmpt
10b60 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
10b70 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
10b80 69 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  it was written t
10b90 6f 20 64 69 73 6b 2c 20 7a 65 72 6f 20 74 68 65  o disk, zero the
10ba0 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 61   doclist index a
10bb0 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
10bc0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74  t */.  sqlite3Ft
10bd0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 57  s5BufferZero(&pW
10be0 72 69 74 65 72 2d 3e 64 6c 69 64 78 29 3b 0a 20  riter->dlidx);. 
10bf0 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78   pWriter->bDlidx
10c00 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 7d  PrevValid = 0;.}
10c10 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
10c20 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77  s5WriteBtreeGrow
10c30 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
10c40 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
10c50 72 69 74 65 72 29 7b 0a 20 20 46 74 73 35 50 61  riter){.  Fts5Pa
10c60 67 65 57 72 69 74 65 72 20 2a 61 4e 65 77 3b 0a  geWriter *aNew;.
10c70 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
10c80 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e   *pNew;.  int nN
10c90 65 77 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  ew = sizeof(Fts5
10ca0 50 61 67 65 57 72 69 74 65 72 29 20 2a 20 28 70  PageWriter) * (p
10cb0 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b  Writer->nWriter+
10cc0 31 29 3b 0a 0a 20 20 61 4e 65 77 20 3d 20 28 46  1);..  aNew = (F
10cd0 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29 73  ts5PageWriter*)s
10ce0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
10cf0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 2c  Writer->aWriter,
10d00 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 61 4e   nNew);.  if( aN
10d10 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
10d20 0a 20 20 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  .  pNew = &aNew[
10d30 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
10d40 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  ];.  memset(pNew
10d50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
10d60 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20  PageWriter));.  
10d70 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a  pNew->pgno = 1;.
10d80 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
10d90 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
10da0 20 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29 3b   &pNew->buf, 1);
10db0 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72  ..  pWriter->nWr
10dc0 69 74 65 72 2b 2b 3b 0a 20 20 70 57 72 69 74 65  iter++;.  pWrite
10dd0 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 61 4e 65  r->aWriter = aNe
10de0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  w;.}../*.** This
10df0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   is called once 
10e00 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61  for each leaf pa
10e10 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69  ge except the fi
10e20 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  rst that contain
10e30 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e  s.** at least on
10e40 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74  e term. Argument
10e50 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69   (nTerm/pTerm) i
10e60 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20  s the split-key 
10e70 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a  - a term that.**
10e80 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
10e90 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65  all terms writte
10ea0 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61  n to earlier lea
10eb0 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74  ves, and equal t
10ec0 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20  o or.** smaller 
10ed0 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 74  than the first t
10ee0 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c  erm on the new l
10ef0 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  eaf..**.** If an
10f00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
10f10 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
10f20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65  left in Fts5Inde
10f30 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  x.rc. If an erro
10f40 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  r.** has already
10f50 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
10f60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
10f70 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
10f80 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
10f90 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
10fa0 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35  treeTerm(.  Fts5
10fb0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10fd0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
10fe0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
10ff0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
11000 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11010 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
11020 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75  t nTerm, const u
11030 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a  8 *pTerm      /*
11040 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e   First term on n
11050 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ew page */.){.  
11060 69 6e 74 20 69 48 65 69 67 68 74 3b 0a 20 20 66  int iHeight;.  f
11070 6f 72 28 69 48 65 69 67 68 74 3d 31 3b 20 31 3b  or(iHeight=1; 1;
11080 20 69 48 65 69 67 68 74 2b 2b 29 7b 0a 20 20 20   iHeight++){.   
11090 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
110a0 2a 70 50 61 67 65 3b 0a 0a 20 20 20 20 69 66 28  *pPage;..    if(
110b0 20 69 48 65 69 67 68 74 3e 3d 70 57 72 69 74 65   iHeight>=pWrite
110c0 72 2d 3e 6e 57 72 69 74 65 72 20 29 7b 0a 20 20  r->nWriter ){.  
110d0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
110e0 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  eeGrow(p, pWrite
110f0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  r);.      if( p-
11100 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
11110 20 20 7d 0a 20 20 20 20 70 50 61 67 65 20 3d 20    }.    pPage = 
11120 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
11130 72 5b 69 48 65 69 67 68 74 5d 3b 0a 0a 20 20 20  r[iHeight];..   
11140 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
11150 45 6d 70 74 79 28 70 2c 20 70 57 72 69 74 65 72  Empty(p, pWriter
11160 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  );..    if( pPag
11170 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73  e->buf.n>=p->pgs
11180 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  z ){.      /* pP
11190 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74  age will be writ
111a0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ten to disk. The
111b0 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77 72   term will be wr
111c0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 20  itten into the. 
111d0 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6f       ** parent o
111e0 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20 20  f pPage.  */.   
111f0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
11200 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
11210 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
11220 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
11230 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 48  iter->iSegid, iH
11240 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70 67  eight, pPage->pg
11250 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  no.      );.    
11260 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
11270 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
11280 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
11290 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  buf.n);.      ft
112a0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
112b0 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20  age->buf);.     
112c0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
112d0 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20  &pPage->term);. 
112e0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
112f0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
11300 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
11310 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29   pPage[-1].pgno)
11320 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
11330 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  gno++;.    }else
11340 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65  {.      int nPre
11350 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
11360 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72  press(pPage->ter
11370 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  m.n, pPage->term
11380 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  .p, nTerm, pTerm
11390 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
113a0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
113b0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
113c0 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20 20  buf, nPre+2);.  
113d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
113e0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
113f0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
11400 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20 20  nTerm-nPre);.   
11410 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
11420 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
11430 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
11440 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b 6e  rm-nPre, pTerm+n
11450 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  Pre);.      fts5
11460 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
11470 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
11480 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
11490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
114a0 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
114b0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
114c0 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
114d0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114f0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
11500 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
11510 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
11520 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11530 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
11540 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
11550 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
11560 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72 6f   ){.    /* No ro
11570 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67  wids on this pag
11580 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30 78 30  e. Append an 0x0
11590 30 20 62 79 74 65 20 74 6f 20 74 68 65 20 63 75  0 byte to the cu
115a0 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64 6f  rrent .    ** do
115b0 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
115c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
115d0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
115e0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
115f0 72 2d 3e 64 6c 69 64 78 2c 20 30 29 3b 0a 20 20  r->dlidx, 0);.  
11600 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  }.  pWriter->nEm
11610 70 74 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pty++;.}../*.** 
11620 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73  Rowid iRowid has
11630 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e   just been appen
11640 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
11650 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73  nt leaf page. As
11660 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20 66 69   it is.** the fi
11670 72 73 74 20 6f 6e 20 69 74 73 20 70 61 67 65 2c  rst on its page,
11680 20 61 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79   append an entry
11690 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
116a0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
116b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
116c0 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
116d0 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nd(.  Fts5Index 
116e0 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
116f0 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
11700 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a    i64 iRowid.){.
11710 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 69 66    i64 iVal;.  if
11720 28 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64  ( pWriter->bDlid
11730 78 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20  xPrevValid ){.  
11740 20 20 69 56 61 6c 20 3d 20 70 57 72 69 74 65 72    iVal = pWriter
11750 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 2d 20 69  ->iDlidxPrev - i
11760 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rowid;.  }else{.
11770 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
11780 64 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  d;.  }.  sqlite3
11790 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
117a0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
117b0 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2c 20  pWriter->dlidx, 
117c0 69 56 61 6c 29 3b 0a 20 20 70 57 72 69 74 65 72  iVal);.  pWriter
117d0 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  ->bDlidxPrevVali
117e0 64 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  d = 1;.  pWriter
117f0 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 3d 20 69  ->iDlidxPrev = i
11800 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74 69 63  Rowid;.}..static
11810 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
11820 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64  lushLeaf(Fts5Ind
11830 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
11840 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
11850 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
11860 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30  8 zero[] = { 0x0
11870 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
11880 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67  x00 };.  Fts5Pag
11890 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
118a0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
118b0 65 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f  er[0];.  i64 iRo
118c0 77 69 64 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  wid;..  if( pPag
118d0 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a  e->term.n==0 ){.
118e0 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77      /* No term w
118f0 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  as written to th
11900 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  is page. */.    
11910 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47  assert( 0==fts5G
11920 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  etU16(&pPage->bu
11930 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66  f.p[2]) );.    f
11940 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
11950 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
11960 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
11970 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
11980 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a  e to the db. */.
11990 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
119a0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
119b0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
119c0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c  iter->iSegid, 0,
119d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
119e0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
119f0 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d  , iRowid, pPage-
11a00 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
11a10 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  uf.n);..  /* Ini
11a20 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74  tialize the next
11a30 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
11a40 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
11a50 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  e->buf);.  fts5B
11a60 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
11a70 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  ->term);.  fts5B
11a80 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
11a90 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
11aa0 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20  buf, 4, zero);. 
11ab0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
11ac0 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
11ad0 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
11ae0 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
11af0 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
11b00 74 74 65 6e 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tten++;.}../*.**
11b10 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
11b20 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
11b30 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
11b40 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
11b50 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
11b60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
11b70 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
11b80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
11b90 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
11ba0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
11bb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
11bc0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
11bd0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
11be0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
11bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11c00 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
11c10 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
11c20 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
11c30 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
11c40 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
11c50 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
11c60 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
11c90 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
11ca0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
11cb0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
11cc0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
11cd0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20  ->aWriter[0];.. 
11ce0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11cf0 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67  buf.n==0 || pPag
11d00 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20  e->buf.n>4 );.  
11d10 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
11d20 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65  ==0 ){.    /* Ze
11d30 72 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ro the first ter
11d40 6d 20 61 6e 64 20 66 69 72 73 74 20 64 6f 63 69  m and first doci
11d50 64 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20  d fields */.    
11d60 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
11d70 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
11d80 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
11d90 30 20 7d 3b 0a 20 20 20 20 66 74 73 35 42 75 66  0 };.    fts5Buf
11da0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
11db0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
11dc0 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20  f, 4, zero);.   
11dd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11de0 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 7d  term.n==0 );.  }
11df0 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
11e00 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28 20  eturn;.  .  if( 
11e10 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30  pPage->term.n==0
11e20 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   ){.    /* Updat
11e30 65 20 74 68 65 20 22 66 69 72 73 74 20 74 65 72  e the "first ter
11e40 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  m" field of the 
11e50 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  page header. */.
11e60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
11e70 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26  e->buf.p[2]==0 &
11e80 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33  & pPage->buf.p[3
11e90 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  ]==0 );.    fts5
11ea0 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
11eb0 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e  uf.p[2], pPage->
11ec0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65  buf.n);.    nPre
11ed0 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
11ee0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
11ef0 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a  r[0].pgno!=1 ){.
11f00 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
11f10 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69  treeTerm(p, pWri
11f20 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
11f30 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  m);.      pPage 
11f40 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
11f50 74 65 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20  ter[0];.    }.  
11f60 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
11f70 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
11f80 6f 6d 70 72 65 73 73 28 0a 20 20 20 20 20 20 20  ompress(.       
11f90 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20   pPage->term.n, 
11fa0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e  pPage->term.p, n
11fb0 54 65 72 6d 2c 20 70 54 65 72 6d 0a 20 20 20 20  Term, pTerm.    
11fc0 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
11fd0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
11fe0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
11ff0 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d  f, nPrefix);.  }
12000 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
12010 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
12020 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74  s of new data, t
12030 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74  hen the term dat
12040 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f  a itself.  ** to
12050 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
12060 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
12070 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
12080 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
12090 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  m - nPrefix);.  
120a0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
120b0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
120c0 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
120d0 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72  - nPrefix, &pTer
120e0 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20  m[nPrefix]);..  
120f0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
12100 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65 72  s5PageWriter.ter
12110 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74  m field. */.  ft
12120 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
12130 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
12140 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
12150 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ..  pWriter->bFi
12160 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
12170 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   0;.  pWriter->b
12180 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
12190 69 73 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ist = 1;..  /* I
121a0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  f the current le
121b0 61 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c  af page is full,
121c0 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
121d0 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  k. */.  if( pPag
121e0 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73  e->buf.n>=p->pgs
121f0 7a 20 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69  z ){.    fts5Wri
12200 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
12210 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 57 72  Writer);.    pWr
12220 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
12230 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d  dInPage = 1;.  }
12240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
12250 20 61 20 64 6f 63 69 64 20 74 6f 20 74 68 65 20   a docid to the 
12260 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
12270 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12280 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
12290 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
122a0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
122b0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
122c0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
122d0 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
122e0 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
122f0 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b  ter->aWriter[0];
12300 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
12310 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
12320 74 20 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20  t docid written 
12330 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65 74  to the page, set
12340 20 74 68 65 20 0a 20 20 2a 2a 20 64 6f 63 69 64   the .  ** docid
12350 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
12360 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
12370 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
12380 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
12390 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61  ** buffer, in ca
123a0 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  se a doclist-ind
123b0 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ex is required. 
123c0 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65   */.  if( pWrite
123d0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
123e0 50 61 67 65 20 29 7b 0a 20 20 20 20 66 74 73 35  Page ){.    fts5
123f0 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75  PutU16(pPage->bu
12400 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
12410 6e 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  n);.    fts5Writ
12420 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
12430 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  pWriter, iRowid)
12440 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
12450 65 20 74 68 65 20 64 6f 63 69 64 2e 20 2a 2f 0a  e the docid. */.
12460 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
12470 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
12480 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  ist || pWriter->
12490 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
124a0 65 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  e ){.    fts5Buf
124b0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
124c0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
124d0 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
124e0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
124f0 74 28 20 69 52 6f 77 69 64 3c 70 57 72 69 74 65  t( iRowid<pWrite
12500 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b  r->iPrevRowid );
12510 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
12520 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
12530 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
12540 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
12550 6f 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a  owid - iRowid);.
12560 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69    }.  pWriter->i
12570 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77  PrevRowid = iRow
12580 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62  id;.  pWriter->b
12590 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
125a0 69 73 74 20 3d 20 30 3b 0a 20 20 70 57 72 69 74  ist = 0;.  pWrit
125b0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
125c0 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 69 66  nPage = 0;..  if
125d0 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
125e0 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66  p->pgsz ){.    f
125f0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
12600 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
12610 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
12620 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
12630 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  1;.  }.}..static
12640 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
12650 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28  ppendPoslistInt(
12660 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
12670 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
12680 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
12690 74 20 69 56 61 6c 0a 29 7b 0a 20 20 46 74 73 35  t iVal.){.  Fts5
126a0 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
126b0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
126c0 72 69 74 65 72 5b 30 5d 3b 0a 20 20 66 74 73 35  riter[0];.  fts5
126d0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
126e0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
126f0 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20  e->buf, iVal);. 
12700 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
12710 6e 3e 3d 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  n>=p->pgsz ){.  
12720 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
12730 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
12740 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
12750 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
12760 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 1;.  }.}..sta
12770 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
12780 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65  teAppendZerobyte
12790 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
127a0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
127b0 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  riter){.  fts5Bu
127c0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
127d0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
127e0 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75  r->aWriter[0].bu
127f0 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
12800 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
12810 74 73 20 6f 66 20 70 65 6e 64 69 6e 67 2d 64 6f  ts of pending-do
12820 63 6c 69 73 74 20 6f 62 6a 65 63 74 20 70 44 6f  clist object pDo
12830 63 6c 69 73 74 20 74 6f 20 77 72 69 74 65 72 20  clist to writer 
12840 70 57 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pWriter..**.** I
12850 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12860 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  s, set the Fts5I
12870 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
12880 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  de. If an error 
12890 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
128a0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
128b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
128c0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
128d0 69 64 20 66 74 73 35 57 72 69 74 65 50 65 6e 64  id fts5WritePend
128e0 69 6e 67 44 6f 63 6c 69 73 74 28 0a 20 20 46 74  ingDoclist(.  Ft
128f0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12910 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
12920 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
12930 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
12940 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
12950 74 65 20 74 6f 20 74 68 69 73 20 77 72 69 74 65  te to this write
12960 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  r object */.  Ft
12970 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  s5PendingDoclist
12980 20 2a 70 44 6f 63 6c 69 73 74 20 20 20 20 2f 2a   *pDoclist    /*
12990 20 44 6f 63 6c 69 73 74 20 74 6f 20 77 72 69 74   Doclist to writ
129a0 65 20 74 6f 20 70 57 72 69 74 65 72 20 2a 2f 0a  e to pWriter */.
129b0 29 7b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67  ){.  Fts5Pending
129c0 50 6f 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69 73  Poslist *pPoslis
129d0 74 3b 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20  t;   /* Used to 
129e0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
129f0 74 68 65 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a  the doclist */..
12a00 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
12a10 74 65 72 6d 20 2a 2f 0a 20 20 66 74 73 35 57 72  term */.  fts5Wr
12a20 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
12a30 20 70 57 72 69 74 65 72 2c 20 70 44 6f 63 6c 69   pWriter, pDocli
12a40 73 74 2d 3e 6e 54 65 72 6d 2c 20 70 44 6f 63 6c  st->nTerm, pDocl
12a50 69 73 74 2d 3e 70 54 65 72 6d 29 3b 0a 0a 20 20  ist->pTerm);..  
12a60 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f  /* Append the po
12a70 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  sition list for 
12a80 65 61 63 68 20 72 6f 77 69 64 20 2a 2f 0a 20 20  each rowid */.  
12a90 66 6f 72 28 70 50 6f 73 6c 69 73 74 3d 70 44 6f  for(pPoslist=pDo
12aa0 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69 73 74 3b  clist->pPoslist;
12ab0 20 70 50 6f 73 6c 69 73 74 3b 20 70 50 6f 73 6c   pPoslist; pPosl
12ac0 69 73 74 3d 70 50 6f 73 6c 69 73 74 2d 3e 70 4e  ist=pPoslist->pN
12ad0 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ext){.    int i 
12ae0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  = 0;..    /* App
12af0 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 69 74  end the rowid it
12b00 73 65 6c 66 20 2a 2f 0a 20 20 20 20 66 74 73 35  self */.    fts5
12b10 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64  WriteAppendRowid
12b20 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70 50 6f  (p, pWriter, pPo
12b30 73 6c 69 73 74 2d 3e 69 52 6f 77 69 64 29 3b 0a  slist->iRowid);.
12b40 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
12b50 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
12b60 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20  osition list in 
12b70 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 66 74 73  bytes */.    fts
12b80 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
12b90 69 73 74 49 6e 74 28 70 2c 20 70 57 72 69 74 65  istInt(p, pWrite
12ba0 72 2c 20 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66  r, pPoslist->buf
12bb0 2e 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  .n);..    /* Cop
12bc0 79 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  y the position l
12bd0 69 73 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ist to the outpu
12be0 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 20  t segment */.   
12bf0 20 77 68 69 6c 65 28 20 69 3c 70 50 6f 73 6c 69   while( i<pPosli
12c00 73 74 2d 3e 62 75 66 2e 6e 29 7b 0a 20 20 20 20  st->buf.n){.    
12c10 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
12c20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
12c30 33 32 28 26 70 50 6f 73 6c 69 73 74 2d 3e 62 75  32(&pPoslist->bu
12c40 66 2e 70 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20  f.p[i], iVal);. 
12c50 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
12c60 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 70  pendPoslistInt(p
12c70 2c 20 70 57 72 69 74 65 72 2c 20 69 56 61 6c 29  , pWriter, iVal)
12c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12c90 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f 63 6c  * Write the docl
12ca0 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a  ist terminator *
12cb0 2f 0a 20 20 66 74 73 35 57 72 69 74 65 41 70 70  /.  fts5WriteApp
12cc0 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2c 20 70  endZerobyte(p, p
12cd0 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Writer);.}../*.*
12ce0 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61  * Flush any data
12cf0 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77   cached by the w
12d00 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  riter object to 
12d10 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72  the database. Fr
12d20 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ee any.** alloca
12d30 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
12d40 20 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72   with the writer
12d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12d60 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
12d70 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
12d80 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
12d90 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
12da0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
12db0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  bject */.  int *
12dc0 70 6e 48 65 69 67 68 74 2c 20 20 20 20 20 20 20  pnHeight,       
12dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
12de0 54 3a 20 48 65 69 67 68 74 20 6f 66 20 74 68 65  T: Height of the
12df0 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
12e00 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20   *pnLeaf        
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c  OUT: Number of l
12e30 65 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74  eaf pages in b-t
12e40 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ree */.){.  int 
12e50 69 3b 0a 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70  i;.  *pnLeaf = p
12e60 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
12e70 30 5d 2e 70 67 6e 6f 3b 0a 20 20 66 74 73 35 57  0].pgno;.  fts5W
12e80 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
12e90 20 70 57 72 69 74 65 72 29 3b 0a 20 20 69 66 28   pWriter);.  if(
12ea0 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
12eb0 72 3d 3d 31 20 26 26 20 70 57 72 69 74 65 72 2d  r==1 && pWriter-
12ec0 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49  >nEmpty>=FTS5_MI
12ed0 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a  N_DLIDX_SIZE ){.
12ee0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
12ef0 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  eeGrow(p, pWrite
12f00 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57  r);.  }.  if( pW
12f10 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31  riter->nWriter>1
12f20 20 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69 74   ){.    fts5Writ
12f30 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c 20  eBtreeNEmpty(p, 
12f40 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pWriter);.  }.  
12f50 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 57 72 69  *pnHeight = pWri
12f60 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a 20  ter->nWriter;.. 
12f70 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 57 72 69   for(i=1; i<pWri
12f80 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b  ter->nWriter; i+
12f90 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65  +){.    Fts5Page
12fa0 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70  Writer *pPg = &p
12fb0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
12fc0 69 5d 3b 0a 20 20 20 20 69 36 34 20 69 52 6f 77  i];.    i64 iRow
12fd0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
12fe0 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
12ff0 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  Idx, pWriter->iS
13000 65 67 69 64 2c 20 69 2c 20 70 50 67 2d 3e 70 67  egid, i, pPg->pg
13010 6e 6f 29 3b 0a 20 20 20 20 66 74 73 35 44 61 74  no);.    fts5Dat
13020 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77 2c 20  aWrite(p, iRow, 
13030 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d  pPg->buf.p, pPg-
13040 3e 62 75 66 2e 6e 29 3b 0a 20 20 7d 0a 20 20 66  >buf.n);.  }.  f
13050 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65  or(i=0; i<pWrite
13060 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29  r->nWriter; i++)
13070 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
13080 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72  iter *pPg = &pWr
13090 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d  iter->aWriter[i]
130a0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
130b0 46 72 65 65 28 26 70 50 67 2d 3e 74 65 72 6d 29  Free(&pPg->term)
130c0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
130d0 46 72 65 65 28 26 70 50 67 2d 3e 62 75 66 29 3b  Free(&pPg->buf);
130e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
130f0 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 57 72  ree(pWriter->aWr
13100 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  iter);.  sqlite3
13110 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  Fts5BufferFree(&
13120 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 29 3b  pWriter->dlidx);
13130 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
13140 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20  fts5WriteInit(. 
13150 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
13160 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
13170 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74  *pWriter, .  int
13180 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65 67 69   iIdx, int iSegi
13190 64 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 57  d.){.  memset(pW
131a0 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
131b0 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
131c0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64  ;.  pWriter->iId
131d0 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57 72 69  x = iIdx;.  pWri
131e0 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  ter->iSegid = iS
131f0 65 67 69 64 3b 0a 0a 20 20 70 57 72 69 74 65 72  egid;..  pWriter
13200 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74 73  ->aWriter = (Fts
13210 35 50 61 67 65 57 72 69 74 65 72 2a 29 66 74 73  5PageWriter*)fts
13220 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 73 69 7a  5IdxMalloc(p,siz
13230 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
13240 65 72 29 29 3b 0a 20 20 69 66 28 20 70 57 72 69  er));.  if( pWri
13250 74 65 72 2d 3e 61 57 72 69 74 65 72 3d 3d 30 20  ter->aWriter==0 
13260 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 57 72 69  ) return;.  pWri
13270 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20 31  ter->nWriter = 1
13280 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72  ;.  pWriter->aWr
13290 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 31  iter[0].pgno = 1
132a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
132b0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 46 6f   fts5WriteInitFo
132c0 72 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49  rAppend(.  Fts5I
132d0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
132e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
132f0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
13300 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
13310 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
13320 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
13330 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a   to initialize *
13340 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13360 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 65 67      /* Index seg
13370 6d 65 6e 74 20 69 73 20 61 20 70 61 72 74 20 6f  ment is a part o
13380 66 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  f */.  Fts5Struc
13390 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
133a0 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g      /* Segmen
133b0 74 20 6f 62 6a 65 63 74 20 74 6f 20 61 70 70 65  t object to appe
133c0 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e  nd to */.){.  in
133d0 74 20 6e 42 79 74 65 20 3d 20 70 53 65 67 2d 3e  t nByte = pSeg->
133e0 6e 48 65 69 67 68 74 20 2a 20 73 69 7a 65 6f 66  nHeight * sizeof
133f0 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72 29  (Fts5PageWriter)
13400 3b 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74  ;.  memset(pWrit
13410 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
13420 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
13430 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d   pWriter->iIdx =
13440 20 69 49 64 78 3b 0a 20 20 70 57 72 69 74 65 72   iIdx;.  pWriter
13450 2d 3e 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  ->iSegid = pSeg-
13460 3e 69 53 65 67 69 64 3b 0a 20 20 70 57 72 69 74  >iSegid;.  pWrit
13470 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46  er->aWriter = (F
13480 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29 66  ts5PageWriter*)f
13490 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
134a0 6e 42 79 74 65 29 3b 0a 20 20 70 57 72 69 74 65  nByte);.  pWrite
134b0 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20 70 53 65  r->nWriter = pSe
134c0 67 2d 3e 6e 48 65 69 67 68 74 3b 0a 0a 20 20 69  g->nHeight;..  i
134d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
134e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  _OK ){.    int p
134f0 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  gno = 1;.    int
13500 20 69 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d   i;.    pWriter-
13510 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f  >aWriter[0].pgno
13520 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
13530 74 2b 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t+1;.    for(i=p
13540 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20  Seg->nHeight-1; 
13550 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
13560 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54   i64 iRowid = FT
13570 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
13580 28 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20  (pWriter->iIdx, 
13590 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
135a0 20 69 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20   i, pgno);.     
135b0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
135c0 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d  *pPg = &pWriter-
135d0 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20  >aWriter[i];.   
135e0 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
135f0 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74 73 35 44  gno;.      fts5D
13600 61 74 61 42 75 66 66 65 72 28 70 2c 20 26 70 50  ataBuffer(p, &pP
13610 67 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b  g->buf, iRowid);
13620 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
13630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13640 20 20 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49         Fts5NodeI
13650 74 65 72 20 73 73 3b 0a 20 20 20 20 20 20 20 20  ter ss;.        
13660 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
13670 28 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67  (pPg->buf.p, pPg
13680 2d 3e 62 75 66 2e 6e 2c 20 26 73 73 29 3b 0a 20  ->buf.n, &ss);. 
13690 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 73         while( ss
136a0 2e 61 44 61 74 61 20 29 20 66 74 73 35 4e 6f 64  .aData ) fts5Nod
136b0 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
136c0 2c 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20  , &ss);.        
136d0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
136e0 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 74 65 72 6d  ->rc, &pPg->term
136f0 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e  , ss.term.n, ss.
13700 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20  term.p);.       
13710 20 70 67 6e 6f 20 3d 20 73 73 2e 69 43 68 69 6c   pgno = ss.iChil
13720 64 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e  d;.        fts5N
13730 6f 64 65 49 74 65 72 46 72 65 65 28 26 73 73 29  odeIterFree(&ss)
13740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13750 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 48      if( pSeg->nH
13760 65 69 67 68 74 3d 3d 31 20 29 7b 0a 20 20 20 20  eight==1 ){.    
13770 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74    pWriter->nEmpt
13780 79 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  y = pSeg->pgnoLa
13790 73 74 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  st-1;.    }.    
137a0 61 73 73 65 72 74 28 20 28 70 67 6e 6f 2b 70 57  assert( (pgno+pW
137b0 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d  riter->nEmpty)==
137c0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
137d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
137e0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77 61  terator pIter wa
137f0 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
13800 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  e through the in
13810 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  put segments of 
13820 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65  on an.** increme
13830 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61  ntal merge opera
13840 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tion. This funct
13850 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66  ion is called if
13860 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
13870 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68  .** merge step h
13880 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74 20  as finished but 
13890 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f  the input has no
138a0 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  t been completel
138b0 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a  y exhausted..*/.
138c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
138d0 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73  TrimSegments(Fts
138e0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d  5Index *p, Fts5M
138f0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
13900 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
13910 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
13920 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
13930 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
13940 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  fer));.  for(i=0
13950 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
13960 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53   i++){.    Fts5S
13970 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
13980 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a  pIter->aSeg[i];.
13990 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53      if( pSeg->pS
139a0 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  eg==0 ){.      /
139b0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  * no-op */.    }
139c0 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70  else if( pSeg->p
139d0 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
139e0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
139f0 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  oLast = 0;.     
13a00 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
13a10 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20  oFirst = 0;.    
13a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
13a30 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54   iOff = pSeg->iT
13a40 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ermLeafOffset;  
13a50 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20     /* Offset on 
13a60 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70  new first leaf p
13a70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  age */.      i64
13a80 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20   iLeafRowid;.   
13a90 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
13aa0 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ta;.      int iI
13ab0 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e  d = pSeg->pSeg->
13ac0 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38  iSegid;.      u8
13ad0 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30   aHdr[4] = {0x00
13ae0 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
13af0 30 34 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61  04};..      iLea
13b00 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  fRowid = FTS5_SE
13b10 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
13b20 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20  ->iIdx, iId, 0, 
13b30 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
13b40 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74  gno);.      pDat
13b50 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
13b60 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b  (p, iLeafRowid);
13b70 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
13b80 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
13b90 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29  BufferZero(&buf)
13ba0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
13bb0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
13bc0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a  p->rc, &buf, siz
13bd0 65 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29  eof(aHdr), aHdr)
13be0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
13bf0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
13c00 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
13c10 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20  Seg->term.n);.  
13c20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
13c30 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
13c40 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74  c, &buf, pSeg->t
13c50 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72  erm.n, pSeg->ter
13c60 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74  m.p);.        ft
13c70 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
13c80 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
13c90 20 70 44 61 74 61 2d 3e 6e 20 2d 20 69 4f 66 66   pData->n - iOff
13ca0 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  , &pData->p[iOff
13cb0 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ]);.        fts5
13cc0 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
13cd0 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67  a);.        pSeg
13ce0 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
13cf0 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  t = pSeg->iTermL
13d00 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20  eafPgno;.       
13d10 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
13d20 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
13d30 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78  ROWID(pSeg->iIdx
13d40 2c 20 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65  , iId, 0, 1),iLe
13d50 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  afRowid);.      
13d60 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
13d70 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62  p, iLeafRowid, b
13d80 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20  uf.p, buf.n);.  
13d90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13da0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
13db0 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&buf);.}../*.**
13dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13dd0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
13de0 76 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78  vel(.  Fts5Index
13df0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13e00 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
13e10 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
13e20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
13e50 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35  ork on */.  Fts5
13e60 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
13e70 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ct,         /* S
13e80 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  tucture of index
13e90 20 69 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69   iIdx */.  int i
13ea0 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
13eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
13ec0 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
13ed0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
13ee0 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20  *pnRem          
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
13f00 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73 20  rite up to this 
13f10 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76  many output leav
13f20 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  es */.){.  Fts5S
13f30 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
13f40 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
13f50 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
13f60 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
13f70 65 6c 20 2a 70 4c 76 6c 4f 75 74 20 3d 20 26 70  el *pLvlOut = &p
13f80 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
13f90 4c 76 6c 2b 31 5d 3b 0a 20 20 46 74 73 35 4d 75  Lvl+1];.  Fts5Mu
13fa0 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
13fb0 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 74 65  r = 0;    /* Ite
13fc0 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e  rator to read in
13fd0 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  put data */.  in
13fe0 74 20 6e 52 65 6d 20 3d 20 2a 70 6e 52 65 6d 3b  t nRem = *pnRem;
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14000 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61 67   Output leaf pag
14010 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
14020 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74   */.  int nInput
14030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14040 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14050 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
14060 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  s */.  Fts5SegWr
14070 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
14080 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
14090 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
140a0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
140b0 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
140c0 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a  Output segment *
140d0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
140e0 65 72 6d 3b 0a 20 20 69 6e 74 20 62 52 65 71 75  erm;.  int bRequ
140f0 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d  ireDoclistTerm =
14100 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69   0;..  assert( i
14110 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
14120 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  vel );.  assert(
14130 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
14140 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
14150 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20  memset(&writer, 
14160 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
14170 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d  gWriter));.  mem
14180 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
14190 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
141a0 29 3b 0a 20 20 77 72 69 74 65 72 2e 69 49 64 78  );.  writer.iIdx
141b0 20 3d 20 69 49 64 78 3b 0a 20 20 69 66 28 20 70   = iIdx;.  if( p
141c0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
141d0 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f     assert( pLvlO
141e0 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20  ut->nSeg>0 );.  
141f0 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d    nInput = pLvl-
14200 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 66 74 73  >nMerge;.    fts
14210 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70 70  5WriteInitForApp
14220 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  end(p, &writer, 
14230 69 49 64 78 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e  iIdx, &pLvlOut->
14240 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53  aSeg[pLvlOut->nS
14250 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53 65 67  eg-1]);.    pSeg
14260 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
14270 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
14280 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1];.  }else{.   
14290 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74   int iSegid = ft
142a0 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
142b0 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  p, pStruct);.   
142c0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
142d0 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c  , &writer, iIdx,
142e0 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f   iSegid);..    /
142f0 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65  * Add the new se
14300 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  gment to the out
14310 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
14320 20 69 66 28 20 69 4c 76 6c 2b 31 3d 3d 70 53 74   if( iLvl+1==pSt
14330 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 20 70  ruct->nLevel ) p
14340 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b  Struct->nLevel++
14350 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  ;.    pSeg = &pL
14360 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
14370 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20  Out->nSeg];.    
14380 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b  pLvlOut->nSeg++;
14390 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46  .    pSeg->pgnoF
143a0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53  irst = 1;.    pS
143b0 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  eg->iSegid = iSe
143c0 67 69 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  gid;..    /* Rea
143d0 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c  d input from all
143e0 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
143f0 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
14400 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
14410 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 23 69 66  l->nSeg;.  }.#if
14420 20 30 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75   0.fprintf(stdou
14430 74 2c 20 22 6d 65 72 67 69 6e 67 20 25 64 20 73  t, "merging %d s
14440 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 6c 65 76  egments from lev
14450 65 6c 20 25 64 21 22 2c 20 6e 49 6e 70 75 74 2c  el %d!", nInput,
14460 20 69 4c 76 6c 29 3b 0a 66 66 6c 75 73 68 28 73   iLvl);.fflush(s
14470 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  tdout);.#endif..
14480 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49    for(fts5MultiI
14490 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63  terNew(p, pStruc
144a0 74 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c 20 30  t, iIdx, 0, 0, 0
144b0 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20  , iLvl, nInput, 
144c0 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66  &pIter);.      f
144d0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
144e0 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
144f0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
14500 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 0a  rNext(p, pIter).
14510 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67    ){.    Fts5Seg
14520 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
14530 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
14540 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20  ->aFirst[1] ];. 
14550 20 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72     Fts5ChunkIter
14560 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   sPos;          
14570 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
14580 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f 73 69  ate through posi
14590 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20  tion list */.   
145a0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
145b0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
145c0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
145d0 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72  erm(pIter, &nTer
145e0 6d 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 54 65  m);..    if( nTe
145f0 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65  rm!=term.n || me
14600 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72 6d  mcmp(pTerm, term
14610 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20  .p, nTerm) ){.  
14620 20 20 20 20 69 66 28 20 77 72 69 74 65 72 2e 6e      if( writer.n
14630 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d  LeafWritten>nRem
14640 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
14650 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65   /* This is a ne
14660 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61  w term. Append a
14670 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74   term to the out
14680 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a  put segment. */.
14690 20 20 20 20 20 20 69 66 28 20 62 52 65 71 75 69        if( bRequi
146a0 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 29 7b  reDoclistTerm ){
146b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
146c0 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65  teAppendZerobyte
146d0 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20  (p, &writer);.  
146e0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
146f0 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
14700 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72  p, &writer, nTer
14710 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
14720 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
14730 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54  p->rc, &term, nT
14740 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
14750 20 20 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69     bRequireDocli
14760 73 74 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  stTerm = 1;.    
14770 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  }..    /* Append
14780 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
14790 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
147a0 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
147b0 6f 77 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c  owid(p, &writer,
147c0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
147d0 77 69 64 28 70 49 74 65 72 29 29 3b 0a 0a 20 20  wid(pIter));..  
147e0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 6f    /* Copy the po
147f0 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 72 6f 6d  sition list from
14800 20 69 6e 70 75 74 20 74 6f 20 6f 75 74 70 75 74   input to output
14810 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e   */.    fts5Chun
14820 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
14830 67 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20 20 66  g, &sPos);.    f
14840 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
14850 73 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72 69  slistInt(p, &wri
14860 74 65 72 2c 20 73 50 6f 73 2e 6e 52 65 6d 29 3b  ter, sPos.nRem);
14870 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 6f 70  .    for(/* noop
14880 20 2a 2f 3b 20 66 74 73 35 43 68 75 6e 6b 49 74   */; fts5ChunkIt
14890 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73 29 3d  erEof(p, &sPos)=
148a0 3d 30 3b 20 66 74 73 35 43 68 75 6e 6b 49 74 65  =0; fts5ChunkIte
148b0 72 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29 29  rNext(p, &sPos))
148c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
148d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 0;.      whil
148e0 65 28 20 69 4f 66 66 3c 73 50 6f 73 2e 6e 20 29  e( iOff<sPos.n )
148f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 56  {.        int iV
14900 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  al;.        iOff
14910 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
14920 26 73 50 6f 73 2e 70 5b 69 4f 66 66 5d 2c 20 69  &sPos.p[iOff], i
14930 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Val);.        ft
14940 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
14950 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72 69 74  listInt(p, &writ
14960 65 72 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20  er, iVal);.     
14970 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
14980 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73  /* Flush the las
14990 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64  t leaf page to d
149a0 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74  isk. Set the out
149b0 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  put segment b-tr
149c0 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61  ee height.  ** a
149d0 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  nd last leaf pag
149e0 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20  e number at the 
149f0 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20  same time.  */. 
14a00 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
14a10 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53  (p, &writer, &pS
14a20 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20 26 70 53  eg->nHeight, &pS
14a30 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  eg->pgnoLast);..
14a40 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
14a50 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
14a60 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a   ){.    int i;..
14a70 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
14a80 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d  e redundant segm
14a90 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f  ents from the %_
14aa0 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
14ab0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e    for(i=0; i<nIn
14ac0 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  put; i++){.     
14ad0 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53   fts5DataRemoveS
14ae0 65 67 6d 65 6e 74 28 70 2c 20 69 49 64 78 2c 20  egment(p, iIdx, 
14af0 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53  pLvl->aSeg[i].iS
14b00 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  egid);.    }..  
14b10 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
14b20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
14b30 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ts from the inpu
14b40 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  t level */.    i
14b50 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e  f( pLvl->nSeg!=n
14b60 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69  Input ){.      i
14b70 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c  nt nMove = (pLvl
14b80 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29  ->nSeg - nInput)
14b90 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
14ba0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
14bb0 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  .      memmove(p
14bc0 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c  Lvl->aSeg, &pLvl
14bd0 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20  ->aSeg[nInput], 
14be0 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMove);.    }.  
14bf0 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20    pLvl->nSeg -= 
14c00 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c  nInput;.    pLvl
14c10 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  ->nMerge = 0;.  
14c20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 54  }else{.    fts5T
14c30 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70  rimSegments(p, p
14c40 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  Iter);.    pLvl-
14c50 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74  >nMerge = nInput
14c60 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c  ;.  }..  fts5Mul
14c70 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49  tiIterFree(p, pI
14c80 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
14c90 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
14ca0 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65   *pnRem -= write
14cb0 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a  r.nLeafWritten;.
14cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  }../*.** A total
14cd0 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70   of nLeaf leaf p
14ce0 61 67 65 73 20 6f 66 20 64 61 74 61 20 68 61 73  ages of data has
14cf0 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68   just been flush
14d00 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a  ed to a level-0.
14d10 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  ** segments in i
14d20 6e 64 65 78 20 69 49 64 78 20 77 69 74 68 20 73  ndex iIdx with s
14d30 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
14d40 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
14d50 75 70 64 61 74 65 73 20 74 68 65 0a 2a 2a 20 77  updates the.** w
14d60 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63  rite-counter acc
14d70 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66  ordingly and, if
14d80 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66   necessary, perf
14d90 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c  orms incremental
14da0 20 6d 65 72 67 65 0a 2a 2a 20 77 6f 72 6b 2e 0a   merge.** work..
14db0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
14dc0 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
14dd0 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
14de0 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e  rror code. If an
14df0 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
14e00 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
14e10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
14e20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
14e30 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
14e40 64 65 78 57 6f 72 6b 28 0a 20 20 46 74 73 35 49  dexWork(.  Fts5I
14e50 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
14e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
14e70 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
14e80 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
14eb0 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20  to work on */.  
14ec0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
14ed0 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20  Struct,         
14ee0 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  /* Current struc
14ef0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
14f00 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20  .  int nLeaf    
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14f30 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75  output leaves ju
14f40 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b  st written */.){
14f50 0a 20 20 69 36 34 20 6e 57 72 69 74 65 3b 20 20  .  i64 nWrite;  
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f70 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
14f80 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75  lue of write-cou
14f90 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  nter */.  int nW
14fa0 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
14fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14fc0 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e  ber of work-quan
14fd0 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f  ta to perform */
14fe0 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20  .  int nRem;    
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15010 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
15020 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 2f  to write */..  /
15030 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69  * Update the wri
15040 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c  te-counter. Whil
15050 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20  e doing so, set 
15060 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 6e 57 72 69  nWork. */.  nWri
15070 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  te = pStruct->nW
15080 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 6e  riteCounter;.  n
15090 57 6f 72 6b 20 3d 20 28 28 6e 57 72 69 74 65 20  Work = ((nWrite 
150a0 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57  + nLeaf) / p->nW
150b0 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69  orkUnit) - (nWri
150c0 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  te / p->nWorkUni
150d0 74 29 3b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e  t);.  pStruct->n
150e0 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20  WriteCounter += 
150f0 6e 4c 65 61 66 3b 0a 20 20 6e 52 65 6d 20 3d 20  nLeaf;.  nRem = 
15100 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e  p->nWorkUnit * n
15110 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e  Work * pStruct->
15120 6e 4c 65 76 65 6c 3b 0a 0a 20 20 77 68 69 6c 65  nLevel;..  while
15130 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
15140 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
15150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15160 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
15170 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
15180 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 2d  int iBestLvl = -
15190 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  1;          /* L
151a0 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68  evel offering th
151b0 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67  e most input seg
151c0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
151d0 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20   nBest = 0;     
151e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
151f0 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
15200 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76  ents on best lev
15210 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  el */..    /* Se
15220 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68  t iBestLvl to th
15230 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  e level to read 
15240 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66  input segments f
15250 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  rom. */.    for(
15260 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
15270 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
15280 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  vl++){.      Fts
15290 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
152a0 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
152b0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
152c0 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
152d0 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20  nMerge ){.      
152e0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
152f0 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  ge>nBest ){.    
15300 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d        iBestLvl =
15310 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20   iLvl;.         
15320 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e   nBest = pLvl->n
15330 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  Merge;.        }
15340 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15360 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65  ( pLvl->nSeg>nBe
15370 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42  st ){.        nB
15380 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  est = pLvl->nSeg
15390 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74 4c  ;.        iBestL
153a0 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  vl = iLvl;.     
153b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
153c0 65 72 74 28 20 69 42 65 73 74 4c 76 6c 3e 3d 30  ert( iBestLvl>=0
153d0 20 26 26 20 6e 42 65 73 74 3e 30 20 29 3b 0a 0a   && nBest>0 );..
153e0 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c 70 2d      if( nBest<p-
153f0 3e 6e 4d 69 6e 4d 65 72 67 65 20 26 26 20 70 53  >nMinMerge && pS
15400 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
15410 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
15420 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 66  0 ) break;.    f
15430 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
15440 65 6c 28 70 2c 20 69 49 64 78 2c 20 70 53 74 72  el(p, iIdx, pStr
15450 75 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26  uct, iBestLvl, &
15460 6e 52 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72  nRem);.    asser
15470 74 28 20 6e 52 65 6d 3d 3d 30 20 7c 7c 20 70 2d  t( nRem==0 || p-
15480 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15490 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
154a0 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
154b0 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  s of in-memory h
154c0 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68 20  ash table iHash 
154d0 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30  to a new level-0
154e0 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20   .** segment on 
154f0 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74  disk. Also updat
15500 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  e the correspond
15510 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65  ing structure re
15520 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
15530 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
15540 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
15550 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
15560 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
15570 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
15580 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
15590 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
155a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
155b0 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
155c0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
155d0 6e 74 20 69 48 61 73 68 2c 20 69 6e 74 20 2a 70  nt iHash, int *p
155e0 6e 4c 65 61 66 29 7b 0a 20 20 46 74 73 35 53 74  nLeaf){.  Fts5St
155f0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
15600 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
15610 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
15620 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15630 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66      /* Last leaf
15640 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
15650 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  segment */..  /*
15660 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65   Obtain a refere
15670 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78  nce to the index
15680 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
15690 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
156a0 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f  gment-id.  ** fo
156b0 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d  r the new level-
156c0 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20  0 segment.  */. 
156d0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
156e0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
156f0 69 48 61 73 68 29 3b 0a 20 20 69 53 65 67 69 64  iHash);.  iSegid
15700 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53   = fts5AllocateS
15710 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29  egid(p, pStruct)
15720 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20  ;..  if( iSegid 
15730 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 57 72  ){.    Fts5SegWr
15740 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20  iter writer;.   
15750 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
15760 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20  ist *pList;.    
15770 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69  Fts5PendingDocli
15780 73 74 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 46  st *pIter;.    F
15790 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
157a0 74 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 20 20 46  t *pNext;..    F
157b0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
157c0 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20  ent *pSeg;   /* 
157d0 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68  New segment with
157e0 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20  in pStruct */.  
157f0 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20    int nHeight;  
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 6e 65 77  /* Height of new
15820 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
15830 2a 2f 0a 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  */..    pList = 
15840 66 74 73 35 50 65 6e 64 69 6e 67 4c 69 73 74 28  fts5PendingList(
15850 70 2c 20 69 48 61 73 68 29 3b 0a 20 20 20 20 61  p, iHash);.    a
15860 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
15870 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  || p->rc!=SQLITE
15880 5f 4f 4b 20 29 3b 0a 20 20 20 20 66 74 73 35 57  _OK );.    fts5W
15890 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
158a0 74 65 72 2c 20 69 48 61 73 68 2c 20 69 53 65 67  ter, iHash, iSeg
158b0 69 64 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70 49  id);..    for(pI
158c0 74 65 72 3d 70 4c 69 73 74 3b 20 70 49 74 65 72  ter=pList; pIter
158d0 3b 20 70 49 74 65 72 3d 70 4e 65 78 74 29 7b 0a  ; pIter=pNext){.
158e0 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49        pNext = pI
158f0 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ter->pNext;.    
15900 20 20 66 74 73 35 57 72 69 74 65 50 65 6e 64 69    fts5WritePendi
15910 6e 67 44 6f 63 6c 69 73 74 28 70 2c 20 26 77 72  ngDoclist(p, &wr
15920 69 74 65 72 2c 20 70 49 74 65 72 29 3b 0a 20 20  iter, pIter);.  
15930 20 20 20 20 66 74 73 35 46 72 65 65 50 65 6e 64      fts5FreePend
15940 69 6e 67 44 6f 63 6c 69 73 74 28 70 49 74 65 72  ingDoclist(pIter
15950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
15960 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20  5WriteFinish(p, 
15970 26 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67 68  &writer, &nHeigh
15980 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  t, &pgnoLast);..
15990 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 65 20      /* Edit the 
159a0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 61 6e  Fts5Structure an
159b0 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
159c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
159d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72   */.    if( pStr
159e0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29  uct->nLevel==0 )
159f0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
15a00 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 20 3d   = 1;.    pSeg =
15a10 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
15a20 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75  l[0].aSeg[ pStru
15a30 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53  ct->aLevel[0].nS
15a40 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 70 53 65 67  eg++ ];.    pSeg
15a50 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
15a60 64 3b 0a 20 20 20 20 70 53 65 67 2d 3e 6e 48 65  d;.    pSeg->nHe
15a70 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b 0a  ight = nHeight;.
15a80 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
15a90 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65  rst = 1;.    pSe
15aa0 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67  g->pgnoLast = pg
15ab0 6e 6f 4c 61 73 74 3b 0a 20 20 7d 0a 0a 20 20 66  noLast;.  }..  f
15ac0 74 73 35 49 6e 64 65 78 57 6f 72 6b 28 70 2c 20  ts5IndexWork(p, 
15ad0 69 48 61 73 68 2c 20 70 53 74 72 75 63 74 2c 20  iHash, pStruct, 
15ae0 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73  pgnoLast);.  fts
15af0 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
15b00 70 2c 20 69 48 61 73 68 2c 20 70 53 74 72 75 63  p, iHash, pStruc
15b10 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
15b20 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
15b30 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ct);.}../*.** In
15b40 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20  dicate that all 
15b50 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
15b60 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
15b70 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72 74  ndexWrite() pert
15b80 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f  ain.** to the do
15b90 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69  cument with rowi
15ba0 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69  d iRowid..*/.voi
15bb0 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  d sqlite3Fts5Ind
15bc0 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73  exBeginWrite(Fts
15bd0 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
15be0 52 6f 77 69 64 29 7b 0a 20 20 69 66 28 20 69 52  Rowid){.  if( iR
15bf0 6f 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52  owid<=p->iWriteR
15c00 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  owid ){.    sqli
15c10 74 65 33 46 74 73 35 49 6e 64 65 78 46 6c 75 73  te3Fts5IndexFlus
15c20 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  h(p);.  }.  p->i
15c30 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52 6f  WriteRowid = iRo
15c40 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  wid;.}../*.** Fl
15c50 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
15c60 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
15c70 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
15c80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15c90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15ca0 33 46 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28  3Fts5IndexFlush(
15cb0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
15cc0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
15cd0 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
15ce0 67 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  g;.  int i;     
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
15d10 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
15d20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74  indexes */.  int
15d30 20 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20   nLeaf = 0;     
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d50 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
15d60 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f   written */..  /
15d70 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
15d80 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65  s already occure
15d90 64 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  d this call is a
15da0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
15db0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
15dc0 4b 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  K || p->nPending
15dd0 44 61 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  Data==0 ) return
15de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
15df0 48 61 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c  Hash );..  /* Fl
15e00 75 73 68 20 74 68 65 20 74 65 72 6d 73 20 61 6e  ush the terms an
15e10 64 20 65 61 63 68 20 70 72 65 66 69 78 20 69 6e  d each prefix in
15e20 64 65 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  dex to disk */. 
15e30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f   for(i=0; i<=pCo
15e40 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
15e50 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 46 6c 75  ++){.    fts5Flu
15e60 73 68 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c 20  shOneHash(p, i, 
15e70 26 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70  &nLeaf);.  }.  p
15e80 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
15e90 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   0;.}../*.** Com
15ea0 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b  mit data to disk
15eb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15ec0 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74  Fts5IndexSync(Ft
15ed0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73  s5Index *p){.  s
15ee0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 46  qlite3Fts5IndexF
15ef0 6c 75 73 68 28 70 29 3b 0a 20 20 66 74 73 35 43  lush(p);.  fts5C
15f00 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
15f10 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
15f20 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
15f30 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20  any data stored 
15f40 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
15f50 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f   hash tables. Do
15f60 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a   not write it.**
15f70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15f80 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
15f90 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
15fa0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
15fb0 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  %_data.** table 
15fc0 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65 64  may have changed
15fd0 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79   on disk. So any
15fe0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
15ff0 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20  s of %_data .** 
16000 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20  records must be 
16010 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
16020 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
16030 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73  ndexRollback(Fts
16040 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74  5Index *p){.  ft
16050 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29  s5CloseReader(p)
16060 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16070 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  E_OK;.}../*.** O
16080 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e  pen a new Fts5In
16090 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74  dex handle. If t
160a0 68 65 20 62 43 72 65 61 74 65 20 61 72 67 75 6d  he bCreate argum
160b0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72 65  ent is true, cre
160c0 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  ate.** and initi
160d0 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
160e0 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c  ying %_data tabl
160f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
16100 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20  essful, set *pp 
16110 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
16120 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  new object and r
16130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
16140 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
16150 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61  et *pp to NULL a
16160 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
16170 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
16180 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
16190 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46  s5IndexOpen(.  F
161a0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
161b0 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61  ig, .  int bCrea
161c0 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78  te, .  Fts5Index
161d0 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a   **pp,.  char **
161e0 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72  pzErr.){.  int r
161f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16200 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20   Fts5Index *p;  
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
16230 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28  /..  *pp = p = (
16240 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74  Fts5Index*)sqlit
16250 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
16260 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20  (Fts5Index));.  
16270 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
16280 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
16290 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
162a0 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29  zeof(Fts5Index))
162b0 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d  ;.  p->pConfig =
162c0 20 70 43 6f 6e 66 69 67 3b 0a 20 20 70 2d 3e 70   pConfig;.  p->p
162d0 67 73 7a 20 3d 20 31 30 30 30 3b 0a 20 20 70 2d  gsz = 1000;.  p-
162e0 3e 6e 4d 69 6e 4d 65 72 67 65 20 3d 20 46 54 53  >nMinMerge = FTS
162f0 35 5f 4d 49 4e 5f 4d 45 52 47 45 3b 0a 20 20 70  5_MIN_MERGE;.  p
16300 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54  ->nWorkUnit = FT
16310 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20  S5_WORK_UNIT;.  
16320 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
16330 74 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a  ta = 1024*1024;.
16340 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20    p->zDataTbl = 
16350 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16360 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66  "%s_data", pConf
16370 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ig->zName);.  if
16380 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d 30  ( p->zDataTbl==0
16390 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
163a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
163b0 73 65 20 69 66 28 20 62 43 72 65 61 74 65 20 29  se if( bCreate )
163c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
163d0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73   Fts5Structure s
163e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
163f0 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c  e3Fts5CreateTabl
16400 65 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66  e(.        pConf
16410 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20  ig, "data", "id 
16420 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
16430 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22  KEY, block BLOB"
16440 2c 20 70 7a 45 72 72 0a 20 20 20 20 29 3b 0a 20  , pzErr.    );. 
16450 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
16470 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
16480 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
16490 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
164a0 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50  0; i<pConfig->nP
164b0 72 65 66 69 78 2b 31 3b 20 69 2b 2b 29 7b 0a 20  refix+1; i++){. 
164c0 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
164d0 74 75 72 65 57 72 69 74 65 28 70 2c 20 69 2c 20  tureWrite(p, i, 
164e0 26 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  &s);.      }.   
164f0 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20     rc = p->rc;. 
16500 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16510 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72  Fts5IndexSetAver
16520 61 67 65 73 28 70 2c 20 28 63 6f 6e 73 74 20 75  ages(p, (const u
16530 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a  8*)"", 0);.  }..
16540 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
16550 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
16560 43 6c 6f 73 65 28 70 2c 20 30 29 3b 0a 20 20 20  Close(p, 0);.   
16570 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
16580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16590 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64  .** Close a hand
165a0 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  le opened by an 
165b0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
165c0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
165d0 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Open()..*/.int s
165e0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
165f0 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lose(Fts5Index *
16600 70 2c 20 69 6e 74 20 62 44 65 73 74 72 6f 79 29  p, int bDestroy)
16610 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16620 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 62 44  ITE_OK;.  if( bD
16630 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 72 63  estroy ){.    rc
16640 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 44 72   = sqlite3Fts5Dr
16650 6f 70 54 61 62 6c 65 28 70 2d 3e 70 43 6f 6e 66  opTable(p->pConf
16660 69 67 2c 20 22 64 61 74 61 22 29 3b 0a 20 20 7d  ig, "data");.  }
16670 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52  .  assert( p->pR
16680 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 73 71  eader==0 );.  sq
16690 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
166a0 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71  ->pWriter);.  sq
166b0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
166c0 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 73  ->pDeleter);.  s
166d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
166e0 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 33  Hash);.  sqlite3
166f0 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62  _free(p->zDataTb
16700 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
16710 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
16720 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
16730 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65  urn a simple che
16740 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65  cksum value base
16750 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  d on the argumen
16760 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36  ts..*/.static u6
16770 34 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  4 fts5IndexEntry
16780 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f  Cksum(.  i64 iRo
16790 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c  wid, .  int iCol
167a0 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a  , .  int iPos, .
167b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
167c0 65 72 6d 2c 20 0a 20 20 69 6e 74 20 6e 54 65 72  erm, .  int nTer
167d0 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  m.){.  int i;.  
167e0 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69 64  u64 ret = iRowid
167f0 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
16800 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65  <3) + iCol;.  re
16810 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
16820 69 50 6f 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  iPos;.  for(i=0;
16830 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
16840 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
16850 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74   pTerm[i];.  ret
16860 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
16870 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20  * Calculate and 
16880 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
16890 6d 20 74 68 61 74 20 69 73 20 74 68 65 20 58 4f  m that is the XO
168a0 52 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  R of the index e
168b0 6e 74 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d  ntry.** checksum
168c0 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
168d0 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 67 65  that would be ge
168e0 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 74  nerated by the t
168f0 6f 6b 65 6e 20 73 70 65 63 69 66 69 65 64 0a 2a  oken specified.*
16900 2a 20 62 79 20 74 68 65 20 66 69 6e 61 6c 20 35  * by the final 5
16910 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
16920 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
16930 64 65 78 43 6b 73 75 6d 28 0a 20 20 46 74 73 35  dexCksum(.  Fts5
16940 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
16950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16960 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
16970 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ect */.  i64 iRo
16980 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
16990 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 75           /* Docu
169a0 6d 65 6e 74 20 74 65 72 6d 20 61 70 70 65 61 72  ment term appear
169b0 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  s in */.  int iC
169c0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
169d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
169e0 75 6d 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73  umn term appears
169f0 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f   in */.  int iPo
16a00 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
16a10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
16a20 74 69 6f 6e 20 74 65 72 6d 20 61 70 70 65 61 72  tion term appear
16a30 73 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  s in */.  const 
16a40 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74  char *pTerm, int
16a50 20 6e 54 65 72 6d 20 20 20 20 2f 2a 20 54 65 72   nTerm    /* Ter
16a60 6d 20 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a  m at iPos */.){.
16a70 20 20 75 36 34 20 72 65 74 20 3d 20 30 3b 20 20    u64 ret = 0;  
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
16aa0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  e */.  int iIdx;
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
16ad0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
16ae0 69 6e 64 65 78 65 73 20 2a 2f 0a 0a 20 20 66 6f  indexes */..  fo
16af0 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 3d  r(iIdx=0; iIdx<=
16b00 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
16b10 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69  ; iIdx++){.    i
16b20 6e 74 20 6e 20 3d 20 28 28 69 49 64 78 3d 3d 70  nt n = ((iIdx==p
16b30 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 29  Config->nPrefix)
16b40 20 3f 20 6e 54 65 72 6d 20 3a 20 70 43 6f 6e 66   ? nTerm : pConf
16b50 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78  ig->aPrefix[iIdx
16b60 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 6e  ]);.    if( n<=n
16b70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  Term ){.      re
16b80 74 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  t ^= fts5IndexEn
16b90 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
16ba0 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 65   iCol, iPos, pTe
16bb0 72 6d 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  rm, n);.    }.  
16bc0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  }..  return ret;
16bd0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16be0 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69  fts5BtreeIterIni
16bf0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
16c00 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a  p, .  int iIdx,.
16c10 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
16c20 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 0a 20  egment *pSeg, . 
16c30 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a   Fts5BtreeIter *
16c40 70 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74 20 6e  pIter.){.  int n
16c50 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
16c60 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
16c70 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 29 20  pIter->aLvl[0]) 
16c80 2a 20 28 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  * (pSeg->nHeight
16c90 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  -1);.  memset(pI
16ca0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
16cb0 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
16cc0 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d 3e 6e  ->nLvl = pSeg->n
16cd0 48 65 69 67 68 74 2d 31 3b 0a 20 20 70 49 74 65  Height-1;.  pIte
16ce0 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
16cf0 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a    pIter->p = p;.
16d00 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
16d10 70 53 65 67 3b 0a 20 20 69 66 28 20 6e 42 79 74  pSeg;.  if( nByt
16d20 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  e && p->rc==SQLI
16d30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74  TE_OK ){.    pIt
16d40 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74 73 35  er->aLvl = (Fts5
16d50 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 2a 29  BtreeIterLevel*)
16d60 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
16d70 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 66   nByte);.  }.  f
16d80 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
16d90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49  QLITE_OK && i<pI
16da0 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
16db0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
16dc0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
16dd0 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d  OWID(iIdx, pSeg-
16de0 3e 69 53 65 67 69 64 2c 20 69 2b 31 2c 20 31 29  >iSegid, i+1, 1)
16df0 3b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  ;.    Fts5Data *
16e00 70 44 61 74 61 3b 0a 20 20 20 20 70 49 74 65 72  pData;.    pIter
16e10 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 20  ->aLvl[i].pData 
16e20 3d 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  = pData = fts5Da
16e30 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64  taRead(p, iRowid
16e40 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  );.    if( pData
16e50 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f   ){.      fts5No
16e60 64 65 49 74 65 72 49 6e 69 74 28 70 44 61 74 61  deIterInit(pData
16e70 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26  ->p, pData->n, &
16e80 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73  pIter->aLvl[i].s
16e90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
16ea0 69 66 28 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d  if( pIter->nLvl=
16eb0 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20  =0 || p->rc ){. 
16ec0 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
16ed0 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   1;.    pIter->i
16ee0 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
16ef0 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  oLast;.  }else{.
16f00 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74      pIter->nEmpt
16f10 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  y = pIter->aLvl[
16f20 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 20  0].s.nEmpty;.   
16f30 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
16f40 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
16f50 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 70 49 74  .iChild;.    pIt
16f60 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74  er->bDlidx = pIt
16f70 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44  er->aLvl[0].s.bD
16f80 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  lidx;.  }.}..sta
16f90 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
16fa0 65 65 49 74 65 72 4e 65 78 74 28 46 74 73 35 42  eeIterNext(Fts5B
16fb0 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29  treeIter *pIter)
16fc0 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
16fd0 20 3d 20 70 49 74 65 72 2d 3e 70 3b 0a 20 20 69   = pIter->p;.  i
16fe0 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
16ff0 20 70 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20   pIter->bEof==0 
17000 26 26 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  && pIter->aLvl[0
17010 5d 2e 73 2e 61 44 61 74 61 20 29 3b 0a 20 20 66  ].s.aData );.  f
17020 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
17030 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e 72 63 3d 3d  >nLvl && p->rc==
17040 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
17050 0a 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74  .    Fts5BtreeIt
17060 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  erLevel *pLvl = 
17070 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
17080 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
17090 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 70  rNext(&p->rc, &p
170a0 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28  Lvl->s);.    if(
170b0 20 70 4c 76 6c 2d 3e 73 2e 61 44 61 74 61 20 29   pLvl->s.aData )
170c0 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
170d0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
170e0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c  Iter->term, pLvl
170f0 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c  ->s.term.n, pLvl
17100 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20  ->s.term.p);.   
17110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
17120 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4e  lse{.      fts5N
17130 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
17140 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20 66 74 73  l->s);.      fts
17150 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
17160 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
17170 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30   pLvl->pData = 0
17180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
17190 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c  ( i==pIter->nLvl
171a0 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20   || p->rc ){.   
171b0 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
171c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
171d0 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65  nt iSegid = pIte
171e0 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  r->pSeg->iSegid;
171f0 0a 20 20 20 20 66 6f 72 28 69 2d 2d 3b 20 69 3e  .    for(i--; i>
17200 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
17210 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
17220 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  el *pLvl = &pIte
17230 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  r->aLvl[i];.    
17240 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
17250 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
17260 44 28 70 49 74 65 72 2d 3e 69 49 64 78 2c 69 53  D(pIter->iIdx,iS
17270 65 67 69 64 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d  egid,i+1,pLvl[1]
17280 2e 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  .s.iChild);.    
17290 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
172a0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
172b0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
172c0 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
172d0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f  {.        fts5No
172e0 64 65 49 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d  deIterInit(pLvl-
172f0 3e 70 44 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d  >pData->p, pLvl-
17300 3e 70 44 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c  >pData->n, &pLvl
17310 2d 3e 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ->s);.      }.  
17320 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72    }.  }..  pIter
17330 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72  ->nEmpty = pIter
17340 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70  ->aLvl[0].s.nEmp
17350 74 79 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c  ty;.  pIter->bDl
17360 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  idx = pIter->aLv
17370 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20  l[0].s.bDlidx;. 
17380 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
17390 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
173a0 2e 69 43 68 69 6c 64 3b 0a 20 20 61 73 73 65 72  .iChild;.  asser
173b0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
173c0 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45  _OK || pIter->bE
173d0 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  of );.}..static 
173e0 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74  void fts5BtreeIt
173f0 65 72 46 72 65 65 28 46 74 73 35 42 74 72 65 65  erFree(Fts5Btree
17400 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
17410 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
17420 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
17430 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42   i++){.    Fts5B
17440 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70  treeIterLevel *p
17450 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
17460 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e  vl[i];.    fts5N
17470 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
17480 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70  l->s);.    if( p
17490 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
174a0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
174b0 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
174c0 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
174d0 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ata = 0;.    }. 
174e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
174f0 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a  e(pIter->aLvl);.
17500 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
17510 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
17520 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
17530 74 20 44 6f 63 6c 69 73 74 49 64 78 49 74 65 72  t DoclistIdxIter
17540 20 44 6f 63 6c 69 73 74 49 64 78 49 74 65 72 3b   DoclistIdxIter;
17550 0a 73 74 72 75 63 74 20 44 6f 63 6c 69 73 74 49  .struct DoclistI
17560 64 78 49 74 65 72 20 7b 0a 20 20 46 74 73 35 44  dxIter {.  Fts5D
17570 61 74 61 20 2a 70 44 6c 69 64 78 3b 20 20 20 20  ata *pDlidx;    
17580 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17590 20 66 6f 72 20 64 6f 63 6c 69 73 74 20 69 6e 64   for doclist ind
175a0 65 78 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ex, if any */.  
175b0 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
175d0 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   Current offset 
175e0 69 6e 74 6f 20 70 44 6c 69 64 78 20 2a 2f 0a 20  into pDlidx */. 
175f0 20 69 6e 74 20 62 52 6f 77 69 64 56 61 6c 69 64   int bRowidValid
17600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17610 2a 20 69 52 6f 77 69 64 20 69 73 20 76 61 6c 69  * iRowid is vali
17620 64 20 2a 2f 0a 0a 20 20 69 6e 74 20 62 5a 65 72  d */..  int bZer
17630 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
17640 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
17650 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 68 61   current leaf ha
17660 73 20 6e 6f 20 72 6f 77 69 64 20 2a 2f 0a 20 20  s no rowid */.  
17670 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17690 20 49 66 20 62 5a 65 72 6f 3d 3d 30 2c 20 66 69   If bZero==0, fi
176a0 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61  rst rowid on lea
176b0 66 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  f */.};../*.** R
176c0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
176d0 66 20 45 4f 46 20 69 73 20 72 65 61 63 68 65 64  f EOF is reached
176e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
176f0 66 74 73 35 49 6e 64 65 78 44 6f 63 6c 69 73 74  fts5IndexDoclist
17700 49 74 65 72 4e 65 78 74 28 44 6f 63 6c 69 73 74  IterNext(Doclist
17710 49 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  IdxIter *pIter){
17720 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 69  .  i64 iVal;.  i
17730 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d  f( pIter->iOff>=
17740 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 2d 3e 6e  pIter->pDlidx->n
17750 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
17760 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65  Iter->iOff += ge
17770 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e  tVarint(&pIter->
17780 70 44 6c 69 64 78 2d 3e 70 5b 70 49 74 65 72 2d  pDlidx->p[pIter-
17790 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  >iOff], (u64*)&i
177a0 56 61 6c 29 3b 0a 20 20 69 66 28 20 69 56 61 6c  Val);.  if( iVal
177b0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ==0 ){.    pIter
177c0 2d 3e 62 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 7d  ->bZero = 1;.  }
177d0 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
177e0 3e 62 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20  >bZero = 0;.    
177f0 69 66 28 20 70 49 74 65 72 2d 3e 62 52 6f 77 69  if( pIter->bRowi
17800 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  dValid ){.      
17810 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
17820 20 69 56 61 6c 3b 0a 20 20 20 20 7d 65 6c 73 65   iVal;.    }else
17830 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  {.      pIter->b
17840 52 6f 77 69 64 56 61 6c 69 64 20 3d 20 31 3b 0a  RowidValid = 1;.
17850 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
17860 77 69 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20  wid = iVal;.    
17870 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
17880 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
17890 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
178a0 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28  ityCheckSegment(
178b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
178e0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
178f0 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17910 2a 20 49 6e 64 65 78 20 74 68 61 74 20 70 53 65  * Index that pSe
17920 67 20 69 73 20 61 20 70 61 72 74 20 6f 66 20 2a  g is a part of *
17930 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
17940 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20  eSegment *pSeg  
17950 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
17960 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c  o check internal
17970 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a   consistency */.
17980 29 7b 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  ){.  Fts5BtreeIt
17990 65 72 20 69 74 65 72 3b 20 20 20 20 20 20 20 20  er iter;        
179a0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
179b0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
179c0 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
179d0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74   */..  /* Iterat
179e0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 62 2d  e through the b-
179f0 74 72 65 65 20 68 69 65 72 61 72 63 68 79 2e 20  tree hierarchy. 
17a00 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 42 74   */.  for(fts5Bt
17a10 72 65 65 49 74 65 72 49 6e 69 74 28 70 2c 20 69  reeIterInit(p, i
17a20 49 64 78 2c 20 70 53 65 67 2c 20 26 69 74 65 72  Idx, pSeg, &iter
17a30 29 3b 0a 20 20 20 20 20 20 69 74 65 72 2e 62 45  );.      iter.bE
17a40 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  of==0;.      fts
17a50 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28 26  5BtreeIterNext(&
17a60 69 74 65 72 29 0a 20 20 29 7b 0a 20 20 20 20 69  iter).  ){.    i
17a70 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20  64 iRow;        
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17a90 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c  Rowid for this l
17aa0 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  eaf */.    Fts5D
17ab0 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
17ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17ad0 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
17ae0 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20  /.    int iOff; 
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
17b10 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c   first term on l
17b20 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  eaf */.    int i
17b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17b40 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
17b50 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
17b60 75 67 68 20 65 6d 70 74 79 20 6c 65 61 76 65 73  ugh empty leaves
17b70 20 2a 2f 0a 20 20 20 20 44 6f 63 6c 69 73 74 49   */.    DoclistI
17b80 64 78 49 74 65 72 20 64 6c 69 74 65 72 3b 20 20  dxIter dliter;  
17b90 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
17ba0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
17bb0 6e 79 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  ny doclist index
17bc0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   */..    /* If t
17bd0 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74  he leaf in quest
17be0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
17bf0 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f  been trimmed fro
17c00 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a  m the segment, .
17c10 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68      ** ignore th
17c20 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e  is b-tree entry.
17c30 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64   Otherwise, load
17c40 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e   it into memory.
17c50 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72   */.    if( iter
17c60 2e 69 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e  .iLeaf<pSeg->pgn
17c70 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75  oFirst ) continu
17c80 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54  e;.    iRow = FT
17c90 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
17ca0 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65  (iIdx, pSeg->iSe
17cb0 67 69 64 2c 20 30 2c 20 69 74 65 72 2e 69 4c 65  gid, 0, iter.iLe
17cc0 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d  af);.    pLeaf =
17cd0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
17ce0 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20   iRow);.    if( 
17cf0 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
17d00 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
17d10 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f  that the leaf co
17d20 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
17d30 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68  one term, and th
17d40 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20  at it is equal. 
17d50 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67     ** to or larg
17d60 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69  er than the spli
17d70 74 2d 6b 65 79 20 69 6e 20 69 74 65 72 2e 74 65  t-key in iter.te
17d80 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 4f 66 66  rm.  */.    iOff
17d90 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
17da0 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20  Leaf->p[2]);.   
17db0 20 69 66 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a   if( iOff==0 ){.
17dc0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
17dd0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
17de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
17df0 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
17e00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
17e10 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66   of term on leaf
17e20 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
17e30 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20     int res;     
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e50 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  * Comparison of 
17e60 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b  term and split-k
17e70 65 79 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66  ey */.      iOff
17e80 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
17e90 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
17ea0 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 72   nTerm);.      r
17eb0 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65  es = memcmp(&pLe
17ec0 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 69 74 65  af->p[iOff], ite
17ed0 72 2e 74 65 72 6d 2e 70 2c 20 4d 49 4e 28 6e 54  r.term.p, MIN(nT
17ee0 65 72 6d 2c 20 69 74 65 72 2e 74 65 72 6d 2e 6e  erm, iter.term.n
17ef0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  ));.      if( re
17f00 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54 65  s==0 ) res = nTe
17f10 72 6d 20 2d 20 69 74 65 72 2e 74 65 72 6d 2e 6e  rm - iter.term.n
17f20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ;.      if( res<
17f30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
17f40 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
17f50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
17f60 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
17f70 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
17f80 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
17f90 61 6b 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  ak;..    memset(
17fa0 26 64 6c 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &dliter, 0, size
17fb0 6f 66 28 44 6f 63 6c 69 73 74 49 64 78 49 74 65  of(DoclistIdxIte
17fc0 72 29 29 3b 0a 20 20 20 20 69 66 28 20 69 74 65  r));.    if( ite
17fd0 72 2e 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  r.bDlidx ){.    
17fe0 20 20 69 36 34 20 69 44 6c 69 64 78 52 6f 77 69    i64 iDlidxRowi
17ff0 64 20 3d 20 46 54 53 35 5f 44 4f 43 4c 49 53 54  d = FTS5_DOCLIST
18000 5f 49 44 58 5f 52 4f 57 49 44 28 69 49 64 78 2c  _IDX_ROWID(iIdx,
18010 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69   pSeg->iSegid, i
18020 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
18030 20 20 64 6c 69 74 65 72 2e 70 44 6c 69 64 78 20    dliter.pDlidx 
18040 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
18050 2c 20 69 44 6c 69 64 78 52 6f 77 69 64 29 3b 0a  , iDlidxRowid);.
18060 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f      }..    /* No
18070 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
18080 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61   iter.nEmpty lea
18090 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ves following th
180a0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20  e current leaf. 
180b0 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20     ** (a) exist 
180c0 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
180d0 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20  no terms. */.   
180e0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 69 74 65   for(i=1; i<=ite
180f0 72 2e 6e 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a  r.nEmpty; i++){.
18100 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
18110 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
18120 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28  ow+i);.      if(
18130 20 70 4c 65 61 66 20 26 26 20 30 21 3d 66 74 73   pLeaf && 0!=fts
18140 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
18150 70 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  p[2]) ){.       
18160 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
18170 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
18180 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 26       if( pLeaf &
18190 26 20 64 6c 69 74 65 72 2e 70 44 6c 69 64 78 20  & dliter.pDlidx 
181a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
181b0 74 73 35 49 6e 64 65 78 44 6f 63 6c 69 73 74 49  ts5IndexDoclistI
181c0 74 65 72 4e 65 78 74 28 26 64 6c 69 74 65 72 29  terNext(&dliter)
181d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
181e0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
181f0 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
18200 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
18210 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
18220 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
18230 70 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  p[0]);.         
18240 20 69 66 28 20 64 6c 69 74 65 72 2e 62 5a 65 72   if( dliter.bZer
18250 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  o ){.           
18260 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d   if( iRowidOff!=
18270 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
18280 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
18290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
182a0 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69         i64 iRowi
182b0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  d;.            g
182c0 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
182d0 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28  >p[iRowidOff], (
182e0 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
182f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
18300 52 6f 77 69 64 21 3d 64 6c 69 74 65 72 2e 69 52  Rowid!=dliter.iR
18310 6f 77 69 64 20 29 20 70 2d 3e 72 63 20 3d 20 46  owid ) p->rc = F
18320 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
18330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18340 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18350 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
18360 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a  (pLeaf);.    }..
18370 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 61 79      /* There may
18380 20 28 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 29   (or may not be)
18390 20 61 20 66 69 6e 61 6c 20 65 6e 74 72 79 20 69   a final entry i
183a0 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54  n the doclist. T
183b0 68 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20  he entry.    ** 
183c0 69 73 20 6f 6e 6c 79 20 70 72 65 73 65 6e 74 20  is only present 
183d0 69 66 20 74 68 65 20 70 61 67 65 20 66 6f 6c 6c  if the page foll
183e0 6f 77 69 6e 67 20 74 68 65 20 6e 45 6d 70 74 79  owing the nEmpty
183f0 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 73 0a   termless pages.
18400 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74      ** (a) exist
18410 73 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  s and (b) contai
18420 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
18430 72 6f 77 69 64 20 74 68 61 74 20 69 73 20 70 61  rowid that is pa
18440 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  rt of.    ** the
18450 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20   doclist.  */.  
18460 20 20 69 66 28 20 64 6c 69 74 65 72 2e 70 44 6c    if( dliter.pDl
18470 69 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  idx ){.      if(
18480 20 28 69 74 65 72 2e 69 4c 65 61 66 20 2b 20 69   (iter.iLeaf + i
18490 74 65 72 2e 6e 45 6d 70 74 79 29 3d 3d 70 53 65  ter.nEmpty)==pSe
184a0 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
184b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
184c0 78 74 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  xt page does not
184d0 20 65 78 69 73 74 2e 20 53 6f 20 74 68 65 20 69   exist. So the i
184e0 74 65 72 61 74 6f 72 20 73 68 6f 75 6c 64 20 62  terator should b
184f0 65 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20 20  e at EOF. */.   
18500 20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64       if( fts5Ind
18510 65 78 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  exDoclistIterNex
18520 74 28 26 64 6c 69 74 65 72 29 3d 3d 30 20 29 20  t(&dliter)==0 ) 
18530 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
18540 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
18550 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44  e{.        Fts5D
18560 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73  ata *pLeaf = fts
18570 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f  5DataRead(p, iRo
18580 77 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w+i);.        if
18590 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
185a0 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
185b0 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
185c0 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
185d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
185e0 77 69 64 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  widOff==0 ){.   
185f0 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
18600 35 49 6e 64 65 78 44 6f 63 6c 69 73 74 49 74 65  5IndexDoclistIte
18610 72 4e 65 78 74 28 26 64 6c 69 74 65 72 29 3d 3d  rNext(&dliter)==
18620 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
18630 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
18640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18650 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49         if( fts5I
18660 6e 64 65 78 44 6f 63 6c 69 73 74 49 74 65 72 4e  ndexDoclistIterN
18670 65 78 74 28 26 64 6c 69 74 65 72 29 20 29 7b 0a  ext(&dliter) ){.
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
18690 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
186a0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
186b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
186c0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
186d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
186e0 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
186f0 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28  >p[iRowidOff], (
18700 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
18720 20 69 52 6f 77 69 64 21 3d 64 6c 69 74 65 72 2e   iRowid!=dliter.
18730 69 52 6f 77 69 64 20 29 20 70 2d 3e 72 63 20 3d  iRowid ) p->rc =
18740 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
18750 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
18760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18770 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
18780 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
18790 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
187a0 20 7d 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61   }..    fts5Data
187b0 52 65 6c 65 61 73 65 28 64 6c 69 74 65 72 2e 70  Release(dliter.p
187c0 44 6c 69 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 69  Dlidx);.  }..  i
187d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
187e0 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69 4c 65 61  _OK && iter.iLea
187f0 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  f!=pSeg->pgnoLas
18800 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  t ){.    p->rc =
18810 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
18820 20 7d 0a 0a 20 20 66 74 73 35 42 74 72 65 65 49   }..  fts5BtreeI
18830 74 65 72 46 72 65 65 28 26 69 74 65 72 29 3b 0a  terFree(&iter);.
18840 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74  }../*.** Run int
18850 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20  ernal checks to 
18860 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
18870 46 54 53 20 69 6e 64 65 78 20 28 61 29 20 69 73  FTS index (a) is
18880 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20   internally .** 
18890 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28  consistent and (
188a0 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  b) contains entr
188b0 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  ies for which th
188c0 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65  e XOR of the che
188d0 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c  cksums.** as cal
188e0 63 75 6c 61 74 65 64 20 62 79 20 66 74 73 35 49  culated by fts5I
188f0 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29  ndexEntryCksum()
18900 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a   is cksum..**.**
18910 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
18920 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66  ORRUPT if any of
18930 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68   the internal ch
18940 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66  ecks fail, or if
18950 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
18960 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e   does not match.
18970 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18980 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20  K if all checks 
18990 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  pass without.** 
189a0 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f  error, or some o
189b0 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f  ther SQLite erro
189c0 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65  r code if anothe
189d0 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f  r error (e.g. OO
189e0 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  M).** occurs..*/
189f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
18a00 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
18a10 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70  eck(Fts5Index *p
18a20 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20  , u64 cksum){.  
18a30 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
18a40 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
18a50 3b 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20  ;.  int iIdx;   
18a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a70 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
18a80 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69  terate through i
18a90 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndexes */.  int 
18aa0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18ac0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18ad0 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20  u64 cksum2 = 0; 
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18af0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
18b00 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66  d on contents of
18b10 20 69 6e 64 65 78 65 73 20 2a 2f 0a 0a 20 20 2f   indexes */..  /
18b20 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
18b30 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
18b40 20 69 6e 64 65 78 20 6d 61 74 63 68 65 73 20 74   index matches t
18b50 68 65 20 61 72 67 75 6d 65 6e 74 20 63 68 65 63  he argument chec
18b60 6b 73 75 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 49  ksum */.  for(iI
18b70 64 78 3d 30 3b 20 69 49 64 78 3c 3d 70 43 6f 6e  dx=0; iIdx<=pCon
18b80 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
18b90 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 4d  dx++){.    Fts5M
18ba0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
18bb0 65 72 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  er;.    Fts5Stru
18bc0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
18bd0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
18be0 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20  ad(p, iIdx);.   
18bf0 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
18c00 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
18c10 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c  , iIdx, 0, 0, 0,
18c20 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b   -1, 0, &pIter);
18c30 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
18c40 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
18c50 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
18c60 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
18c70 74 28 70 2c 20 70 49 74 65 72 29 0a 20 20 20 20  t(p, pIter).    
18c80 29 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73  ){.      Fts5Pos
18c90 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20  Iter sPos;      
18ca0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
18cb0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
18cc0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
18cd0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  .      int n;   
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
18d00 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
18d10 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
18d20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
18d30 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
18d40 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
18d50 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
18d60 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29  rTerm(pIter, &n)
18d70 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73  ;..      for(fts
18d80 35 50 6f 73 49 74 65 72 49 6e 69 74 28 70 2c 20  5PosIterInit(p, 
18d90 70 49 74 65 72 2c 20 26 73 50 6f 73 29 3b 0a 20  pIter, &sPos);. 
18da0 20 20 20 20 20 20 20 20 20 66 74 73 35 50 6f 73           fts5Pos
18db0 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73  IterEof(p, &sPos
18dc0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
18dd0 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28  fts5PosIterNext(
18de0 70 2c 20 26 73 50 6f 73 29 0a 20 20 20 20 20 20  p, &sPos).      
18df0 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  ){.        cksum
18e00 32 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  2 ^= fts5IndexEn
18e10 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
18e20 20 73 50 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f 73   sPos.iCol, sPos
18e30 2e 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 23 69  .iPos, z, n);.#i
18e40 66 20 30 0a 20 20 20 20 20 20 20 20 66 70 72 69  f 0.        fpri
18e50 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72 6f 77  ntf(stdout, "row
18e60 69 64 3d 25 64 20 22 2c 20 28 69 6e 74 29 69 52  id=%d ", (int)iR
18e70 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
18e80 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
18e90 74 65 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e 2c 20  term=%.*s ", n, 
18ea0 7a 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  z);.        fpri
18eb0 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 63 6f 6c  ntf(stdout, "col
18ec0 3d 25 64 20 22 2c 20 73 50 6f 73 2e 69 43 6f 6c  =%d ", sPos.iCol
18ed0 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
18ee0 74 66 28 73 74 64 6f 75 74 2c 20 22 6f 66 66 3d  tf(stdout, "off=
18ef0 25 64 5c 6e 22 2c 20 73 50 6f 73 2e 69 50 6f 73  %d\n", sPos.iPos
18f00 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
18f10 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69  h(stdout);.#endi
18f20 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  f.      }.    }.
18f30 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
18f40 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b  rFree(p, pIter);
18f50 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
18f60 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
18f70 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  t);.  }.  rc = p
18f80 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ->rc;.  if( rc==
18f90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
18fa0 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 72 63 20  um!=cksum2 ) rc 
18fb0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
18fc0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
18fd0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
18fe0 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d  des of each segm
18ff0 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65  ent match the le
19000 61 76 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 49  aves */.  for(iI
19010 64 78 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  dx=0; rc==SQLITE
19020 5f 4f 4b 20 26 26 20 69 49 64 78 3c 3d 70 43 6f  _OK && iIdx<=pCo
19030 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
19040 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  Idx++){.    Fts5
19050 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
19060 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
19070 72 65 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b  reRead(p, iIdx);
19080 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
19090 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
190a0 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
190b0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
190c0 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
190d0 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
190e0 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
190f0 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
19100 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
19110 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
19120 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
19130 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
19140 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
19150 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
19160 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ];.          fts
19170 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
19180 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 69  heckSegment(p, i
19190 49 64 78 2c 20 70 53 65 67 29 3b 0a 20 20 20 20  Idx, pSeg);.    
191a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
191b0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
191c0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
191d0 72 75 63 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ruct);.    rc = 
191e0 70 2d 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65  p->rc;.  }..  re
191f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19200 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
19210 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
19220 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19240 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
19250 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
19260 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
19270 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42  ,.  const u8 *pB
19280 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29  lob, int nBlob.)
19290 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192b0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
192c0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  de */.  int iLvl
192d0 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  , iSeg;         
192e0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
192f0 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
19300 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  s, segments */. 
19310 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
19320 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
19330 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75   /* Decoded stru
19340 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cture object */.
19350 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75  .  rc = fts5Stru
19360 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f  ctureDecode(pBlo
19370 62 2c 20 6e 42 6c 6f 62 2c 20 26 70 29 3b 0a 20  b, nBlob, &p);. 
19380 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19390 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
193a0 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
193b0 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4c 76 6c  .  }..  for(iLvl
193c0 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76  =0; iLvl<p->nLev
193d0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
193e0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
193f0 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e  vel *pLvl = &p->
19400 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
19410 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
19420 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
19430 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20  pRc, pBuf, .    
19440 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d      " {lvl=%d nM
19450 65 72 67 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20  erge=%d", iLvl, 
19460 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20  pLvl->nMerge.   
19470 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67   );.    for(iSeg
19480 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
19490 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
194a0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
194b0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
194c0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
194d0 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g];.      sqlite
194e0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
194f0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
19500 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20  f, .          " 
19510 7b 69 64 3d 25 64 20 68 3d 25 64 20 6c 65 61 76  {id=%d h=%d leav
19520 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65  es=%d..%d}", pSe
19530 67 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d  g->iSegid, pSeg-
19540 3e 6e 48 65 69 67 68 74 2c 20 0a 20 20 20 20 20  >nHeight, .     
19550 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
19560 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f  irst, pSeg->pgno
19570 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  Last.      );.  
19580 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
19590 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
195a0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
195b0 20 22 7d 22 29 3b 0a 20 20 7d 0a 0a 20 20 66 74   "}");.  }..  ft
195c0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
195d0 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  se(p);.}../*.** 
195e0 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74  Decode a segment
195f0 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d  -data rowid from
19600 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
19610 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
19620 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73   is.** the oppos
19630 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53  ite of macro FTS
19640 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
19650 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
19660 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69  d fts5DecodeRowi
19670 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  d(.  i64 iRowid,
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72       /* Rowid fr
196a0 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  om %_data table 
196b0 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 2c  */.  int *piIdx,
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6e 64       /* OUT: Ind
196e0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53  ex */.  int *piS
196f0 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
19700 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
19710 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
19720 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20  int *piHeight,  
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19740 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a  /* OUT: Height *
19750 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20  /.  int *piPgno 
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19770 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65      /* OUT: Page
19780 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
19790 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28  *piPgno = (int)(
197a0 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
197b0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50  1 << FTS5_DATA_P
197c0 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  AGE_B) - 1));.  
197d0 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
197e0 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20  DATA_PAGE_B;..  
197f0 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74  *piHeight = (int
19800 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
19810 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
19820 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29  _HEIGHT_B) - 1))
19830 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
19840 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
19850 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d  B;..  *piSegid =
19860 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
19870 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
19880 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29  _DATA_ID_B) - 1)
19890 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
198a0 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 3b 0a  FTS5_DATA_ID_B;.
198b0 0a 20 20 2a 70 69 49 64 78 20 3d 20 28 69 6e 74  .  *piIdx = (int
198c0 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
198d0 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
198e0 5f 49 44 58 5f 42 29 20 2d 20 31 29 29 3b 0a 7d  _IDX_B) - 1));.}
198f0 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28  ../*.** Buffer (
19900 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20  a/n) is assumed 
19910 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73  to contain a lis
19920 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20  t of serialized 
19930 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a  varints. Read.**
19940 20 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64   each varint and
19950 20 61 70 70 65 6e 64 20 69 74 73 20 73 74 72 69   append its stri
19960 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
19970 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  n to buffer pBuf
19980 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65  . Return.** afte
19990 72 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 70  r either the inp
199a0 75 74 20 62 75 66 66 65 72 20 69 73 20 65 78 68  ut buffer is exh
199b0 61 75 73 74 65 64 20 6f 72 20 61 20 30 20 76 61  austed or a 0 va
199c0 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  lue is read..**.
199d0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
199e0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
199f0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20  r of bytes read 
19a00 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
19a10 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
19a20 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50   int fts5DecodeP
19a30 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c  oslist(int *pRc,
19a40 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
19a50 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  f, const u8 *a, 
19a60 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f  int n){.  int iO
19a70 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ff = 0;.  while(
19a80 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
19a90 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66  nt iVal;.    iOf
19aa0 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
19ab0 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29  (&a[iOff], iVal)
19ac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
19ad0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
19ae0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
19af0 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d   %d", iVal);.  }
19b00 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
19b10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61  }../*.** The sta
19b20 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f  rt of buffer (a/
19b30 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  n) contains the 
19b40 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69  start of a docli
19b50 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a  st. The doclist.
19b60 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ** may or may no
19b70 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20  t finish within 
19b80 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73  the buffer. This
19b90 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
19ba0 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72  s a text.** repr
19bb0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
19bc0 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f  e part of the do
19bd0 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72  clist that is pr
19be0 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a  esent to buffer.
19bf0 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20  ** pBuf. .**.** 
19c00 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
19c10 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19c20 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
19c30 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
19c40 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
19c50 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  t fts5DecodeDocl
19c60 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
19c70 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
19c80 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
19c90 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69   n){.  i64 iDoci
19ca0 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  d;.  int iOff = 
19cb0 30 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e  0;..  if( iOff<n
19cc0 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20   ){.    iOff += 
19cd0 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
19ce0 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
19cf0 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73  )&iDocid);.    s
19d00 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
19d10 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
19d20 2c 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64 3d  , pBuf, " rowid=
19d30 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
19d40 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f 66    }.  while( iOf
19d50 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  f<n ){.    int n
19d60 50 6f 73 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Pos;.    iOff +=
19d70 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b   getVarint32(&a[
19d80 69 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20  iOff], nPos);.  
19d90 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65    iOff += fts5De
19da0 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c  codePoslist(pRc,
19db0 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c   pBuf, &a[iOff],
19dc0 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f   MIN(n-iOff, nPo
19dd0 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66  s));.    if( iOf
19de0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34  f<n ){.      i64
19df0 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
19e00 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
19e10 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
19e20 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
19e30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 65 6c  ;.      if( iDel
19e40 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  ta==0 ) return i
19e50 4f 66 66 3b 0a 20 20 20 20 20 20 69 44 6f 63 69  Off;.      iDoci
19e60 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d -= iDelta;.   
19e70 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
19e80 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
19e90 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 72 6f  (pRc, pBuf, " ro
19ea0 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69  wid=%lld", iDoci
19eb0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
19ec0 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a   return iOff;.}.
19ed0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
19ee0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65  mentation of use
19ef0 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
19f00 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64   function fts5_d
19f10 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
19f20 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
19f30 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  deFunction(.  sq
19f40 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
19f50 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
19f60 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
19f70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
19f80 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
19f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19fa0 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
19fb0 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
19fc0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
19fd0 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
19fe0 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
19ff0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  nts */.){.  i64 
1a000 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
1a010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a020 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20  owid for record 
1a030 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f  being decoded */
1a040 0a 20 20 69 6e 74 20 69 49 64 78 2c 69 53 65 67  .  int iIdx,iSeg
1a050 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f  id,iHeight,iPgno
1a060 3b 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70  ;  /* Rowid comp
1a070 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  enents */.  cons
1a080 74 20 75 38 20 2a 61 3b 20 69 6e 74 20 6e 3b 20  t u8 *a; int n; 
1a090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a0a0 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20  ecord to decode 
1a0b0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
1a0c0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1a0d0 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70       /* Build up
1a0e0 20 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20   text to return 
1a0f0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
1a100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1a110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1a120 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
1a130 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
1a140 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
1a150 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1a160 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  fer));.  iRowid 
1a170 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1a180 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b  int64(apVal[0]);
1a190 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
1a1a0 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c  alue_bytes(apVal
1a1b0 5b 31 5d 29 3b 0a 20 20 61 20 3d 20 73 71 6c 69  [1]);.  a = sqli
1a1c0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
1a1d0 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 66 74 73 35  pVal[1]);.  fts5
1a1e0 44 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77  DecodeRowid(iRow
1a1f0 69 64 2c 20 26 69 49 64 78 2c 20 26 69 53 65 67  id, &iIdx, &iSeg
1a200 69 64 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69  id, &iHeight, &i
1a210 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 48  Pgno);..  if( iH
1a220 65 69 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d  eight==FTS5_SEGM
1a230 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29  ENT_MAX_HEIGHT )
1a240 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
1a250 0a 20 20 20 20 69 36 34 20 69 50 72 65 76 3b 0a  .    i64 iPrev;.
1a260 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1a270 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
1a280 66 28 26 72 63 2c 20 26 73 2c 20 22 28 64 6c 69  f(&rc, &s, "(dli
1a290 64 78 20 69 64 78 3d 25 64 20 73 65 67 69 64 3d  dx idx=%d segid=
1a2a0 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20  %d pgno=%d)",.  
1a2b0 20 20 20 20 20 20 69 49 64 78 2c 20 69 53 65 67        iIdx, iSeg
1a2c0 69 64 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b  id, iPgno.    );
1a2d0 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  .    if( n>0 ){.
1a2e0 20 20 20 20 20 20 69 20 3d 20 67 65 74 56 61 72        i = getVar
1a2f0 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a  int(&a[i], (u64*
1a300 29 26 69 50 72 65 76 29 3b 0a 20 20 20 20 20 20  )&iPrev);.      
1a310 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1a320 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
1a330 63 2c 20 26 73 2c 20 22 20 25 6c 6c 64 22 2c 20  c, &s, " %lld", 
1a340 69 50 72 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20  iPrev);.    }.  
1a350 20 20 77 68 69 6c 65 28 20 69 3c 6e 20 29 7b 0a    while( i<n ){.
1a360 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a        i64 iVal;.
1a370 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61        i += getVa
1a380 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34  rint(&a[i], (u64
1a390 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  *)&iVal);.      
1a3a0 69 66 28 20 69 56 61 6c 3d 3d 30 20 29 7b 0a 20  if( iVal==0 ){. 
1a3b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1a3c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
1a3d0 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20  intf(&rc, &s, " 
1a3e0 78 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  x");.      }else
1a3f0 7b 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 20  {.        iPrev 
1a400 3d 20 69 50 72 65 76 20 2d 20 69 56 61 6c 3b 0a  = iPrev - iVal;.
1a410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1a420 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
1a430 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22  rintf(&rc, &s, "
1a440 20 25 6c 6c 64 22 2c 20 69 50 72 65 76 29 3b 0a   %lld", iPrev);.
1a450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1a460 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 69 53 65   }else.  if( iSe
1a470 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  gid==0 ){.    if
1a480 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41  ( iRowid==FTS5_A
1a490 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b  VERAGES_ROWID ){
1a4a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1a4b0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
1a4c0 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22 7b  intf(&rc, &s, "{
1a4d0 61 76 65 72 61 67 65 73 7d 20 22 29 3b 0a 20 20  averages} ");.  
1a4e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1a4f0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1a500 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
1a510 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20  , &s, .         
1a520 20 22 7b 73 74 72 75 63 74 75 72 65 20 69 64 78   "{structure idx
1a530 3d 25 64 7d 22 2c 20 28 69 6e 74 29 28 69 52 6f  =%d}", (int)(iRo
1a540 77 69 64 2d 31 30 29 0a 20 20 20 20 20 20 29 3b  wid-10).      );
1a550 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
1a560 65 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  eStructure(&rc, 
1a570 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d  &s, a, n);.    }
1a580 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 46  .  }else{..    F
1a590 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a  ts5Buffer term;.
1a5a0 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d      memset(&term
1a5b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1a5c0 42 75 66 66 65 72 29 29 3b 0a 20 20 20 20 73 71  Buffer));.    sq
1a5d0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1a5e0 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
1a5f0 20 26 73 2c 20 22 28 69 64 78 3d 25 64 20 73 65   &s, "(idx=%d se
1a600 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f  gid=%d h=%d pgno
1a610 3d 25 64 29 20 22 2c 0a 20 20 20 20 20 20 20 20  =%d) ",.        
1a620 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 48  iIdx, iSegid, iH
1a630 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20  eight, iPgno.   
1a640 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65   );..    if( iHe
1a650 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
1a660 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20   int iTermOff = 
1a670 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f  0;.      int iRo
1a680 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  widOff = 0;.    
1a690 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
1a6a0 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
1a6b0 0a 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66  ..      iRowidOf
1a6c0 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
1a6d0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 54 65  a[0]);.      iTe
1a6e0 72 6d 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  rmOff = fts5GetU
1a6f0 31 36 28 26 61 5b 32 5d 29 3b 0a 0a 20 20 20 20  16(&a[2]);..    
1a700 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20    if( iRowidOff 
1a710 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
1a720 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  = iRowidOff;.   
1a730 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65     }else if( iTe
1a740 72 6d 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rmOff ){.       
1a750 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
1a760 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a770 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b         iOff = n;
1a780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1a790 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
1a7a0 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c  (&rc, &s, &a[4],
1a7b0 20 69 4f 66 66 2d 34 29 3b 0a 0a 0a 20 20 20 20   iOff-4);...    
1a7c0 20 20 61 73 73 65 72 74 28 20 69 52 6f 77 69 64    assert( iRowid
1a7d0 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d  Off==0 || iOff==
1a7e0 69 52 6f 77 69 64 4f 66 66 20 29 3b 0a 20 20 20  iRowidOff );.   
1a7f0 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
1a800 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
1a810 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f   += fts5DecodeDo
1a820 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
1a830 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29  a[iOff], n-iOff)
1a840 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a850 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 4f 66   assert( iTermOf
1a860 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 54  f==0 || iOff==iT
1a870 65 72 6d 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  ermOff );.      
1a880 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
1a890 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
1a8a0 74 65 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  te;.        iOff
1a8b0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1a8c0 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  &a[iOff], nByte)
1a8d0 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e  ;.        term.n
1a8e0 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20  = nKeep;.       
1a8f0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1a900 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d  dBlob(&rc, &term
1a910 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66  , nByte, &a[iOff
1a920 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  ]);.        iOff
1a930 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20   += nByte;..    
1a940 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1a950 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
1a960 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  f(.            &
1a970 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25  rc, &s, " term=%
1a980 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63  .*s", term.n, (c
1a990 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e  onst char*)term.
1a9a0 70 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  p.        );.   
1a9b0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
1a9c0 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
1a9d0 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
1a9e0 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20  , n-iOff);.     
1a9f0 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b     if( iOff<n ){
1aa00 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
1aa10 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1aa20 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b  a[iOff], nKeep);
1aa30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1aa40 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66   }.      fts5Buf
1aa50 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
1aa60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aa70 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73   Fts5NodeIter ss
1aa80 3b 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35  ;.      for(fts5
1aa90 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 61 2c 20  NodeIterInit(a, 
1aaa0 6e 2c 20 26 73 73 29 3b 20 73 73 2e 61 44 61 74  n, &ss); ss.aDat
1aab0 61 3b 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e  a; fts5NodeIterN
1aac0 65 78 74 28 26 72 63 2c 20 26 73 73 29 29 7b 0a  ext(&rc, &ss)){.
1aad0 20 20 20 20 20 20 20 20 69 66 28 20 73 73 2e 74          if( ss.t
1aae0 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  erm.n==0 ){.    
1aaf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1ab00 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
1ab10 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 6c  ntf(&rc, &s, " l
1ab20 65 66 74 3d 25 64 22 2c 20 73 73 2e 69 43 68 69  eft=%d", ss.iChi
1ab30 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ld);.        }el
1ab40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
1ab50 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1ab60 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
1ab70 26 73 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22 2c  &s, " \"%.*s\"",
1ab80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ab90 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65  ss.term.n, ss.te
1aba0 72 6d 2e 70 0a 20 20 20 20 20 20 20 20 20 20 29  rm.p.          )
1abb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1abc0 20 20 20 20 69 66 28 20 73 73 2e 6e 45 6d 70 74      if( ss.nEmpt
1abd0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
1abe0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1abf0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
1ac00 2c 20 26 73 2c 20 22 20 65 6d 70 74 79 3d 25 64  , &s, " empty=%d
1ac10 25 73 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c 0a  %s", ss.nEmpty,.
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 73                ss
1ac30 2e 62 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a 20  .bDlidx ? "*" : 
1ac40 22 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  "".          );.
1ac50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ac60 7d 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65  }.      fts5Node
1ac70 49 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20  IterFree(&ss);. 
1ac80 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66     }.  }.  .  if
1ac90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1aca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
1acb0 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
1acc0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e   (const char*)s.
1acd0 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54  p, s.n, SQLITE_T
1ace0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
1acf0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
1ad00 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
1ad10 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d  e(pCtx, rc);.  }
1ad20 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1ad30 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(&s);.}../*.** 
1ad40 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
1ad50 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74  s part of regist
1ad60 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d  ering the FTS5 m
1ad70 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62  odule with datab
1ad80 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
1ad90 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65  n db. It registe
1ada0 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d  rs several user-
1adb0 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
1adc0 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a  unctions useful.
1add0 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a  ** with FTS5..**
1ade0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1adf0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
1ae00 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1ae10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f  error occurs, so
1ae20 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69  me other.** SQLi
1ae30 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1ae40 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
1ae50 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1ae60 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73  3Fts5IndexInit(s
1ae70 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
1ae80 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1ae90 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1aea0 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35  .      db, "fts5
1aeb0 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c  _decode", 2, SQL
1aec0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
1aed0 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c  5DecodeFunction,
1aee0 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 72 65 74   0, 0.  );.  ret
1aef0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1af00 20 53 65 74 20 74 68 65 20 74 61 72 67 65 74 20   Set the target 
1af10 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68  page size for th
1af20 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a  e index object..
1af30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
1af40 74 73 35 49 6e 64 65 78 50 67 73 7a 28 46 74 73  ts5IndexPgsz(Fts
1af50 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 70  5Index *p, int p
1af60 67 73 7a 29 7b 0a 20 20 70 2d 3e 70 67 73 7a 20  gsz){.  p->pgsz 
1af70 3d 20 70 67 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = pgsz;.}../*.**
1af80 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69   Iterator pMulti
1af90 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1afa0 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
1afb0 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68  ry (not EOF). Th
1afc0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1afd0 70 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66  ppends a copy of
1afe0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
1aff0 73 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  st of the entry 
1b000 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65  pMulti .** curre
1b010 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
1b020 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
1b030 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1b040 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
1b050 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
1b060 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61  n p->rc. It is a
1b070 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72  ssumed.** no err
1b080 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
1b090 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
1b0a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1b0b0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
1b0c0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
1b0d0 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
1b0e0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
1b0f0 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
1b100 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a  Multi,.  int bSz
1b110 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1b120 70 42 75 66 0a 29 7b 0a 20 20 46 74 73 35 43 68  pBuf.){.  Fts5Ch
1b130 75 6e 6b 49 74 65 72 20 69 74 65 72 3b 0a 20 20  unkIter iter;.  
1b140 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1b150 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65  g = &pMulti->aSe
1b160 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73  g[ pMulti->aFirs
1b170 74 5b 31 5d 20 5d 3b 0a 20 20 61 73 73 65 72 74  t[1] ];.  assert
1b180 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
1b190 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30  of(p, pMulti)==0
1b1a0 20 29 3b 0a 20 20 66 74 73 35 43 68 75 6e 6b 49   );.  fts5ChunkI
1b1b0 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c  terInit(p, pSeg,
1b1c0 20 26 69 74 65 72 29 3b 0a 20 20 69 66 28 20 66   &iter);.  if( f
1b1d0 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28  ts5ChunkIterEof(
1b1e0 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a  p, &iter)==0 ){.
1b1f0 20 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20      if( bSz ){. 
1b200 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1b210 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1b220 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e  rc, pBuf, iter.n
1b230 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Rem);.    }.    
1b240 77 68 69 6c 65 28 20 66 74 73 35 43 68 75 6e 6b  while( fts5Chunk
1b250 49 74 65 72 45 6f 66 28 70 2c 20 26 69 74 65 72  IterEof(p, &iter
1b260 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  )==0 ){.      ft
1b270 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1b280 6f 62 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ob(&p->rc, pBuf,
1b290 20 69 74 65 72 2e 6e 2c 20 69 74 65 72 2e 70 29   iter.n, iter.p)
1b2a0 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e  ;.      fts5Chun
1b2b0 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26 69 74  kIterNext(p, &it
1b2c0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
1b2d0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65   fts5ChunkIterRe
1b2e0 6c 65 61 73 65 28 26 69 74 65 72 29 3b 0a 7d 0a  lease(&iter);.}.
1b2f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b300 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1b310 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72  (Fts5DoclistIter
1b320 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
1b330 70 49 74 65 72 2d 3e 69 3c 70 49 74 65 72 2d 3e  pIter->i<pIter->
1b340 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  n ){.    if( pIt
1b350 65 72 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  er->i ){.      i
1b360 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
1b370 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74   pIter->i += get
1b380 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 61  Varint(&pIter->a
1b390 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36 34  [pIter->i], (u64
1b3a0 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
1b3b0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 41 73    if( pIter->bAs
1b3c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  c ){.        pIt
1b3d0 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
1b3e0 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73  elta;.      }els
1b3f0 65 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  e{.        pIter
1b400 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c  ->iRowid -= iDel
1b410 74 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ta;.      }.    
1b420 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
1b430 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69  er->i += getVari
1b440 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74  nt(&pIter->a[pIt
1b450 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70  er->i], (u64*)&p
1b460 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
1b470 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
1b480 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
1b490 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72  (&pIter->a[pIter
1b4a0 2d 3e 69 5d 2c 20 70 49 74 65 72 2d 3e 6e 50 6f  ->i], pIter->nPo
1b4b0 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65  slist);.    pIte
1b4c0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26 70  r->aPoslist = &p
1b4d0 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69  Iter->a[pIter->i
1b4e0 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20  ];.    pIter->i 
1b4f0 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69  += pIter->nPosli
1b500 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
1b510 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
1b520 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
1b530 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
1b540 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20  listIterInit(.  
1b550 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1b560 2c 20 0a 20 20 69 6e 74 20 62 41 73 63 2c 20 0a  , .  int bAsc, .
1b570 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65    Fts5DoclistIte
1b580 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65  r *pIter.){.  me
1b590 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
1b5a0 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
1b5b0 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 70 42 75    pIter->a = pBu
1b5c0 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 6e  f->p;.  pIter->n
1b5d0 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 70 49   = pBuf->n;.  pI
1b5e0 74 65 72 2d 3e 62 41 73 63 20 3d 20 62 41 73 63  ter->bAsc = bAsc
1b5f0 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49  ;.  fts5DoclistI
1b600 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
1b610 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1b620 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66  a doclist to buf
1b630 66 65 72 20 70 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer pBuf..*/.sta
1b640 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
1b650 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20  geAppendDocid(. 
1b660 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
1b690 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
1b6a0 62 41 73 63 2c 0a 20 20 46 74 73 35 42 75 66 66  bAsc,.  Fts5Buff
1b6b0 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
1b6c0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1b6d0 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
1b6e0 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f  .  i64 *piLastRo
1b6f0 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
1b700 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72     /* IN/OUT: Pr
1b710 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69  evious rowid wri
1b720 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f  tten (if any) */
1b730 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20  .  i64 iRowid   
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61     /* Rowid to a
1b760 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ppend */.){.  if
1b770 28 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a  ( pBuf->n==0 ){.
1b780 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1b790 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20  pendVarint(pRc, 
1b7a0 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  pBuf, iRowid);. 
1b7b0 20 7d 65 6c 73 65 20 69 66 28 20 62 41 73 63 3d   }else if( bAsc=
1b7c0 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  =0 ){.    fts5Bu
1b7d0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1b7e0 28 70 52 63 2c 20 70 42 75 66 2c 20 2a 70 69 4c  (pRc, pBuf, *piL
1b7f0 61 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77 69  astRowid - iRowi
1b800 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
1b810 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1b820 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75  dVarint(pRc, pBu
1b830 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c  f, iRowid - *piL
1b840 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  astRowid);.  }. 
1b850 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20   *piLastRowid = 
1b860 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iRowid;.}../*.**
1b870 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20   Buffers p1 and 
1b880 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69  p2 contain docli
1b890 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  sts. This functi
1b8a0 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f  on merges the co
1b8b0 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  ntent.** of the 
1b8c0 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67  two doclists tog
1b8d0 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62  ether and sets b
1b8e0 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20  uffer p1 to the 
1b8f0 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a  result before.**
1b900 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1b910 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1b920 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
1b930 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  ode is left in p
1b940 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  ->rc. If an erro
1b950 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  r has.** already
1b960 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1b970 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1b980 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1b990 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65  oid fts5MergePre
1b9a0 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35  fixLists(.  Fts5
1b9b0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b9d0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1b9e0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63  ct */.  int bAsc
1b9f0 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1ba00 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
1ba10 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73      /* First lis
1ba20 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20  t to merge */.  
1ba30 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20  Fts5Buffer *p2  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74  /* Second list t
1ba60 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20  o merge */.){.  
1ba70 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20  if( p2->n ){.   
1ba80 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
1ba90 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63  = 0;.    Fts5Doc
1baa0 6c 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20  listIter i1;.   
1bab0 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
1bac0 20 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66   i2;.    Fts5Buf
1bad0 66 65 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73  fer out;.    Fts
1bae0 35 42 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20  5Buffer tmp;.   
1baf0 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c   memset(&out, 0,
1bb00 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20   sizeof(out));. 
1bb10 20 20 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20     memset(&tmp, 
1bb20 30 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b  0, sizeof(tmp));
1bb30 0a 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ..    fts5Doclis
1bb40 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20 62 41  tIterInit(p1, bA
1bb50 73 63 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74  sc, &i1);.    ft
1bb60 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
1bb70 74 28 70 32 2c 20 62 41 73 63 2c 20 26 69 32 29  t(p2, bAsc, &i2)
1bb80 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 31 2e  ;.    while( i1.
1bb90 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69  aPoslist!=0 || i
1bba0 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 29 7b  2.aPoslist!=0 ){
1bbb0 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50  .      if( i2.aP
1bbc0 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31  oslist==0 || (i1
1bbd0 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20 20  .aPoslist && .  
1bbe0 20 20 20 20 20 20 20 20 20 28 20 28 21 62 41 73           ( (!bAs
1bbf0 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e 69  c && i1.iRowid>i
1bc00 32 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 62 41  2.iRowid) || (bA
1bc10 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c  sc && i1.iRowid<
1bc20 69 32 2e 69 52 6f 77 69 64 29 20 29 0a 20 20 20  i2.iRowid) ).   
1bc30 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20 2f     )){.        /
1bc40 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f  * Copy entry fro
1bc50 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  m i1 */.        
1bc60 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
1bc70 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73  ocid(&p->rc, bAs
1bc80 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52  c, &out, &iLastR
1bc90 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29  owid, i1.iRowid)
1bca0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1bcb0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1bcc0 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69  (&p->rc, &out, i
1bcd0 31 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  1.nPoslist);.   
1bce0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1bcf0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1bd00 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73 6c  , &out, i1.nPosl
1bd10 69 73 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74  ist, i1.aPoslist
1bd20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1bd30 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
1bd40 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i1);.      }.   
1bd50 20 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61     else if( i1.a
1bd60 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32  Poslist==0 || i2
1bd70 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77  .iRowid!=i1.iRow
1bd80 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
1bd90 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
1bda0 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i2 */.        f
1bdb0 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
1bdc0 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73 63  cid(&p->rc, bAsc
1bdd0 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f  , &out, &iLastRo
1bde0 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b  wid, i2.iRowid);
1bdf0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1be00 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1be10 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32  &p->rc, &out, i2
1be20 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .nPoslist);.    
1be30 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1be40 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1be50 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69   &out, i2.nPosli
1be60 73 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 29  st, i2.aPoslist)
1be70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
1be80 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
1be90 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
1bea0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
1beb0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1bec0 72 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46 74  r r1;.        Ft
1bed0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
1bee0 72 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  r2;.        Fts5
1bef0 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
1bf00 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d  iter;..        m
1bf10 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1bf20 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29  , sizeof(writer)
1bf30 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d  );..        /* M
1bf40 65 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73  erge the two pos
1bf50 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20  ition lists. */ 
1bf60 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
1bf70 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70  geAppendDocid(&p
1bf80 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75 74  ->rc, bAsc, &out
1bf90 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  , &iLastRowid, i
1bfa0 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
1bfb0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
1bfc0 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20  o(&tmp);.       
1bfd0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1bfe0 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31  istReaderInit(-1
1bff0 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i1.aPoslist, i
1c000 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 31 29  1.nPoslist, &r1)
1c010 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c020 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
1c030 65 72 49 6e 69 74 28 2d 31 2c 20 69 32 2e 61 50  erInit(-1, i2.aP
1c040 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c  oslist, i2.nPosl
1c050 69 73 74 2c 20 26 72 32 29 3b 0a 20 20 20 20 20  ist, &r2);.     
1c060 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1c070 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 72  =SQLITE_OK && (r
1c080 31 2e 62 45 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e  1.bEof==0 || r2.
1c090 62 45 6f 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20  bEof==0) ){.    
1c0a0 20 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a        i64 iNew;.
1c0b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 32            if( r2
1c0c0 2e 62 45 6f 66 20 7c 7c 20 28 72 31 2e 62 45 6f  .bEof || (r1.bEo
1c0d0 66 3d 3d 30 20 26 26 20 72 31 2e 69 50 6f 73 3c  f==0 && r1.iPos<
1c0e0 72 32 2e 69 50 6f 73 29 20 29 7b 0a 20 20 20 20  r2.iPos) ){.    
1c0f0 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 72          iNew = r
1c100 31 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  1.iPos;.        
1c110 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
1c120 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
1c130 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  (&r1);.         
1c140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c150 20 20 20 20 69 4e 65 77 20 3d 20 72 32 2e 69 50      iNew = r2.iP
1c160 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
1c170 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1c180 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 32  stReaderNext(&r2
1c190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1c1a0 66 28 20 72 31 2e 69 50 6f 73 3d 3d 72 32 2e 69  f( r1.iPos==r2.i
1c1b0 50 6f 73 20 29 20 73 71 6c 69 74 65 33 46 74 73  Pos ) sqlite3Fts
1c1c0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
1c1d0 78 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20  xt(&r1);.       
1c1e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1c1f0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
1c200 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41  s5PoslistWriterA
1c210 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69  ppend(&tmp, &wri
1c220 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20  ter, iNew);.    
1c230 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
1c240 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1c250 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f  arint(&p->rc, &o
1c260 75 74 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20  ut, tmp.n);.    
1c270 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1c280 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1c290 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d   &out, tmp.n, tm
1c2a0 70 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74  p.p);.        ft
1c2b0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1c2c0 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&i1);.        
1c2d0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
1c2e0 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
1c2f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
1c300 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
1c310 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75  c, p1, out.n, ou
1c320 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75  t.p);.    fts5Bu
1c330 66 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a  fferFree(&tmp);.
1c340 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
1c350 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  ee(&out);.  }.}.
1c360 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c370 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35  5BufferSwap(Fts5
1c380 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35  Buffer *p1, Fts5
1c390 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46  Buffer *p2){.  F
1c3a0 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20  ts5Buffer tmp = 
1c3b0 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32  *p1;.  *p1 = *p2
1c3c0 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d  ;.  *p2 = tmp;.}
1c3d0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1c3e0 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65  s5SetupPrefixIte
1c3f0 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r(.  Fts5Index *
1c400 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1c410 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1c420 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1c430 69 6e 74 20 62 41 73 63 2c 20 20 20 20 20 20 20  int bAsc,       
1c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c450 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44  /* True for "ORD
1c460 45 52 20 42 59 20 72 6f 77 69 64 20 41 53 43 22  ER BY rowid ASC"
1c470 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
1c480 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  pToken,         
1c490 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1c4a0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
1c4b0 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20  x to match */.  
1c4c0 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
1c4f0 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65  r pToken in byte
1c500 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  s */.  Fts5Index
1c510 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
1c520 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61         /* Popula
1c530 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  te this object *
1c540 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
1c550 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
1c560 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75   Fts5Buffer *aBu
1c570 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  f;.  const int n
1c580 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75  Buf = 32;..  aBu
1c590 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a  f = (Fts5Buffer*
1c5a0 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
1c5b0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1c5c0 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53  fer)*nBuf);.  pS
1c5d0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
1c5e0 63 74 75 72 65 52 65 61 64 28 70 2c 20 30 29 3b  ctureRead(p, 0);
1c5f0 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
1c600 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 46  pStruct ){.    F
1c610 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
1c620 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e  pDoclist;.    in
1c630 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61  t i;.    i64 iLa
1c640 73 74 52 6f 77 69 64 3b 0a 20 20 20 20 46 74 73  stRowid;.    Fts
1c650 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
1c660 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74  1 = 0;     /* It
1c670 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67  erator used to g
1c680 61 74 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20  ather data from 
1c690 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73  index */.    Fts
1c6a0 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b  5Buffer doclist;
1c6b0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f  ..    memset(&do
1c6c0 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  clist, 0, sizeof
1c6d0 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20  (doclist));.    
1c6e0 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
1c6f0 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
1c700 20 30 2c 20 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e   0, 1, pToken, n
1c710 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70  Token, -1, 0, &p
1c720 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  1);.        fts5
1c730 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1c740 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  p1)==0;.        
1c750 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
1c760 74 28 70 2c 20 70 31 29 0a 20 20 20 20 29 7b 0a  t(p, p1).    ){.
1c770 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
1c780 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1c790 52 6f 77 69 64 28 70 31 29 3b 0a 20 20 20 20 20  Rowid(p1);.     
1c7a0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
1c7b0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
1c7c0 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  m = fts5MultiIte
1c7d0 72 54 65 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d  rTerm(p1, &nTerm
1c7e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c7f0 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20   memcmp(pToken, 
1c800 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65  pTerm, MIN(nToke
1c810 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b  n, nTerm))<=0 );
1c820 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
1c830 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d  <nToken || memcm
1c840 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c  p(pToken, pTerm,
1c850 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b   nToken) ) break
1c860 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63  ;..      if( doc
1c870 6c 69 73 74 2e 6e 3e 30 20 0a 20 20 20 20 20 20  list.n>0 .      
1c880 20 26 26 20 28 28 21 62 41 73 63 20 26 26 20 69   && ((!bAsc && i
1c890 52 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77 69  Rowid>=iLastRowi
1c8a0 64 29 20 7c 7c 20 28 62 41 73 63 20 26 26 20 69  d) || (bAsc && i
1c8b0 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69  Rowid<=iLastRowi
1c8c0 64 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20  d)).      ){..  
1c8d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 64        for(i=0; d
1c8e0 6f 63 6c 69 73 74 2e 6e 20 26 26 20 70 2d 3e 72  oclist.n && p->r
1c8f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
1c900 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
1c910 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a  sert( i<nBuf );.
1c920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42            if( aB
1c930 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  uf[i].n==0 ){.  
1c940 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1c950 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73  fferSwap(&doclis
1c960 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
1c970 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1c980 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73  fferZero(&doclis
1c990 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
1c9a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1c9b0 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
1c9c0 4c 69 73 74 73 28 70 2c 20 62 41 73 63 2c 20 26  Lists(p, bAsc, &
1c9d0 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69  doclist, &aBuf[i
1c9e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
1c9f0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
1ca00 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
1ca10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1ca20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ca30 28 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20 29  ( doclist.n==0 )
1ca40 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
1ca50 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1ca60 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73  (&p->rc, &doclis
1ca70 74 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  t, iRowid);.    
1ca80 20 20 7d 65 6c 73 65 20 69 66 28 20 62 41 73 63    }else if( bAsc
1ca90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
1caa0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1cab0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64  arint(&p->rc, &d
1cac0 6f 63 6c 69 73 74 2c 20 69 4c 61 73 74 52 6f 77  oclist, iLastRow
1cad0 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20  id - iRowid);.  
1cae0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1caf0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1cb00 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1cb10 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77  , &doclist, iRow
1cb20 69 64 20 2d 20 69 4c 61 73 74 52 6f 77 69 64 29  id - iLastRowid)
1cb30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cb40 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f  iLastRowid = iRo
1cb50 77 69 64 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  wid;.      fts5M
1cb60 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
1cb70 70 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69  p, p1, 1, &docli
1cb80 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  st);.    }..    
1cb90 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b  for(i=0; i<nBuf;
1cba0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
1cbb0 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
1cbc0 73 28 70 2c 20 62 41 73 63 2c 20 26 64 6f 63 6c  s(p, bAsc, &docl
1cbd0 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
1cbe0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1cbf0 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a  Free(&aBuf[i]);.
1cc00 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75      }.    fts5Mu
1cc10 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
1cc20 31 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69 73  1);..    pDoclis
1cc30 74 20 3d 20 28 46 74 73 35 44 6f 63 6c 69 73 74  t = (Fts5Doclist
1cc40 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c  Iter*)fts5IdxMal
1cc50 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
1cc60 73 35 44 6f 63 6c 69 73 74 49 74 65 72 29 29 3b  s5DoclistIter));
1cc70 0a 20 20 20 20 69 66 28 20 21 70 44 6f 63 6c 69  .    if( !pDocli
1cc80 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  st ){.      fts5
1cc90 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c  BufferFree(&docl
1cca0 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
1ccb0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 44  .      pIter->pD
1ccc0 6f 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69 73  oclist = pDoclis
1ccd0 74 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6f 63  t;.      fts5Doc
1cce0 6c 69 73 74 49 74 65 72 49 6e 69 74 28 26 64 6f  listIterInit(&do
1ccf0 63 6c 69 73 74 2c 20 62 41 73 63 2c 20 70 49 74  clist, bAsc, pIt
1cd00 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20  er->pDoclist);. 
1cd10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
1cd20 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
1cd30 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c  (pStruct);.  sql
1cd40 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b  ite3_free(aBuf);
1cd50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1cd60 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f   new iterator to
1cd70 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20   iterate though 
1cd80 61 6c 6c 20 64 6f 63 69 64 73 20 74 68 61 74 20  all docids that 
1cd90 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70  match the .** sp
1cda0 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72  ecified token or
1cdb0 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a   token prefix..*
1cdc0 2f 0a 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  /.Fts5IndexIter 
1cdd0 2a 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65  *sqlite3Fts5Inde
1cde0 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e  xQuery(.  Fts5In
1cdf0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1ce00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1ce10 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20   index to query 
1ce20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1ce30 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
1ce40 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f  ken, /* Token (o
1ce50 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65  r prefix) to que
1ce60 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
1ce70 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1ce90 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
1cea0 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a  _QUERY_X flags *
1ceb0 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  /.){.  Fts5Index
1cec0 49 74 65 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e  Iter *pRet;.  in
1ced0 74 20 69 49 64 78 20 3d 20 30 3b 0a 0a 20 20 69  t iIdx = 0;..  i
1cee0 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
1cef0 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
1cf00 58 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  X ){.    Fts5Con
1cf10 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
1cf20 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
1cf30 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78 3c  or(iIdx=1; iIdx<
1cf40 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  =pConfig->nPrefi
1cf50 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20  x; iIdx++){.    
1cf60 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
1cf70 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d  Prefix[iIdx-1]==
1cf80 6e 54 6f 6b 65 6e 20 29 20 62 72 65 61 6b 3b 0a  nToken ) break;.
1cf90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 49      }.    if( iI
1cfa0 64 78 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  dx>pConfig->nPre
1cfb0 66 69 78 20 29 7b 0a 20 20 20 20 20 20 69 49 64  fix ){.      iId
1cfc0 78 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  x = -1;.    }.  
1cfd0 7d 0a 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73  }..  pRet = (Fts
1cfe0 35 49 6e 64 65 78 49 74 65 72 2a 29 73 71 6c 69  5IndexIter*)sqli
1cff0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
1d000 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 29  f(Fts5IndexIter)
1d010 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
1d020 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74  .    memset(pRet
1d030 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1d040 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 0a 20 20  IndexIter));..  
1d050 20 20 70 52 65 74 2d 3e 70 49 6e 64 65 78 20 3d    pRet->pIndex =
1d060 20 70 3b 0a 20 20 20 20 69 66 28 20 69 49 64 78   p;.    if( iIdx
1d070 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 52 65  >=0 ){.      pRe
1d080 74 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73  t->pStruct = fts
1d090 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
1d0a0 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69  , iIdx);.      i
1d0b0 66 28 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74  f( pRet->pStruct
1d0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
1d0d0 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
1d0e0 70 52 65 74 2d 3e 70 53 74 72 75 63 74 2c 20 0a  pRet->pStruct, .
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78              iIdx
1d100 2c 20 66 6c 61 67 73 2c 20 28 63 6f 6e 73 74 20  , flags, (const 
1d110 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  u8*)pToken, nTok
1d120 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74  en, -1, 0, &pRet
1d130 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20 20 20 20  ->pMulti.       
1d140 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1d150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1d160 20 62 41 73 63 20 3d 20 28 66 6c 61 67 73 20 26   bAsc = (flags &
1d170 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
1d180 5f 41 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20  _ASC)!=0;.      
1d190 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49  fts5SetupPrefixI
1d1a0 74 65 72 28 70 2c 20 62 41 73 63 2c 20 28 63 6f  ter(p, bAsc, (co
1d1b0 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20  nst u8*)pToken, 
1d1c0 6e 54 6f 6b 65 6e 2c 20 70 52 65 74 29 3b 0a 20  nToken, pRet);. 
1d1d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d1e0 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  p->rc ){.    sql
1d1f0 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
1d200 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65  e(pRet);.    pRe
1d210 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
1d220 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
1d230 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1d240 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
1d250 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
1d260 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74  y argument is at
1d270 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   EOF..*/.int sql
1d280 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
1d290 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
1d2a0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
1d2b0 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 20  er->pDoclist ){ 
1d2c0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65  .    return pIte
1d2d0 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f  r->pDoclist->aPo
1d2e0 73 6c 69 73 74 3d 3d 30 3b 20 0a 20 20 7d 65 6c  slist==0; .  }el
1d2f0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66  se{.    return f
1d300 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
1d310 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
1d320 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20  Iter->pMulti);. 
1d330 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65   }.}../*.** Move
1d340 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
1d350 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f  ching rowid. .*/
1d360 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
1d370 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  5IterNext(Fts5In
1d380 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
1d390 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 69  i64 iMatch){.  i
1d3a0 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  f( pIter->pDocli
1d3b0 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f  st ){.    fts5Do
1d3c0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49  clistIterNext(pI
1d3d0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a  ter->pDoclist);.
1d3e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
1d3f0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
1d400 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
1d410 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
1d420 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ext(pIter->pInde
1d430 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  x, pIter->pMulti
1d440 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1d450 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1d460 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34  nt rowid..*/.i64
1d470 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
1d480 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 49  Rowid(Fts5IndexI
1d490 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
1d4a0 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  f( pIter->pDocli
1d4b0 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
1d4c0 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
1d4d0 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73  ->iRowid;.  }els
1d4e0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66 74  e{.    return ft
1d4f0 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
1d500 28 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b  (pIter->pMulti);
1d510 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
1d520 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1d530 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1d540 61 69 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  aining a copy of
1d550 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
1d560 73 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20 63 75  st for.** the cu
1d570 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 4f 75 74  rrent entry. Out
1d580 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 6e  put variable *pn
1d590 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
1d5a0 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1d5b0 72 20 0a 2a 2a 20 69 6e 20 62 79 74 65 73 20 62  r .** in bytes b
1d5c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1d5d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
1d5e0 6e 65 64 20 62 75 66 66 65 72 20 64 6f 65 73 20  ned buffer does 
1d5f0 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
1d600 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20  0x00 terminator 
1d610 62 79 74 65 20 73 74 6f 72 65 64 20 6f 6e 0a 2a  byte stored on.*
1d620 2a 20 64 69 73 6b 2e 0a 2a 2f 0a 63 6f 6e 73 74  * disk..*/.const
1d630 20 75 38 20 2a 73 71 6c 69 74 65 33 46 74 73 35   u8 *sqlite3Fts5
1d640 49 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35  IterPoslist(Fts5
1d650 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1d660 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 66  , int *pn){.  if
1d670 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  ( pIter->pDoclis
1d680 74 20 29 7b 0a 20 20 20 20 2a 70 6e 20 3d 20 70  t ){.    *pn = p
1d690 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e  Iter->pDoclist->
1d6a0 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 72 65  nPoslist;.    re
1d6b0 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63  turn pIter->pDoc
1d6c0 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3b 0a  list->aPoslist;.
1d6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73    }else{.    Fts
1d6e0 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65  5Index *p = pIte
1d6f0 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66  r->pIndex;.    f
1d700 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
1d710 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
1d720 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1d730 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 49 74 65  rPoslist(p, pIte
1d740 72 2d 3e 70 4d 75 6c 74 69 2c 20 30 2c 20 26 70  r->pMulti, 0, &p
1d750 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
1d760 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
1d770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1d780 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
1d790 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 2a 70  return 0;.    *p
1d7a0 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  n = pIter->posli
1d7b0 73 74 2e 6e 3b 0a 20 20 20 20 72 65 74 75 72 6e  st.n;.    return
1d7c0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
1d7d0 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
1d7e0 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f  Close an iterato
1d7f0 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65  r opened by an e
1d800 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73  arlier call to s
1d810 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
1d820 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  uery()..*/.void 
1d830 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
1d840 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49 74  lose(Fts5IndexIt
1d850 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
1d860 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69  ( pIter ){.    i
1d870 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  f( pIter->pDocli
1d880 73 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  st ){.      sqli
1d890 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e  te3_free(pIter->
1d8a0 70 44 6f 63 6c 69 73 74 2d 3e 61 29 3b 0a 20 20  pDoclist->a);.  
1d8b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d8c0 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74  (pIter->pDoclist
1d8d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d8e0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1d8f0 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 49 6e  rFree(pIter->pIn
1d900 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c  dex, pIter->pMul
1d910 74 69 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53  ti);.      fts5S
1d920 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
1d930 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b  pIter->pStruct);
1d940 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1d950 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f  rFree(&pIter->po
1d960 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  slist);.    }.  
1d970 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
1d980 72 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  r(pIter->pIndex)
1d990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1d9a0 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  ee(pIter);.  }.}
1d9b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1d9c0 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
1d9d0 72 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  rd into the buff
1d9e0 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  er supplied as t
1d9f0 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
1da00 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 53  gument. Return S
1da10 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
1da20 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1da30 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
1da40 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** if an error o
1da50 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
1da60 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 47 65  lite3Fts5IndexGe
1da70 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e  tAverages(Fts5In
1da80 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66 66  dex *p, Fts5Buff
1da90 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 66 74 73  er *pBuf){.  fts
1daa0 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65  5DataReadOrBuffe
1dab0 72 28 70 2c 20 70 42 75 66 2c 20 46 54 53 35 5f  r(p, pBuf, FTS5_
1dac0 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b  AVERAGES_ROWID);
1dad0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
1dae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  .}../*.** Replac
1daf0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61  e the current "a
1db00 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
1db10 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
1db20 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
1db30 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20  .** supplied as 
1db40 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1db50 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1db60 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
1db70 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
1db80 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a  x *p, const u8 *
1db90 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
1dba0 29 7b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  ){.  fts5DataWri
1dbb0 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  te(p, FTS5_AVERA
1dbc0 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61  GES_ROWID, pData
1dbd0 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75  , nData);.  retu
1dbe0 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a           rn p->rc;.}..