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

Artifact 0548e8925a0664cfa00b2477ebe9afa18bc7848f:


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 2f 2a 0a 2a 2a 20 44 65 74  ge */../*.** Det
0740: 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails:.**.** The 
0750: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 6d 61 6e  %_data table man
0760: 61 67 65 64 20 62 79 20 74 68 69 73 20 6d 6f 64  aged by this mod
0770: 75 6c 65 2c 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ule,.**.**     C
0780: 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 64 61  REATE TABLE %_da
0790: 74 61 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  ta(id INTEGER PR
07a0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b  IMARY KEY, block
07b0: 20 42 4c 4f 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c 20   BLOB);.**.** , 
07c0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 6f 6c  contains the fol
07d0: 6c 6f 77 69 6e 67 20 35 20 74 79 70 65 73 20 6f  lowing 5 types o
07e0: 66 20 72 65 63 6f 72 64 73 2e 20 53 65 65 20 74  f records. See t
07f0: 68 65 20 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72  he comments surr
0800: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 74 68 65 20 46  ounding.** the F
0810: 54 53 35 5f 2a 5f 52 4f 57 49 44 20 6d 61 63 72  TS5_*_ROWID macr
0820: 6f 73 20 62 65 6c 6f 77 20 66 6f 72 20 61 20 64  os below for a d
0830: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 68 6f  escription of ho
0840: 77 20 25 5f 64 61 74 61 20 72 6f 77 69 64 73 20  w %_data rowids 
0850: 61 72 65 20 0a 2a 2a 20 61 73 73 69 67 6e 65 64  are .** assigned
0860: 20 74 6f 20 65 61 63 68 20 66 6f 20 74 68 65 6d   to each fo them
0870: 2e 0a 2a 2a 0a 2a 2a 20 31 2e 20 53 74 72 75 63  ..**.** 1. Struc
0880: 74 75 72 65 20 52 65 63 6f 72 64 73 3a 0a 2a 2a  ture Records:.**
0890: 0a 2a 2a 20 20 20 54 68 65 20 73 65 74 20 6f 66  .**   The set of
08a0: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 6d   segments that m
08b0: 61 6b 65 20 75 70 20 61 6e 20 69 6e 64 65 78 20  ake up an index 
08c0: 2d 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  - the index stru
08d0: 63 74 75 72 65 20 2d 20 61 72 65 0a 2a 2a 20 20  cture - are.**  
08e0: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 61 20 73   recorded in a s
08f0: 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 69 74  ingle record wit
0900: 68 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74  hin the %_data t
0910: 61 62 6c 65 2e 20 54 68 65 20 72 65 63 6f 72 64  able. The record
0920: 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 20 20   is a list.**   
0930: 6f 66 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74  of SQLite varint
0940: 73 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  s. .**.**   For 
0950: 65 61 63 68 20 6c 65 76 65 6c 20 66 72 6f 6d 20  each level from 
0960: 30 20 74 6f 20 6e 4d 61 78 3a 0a 2a 2a 0a 2a 2a  0 to nMax:.**.**
0970: 20 20 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66       + number of
0980: 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
0990: 69 6e 20 6f 6e 67 6f 69 6e 67 20 6d 65 72 67 65  in ongoing merge
09a0: 2e 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ..**     + total
09b0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
09c0: 6e 74 73 20 69 6e 20 6c 65 76 65 6c 2e 0a 2a 2a  nts in level..**
09d0: 20 20 20 20 20 2b 20 66 6f 72 20 65 61 63 68 20       + for each 
09e0: 73 65 67 6d 65 6e 74 20 66 72 6f 6d 20 6f 6c 64  segment from old
09f0: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 3a 0a 2a  est to newest:.*
0a00: 2a 20 20 20 20 20 20 20 20 20 2b 20 73 65 67 6d  *         + segm
0a10: 65 6e 74 20 69 64 20 28 61 6c 77 61 79 73 20 3e  ent id (always >
0a20: 20 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b   0).**         +
0a30: 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 20 28   b-tree height (
0a40: 31 20 2d 3e 20 72 6f 6f 74 20 69 73 20 6c 65 61  1 -> root is lea
0a50: 66 2c 20 32 20 2d 3e 20 72 6f 6f 74 20 69 73 20  f, 2 -> root is 
0a60: 70 61 72 65 6e 74 20 6f 66 20 6c 65 61 66 20 65  parent of leaf e
0a70: 74 63 2e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  tc.).**         
0a80: 2b 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67  + first leaf pag
0a90: 65 20 6e 75 6d 62 65 72 20 28 6f 66 74 65 6e 20  e number (often 
0aa0: 31 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20  1).**         + 
0ab0: 66 69 6e 61 6c 20 6c 65 61 66 20 70 61 67 65 20  final leaf page 
0ac0: 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20  number.**.** 2. 
0ad0: 54 68 65 20 41 76 65 72 61 67 65 73 20 52 65 63  The Averages Rec
0ae0: 6f 72 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73  ord:.**.**   A s
0af0: 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 69 74  ingle record wit
0b00: 68 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74  hin the %_data t
0b10: 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 20 69  able. The data i
0b20: 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69  s a list of vari
0b30: 6e 74 73 2e 0a 2a 2a 20 20 20 54 68 65 20 66 69  nts..**   The fi
0b40: 72 73 74 20 76 61 6c 75 65 20 69 73 20 74 68 65  rst value is the
0b50: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0b60: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68  in the index. Th
0b70: 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  en, for each col
0b80: 75 6d 6e 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c 65  umn.**   from le
0b90: 66 74 20 74 6f 20 72 69 67 68 74 2c 20 74 68 65  ft to right, the
0ba0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0bb0: 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 63   tokens in the c
0bc0: 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a  olumn for all .*
0bd0: 2a 20 20 20 72 6f 77 73 20 6f 66 20 74 68 65 20  *   rows of the 
0be0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20  table..**.** 3. 
0bf0: 53 65 67 6d 65 6e 74 20 6c 65 61 76 65 73 3a 0a  Segment leaves:.
0c00: 2a 2a 0a 2a 2a 20 20 20 54 45 52 4d 20 44 4f 43  **.**   TERM DOC
0c10: 4c 49 53 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a  LIST FORMAT:.**.
0c20: 2a 2a 20 20 20 20 20 4d 6f 73 74 20 6f 66 20 65  **     Most of e
0c30: 61 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66  ach segment leaf
0c40: 20 69 73 20 74 61 6b 65 6e 20 75 70 20 62 79 20   is taken up by 
0c50: 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74  term/doclist dat
0c60: 61 2e 20 54 68 65 20 0a 2a 2a 20 20 20 20 20 67  a. The .**     g
0c70: 65 6e 65 72 61 6c 20 66 6f 72 6d 61 74 20 6f 66  eneral format of
0c80: 20 74 68 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73   the term/doclis
0c90: 74 20 64 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a  t data is:.**.**
0ca0: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 20           varint 
0cb0: 3a 20 73 69 7a 65 20 6f 66 20 66 69 72 73 74 20  : size of first 
0cc0: 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  term.**         
0cd0: 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74  blob:    first t
0ce0: 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20  erm data.**     
0cf0: 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 66 69 72      doclist: fir
0d00: 73 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20  st doclist.**   
0d10: 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f        zero-or-mo
0d20: 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  re {.**         
0d30: 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65    varint:  numbe
0d40: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 6f  r of bytes in co
0d50: 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69 6f  mmon with previo
0d60: 75 73 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20  us term.**      
0d70: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 6e 75       varint:  nu
0d80: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
0d90: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 20 28   new term data (
0da0: 6e 4e 65 77 29 0a 2a 2a 20 20 20 20 20 20 20 20  nNew).**        
0db0: 20 20 20 62 6c 6f 62 3a 20 20 20 20 6e 4e 65 77     blob:    nNew
0dc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0dd0: 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20  rm data.**      
0de0: 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 6e 65       doclist: ne
0df0: 78 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20  xt doclist.**   
0e00: 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20        }.**.**   
0e10: 20 20 64 6f 63 6c 69 73 74 20 66 6f 72 6d 61 74    doclist format
0e20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
0e30: 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20 72  varint:  first r
0e40: 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  owid.**         
0e50: 70 6f 73 6c 69 73 74 3a 20 66 69 72 73 74 20 70  poslist: first p
0e60: 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20  oslist.**       
0e70: 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b    zero-or-more {
0e80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0e90: 72 69 6e 74 3a 20 20 72 6f 77 69 64 20 64 65 6c  rint:  rowid del
0ea0: 74 61 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a  ta (always > 0).
0eb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 6f 73  **           pos
0ec0: 6c 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c  list: first posl
0ed0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
0ee0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30 30  .**         0x00
0ef0: 20 62 79 74 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20   byte.**.**     
0f00: 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a  poslist format:.
0f10: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
0f20: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
0f30: 6f 72 20 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20  or column 0.**  
0f40: 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d         zero-or-m
0f50: 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ore {.**        
0f60: 20 20 20 30 78 30 31 20 62 79 74 65 0a 2a 2a 20     0x01 byte.** 
0f70: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
0f80: 3a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  : column number 
0f90: 28 49 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  (I).**          
0fa0: 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73   collist: collis
0fb0: 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a  t for column I.*
0fc0: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
0fd0: 20 20 20 20 20 20 20 30 78 30 30 20 62 79 74 65         0x00 byte
0fe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c 69  .**.**     colli
0ff0: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1000: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1010: 20 66 69 72 73 74 20 6f 66 66 73 65 74 20 2b 20   first offset + 
1020: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  2.**         zer
1030: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
1040: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1050: 20 6f 66 66 73 65 74 20 64 65 6c 74 61 20 2b 20   offset delta + 
1060: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  2.**         }.*
1070: 2a 0a 2a 2a 20 20 20 50 41 47 49 4e 41 54 49 4f  *.**   PAGINATIO
1080: 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  N.**.**     The 
1090: 66 6f 72 6d 61 74 20 64 65 73 63 72 69 62 65 64  format described
10a0: 20 61 62 6f 76 65 20 69 73 20 6f 6e 6c 79 20 61   above is only a
10b0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
10c0: 6e 74 69 72 65 20 74 65 72 6d 2f 64 6f 63 6c 69  ntire term/docli
10d0: 73 74 0a 2a 2a 20 20 20 20 20 64 61 74 61 20 66  st.**     data f
10e0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
10f0: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1100: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1110: 73 65 2c 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  se, the format.*
1120: 2a 20 20 20 20 20 69 73 20 63 68 61 6e 67 65 64  *     is changed
1130: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1140: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1150: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1160: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1170: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1180: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
1190: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
11a0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
11b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
11c0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
11d0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
11e0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
11f0: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1200: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1210: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1220: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1230: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1240: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1250: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1260: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1270: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
1290: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
12a0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20 20   data.**.**     
12b0: 45 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 62  Each leaf page b
12c0: 65 67 69 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a 2a  egins with:.**.*
12d0: 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74 65  *       + 2-byte
12e0: 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61 69   unsigned contai
12f0: 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20 66  ning offset to f
1300: 69 72 73 74 20 72 6f 77 69 64 20 28 6f 72 20 30  irst rowid (or 0
1310: 29 2e 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d  )..**       + 2-
1320: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63 6f  byte unsigned co
1330: 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74 20  ntaining offset 
1340: 74 6f 20 66 69 72 73 74 20 74 65 72 6d 20 28 6f  to first term (o
1350: 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  r 0)..**.**   Fo
1360: 6c 6c 6f 77 65 64 20 62 79 20 74 65 72 6d 2f 64  llowed by term/d
1370: 6f 63 6c 69 73 74 20 64 61 74 61 2e 0a 2a 2a 0a  oclist data..**.
1380: 2a 2a 20 34 2e 20 53 65 67 6d 65 6e 74 20 69 6e  ** 4. Segment in
1390: 74 65 72 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a 2a  terior nodes:.**
13a0: 0a 2a 2a 20 20 20 54 68 65 20 69 6e 74 65 72 69  .**   The interi
13b0: 6f 72 20 6e 6f 64 65 73 20 74 75 72 6e 20 74 68  or nodes turn th
13c0: 65 20 6c 69 73 74 20 6f 66 20 6c 65 61 76 65 73  e list of leaves
13d0: 20 69 6e 74 6f 20 61 20 62 2b 74 72 65 65 2e 20   into a b+tree. 
13e0: 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68 20 69 6e  .**.**   Each in
13f0: 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 65 67 69  terior node begi
1400: 6e 73 20 77 69 74 68 20 61 20 76 61 72 69 6e 74  ns with a varint
1410: 20 2d 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62   - the page numb
1420: 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 0a 2a  er of the left.*
1430: 2a 20 20 20 6d 6f 73 74 20 63 68 69 6c 64 20 6e  *   most child n
1440: 6f 64 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74  ode. Following t
1450: 68 69 73 2c 20 66 6f 72 20 65 61 63 68 20 6c 65  his, for each le
1460: 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20 74  af page except t
1470: 68 65 20 66 69 72 73 74 2c 0a 2a 2a 20 20 20 74  he first,.**   t
1480: 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  he interior node
1490: 73 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a  s contain:.**.**
14a0: 20 20 20 20 20 61 29 20 49 66 20 74 68 65 20 6c       a) If the l
14b0: 65 61 66 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  eaf page contain
14c0: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
14d0: 65 72 6d 2c 20 74 68 65 6e 20 61 20 74 65 72 6d  erm, then a term
14e0: 2d 70 72 65 66 69 78 20 74 68 61 74 0a 2a 2a 20  -prefix that.** 
14f0: 20 20 20 20 20 20 20 69 73 20 67 72 65 61 74 65         is greate
1500: 72 20 74 68 61 6e 20 61 6c 6c 20 70 72 65 76 69  r than all previ
1510: 6f 75 73 20 74 65 72 6d 73 2c 20 61 6e 64 20 6c  ous terms, and l
1520: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1530: 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  l to the.**     
1540: 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e     first term on
1550: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e 0a   the leaf page..
1560: 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 49 66 20  **.**     b) If 
1570: 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 6f  the leaf page no
1580: 20 74 65 72 6d 73 2c 20 61 20 72 65 63 6f 72 64   terms, a record
1590: 20 69 6e 64 69 63 61 74 69 6e 67 20 68 6f 77 20   indicating how 
15a0: 6d 61 6e 79 20 63 6f 6e 73 65 63 75 74 69 76 65  many consecutive
15b0: 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61 76 65  .**        leave
15c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72  s contain no ter
15d0: 6d 73 2c 20 61 6e 64 20 77 68 65 74 68 65 72 20  ms, and whether 
15e0: 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 69 73 20  or not there is 
15f0: 61 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  an associated.**
1600: 20 20 20 20 20 20 20 20 62 79 2d 72 6f 77 69 64          by-rowid
1610: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a   index record..*
1620: 2a 0a 2a 2a 20 20 20 42 79 20 64 65 66 69 6e 69  *.**   By defini
1630: 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 6e  tion, there is n
1640: 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ever more than o
1650: 6e 65 20 74 79 70 65 20 28 62 29 20 72 65 63 6f  ne type (b) reco
1660: 72 64 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a 20  rd in a row..** 
1670: 20 20 54 79 70 65 20 28 62 29 20 72 65 63 6f 72    Type (b) recor
1680: 64 73 20 6f 6e 6c 79 20 65 76 65 72 20 61 70 70  ds only ever app
1690: 65 61 72 20 6f 6e 20 68 65 69 67 68 74 3d 31 20  ear on height=1 
16a0: 70 61 67 65 73 20 2d 20 69 6d 6d 65 64 69 61 74  pages - immediat
16b0: 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20 6f  e parents.**   o
16c0: 66 20 6c 65 61 76 65 73 2e 20 4f 6e 6c 79 20 74  f leaves. Only t
16d0: 79 70 65 20 28 61 29 20 72 65 63 6f 72 64 73 20  ype (a) records 
16e0: 61 72 65 20 70 75 73 68 65 64 20 74 6f 20 68 69  are pushed to hi
16f0: 67 68 65 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a 0a  gher levels..**.
1700: 2a 2a 20 20 20 54 65 72 6d 20 66 6f 72 6d 61 74  **   Term format
1710: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e 75  :.**.**     * Nu
1720: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1730: 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65   common with pre
1740: 76 69 6f 75 73 20 74 65 72 6d 20 70 6c 75 73 20  vious term plus 
1750: 32 2c 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  2, as a varint..
1760: 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72 20  **     * Number 
1770: 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20  of bytes of new 
1780: 74 65 72 6d 20 64 61 74 61 2c 20 61 73 20 61 20  term data, as a 
1790: 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a  varint..**     *
17a0: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2e 0a   new term data..
17b0: 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d 20  **.**   No-term 
17c0: 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  format:.**.**   
17d0: 20 20 2a 20 65 69 74 68 65 72 20 61 6e 20 30 78    * either an 0x
17e0: 30 30 20 6f 72 20 30 78 30 31 20 62 79 74 65 2e  00 or 0x01 byte.
17f0: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 30 78   If the value 0x
1800: 30 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  01 is used, then
1810: 20 74 68 65 72 65 20 0a 2a 2a 20 20 20 20 20 20   there .**      
1820: 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65   is an associate
1830: 64 20 69 6e 64 65 78 2d 62 79 2d 72 6f 77 69 64  d index-by-rowid
1840: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 20 20 20 20   record..**     
1850: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1860: 7a 65 72 6f 2d 74 65 72 6d 20 6c 65 61 76 65 73  zero-term leaves
1870: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
1880: 0a 2a 2a 20 35 2e 20 53 65 67 6d 65 6e 74 20 64  .** 5. Segment d
1890: 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 3a 0a  oclist indexes:.
18a0: 2a 2a 0a 2a 2a 20 20 20 41 20 6c 69 73 74 20 6f  **.**   A list o
18b0: 66 20 76 61 72 69 6e 74 73 20 2d 20 74 68 65 20  f varints - the 
18c0: 66 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20 65  first docid on e
18d0: 61 63 68 20 70 61 67 65 20 28 73 74 61 72 74 69  ach page (starti
18e0: 6e 67 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 20  ng with the.**  
18f0: 20 73 65 63 6f 6e 64 29 20 6f 66 20 74 68 65 20   second) of the 
1900: 64 6f 63 6c 69 73 74 2e 20 46 69 72 73 74 20 65  doclist. First e
1910: 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  lement in the li
1920: 73 74 20 69 73 20 61 20 6c 69 74 65 72 61 6c 20  st is a literal 
1930: 64 6f 63 69 64 2e 0a 2a 2a 20 20 20 45 61 63 68  docid..**   Each
1940: 20 64 6f 63 69 64 20 74 68 65 72 65 61 66 74 65   docid thereafte
1950: 72 20 69 73 20 61 20 28 6e 65 67 61 74 69 76 65  r is a (negative
1960: 29 20 64 65 6c 74 61 2e 0a 2a 2f 0a 0a 2f 2a 0a  ) delta..*/../*.
1970: 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74 68  ** Rowids for th
1980: 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20 73  e averages and s
1990: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 73  tructure records
19a0: 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74   in the %_data t
19b0: 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  able..*/.#define
19c0: 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52   FTS5_AVERAGES_R
19d0: 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f 2a  OWID     1    /*
19e0: 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72 20   Rowid used for 
19f0: 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65 63  the averages rec
1a00: 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ord */.#define F
1a10: 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
1a20: 57 49 44 28 69 49 64 78 29 20 28 31 30 20 2b 20  WID(iIdx) (10 + 
1a30: 28 69 49 64 78 29 29 20 20 20 20 20 2f 2a 20 46  (iIdx))     /* F
1a40: 6f 72 20 73 74 72 75 63 74 75 72 65 20 72 65 63  or structure rec
1a50: 6f 72 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  ords */../*.** M
1a60: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1a70: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1a80: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6e 6f 64  d by segment nod
1a90: 65 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 69 6e  es. All nodes in
1aa0: 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 73   all.** segments
1ab0: 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65 78 65 73   for all indexes
1ac0: 20 28 74 68 65 20 72 65 67 75 6c 61 72 20 46 54   (the regular FT
1ad0: 53 20 69 6e 64 65 78 20 61 6e 64 20 61 6e 79 20  S index and any 
1ae0: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 29 0a  prefix indexes).
1af0: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
1b00: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
1b10: 65 20 77 69 74 68 20 6c 61 72 67 65 20 70 6f 73  e with large pos
1b20: 69 74 69 76 65 20 72 6f 77 69 64 73 2e 0a 2a 2a  itive rowids..**
1b30: 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74  .** The %_data t
1b40: 61 62 6c 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  able may contain
1b50: 20 75 70 20 74 6f 20 28 31 3c 3c 46 54 53 35 5f   up to (1<<FTS5_
1b60: 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 5f 42 49  SEGMENT_INDEX_BI
1b70: 54 53 29 20 0a 2a 2a 20 69 6e 64 65 78 65 73 20  TS) .** indexes 
1b80: 2d 20 6f 6e 65 20 72 65 67 75 6c 61 72 20 74 65  - one regular te
1b90: 72 6d 20 69 6e 64 65 78 20 61 6e 64 20 7a 65 72  rm index and zer
1ba0: 6f 20 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78  o or more prefix
1bb0: 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a 2a 2a 20   indexes..**.** 
1bc0: 45 61 63 68 20 73 65 67 6d 65 6e 74 20 69 6e 20  Each segment in 
1bd0: 61 6e 20 69 6e 64 65 78 20 68 61 73 20 61 20 75  an index has a u
1be0: 6e 69 71 75 65 20 69 64 20 67 72 65 61 74 65 72  nique id greater
1bf0: 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a   than zero..**.*
1c00: 2a 20 45 61 63 68 20 6e 6f 64 65 20 69 6e 20 61  * Each node in a
1c10: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1c20: 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 22 70  is assigned a "p
1c30: 61 67 65 20 6e 75 6d 62 65 72 22 20 74 68 61 74  age number" that
1c40: 20 69 73 20 75 6e 69 71 75 65 0a 2a 2a 20 77 69   is unique.** wi
1c50: 74 68 69 6e 20 6e 6f 64 65 73 20 6f 66 20 69 74  thin nodes of it
1c60: 73 20 68 65 69 67 68 74 20 77 69 74 68 69 6e 20  s height within 
1c70: 74 68 65 20 73 65 67 6d 65 6e 74 20 28 6c 65 61  the segment (lea
1c80: 66 20 6e 6f 64 65 73 20 68 61 76 65 20 61 20 68  f nodes have a h
1c90: 65 69 67 68 74 20 0a 2a 2a 20 6f 66 20 30 2c 20  eight .** of 0, 
1ca0: 70 61 72 65 6e 74 73 20 31 2c 20 65 74 63 2e 29  parents 1, etc.)
1cb0: 2e 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 61  . Page numbers a
1cc0: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 65 71  re allocated seq
1cd0: 75 65 6e 74 69 61 6c 6c 79 20 73 6f 20 74 68 61  uentially so tha
1ce0: 74 0a 2a 2a 20 61 20 6e 6f 64 65 73 20 70 61 67  t.** a nodes pag
1cf0: 65 20 6e 75 6d 62 65 72 20 69 73 20 61 6c 77 61  e number is alwa
1d00: 79 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  ys one more than
1d10: 20 69 74 73 20 6c 65 66 74 20 73 69 62 6c 69 6e   its left siblin
1d20: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 77  g..**.** The row
1d30: 69 64 20 66 6f 72 20 61 20 6e 6f 64 65 20 69 73  id for a node is
1d40: 20 74 68 65 6e 20 66 6f 75 6e 64 20 75 73 69 6e   then found usin
1d50: 67 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d 45  g the FTS5_SEGME
1d60: 4e 54 5f 52 4f 57 49 44 28 29 20 6d 61 63 72 6f  NT_ROWID() macro
1d70: 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54 68 65 20 46  .** below. The F
1d80: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 2a 5f 42 49  TS5_SEGMENT_*_BI
1d90: 54 53 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65  TS macros define
1da0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1db0: 69 74 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 65  its used.** to e
1dc0: 6e 63 6f 64 65 20 74 68 65 20 74 68 72 65 65 20  ncode the three 
1dd0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1de0: 49 44 28 29 20 61 72 67 75 6d 65 6e 74 73 2e 20  ID() arguments. 
1df0: 54 68 69 73 20 6d 6f 64 75 6c 65 20 72 65 74 75  This module retu
1e00: 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  rns.** SQLITE_FU
1e10: 4c 4c 20 61 6e 64 20 66 61 69 6c 73 20 74 68 65  LL and fails the
1e20: 20 63 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69   current operati
1e30: 6f 6e 20 69 66 20 74 68 65 79 20 65 76 65 72 20  on if they ever 
1e40: 70 72 6f 76 65 20 74 6f 6f 20 73 6d 61 6c 6c 2e  prove too small.
1e50: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .*/.#define FTS5
1e60: 5f 44 41 54 41 5f 49 44 58 5f 42 20 20 20 20 20  _DATA_IDX_B     
1e70: 35 20 20 20 20 20 2f 2a 20 4d 61 78 20 6f 66 20  5     /* Max of 
1e80: 33 31 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  31 prefix indexe
1e90: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  s */.#define FTS
1ea0: 35 5f 44 41 54 41 5f 49 44 5f 42 20 20 20 20 20  5_DATA_ID_B     
1eb0: 31 36 20 20 20 20 20 2f 2a 20 4d 61 78 20 73 65  16     /* Max se
1ec0: 67 20 69 64 20 6e 75 6d 62 65 72 20 36 35 35 33  g id number 6553
1ed0: 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  5 */.#define FTS
1ee0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 20  5_DATA_HEIGHT_B 
1ef0: 20 35 20 20 20 20 20 2f 2a 20 4d 61 78 20 62 2d   5     /* Max b-
1f00: 74 72 65 65 20 68 65 69 67 68 74 20 6f 66 20 33  tree height of 3
1f10: 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  2 */.#define FTS
1f20: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 20 20  5_DATA_PAGE_B   
1f30: 33 31 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 61  31     /* Max pa
1f40: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 32 31 34  ge number of 214
1f50: 37 34 38 33 36 34 38 20 2a 2f 0a 0a 23 64 65 66  7483648 */..#def
1f60: 69 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  ine FTS5_SEGMENT
1f70: 5f 52 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69  _ROWID(idx, segi
1f80: 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  d, height, pgno)
1f90: 20 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20   (              
1fa0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28             \. ((
1fb0: 69 36 34 29 28 69 64 78 29 20 20 20 20 3c 3c 20  i64)(idx)    << 
1fc0: 28 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20  (FTS5_DATA_ID_B 
1fd0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  + FTS5_DATA_PAGE
1fe0: 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48  _B + FTS5_DATA_H
1ff0: 45 49 47 48 54 5f 42 29 29 20 2b 20 5c 0a 20 28  EIGHT_B)) + \. (
2000: 28 69 36 34 29 28 73 65 67 69 64 29 20 20 3c 3c  (i64)(segid)  <<
2010: 20 28 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45   (FTS5_DATA_PAGE
2020: 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48  _B + FTS5_DATA_H
2030: 45 49 47 48 54 5f 42 29 29 20 2b 20 20 20 20 20  EIGHT_B)) +     
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2050: 28 28 69 36 34 29 28 68 65 69 67 68 74 29 20 3c  ((i64)(height) <
2060: 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50 41 47  < (FTS5_DATA_PAG
2070: 45 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20  E_B)) +         
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 20 20 20 20 20 5c 0a                \.
20a0: 20 28 28 69 36 34 29 28 70 67 6e 6f 29 29 20 20   ((i64)(pgno))  
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20f0: 0a 29 0a 0a 23 69 66 20 46 54 53 35 5f 4d 41 58  .)..#if FTS5_MAX
2100: 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20  _PREFIX_INDEXES 
2110: 3e 20 28 28 31 3c 3c 46 54 53 35 5f 44 41 54 41  > ((1<<FTS5_DATA
2120: 5f 49 44 58 5f 42 29 2d 31 29 20 0a 23 20 65 72  _IDX_B)-1) .# er
2130: 72 6f 72 20 22 46 54 53 35 5f 4d 41 58 5f 50 52  ror "FTS5_MAX_PR
2140: 45 46 49 58 5f 49 4e 44 45 58 45 53 20 69 73 20  EFIX_INDEXES is 
2150: 74 6f 6f 20 6c 61 72 67 65 22 0a 23 65 6e 64 69  too large".#endi
2160: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 69  f../*.** The hei
2170: 67 68 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62  ght of segment b
2180: 2d 74 72 65 65 73 20 69 73 20 61 63 74 75 61 6c  -trees is actual
2190: 6c 79 20 6c 69 6d 69 74 65 64 20 74 6f 20 6f 6e  ly limited to on
21a0: 65 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20  e less than .** 
21b0: 28 31 3c 3c 48 45 49 47 48 54 5f 42 49 54 53 29  (1<<HEIGHT_BITS)
21c0: 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
21d0: 65 20 74 68 65 20 72 6f 77 69 64 20 61 64 64 72  e the rowid addr
21e0: 65 73 73 20 73 70 61 63 65 20 66 6f 72 20 6e 6f  ess space for no
21f0: 64 65 73 0a 2a 2a 20 77 69 74 68 20 73 75 63 68  des.** with such
2200: 20 61 20 68 65 69 67 68 74 20 69 73 20 75 73 65   a height is use
2210: 64 20 62 79 20 64 6f 63 6c 69 73 74 20 69 6e 64  d by doclist ind
2220: 65 78 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  exes..*/.#define
2230: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41   FTS5_SEGMENT_MA
2240: 58 5f 48 45 49 47 48 54 20 28 28 31 20 3c 3c 20  X_HEIGHT ((1 << 
2250: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 48 45 49  FTS5_SEGMENT_HEI
2260: 47 48 54 5f 42 49 54 53 29 2d 31 29 0a 0a 2f 2a  GHT_BITS)-1)../*
2270: 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f  .** The rowid fo
2280: 72 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 6e  r the doclist in
2290: 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
22a0: 69 74 68 20 6c 65 61 66 20 70 61 67 65 20 70 67  ith leaf page pg
22b0: 6e 6f 20 6f 66 20 73 65 67 6d 65 6e 74 0a 2a 2a  no of segment.**
22c0: 20 73 65 67 69 64 20 69 6e 20 69 6e 64 65 78 20   segid in index 
22d0: 69 64 78 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  idx..*/.#define 
22e0: 46 54 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58  FTS5_DOCLIST_IDX
22f0: 5f 52 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69  _ROWID(idx, segi
2300: 64 2c 20 70 67 6e 6f 29 20 5c 0a 20 20 20 20 20  d, pgno) \.     
2310: 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f     FTS5_SEGMENT_
2320: 52 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69 64  ROWID(idx, segid
2330: 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d  , FTS5_SEGMENT_M
2340: 41 58 5f 48 45 49 47 48 54 2c 20 70 67 6e 6f 29  AX_HEIGHT, pgno)
2350: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2360: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
2370: 20 66 74 73 35 43 6f 72 72 75 70 74 28 29 20 7b   fts5Corrupt() {
2380: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2390: 4f 52 52 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23  ORRUPT_VTAB; }.#
23a0: 20 64 65 66 69 6e 65 20 46 54 53 35 5f 43 4f 52   define FTS5_COR
23b0: 52 55 50 54 20 66 74 73 35 43 6f 72 72 75 70 74  RUPT fts5Corrupt
23c0: 28 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ().#else.# defin
23d0: 65 20 46 54 53 35 5f 43 4f 52 52 55 50 54 20 53  e FTS5_CORRUPT S
23e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
23f0: 41 42 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65  AB.#endif...type
2400: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 42  def struct Fts5B
2410: 74 72 65 65 49 74 65 72 20 46 74 73 35 42 74 72  treeIter Fts5Btr
2420: 65 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  eeIter;.typedef 
2430: 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65  struct Fts5Btree
2440: 49 74 65 72 4c 65 76 65 6c 20 46 74 73 35 42 74  IterLevel Fts5Bt
2450: 72 65 65 49 74 65 72 4c 65 76 65 6c 3b 0a 74 79  reeIterLevel;.ty
2460: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2470: 35 42 75 66 66 65 72 20 46 74 73 35 42 75 66 66  5Buffer Fts5Buff
2480: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2490: 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73 35  ct Fts5Data Fts5
24a0: 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73 74  Data;.typedef st
24b0: 72 75 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65  ruct Fts5MultiSe
24c0: 67 49 74 65 72 20 46 74 73 35 4d 75 6c 74 69 53  gIter Fts5MultiS
24d0: 65 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  egIter;.typedef 
24e0: 73 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49  struct Fts5NodeI
24f0: 74 65 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72  ter Fts5NodeIter
2500: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2510: 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
2520: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a  Fts5PageWriter;.
2530: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2540: 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
2550: 74 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63  t Fts5PendingDoc
2560: 6c 69 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74  list;.typedef st
2570: 72 75 63 74 20 46 74 73 35 50 65 6e 64 69 6e 67  ruct Fts5Pending
2580: 50 6f 73 6c 69 73 74 20 46 74 73 35 50 65 6e 64  Poslist Fts5Pend
2590: 69 6e 67 50 6f 73 6c 69 73 74 3b 0a 74 79 70 65  ingPoslist;.type
25a0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50  def struct Fts5P
25b0: 6f 73 49 74 65 72 20 46 74 73 35 50 6f 73 49 74  osIter Fts5PosIt
25c0: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
25d0: 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20 46  ct Fts5SegIter F
25e0: 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79 70 65  ts5SegIter;.type
25f0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2600: 65 67 57 72 69 74 65 72 20 46 74 73 35 53 65 67  egWriter Fts5Seg
2610: 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20  Writer;.typedef 
2620: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2630: 74 75 72 65 20 46 74 73 35 53 74 72 75 63 74 75  ture Fts5Structu
2640: 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  re;.typedef stru
2650: 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ct Fts5Structure
2660: 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75 63 74  Level Fts5Struct
2670: 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ureLevel;.typede
2680: 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72  f struct Fts5Str
2690: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 46 74  uctureSegment Ft
26a0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
26b0: 6e 74 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  nt;.../*.** One 
26c0: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
26d0: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
26e0: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
26f0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2700: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2710: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2720: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2730: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2740: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2750: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2760: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
2770: 20 20 69 6e 74 20 70 67 73 7a 3b 20 20 20 20 20    int pgsz;     
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 2f 2a 20 54 61 72 67 65 74 20 70 61 67 65    /* Target page
27a0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 69   size for this i
27b0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ndex */.  int nM
27c0: 69 6e 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20  inMerge;        
27d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
27e0: 69 6d 75 6d 20 69 6e 70 75 74 20 73 65 67 6d 65  imum input segme
27f0: 6e 74 73 20 69 6e 20 61 20 6d 65 72 67 65 20 2a  nts in a merge *
2800: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
2810: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2820: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2830: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2840: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2850: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2860: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2870: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2880: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2890: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
28a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
28b0: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
28c0: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28d0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28e0: 74 73 33 48 61 73 68 20 2a 61 48 61 73 68 3b 20  ts3Hash *aHash; 
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2900: 2a 20 4f 6e 65 20 68 61 73 68 20 66 6f 72 20 74  * One hash for t
2910: 65 72 6d 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61  erms, one for ea
2920: 63 68 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  ch prefix */.  i
2930: 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  nt nMaxPendingDa
2940: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ta;            /
2950: 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20 64 61  * Max pending da
2960: 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73 68 20  ta before flush 
2970: 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74  to disk */.  int
2980: 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b 20 20   nPendingData;  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a0: 43 75 72 72 65 6e 74 20 62 79 74 65 73 20 6f 66  Current bytes of
29b0: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f   pending data */
29c0: 0a 20 20 69 36 34 20 69 57 72 69 74 65 52 6f 77  .  i64 iWriteRow
29d0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
29e0: 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
29f0: 63 75 72 72 65 6e 74 20 64 6f 63 20 62 65 69 6e  current doc bein
2a00: 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20  g written */..  
2a10: 2f 2a 20 45 72 72 6f 72 20 73 74 61 74 65 2e 20  /* Error state. 
2a20: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2a50: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
2a60: 20 2f 2a 20 53 74 61 74 65 20 75 73 65 64 20 62   /* State used b
2a70: 79 20 74 68 65 20 66 74 73 35 44 61 74 61 58 58  y the fts5DataXX
2a80: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a  X() functions. *
2a90: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
2aa0: 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20 20 20   *pReader;      
2ab0: 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63 72 2d 62      /* RO incr-b
2ac0: 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25 5f 64 61  lob open on %_da
2ad0: 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ta table */.  sq
2ae0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69  lite3_stmt *pWri
2af0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ter;          /*
2b00: 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 64   "INSERT ... %_d
2b10: 61 74 61 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22  ata VALUES(?,?)"
2b20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2b30: 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b 20 20 20  mt *pDeleter;   
2b40: 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45 54 45        /* "DELETE
2b50: 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 2e 2e 2e   FROM %_data ...
2b60: 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f   id>=? AND id<=?
2b70: 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  " */.};../*.** B
2b80: 75 66 66 65 72 20 6f 62 6a 65 63 74 20 66 6f 72  uffer object for
2b90: 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
2ba0: 20 62 75 69 6c 64 69 6e 67 20 6f 66 20 73 74 72   building of str
2bb0: 69 6e 67 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72  ing data..*/.str
2bc0: 75 63 74 20 46 74 73 35 42 75 66 66 65 72 20 7b  uct Fts5Buffer {
2bd0: 0a 20 20 75 38 20 2a 70 3b 0a 20 20 69 6e 74 20  .  u8 *p;.  int 
2be0: 6e 3b 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b  n;.  int nSpace;
2bf0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e  .};../*.** A sin
2c00: 67 6c 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  gle record read 
2c10: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
2c20: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  table..*/.struct
2c30: 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20 75 38   Fts5Data {.  u8
2c40: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
2c70: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 65  er containing re
2c80: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2cb0: 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e 20 62  e of record in b
2cc0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ytes */.  int nR
2cd0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
2ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
2cf0: 20 63 6f 75 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   count */.};../*
2d00: 0a 2a 2a 20 42 65 66 6f 72 65 20 69 74 20 69 73  .** Before it is
2d10: 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65   flushed to a le
2d20: 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2c 20 74  vel-0 segment, t
2d30: 65 72 6d 20 64 61 74 61 20 69 73 20 63 6f 6c 6c  erm data is coll
2d40: 65 63 74 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  ected in.** the 
2d50: 68 61 73 68 20 74 61 62 6c 65 73 20 69 6e 20 74  hash tables in t
2d60: 68 65 20 46 74 73 35 49 6e 64 65 78 2e 61 48 61  he Fts5Index.aHa
2d70: 73 68 5b 5d 20 61 72 72 61 79 2e 20 48 61 73 68  sh[] array. Hash
2d80: 20 74 61 62 6c 65 20 6b 65 79 73 20 61 72 65 0a   table keys are.
2d90: 2a 2a 20 74 65 72 6d 73 20 28 6f 72 2c 20 66 6f  ** terms (or, fo
2da0: 72 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  r prefix indexes
2db0: 2c 20 74 65 72 6d 20 70 72 65 66 69 78 65 73 29  , term prefixes)
2dc0: 20 61 6e 64 20 76 61 6c 75 65 73 20 61 72 65 20   and values are 
2dd0: 69 6e 73 74 61 6e 63 65 73 0a 2a 2a 20 6f 66 20  instances.** of 
2de0: 74 79 70 65 20 46 74 73 35 50 65 6e 64 69 6e 67  type Fts5Pending
2df0: 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  Doclist..*/.stru
2e00: 63 74 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  ct Fts5PendingDo
2e10: 63 6c 69 73 74 20 7b 0a 20 20 75 38 20 2a 70 54  clist {.  u8 *pT
2e20: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
2e40: 6d 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79  m for this entry
2e50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2e80: 66 20 64 61 74 61 20 61 74 20 70 54 65 72 6d 20  f data at pTerm 
2e90: 2a 2f 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67  */.  Fts5Pending
2ea0: 50 6f 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69 73  Poslist *pPoslis
2eb0: 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c  t;   /* Linked l
2ec0: 69 73 74 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20  ist of position 
2ed0: 6c 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  lists */.  int i
2ee0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2f00: 6c 75 6d 6e 20 66 6f 72 20 6c 61 73 74 20 65 6e  lumn for last en
2f10: 74 72 79 20 69 6e 20 70 50 65 6e 64 69 6e 67 20  try in pPending 
2f20: 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 3b 20 20  */.  int iPos;  
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 2f 2a 20 50 6f 73 20 76 61 6c 75       /* Pos valu
2f50: 65 20 66 6f 72 20 6c 61 73 74 20 65 6e 74 72 79  e for last entry
2f60: 20 69 6e 20 70 50 65 6e 64 69 6e 67 20 2a 2f 0a   in pPending */.
2f70: 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63    Fts5PendingDoc
2f80: 6c 69 73 74 20 2a 70 4e 65 78 74 3b 20 20 20 20  list *pNext;    
2f90: 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69 6e 67    /* Used during
2fa0: 20 6d 65 72 67 65 20 73 6f 72 74 20 2a 2f 0a 7d   merge sort */.}
2fb0: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 50 65 6e  ;.struct Fts5Pen
2fc0: 64 69 6e 67 50 6f 73 6c 69 73 74 20 7b 0a 20 20  dingPoslist {.  
2fd0: 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69  /* Rowid for thi
3000: 73 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79 20  s doclist entry 
3010: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3020: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
3030: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3040: 64 6f 63 6c 69 73 74 20 63 6f 6e 74 65 6e 74 73  doclist contents
3050: 20 2a 2f 0a 20 20 46 74 73 35 50 65 6e 64 69 6e   */.  Fts5Pendin
3060: 67 50 6f 73 6c 69 73 74 20 2a 70 4e 65 78 74 3b  gPoslist *pNext;
3070: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
3080: 73 20 70 6f 73 6c 69 73 74 20 66 6f 72 20 73 61  s poslist for sa
3090: 6d 65 20 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a 2f  me term */.};../
30a0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
30b0: 73 20 6f 66 20 74 68 65 20 22 73 74 72 75 63 74  s of the "struct
30c0: 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f 72 20  ure" record for 
30d0: 65 61 63 68 20 69 6e 64 65 78 20 61 72 65 20 72  each index are r
30e0: 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a 20 75 73  epresented.** us
30f0: 69 6e 67 20 61 6e 20 46 74 73 35 53 74 72 75 63  ing an Fts5Struc
3100: 74 75 72 65 20 72 65 63 6f 72 64 20 69 6e 20 6d  ture record in m
3110: 65 6d 6f 72 79 2e 20 57 68 69 63 68 20 75 73 65  emory. Which use
3120: 73 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  s instances of t
3130: 68 65 20 0a 2a 2a 20 6f 74 68 65 72 20 46 74 73  he .** other Fts
3140: 35 53 74 72 75 63 74 75 72 65 58 58 58 20 74 79  5StructureXXX ty
3150: 70 65 73 20 61 73 20 63 6f 6d 70 6f 6e 65 6e 74  pes as component
3160: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
3170: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
3180: 74 20 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  t {.  int iSegid
3190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31a0: 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
31b0: 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 65   id */.  int nHe
31c0: 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
31d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67           /* Heig
31e0: 68 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d  ht of segment b-
31f0: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  tree */.  int pg
3200: 6e 6f 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  noFirst;        
3210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3220: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
3230: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
3240: 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  /.  int pgnoLast
3250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3260: 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66      /* Last leaf
3270: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
3280: 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 73 74  segment */.};.st
3290: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
32a0: 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69 6e 74 20  reLevel {.  int 
32b0: 6e 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20  nMerge;         
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32d0: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
32e0: 73 20 69 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20  s in incr-merge 
32f0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20  */.  int nSeg;  
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
3320: 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
3330: 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 46   on level */.  F
3340: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
3350: 65 6e 74 20 2a 61 53 65 67 3b 20 20 20 20 20 2f  ent *aSeg;     /
3360: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d 65  * Array of segme
3370: 6e 74 73 2e 20 61 53 65 67 5b 30 5d 20 69 73 20  nts. aSeg[0] is 
3380: 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d 3b 0a 73 74  oldest. */.};.st
3390: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
33a0: 72 65 20 7b 0a 20 20 75 36 34 20 6e 57 72 69 74  re {.  u64 nWrit
33b0: 65 43 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20  eCounter;       
33c0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
33d0: 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20 74  leaves written t
33e0: 6f 20 6c 65 76 65 6c 20 30 20 2a 2f 0a 20 20 69  o level 0 */.  i
33f0: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3420: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3430: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3440: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
3450: 30 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  0];   /* Array o
3460: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
3470: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
3480: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
3490: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
34a0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
34b0: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
34c0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
34d0: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
34e0: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3500: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3510: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3520: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
3550: 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61 20  ining page data 
3560: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3570: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
3580: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
3590: 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
35a0: 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  us term on page 
35b0: 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74  */.};..struct Ft
35c0: 73 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20  s5SegWriter {.  
35d0: 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74  /* Index to writ
3600: 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 53  e to */.  int iS
3610: 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  egid;           
3620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
3630: 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  id to write to *
3640: 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 72 3b  /.  int nWriter;
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3670: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 57 72 69   entries in aWri
3680: 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  ter */.  Fts5Pag
3690: 65 57 72 69 74 65 72 20 2a 61 57 72 69 74 65 72  eWriter *aWriter
36a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ;        /* Arra
36b0: 79 20 6f 66 20 50 61 67 65 57 72 69 74 65 72 20  y of PageWriter 
36c0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 36 34  objects */.  i64
36d0: 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20 20 20   iPrevRowid;    
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36f0: 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 77  Previous docid w
3700: 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72 65 6e  ritten to curren
3710: 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38 20 62  t leaf */.  u8 b
3720: 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
3730: 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ist;        /* T
3740: 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69  rue if next rowi
3750: 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 64 6f  d is first in do
3760: 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62 46  clist */.  u8 bF
3770: 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3b  irstRowidInPage;
3780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3790: 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69 64  ue if next rowid
37a0: 20 69 73 20 66 69 72 73 74 20 69 6e 20 70 61 67   is first in pag
37b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  e */.  int nLeaf
37c0: 57 72 69 74 74 65 6e 3b 20 20 20 20 20 20 20 20  Written;        
37d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37e0: 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 77   of leaf pages w
37f0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
3800: 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20  nEmpty;         
3810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3820: 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74 69 67 75  umber of contigu
3830: 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f  ous term-less no
3840: 64 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  des */.};../*.**
3850: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
3860: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
3870: 65 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73  e merged results
3880: 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   of one or more 
3890: 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73  segments,.** vis
38a0: 69 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f  iting each term/
38b0: 64 6f 63 69 64 20 70 61 69 72 20 69 6e 20 74 68  docid pair in th
38c0: 65 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a  e merged data..*
38d0: 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77  *.** nSeg is alw
38e0: 61 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74  ays a power of t
38f0: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
3900: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
3910: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67  number of.** seg
3920: 6d 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20  ments that this 
3930: 6f 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e  object is mergin
3940: 67 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74  g data from. Bot
3950: 68 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64  h the aSeg[] and
3960: 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72  .** aFirst[] arr
3970: 61 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74  ays are sized at
3980: 20 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54   nSeg entries. T
3990: 68 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20  he aSeg[] array 
39a0: 69 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74  is padded.** wit
39b0: 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73  h zeroed objects
39c0: 20 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e   - these are han
39d0: 64 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20  dled as if they 
39e0: 77 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f  were iterators o
39f0: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74  pened.** on empt
3a00: 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  y segments..**.*
3a10: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
3a20: 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65   comparing segme
3a30: 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20  nts aSeg[N] and 
3a40: 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65  aSeg[N+1], where
3a50: 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e   N is an.** even
3a60: 20 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72   number, is stor
3a70: 65 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53  ed in aFirst[(nS
3a80: 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72  eg+N)/2]. The "r
3a90: 65 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a  esult" of the .*
3aa0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  * comparison in 
3ab0: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20  this context is 
3ac0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
3ad0: 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63   iterator that c
3ae0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
3af0: 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65  ts to the smalle
3b00: 72 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d  r term/rowid com
3b10: 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74  bination. Iterat
3b20: 6f 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a  ors at EOF are.*
3b30: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
3b40: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
3b50: 61 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74  all other iterat
3b60: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73  ors..**.** aFirs
3b70: 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68  t[1] contains th
3b80: 65 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b  e index in aSeg[
3b90: 5d 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  ] of the iterato
3ba0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
3bb0: 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  .** the smallest
3bc0: 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46   key overall. aF
3bd0: 69 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65  irst[0] is unuse
3be0: 64 2e 20 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  d. .*/.struct Ft
3bf0: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 7b  s5MultiSegIter {
3c00: 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20 20  .  int nSeg;    
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53     /* Size of aS
3c30: 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  eg[] array */.  
3c40: 46 74 73 35 53 65 67 49 74 65 72 20 2a 61 53 65  Fts5SegIter *aSe
3c50: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
3c60: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
3c70: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
3c80: 0a 20 20 75 31 36 20 2a 61 46 69 72 73 74 3b 20  .  u16 *aFirst; 
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65     /* Current me
3cb0: 72 67 65 20 73 74 61 74 65 20 28 73 65 65 20 61  rge state (see a
3cc0: 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  bove) */.};../*.
3cd0: 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74  ** Object for it
3ce0: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
3cf0: 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74  a single segment
3d00: 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63 68 20  , visiting each 
3d10: 74 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a 20 70 61  term/docid.** pa
3d20: 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  ir in the segmen
3d30: 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a 2a  t..**.** pSeg:.*
3d40: 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74 20  *   The segment 
3d50: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
3d60: 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 50  gh..**.** iLeafP
3d70: 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65 6e  gno:.**   Curren
3d80: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
3d90: 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e  er within segmen
3da0: 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f 66  t..**.** iLeafOf
3db0: 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65 20  fset:.**   Byte 
3dc0: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68  offset within th
3dd0: 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 74  e current leaf t
3de0: 68 61 74 20 69 73 20 6f 6e 65 20 62 79 74 65 20  hat is one byte 
3df0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
3e00: 74 68 65 0a 2a 2a 20 20 20 72 6f 77 69 64 20 66  the.**   rowid f
3e10: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
3e20: 65 6e 74 20 65 6e 74 72 79 2e 20 55 73 75 61 6c  ent entry. Usual
3e30: 6c 79 20 74 68 69 73 20 69 73 20 74 68 65 20 66  ly this is the f
3e40: 69 72 73 74 20 62 79 74 65 20 6f 66 20 0a 2a 2a  irst byte of .**
3e50: 20 20 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20     the position 
3e60: 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65 20 65  list data. The e
3e70: 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74  xception is if t
3e80: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
3e90: 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 20 20 65   current .**   e
3ea0: 6e 74 72 79 20 69 73 20 74 68 65 20 6c 61 73 74  ntry is the last
3eb0: 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65   thing on the le
3ec0: 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  af page..**.** p
3ed0: 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66 66 65  Leaf:.**   Buffe
3ee0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72  r containing cur
3ef0: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 64  rent leaf page d
3f00: 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55 4c 4c  ata. Set to NULL
3f10: 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69   at EOF..**.** i
3f20: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 69 54  TermLeafPgno, iT
3f30: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a  ermLeafOffset:.*
3f40: 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20 6e 75  *   Leaf page nu
3f50: 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mber containing 
3f60: 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 72 65  the last term re
3f70: 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d  ad from the segm
3f80: 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20 74 68  ent. And.**   th
3f90: 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64 69 61  e offset immedia
3fa0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
3fb0: 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2f  he term data..*/
3fc0: 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67 49  .struct Fts5SegI
3fd0: 74 65 72 20 7b 0a 20 20 46 74 73 35 53 74 72 75  ter {.  Fts5Stru
3fe0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
3ff0: 65 67 3b 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg;     /* Segme
4000: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
4010: 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 69  rough */.  int i
4020: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
4030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
4040: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
4050: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
4060: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
4070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4080: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
4090: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  af page number *
40a0: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  /.  Fts5Data *pL
40b0: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
40c0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
40d0: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  eaf data */.  in
40e0: 74 20 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  t iLeafOffset;  
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4100: 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74   Byte offset wit
4110: 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66  hin current leaf
4120: 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 54 65 72 6d   */..  int iTerm
4130: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
4140: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
4150: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
4160: 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64   populated based
4170: 20 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72   on current entr
4180: 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  y. */.  Fts5Buff
4190: 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
41a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
41b0: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34  nt term */.  i64
41c0: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41e0: 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f  Current rowid */
41f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
4200: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
4210: 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c 65  through a single
4220: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 0a   position list..
4230: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f  */.struct Fts5Po
4240: 73 49 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61  sIter {.  Fts5Da
4250: 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
4260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4270: 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 2e 20  rent leaf data. 
4280: 4e 55 4c 4c 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a  NULL -> EOF. */.
4290: 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64    i64 iLeafRowid
42a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
42b0: 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 72 6f    /* Absolute ro
42c0: 77 69 64 20 6f 66 20 63 75 72 72 65 6e 74 20 6c  wid of current l
42d0: 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  eaf */.  int iLe
42e0: 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  afOffset;       
42f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4300: 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69  ent offset withi
4310: 6e 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 69 6e 74  n leaf */..  int
4320: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 50 6f   iCol;.  int iPo
4330: 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  s;.};../*.** Obj
4340: 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e  ect for iteratin
4350: 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  g through the co
4360: 6e 65 6e 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  nents of a singl
4370: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
4380: 69 6e 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a  in .** memory..*
4390: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4e 6f 64  /.struct Fts5Nod
43a0: 65 49 74 65 72 20 7b 0a 20 20 2f 2a 20 49 6e 74  eIter {.  /* Int
43b0: 65 72 6e 61 6c 2e 20 53 65 74 20 61 6e 64 20 6d  ernal. Set and m
43c0: 61 6e 61 67 65 64 20 62 79 20 66 74 73 35 4e 6f  anaged by fts5No
43d0: 64 65 49 74 65 72 58 58 58 28 29 20 66 75 6e 63  deIterXXX() func
43e0: 74 69 6f 6e 73 2e 20 45 78 63 65 70 74 2c 20 0a  tions. Except, .
43f0: 20 20 2a 2a 20 74 68 65 20 45 4f 46 20 74 65 73    ** the EOF tes
4400: 74 20 66 6f 72 20 74 68 65 20 69 74 65 72 61 74  t for the iterat
4410: 6f 72 20 69 73 20 28 46 74 73 35 4e 6f 64 65 49  or is (Fts5NodeI
4420: 74 65 72 2e 61 44 61 74 61 3d 3d 30 29 2e 20 20  ter.aData==0).  
4430: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
4440: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74  Data;.  int nDat
4450: 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  a;.  int iOff;..
4460: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
4470: 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  ables */.  Fts5B
4480: 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e  uffer term;.  in
4490: 74 20 6e 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20  t nEmpty;.  int 
44a0: 69 43 68 69 6c 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  iChild;.};../*.*
44b0: 2a 20 41 6e 20 46 74 73 35 42 74 72 65 65 49 74  * An Fts5BtreeIt
44c0: 65 72 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  er object is use
44d0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
44e0: 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73  ough all entries
44f0: 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65   in the.** b-tre
4500: 65 20 68 69 65 72 61 72 63 68 79 20 62 65 6c 6f  e hierarchy belo
4510: 6e 67 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  nging to a singl
4520: 65 20 66 74 73 35 20 73 65 67 6d 65 6e 74 2e 20  e fts5 segment. 
4530: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
4540: 0a 2a 2a 20 22 62 2d 74 72 65 65 20 68 69 65 72  .** "b-tree hier
4550: 61 72 63 68 79 22 20 69 73 20 61 6c 6c 20 62 2d  archy" is all b-
4560: 74 72 65 65 20 6e 6f 64 65 73 20 65 78 63 65 70  tree nodes excep
4570: 74 20 6c 65 61 76 65 73 2e 20 45 61 63 68 20 65  t leaves. Each e
4580: 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62  ntry in the.** b
4590: 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
45a0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
45b0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
45c0: 20 20 20 69 4c 65 61 66 3a 20 20 54 68 65 20 70     iLeaf:  The p
45d0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
45e0: 65 20 6c 65 61 66 20 70 61 67 65 20 74 68 65 20  e leaf page the 
45f0: 65 6e 74 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e  entry points to.
4600: 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20  .**.**   term:  
4610: 20 41 20 73 70 6c 69 74 2d 6b 65 79 20 74 68 61   A split-key tha
4620: 74 20 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c  t all terms on l
4630: 65 61 66 20 70 61 67 65 20 24 6c 65 61 66 20 6d  eaf page $leaf m
4640: 75 73 74 20 62 65 20 67 72 65 61 74 65 72 0a 2a  ust be greater.*
4650: 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 61 6e  *           than
4660: 20 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20 54 68   or equal to. Th
4670: 65 20 22 74 65 72 6d 22 20 61 73 73 6f 63 69 61  e "term" associa
4680: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
4690: 73 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20  st b-tree.**    
46a0: 20 20 20 20 20 20 20 68 69 65 72 61 72 63 68 79         hierarchy
46b0: 20 65 6e 74 72 79 20 28 74 68 65 20 6f 6e 65 20   entry (the one 
46c0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c  that points to l
46d0: 65 61 66 20 70 61 67 65 20 31 29 20 69 73 20 61  eaf page 1) is a
46e0: 6c 77 61 79 73 20 0a 2a 2a 20 20 20 20 20 20 20  lways .**       
46f0: 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72      an empty str
4700: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d  ing..**.**   nEm
4710: 70 74 79 3a 20 54 68 65 20 6e 75 6d 62 65 72 20  pty: The number 
4720: 6f 66 20 65 6d 70 74 79 20 28 74 65 72 6d 6c 65  of empty (termle
4730: 73 73 29 20 6c 65 61 66 20 70 61 67 65 73 20 74  ss) leaf pages t
4740: 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  hat immediately.
4750: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c  **           fol
4760: 6c 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a  lowing iLeaf..**
4770: 0a 2a 2a 20 54 68 65 20 46 74 73 35 42 74 72 65  .** The Fts5Btre
4780: 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20  eIter object is 
4790: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
47a0: 74 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69  t of the integri
47b0: 74 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a  ty-check code..*
47c0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 42 74 72  /.struct Fts5Btr
47d0: 65 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20  eeIterLevel {.  
47e0: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 3b 20  Fts5NodeIter s; 
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
4810: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
4820: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
4830: 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
4840: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
4850: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  r the current no
4860: 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  de */.};.struct 
4870: 46 74 73 35 42 74 72 65 65 49 74 65 72 20 7b 0a  Fts5BtreeIter {.
4880: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20    Fts5Index *p; 
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48a0: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
48b0: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
48c0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
48d0: 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a  nt *pSeg;     /*
48e0: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
48f0: 20 74 68 69 73 20 73 65 67 6d 65 6e 74 27 73 20   this segment's 
4900: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
4910: 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
4920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
4930: 6e 64 65 78 20 70 53 65 67 20 62 65 6c 6f 6e 67  ndex pSeg belong
4940: 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  s to */.  int nL
4950: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
4960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4970: 65 20 6f 66 20 61 4c 76 6c 5b 5d 20 61 72 72 61  e of aLvl[] arra
4980: 79 20 2a 2f 0a 20 20 46 74 73 35 42 74 72 65 65  y */.  Fts5Btree
4990: 49 74 65 72 4c 65 76 65 6c 20 2a 61 4c 76 6c 3b  IterLevel *aLvl;
49a0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
49b0: 66 6f 72 20 65 61 63 68 20 74 69 65 72 20 6f 66  for each tier of
49c0: 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 2f 2a   b-tree */..  /*
49d0: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
49e0: 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
49f0: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
4a00: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4a10: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  t term */.  int 
4a20: 69 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  iLeaf;          
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4a40: 65 61 66 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  eaf containing t
4a50: 65 72 6d 73 20 3e 3d 20 63 75 72 72 65 6e 74 20  erms >= current 
4a60: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  term */.  int nE
4a70: 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  mpty;           
4a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4a90: 62 65 72 20 6f 66 20 22 65 6d 70 74 79 22 20 6c  ber of "empty" l
4aa0: 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
4ab0: 69 4c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 62  iLeaf */.  int b
4ac0: 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Eof;            
4ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
4ae0: 74 20 74 6f 20 74 72 75 65 20 61 74 20 45 4f 46  t to true at EOF
4af0: 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76   */.};..static v
4b00: 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28 75  oid fts5PutU16(u
4b10: 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56 61  8 *aOut, u16 iVa
4b20: 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d 20  l){.  aOut[0] = 
4b30: 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f 75  (iVal>>8);.  aOu
4b40: 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78 46  t[1] = (iVal&0xF
4b50: 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 31  F);.}..static u1
4b60: 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f 6e  6 fts5GetU16(con
4b70: 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20 72  st u8 *aIn){.  r
4b80: 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e 5b  eturn ((u16)aIn[
4b90: 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b 31  0] << 8) + aIn[1
4ba0: 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ];.}../*.** Allo
4bb0: 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
4bc0: 61 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73  a buffer at leas
4bd0: 74 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  t nByte bytes in
4be0: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
4bf0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
4c00: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72 65 74  encountered, ret
4c10: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73 65 74  urn NULL and set
4c20: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
4c30: 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35 49 6e  in.** the Fts5In
4c40: 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73 73 65  dex handle passe
4c50: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
4c60: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
4c70: 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49 64 78  ic void *fts5Idx
4c80: 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64 65 78  Malloc(Fts5Index
4c90: 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b   *p, int nByte){
4ca0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
4cb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
4cc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
4cd0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ret = sqlite3_ma
4ce0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69  lloc(nByte);.  i
4cf0: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
4d00: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
4d10: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
4d20: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74  .    memset(pRet
4d30: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  , 0, nByte);.  }
4d40: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
4d50: 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  }...static int f
4d60: 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 69 6e  ts5BufferGrow(in
4d70: 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
4d80: 65 72 20 2a 70 42 75 66 2c 20 69 6e 74 20 6e 42  er *pBuf, int nB
4d90: 79 74 65 29 7b 0a 20 20 2f 2a 20 41 20 6e 6f 2d  yte){.  /* A no-
4da0: 6f 70 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  op if an error h
4db0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
4dc0: 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 2a 70 52  red */.  if( *pR
4dd0: 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  c ) return 1;.. 
4de0: 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
4df0: 6e 42 79 74 65 29 20 3e 20 70 42 75 66 2d 3e 6e  nByte) > pBuf->n
4e00: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 75 38 20  Space ){.    u8 
4e10: 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
4e20: 4e 65 77 20 3d 20 70 42 75 66 2d 3e 6e 53 70 61  New = pBuf->nSpa
4e30: 63 65 20 3f 20 70 42 75 66 2d 3e 6e 53 70 61 63  ce ? pBuf->nSpac
4e40: 65 2a 32 20 3a 20 36 34 3b 0a 20 20 20 20 77 68  e*2 : 64;.    wh
4e50: 69 6c 65 28 20 6e 4e 65 77 3c 28 70 42 75 66 2d  ile( nNew<(pBuf-
4e60: 3e 6e 20 2b 20 6e 42 79 74 65 29 20 29 7b 0a 20  >n + nByte) ){. 
4e70: 20 20 20 20 20 6e 4e 65 77 20 3d 20 6e 4e 65 77       nNew = nNew
4e80: 20 2a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20   * 2;.    }.    
4e90: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
4ea0: 65 61 6c 6c 6f 63 28 70 42 75 66 2d 3e 70 2c 20  ealloc(pBuf->p, 
4eb0: 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 70  nNew);.    if( p
4ec0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
4ed0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
4ee0: 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  MEM;.      retur
4ef0: 6e 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 1;.    }else{.
4f00: 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 53 70 61        pBuf->nSpa
4f10: 63 65 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ce = nNew;.     
4f20: 20 70 42 75 66 2d 3e 70 20 3d 20 70 4e 65 77 3b   pBuf->p = pNew;
4f30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4f40: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4f50: 45 6e 63 6f 64 65 20 76 61 6c 75 65 20 69 56 61  Encode value iVa
4f60: 6c 20 61 73 20 61 6e 20 53 51 4c 69 74 65 20 76  l as an SQLite v
4f70: 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64  arint and append
4f80: 20 69 74 20 74 6f 20 74 68 65 20 62 75 66 66 65   it to the buffe
4f90: 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 70 42 75 66  r object.** pBuf
4fa0: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
4fb0: 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
4fc0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  e error code in 
4fd0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
4fe0: 64 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65  d fts5BufferAppe
4ff0: 6e 64 56 61 72 69 6e 74 28 69 6e 74 20 2a 70 52  ndVarint(int *pR
5000: 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
5010: 42 75 66 2c 20 69 36 34 20 69 56 61 6c 29 7b 0a  Buf, i64 iVal){.
5020: 20 20 69 66 28 20 66 74 73 35 42 75 66 66 65 72    if( fts5Buffer
5030: 47 72 6f 77 28 70 52 63 2c 20 70 42 75 66 2c 20  Grow(pRc, pBuf, 
5040: 39 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  9) ) return;.  p
5050: 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
5060: 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66  3PutVarint(&pBuf
5070: 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 56  ->p[pBuf->n], iV
5080: 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  al);.}../*.** Ap
5090: 70 65 6e 64 20 62 75 66 66 65 72 20 6e 44 61 74  pend buffer nDat
50a0: 61 2f 70 44 61 74 61 20 74 6f 20 62 75 66 66 65  a/pData to buffe
50b0: 72 20 70 42 75 66 2e 20 49 66 20 61 6e 20 4f 4f  r pBuf. If an OO
50c0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
50d0: 73 65 74 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f  set .** the erro
50e0: 72 20 63 6f 64 65 20 69 6e 20 70 2e 20 49 66 20  r code in p. If 
50f0: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
5100: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
5110: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
5120: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  .** is called, i
5130: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
5140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
5150: 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
5160: 62 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20  b(.  int *pRc,. 
5170: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
5180: 66 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c  f, .  int nData,
5190: 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44   .  const u8 *pD
51a0: 61 74 61 0a 29 7b 0a 20 20 69 66 28 20 66 74 73  ata.){.  if( fts
51b0: 35 42 75 66 66 65 72 47 72 6f 77 28 70 52 63 2c  5BufferGrow(pRc,
51c0: 20 70 42 75 66 2c 20 6e 44 61 74 61 29 20 29 20   pBuf, nData) ) 
51d0: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79  return;.  memcpy
51e0: 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
51f0: 6e 5d 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  n], pData, nData
5200: 29 3b 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20  );.  pBuf->n += 
5210: 6e 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nData;.}../*.** 
5220: 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6c 2d 74  Append the nul-t
5230: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
5240: 20 7a 53 74 72 20 74 6f 20 74 68 65 20 62 75 66   zStr to the buf
5250: 66 65 72 20 70 42 75 66 2e 20 54 68 69 73 20 66  fer pBuf. This f
5260: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65 6e 73 75 72  unction.** ensur
5270: 65 73 20 74 68 61 74 20 74 68 65 20 62 79 74 65  es that the byte
5280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62   following the b
5290: 75 66 66 65 72 20 64 61 74 61 20 69 73 20 73 65  uffer data is se
52a0: 74 20 74 6f 20 30 78 30 30 2c 20 65 76 65 6e 20  t to 0x00, even 
52b0: 0a 2a 2a 20 74 68 6f 75 67 68 20 74 68 69 73 20  .** though this 
52c0: 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c  byte is not incl
52d0: 75 64 65 64 20 69 6e 20 74 68 65 20 70 42 75 66  uded in the pBuf
52e0: 2d 3e 6e 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 73 74  ->n count..*/.st
52f0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 75  atic void fts5Bu
5300: 66 66 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67  fferAppendString
5310: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20  (.  int *pRc,.  
5320: 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
5330: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
5340: 2a 7a 53 74 72 0a 29 7b 0a 20 20 69 6e 74 20 6e  *zStr.){.  int n
5350: 53 74 72 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74  Str = strlen(zSt
5360: 72 29 3b 0a 20 20 69 66 28 20 66 74 73 35 42 75  r);.  if( fts5Bu
5370: 66 66 65 72 47 72 6f 77 28 70 52 63 2c 20 70 42  fferGrow(pRc, pB
5380: 75 66 2c 20 6e 53 74 72 2b 31 29 20 29 20 72 65  uf, nStr+1) ) re
5390: 74 75 72 6e 3b 0a 20 20 66 74 73 35 42 75 66 66  turn;.  fts5Buff
53a0: 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63  erAppendBlob(pRc
53b0: 2c 20 70 42 75 66 2c 20 6e 53 74 72 2c 20 28 63  , pBuf, nStr, (c
53c0: 6f 6e 73 74 20 75 38 2a 29 7a 53 74 72 29 3b 0a  onst u8*)zStr);.
53d0: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
53e0: 54 45 5f 4f 4b 20 29 20 70 42 75 66 2d 3e 70 5b  TE_OK ) pBuf->p[
53f0: 70 42 75 66 2d 3e 6e 5d 20 3d 20 30 78 30 30 3b  pBuf->n] = 0x00;
5400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
5410: 6e 74 20 7a 46 6d 74 20 69 73 20 61 20 70 72 69  nt zFmt is a pri
5420: 6e 74 66 28 29 20 73 74 79 6c 65 20 66 6f 72 6d  ntf() style form
5430: 61 74 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20  at string. This 
5440: 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
5450: 73 0a 2a 2a 20 74 68 65 20 70 72 69 6e 74 66 28  s.** the printf(
5460: 29 20 73 74 79 6c 65 20 70 72 6f 63 65 73 73 69  ) style processi
5470: 6e 67 2c 20 74 68 65 6e 20 61 70 70 65 6e 64 73  ng, then appends
5480: 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
5490: 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
54a0: 2a 2a 20 4c 69 6b 65 20 66 74 73 35 42 75 66 66  ** Like fts5Buff
54b0: 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28 29  erAppendString()
54c0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
54d0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
54e0: 20 62 79 74 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77   byte .** follow
54f0: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 64  ing the buffer d
5500: 61 74 61 20 69 73 20 73 65 74 20 74 6f 20 30 78  ata is set to 0x
5510: 30 30 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  00, even though 
5520: 74 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74  this byte is not
5530: 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20  .** included in 
5540: 74 68 65 20 70 42 75 66 2d 3e 6e 20 63 6f 75 6e  the pBuf->n coun
5550: 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  t..*/ .static vo
5560: 69 64 20 66 74 73 35 42 75 66 66 65 72 41 70 70  id fts5BufferApp
5570: 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 69 6e 74  endPrintf(.  int
5580: 20 2a 70 52 63 2c 0a 20 20 46 74 73 35 42 75 66   *pRc,.  Fts5Buf
5590: 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 63 68  fer *pBuf, .  ch
55a0: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 0a 29 7b  ar *zFmt, ....){
55b0: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
55c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68  ITE_OK ){.    ch
55d0: 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 20 20 76 61  ar *zTmp;.    va
55e0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61  _list ap;.    va
55f0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
5600: 3b 0a 20 20 20 20 7a 54 6d 70 20 3d 20 73 71 6c  ;.    zTmp = sql
5610: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
5620: 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  mt, ap);.    va_
5630: 65 6e 64 28 61 70 29 3b 0a 0a 20 20 20 20 69 66  end(ap);..    if
5640: 28 20 7a 54 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  ( zTmp==0 ){.   
5650: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
5660: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
5670: 65 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  e{.      fts5Buf
5680: 66 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28  ferAppendString(
5690: 70 52 63 2c 20 70 42 75 66 2c 20 7a 54 6d 70 29  pRc, pBuf, zTmp)
56a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
56b0: 66 72 65 65 28 7a 54 6d 70 29 3b 0a 20 20 20 20  free(zTmp);.    
56c0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
56d0: 72 65 65 20 61 6e 79 20 62 75 66 66 65 72 20 61  ree any buffer a
56e0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 70 42 75 66  llocated by pBuf
56f0: 2e 20 5a 65 72 6f 20 74 68 65 20 73 74 72 75 63  . Zero the struc
5700: 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75  ture before retu
5710: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
5720: 20 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72   void fts5Buffer
5730: 46 72 65 65 28 46 74 73 35 42 75 66 66 65 72 20  Free(Fts5Buffer 
5740: 2a 70 42 75 66 29 7b 0a 20 20 73 71 6c 69 74 65  *pBuf){.  sqlite
5750: 33 5f 66 72 65 65 28 70 42 75 66 2d 3e 70 29 3b  3_free(pBuf->p);
5760: 0a 20 20 6d 65 6d 73 65 74 28 70 42 75 66 2c 20  .  memset(pBuf, 
5770: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
5780: 66 66 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffer));.}../*.**
5790: 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e   Zero the conten
57a0: 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
57b0: 20 6f 62 6a 65 63 74 2e 20 42 75 74 20 64 6f 20   object. But do 
57c0: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 73 73  not free the ass
57d0: 6f 63 69 61 74 65 64 20 0a 2a 2a 20 6d 65 6d 6f  ociated .** memo
57e0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ry allocation..*
57f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
5800: 73 35 42 75 66 66 65 72 5a 65 72 6f 28 46 74 73  s5BufferZero(Fts
5810: 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
5820: 20 20 70 42 75 66 2d 3e 6e 20 3d 20 30 3b 0a 7d    pBuf->n = 0;.}
5830: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5840: 62 75 66 66 65 72 20 74 6f 20 63 6f 6e 74 61 69  buffer to contai
5850: 6e 20 6e 44 61 74 61 2f 70 44 61 74 61 2e 20 49  n nData/pData. I
5860: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
5870: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 0a  ccurs, leave an.
5880: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
5890: 65 20 69 6e 20 70 2e 20 49 66 20 61 6e 20 65 72  e in p. If an er
58a0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
58b0: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
58c0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
58d0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
58e0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
58f0: 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66  ic void fts5Buff
5900: 65 72 53 65 74 28 0a 20 20 69 6e 74 20 2a 70 52  erSet(.  int *pR
5910: 63 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  c,.  Fts5Buffer 
5920: 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 6e 44  *pBuf, .  int nD
5930: 61 74 61 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ata, .  const u8
5940: 20 2a 70 44 61 74 61 0a 29 7b 0a 20 20 70 42 75   *pData.){.  pBu
5950: 66 2d 3e 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35  f->n = 0;.  fts5
5960: 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
5970: 28 70 52 63 2c 20 70 42 75 66 2c 20 6e 44 61 74  (pRc, pBuf, nDat
5980: 61 2c 20 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  a, pData);.}../*
5990: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
59a0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
59b0: 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e  two buffers usin
59c0: 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f  g memcmp(). If o
59d0: 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20  ne buffer.** is 
59e0: 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
59f0: 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e  other, it is con
5a00: 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73 73  sidered the less
5a10: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
5a20: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
5a30: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
5a40: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
5a50: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
5a60: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
5a70: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
5a80: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
5a90: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
5aa0: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
5ab0: 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20  Right.*/.static 
5ac0: 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f  int fts5BufferCo
5ad0: 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65 72  mpare(Fts5Buffer
5ae0: 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66   *pLeft, Fts5Buf
5af0: 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  fer *pRight){.  
5b00: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
5b10: 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d  Left->n, pRight-
5b20: 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  >n);.  int res =
5b30: 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70   memcmp(pLeft->p
5b40: 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d  , pRight->p, nCm
5b50: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
5b60: 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e  s==0 ? (pLeft->n
5b70: 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20   - pRight->n) : 
5b80: 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  res);.}.../*.** 
5b90: 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d 6f  Close the read-o
5ba0: 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c  nly blob handle,
5bb0: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a   if it is open..
5bc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
5bd0: 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 46  ts5CloseReader(F
5be0: 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
5bf0: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29  if( p->pReader )
5c00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  {.    sqlite3_bl
5c10: 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 52 65 61  ob_close(p->pRea
5c20: 64 65 72 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65  der);.    p->pRe
5c30: 61 64 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  ader = 0;.  }.}.
5c40: 0a 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61  .static Fts5Data
5c50: 20 2a 66 74 73 35 44 61 74 61 52 65 61 64 4f 72   *fts5DataReadOr
5c60: 42 75 66 66 65 72 28 0a 20 20 46 74 73 35 49 6e  Buffer(.  Fts5In
5c70: 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42  dex *p, .  Fts5B
5c80: 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20  uffer *pBuf, .  
5c90: 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20  i64 iRowid.){.  
5ca0: 46 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d  Fts5Data *pRet =
5cb0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
5cc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5cd0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f    int rc;..    /
5ce0: 2a 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61  * If the blob ha
5cf0: 6e 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  ndle is not yet 
5d00: 6f 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73  open, open and s
5d10: 65 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73  eek it. Otherwis
5d20: 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  e, use.    ** th
5d30: 65 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20  e blob_reopen() 
5d40: 41 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68  API to reseek th
5d50: 65 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20  e existing blob 
5d60: 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  handle.  */.    
5d70: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d  if( p->pReader==
5d80: 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  0 ){.      Fts5C
5d90: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
5da0: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
5db0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
5dc0: 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
5dd0: 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20  g->db, .        
5de0: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
5df0: 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c  p->zDataTbl, "bl
5e00: 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c  ock", iRowid, 0,
5e10: 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20   &p->pReader.   
5e20: 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     );.    }else{
5e30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5e40: 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28  te3_blob_reopen(
5e50: 70 2d 3e 70 52 65 61 64 65 72 2c 20 69 52 6f 77  p->pReader, iRow
5e60: 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
5e70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5e80: 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
5e90: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
5ea0: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65  lob_bytes(p->pRe
5eb0: 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ader);.      if(
5ec0: 20 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20   pBuf ){.       
5ed0: 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
5ee0: 70 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  pBuf);.        f
5ef0: 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 72  ts5BufferGrow(&r
5f00: 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  c, pBuf, nByte);
5f10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
5f20: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
5f30: 70 2d 3e 70 52 65 61 64 65 72 2c 20 70 42 75 66  p->pReader, pBuf
5f40: 2d 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  ->p, nByte, 0);.
5f50: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
5f60: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 42 75 66  SQLITE_OK ) pBuf
5f70: 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ->n = nByte;.   
5f80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5f90: 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61    pRet = (Fts5Da
5fa0: 74 61 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  ta*)fts5IdxMallo
5fb0: 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
5fc0: 44 61 74 61 29 20 2b 20 6e 42 79 74 65 29 3b 0a  Data) + nByte);.
5fd0: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 52 65          if( !pRe
5fe0: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
5ff0: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20 3d         pRet->n =
6000: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
6010: 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26  pRet->p = (u8*)&
6020: 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pRet[1];.       
6030: 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b   pRet->nRef = 1;
6040: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
6050: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
6060: 70 2d 3e 70 52 65 61 64 65 72 2c 20 70 52 65 74  p->pReader, pRet
6070: 2d 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  ->p, nByte, 0);.
6080: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
6090: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
60a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
60b0: 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ree(pRet);.     
60c0: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
60d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
60e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63  .    }.    p->rc
60f0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65   = rc;.  }..  re
6100: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
6110: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72  .** Retrieve a r
6120: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
6130: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
6140: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
6150: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
6160: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
6170: 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65  rror left in the
6180: 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f   .** Fts5Index o
6190: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
61a0: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
61b0: 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65  ataRead(Fts5Inde
61c0: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
61d0: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
61e0: 52 65 74 20 3d 20 66 74 73 35 44 61 74 61 52 65  Ret = fts5DataRe
61f0: 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c  adOrBuffer(p, 0,
6200: 20 69 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65   iRowid);.  asse
6210: 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28  rt( (pRet==0)==(
6220: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6230: 29 20 29 3b 0a 61 73 73 65 72 74 28 20 70 52 65  ) );.assert( pRe
6240: 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  t );.  return pR
6250: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  et;.}../*.** Rea
6260: 64 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  d a record from 
6270: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
6280: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
6290: 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
62a0: 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  .** second argum
62b0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ent..**.** If an
62c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
62d0: 6e 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20  n error is left 
62e0: 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  in the Fts5Index
62f0: 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a   object. If an.*
6300: 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  * error has alre
6310: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
6320: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
6330: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
6340: 20 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f   a .** no-op..*/
6350: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6360: 35 44 61 74 61 42 75 66 66 65 72 28 46 74 73 35  5DataBuffer(Fts5
6370: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75  Index *p, Fts5Bu
6380: 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20  ffer *pBuf, i64 
6390: 69 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64  iRowid){.  (void
63a0: 29 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42  )fts5DataReadOrB
63b0: 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69  uffer(p, pBuf, i
63c0: 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Rowid);.}../*.**
63d0: 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
63e0: 65 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63  ence to data rec
63f0: 6f 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  ord returned by 
6400: 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
6410: 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65  to.** fts5DataRe
6420: 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ad()..*/.static 
6430: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c  void fts5DataRel
6440: 65 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70  ease(Fts5Data *p
6450: 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61  Data){.  if( pDa
6460: 74 61 20 29 7b 0a 20 20 20 20 70 44 61 74 61 2d  ta ){.    pData-
6470: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
6480: 20 70 44 61 74 61 2d 3e 6e 52 65 66 3d 3d 30 20   pData->nRef==0 
6490: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
64a0: 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Data);.  }.}..st
64b0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
64c0: 74 61 52 65 66 65 72 65 6e 63 65 28 46 74 73 35  taReference(Fts5
64d0: 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20  Data *pData){.  
64e0: 70 44 61 74 61 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d  pData->nRef++;.}
64f0: 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f  ../*.** INSERT O
6500: 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f  R REPLACE a reco
6510: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61  rd into the %_da
6520: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ta table..*/.sta
6530: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6540: 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  aWrite(Fts5Index
6550: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
6560: 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
6570: 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d  nData){.  if( p-
6580: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
6590: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
65a0: 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b  p->pWriter==0 ){
65b0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
65c0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
65d0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
65e0: 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  g;.    char *zSq
65f0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
6600: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 52 45  ntf(.        "RE
6610: 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e  PLACE INTO '%q'.
6620: 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41  %Q(id, block) VA
6630: 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70 43 6f 6e  LUES(?,?)", pCon
6640: 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
6650: 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20  taTbl.    );.   
6660: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
6670: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6680: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
6690: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
66a0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
66b0: 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a  2(pConfig->db, z
66c0: 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 57 72  Sql, -1, &p->pWr
66d0: 69 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iter, 0);.      
66e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
66f0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
6700: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6710: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
6720: 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
6730: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
6740: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6750: 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31  64(p->pWriter, 1
6760: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  , iRowid);.  sql
6770: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
6780: 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44  ->pWriter, 2, pD
6790: 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49  ata, nData, SQLI
67a0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
67b0: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57  lite3_step(p->pW
67c0: 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  riter);.  p->rc 
67d0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
67e0: 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a  p->pWriter);.}..
67f0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68  /*.** Execute th
6800: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a  e following SQL:
6810: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54  .**.**     DELET
6820: 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57 48  E FROM %_data WH
6830: 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20 24  ERE id BETWEEN $
6840: 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61 73  iFirst AND $iLas
6850: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
6860: 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
6870: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
6880: 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69 4c  4 iFirst, i64 iL
6890: 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ast){.  if( p->r
68a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
68b0: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d  eturn;..  if( p-
68c0: 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a  >pDeleter==0 ){.
68d0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
68e0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
68f0: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
6900: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  ;.    char *zSql
6910: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
6920: 74 66 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c  tf(.        "DEL
6930: 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 25 51  ETE FROM '%q'.%Q
6940: 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44   WHERE id>=? AND
6950: 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66 69 67   id<=?", pConfig
6960: 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
6970: 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  bl.    );.    if
6980: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
6990: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
69a0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
69b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
69c0: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
69d0: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c  Config->db, zSql
69e0: 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74  , -1, &p->pDelet
69f0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
6a00: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
6a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6a20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6a30: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
6a40: 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
6a50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
6a60: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
6a70: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c  (p->pDeleter, 1,
6a80: 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69   iFirst);.  sqli
6a90: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
6aa0: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69  ->pDeleter, 2, i
6ab0: 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Last);.  sqlite3
6ac0: 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65  _step(p->pDelete
6ad0: 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71  r);.  p->rc = sq
6ae0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
6af0: 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Deleter);.}../*.
6b00: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 73 71 6c  ** Close the sql
6b10: 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e 64 6c 65  ite3_blob handle
6b20: 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 72 65   used to read re
6b30: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 25  cords from the %
6b40: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 20  _data table..** 
6b50: 41 6e 64 20 64 69 73 63 61 72 64 20 61 6e 79 20  And discard any 
6b60: 63 61 63 68 65 64 20 72 65 61 64 73 2e 20 54 68  cached reads. Th
6b70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
6b80: 61 6c 6c 65 64 20 61 74 20 74 68 65 20 65 6e 64  alled at the end
6b90: 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64 20 74 72   of.** a read tr
6ba0: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 77 68 65  ansaction or whe
6bb0: 6e 20 61 6e 79 20 73 75 62 2d 74 72 61 6e 73 61  n any sub-transa
6bc0: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
6bd0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
6be0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 73  void fts5DataRes
6bf0: 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  et(Fts5Index *p)
6c00: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
6c10: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
6c20: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e  3_blob_close(p->
6c30: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 70 2d  pReader);.    p-
6c40: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
6c50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }.}../*.** Remov
6c60: 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61 73  e all records as
6c70: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 65  sociated with se
6c80: 67 6d 65 6e 74 20 69 53 65 67 69 64 20 69 6e 20  gment iSegid in 
6c90: 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2f 0a 73  index iIdx..*/.s
6ca0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
6cb0: 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74  ataRemoveSegment
6cc0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
6cd0: 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65  nt iIdx, int iSe
6ce0: 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72  gid){.  i64 iFir
6cf0: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
6d00: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53  T_ROWID(iIdx, iS
6d10: 65 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69  egid, 0, 0);.  i
6d20: 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f  64 iLast = FTS5_
6d30: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
6d40: 64 78 2c 20 69 53 65 67 69 64 2b 31 2c 20 30 2c  dx, iSegid+1, 0,
6d50: 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74   0)-1;.  fts5Dat
6d60: 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73  aDelete(p, iFirs
6d70: 74 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a 2f 2a  t, iLast);.}../*
6d80: 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
6d90: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
6da0: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
6db0: 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
6dc0: 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a   in serialized.*
6dd0: 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62 75  * form within bu
6de0: 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74 61  ffer pData/nData
6df0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
6e00: 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c  Structure.aLevel
6e10: 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35  [] and each Fts5
6e20: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61  StructureLevel.a
6e30: 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  Seg[] array.** a
6e40: 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65  re over-allocate
6e50: 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54  d by one slot. T
6e60: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73  his allows the s
6e70: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e 74  tructure content
6e80: 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20  s.** to be more 
6e90: 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a  easily edited..*
6ea0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
6eb0: 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74 20   occurs, *ppOut 
6ec0: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
6ed0: 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  nd an SQLite err
6ee0: 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72  or code.** retur
6ef0: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
6f00: 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *ppOut is set to
6f10: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
6f20: 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20  w object and.** 
6f30: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
6f40: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
6f50: 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  t fts5StructureD
6f60: 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 75  ecode(.  const u
6f70: 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  8 *pData,       
6f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
6f90: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65  er containing se
6fa0: 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75  rialized structu
6fb0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  re */.  int nDat
6fc0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
6fd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
6fe0: 6f 66 20 62 75 66 66 65 72 20 70 44 61 74 61 20  of buffer pData 
6ff0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74  in bytes */.  Ft
7000: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
7010: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Out           /*
7020: 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a   OUT: Deserializ
7030: 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ed object */.){.
7040: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7050: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20  E_OK;.  int i = 
7060: 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20  0;.  int iLvl;. 
7070: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b   int nLevel = 0;
7080: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
7090: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
70a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70b0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
70c0: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
70d0: 63 61 74 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  cate */.  Fts5St
70e0: 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20  ructure *pRet = 
70f0: 30 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  0;..  /* Read th
7100: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
7110: 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67  f levels and seg
7120: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ments from the s
7130: 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tart of the.  **
7140: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
7150: 64 2e 20 55 73 65 20 74 68 65 73 65 20 76 61 6c  d. Use these val
7160: 75 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ues to allocate 
7170: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 64 65  space for the de
7180: 73 65 72 69 61 6c 69 7a 65 64 0a 20 20 2a 2a 20  serialized.  ** 
7190: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 72  version of the r
71a0: 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 20 3d 20  ecord. */.  i = 
71b0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  getVarint32(&pDa
71c0: 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a  ta[i], nLevel);.
71d0: 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
71e0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53  32(&pData[i], nS
71f0: 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65  egment);.  nByte
7200: 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f   = (.      sizeo
7210: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
7220: 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   + .      sizeof
7230: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
7240: 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31  vel) * (nLevel+1
7250: 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  ) +.      sizeof
7260: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7270: 67 6d 65 6e 74 29 20 2a 20 28 6e 53 65 67 6d 65  gment) * (nSegme
7280: 6e 74 2b 6e 4c 65 76 65 6c 2b 31 29 0a 20 20 29  nt+nLevel+1).  )
7290: 3b 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73 35  ;.  pRet = (Fts5
72a0: 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74  Structure*)sqlit
72b0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
72c0: 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  ;..  if( pRet ){
72d0: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
72e0: 3d 20 28 75 38 2a 29 26 70 52 65 74 2d 3e 61 4c  = (u8*)&pRet->aL
72f0: 65 76 65 6c 5b 6e 4c 65 76 65 6c 2b 31 5d 3b 0a  evel[nLevel+1];.
7300: 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c      memset(pRet,
7310: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
7320: 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  pRet->nLevel = n
7330: 4c 65 76 65 6c 3b 0a 20 20 20 20 69 20 2b 3d 20  Level;.    i += 
7340: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
7350: 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65  (&pData[i], &pRe
7360: 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
7370: 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
7380: 30 3b 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20  0; iLvl<nLevel; 
7390: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iLvl++){.      F
73a0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
73b0: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d  l *pLvl = &pRet-
73c0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
73d0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b       int nTotal;
73e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b  .      int iSeg;
73f0: 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74  ..      i += get
7400: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7410: 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  i], pLvl->nMerge
7420: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65  );.      i += ge
7430: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7440: 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20  [i], nTotal);.  
7450: 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74      assert( nTot
7460: 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  al>=pLvl->nMerge
7470: 20 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e   );.      pLvl->
7480: 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20  nSeg = nTotal;. 
7490: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
74a0: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
74b0: 53 65 67 6d 65 6e 74 2a 29 70 53 70 61 63 65 3b  Segment*)pSpace;
74c0: 0a 20 20 20 20 20 20 70 53 70 61 63 65 20 2b 3d  .      pSpace +=
74d0: 20 28 28 6e 54 6f 74 61 6c 2b 31 29 20 2a 20 73   ((nTotal+1) * s
74e0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
74f0: 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 0a 20  ureSegment));.. 
7500: 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
7510: 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53   iSeg<nTotal; iS
7520: 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  eg++){.        i
7530: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7540: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7550: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
7560: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b  id);.        i +
7570: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
7580: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
7590: 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68  Seg[iSeg].nHeigh
75a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d  t);.        i +=
75b0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44   getVarint32(&pD
75c0: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
75d0: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
75e0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b  st);.        i +
75f0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
7600: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
7610: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61  Seg[iSeg].pgnoLa
7620: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
7630: 20 7d 0a 20 20 20 20 70 52 65 74 2d 3e 61 4c 65   }.    pRet->aLe
7640: 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2e 61 53 65 67  vel[nLevel].aSeg
7650: 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
7660: 65 53 65 67 6d 65 6e 74 2a 29 70 53 70 61 63 65  eSegment*)pSpace
7670: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7680: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7690: 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20  ;.  }..  *ppOut 
76a0: 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e  = pRet;.  return
76b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
76c0: 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20  ad, deserialize 
76d0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
76e0: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
76f0: 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a  for index iIdx..
7700: 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74  **.** The Fts5St
7710: 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d  ructure.aLevel[]
7720: 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74   and each Fts5St
7730: 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65  ructureLevel.aSe
7740: 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  g[] array.** are
7750: 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20   over-allocated 
7760: 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f 72  as described for
7770: 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74   function fts5St
7780: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 20  ructureDecode() 
7790: 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  .** above..**.**
77a0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
77b0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
77c0: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
77d0: 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20  or code left in 
77e0: 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78  the.** Fts5Index
77f0: 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65   handle. If an e
7800: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
7810: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
7820: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
7830: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
7840: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
7850: 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72  tic Fts5Structur
7860: 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72 65  e *fts5Structure
7870: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
7880: 70 2c 20 69 6e 74 20 69 49 64 78 29 7b 0a 20 20  p, int iIdx){.  
7890: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
78a0: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
78b0: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
78c0: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
78d0: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
78e0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73   return */.  Fts
78f0: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20  5Data *pData;   
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7910: 25 5f 64 61 74 61 20 65 6e 74 72 79 20 63 6f 6e  %_data entry con
7920: 74 61 69 6e 69 6e 67 20 73 74 72 75 63 74 75 72  taining structur
7930: 65 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 61  e record */..  a
7940: 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43 6f  ssert( iIdx<=pCo
7950: 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 3b  nfig->nPrefix );
7960: 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
7970: 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
7980: 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28  STRUCTURE_ROWID(
7990: 69 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 70  iIdx));.  if( !p
79a0: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 30 3b  Data ) return 0;
79b0: 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53  .  p->rc = fts5S
79c0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70  tructureDecode(p
79d0: 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
79e0: 6e 2c 20 26 70 52 65 74 29 3b 0a 0a 20 20 66 74  n, &pRet);..  ft
79f0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
7a00: 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
7a10: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
7a20: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
7a30: 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75  e to an Fts5Stru
7a40: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74  cture object ret
7a50: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
7a60: 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ier .** call to 
7a70: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
7a80: 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75 63  d() or fts5Struc
7a90: 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f  tureDecode()..*/
7aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7ab0: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
7ac0: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e(Fts5Structure 
7ad0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 73 71 6c  *pStruct){.  sql
7ae0: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
7af0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
7b00: 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
7b10: 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
7b20: 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74   in index struct
7b30: 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2f 0a  ure pStruct..*/.
7b40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
7b50: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
7b60: 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63 74  ments(Fts5Struct
7b70: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
7b80: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
7b90: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
7ba0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
7bb0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
7bc0: 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20    int iLvl;     
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
7bf0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
7c00: 65 6c 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c  els */..  for(iL
7c10: 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
7c20: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
7c30: 2b 2b 29 7b 0a 20 20 20 20 6e 53 65 67 6d 65 6e  ++){.    nSegmen
7c40: 74 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c  t += pStruct->aL
7c50: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
7c60: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
7c70: 53 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Segment;.}../*.*
7c80: 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  * Serialize and 
7c90: 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75 63  store the "struc
7ca0: 74 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f 72  ture" record for
7cb0: 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a 0a   index iIdx..**.
7cc0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
7cd0: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
7ce0: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68  error code in th
7cf0: 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  e Fts5Index obje
7d00: 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  ct. If an.** err
7d10: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
7d20: 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
7d30: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
7d40: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
7d50: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57  d fts5StructureW
7d60: 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  rite(Fts5Index *
7d70: 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74 73  p, int iIdx, Fts
7d80: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
7d90: 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  uct){.  int nSeg
7da0: 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ment;           
7db0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
7dc0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
7dd0: 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  nts */.  Fts5Buf
7de0: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
7df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
7e00: 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20  er to serialize 
7e10: 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20  record into */. 
7e20: 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e40: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
7e50: 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
7e60: 6c 73 20 2a 2f 0a 0a 20 20 6e 53 65 67 6d 65 6e  ls */..  nSegmen
7e70: 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
7e80: 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70  eCountSegments(p
7e90: 53 74 72 75 63 74 29 3b 0a 20 20 6d 65 6d 73 65  Struct);.  memse
7ea0: 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
7eb0: 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
7ec0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
7ed0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
7ee0: 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e   &buf, pStruct->
7ef0: 6e 4c 65 76 65 6c 29 3b 0a 20 20 66 74 73 35 42  nLevel);.  fts5B
7f00: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
7f10: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
7f20: 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 66 74 73  nSegment);.  fts
7f30: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
7f40: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
7f50: 2c 20 28 69 36 34 29 70 53 74 72 75 63 74 2d 3e  , (i64)pStruct->
7f60: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
7f70: 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69  .  for(iLvl=0; i
7f80: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
7f90: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
7fa0: 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
7fd0: 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
7fe0: 6e 74 73 20 2a 2f 0a 20 20 20 20 46 74 73 35 53  nts */.    Fts5S
7ff0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
8000: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
8010: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
8020: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8030: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8040: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65   &buf, pLvl->nMe
8050: 72 67 65 29 3b 0a 20 20 20 20 66 74 73 35 42 75  rge);.    fts5Bu
8060: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8070: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8080: 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 0a 20 20 20  Lvl->nSeg);..   
8090: 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
80a0: 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
80b0: 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73  eg++){.      fts
80c0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
80d0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
80e0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
80f0: 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g].iSegid);.    
8100: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8110: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8120: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
8130: 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74 29  g[iSeg].nHeight)
8140: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
8150: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
8160: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
8170: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
8180: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
8190: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
81a0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
81b0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
81c0: 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b  iSeg].pgnoLast);
81d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
81e0: 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
81f0: 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
8200: 57 49 44 28 69 49 64 78 29 2c 20 62 75 66 2e 70  WID(iIdx), buf.p
8210: 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 66 74 73 35  , buf.n);.  fts5
8220: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
8230: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  ;.}.../*.** Load
8240: 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70   the next leaf p
8250: 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67  age into the seg
8260: 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a  ment iterator..*
8270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
8280: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
8290: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
82a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
82b0: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
82c0: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
82d0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
82e0: 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
82f0: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
8300: 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20  advance to next 
8310: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  page */.){.  Fts
8320: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8330: 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d  t *pSeg = pIter-
8340: 3e 70 53 65 67 3b 0a 20 20 69 66 28 20 70 49 74  >pSeg;.  if( pIt
8350: 65 72 2d 3e 70 4c 65 61 66 20 29 20 66 74 73 35  er->pLeaf ) fts5
8360: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
8370: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28  r->pLeaf);.  if(
8380: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
8390: 6f 3c 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  o<pSeg->pgnoLast
83a0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
83b0: 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 20 20  LeafPgno++;.    
83c0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66  pIter->pLeaf = f
83d0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
83e0: 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47          FTS5_SEG
83f0: 4d 45 4e 54 5f 52 4f 57 49 44 28 70 49 74 65 72  MENT_ROWID(pIter
8400: 2d 3e 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53  ->iIdx, pSeg->iS
8410: 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e  egid, 0, pIter->
8420: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29  iLeafPgno).    )
8430: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8440: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
8450: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
8460: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
8470: 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65  oadTerm(Fts5Inde
8480: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
8490: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b  r *pIter, int nK
84a0: 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  eep){.  u8 *a = 
84b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
84c0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
84d0: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
84e0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
84f0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
8500: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
8510: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
8520: 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e     /* Bytes of n
8550: 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f  ew data */..  iO
8560: 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ff += getVarint3
8570: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77  2(&a[iOff], nNew
8580: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d  );.  pIter->term
8590: 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74  .n = nKeep;.  ft
85a0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
85b0: 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  ob(&p->rc, &pIte
85c0: 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26  r->term, nNew, &
85d0: 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66  a[iOff]);.  iOff
85e0: 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65   += nNew;.  pIte
85f0: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
8600: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74  et = iOff;.  pIt
8610: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
8620: 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  o = pIter->iLeaf
8630: 50 67 6e 6f 3b 0a 20 20 69 66 28 20 69 4f 66 66  Pgno;.  if( iOff
8640: 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  >=pIter->pLeaf->
8650: 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67  n ){.    fts5Seg
8660: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
8670: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
8680: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
8690: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
86a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
86b0: 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
86c0: 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  RUPT;.      retu
86d0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f  rn;.    }.    iO
86e0: 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20  ff = 4;.    a = 
86f0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
8700: 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73  .  }.  iOff += s
8710: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
8720: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
8730: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
8740: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
8750: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a  ffset = iOff;.}.
8760: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
8770: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
8780: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
8790: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
87a0: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  he entries in.**
87b0: 20 73 65 67 6d 65 6e 74 20 70 53 65 67 20 77 69   segment pSeg wi
87c0: 74 68 69 6e 20 69 6e 64 65 78 20 69 49 64 78 2e  thin index iIdx.
87d0: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   The iterator is
87e0: 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
87f0: 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  o the .** first 
8800: 65 6e 74 72 79 20 77 68 65 6e 20 74 68 69 73 20  entry when this 
8810: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
8820: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
8830: 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
8840: 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
8850: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
8860: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
8870: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
8880: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
8890: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
88a0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
88b0: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
88c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
88d0: 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a  ts5SegIterInit(.
88e0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
88f0: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
8900: 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
8910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8920: 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e  onfig.aHash[] in
8930: 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78  dex of FTS index
8940: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
8950: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
8960: 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
8970: 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20  tion of segment 
8980: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
8990: 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
89a0: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
89b0: 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b  o populate */.){
89c0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
89d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
89e0: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
89f0: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
8a00: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65  ;.    pIter->pSe
8a10: 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70 49  g = pSeg;.    pI
8a20: 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78  ter->iIdx = iIdx
8a30: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
8a40: 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70  afPgno = pSeg->p
8a50: 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20  gnoFirst-1;.    
8a60: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
8a70: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
8a80: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
8a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8aa0: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
8ab0: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 70  >pLeaf->p;.    p
8ac0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
8ad0: 74 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  t = fts5GetU16(&
8ae0: 61 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73 35 53  a[2]);.    fts5S
8af0: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
8b00: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 7d  , pIter, 0);.  }
8b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
8b20: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
8b30: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
8b40: 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
8b50: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
8b60: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
8b70: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
8b80: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
8b90: 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63   It .** is not c
8ba0: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
8bb0: 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
8bc0: 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20  or reaches EOF. 
8bd0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
8be0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
8bf0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
8c00: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
8c10: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
8c20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8c30: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
8c40: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
8c50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8c60: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
8c70: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
8c80: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
8c90: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
8ca0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
8cb0: 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20 69  dvance */.){.  i
8cc0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8cd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 44  _OK ){.    Fts5D
8ce0: 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
8cf0: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 69  er->pLeaf;.    i
8d00: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74  nt iOff;.    int
8d10: 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20   bNewTerm = 0;. 
8d20: 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
8d30: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  ;..    /* Search
8d40: 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
8d50: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
8d60: 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  t within the cur
8d70: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
8d80: 20 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d    u8 *a = pLeaf-
8d90: 3e 70 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  >p;.    int n = 
8da0: 70 4c 65 61 66 2d 3e 6e 3b 0a 20 20 20 20 66 6f  pLeaf->n;.    fo
8db0: 72 28 69 4f 66 66 3d 70 49 74 65 72 2d 3e 69 4c  r(iOff=pIter->iL
8dc0: 65 61 66 4f 66 66 73 65 74 3b 20 69 4f 66 66 3c  eafOffset; iOff<
8dd0: 6e 20 26 26 20 61 5b 69 4f 66 66 5d 3b 20 69 4f  n && a[iOff]; iO
8de0: 66 66 2b 2b 29 3b 0a 20 20 20 20 69 4f 66 66 2b  ff++);.    iOff+
8df0: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66  +;..    if( iOff
8e00: 3c 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  <n ){.      /* T
8e10: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73  he next entry is
8e20: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
8e30: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 36  page */.      u6
8e40: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
8e50: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
8e60: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
8e70: 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  ], &iDelta);.   
8e80: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
8e90: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
8ea0: 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
8eb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4e 65  0 ){.        bNe
8ec0: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
8ed0: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29     if( iOff>=n )
8ee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
8ef0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
8f00: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
8f10: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
8f20: 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20  fOffset = 4;.   
8f30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
8f40: 4f 66 66 21 3d 66 74 73 35 47 65 74 55 31 36 28  Off!=fts5GetU16(
8f50: 26 61 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20  &a[2]) ){.      
8f60: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
8f70: 4f 66 66 73 65 74 20 2b 3d 20 67 65 74 56 61 72  Offset += getVar
8f80: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
8f90: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20  nKeep);.        
8fa0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
8fb0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
8fc0: 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
8fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8fe0: 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  e{.      iOff = 
8ff0: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  0;.      /* Next
9000: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
9010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
9020: 65 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  e */.      while
9030: 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( iOff==0 ){.   
9040: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
9050: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
9060: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 61  r);.        pLea
9070: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
9080: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
9090: 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
90a0: 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
90b0: 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
90c0: 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20 29 7b  pLeaf->p[0])) ){
90d0: 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
90e0: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
90f0: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
9100: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
9110: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
9120: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
9130: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
9140: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9150: 20 20 20 65 6c 73 65 20 69 66 28 20 28 69 4f 66     else if( (iOf
9160: 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
9170: 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 29 20 29 7b  pLeaf->p[2])) ){
9180: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
9190: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
91a0: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
91b0: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
91c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
91d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
91e0: 65 63 6b 20 69 66 20 74 68 65 20 69 74 65 72 61  eck if the itera
91f0: 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f  tor is now at EO
9200: 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e  F. If so, return
9210: 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 69   early. */.    i
9220: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
9230: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
9240: 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b   if( bNewTerm ){
9250: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
9260: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
9270: 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ter, nKeep);.   
9280: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9290: 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61 74 6f  Zero the iterato
92a0: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
92b0: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
92c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
92d0: 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 46  s5SegIterClear(F
92e0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
92f0: 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r){.  fts5Buffer
9300: 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72  Free(&pIter->ter
9310: 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65  m);.  fts5DataRe
9320: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
9330: 61 66 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  af);.  memset(pI
9340: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
9350: 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a  ts5SegIter));.}.
9360: 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
9370: 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
9380: 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
9390: 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
93a0: 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
93b0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
93c0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
93d0: 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
93e0: 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
93f0: 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
9400: 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
9410: 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
9420: 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
9430: 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
9440: 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
9450: 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
9460: 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
9470: 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
9480: 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
9490: 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
94a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
94b0: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
94c0: 6f 6d 70 61 72 65 28 46 74 73 35 4d 75 6c 74 69  ompare(Fts5Multi
94d0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
94e0: 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74  int iOut){.  int
94f0: 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   i1;            
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9510: 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61  Index of left-ha
9520: 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
9530: 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20  /.  int i2;     
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
9560: 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53  right-hand Fts5S
9570: 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
9580: 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49  iRes;.  Fts5SegI
9590: 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20  ter *p1;        
95a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
95b0: 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
95c0: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
95d0: 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20  r *p2;          
95e0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68        /* Right-h
95f0: 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
9600: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f  */..  assert( iO
9610: 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26  ut<pIter->nSeg &
9620: 26 20 69 4f 75 74 3e 30 20 29 3b 0a 0a 20 20 69  & iOut>0 );..  i
9630: 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d  f( iOut>=(pIter-
9640: 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20  >nSeg/2) ){.    
9650: 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74  i1 = (iOut - pIt
9660: 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b  er->nSeg/2) * 2;
9670: 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31  .    i2 = i1 + 1
9680: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
9690: 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  1 = pIter->aFirs
96a0: 74 5b 69 4f 75 74 2a 32 5d 3b 0a 20 20 20 20 69  t[iOut*2];.    i
96b0: 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  2 = pIter->aFirs
96c0: 74 5b 69 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d  t[iOut*2+1];.  }
96d0: 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  .  p1 = &pIter->
96e0: 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d  aSeg[i1];.  p2 =
96f0: 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32   &pIter->aSeg[i2
9700: 5d 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c  ];..  if( p1->pL
9710: 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  eaf==0 ){       
9720: 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20      /* If p1 is 
9730: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52  at EOF */.    iR
9740: 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65  es = i2;.  }else
9750: 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d   if( p2->pLeaf==
9760: 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70  0 ){     /* If p
9770: 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  2 is at EOF */. 
9780: 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20     iRes = i1;.  
9790: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
97a0: 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43  es = fts5BufferC
97b0: 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d  ompare(&p1->term
97c0: 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20  , &p2->term);.  
97d0: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
97e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
97f0: 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >i1 );.      ass
9800: 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20  ert( i2!=0 );.  
9810: 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77      if( p1->iRow
9820: 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id==p2->iRowid )
9830: 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20   return i2;.    
9840: 20 20 72 65 73 20 3d 20 28 70 31 2d 3e 69 52 6f    res = (p1->iRo
9850: 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64  wid > p2->iRowid
9860: 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20  ) ? -1 : +1;.   
9870: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
9880: 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  es!=0 );.    if(
9890: 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
98a0: 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d  iRes = i1;.    }
98b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73  else{.      iRes
98c0: 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   = i2;.    }.  }
98d0: 0a 0a 20 20 70 49 74 65 72 2d 3e 61 46 69 72 73  ..  pIter->aFirs
98e0: 74 5b 69 4f 75 74 5d 20 3d 20 69 52 65 73 3b 0a  t[iOut] = iRes;.
98f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9900: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74  *.** Free the it
9910: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
9920: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
9930: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
9940: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9950: 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74  MultiIterFree(Ft
9960: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
9970: 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
9980: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
9990: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
99a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
99b0: 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
99c0: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
99d0: 74 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d  terClear(&pIter-
99e0: 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d  >aSeg[i]);.    }
99f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9a00: 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
9a10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9a20: 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
9a30: 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ed(.  Fts5Index 
9a40: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
9a50: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
9a60: 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
9a70: 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
9a80: 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
9a90: 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Iter,        /* 
9aa0: 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
9ab0: 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
9ac0: 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
9ad0: 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20  Changed,        
9ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9af0: 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
9b00: 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
9b10: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73  d */.  int iMins
9b20: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
9b30: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
9b40: 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73  m entry in aFirs
9b50: 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b  t[] to set */.){
9b60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
9b70: 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69  i=(pIter->nSeg+i
9b80: 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69  Changed)/2; i>=i
9b90: 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d  Minset && p->rc=
9ba0: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f  =SQLITE_OK; i=i/
9bb0: 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b  2){.    int iEq;
9bc0: 0a 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20  .    if( (iEq = 
9bd0: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
9be0: 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29  ompare(pIter, i)
9bf0: 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  ) ){.      fts5S
9c00: 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70  egIterNext(p, &p
9c10: 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 29  Iter->aSeg[iEq])
9c20: 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74 65  ;.      i = pIte
9c30: 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20  r->nSeg + iEq;. 
9c40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9c50: 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
9c60: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
9c70: 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  entry. .**.** If
9c80: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9c90: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
9ca0: 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49  is left in Fts5I
9cb0: 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e  ndex.rc. It is n
9cc0: 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  ot .** considere
9cd0: 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
9ce0: 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68  e iterator reach
9cf0: 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74  es EOF, or if it
9d00: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a   is already at .
9d10: 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  ** EOF when this
9d20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
9d30: 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
9d40: 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
9d50: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20  rNext(Fts5Index 
9d60: 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
9d70: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
9d80: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9d90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
9da0: 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e  iFirst = pIter->
9db0: 61 46 69 72 73 74 5b 31 5d 3b 0a 20 20 20 20 66  aFirst[1];.    f
9dc0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
9dd0: 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  , &pIter->aSeg[i
9de0: 46 69 72 73 74 5d 29 3b 0a 20 20 20 20 66 74 73  First]);.    fts
9df0: 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
9e00: 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  ed(p, pIter, iFi
9e10: 72 73 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  rst, 1);.  }.}..
9e20: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
9e30: 20 6e 65 77 20 46 74 73 35 4d 75 6c 74 69 53 65   new Fts5MultiSe
9e40: 67 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  gIter object..**
9e50: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
9e60: 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ct will be used 
9e70: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
9e80: 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63  gh data in struc
9e90: 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a  ture pStruct..**
9ea0: 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76   If iLevel is -v
9eb0: 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61  e, then all data
9ec0: 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73   in all segments
9ed0: 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20   is merged. Or, 
9ee0: 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  if iLevel.** is 
9ef0: 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c  zero or greater,
9f00: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66   data from the f
9f10: 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65  irst nSegment se
9f20: 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20  gments on level 
9f30: 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72  iLevel.** is mer
9f40: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ged..**.** The i
9f50: 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c  terator initiall
9f60: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
9f70: 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64  first term/rowid
9f80: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a   entry in the .*
9f90: 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e  * iterated data.
9fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9fb0: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
9fc0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
9fd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9fe0: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
9ff0: 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
a000: 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53  ithin */.  Fts5S
a010: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
a020: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  t,         /* St
a030: 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69  ructure of speci
a040: 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  fic index */.  i
a050: 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a070: 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d  * Config.aHash[]
a080: 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e   index of FTS in
a090: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  dex */.  int iLe
a0a0: 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
a0b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
a0c0: 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31  l to iterate (-1
a0d0: 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69   for all) */.  i
a0e0: 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20  nt nSegment,    
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a100: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
a110: 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69  ents to merge (i
a120: 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46  Level>=0) */.  F
a130: 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
a140: 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f  **ppOut        /
a150: 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
a160: 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20  ){.  int nSeg;  
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a190: 66 20 73 65 67 6d 65 6e 74 73 20 6d 65 72 67 65  f segments merge
a1a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  d */.  int nSlot
a1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20         /* Power 
a1d0: 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a  of two >= nSeg *
a1e0: 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20  /.  int iIter = 
a1f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a200: 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20      /* */.  int 
a210: 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
a220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
a230: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
a240: 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
a250: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
a260: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
a270: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
a280: 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 41  r *pNew;..  /* A
a290: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
a2a0: 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d  r the new multi-
a2b0: 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f  seg-iterator. */
a2c0: 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20  .  if( iLevel<0 
a2d0: 29 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 66 74  ){.    nSeg = ft
a2e0: 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
a2f0: 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74  Segments(pStruct
a300: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a310: 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75  nSeg = MIN(pStru
a320: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65  ct->aLevel[iLeve
a330: 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e  l].nSeg, nSegmen
a340: 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 53  t);.  }.  for(nS
a350: 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65  lot=2; nSlot<nSe
a360: 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32  g; nSlot=nSlot*2
a370: 29 3b 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e  );.  *ppOut = pN
a380: 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  ew = fts5IdxMall
a390: 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69 7a  oc(p, .      siz
a3a0: 65 6f 66 28 46 74 73 35 4d 75 6c 74 69 53 65 67  eof(Fts5MultiSeg
a3b0: 49 74 65 72 29 20 2b 20 20 20 20 20 20 20 20 20  Iter) +         
a3c0: 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20   /* pNew */.    
a3d0: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67    sizeof(Fts5Seg
a3e0: 49 74 65 72 29 20 2a 20 6e 53 6c 6f 74 20 2b 20  Iter) * nSlot + 
a3f0: 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61        /* pNew->a
a400: 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73  Seg[] */.      s
a410: 69 7a 65 6f 66 28 75 31 36 29 20 2a 20 6e 53 6c  izeof(u16) * nSl
a420: 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
a430: 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72     /* pNew->aFir
a440: 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  st[] */.  );.  i
a450: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
a460: 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65  urn;.  pNew->nSe
a470: 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 70 4e 65  g = nSlot;.  pNe
a480: 77 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53  w->aSeg = (Fts5S
a490: 65 67 49 74 65 72 2a 29 26 70 4e 65 77 5b 31 5d  egIter*)&pNew[1]
a4a0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74  ;.  pNew->aFirst
a4b0: 20 3d 20 28 75 31 36 2a 29 26 70 4e 65 77 2d 3e   = (u16*)&pNew->
a4c0: 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 0a 20 20  aSeg[nSlot];..  
a4d0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65 61  /* Initialize ea
a4e0: 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 6e  ch of the compon
a4f0: 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65 72  ent segment iter
a500: 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ators. */.  if( 
a510: 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
a520: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
a530: 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74 72  el *pEnd = &pStr
a540: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  uct->aLevel[pStr
a550: 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
a560: 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72    for(pLvl=&pStr
a570: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20  uct->aLevel[0]; 
a580: 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b  pLvl<pEnd; pLvl+
a590: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  +){.      for(iS
a5a0: 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b  eg=pLvl->nSeg-1;
a5b0: 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d   iSeg>=0; iSeg--
a5c0: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
a5d0: 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49  egIterInit(p, iI
a5e0: 64 78 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  dx, &pLvl->aSeg[
a5f0: 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53  iSeg], &pNew->aS
a600: 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20  eg[iIter++]);.  
a610: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
a620: 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20  lse{.    pLvl = 
a630: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
a640: 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f  [iLevel];.    fo
a650: 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69  r(iSeg=nSeg-1; i
a660: 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b  Seg>=0; iSeg--){
a670: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
a680: 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20  erInit(p, iIdx, 
a690: 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
a6a0: 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
a6b0: 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a  Iter++]);.    }.
a6c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 49    }.  assert( iI
a6d0: 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20  ter==nSeg );..  
a6e0: 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20  /* If the above 
a6f0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20  was successful, 
a700: 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69  each component i
a710: 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69  terators now poi
a720: 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nts .  ** to the
a730: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
a740: 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20  its segment. In 
a750: 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61  this case initia
a760: 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61  lize the .  ** a
a770: 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f  First[] array. O
a780: 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  r, if an error h
a790: 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65  as occurred, fre
a7a0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20  e the iterator. 
a7b0: 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73   ** object and s
a7c0: 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
a7d0: 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20  riable to NULL. 
a7e0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
a7f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a800: 20 20 66 6f 72 28 69 49 74 65 72 3d 6e 53 6c 6f    for(iIter=nSlo
a810: 74 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49  t-1; iIter>0; iI
a820: 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e  ter--){.      in
a830: 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28  t iEq;.      if(
a840: 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
a850: 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
a860: 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a  New, iIter)) ){.
a870: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
a880: 74 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65 77  terNext(p, &pNew
a890: 2d 3e 61 53 65 67 5b 69 45 71 5d 29 3b 0a 20 20  ->aSeg[iEq]);.  
a8a0: 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
a8b0: 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
a8c0: 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29  New, iEq, iIter)
a8d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a8e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
a8f0: 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
a900: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70  , pNew);.    *pp
a910: 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  Out = 0;.  }.}..
a920: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
a930: 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  e if the iterato
a940: 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69  r is at EOF or i
a950: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
a960: 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c  ccurred. .** Fal
a970: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
a980: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
a990: 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73  MultiIterEof(Fts
a9a0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d  5Index *p, Fts5M
a9b0: 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
a9c0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
a9d0: 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 61  ->rc || pIter->a
a9e0: 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
a9f0: 73 74 5b 31 5d 20 5d 2e 70 4c 65 61 66 3d 3d 30  st[1] ].pLeaf==0
aa00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
aa10: 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
aa20: 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
aa30: 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
aa40: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
aa50: 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
aa60: 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
aa70: 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
aa80: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
aa90: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
aaa0: 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
aab0: 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
aac0: 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
aad0: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
aae0: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
aaf0: 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
ab00: 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d  ter->aFirst[1] ]
ab10: 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  .iRowid;.}../*.*
ab20: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
ab30: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
ab40: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
ab50: 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rm associated wi
ab60: 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79  th the .** entry
ab70: 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74   that the iterat
ab80: 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
ab90: 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  nts to..*/.stati
aba0: 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35  c const u8 *fts5
abb0: 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74  MultiIterTerm(Ft
abc0: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
abd0: 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b  pIter, int *pn){
abe0: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
abf0: 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  p = &pIter->aSeg
ac00: 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
ac10: 31 5d 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d  1] ];.  *pn = p-
ac20: 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72  >term.n;.  retur
ac30: 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a  n p->term.p;.}..
ac40: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72  /*.** Read and r
ac50: 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 33  eturn the next 3
ac60: 32 2d 62 69 74 20 76 61 72 69 6e 74 20 66 72 6f  2-bit varint fro
ac70: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  m the position-l
ac80: 69 73 74 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a  ist iterator .**
ac90: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
aca0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
acb0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
acc0: 72 20 6f 63 63 75 72 73 2c 20 7a 65 72 6f 20 69  r occurs, zero i
acd0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 20 61 6e  s returned an an
ace0: 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74   error code left
acf0: 20 69 6e 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65   in .** Fts5Inde
ad00: 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  x.rc. If an erro
ad10: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
ad20: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
ad30: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
ad40: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
ad50: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
ad60: 20 69 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72   int fts5PosIter
ad70: 52 65 61 64 56 61 72 69 6e 74 28 46 74 73 35 49  ReadVarint(Fts5I
ad80: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73  ndex *p, Fts5Pos
ad90: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ada0: 69 6e 74 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20  int iVal = 0;.  
adb0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
adc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
add0: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
ade0: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 69  eafOffset;.    i
adf0: 66 28 20 69 4f 66 66 20 3c 20 70 49 74 65 72 2d  f( iOff < pIter-
ae00: 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  >pLeaf->n ){.   
ae10: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
ae20: 66 66 73 65 74 20 2b 3d 20 67 65 74 56 61 72 69  ffset += getVari
ae30: 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65  nt32(&pIter->pLe
ae40: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 69 56 61  af->p[iOff], iVa
ae50: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
ae60: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
ae70: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
ae80: 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  f);.      pIter-
ae90: 3e 69 4c 65 61 66 52 6f 77 69 64 2b 2b 3b 0a 20  >iLeafRowid++;. 
aea0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
aeb0: 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
aec0: 28 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  (p, pIter->iLeaf
aed0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
aee0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
aef0: 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
af00: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34  >iLeafOffset = 4
af10: 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26   + getVarint32(&
af20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
af30: 34 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20  4], iVal);.     
af40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
af50: 65 74 75 72 6e 20 69 56 61 6c 3b 0a 7d 0a 0a 2f  eturn iVal;.}../
af60: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
af70: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69   position list i
af80: 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
af90: 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  ext entry..*/.st
afa0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
afb0: 73 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  sIterNext(Fts5In
afc0: 64 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49  dex *p, Fts5PosI
afd0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
afe0: 6e 74 20 69 56 61 6c 3b 0a 20 20 69 56 61 6c 20  nt iVal;.  iVal 
aff0: 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52 65 61  = fts5PosIterRea
b000: 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74 65 72  dVarint(p, pIter
b010: 29 3b 0a 20 20 69 66 28 20 69 56 61 6c 3d 3d 30  );.  if( iVal==0
b020: 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61   ){.    fts5Data
b030: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
b040: 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
b050: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d  ->pLeaf = 0;.  }
b060: 0a 20 20 65 6c 73 65 20 69 66 28 20 69 56 61 6c  .  else if( iVal
b070: 3d 3d 31 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ==1 ){.    pIter
b080: 2d 3e 69 43 6f 6c 20 3d 20 66 74 73 35 50 6f 73  ->iCol = fts5Pos
b090: 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 70  IterReadVarint(p
b0a0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49  , pIter);.    pI
b0b0: 74 65 72 2d 3e 69 50 6f 73 20 3d 20 66 74 73 35  ter->iPos = fts5
b0c0: 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e  PosIterReadVarin
b0d0: 74 28 70 2c 20 70 49 74 65 72 29 20 2d 20 32 3b  t(p, pIter) - 2;
b0e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
b0f0: 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 69 56  ter->iPos += (iV
b100: 61 6c 20 2d 20 32 29 3b 0a 20 20 7d 0a 7d 0a 0a  al - 2);.  }.}..
b110: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
b120: 20 74 68 65 20 46 74 73 35 50 6f 73 49 74 65 72   the Fts5PosIter
b130: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
b140: 73 20 74 68 65 20 66 69 6e 61 6c 20 61 72 67 75  s the final argu
b150: 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 0a  ment to iterate.
b160: 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  ** through the p
b170: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 61 73 73  osition-list ass
b180: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
b190: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
b1a0: 74 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70  t iterator .** p
b1b0: 4d 75 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20  Multi currently 
b1c0: 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74  points to..*/.st
b1d0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
b1e0: 73 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  sIterInit(.  Fts
b1f0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b210: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
b220: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c  ect */.  Fts5Mul
b230: 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74  tiSegIter *pMult
b240: 69 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74  i,       /* Mult
b250: 69 2d 73 65 67 20 69 74 65 72 61 74 6f 72 20 74  i-seg iterator t
b260: 6f 20 72 65 61 64 20 70 6f 73 2d 6c 69 73 74 20  o read pos-list 
b270: 66 72 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 50 6f  from */.  Fts5Po
b280: 73 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  sIter *pIter    
b290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
b2a0: 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6f 62 6a  tialize this obj
b2b0: 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ect */.){.  if( 
b2c0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b2d0: 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
b2e0: 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75  ter *pSeg = &pMu
b2f0: 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74  lti->aSeg[ pMult
b300: 69 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a  i->aFirst[1] ];.
b310: 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53      int iId = pS
b320: 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  eg->pSeg->iSegid
b330: 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ;..    memset(pI
b340: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
b350: 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70 49 74  pIter));.    pIt
b360: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 53 65 67  er->pLeaf = pSeg
b370: 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74  ->pLeaf;.    pIt
b380: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
b390: 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66  = pSeg->iLeafOff
b3a0: 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  set;.    pIter->
b3b0: 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53  iLeafRowid = FTS
b3c0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
b3d0: 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c  pSeg->iIdx, iId,
b3e0: 20 30 2c 20 70 53 65 67 2d 3e 69 4c 65 61 66 50   0, pSeg->iLeafP
b3f0: 67 6e 6f 29 3b 0a 20 20 20 20 66 74 73 35 44 61  gno);.    fts5Da
b400: 74 61 52 65 66 65 72 65 6e 63 65 28 70 49 74 65  taReference(pIte
b410: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 66  r->pLeaf);.    f
b420: 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28 70  ts5PosIterNext(p
b430: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
b440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
b450: 75 65 20 69 66 20 74 68 65 20 70 6f 73 69 74 69  ue if the positi
b460: 6f 6e 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  on iterator pass
b470: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
b480: 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
b490: 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20 61 6e  at EOF. Or if an
b4a0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
b4b0: 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f 74 68  dy occurred. Oth
b4c0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 66  erwise, return f
b4d0: 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alse..*/.static 
b4e0: 69 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72 45  int fts5PosIterE
b4f0: 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
b500: 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49   Fts5PosIter *pI
b510: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ter){.  return (
b520: 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e  p->rc || pIter->
b530: 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 0a 2f  pLeaf==0);.}.../
b540: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65  *.** Allocate me
b550: 6d 6f 72 79 2e 20 54 68 65 20 64 69 66 66 65 72  mory. The differ
b560: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
b570: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 66  s function and f
b580: 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 29 0a 2a  ts5IdxMalloc().*
b590: 2a 20 69 73 20 74 68 61 74 20 74 68 69 73 20 69  * is that this i
b5a0: 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 46 74  ncrements the Ft
b5b0: 73 35 49 6e 64 65 78 2e 6e 50 65 6e 64 69 6e 67  s5Index.nPending
b5c0: 44 61 74 61 20 76 61 72 69 61 62 6c 65 20 62 79  Data variable by
b5d0: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
b5e0: 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  f bytes allocate
b5f0: 64 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  d. It should be 
b600: 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 6c 6c  used for all all
b610: 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 0a 2a 2a  ocations used.**
b620: 20 74 6f 20 73 74 6f 72 65 20 70 65 6e 64 69 6e   to store pendin
b630: 67 2d 64 61 74 61 20 77 69 74 68 69 6e 20 74 68  g-data within th
b640: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
b650: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
b660: 69 63 20 76 6f 69 64 20 2a 66 74 73 35 50 65 6e  ic void *fts5Pen
b670: 64 69 6e 67 4d 61 6c 6c 6f 63 28 46 74 73 35 49  dingMalloc(Fts5I
b680: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79  ndex *p, int nBy
b690: 74 65 29 7b 0a 20 20 70 2d 3e 6e 50 65 6e 64 69  te){.  p->nPendi
b6a0: 6e 67 44 61 74 61 20 2b 3d 20 6e 42 79 74 65 3b  ngData += nByte;
b6b0: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 64  .  return fts5Id
b6c0: 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65  xMalloc(p, nByte
b6d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
b6e0: 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 28 69 52  an entry for (iR
b6f0: 6f 77 69 64 2f 69 43 6f 6c 2f 69 50 6f 73 29 20  owid/iCol/iPos) 
b700: 74 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66  to the doclist f
b710: 6f 72 20 28 70 54 6f 6b 65 6e 2f 6e 54 6f 6b 65  or (pToken/nToke
b720: 6e 29 0a 2a 2a 20 69 6e 20 68 61 73 68 20 74 61  n).** in hash ta
b730: 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 20 69 49  ble for index iI
b740: 64 78 2e 20 49 66 20 69 49 64 78 20 69 73 20 7a  dx. If iIdx is z
b750: 65 72 6f 2c 20 74 68 69 73 20 69 73 20 74 68 65  ero, this is the
b760: 20 6d 61 69 6e 20 74 65 72 6d 73 20 0a 2a 2a 20   main terms .** 
b770: 69 6e 64 65 78 2e 20 56 61 6c 75 65 73 20 6f 66  index. Values of
b780: 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 20 66   1 and greater f
b790: 6f 72 20 69 49 64 78 20 61 72 65 20 70 72 65 66  or iIdx are pref
b7a0: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a 2a  ix indexes..**.*
b7b0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
b7c0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
b7d0: 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
b7e0: 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
b7f0: 65 20 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  e .** accordingl
b800: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
b810: 64 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48  d fts5AddTermToH
b820: 61 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ash(.  Fts5Index
b830: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b840: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
b850: 6f 62 6a 65 63 74 20 74 6f 20 77 72 69 74 65 20  object to write 
b860: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  to */.  int iIdx
b870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b880: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72 79          /* Entry
b890: 20 69 6e 20 70 2d 3e 61 48 61 73 68 5b 5d 20 74   in p->aHash[] t
b8a0: 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 69 6e  o update */.  in
b8b0: 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8d0: 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70   Column token ap
b8e0: 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e  pears in (-ve ->
b8f0: 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e   delete) */.  in
b900: 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b920: 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b   Position of tok
b930: 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e  en within column
b940: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
b950: 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
b960: 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74  oken  /* Token t
b970: 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  o add or remove 
b980: 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78  to or from index
b990: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
b9a0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
b9b0: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73  ->pConfig;.  Fts
b9c0: 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20  3Hash *pHash;.  
b9d0: 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69  Fts5PendingDocli
b9e0: 73 74 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20  st *pDoclist;.  
b9f0: 46 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69  Fts5PendingPosli
ba00: 73 74 20 2a 70 50 6f 73 6c 69 73 74 3b 0a 20 20  st *pPoslist;.  
ba10: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e  i64 iRowid = p->
ba20: 69 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20  iWriteRowid;    
ba30: 20 2f 2a 20 52 6f 77 69 64 20 61 73 73 6f 63 69   /* Rowid associ
ba40: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
ba50: 74 6f 6b 65 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20  tokens */..  /* 
ba60: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
ba70: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64 20  already occured 
ba80: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
ba90: 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70  o-op. */.  if( p
baa0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
bab0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
bac0: 46 69 6e 64 20 74 68 65 20 68 61 73 68 20 74 61  Find the hash ta
bad0: 62 6c 65 20 74 6f 20 75 73 65 2e 20 49 74 20 68  ble to use. It h
bae0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
baf0: 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20  allocated. */.  
bb00: 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43  assert( iIdx<=pC
bb10: 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29  onfig->nPrefix )
bb20: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  ;.  assert( iIdx
bb30: 3d 3d 30 20 7c 7c 20 6e 54 6f 6b 65 6e 3d 3d 70  ==0 || nToken==p
bb40: 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
bb50: 69 49 64 78 2d 31 5d 20 29 3b 0a 20 20 70 48 61  iIdx-1] );.  pHa
bb60: 73 68 20 3d 20 26 70 2d 3e 61 48 61 73 68 5b 69  sh = &p->aHash[i
bb70: 49 64 78 5d 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  Idx];..  /* Find
bb80: 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 6f 20   the doclist to 
bb90: 61 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c 6f 63  append to. Alloc
bba0: 61 74 65 20 61 20 6e 65 77 20 64 6f 63 6c 69 73  ate a new doclis
bbb0: 74 20 6f 62 6a 65 63 74 20 69 66 0a 20 20 2a 2a  t object if.  **
bbc0: 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
bbd0: 70 44 6f 63 6c 69 73 74 20 3d 20 28 46 74 73 35  pDoclist = (Fts5
bbe0: 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 2a 29  PendingDoclist*)
bbf0: 66 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61  fts3HashFind(pHa
bc00: 73 68 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  sh, pToken, nTok
bc10: 65 6e 29 3b 0a 20 20 69 66 28 20 70 44 6f 63 6c  en);.  if( pDocl
bc20: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74  ist==0 ){.    Ft
bc30: 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  s5PendingDoclist
bc40: 20 2a 70 44 65 6c 3b 0a 20 20 20 20 70 44 6f 63   *pDel;.    pDoc
bc50: 6c 69 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69  list = fts5Pendi
bc60: 6e 67 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  ngMalloc(p, size
bc70: 6f 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  of(Fts5PendingDo
bc80: 63 6c 69 73 74 29 20 2b 20 6e 54 6f 6b 65 6e 29  clist) + nToken)
bc90: 3b 0a 20 20 20 20 69 66 28 20 70 44 6f 63 6c 69  ;.    if( pDocli
bca0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
bcb0: 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 70 54      pDoclist->pT
bcc0: 65 72 6d 20 3d 20 28 75 38 2a 29 26 70 44 6f 63  erm = (u8*)&pDoc
bcd0: 6c 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 44 6f  list[1];.    pDo
bce0: 63 6c 69 73 74 2d 3e 6e 54 65 72 6d 20 3d 20 6e  clist->nTerm = n
bcf0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  Token;.    memcp
bd00: 79 28 70 44 6f 63 6c 69 73 74 2d 3e 70 54 65 72  y(pDoclist->pTer
bd10: 6d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  m, pToken, nToke
bd20: 6e 29 3b 0a 20 20 20 20 70 44 65 6c 20 3d 20 66  n);.    pDel = f
bd30: 74 73 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  ts3HashInsert(pH
bd40: 61 73 68 2c 20 70 44 6f 63 6c 69 73 74 2d 3e 70  ash, pDoclist->p
bd50: 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 2c 20 70 44  Term, nToken, pD
bd60: 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  oclist);.    if(
bd70: 20 70 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 61   pDel ){.      a
bd80: 73 73 65 72 74 28 20 70 44 6f 63 6c 69 73 74 3d  ssert( pDoclist=
bd90: 3d 70 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 73  =pDel );.      s
bda0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65 6c  qlite3_free(pDel
bdb0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  );.      p->rc =
bdc0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bdd0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
bde0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
bdf0: 64 20 74 68 65 20 70 6f 73 6c 69 73 74 20 74 6f  d the poslist to
be00: 20 61 70 70 65 6e 64 20 74 6f 2e 20 41 6c 6c 6f   append to. Allo
be10: 63 61 74 65 20 61 20 6e 65 77 20 6f 62 6a 65 63  cate a new objec
be20: 74 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  t if required. *
be30: 2f 0a 20 20 70 50 6f 73 6c 69 73 74 20 3d 20 70  /.  pPoslist = p
be40: 44 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69 73  Doclist->pPoslis
be50: 74 3b 0a 20 20 69 66 28 20 70 50 6f 73 6c 69 73  t;.  if( pPoslis
be60: 74 3d 3d 30 20 7c 7c 20 70 50 6f 73 6c 69 73 74  t==0 || pPoslist
be70: 2d 3e 69 52 6f 77 69 64 21 3d 69 52 6f 77 69 64  ->iRowid!=iRowid
be80: 20 29 7b 0a 20 20 20 20 70 50 6f 73 6c 69 73 74   ){.    pPoslist
be90: 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67 4d 61   = fts5PendingMa
bea0: 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
beb0: 74 73 35 50 65 6e 64 69 6e 67 50 6f 73 6c 69 73  ts5PendingPoslis
bec0: 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6f  t));.    if( pPo
bed0: 73 6c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  slist==0 ) retur
bee0: 6e 3b 0a 20 20 20 20 70 50 6f 73 6c 69 73 74 2d  n;.    pPoslist-
bef0: 3e 70 4e 65 78 74 20 3d 20 70 44 6f 63 6c 69 73  >pNext = pDoclis
bf00: 74 2d 3e 70 50 6f 73 6c 69 73 74 3b 0a 20 20 20  t->pPoslist;.   
bf10: 20 70 50 6f 73 6c 69 73 74 2d 3e 69 52 6f 77 69   pPoslist->iRowi
bf20: 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  d = iRowid;.    
bf30: 70 44 6f 63 6c 69 73 74 2d 3e 70 50 6f 73 6c 69  pDoclist->pPosli
bf40: 73 74 20 3d 20 70 50 6f 73 6c 69 73 74 3b 0a 20  st = pPoslist;. 
bf50: 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 43 6f     pDoclist->iCo
bf60: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 44 6f 63 6c  l = 0;.    pDocl
bf70: 69 73 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a 20  ist->iPos = 0;. 
bf80: 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
bf90: 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 74 68  the values to th
bfa0: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e  e position list.
bfb0: 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d   */.  if( iCol>=
bfc0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e  0 ){.    p->nPen
bfd0: 64 69 6e 67 44 61 74 61 20 2d 3d 20 70 50 6f 73  dingData -= pPos
bfe0: 6c 69 73 74 2d 3e 62 75 66 2e 6e 53 70 61 63 65  list->buf.nSpace
bff0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 21 3d  ;.    if( iCol!=
c000: 70 44 6f 63 6c 69 73 74 2d 3e 69 43 6f 6c 20 29  pDoclist->iCol )
c010: 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
c020: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
c030: 70 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73 74  p->rc, &pPoslist
c040: 2d 3e 62 75 66 2c 20 31 29 3b 0a 20 20 20 20 20  ->buf, 1);.     
c050: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
c060: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
c070: 26 70 50 6f 73 6c 69 73 74 2d 3e 62 75 66 2c 20  &pPoslist->buf, 
c080: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 44 6f  iCol);.      pDo
c090: 63 6c 69 73 74 2d 3e 69 43 6f 6c 20 3d 20 69 43  clist->iCol = iC
c0a0: 6f 6c 3b 0a 20 20 20 20 20 20 70 44 6f 63 6c 69  ol;.      pDocli
c0b0: 73 74 2d 3e 69 50 6f 73 20 3d 20 30 3b 0a 20 20  st->iPos = 0;.  
c0c0: 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
c0d0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
c0e0: 70 2d 3e 72 63 2c 20 26 70 50 6f 73 6c 69 73 74  p->rc, &pPoslist
c0f0: 2d 3e 62 75 66 2c 20 69 50 6f 73 20 2b 20 32 20  ->buf, iPos + 2 
c100: 2d 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50 6f 73  - pDoclist->iPos
c110: 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
c120: 6e 67 44 61 74 61 20 2b 3d 20 70 50 6f 73 6c 69  ngData += pPosli
c130: 73 74 2d 3e 62 75 66 2e 6e 53 70 61 63 65 3b 0a  st->buf.nSpace;.
c140: 20 20 20 20 70 44 6f 63 6c 69 73 74 2d 3e 69 50      pDoclist->iP
c150: 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20 7d 0a 7d  os = iPos;.  }.}
c160: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
c170: 20 70 65 6e 64 69 6e 67 2d 64 6f 63 6c 69 73 74   pending-doclist
c180: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
c190: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
c1a0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
c1b0: 6f 69 64 20 66 74 73 35 46 72 65 65 50 65 6e 64  oid fts5FreePend
c1c0: 69 6e 67 44 6f 63 6c 69 73 74 28 46 74 73 35 50  ingDoclist(Fts5P
c1d0: 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 70  endingDoclist *p
c1e0: 29 7b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67  ){.  Fts5Pending
c1f0: 50 6f 73 6c 69 73 74 20 2a 70 50 6f 73 6c 69 73  Poslist *pPoslis
c200: 74 3b 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67  t;.  Fts5Pending
c210: 50 6f 73 6c 69 73 74 20 2a 70 4e 65 78 74 3b 0a  Poslist *pNext;.
c220: 20 20 66 6f 72 28 70 50 6f 73 6c 69 73 74 3d 70    for(pPoslist=p
c230: 2d 3e 70 50 6f 73 6c 69 73 74 3b 20 70 50 6f 73  ->pPoslist; pPos
c240: 6c 69 73 74 3b 20 70 50 6f 73 6c 69 73 74 3d 70  list; pPoslist=p
c250: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
c260: 20 3d 20 70 50 6f 73 6c 69 73 74 2d 3e 70 4e 65   = pPoslist->pNe
c270: 78 74 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  xt;.    fts5Buff
c280: 65 72 46 72 65 65 28 26 70 50 6f 73 6c 69 73 74  erFree(&pPoslist
c290: 2d 3e 62 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  ->buf);.    sqli
c2a0: 74 65 33 5f 66 72 65 65 28 70 50 6f 73 6c 69 73  te3_free(pPoslis
c2b0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
c2c0: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  3_free(p);.}../*
c2d0: 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
c2e0: 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
c2f0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
c300: 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
c310: 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
c320: 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
c330: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
c340: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
c350: 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
c360: 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
c370: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
c380: 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
c390: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
c3a0: 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
c3b0: 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
c3c0: 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
c3d0: 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
c3e0: 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
c3f0: 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
c400: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
c410: 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
c420: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
c430: 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
c440: 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
c450: 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
c460: 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
c470: 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   a delete..*/.vo
c480: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  id sqlite3Fts5In
c490: 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35  dexWrite(.  Fts5
c4a0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c4c0: 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f  ndex to write to
c4d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
c500: 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
c510: 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
c520: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
c550: 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
c560: 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
c570: 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
c580: 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
c590: 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
c5a0: 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
c5b0: 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  om index */.){. 
c5c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5e0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
c5f0: 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
c600: 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  xes */.  Fts5Con
c610: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
c620: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 2f 2a  ->pConfig;..  /*
c630: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
c640: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64   already occured
c650: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
c660: 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
c670: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
c680: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
c690: 20 41 6c 6c 6f 63 61 74 65 20 68 61 73 68 20 74   Allocate hash t
c6a0: 61 62 6c 65 73 20 69 66 20 74 68 65 79 20 68 61  ables if they ha
c6b0: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  ve not already b
c6c0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
c6d0: 0a 20 20 69 66 28 20 70 2d 3e 61 48 61 73 68 3d  .  if( p->aHash=
c6e0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 48  =0 ){.    int nH
c6f0: 61 73 68 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 6e  ash = pConfig->n
c700: 50 72 65 66 69 78 20 2b 20 31 3b 0a 20 20 20 20  Prefix + 1;.    
c710: 70 2d 3e 61 48 61 73 68 20 3d 20 28 46 74 73 33  p->aHash = (Fts3
c720: 48 61 73 68 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Hash*)sqlite3_ma
c730: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33  lloc(sizeof(Fts3
c740: 48 61 73 68 29 20 2a 20 6e 48 61 73 68 29 3b 0a  Hash) * nHash);.
c750: 20 20 20 20 69 66 28 20 70 2d 3e 61 48 61 73 68      if( p->aHash
c760: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
c770: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c780: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
c790: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c7a0: 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Hash; i++){.    
c7b0: 20 20 20 20 66 74 73 33 48 61 73 68 49 6e 69 74      fts3HashInit
c7c0: 28 26 70 2d 3e 61 48 61 73 68 5b 69 5d 2c 20 46  (&p->aHash[i], F
c7d0: 54 53 33 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  TS3_HASH_STRING,
c7e0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c7f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64   }.  }..  /* Add
c800: 20 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20 74   the new token t
c810: 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  o the main terms
c820: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 41 6e 64   hash table. And
c830: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
c840: 20 20 2a 2a 20 70 72 65 66 69 78 20 68 61 73 68    ** prefix hash
c850: 20 74 61 62 6c 65 73 20 74 68 61 74 20 69 74 20   tables that it 
c860: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
c870: 66 6f 72 2e 20 2a 2f 0a 20 20 66 74 73 35 41 64  for. */.  fts5Ad
c880: 64 54 65 72 6d 54 6f 48 61 73 68 28 70 2c 20 30  dTermToHash(p, 0
c890: 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54  , iCol, iPos, pT
c8a0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
c8b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
c8c0: 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b  fig->nPrefix; i+
c8d0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b  +){.    if( nTok
c8e0: 65 6e 3e 3d 70 43 6f 6e 66 69 67 2d 3e 61 50 72  en>=pConfig->aPr
c8f0: 65 66 69 78 5b 69 5d 20 29 7b 0a 20 20 20 20 20  efix[i] ){.     
c900: 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48 61   fts5AddTermToHa
c910: 73 68 28 70 2c 20 69 2b 31 2c 20 69 43 6f 6c 2c  sh(p, i+1, iCol,
c920: 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 70   iPos, pToken, p
c930: 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
c940: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  i]);.    }.  }.}
c950: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
c960: 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69   a new segment-i
c970: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
c980: 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 0a  ure pStruct..**.
c990: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
c9a0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
c9b0: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
c9c0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30  on is a no-op. 0
c9d0: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
c9e0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
c9f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ca00: 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46  5AllocateSegid(F
ca10: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
ca20: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
ca30: 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  uct){.  int i;. 
ca40: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
ca50: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 30  TE_OK ) return 0
ca60: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
ca70: 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  100; i++){.    i
ca80: 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 20 20 73  nt iSegid;.    s
ca90: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
caa0: 73 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20 28  s(sizeof(int), (
cab0: 76 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b 0a  void*)&iSegid);.
cac0: 20 20 20 20 69 53 65 67 69 64 20 3d 20 69 53 65      iSegid = iSe
cad0: 67 69 64 20 26 20 28 28 31 20 3c 3c 20 46 54 53  gid & ((1 << FTS
cae0: 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31 29 3b  5_DATA_ID_B)-1);
caf0: 0a 20 20 20 20 69 66 28 20 69 53 65 67 69 64 20  .    if( iSegid 
cb00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76  ){.      int iLv
cb10: 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 66  l, iSeg;.      f
cb20: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
cb30: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
cb40: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
cb50: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
cb60: 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
cb70: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
cb80: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
cb90: 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70 53    if( iSegid==pS
cba0: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
cbb0: 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl].aSeg[iSeg].i
cbc0: 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Segid ){.       
cbd0: 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 30 3b       iSegid = 0;
cbe0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
cbf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
cc00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 53 65     }.    if( iSe
cc10: 67 69 64 20 29 20 72 65 74 75 72 6e 20 69 53 65  gid ) return iSe
cc20: 67 69 64 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72  gid;.  }..  p->r
cc30: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
cc40: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
cc50: 0a 73 74 61 74 69 63 20 46 74 73 35 50 65 6e 64  .static Fts5Pend
cc60: 69 6e 67 44 6f 63 6c 69 73 74 20 2a 66 74 73 35  ingDoclist *fts5
cc70: 50 65 6e 64 69 6e 67 4d 65 72 67 65 28 0a 20 20  PendingMerge(.  
cc80: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
cc90: 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
cca0: 69 73 74 20 2a 70 4c 65 66 74 2c 0a 20 20 46 74  ist *pLeft,.  Ft
ccb0: 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  s5PendingDoclist
ccc0: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 46 74   *pRight.){.  Ft
ccd0: 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  s5PendingDoclist
cce0: 20 2a 70 31 20 3d 20 70 4c 65 66 74 3b 0a 20 20   *p1 = pLeft;.  
ccf0: 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69  Fts5PendingDocli
cd00: 73 74 20 2a 70 32 20 3d 20 70 52 69 67 68 74 3b  st *p2 = pRight;
cd10: 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  .  Fts5PendingDo
cd20: 63 6c 69 73 74 20 2a 70 52 65 74 20 3d 20 30 3b  clist *pRet = 0;
cd30: 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  .  Fts5PendingDo
cd40: 63 6c 69 73 74 20 2a 2a 70 70 4f 75 74 20 3d 20  clist **ppOut = 
cd50: 26 70 52 65 74 3b 0a 0a 20 20 77 68 69 6c 65 28  &pRet;..  while(
cd60: 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20   p1 || p2 ){.   
cd70: 20 69 66 28 20 70 31 3d 3d 30 20 29 7b 0a 20 20   if( p1==0 ){.  
cd80: 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 32 3b      *ppOut = p2;
cd90: 0a 20 20 20 20 20 20 70 32 20 3d 20 30 3b 0a 20  .      p2 = 0;. 
cda0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 3d     }else if( p2=
cdb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f  =0 ){.      *ppO
cdc0: 75 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20 70  ut = p1;.      p
cdd0: 31 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  1 = 0;.    }else
cde0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70  {.      int nCmp
cdf0: 20 3d 20 4d 49 4e 28 70 31 2d 3e 6e 54 65 72 6d   = MIN(p1->nTerm
ce00: 2c 20 70 32 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20  , p2->nTerm);.  
ce10: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65      int res = me
ce20: 6d 63 6d 70 28 70 31 2d 3e 70 54 65 72 6d 2c 20  mcmp(p1->pTerm, 
ce30: 70 32 2d 3e 70 54 65 72 6d 2c 20 6e 43 6d 70 29  p2->pTerm, nCmp)
ce40: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ;.      if( res=
ce50: 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 6e  =0 ) res = p1->n
ce60: 54 65 72 6d 20 2d 20 70 32 2d 3e 6e 54 65 72 6d  Term - p2->nTerm
ce70: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  ;..      if( res
ce80: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
ce90: 20 70 32 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a   p2 is smaller *
cea0: 2f 0a 20 20 20 20 20 20 20 20 2a 70 70 4f 75 74  /.        *ppOut
ceb0: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 20 20 70   = p2;.        p
cec0: 70 4f 75 74 20 3d 20 26 70 32 2d 3e 70 4e 65 78  pOut = &p2->pNex
ced0: 74 3b 0a 20 20 20 20 20 20 20 20 70 32 20 3d 20  t;.        p2 = 
cee0: 70 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  p2->pNext;.     
cef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cf00: 2f 2a 20 70 31 20 69 73 20 73 6d 61 6c 6c 65 72  /* p1 is smaller
cf10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 70 4f   */.        *ppO
cf20: 75 74 20 3d 20 70 31 3b 0a 20 20 20 20 20 20 20  ut = p1;.       
cf30: 20 70 70 4f 75 74 20 3d 20 26 70 31 2d 3e 70 4e   ppOut = &p1->pN
cf40: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 31 20  ext;.        p1 
cf50: 3d 20 70 31 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = p1->pNext;.   
cf60: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 4f 75     }.      *ppOu
cf70: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
cf80: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
cf90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63  .}../*.** Extrac
cfa0: 74 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 66 72 6f  t all tokens fro
cfb0: 6d 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61  m hash table iHa
cfc0: 73 68 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 6d  sh and link them
cfd0: 20 69 6e 74 6f 20 61 20 6c 69 73 74 0a 2a 2a 20   into a list.** 
cfe0: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  in sorted order.
cff0: 20 54 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   The hash table 
d000: 69 73 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  is cleared befor
d010: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74 20  e returning. It 
d020: 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 70 6f 6e  is.** the respon
d030: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
d040: 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74  caller to free t
d050: 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
d060: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 6c  he returned.** l
d070: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ist..**.** If an
d080: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
d090: 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  et the Fts5Index
d0a0: 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .rc error code. 
d0b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
d0c0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
d0d0: 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
d0e0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
d0f0: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 50 65  */.static Fts5Pe
d100: 6e 64 69 6e 67 44 6f 63 6c 69 73 74 20 2a 66 74  ndingDoclist *ft
d110: 73 35 50 65 6e 64 69 6e 67 4c 69 73 74 28 46 74  s5PendingList(Ft
d120: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
d130: 69 48 61 73 68 29 7b 0a 20 20 63 6f 6e 73 74 20  iHash){.  const 
d140: 69 6e 74 20 6e 4d 65 72 67 65 53 6c 6f 74 20 3d  int nMergeSlot =
d150: 20 33 32 3b 0a 20 20 46 74 73 33 48 61 73 68 20   32;.  Fts3Hash 
d160: 2a 70 48 61 73 68 3b 0a 20 20 46 74 73 33 48 61  *pHash;.  Fts3Ha
d170: 73 68 45 6c 65 6d 20 2a 70 45 3b 20 20 20 20 20  shElem *pE;     
d180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
d190: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
d1a0: 2f 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44  /.  Fts5PendingD
d1b0: 6f 63 6c 69 73 74 20 2a 2a 61 70 3b 0a 20 20 46  oclist **ap;.  F
d1c0: 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73  ts5PendingDoclis
d1d0: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  t *pList;.  int 
d1e0: 69 3b 0a 0a 20 20 61 70 20 3d 20 66 74 73 35 49  i;..  ap = fts5I
d1f0: 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
d200: 6f 66 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f  of(Fts5PendingDo
d210: 63 6c 69 73 74 2a 29 20 2a 20 6e 4d 65 72 67 65  clist*) * nMerge
d220: 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 21 61 70  Slot);.  if( !ap
d230: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
d240: 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 48 61 73  pHash = &p->aHas
d250: 68 5b 69 48 61 73 68 5d 3b 0a 20 20 66 6f 72 28  h[iHash];.  for(
d260: 70 45 3d 66 74 73 33 48 61 73 68 46 69 72 73 74  pE=fts3HashFirst
d270: 28 70 48 61 73 68 29 3b 20 70 45 3b 20 70 45 3d  (pHash); pE; pE=
d280: 66 74 73 33 48 61 73 68 4e 65 78 74 28 70 45 29  fts3HashNext(pE)
d290: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
d2a0: 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63    Fts5PendingDoc
d2b0: 6c 69 73 74 20 2a 70 44 6f 63 6c 69 73 74 20 3d  list *pDoclist =
d2c0: 20 28 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63   (Fts5PendingDoc
d2d0: 6c 69 73 74 2a 29 66 74 73 33 48 61 73 68 44 61  list*)fts3HashDa
d2e0: 74 61 28 70 45 29 3b 0a 20 20 20 20 61 73 73 65  ta(pE);.    asse
d2f0: 72 74 28 20 70 44 6f 63 6c 69 73 74 2d 3e 70 4e  rt( pDoclist->pN
d300: 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f  ext==0 );.    fo
d310: 72 28 69 3d 30 3b 20 61 70 5b 69 5d 3b 20 69 2b  r(i=0; ap[i]; i+
d320: 2b 29 7b 0a 20 20 20 20 20 20 70 44 6f 63 6c 69  +){.      pDocli
d330: 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67  st = fts5Pending
d340: 4d 65 72 67 65 28 70 2c 20 70 44 6f 63 6c 69 73  Merge(p, pDoclis
d350: 74 2c 20 61 70 5b 69 5d 29 3b 0a 20 20 20 20 20  t, ap[i]);.     
d360: 20 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20   ap[i] = 0;.    
d370: 7d 0a 20 20 20 20 61 70 5b 69 5d 20 3d 20 70 44  }.    ap[i] = pD
d380: 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 70  oclist;.  }..  p
d390: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
d3a0: 69 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 53 6c 6f  i=0; i<nMergeSlo
d3b0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  t; i++){.    pLi
d3c0: 73 74 20 3d 20 66 74 73 35 50 65 6e 64 69 6e 67  st = fts5Pending
d3d0: 4d 65 72 67 65 28 70 2c 20 70 4c 69 73 74 2c 20  Merge(p, pList, 
d3e0: 61 70 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 73  ap[i]);.  }..  s
d3f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 29 3b  qlite3_free(ap);
d400: 0a 20 20 66 74 73 33 48 61 73 68 43 6c 65 61 72  .  fts3HashClear
d410: 28 70 48 61 73 68 29 3b 0a 20 20 72 65 74 75 72  (pHash);.  retur
d420: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
d430: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
d440: 65 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c  e of the prefix,
d450: 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20   in bytes, that 
d460: 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70 4e 65  buffer (nNew/pNe
d470: 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77 69 74  w) shares.** wit
d480: 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64 2f 70  h buffer (nOld/p
d490: 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Old)..*/.static 
d4a0: 69 6e 74 20 66 74 73 35 50 72 65 66 69 78 43 6f  int fts5PrefixCo
d4b0: 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20 6e 4f  mpress(.  int nO
d4c0: 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f  ld, const u8 *pO
d4d0: 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20  ld,.  int nNew, 
d4e0: 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77 0a 29  const u8 *pNew.)
d4f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
d500: 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20  (i=0; i<nNew && 
d510: 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
d520: 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70    if( pOld[i]!=p
d530: 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  New[i] ) break;.
d540: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
d550: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
d560: 70 49 74 65 72 2d 3e 69 4f 66 66 20 6f 66 66 73  pIter->iOff offs
d570: 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  et currently poi
d580: 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
d590: 69 6e 64 69 63 61 74 69 6e 67 20 6f 6e 65 0a 2a  indicating one.*
d5a0: 2a 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6c  * or more term-l
d5b0: 65 73 73 20 6e 6f 64 65 73 2c 20 61 64 76 61 6e  ess nodes, advan
d5c0: 63 65 20 70 61 73 74 20 69 74 20 61 6e 64 20 73  ce past it and s
d5d0: 65 74 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79  et pIter->nEmpty
d5e0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   to.** the numbe
d5f0: 72 20 6f 66 20 65 6d 70 74 79 20 63 68 69 6c 64  r of empty child
d600: 20 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   nodes..*/.stati
d610: 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49  c void fts5NodeI
d620: 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28  terGobbleNEmpty(
d630: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49  Fts5NodeIter *pI
d640: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
d650: 72 2d 3e 69 4f 66 66 3c 70 49 74 65 72 2d 3e 6e  r->iOff<pIter->n
d660: 44 61 74 61 20 26 26 20 30 3d 3d 28 70 49 74 65  Data && 0==(pIte
d670: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
d680: 69 4f 66 66 5d 20 26 20 30 78 66 65 29 20 29 7b  iOff] & 0xfe) ){
d690: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
d6a0: 2b 2b 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ++;.    pIter->i
d6b0: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
d6c0: 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61  32(&pIter->aData
d6d0: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 70  [pIter->iOff], p
d6e0: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20  Iter->nEmpty);. 
d6f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
d700: 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20  r->nEmpty = 0;. 
d710: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61   }.}../*.** Adva
d720: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
d730: 65 6e 74 72 79 20 77 69 74 68 69 6e 20 74 68 65  entry within the
d740: 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   node..*/.static
d750: 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74   void fts5NodeIt
d760: 65 72 4e 65 78 74 28 69 6e 74 20 2a 70 52 63 2c  erNext(int *pRc,
d770: 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70   Fts5NodeIter *p
d780: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
d790: 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72 2d  er->iOff>=pIter-
d7a0: 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 70 49  >nData ){.    pI
d7b0: 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b 0a  ter->aData = 0;.
d7c0: 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69 6c      pIter->iChil
d7d0: 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 45 6d 70  d += pIter->nEmp
d7e0: 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ty;.  }else{.   
d7f0: 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e 65 77 3b   int nPre, nNew;
d800: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
d810: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
d820: 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  &pIter->aData[pI
d830: 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 50 72 65  ter->iOff], nPre
d840: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f  );.    pIter->iO
d850: 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ff += getVarint3
d860: 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  2(&pIter->aData[
d870: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 4e  pIter->iOff], nN
d880: 65 77 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ew);.    pIter->
d890: 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d 32 3b  term.n = nPre-2;
d8a0: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
d8b0: 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 26  ppendBlob(pRc, &
d8c0: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
d8d0: 77 2c 20 70 49 74 65 72 2d 3e 61 44 61 74 61 2b  w, pIter->aData+
d8e0: 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b 0a 20 20  pIter->iOff);.  
d8f0: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
d900: 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72   nNew;.    pIter
d910: 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28 31 20 2b  ->iChild += (1 +
d920: 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b   pIter->nEmpty);
d930: 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
d940: 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49  rGobbleNEmpty(pI
d950: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  ter);.    if( *p
d960: 52 63 20 29 20 70 49 74 65 72 2d 3e 61 44 61 74  Rc ) pIter->aDat
d970: 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  a = 0;.  }.}.../
d980: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
d990: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
d9a0: 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65  ect pIter to ite
d9b0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
d9c0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73 65 67   internal.** seg
d9d0: 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20 70 44 61  ment node in pDa
d9e0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
d9f0: 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49  id fts5NodeIterI
da00: 6e 69 74 28 69 6e 74 20 6e 44 61 74 61 2c 20 63  nit(int nData, c
da10: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
da20: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49  Fts5NodeIter *pI
da30: 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  ter){.  memset(p
da40: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
da50: 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
da60: 72 2d 3e 61 44 61 74 61 20 3d 20 61 44 61 74 61  r->aData = aData
da70: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44 61 74 61  ;.  pIter->nData
da80: 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70 49 74 65   = nData;.  pIte
da90: 72 2d 3e 69 4f 66 66 20 3d 20 67 65 74 56 61 72  r->iOff = getVar
daa0: 69 6e 74 33 32 28 61 44 61 74 61 2c 20 70 49 74  int32(aData, pIt
dab0: 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 66  er->iChild);.  f
dac0: 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c  ts5NodeIterGobbl
dad0: 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a  eNEmpty(pIter);.
dae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
daf0: 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  y memory allocat
db00: 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
db10: 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  or object..*/.st
db20: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f  atic void fts5No
db30: 64 65 49 74 65 72 46 72 65 65 28 46 74 73 35 4e  deIterFree(Fts5N
db40: 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b  odeIter *pIter){
db50: 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
db60: 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b  e(&pIter->term);
db70: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
db80: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  is called once f
db90: 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61 67  or each leaf pag
dba0: 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69 72  e except the fir
dbb0: 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  st that contains
dbc0: 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  .** at least one
dbd0: 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20   term. Argument 
dbe0: 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73  (nTerm/pTerm) is
dbf0: 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d   the split-key -
dc00: 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20   a term that.** 
dc10: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61  is larger than a
dc20: 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e  ll terms written
dc30: 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76   to earlier leav
dc40: 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f  es, and equal to
dc50: 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74   or.** smaller t
dc60: 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 74 65  han the first te
dc70: 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65  rm on the new le
dc80: 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  af..**.** If an 
dc90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
dca0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
dcb0: 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78  eft in Fts5Index
dcc0: 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  .rc. If an error
dcd0: 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
dce0: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
dcf0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
dd00: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
dd10: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
dd20: 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
dd30: 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49  reeTerm(.  Fts5I
dd40: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
dd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
dd60: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
dd70: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
dd80: 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
dd90: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
dda0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
ddb0: 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38   nTerm, const u8
ddc0: 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20   *pTerm      /* 
ddd0: 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65  First term on ne
dde0: 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  w page */.){.  i
ddf0: 6e 74 20 69 48 65 69 67 68 74 3b 0a 20 20 66 6f  nt iHeight;.  fo
de00: 72 28 69 48 65 69 67 68 74 3d 31 3b 20 31 3b 20  r(iHeight=1; 1; 
de10: 69 48 65 69 67 68 74 2b 2b 29 7b 0a 20 20 20 20  iHeight++){.    
de20: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
de30: 70 50 61 67 65 3b 0a 0a 20 20 20 20 69 66 28 20  pPage;..    if( 
de40: 69 48 65 69 67 68 74 3e 3d 70 57 72 69 74 65 72  iHeight>=pWriter
de50: 2d 3e 6e 57 72 69 74 65 72 20 29 7b 0a 20 20 20  ->nWriter ){.   
de60: 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
de70: 72 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 46  r *aNew;.      F
de80: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
de90: 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  New;.      int n
dea0: 4e 65 77 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  New = sizeof(Fts
deb0: 35 50 61 67 65 57 72 69 74 65 72 29 20 2a 20 28  5PageWriter) * (
dec0: 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
ded0: 2b 31 29 3b 0a 20 20 20 20 20 20 61 4e 65 77 20  +1);.      aNew 
dee0: 3d 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65  = (Fts5PageWrite
def0: 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
df00: 6f 63 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69  oc(pWriter->aWri
df10: 74 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  ter, nNew);.    
df20: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20    if( aNew==0 ) 
df30: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 20 20 70  return;..      p
df40: 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 57 72 69  New = &aNew[pWri
df50: 74 65 72 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20  ter->nWriter];. 
df60: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77       memset(pNew
df70: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
df80: 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20  PageWriter));.  
df90: 20 20 20 20 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d      pNew->pgno =
dfa0: 20 31 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75   1;.      fts5Bu
dfb0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
dfc0: 28 26 70 2d 3e 72 63 2c 20 26 70 4e 65 77 2d 3e  (&p->rc, &pNew->
dfd0: 62 75 66 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  buf, 1);..      
dfe0: 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
dff0: 2b 2b 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  ++;.      pWrite
e000: 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 61 4e 65  r->aWriter = aNe
e010: 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  w;.    }.    pPa
e020: 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  ge = &pWriter->a
e030: 57 72 69 74 65 72 5b 69 48 65 69 67 68 74 5d 3b  Writer[iHeight];
e040: 0a 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  ..    if( pWrite
e050: 72 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20  r->nEmpty ){.   
e060: 20 20 20 61 73 73 65 72 74 28 20 69 48 65 69 67     assert( iHeig
e070: 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 66  ht==1 );.      f
e080: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
e090: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
e0a0: 50 61 67 65 2d 3e 62 75 66 2c 20 30 29 3b 0a 20  Page->buf, 0);. 
e0b0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
e0c0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
e0d0: 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
e0e0: 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
e0f0: 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  );.      pWriter
e100: 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20  ->nEmpty = 0;.  
e110: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61    }..    if( pPa
e120: 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67  ge->buf.n>=p->pg
e130: 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  sz ){.      /* p
e140: 50 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69  Page will be wri
e150: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68  tten to disk. Th
e160: 65 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77  e term will be w
e170: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
e180: 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20        ** parent 
e190: 6f 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20  of pPage.  */.  
e1a0: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
e1b0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
e1c0: 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
e1d0: 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
e1e0: 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
e1f0: 48 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70  Height, pPage->p
e200: 67 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  gno.      );.   
e210: 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
e220: 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67  (p, iRowid, pPag
e230: 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
e240: 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
e250: 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
e260: 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20  Page->buf);.    
e270: 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
e280: 28 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a  (&pPage->term);.
e290: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
e2a0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
e2b0: 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
e2c0: 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f  , pPage[-1].pgno
e2d0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
e2e0: 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  pgno++;.    }els
e2f0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72  e{.      int nPr
e300: 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  e = fts5PrefixCo
e310: 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
e320: 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
e330: 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
e340: 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  m);.      fts5Bu
e350: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
e360: 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
e370: 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20  >buf, nPre+2);. 
e380: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
e390: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
e3a0: 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
e3b0: 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20   nTerm-nPre);.  
e3c0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
e3d0: 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
e3e0: 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
e3f0: 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b  erm-nPre, pTerm+
e400: 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73  nPre);.      fts
e410: 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
e420: 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c  c, &pPage->term,
e430: 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
e440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e450: 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
e460: 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
e470: 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74  treeNoTerm(.  Ft
e480: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e4a0: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
e4b0: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
e4c0: 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
e4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
e4e0: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ter object */.){
e4f0: 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  .  pWriter->nEmp
e500: 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ty++;.}..static 
e510: 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c  void fts5WriteFl
e520: 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65  ushLeaf(Fts5Inde
e530: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
e540: 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
e550: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
e560: 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30   zero[] = { 0x00
e570: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
e580: 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65  00 };.  Fts5Page
e590: 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
e5a0: 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
e5b0: 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f 77  r[0];.  i64 iRow
e5c0: 69 64 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  id;..  if( pPage
e5d0: 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20  ->term.n==0 ){. 
e5e0: 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61     /* No term wa
e5f0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e600: 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 66  s page. */.    f
e610: 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
e620: 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
e630: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
e640: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
e650: 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a  e to the db. */.
e660: 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
e670: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
e680: 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
e690: 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c  iter->iSegid, 0,
e6a0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
e6b0: 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
e6c0: 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d  , iRowid, pPage-
e6d0: 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
e6e0: 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  uf.n);..  /* Ini
e6f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74  tialize the next
e700: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
e710: 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
e720: 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  e->buf);.  fts5B
e730: 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
e740: 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  ->term);.  fts5B
e750: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
e760: 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
e770: 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20  buf, 4, zero);. 
e780: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
e790: 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
e7a0: 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
e7b0: 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
e7c0: 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
e7d0: 74 74 65 6e 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tten++;.}../*.**
e7e0: 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
e7f0: 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
e800: 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
e810: 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
e820: 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
e830: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e840: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
e850: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
e860: 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
e870: 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
e880: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
e890: 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
e8a0: 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
e8b0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
e8c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e8d0: 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
e8e0: 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
e8f0: 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
e900: 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
e910: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
e920: 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
e930: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
e960: 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
e970: 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
e980: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
e990: 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
e9a0: 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20  ->aWriter[0];.. 
e9b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e9c0: 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67  buf.n==0 || pPag
e9d0: 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20  e->buf.n>4 );.  
e9e0: 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
e9f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65  ==0 ){.    /* Ze
ea00: 72 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ro the first ter
ea10: 6d 20 61 6e 64 20 66 69 72 73 74 20 64 6f 63 69  m and first doci
ea20: 64 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20  d fields */.    
ea30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
ea40: 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
ea50: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
ea60: 30 20 7d 3b 0a 20 20 20 20 66 74 73 35 42 75 66  0 };.    fts5Buf
ea70: 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
ea80: 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
ea90: 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20  f, 4, zero);.   
eaa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
eab0: 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 7d  term.n==0 );.  }
eac0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
ead0: 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28 20  eturn;.  .  if( 
eae0: 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30  pPage->term.n==0
eaf0: 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   ){.    /* Updat
eb00: 65 20 74 68 65 20 22 66 69 72 73 74 20 74 65 72  e the "first ter
eb10: 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  m" field of the 
eb20: 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  page header. */.
eb30: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
eb40: 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26  e->buf.p[2]==0 &
eb50: 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33  & pPage->buf.p[3
eb60: 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  ]==0 );.    fts5
eb70: 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
eb80: 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e  uf.p[2], pPage->
eb90: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65  buf.n);.    nPre
eba0: 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
ebb0: 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
ebc0: 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a  r[0].pgno!=1 ){.
ebd0: 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
ebe0: 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69  treeTerm(p, pWri
ebf0: 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
ec00: 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  m);.      pPage 
ec10: 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
ec20: 74 65 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20  ter[0];.    }.  
ec30: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
ec40: 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
ec50: 6f 6d 70 72 65 73 73 28 0a 20 20 20 20 20 20 20  ompress(.       
ec60: 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20   pPage->term.n, 
ec70: 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e  pPage->term.p, n
ec80: 54 65 72 6d 2c 20 70 54 65 72 6d 0a 20 20 20 20  Term, pTerm.    
ec90: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
eca0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
ecb0: 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
ecc0: 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d  f, nPrefix);.  }
ecd0: 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
ece0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
ecf0: 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74  s of new data, t
ed00: 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74  hen the term dat
ed10: 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f  a itself.  ** to
ed20: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
ed30: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
ed40: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
ed50: 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
ed60: 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  m - nPrefix);.  
ed70: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
ed80: 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
ed90: 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
eda0: 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72  - nPrefix, &pTer
edb0: 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20  m[nPrefix]);..  
edc0: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
edd0: 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65 72  s5PageWriter.ter
ede0: 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74  m field. */.  ft
edf0: 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
ee00: 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
ee10: 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
ee20: 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ..  pWriter->bFi
ee30: 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
ee40: 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   0;.  pWriter->b
ee50: 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
ee60: 69 73 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ist = 1;..  /* I
ee70: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  f the current le
ee80: 61 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c  af page is full,
ee90: 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
eea0: 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  k. */.  if( pPag
eeb0: 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73  e->buf.n>=p->pgs
eec0: 7a 20 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69  z ){.    fts5Wri
eed0: 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
eee0: 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 57 72  Writer);.    pWr
eef0: 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
ef00: 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d  dInPage = 1;.  }
ef10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
ef20: 20 61 20 64 6f 63 69 64 20 74 6f 20 74 68 65 20   a docid to the 
ef30: 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
ef40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ef50: 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
ef60: 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
ef70: 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
ef80: 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
ef90: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
efa0: 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
efb0: 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
efc0: 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b  ter->aWriter[0];
efd0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
efe0: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
eff0: 74 20 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20  t docid written 
f000: 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65 74  to the page, set
f010: 20 74 68 65 20 0a 20 20 2a 2a 20 64 6f 63 69 64   the .  ** docid
f020: 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
f030: 70 61 67 65 2d 68 65 61 64 65 72 2e 20 20 2a 2f  page-header.  */
f040: 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
f050: 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
f060: 65 20 29 20 66 74 73 35 50 75 74 55 31 36 28 70  e ) fts5PutU16(p
f070: 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
f080: 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f  ge->buf.n);..  /
f090: 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f 63 69  * Write the doci
f0a0: 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69  d. */.  if( pWri
f0b0: 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
f0c0: 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72  InDoclist || pWr
f0d0: 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
f0e0: 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 66  dInPage ){.    f
f0f0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
f100: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
f110: 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69  Page->buf, iRowi
f120: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
f130: 20 61 73 73 65 72 74 28 20 69 52 6f 77 69 64 3c   assert( iRowid<
f140: 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
f150: 77 69 64 20 29 3b 0a 20 20 20 20 66 74 73 35 42  wid );.    fts5B
f160: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
f170: 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
f180: 2d 3e 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e  ->buf, pWriter->
f190: 69 50 72 65 76 52 6f 77 69 64 20 2d 20 69 52 6f  iPrevRowid - iRo
f1a0: 77 69 64 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69  wid);.  }.  pWri
f1b0: 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
f1c0: 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 57 72 69  = iRowid;.  pWri
f1d0: 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
f1e0: 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20  InDoclist = 0;. 
f1f0: 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
f200: 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
f210: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62  ..  if( pPage->b
f220: 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73 7a 20 29 7b  uf.n>=p->pgsz ){
f230: 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c  .    fts5WriteFl
f240: 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
f250: 65 72 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  er);.    pWriter
f260: 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
f270: 61 67 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  age = 1;.  }.}..
f280: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
f290: 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
f2a0: 73 74 49 6e 74 28 0a 20 20 46 74 73 35 49 6e 64  stInt(.  Fts5Ind
f2b0: 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
f2c0: 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
f2d0: 2c 0a 20 20 69 6e 74 20 69 56 61 6c 0a 29 7b 0a  ,.  int iVal.){.
f2e0: 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
f2f0: 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
f300: 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a  er->aWriter[0];.
f310: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
f320: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
f330: 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 56   &pPage->buf, iV
f340: 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  al);.  if( pPage
f350: 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67 73 7a  ->buf.n>=p->pgsz
f360: 20 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69 74   ){.    fts5Writ
f370: 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
f380: 72 69 74 65 72 29 3b 0a 20 20 20 20 70 57 72 69  riter);.    pWri
f390: 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
f3a0: 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d 0a  InPage = 1;.  }.
f3b0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
f3c0: 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65  ts5WriteAppendZe
f3d0: 72 6f 62 79 74 65 28 46 74 73 35 49 6e 64 65 78  robyte(Fts5Index
f3e0: 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
f3f0: 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
f400: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
f410: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
f420: 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
f430: 5b 30 5d 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a  [0].buf, 0);.}..
f440: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
f450: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 65 6e 64  contents of pend
f460: 69 6e 67 2d 64 6f 63 6c 69 73 74 20 6f 62 6a 65  ing-doclist obje
f470: 63 74 20 70 44 6f 63 6c 69 73 74 20 74 6f 20 77  ct pDoclist to w
f480: 72 69 74 65 72 20 70 57 72 69 74 65 72 2e 0a 2a  riter pWriter..*
f490: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
f4a0: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
f4b0: 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
f4c0: 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
f4d0: 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
f4e0: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
f4f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
f500: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
f510: 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
f520: 74 65 50 65 6e 64 69 6e 67 44 6f 63 6c 69 73 74  tePendingDoclist
f530: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
f540: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f550: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
f560: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
f570: 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
f580: 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
f590: 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 69 73  /* Write to this
f5a0: 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   writer object *
f5b0: 2f 0a 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44  /.  Fts5PendingD
f5c0: 6f 63 6c 69 73 74 20 2a 70 44 6f 63 6c 69 73 74  oclist *pDoclist
f5d0: 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
f5e0: 6f 20 77 72 69 74 65 20 74 6f 20 70 57 72 69 74  o write to pWrit
f5f0: 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 50  er */.){.  Fts5P
f600: 65 6e 64 69 6e 67 50 6f 73 6c 69 73 74 20 2a 70  endingPoslist *p
f610: 50 6f 73 6c 69 73 74 3b 20 20 20 2f 2a 20 55 73  Poslist;   /* Us
f620: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
f630: 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73  rough the doclis
f640: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  t */..  /* Appen
f650: 64 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  d the term */.  
f660: 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
f670: 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20  erm(p, pWriter, 
f680: 70 44 6f 63 6c 69 73 74 2d 3e 6e 54 65 72 6d 2c  pDoclist->nTerm,
f690: 20 70 44 6f 63 6c 69 73 74 2d 3e 70 54 65 72 6d   pDoclist->pTerm
f6a0: 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20  );..  /* Append 
f6b0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
f6c0: 74 20 66 6f 72 20 65 61 63 68 20 72 6f 77 69 64  t for each rowid
f6d0: 20 2a 2f 0a 20 20 66 6f 72 28 70 50 6f 73 6c 69   */.  for(pPosli
f6e0: 73 74 3d 70 44 6f 63 6c 69 73 74 2d 3e 70 50 6f  st=pDoclist->pPo
f6f0: 73 6c 69 73 74 3b 20 70 50 6f 73 6c 69 73 74 3b  slist; pPoslist;
f700: 20 70 50 6f 73 6c 69 73 74 3d 70 50 6f 73 6c 69   pPoslist=pPosli
f710: 73 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  st->pNext){.    
f720: 69 6e 74 20 69 20 3d 20 30 3b 0a 0a 20 20 20 20  int i = 0;..    
f730: 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f  /* Append the ro
f740: 77 69 64 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20  wid itself */.  
f750: 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
f760: 64 52 6f 77 69 64 28 70 2c 20 70 57 72 69 74 65  dRowid(p, pWrite
f770: 72 2c 20 70 50 6f 73 6c 69 73 74 2d 3e 69 52 6f  r, pPoslist->iRo
f780: 77 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  wid);..    /* Co
f790: 70 79 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  py the position 
f7a0: 6c 69 73 74 20 74 6f 20 74 68 65 20 6f 75 74 70  list to the outp
f7b0: 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
f7c0: 20 20 77 68 69 6c 65 28 20 69 3c 70 50 6f 73 6c    while( i<pPosl
f7d0: 69 73 74 2d 3e 62 75 66 2e 6e 29 7b 0a 20 20 20  ist->buf.n){.   
f7e0: 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
f7f0: 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e     i += getVarin
f800: 74 33 32 28 26 70 50 6f 73 6c 69 73 74 2d 3e 62  t32(&pPoslist->b
f810: 75 66 2e 70 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a  uf.p[i], iVal);.
f820: 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
f830: 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28  ppendPoslistInt(
f840: 70 2c 20 70 57 72 69 74 65 72 2c 20 69 56 61 6c  p, pWriter, iVal
f850: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
f860: 20 57 72 69 74 65 20 74 68 65 20 70 6f 73 69 74   Write the posit
f870: 69 6f 6e 20 6c 69 73 74 20 74 65 72 6d 69 6e 61  ion list termina
f880: 74 6f 72 20 2a 2f 0a 20 20 20 20 66 74 73 35 57  tor */.    fts5W
f890: 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79  riteAppendZeroby
f8a0: 74 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  te(p, pWriter);.
f8b0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
f8c0: 74 68 65 20 64 6f 63 6c 69 73 74 20 74 65 72 6d  the doclist term
f8d0: 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 66 74 73 35  inator */.  fts5
f8e0: 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62  WriteAppendZerob
f8f0: 79 74 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b  yte(p, pWriter);
f900: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
f910: 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
f920: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
f930: 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
f940: 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
f950: 6e 74 20 2a 70 6e 48 65 69 67 68 74 2c 0a 20 20  nt *pnHeight,.  
f960: 69 6e 74 20 2a 70 6e 4c 65 61 66 0a 29 7b 0a 20  int *pnLeaf.){. 
f970: 20 69 6e 74 20 69 3b 0a 20 20 2a 70 6e 4c 65 61   int i;.  *pnLea
f980: 66 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 57 72  f = pWriter->aWr
f990: 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 3b 0a 20 20  iter[0].pgno;.  
f9a0: 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 57 72 69  *pnHeight = pWri
f9b0: 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 20 20  ter->nWriter;.  
f9c0: 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
f9d0: 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
f9e0: 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
f9f0: 57 72 69 74 65 72 3e 31 20 26 26 20 70 57 72 69  Writer>1 && pWri
fa00: 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20  ter->nEmpty ){. 
fa10: 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
fa20: 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65  r *pPg = &pWrite
fa30: 72 2d 3e 61 57 72 69 74 65 72 5b 31 5d 3b 0a 20  r->aWriter[1];. 
fa40: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
fa50: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
fa60: 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 30 29 3b  , &pPg->buf, 0);
fa70: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
fa80: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
fa90: 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 70  rc, &pPg->buf, p
faa0: 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b  Writer->nEmpty);
fab0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 31 3b 20  .  }.  for(i=1; 
fac0: 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74  i<pWriter->nWrit
fad0: 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  er; i++){.    Ft
fae0: 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
faf0: 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  g = &pWriter->aW
fb00: 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 69 36  riter[i];.    i6
fb10: 34 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45  4 iRow = FTS5_SE
fb20: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
fb30: 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74  ter->iIdx, pWrit
fb40: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
fb50: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 66  Pg->pgno);.    f
fb60: 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
fb70: 69 52 6f 77 2c 20 70 50 67 2d 3e 62 75 66 2e 70  iRow, pPg->buf.p
fb80: 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 29 3b 0a 20  , pPg->buf.n);. 
fb90: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
fba0: 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
fbb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
fbc0: 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 67 20  PageWriter *pPg 
fbd0: 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
fbe0: 74 65 72 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35  ter[i];.    fts5
fbf0: 42 75 66 66 65 72 46 72 65 65 28 26 70 50 67 2d  BufferFree(&pPg-
fc00: 3e 74 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35  >term);.    fts5
fc10: 42 75 66 66 65 72 46 72 65 65 28 26 70 50 67 2d  BufferFree(&pPg-
fc20: 3e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >buf);.  }.  sql
fc30: 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
fc40: 72 2d 3e 61 57 72 69 74 65 72 29 3b 0a 7d 0a 0a  r->aWriter);.}..
fc50: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
fc60: 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73  WriteInit(.  Fts
fc70: 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
fc80: 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
fc90: 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 49 64  iter, .  int iId
fca0: 78 2c 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b  x, int iSegid.){
fcb0: 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65  .  memset(pWrite
fcc0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
fcd0: 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
fce0: 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20  pWriter->iIdx = 
fcf0: 69 49 64 78 3b 0a 20 20 70 57 72 69 74 65 72 2d  iIdx;.  pWriter-
fd00: 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
fd10: 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57  ;..  pWriter->aW
fd20: 72 69 74 65 72 20 3d 20 28 46 74 73 35 50 61 67  riter = (Fts5Pag
fd30: 65 57 72 69 74 65 72 2a 29 66 74 73 35 49 64 78  eWriter*)fts5Idx
fd40: 4d 61 6c 6c 6f 63 28 70 2c 73 69 7a 65 6f 66 28  Malloc(p,sizeof(
fd50: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 29 29  Fts5PageWriter))
fd60: 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ;.  if( pWriter-
fd70: 3e 61 57 72 69 74 65 72 3d 3d 30 20 29 20 72 65  >aWriter==0 ) re
fd80: 74 75 72 6e 3b 0a 20 20 70 57 72 69 74 65 72 2d  turn;.  pWriter-
fd90: 3e 6e 57 72 69 74 65 72 20 3d 20 31 3b 0a 20 20  >nWriter = 1;.  
fda0: 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
fdb0: 5b 30 5d 2e 70 67 6e 6f 20 3d 20 31 3b 0a 7d 0a  [0].pgno = 1;.}.
fdc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
fdd0: 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70 70  5WriteInitForApp
fde0: 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  end(.  Fts5Index
fdf0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
fe00: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
fe10: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
fe20: 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
fe30: 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
fe40: 20 20 20 2f 2a 20 57 72 69 74 65 72 20 74 6f 20     /* Writer to 
fe50: 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  initialize */.  
fe60: 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 2f 2a 20 49 6e 64 65 78 20 73 65 67 6d 65 6e 74  /* Index segment
fe90: 20 69 73 20 61 20 70 61 72 74 20 6f 66 20 2a 2f   is a part of */
fea0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
feb0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20  Segment *pSeg   
fec0: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6f 62     /* Segment ob
fed0: 6a 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20 74  ject to append t
fee0: 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  o */.){.  int nB
fef0: 79 74 65 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69  yte = pSeg->nHei
ff00: 67 68 74 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  ght * sizeof(Fts
ff10: 35 50 61 67 65 57 72 69 74 65 72 29 3b 0a 20 20  5PageWriter);.  
ff20: 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
ff30: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
ff40: 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72  gWriter));.  pWr
ff50: 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64  iter->iIdx = iId
ff60: 78 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53  x;.  pWriter->iS
ff70: 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65  egid = pSeg->iSe
ff80: 67 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  gid;.  pWriter->
ff90: 61 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 50  aWriter = (Fts5P
ffa0: 61 67 65 57 72 69 74 65 72 2a 29 66 74 73 35 49  ageWriter*)fts5I
ffb0: 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74  dxMalloc(p, nByt
ffc0: 65 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e  e);.  pWriter->n
ffd0: 57 72 69 74 65 72 20 3d 20 70 53 65 67 2d 3e 6e  Writer = pSeg->n
ffe0: 48 65 69 67 68 74 3b 0a 0a 20 20 69 66 28 20 70  Height;..  if( p
fff0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10000 29 7b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20  ){.    int pgno 
10010 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 1;.    int i;.
10020 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72      pWriter->aWr
10030 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70  iter[0].pgno = p
10040 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b  Seg->pgnoLast+1;
10050 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 65 67 2d  .    for(i=pSeg-
10060 3e 6e 48 65 69 67 68 74 2d 31 3b 20 69 3e 30 3b  >nHeight-1; i>0;
10070 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 36 34   i--){.      i64
10080 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
10090 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72  EGMENT_ROWID(pWr
100a0 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69  iter->iIdx, pWri
100b0 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20  ter->iSegid, i, 
100c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 46 74 73  pgno);.      Fts
100d0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 67  5PageWriter *pPg
100e0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
100f0 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 70  iter[i];.      p
10100 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
10110 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 42  .      fts5DataB
10120 75 66 66 65 72 28 70 2c 20 26 70 50 67 2d 3e 62  uffer(p, &pPg->b
10130 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  uf, iRowid);.   
10140 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10160 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20     Fts5NodeIter 
10170 73 73 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ss;.        fts5
10180 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70 50 67  NodeIterInit(pPg
10190 2d 3e 62 75 66 2e 6e 2c 20 70 50 67 2d 3e 62 75  ->buf.n, pPg->bu
101a0 66 2e 70 2c 20 26 73 73 29 3b 0a 20 20 20 20 20  f.p, &ss);.     
101b0 20 20 20 77 68 69 6c 65 28 20 73 73 2e 61 44 61     while( ss.aDa
101c0 74 61 20 29 20 66 74 73 35 4e 6f 64 65 49 74 65  ta ) fts5NodeIte
101d0 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 73  rNext(&p->rc, &s
101e0 73 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  s);.        fts5
101f0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
10200 2c 20 26 70 50 67 2d 3e 74 65 72 6d 2c 20 73 73  , &pPg->term, ss
10210 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d  .term.n, ss.term
10220 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e  .p);.        pgn
10230 6f 20 3d 20 73 73 2e 69 43 68 69 6c 64 3b 0a 20  o = ss.iChild;. 
10240 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49         fts5NodeI
10250 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20 20  terFree(&ss);.  
10260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10270 69 66 28 20 70 53 65 67 2d 3e 6e 48 65 69 67 68  if( pSeg->nHeigh
10280 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 57  t==1 ){.      pW
10290 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20  riter->nEmpty = 
102a0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2d 31  pSeg->pgnoLast-1
102b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
102c0 72 74 28 20 28 70 67 6e 6f 2b 70 57 72 69 74 65  rt( (pgno+pWrite
102d0 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d 70 53 65 67  r->nEmpty)==pSeg
102e0 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20  ->pgnoLast );.  
102f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  }.}../*.** Itera
10300 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75 73  tor pIter was us
10310 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
10320 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74 20  rough the input 
10330 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61  segments of on a
10340 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n.** incremental
10350 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
10360 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10370 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  is called if the
10380 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20   incremental.** 
10390 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20 66  merge step has f
103a0 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65 20  inished but the 
103b0 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65  input has not be
103c0 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78  en completely ex
103d0 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  hausted..*/.stat
103e0 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d  ic void fts5Trim
103f0 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64  Segments(Fts5Ind
10400 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69  ex *p, Fts5Multi
10410 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
10420 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35  .  int i;.  Fts5
10430 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65  Buffer buf;.  me
10440 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
10450 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
10460 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
10470 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
10480 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
10490 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
104a0 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
104b0 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d  if( pSeg->pSeg==
104c0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  0 ){.      /* no
104d0 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  -op */.    }else
104e0 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
104f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 65  ==0 ){.      pSe
10500 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  g->pSeg->pgnoLas
10510 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  t = 0;.      pSe
10520 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
10530 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
10540 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  e{.      int iOf
10550 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  f = pSeg->iTermL
10560 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f  eafOffset;     /
10570 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20  * Offset on new 
10580 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  first leaf page 
10590 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65  */.      i64 iLe
105a0 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46  afRowid;.      F
105b0 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
105c0 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20        int iId = 
105d0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
105e0 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64  id;.      u8 aHd
105f0 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78  r[4] = {0x00, 0x
10600 30 30 2c 20 30 78 30 30 2c 20 30 78 30 34 7d 3b  00, 0x00, 0x04};
10610 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77  ..      iLeafRow
10620 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
10630 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 49  T_ROWID(pSeg->iI
10640 64 78 2c 20 69 49 64 2c 20 30 2c 20 70 53 65 67  dx, iId, 0, pSeg
10650 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
10660 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
10670 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
10680 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
10690 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
106a0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
106b0 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20  erZero(&buf);.  
106c0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
106d0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
106e0 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28  c, &buf, sizeof(
106f0 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20  aHdr), aHdr);.  
10700 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
10710 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
10720 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
10730 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
10740 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
10750 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
10760 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  buf, pSeg->term.
10770 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29  n, pSeg->term.p)
10780 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
10790 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
107a0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
107b0 74 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 26 70  ta->n - iOff, &p
107c0 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Data->p[iOff]);.
107d0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
107e0 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
107f0 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53          pSeg->pS
10800 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
10810 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
10820 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74 73  gno;.        fts
10830 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 46  5DataDelete(p, F
10840 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
10850 44 28 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49  D(pSeg->iIdx, iI
10860 64 2c 20 30 2c 20 31 29 2c 69 4c 65 61 66 52 6f  d, 0, 1),iLeafRo
10870 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
10880 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69  s5DataWrite(p, i
10890 4c 65 61 66 52 6f 77 69 64 2c 20 62 75 66 2e 70  LeafRowid, buf.p
108a0 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  , buf.n);.      
108b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74  }.    }.  }.  ft
108c0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
108d0 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  f);.}../*.**.*/.
108e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
108f0 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
10900 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
10930 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
10940 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
10950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10960 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b 20  * Index to work 
10970 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  on */.  Fts5Stru
10980 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20  cture *pStruct, 
10990 20 20 20 20 20 20 20 20 2f 2a 20 53 74 75 63 74          /* Stuct
109a0 75 72 65 20 6f 66 20 69 6e 64 65 78 20 69 49 64  ure of index iId
109b0 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  x */.  int iLvl,
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109d0 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
109e0 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72  to read input fr
109f0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  om */.  int *pnR
10a00 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
10a10 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
10a20 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79   up to this many
10a30 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a   output leaves *
10a40 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
10a50 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
10a60 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
10a70 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35  el[iLvl];.  Fts5
10a80 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
10a90 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
10aa0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
10ab0 31 5d 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  1];.  Fts5MultiS
10ac0 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
10ad0 30 3b 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  0;    /* Iterato
10ae0 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  r to read input 
10af0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  data */.  int nR
10b00 65 6d 20 3d 20 2a 70 6e 52 65 6d 3b 20 20 20 20  em = *pnRem;    
10b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
10b20 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c  put leaf pages l
10b30 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
10b40 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20    int nInput;   
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
10b70 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
10b80 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
10b90 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20   writer;        
10ba0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
10bb0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
10bc0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
10bd0 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70  Seg;     /* Outp
10be0 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
10bf0 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
10c00 0a 20 20 69 6e 74 20 62 52 65 71 75 69 72 65 44  .  int bRequireD
10c10 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 30 3b 0a  oclistTerm = 0;.
10c20 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
10c30 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20  pStruct->nLevel 
10c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76  );.  assert( pLv
10c50 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d  l->nMerge<=pLvl-
10c60 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73  >nSeg );..  mems
10c70 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73  et(&writer, 0, s
10c80 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
10c90 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ter));.  memset(
10ca0 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
10cb0 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
10cc0 20 77 72 69 74 65 72 2e 69 49 64 78 20 3d 20 69   writer.iIdx = i
10cd0 49 64 78 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d  Idx;.  if( pLvl-
10ce0 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 61  >nMerge ){.    a
10cf0 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e  ssert( pLvlOut->
10d00 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49  nSeg>0 );.    nI
10d10 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  nput = pLvl->nMe
10d20 72 67 65 3b 0a 20 20 20 20 66 74 73 35 57 72 69  rge;.    fts5Wri
10d30 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28  teInitForAppend(
10d40 70 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64 78  p, &writer, iIdx
10d50 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67  , &pLvlOut->aSeg
10d60 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31  [pLvlOut->nSeg-1
10d70 5d 29 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26  ]);.    pSeg = &
10d80 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
10d90 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a  vlOut->nSeg-1];.
10da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
10db0 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c   iSegid = fts5Al
10dc0 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70  locateSegid(p, p
10dd0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 66 74 73  Struct);.    fts
10de0 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
10df0 72 69 74 65 72 2c 20 69 49 64 78 2c 20 69 53 65  riter, iIdx, iSe
10e00 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  gid);..    /* Ad
10e10 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  d the new segmen
10e20 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  t to the output 
10e30 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28  level */.    if(
10e40 20 69 4c 76 6c 2b 31 3d 3d 70 53 74 72 75 63 74   iLvl+1==pStruct
10e50 2d 3e 6e 4c 65 76 65 6c 20 29 20 70 53 74 72 75  ->nLevel ) pStru
10e60 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20  ct->nLevel++;.  
10e70 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
10e80 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
10e90 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c  >nSeg];.    pLvl
10ea0 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20  Out->nSeg++;.   
10eb0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
10ec0 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e   = 1;.    pSeg->
10ed0 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
10ee0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e  ..    /* Read in
10ef0 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67  put from all seg
10f00 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70  ments in the inp
10f10 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
10f20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
10f30 53 65 67 3b 0a 20 20 7d 0a 23 69 66 20 30 0a 66  Seg;.  }.#if 0.f
10f40 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
10f50 6d 65 72 67 69 6e 67 20 25 64 20 73 65 67 6d 65  merging %d segme
10f60 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65 6c 20 25  nts from level %
10f70 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20 69 4c 76  d!", nInput, iLv
10f80 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75  l);.fflush(stdou
10f90 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f  t);.#endif..  fo
10fa0 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
10fb0 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 69  ew(p, pStruct, i
10fc0 49 64 78 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75  Idx, iLvl, nInpu
10fd0 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  t, &pIter);.    
10fe0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
10ff0 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
11000 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
11010 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
11020 72 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35  r).  ){.    Fts5
11030 50 6f 73 49 74 65 72 20 73 50 6f 73 3b 20 20 20  PosIter sPos;   
11040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
11050 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
11060 6f 75 67 68 20 70 6f 73 69 74 69 6f 6e 20 6c 69  ough position li
11070 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  st */.    int iC
11080 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ol = 0;         
11090 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
110a0 6e 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  nt output column
110b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 6f 73   */.    int iPos
110c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
110d0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
110e0 20 6f 75 74 70 75 74 20 70 6f 73 69 74 69 6f 6e   output position
110f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72   */.    int nTer
11100 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  m;.    const u8 
11110 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c  *pTerm = fts5Mul
11120 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
11130 2c 20 26 6e 54 65 72 6d 29 3b 0a 0a 20 20 20 20  , &nTerm);..    
11140 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e  if( nTerm!=term.
11150 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72  n || memcmp(pTer
11160 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  m, term.p, nTerm
11170 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  ) ){.      if( w
11180 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74  riter.nLeafWritt
11190 65 6e 3e 6e 52 65 6d 20 29 20 62 72 65 61 6b 3b  en>nRem ) break;
111a0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
111b0 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41  is a new term. A
111c0 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20  ppend a term to 
111d0 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
111e0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nt. */.      if(
111f0 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74   bRequireDoclist
11200 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
11210 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a  fts5WriteAppendZ
11220 65 72 6f 62 79 74 65 28 70 2c 20 26 77 72 69 74  erobyte(p, &writ
11230 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
11240 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
11250 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65  ndTerm(p, &write
11260 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  r, nTerm, pTerm)
11270 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
11280 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 74  erSet(&p->rc, &t
11290 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  erm, nTerm, pTer
112a0 6d 29 3b 0a 20 20 20 20 20 20 62 52 65 71 75 69  m);.      bRequi
112b0 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20  reDoclistTerm = 
112c0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
112d0 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f 77 69   Append the rowi
112e0 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
112f0 2a 2f 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  */.    fts5Write
11300 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26  AppendRowid(p, &
11310 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74  writer, fts5Mult
11320 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
11330 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ));..    /* Copy
11340 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
11350 73 74 20 66 72 6f 6d 20 69 6e 70 75 74 20 74 6f  st from input to
11360 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 66   output */.    f
11370 6f 72 28 66 74 73 35 50 6f 73 49 74 65 72 49 6e  or(fts5PosIterIn
11380 69 74 28 70 2c 20 70 49 74 65 72 2c 20 26 73 50  it(p, pIter, &sP
11390 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  os);.        fts
113a0 35 50 6f 73 49 74 65 72 45 6f 66 28 70 2c 20 26  5PosIterEof(p, &
113b0 73 50 6f 73 29 3d 3d 30 3b 0a 20 20 20 20 20 20  sPos)==0;.      
113c0 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78    fts5PosIterNex
113d0 74 28 70 2c 20 26 73 50 6f 73 29 0a 20 20 20 20  t(p, &sPos).    
113e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 50 6f  ){.      if( sPo
113f0 73 2e 69 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a  s.iCol!=iCol ){.
11400 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
11410 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e  eAppendPoslistIn
11420 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 31 29  t(p, &writer, 1)
11430 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72  ;.        fts5Wr
11440 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
11450 49 6e 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  Int(p, &writer, 
11460 73 50 6f 73 2e 69 43 6f 6c 29 3b 0a 20 20 20 20  sPos.iCol);.    
11470 20 20 20 20 69 43 6f 6c 20 3d 20 73 50 6f 73 2e      iCol = sPos.
11480 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 50  iCol;.        iP
11490 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  os = 0;.      }.
114a0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
114b0 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28  ppendPoslistInt(
114c0 70 2c 20 26 77 72 69 74 65 72 2c 20 28 73 50 6f  p, &writer, (sPo
114d0 73 2e 69 50 6f 73 2d 69 50 6f 73 29 20 2b 20 32  s.iPos-iPos) + 2
114e0 29 3b 0a 20 20 20 20 20 20 69 50 6f 73 20 3d 20  );.      iPos = 
114f0 73 50 6f 73 2e 69 50 6f 73 3b 0a 20 20 20 20 7d  sPos.iPos;.    }
11500 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70  .    fts5WriteAp
11510 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2c 20  pendZerobyte(p, 
11520 26 77 72 69 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  &writer);.  }.. 
11530 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61   /* Flush the la
11540 73 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20  st leaf page to 
11550 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75  disk. Set the ou
11560 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74  tput segment b-t
11570 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20  ree height.  ** 
11580 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61  and last leaf pa
11590 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65  ge number at the
115a0 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a   same time.  */.
115b0 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
115c0 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
115d0 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20 26 70  Seg->nHeight, &p
115e0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg->pgnoLast);.
115f0 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69  .  if( fts5Multi
11600 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
11610 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
11620 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
11630 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
11640 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25  ments from the %
11650 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
11660 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49     for(i=0; i<nI
11670 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nput; i++){.    
11680 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65    fts5DataRemove
11690 53 65 67 6d 65 6e 74 28 70 2c 20 69 49 64 78 2c  Segment(p, iIdx,
116a0 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69   pLvl->aSeg[i].i
116b0 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  Segid);.    }.. 
116c0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
116d0 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65   redundant segme
116e0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  nts from the inp
116f0 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
11700 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d  if( pLvl->nSeg!=
11710 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20  nInput ){.      
11720 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76  int nMove = (pLv
11730 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74  l->nSeg - nInput
11740 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
11750 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
11760 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
11770 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76  pLvl->aSeg, &pLv
11780 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c  l->aSeg[nInput],
11790 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20   nMove);.    }. 
117a0 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d     pLvl->nSeg -=
117b0 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76   nInput;.    pLv
117c0 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20  l->nMerge = 0;. 
117d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
117e0 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20  TrimSegments(p, 
117f0 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c  pIter);.    pLvl
11800 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75  ->nMerge = nInpu
11810 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75  t;.  }..  fts5Mu
11820 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
11830 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  Iter);.  fts5Buf
11840 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
11850 20 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74    *pnRem -= writ
11860 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b  er.nLeafWritten;
11870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61  .}../*.** A tota
11880 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20  l of nLeaf leaf 
11890 70 61 67 65 73 20 6f 66 20 64 61 74 61 20 68 61  pages of data ha
118a0 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73  s just been flus
118b0 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30  hed to a level-0
118c0 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  .** segments in 
118d0 69 6e 64 65 78 20 69 49 64 78 20 77 69 74 68 20  index iIdx with 
118e0 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
118f0 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
11900 20 75 70 64 61 74 65 73 20 74 68 65 0a 2a 2a 20   updates the.** 
11910 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63  write-counter ac
11920 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69  cordingly and, i
11930 66 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72  f necessary, per
11940 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61  forms incrementa
11950 6c 20 6d 65 72 67 65 0a 2a 2a 20 77 6f 72 6b 2e  l merge.** work.
11960 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
11970 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
11980 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
11990 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
119a0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
119b0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
119c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
119d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
119e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
119f0 6e 64 65 78 57 6f 72 6b 28 0a 20 20 46 74 73 35  ndexWork(.  Fts5
11a00 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
11a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11a20 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
11a30 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
11a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11a50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
11a60 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20   to work on */. 
11a70 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
11a80 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20  pStruct,        
11a90 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 72 75   /* Current stru
11aa0 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
11ab0 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20  /.  int nLeaf   
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11ae0 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a   output leaves j
11af0 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29  ust written */.)
11b00 7b 0a 20 20 69 36 34 20 6e 57 72 69 74 65 3b 20  {.  i64 nWrite; 
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
11b30 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f  alue of write-co
11b40 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  unter */.  int n
11b50 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Work;           
11b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11b70 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61  mber of work-qua
11b80 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a  nta to perform *
11b90 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20  /.  int nRem;   
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11bc0 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74   leaf pages left
11bd0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20   to write */..  
11be0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72  /* Update the wr
11bf0 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69  ite-counter. Whi
11c00 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74  le doing so, set
11c10 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 6e 57 72   nWork. */.  nWr
11c20 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  ite = pStruct->n
11c30 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20  WriteCounter;.  
11c40 6e 57 6f 72 6b 20 3d 20 28 28 6e 57 72 69 74 65  nWork = ((nWrite
11c50 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e   + nLeaf) / p->n
11c60 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72  WorkUnit) - (nWr
11c70 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  ite / p->nWorkUn
11c80 69 74 29 3b 0a 20 20 70 53 74 72 75 63 74 2d 3e  it);.  pStruct->
11c90 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d  nWriteCounter +=
11ca0 20 6e 4c 65 61 66 3b 0a 20 20 6e 52 65 6d 20 3d   nLeaf;.  nRem =
11cb0 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20   p->nWorkUnit * 
11cc0 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d  nWork * pStruct-
11cd0 3e 6e 4c 65 76 65 6c 3b 0a 0a 20 20 77 68 69 6c  >nLevel;..  whil
11ce0 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20  e( nRem>0 ){.   
11cf0 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d10 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
11d20 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
11d30 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20   int iBestLvl = 
11d40 2d 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  -1;          /* 
11d50 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74  Level offering t
11d60 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65  he most input se
11d70 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  gments */.    in
11d80 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20  t nBest = 0;    
11d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11da0 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
11db0 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65  ments on best le
11dc0 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  vel */..    /* S
11dd0 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74  et iBestLvl to t
11de0 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64  he level to read
11df0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
11e00 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  from. */.    for
11e10 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
11e20 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
11e30 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
11e40 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
11e50 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
11e60 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
11e70 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
11e80 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  >nMerge ){.     
11e90 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
11ea0 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  rge>nBest ){.   
11eb0 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20         iBestLvl 
11ec0 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20  = iLvl;.        
11ed0 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
11ee0 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  nMerge;.        
11ef0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
11f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11f10 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42  f( pLvl->nSeg>nB
11f20 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
11f30 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  Best = pLvl->nSe
11f40 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74  g;.        iBest
11f50 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
11f60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
11f70 73 65 72 74 28 20 69 42 65 73 74 4c 76 6c 3e 3d  sert( iBestLvl>=
11f80 30 20 26 26 20 6e 42 65 73 74 3e 30 20 29 3b 0a  0 && nBest>0 );.
11f90 0a 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c 70  .    if( nBest<p
11fa0 2d 3e 6e 4d 69 6e 4d 65 72 67 65 20 26 26 20 70  ->nMinMerge && p
11fb0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
11fc0 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
11fd0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
11fe0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
11ff0 76 65 6c 28 70 2c 20 69 49 64 78 2c 20 70 53 74  vel(p, iIdx, pSt
12000 72 75 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20  ruct, iBestLvl, 
12010 26 6e 52 65 6d 29 3b 0a 20 20 20 20 61 73 73 65  &nRem);.    asse
12020 72 74 28 20 6e 52 65 6d 3d 3d 30 20 7c 7c 20 70  rt( nRem==0 || p
12030 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12040 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12050 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e  Flush the conten
12060 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  ts of in-memory 
12070 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68  hash table iHash
12080 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d   to a new level-
12090 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e  0 .** segment on
120a0 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61   disk. Also upda
120b0 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  te the correspon
120c0 64 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72  ding structure r
120d0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
120e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
120f0 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
12100 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
12110 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
12120 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
12130 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
12140 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
12150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12160 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73   fts5FlushOneHas
12170 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  h(Fts5Index *p, 
12180 69 6e 74 20 69 48 61 73 68 2c 20 69 6e 74 20 2a  int iHash, int *
12190 70 6e 4c 65 61 66 29 7b 0a 20 20 46 74 73 35 53  pnLeaf){.  Fts5S
121a0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
121b0 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b  t;.  int iSegid;
121c0 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
121d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
121e0 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61       /* Last lea
121f0 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  f page number in
12200 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f   segment */..  /
12210 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
12220 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65  ence to the inde
12230 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  x structure and 
12240 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  allocate a new s
12250 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66  egment-id.  ** f
12260 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c  or the new level
12270 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a  -0 segment.  */.
12280 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
12290 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c  StructureRead(p,
122a0 20 69 48 61 73 68 29 3b 0a 20 20 69 53 65 67 69   iHash);.  iSegi
122b0 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
122c0 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
122d0 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64  );..  if( iSegid
122e0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 57   ){.    Fts5SegW
122f0 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20  riter writer;.  
12300 20 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63    Fts5PendingDoc
12310 6c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20  list *pList;.   
12320 20 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c   Fts5PendingDocl
12330 69 73 74 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ist *pIter;.    
12340 46 74 73 35 50 65 6e 64 69 6e 67 44 6f 63 6c 69  Fts5PendingDocli
12350 73 74 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 20 20  st *pNext;..    
12360 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
12370 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
12380 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74   New segment wit
12390 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20  hin pStruct */. 
123a0 20 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20     int nHeight; 
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 6e 65   /* Height of ne
123d0 77 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  w segment b-tree
123e0 20 2a 2f 0a 0a 20 20 20 20 70 4c 69 73 74 20 3d   */..    pList =
123f0 20 66 74 73 35 50 65 6e 64 69 6e 67 4c 69 73 74   fts5PendingList
12400 28 70 2c 20 69 48 61 73 68 29 3b 0a 20 20 20 20  (p, iHash);.    
12410 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
12420 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54   || p->rc!=SQLIT
12430 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 66 74 73 35  E_OK );.    fts5
12440 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72  WriteInit(p, &wr
12450 69 74 65 72 2c 20 69 48 61 73 68 2c 20 69 53 65  iter, iHash, iSe
12460 67 69 64 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70  gid);..    for(p
12470 49 74 65 72 3d 70 4c 69 73 74 3b 20 70 49 74 65  Iter=pList; pIte
12480 72 3b 20 70 49 74 65 72 3d 70 4e 65 78 74 29 7b  r; pIter=pNext){
12490 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
124a0 49 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Iter->pNext;.   
124b0 20 20 20 66 74 73 35 57 72 69 74 65 50 65 6e 64     fts5WritePend
124c0 69 6e 67 44 6f 63 6c 69 73 74 28 70 2c 20 26 77  ingDoclist(p, &w
124d0 72 69 74 65 72 2c 20 70 49 74 65 72 29 3b 0a 20  riter, pIter);. 
124e0 20 20 20 20 20 66 74 73 35 46 72 65 65 50 65 6e       fts5FreePen
124f0 64 69 6e 67 44 6f 63 6c 69 73 74 28 70 49 74 65  dingDoclist(pIte
12500 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  r);.    }.    ft
12510 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
12520 20 26 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67   &writer, &nHeig
12530 68 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a  ht, &pgnoLast);.
12540 0a 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 65  .    /* Edit the
12550 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 61   Fts5Structure a
12560 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
12570 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12580 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74  . */.    if( pSt
12590 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20  ruct->nLevel==0 
125a0 29 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ) pStruct->nLeve
125b0 6c 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 20  l = 1;.    pSeg 
125c0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
125d0 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72  el[0].aSeg[ pStr
125e0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e  uct->aLevel[0].n
125f0 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 70 53 65  Seg++ ];.    pSe
12600 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
12610 69 64 3b 0a 20 20 20 20 70 53 65 67 2d 3e 6e 48  id;.    pSeg->nH
12620 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b  eight = nHeight;
12630 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46  .    pSeg->pgnoF
12640 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53  irst = 1;.    pS
12650 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70  eg->pgnoLast = p
12660 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 0a 0a 20 20  gnoLast;.  }..  
12670 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28 70 2c  fts5IndexWork(p,
12680 20 69 48 61 73 68 2c 20 70 53 74 72 75 63 74 2c   iHash, pStruct,
12690 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74   pgnoLast);.  ft
126a0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
126b0 28 70 2c 20 69 48 61 73 68 2c 20 70 53 74 72 75  (p, iHash, pStru
126c0 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
126d0 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
126e0 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  uct);.}../*.** I
126f0 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c  ndicate that all
12700 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
12710 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  s to sqlite3Fts5
12720 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72  IndexWrite() per
12730 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tain.** to the d
12740 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77  ocument with row
12750 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  id iRowid..*/.vo
12760 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  id sqlite3Fts5In
12770 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74  dexBeginWrite(Ft
12780 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
12790 69 52 6f 77 69 64 29 7b 0a 20 20 69 66 28 20 69  iRowid){.  if( i
127a0 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65  Rowid<=p->iWrite
127b0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c  Rowid ){.    sql
127c0 69 74 65 33 46 74 73 35 49 6e 64 65 78 46 6c 75  ite3Fts5IndexFlu
127d0 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  sh(p);.  }.  p->
127e0 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52  iWriteRowid = iR
127f0 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  owid;.}../*.** F
12800 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74  lush any data st
12810 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
12820 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
12830 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
12840 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12850 65 33 46 74 73 35 49 6e 64 65 78 46 6c 75 73 68  e3Fts5IndexFlush
12860 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
12870 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
12880 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
12890 69 67 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  ig;.  int i;    
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
128c0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
128d0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e   indexes */.  in
128e0 74 20 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20 20  t nLeaf = 0;    
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12900 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
12910 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20  s written */..  
12920 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  /* If an error h
12930 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
12940 65 64 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ed this call is 
12950 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
12960 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
12970 4f 4b 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e  OK || p->nPendin
12980 67 44 61 74 61 3d 3d 30 20 29 20 72 65 74 75 72  gData==0 ) retur
12990 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  n;.  assert( p->
129a0 61 48 61 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46  aHash );..  /* F
129b0 6c 75 73 68 20 74 68 65 20 74 65 72 6d 73 20 61  lush the terms a
129c0 6e 64 20 65 61 63 68 20 70 72 65 66 69 78 20 69  nd each prefix i
129d0 6e 64 65 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  ndex to disk */.
129e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
129f0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
12a00 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 46 6c  i++){.    fts5Fl
12a10 75 73 68 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c  ushOneHash(p, i,
12a20 20 26 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20   &nLeaf);.  }.  
12a30 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
12a40 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 0;.}../*.** Co
12a50 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69 73  mmit data to dis
12a60 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
12a70 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46  3Fts5IndexSync(F
12a80 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
12a90 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
12aa0 46 6c 75 73 68 28 70 29 3b 0a 20 20 66 74 73 35  Flush(p);.  fts5
12ab0 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
12ac0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
12ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
12ae0 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
12af0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
12b00 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44  y hash tables. D
12b10 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a  o not write it.*
12b20 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
12b30 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
12b40 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
12b50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12b60 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65   %_data.** table
12b70 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
12b80 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e  d on disk. So an
12b90 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  y in-memory cach
12ba0 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a  es of %_data .**
12bb0 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65   records must be
12bc0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
12bd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
12be0 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74  IndexRollback(Ft
12bf0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66  s5Index *p){.  f
12c00 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
12c10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12c20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12c30 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49  Open a new Fts5I
12c40 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20  ndex handle. If 
12c50 74 68 65 20 62 43 72 65 61 74 65 20 61 72 67 75  the bCreate argu
12c60 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72  ment is true, cr
12c70 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  eate.** and init
12c80 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  ialize the under
12c90 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62  lying %_data tab
12ca0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  le..**.** If suc
12cb0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70  cessful, set *pp
12cc0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
12cd0 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20   new object and 
12ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12cf0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
12d00 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20  set *pp to NULL 
12d10 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
12d20 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
12d30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
12d40 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20  ts5IndexOpen(.  
12d50 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
12d60 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65  fig, .  int bCre
12d70 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65  ate, .  Fts5Inde
12d80 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a  x **pp,.  char *
12d90 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20  *pzErr.){.  int 
12da0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12db0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20    Fts5Index *p; 
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20    /* New object 
12de0 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20  */..  *pp = p = 
12df0 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69  (Fts5Index*)sqli
12e00 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
12e10 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20  f(Fts5Index));. 
12e20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
12e30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
12e40 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
12e50 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
12e60 29 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20  );.  p->pConfig 
12e70 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 70 2d 3e  = pConfig;.  p->
12e80 70 67 73 7a 20 3d 20 31 30 30 30 3b 0a 20 20 70  pgsz = 1000;.  p
12e90 2d 3e 6e 4d 69 6e 4d 65 72 67 65 20 3d 20 46 54  ->nMinMerge = FT
12ea0 53 35 5f 4d 49 4e 5f 4d 45 52 47 45 3b 0a 20 20  S5_MIN_MERGE;.  
12eb0 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46  p->nWorkUnit = F
12ec0 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  TS5_WORK_UNIT;. 
12ed0 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44   p->nMaxPendingD
12ee0 61 74 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b  ata = 1024*1024;
12ef0 0a 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d  .  p->zDataTbl =
12f00 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12f10 28 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e  ("%s_data", pCon
12f20 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  fig->zName);.  i
12f30 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d  f( p->zDataTbl==
12f40 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
12f50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
12f60 6c 73 65 20 69 66 28 20 62 43 72 65 61 74 65 20  lse if( bCreate 
12f70 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
12f80 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
12f90 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
12fa0 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
12fb0 6c 65 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e  le(.        pCon
12fc0 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
12fd0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
12fe0 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
12ff0 22 2c 20 70 7a 45 72 72 0a 20 20 20 20 29 3b 0a  ", pzErr.    );.
13000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
13020 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
13030 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
13040 65 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  e));.      for(i
13050 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
13060 50 72 65 66 69 78 2b 31 3b 20 69 2b 2b 29 7b 0a  Prefix+1; i++){.
13070 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75          fts5Stru
13080 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 69 2c  ctureWrite(p, i,
13090 20 26 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   &s);.      }.  
130a0 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a      rc = p->rc;.
130b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
130c0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
130d0 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
130e0 28 70 2c 20 30 29 3b 0a 20 20 20 20 2a 70 70 20  (p, 0);.    *pp 
130f0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
13100 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
13110 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70  lose a handle op
13120 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
13130 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
13140 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
13150 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
13160 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
13170 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
13180 74 20 62 44 65 73 74 72 6f 79 29 7b 0a 20 20 69  t bDestroy){.  i
13190 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
131a0 4b 3b 0a 20 20 69 66 28 20 62 44 65 73 74 72 6f  K;.  if( bDestro
131b0 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
131c0 6c 69 74 65 33 46 74 73 35 44 72 6f 70 54 61 62  lite3Fts5DropTab
131d0 6c 65 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 22  le(p->pConfig, "
131e0 64 61 74 61 22 29 3b 0a 20 20 7d 0a 20 20 61 73  data");.  }.  as
131f0 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
13200 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
13210 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72  _finalize(p->pWr
13220 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  iter);.  sqlite3
13230 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65  _finalize(p->pDe
13240 6c 65 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  leter);.  sqlite
13250 33 5f 66 72 65 65 28 70 2d 3e 61 48 61 73 68 29  3_free(p->aHash)
13260 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
13270 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20  (p->zDataTbl);. 
13280 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
13290 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
132a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
132b0 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d   simple checksum
132c0 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20   value based on 
132d0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  the arguments..*
132e0 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66 74 73  /.static u64 fts
132f0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
13300 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  (.  i64 iRowid, 
13310 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20  .  int iCol, .  
13320 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 63 6f 6e  int iPos, .  con
13330 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 20  st char *pTerm, 
13340 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a  .  int nTerm.){.
13350 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72    int i;.  u64 r
13360 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72  et = iRowid;.  r
13370 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
13380 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20   iCol;.  ret += 
13390 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b  (ret<<3) + iPos;
133a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54  .  for(i=0; i<nT
133b0 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d  erm; i++) ret +=
133c0 20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72   (ret<<3) + pTer
133d0 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72  m[i];.  return r
133e0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  et;.}../*.** Cal
133f0 63 75 6c 61 74 65 20 61 6e 64 20 72 65 74 75 72  culate and retur
13400 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 74 68 61  n a checksum tha
13410 74 20 69 73 20 74 68 65 20 58 4f 52 20 6f 66 20  t is the XOR of 
13420 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
13430 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61  ** checksum of a
13440 6c 6c 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ll entries that 
13450 77 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  would be generat
13460 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 20  ed by the token 
13470 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
13480 74 68 65 20 66 69 6e 61 6c 20 35 20 61 72 67 75  the final 5 argu
13490 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71  ments..*/.u64 sq
134a0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6b  lite3Fts5IndexCk
134b0 73 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  sum(.  Fts5Confi
134c0 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20  g *pConfig,     
134d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
134e0 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  uration object *
134f0 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  /.  i64 iRowid, 
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13510 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20      /* Document 
13520 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
13530 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
13560 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
13570 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  /.  int iPos,   
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
135a0 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
135b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
135c0 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
135d0 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20 61 74 20  m    /* Term at 
135e0 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  iPos */.){.  u64
135f0 20 72 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20   ret = 0;       
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13610 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
13620 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20    int iIdx;     
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69    /* For iterati
13650 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  ng through index
13660 65 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 49 64  es */..  for(iId
13670 78 3d 30 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66  x=0; iIdx<=pConf
13680 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
13690 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  x++){.    int n 
136a0 3d 20 28 28 69 49 64 78 3d 3d 70 43 6f 6e 66 69  = ((iIdx==pConfi
136b0 67 2d 3e 6e 50 72 65 66 69 78 29 20 3f 20 6e 54  g->nPrefix) ? nT
136c0 65 72 6d 20 3a 20 70 43 6f 6e 66 69 67 2d 3e 61  erm : pConfig->a
136d0 50 72 65 66 69 78 5b 69 49 64 78 5d 29 3b 0a 20  Prefix[iIdx]);. 
136e0 20 20 20 69 66 28 20 6e 3c 3d 6e 54 65 72 6d 20     if( n<=nTerm 
136f0 29 7b 0a 20 20 20 20 20 20 72 65 74 20 5e 3d 20  ){.      ret ^= 
13700 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  fts5IndexEntryCk
13710 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c  sum(iRowid, iCol
13720 2c 20 69 50 6f 73 2c 20 70 54 65 72 6d 2c 20 6e  , iPos, pTerm, n
13730 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13740 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 73  return ret;.}..s
13750 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
13760 74 72 65 65 49 74 65 72 49 6e 69 74 28 0a 20 20  treeIterInit(.  
13770 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
13780 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 46 74 73   int iIdx,.  Fts
13790 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
137a0 74 20 2a 70 53 65 67 2c 20 0a 20 20 46 74 73 35  t *pSeg, .  Fts5
137b0 42 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72  BtreeIter *pIter
137c0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  .){.  int nByte;
137d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6e 42 79 74  .  int i;.  nByt
137e0 65 20 3d 20 73 69 7a 65 6f 66 28 70 49 74 65 72  e = sizeof(pIter
137f0 2d 3e 61 4c 76 6c 5b 30 5d 29 20 2a 20 28 70 53  ->aLvl[0]) * (pS
13800 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 29 3b 0a  eg->nHeight-1);.
13810 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
13820 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
13830 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 4c 76  ));.  pIter->nLv
13840 6c 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68  l = pSeg->nHeigh
13850 74 2d 31 3b 0a 20 20 70 49 74 65 72 2d 3e 69 49  t-1;.  pIter->iI
13860 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 49 74  dx = iIdx;.  pIt
13870 65 72 2d 3e 70 20 3d 20 70 3b 0a 20 20 70 49 74  er->p = p;.  pIt
13880 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  er->pSeg = pSeg;
13890 0a 20 20 69 66 28 20 6e 42 79 74 65 20 26 26 20  .  if( nByte && 
138a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
138b0 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   ){.    pIter->a
138c0 4c 76 6c 20 3d 20 28 46 74 73 35 42 74 72 65 65  Lvl = (Fts5Btree
138d0 49 74 65 72 4c 65 76 65 6c 2a 29 66 74 73 35 49  IterLevel*)fts5I
138e0 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74  dxMalloc(p, nByt
138f0 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
13900 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
13910 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d 3e  _OK && i<pIter->
13920 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nLvl; i++){.    
13930 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
13940 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
13950 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67  iIdx, pSeg->iSeg
13960 69 64 2c 20 69 2b 31 2c 20 31 29 3b 0a 20 20 20  id, i+1, 1);.   
13970 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
13980 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 4c 76  ;.    pIter->aLv
13990 6c 5b 69 5d 2e 70 44 61 74 61 20 3d 20 70 44 61  l[i].pData = pDa
139a0 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
139b0 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  d(p, iRowid);.  
139c0 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20    if( pData ){. 
139d0 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65       fts5NodeIte
139e0 72 49 6e 69 74 28 70 44 61 74 61 2d 3e 6e 2c 20  rInit(pData->n, 
139f0 70 44 61 74 61 2d 3e 70 2c 20 26 70 49 74 65 72  pData->p, &pIter
13a00 2d 3e 61 4c 76 6c 5b 69 5d 2e 73 29 3b 0a 20 20  ->aLvl[i].s);.  
13a10 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
13a20 49 74 65 72 2d 3e 6e 4c 76 6c 3d 3d 30 20 7c 7c  Iter->nLvl==0 ||
13a30 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70 49   p->rc ){.    pI
13a40 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  ter->bEof = 1;. 
13a50 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20     pIter->iLeaf 
13a60 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
13a70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13a80 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70  Iter->nEmpty = p
13a90 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
13aa0 6e 45 6d 70 74 79 3b 0a 20 20 20 20 70 49 74 65  nEmpty;.    pIte
13ab0 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74 65 72  r->iLeaf = pIter
13ac0 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68 69  ->aLvl[0].s.iChi
13ad0 6c 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  ld;.  }.}..stati
13ae0 63 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65  c void fts5Btree
13af0 49 74 65 72 4e 65 78 74 28 46 74 73 35 42 74 72  IterNext(Fts5Btr
13b00 65 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  eeIter *pIter){.
13b10 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d    Fts5Index *p =
13b20 20 70 49 74 65 72 2d 3e 70 3b 0a 20 20 69 6e 74   pIter->p;.  int
13b30 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
13b40 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 26 26  Iter->bEof==0 &&
13b50 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
13b60 73 2e 61 44 61 74 61 20 29 3b 0a 20 20 66 6f 72  s.aData );.  for
13b70 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
13b80 4c 76 6c 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  Lvl && p->rc==SQ
13b90 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
13ba0 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72     Fts5BtreeIter
13bb0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
13bc0 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20  Iter->aLvl[i];. 
13bd0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e     fts5NodeIterN
13be0 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 70 4c 76  ext(&p->rc, &pLv
13bf0 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70  l->s);.    if( p
13c00 4c 76 6c 2d 3e 73 2e 61 44 61 74 61 20 29 7b 0a  Lvl->s.aData ){.
13c10 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
13c20 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
13c30 65 72 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c 2d 3e  er->term, pLvl->
13c40 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c 2d 3e  s.term.n, pLvl->
13c50 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20  s.term.p);.     
13c60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
13c70 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64  e{.      fts5Nod
13c80 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d  eIterFree(&pLvl-
13c90 3e 73 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  >s);.      fts5D
13ca0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
13cb0 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70  >pData);.      p
13cc0 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a  Lvl->pData = 0;.
13cd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13ce0 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 7c  i==pIter->nLvl |
13cf0 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70  | p->rc ){.    p
13d00 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
13d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
13d20 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d   iSegid = pIter-
13d30 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
13d40 20 20 20 66 6f 72 28 69 2d 2d 3b 20 69 3e 3d 30     for(i--; i>=0
13d50 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 46 74  ; i--){.      Ft
13d60 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
13d70 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
13d80 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  >aLvl[i];.      
13d90 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
13da0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
13db0 70 49 74 65 72 2d 3e 69 49 64 78 2c 69 53 65 67  pIter->iIdx,iSeg
13dc0 69 64 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d 2e 73  id,i+1,pLvl[1].s
13dd0 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  .iChild);.      
13de0 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
13df0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
13e00 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
13e10 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a   pLvl->pData ){.
13e20 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65          fts5Node
13e30 49 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70  IterInit(pLvl->p
13e40 44 61 74 61 2d 3e 6e 2c 20 70 4c 76 6c 2d 3e 70  Data->n, pLvl->p
13e50 44 61 74 61 2d 3e 70 2c 20 26 70 4c 76 6c 2d 3e  Data->p, &pLvl->
13e60 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
13e70 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  }.  }..  pIter->
13e80 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e  nEmpty = pIter->
13e90 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79  aLvl[0].s.nEmpty
13ea0 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
13eb0 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30   = pIter->aLvl[0
13ec0 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 61 73  ].s.iChild;.  as
13ed0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
13ee0 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d  ITE_OK || pIter-
13ef0 3e 62 45 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61 74  >bEof );.}..stat
13f00 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72 65  ic void fts5Btre
13f10 65 49 74 65 72 46 72 65 65 28 46 74 73 35 42 74  eIterFree(Fts5Bt
13f20 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b  reeIter *pIter){
13f30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
13f40 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
13f50 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  vl; i++){.    Ft
13f60 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
13f70 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
13f80 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74  >aLvl[i];.    ft
13f90 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26  s5NodeIterFree(&
13fa0 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66  pLvl->s);.    if
13fb0 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b  ( pLvl->pData ){
13fc0 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
13fd0 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61  elease(pLvl->pDa
13fe0 74 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  ta);.      pLvl-
13ff0 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >pData = 0;.    
14000 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
14010 66 72 65 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c  free(pIter->aLvl
14020 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
14030 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  ree(&pIter->term
14040 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
14050 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67  d fts5IndexInteg
14060 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74  rityCheckSegment
14070 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
14080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14090 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
140a0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
140b0 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140d0 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20 70 53  /* Index that pS
140e0 65 67 20 69 73 20 61 20 70 61 72 74 20 6f 66 20  eg is a part of 
140f0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
14100 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
14110 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
14120 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61  to check interna
14130 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f  l consistency */
14140 0a 29 7b 0a 20 20 46 74 73 35 42 74 72 65 65 49  .){.  Fts5BtreeI
14150 74 65 72 20 69 74 65 72 3b 20 20 20 20 20 20 20  ter iter;       
14160 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
14170 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
14180 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
14190 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 65 72 61  y */..  /* Itera
141a0 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 62  te through the b
141b0 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 2e  -tree hierarchy.
141c0 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 42    */.  for(fts5B
141d0 74 72 65 65 49 74 65 72 49 6e 69 74 28 70 2c 20  treeIterInit(p, 
141e0 69 49 64 78 2c 20 70 53 65 67 2c 20 26 69 74 65  iIdx, pSeg, &ite
141f0 72 29 3b 0a 20 20 20 20 20 20 69 74 65 72 2e 62  r);.      iter.b
14200 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  Eof==0;.      ft
14210 73 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28  s5BtreeIterNext(
14220 26 69 74 65 72 29 0a 20 20 29 7b 0a 20 20 20 20  &iter).  ){.    
14230 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20  i64 iRow;       
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14250 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   Rowid for this 
14260 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35  leaf */.    Fts5
14270 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20  Data *pLeaf;    
14280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
14290 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20  a for this leaf 
142a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  */.    int iOff;
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142c0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
142d0 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  f first term on 
142e0 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20  leaf */.    int 
142f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
14300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
14310 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
14320 6f 75 67 68 20 65 6d 70 74 79 20 6c 65 61 76 65  ough empty leave
14330 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  s */..    /* If 
14340 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73  the leaf in ques
14350 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
14360 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72   been trimmed fr
14370 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20  om the segment, 
14380 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74  .    ** ignore t
14390 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79  his b-tree entry
143a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61  . Otherwise, loa
143b0 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  d it into memory
143c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65  . */.    if( ite
143d0 72 2e 69 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67  r.iLeaf<pSeg->pg
143e0 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e  noFirst ) contin
143f0 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46  ue;.    iRow = F
14400 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
14410 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53  D(iIdx, pSeg->iS
14420 65 67 69 64 2c 20 30 2c 20 69 74 65 72 2e 69 4c  egid, 0, iter.iL
14430 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20  eaf);.    pLeaf 
14440 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
14450 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  , iRow);.    if(
14460 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
14470 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  k;..    /* Check
14480 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63   that the leaf c
14490 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
144a0 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74   one term, and t
144b0 68 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a  hat it is equal.
144c0 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72      ** to or lar
144d0 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c  ger than the spl
144e0 69 74 2d 6b 65 79 20 69 6e 20 69 74 65 72 2e 74  it-key in iter.t
144f0 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 4f 66  erm.  */.    iOf
14500 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
14510 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20  pLeaf->p[2]);.  
14520 20 20 69 66 28 20 69 4f 66 66 3d 3d 30 20 29 7b    if( iOff==0 ){
14530 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
14540 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
14550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
14560 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
14570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
14580 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61  e of term on lea
14590 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
145a0 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20      int res;    
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  /* Comparison of
145d0 20 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d   term and split-
145e0 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66  key */.      iOf
145f0 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
14600 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
14610 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , nTerm);.      
14620 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c  res = memcmp(&pL
14630 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 69 74  eaf->p[iOff], it
14640 65 72 2e 74 65 72 6d 2e 70 2c 20 4d 49 4e 28 6e  er.term.p, MIN(n
14650 54 65 72 6d 2c 20 69 74 65 72 2e 74 65 72 6d 2e  Term, iter.term.
14660 6e 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  n));.      if( r
14670 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54  es==0 ) res = nT
14680 65 72 6d 20 2d 20 69 74 65 72 2e 74 65 72 6d 2e  erm - iter.term.
14690 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  n;.      if( res
146a0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  <0 ){.        p-
146b0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
146c0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
146d0 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
146e0 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
146f0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
14700 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  eak;..    /* Now
14710 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
14720 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76  iter.nEmpty leav
14730 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  es following the
14740 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20   current leaf.  
14750 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
14760 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
14770 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20  o terms. */.    
14780 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 69 74 65 72  for(i=1; i<=iter
14790 2e 6e 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20  .nEmpty; i++){. 
147a0 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
147b0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f  5DataRead(p, iRo
147c0 77 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  w+i);.      if( 
147d0 70 4c 65 61 66 20 26 26 20 30 21 3d 66 74 73 35  pLeaf && 0!=fts5
147e0 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
147f0 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [2]) ){.        
14800 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
14810 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
14820 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
14830 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
14840 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
14850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14860 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65   iter.iLeaf!=pSe
14870 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
14880 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
14890 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20  CORRUPT;.  }..  
148a0 66 74 73 35 42 74 72 65 65 49 74 65 72 46 72 65  fts5BtreeIterFre
148b0 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  e(&iter);.}../*.
148c0 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20  ** Run internal 
148d0 63 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65  checks to ensure
148e0 20 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e   that the FTS in
148f0 64 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72  dex (a) is inter
14900 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73  nally .** consis
14910 74 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  tent and (b) con
14920 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
14930 72 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20  r which the XOR 
14940 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  of the checksums
14950 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65  .** as calculate
14960 64 20 62 79 20 66 74 73 35 49 6e 64 65 78 45 6e  d by fts5IndexEn
14970 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b  tryCksum() is ck
14980 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  sum..**.** Retur
14990 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
149a0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69   if any of the i
149b0 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66  nternal checks f
149c0 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a  ail, or if the.*
149d0 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20  * checksum does 
149e0 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72  not match. Retur
149f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
14a00 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20 77  ll checks pass w
14a10 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c  ithout.** error,
14a20 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53   or some other S
14a30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
14a40 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f   if another erro
14a50 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20  r (e.g. OOM).** 
14a60 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
14a70 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
14a80 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74  ntegrityCheck(Ft
14a90 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20  s5Index *p, u64 
14aa0 63 6b 73 75 6d 29 7b 0a 20 20 46 74 73 35 43 6f  cksum){.  Fts5Co
14ab0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
14ac0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e  p->pConfig;.  in
14ad0 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14af0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
14b00 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73   through indexes
14b10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
14b40 63 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b  code */.  u64 ck
14b50 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20  sum2 = 0;       
14b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
14b70 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63  cksum based on c
14b80 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78  ontents of index
14b90 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  es */..  /* Chec
14ba0 6b 20 74 68 61 74 20 74 68 65 20 63 68 65 63 6b  k that the check
14bb0 73 75 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78  sum of the index
14bc0 20 6d 61 74 63 68 65 73 20 74 68 65 20 61 72 67   matches the arg
14bd0 75 6d 65 6e 74 20 63 68 65 63 6b 73 75 6d 20 2a  ument checksum *
14be0 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20  /.  for(iIdx=0; 
14bf0 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
14c00 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
14c10 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69 53 65  .    Fts5MultiSe
14c20 67 49 74 65 72 20 2a 70 49 74 65 72 3b 0a 20 20  gIter *pIter;.  
14c30 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
14c40 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
14c50 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
14c60 69 49 64 78 29 3b 0a 20 20 20 20 66 6f 72 28 66  iIdx);.    for(f
14c70 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
14c80 70 2c 20 70 53 74 72 75 63 74 2c 20 69 49 64 78  p, pStruct, iIdx
14c90 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29  , -1, 0, &pIter)
14ca0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
14cb0 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
14cc0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
14cd0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
14ce0 78 74 28 70 2c 20 70 49 74 65 72 29 0a 20 20 20  xt(p, pIter).   
14cf0 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f   ){.      Fts5Po
14d00 73 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20  sIter sPos;     
14d10 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
14d20 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
14d30 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
14d40 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20  /.      int n;  
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
14d70 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
14d80 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
14d90 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
14da0 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
14db0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63      char *z = (c
14dc0 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74  har*)fts5MultiIt
14dd0 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e  erTerm(pIter, &n
14de0 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 66 74  );..      for(ft
14df0 73 35 50 6f 73 49 74 65 72 49 6e 69 74 28 70 2c  s5PosIterInit(p,
14e00 20 70 49 74 65 72 2c 20 26 73 50 6f 73 29 3b 0a   pIter, &sPos);.
14e10 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 6f            fts5Po
14e20 73 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f  sIterEof(p, &sPo
14e30 73 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  s)==0;.         
14e40 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74   fts5PosIterNext
14e50 28 70 2c 20 26 73 50 6f 73 29 0a 20 20 20 20 20  (p, &sPos).     
14e60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75   ){.        cksu
14e70 6d 32 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45  m2 ^= fts5IndexE
14e80 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64  ntryCksum(iRowid
14e90 2c 20 73 50 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f  , sPos.iCol, sPo
14ea0 73 2e 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 23  s.iPos, z, n);.#
14eb0 69 66 20 30 0a 20 20 20 20 20 20 20 20 66 70 72  if 0.        fpr
14ec0 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72 6f  intf(stdout, "ro
14ed0 77 69 64 3d 25 64 20 22 2c 20 28 69 6e 74 29 69  wid=%d ", (int)i
14ee0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
14ef0 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
14f00 22 74 65 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e 2c  "term=%.*s ", n,
14f10 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72   z);.        fpr
14f20 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 63 6f  intf(stdout, "co
14f30 6c 3d 25 64 20 22 2c 20 73 50 6f 73 2e 69 43 6f  l=%d ", sPos.iCo
14f40 6c 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  l);.        fpri
14f50 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 6f 66 66  ntf(stdout, "off
14f60 3d 25 64 5c 6e 22 2c 20 73 50 6f 73 2e 69 50 6f  =%d\n", sPos.iPo
14f70 73 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75  s);.        fflu
14f80 73 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64  sh(stdout);.#end
14f90 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  if.      }.    }
14fa0 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
14fb0 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29  erFree(p, pIter)
14fc0 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
14fd0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
14fe0 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ct);.  }.  rc = 
14ff0 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d  p->rc;.  if( rc=
15000 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
15010 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 72 63  sum!=cksum2 ) rc
15020 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
15030 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
15040 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  t the internal n
15050 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67  odes of each seg
15060 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c  ment match the l
15070 65 61 76 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69  eaves */.  for(i
15080 49 64 78 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  Idx=0; rc==SQLIT
15090 45 5f 4f 4b 20 26 26 20 69 49 64 78 3c 3d 70 43  E_OK && iIdx<=pC
150a0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
150b0 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73  iIdx++){.    Fts
150c0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
150d0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
150e0 75 72 65 52 65 61 64 28 70 2c 20 69 49 64 78 29  ureRead(p, iIdx)
150f0 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  ;.    if( pStruc
15100 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
15110 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20  Lvl, iSeg;.     
15120 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
15130 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
15140 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
15150 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
15160 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
15170 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
15180 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
15190 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
151a0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
151b0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
151c0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
151d0 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  g];.          ft
151e0 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
151f0 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20  CheckSegment(p, 
15200 69 49 64 78 2c 20 70 53 65 67 29 3b 0a 20 20 20  iIdx, pSeg);.   
15210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15220 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
15230 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
15240 74 72 75 63 74 29 3b 0a 20 20 20 20 72 63 20 3d  truct);.    rc =
15250 20 70 2d 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20 72   p->rc;.  }..  r
15260 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15270 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15280 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75  ts5DecodeStructu
15290 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  re(.  int *pRc, 
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
152c0 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
152d0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
152e0 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  f,.  const u8 *p
152f0 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a  Blob, int nBlob.
15300 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15320 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15330 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76  ode */.  int iLv
15340 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20  l, iSeg;        
15350 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
15360 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
15370 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ls, segments */.
15380 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
15390 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
153a0 20 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72    /* Decoded str
153b0 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f  ucture object */
153c0 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72  ..  rc = fts5Str
153d0 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c  uctureDecode(pBl
153e0 6f 62 2c 20 6e 42 6c 6f 62 2c 20 26 70 29 3b 0a  ob, nBlob, &p);.
153f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15400 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20  _OK ){.    *pRc 
15410 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
15420 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4c 76  ;.  }..  for(iLv
15430 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65  l=0; iLvl<p->nLe
15440 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
15450 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
15460 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d  evel *pLvl = &p-
15470 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
15480 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
15490 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
154a0 42 75 66 2c 20 22 20 7b 6c 76 6c 3d 25 64 20 6e  Buf, " {lvl=%d n
154b0 4d 65 72 67 65 3d 25 64 22 2c 20 69 4c 76 6c 2c  Merge=%d", iLvl,
154c0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a   pLvl->nMerge);.
154d0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
154e0 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
154f0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
15500 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
15510 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
15520 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
15530 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
15540 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
15550 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , pBuf, .       
15560 20 20 20 22 20 7b 69 64 3d 25 64 20 68 3d 25 64     " {id=%d h=%d
15570 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22   leaves=%d..%d}"
15580 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
15590 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20 0a  pSeg->nHeight, .
155a0 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e            pSeg->
155b0 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d  pgnoFirst, pSeg-
155c0 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20  >pgnoLast.      
155d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
155e0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
155f0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
15600 7d 22 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  }");.  }..  fts5
15610 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
15620 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  (p);.}../*.** De
15630 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64  code a segment-d
15640 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74  ata rowid from t
15650 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
15660 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15670 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74  s.** the opposit
15680 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f  e of macro FTS5_
15690 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e  SEGMENT_ROWID().
156a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
156b0 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
156c0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20  .  i64 iRowid,  
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d     /* Rowid from
156f0 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
15700 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 2c 20 20  .  int *piIdx,  
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6e 64 65 78     /* OUT: Index
15730 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67   */.  int *piSeg
15740 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
15750 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
15760 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
15770 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20  t *piHeight,    
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15790 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a   OUT: Height */.
157a0 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20    int *piPgno   
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e    /* OUT: Page n
157d0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70  umber */.){.  *p
157e0 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52  iPgno = (int)(iR
157f0 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
15800 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47  << FTS5_DATA_PAG
15810 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  E_B) - 1));.  iR
15820 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
15830 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70  TA_PAGE_B;..  *p
15840 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28  iHeight = (int)(
15850 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
15860 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48  1 << FTS5_DATA_H
15870 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a  EIGHT_B) - 1));.
15880 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
15890 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b  5_DATA_HEIGHT_B;
158a0 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28  ..  *piSegid = (
158b0 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
158c0 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
158d0 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b  ATA_ID_B) - 1));
158e0 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
158f0 53 35 5f 44 41 54 41 5f 49 44 5f 42 3b 0a 0a 20  S5_DATA_ID_B;.. 
15900 20 2a 70 69 49 64 78 20 3d 20 28 69 6e 74 29 28   *piIdx = (int)(
15910 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
15920 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
15930 44 58 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a  DX_B) - 1));.}..
15940 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f  /*.** Buffer (a/
15950 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  n) is assumed to
15960 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20   contain a list 
15970 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  of serialized va
15980 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65  rints. Read.** e
15990 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61  ach varint and a
159a0 70 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67  ppend its string
159b0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
159c0 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20  to buffer pBuf. 
159d0 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20  Return.** after 
159e0 65 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74  either the input
159f0 20 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75   buffer is exhau
15a00 73 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75  sted or a 0 valu
15a10 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  e is read..**.**
15a20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15a30 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
15a40 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72  of bytes read fr
15a50 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  om the input buf
15a60 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
15a70 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  nt fts5DecodePos
15a80 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  list(int *pRc, F
15a90 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
15aa0 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
15ab0 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  t n){.  int iOff
15ac0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
15ad0 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74  Off<n ){.    int
15ae0 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20   iVal;.    iOff 
15af0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
15b00 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a  a[iOff], iVal);.
15b10 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
15b20 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
15b30 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61  pBuf, " %d", iVa
15b40 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 56 61 6c  l);.    if( iVal
15b50 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
15b60 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
15b70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61  }../*.** The sta
15b80 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f  rt of buffer (a/
15b90 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  n) contains the 
15ba0 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69  start of a docli
15bb0 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a  st. The doclist.
15bc0 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ** may or may no
15bd0 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20  t finish within 
15be0 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73  the buffer. This
15bf0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
15c00 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72  s a text.** repr
15c10 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
15c20 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f  e part of the do
15c30 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72  clist that is pr
15c40 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a  esent to buffer.
15c50 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20  ** pBuf. .**.** 
15c60 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
15c70 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
15c80 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
15c90 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
15ca0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
15cb0 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  t fts5DecodeDocl
15cc0 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
15cd0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
15ce0 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
15cf0 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69   n){.  i64 iDoci
15d00 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  d;.  int iOff = 
15d10 30 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e  0;..  if( iOff<n
15d20 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20   ){.    iOff += 
15d30 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
15d40 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
15d50 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 66  )&iDocid);.    f
15d60 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
15d70 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
15d80 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20   " rowid=%lld", 
15d90 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77  iDocid);.  }.  w
15da0 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
15db0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
15dc0 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52  DecodePoslist(pR
15dd0 63 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66  c, pBuf, &a[iOff
15de0 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20  ], n-iOff);.    
15df0 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
15e00 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
15e10 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
15e20 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26  lite3GetVarint(&
15e30 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
15e40 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69  iDelta);.      i
15e50 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72  f( iDelta==0 ) r
15e60 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20  eturn iOff;.    
15e70 20 20 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c    iDocid -= iDel
15e80 74 61 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  ta;.      fts5Bu
15e90 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
15ea0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 72 6f  (pRc, pBuf, " ro
15eb0 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69  wid=%lld", iDoci
15ec0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
15ed0 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a   return iOff;.}.
15ee0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
15ef0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65  mentation of use
15f00 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
15f10 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64   function fts5_d
15f20 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
15f30 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
15f40 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  deFunction(.  sq
15f50 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
15f60 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
15f70 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
15f80 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
15f90 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15fb0 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
15fc0 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
15fd0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
15fe0 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
15ff0 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
16000 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  nts */.){.  i64 
16010 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
16020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16030 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20  owid for record 
16040 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f  being decoded */
16050 0a 20 20 69 6e 74 20 69 49 64 78 2c 69 53 65 67  .  int iIdx,iSeg
16060 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f  id,iHeight,iPgno
16070 3b 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70  ;  /* Rowid comp
16080 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  enents */.  cons
16090 74 20 75 38 20 2a 61 3b 20 69 6e 74 20 6e 3b 20  t u8 *a; int n; 
160a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
160b0 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20  ecord to decode 
160c0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
160d0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
160e0 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70       /* Build up
160f0 20 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20   text to return 
16100 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
16110 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
16120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16130 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
16140 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
16150 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
16160 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
16170 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  fer));.  iRowid 
16180 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
16190 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b  int64(apVal[0]);
161a0 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
161b0 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c  alue_bytes(apVal
161c0 5b 31 5d 29 3b 0a 20 20 61 20 3d 20 73 71 6c 69  [1]);.  a = sqli
161d0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
161e0 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 66 74 73 35  pVal[1]);.  fts5
161f0 44 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77  DecodeRowid(iRow
16200 69 64 2c 20 26 69 49 64 78 2c 20 26 69 53 65 67  id, &iIdx, &iSeg
16210 69 64 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69  id, &iHeight, &i
16220 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53  Pgno);..  if( iS
16230 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  egid==0 ){.    i
16240 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f  f( iRowid==FTS5_
16250 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
16260 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
16270 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
16280 72 63 2c 20 26 73 2c 20 22 7b 61 76 65 72 61 67  rc, &s, "{averag
16290 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73  es} ");.    }els
162a0 65 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  e{.      fts5Buf
162b0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
162c0 26 72 63 2c 20 26 73 2c 20 22 7b 73 74 72 75 63  &rc, &s, "{struc
162d0 74 75 72 65 20 69 64 78 3d 25 64 7d 22 2c 20 28  ture idx=%d}", (
162e0 69 6e 74 29 28 69 52 6f 77 69 64 2d 31 30 29 29  int)(iRowid-10))
162f0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f  ;.      fts5Deco
16300 64 65 53 74 72 75 63 74 75 72 65 28 26 72 63 2c  deStructure(&rc,
16310 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20   &s, a, n);.    
16320 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  }.  }else{..    
16330 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
16340 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72  .    memset(&ter
16350 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
16360 35 42 75 66 66 65 72 29 29 3b 0a 20 20 20 20 66  5Buffer));.    f
16370 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
16380 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22  rintf(&rc, &s, "
16390 28 69 64 78 3d 25 64 20 73 65 67 69 64 3d 25 64  (idx=%d segid=%d
163a0 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 29 20 22   h=%d pgno=%d) "
163b0 2c 0a 20 20 20 20 20 20 20 20 69 49 64 78 2c 20  ,.        iIdx, 
163c0 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
163d0 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 0a 20   iPgno.    );.. 
163e0 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d     if( iHeight==
163f0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
16400 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20  TermOff = 0;.   
16410 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
16420 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
16430 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  iOff;.      int 
16440 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20  nKeep = 0;..    
16450 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
16460 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b  s5GetU16(&a[0]);
16470 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20  .      iTermOff 
16480 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
16490 32 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  2]);.      iOff 
164a0 3d 20 34 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 4;.      if( i
164b0 54 65 72 6d 4f 66 66 21 3d 34 20 26 26 20 69 52  TermOff!=4 && iR
164c0 6f 77 69 64 4f 66 66 21 3d 34 20 29 7b 0a 20 20  owidOff!=4 ){.  
164d0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
164e0 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
164f0 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
16500 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20  ], n-iOff);.    
16510 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
16520 66 3d 3d 30 20 29 20 69 4f 66 66 2b 2b 3b 0a 20  f==0 ) iOff++;. 
16530 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
16540 73 65 72 74 28 20 69 52 6f 77 69 64 4f 66 66 3d  sert( iRowidOff=
16550 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77  =0 || iOff==iRow
16560 69 64 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 69  idOff );.      i
16570 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
16580 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
16590 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
165a0 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
165b0 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20  ff], n-iOff);.  
165c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
165d0 65 72 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30  ert( iTermOff==0
165e0 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f   || iOff==iTermO
165f0 66 66 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ff );.      whil
16600 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
16610 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a       int nByte;.
16620 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
16630 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  getVarint32(&a[i
16640 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
16650 20 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b        term.n= nK
16660 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73  eep;.        fts
16670 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
16680 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42  b(&rc, &term, nB
16690 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  yte, &a[iOff]);.
166a0 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
166b0 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20  nByte;..        
166c0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
166d0 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
166e0 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
166f0 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
16700 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
16710 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 20 20 29  term.p.        )
16720 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
16730 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  = fts5DecodeDocl
16740 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
16750 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a  iOff], n-iOff);.
16760 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
16770 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <n ){.          
16780 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
16790 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
167a0 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eep);.        }.
167b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
167c0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
167d0 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rm);.    }else{.
167e0 20 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74        Fts5NodeIt
167f0 65 72 20 73 73 3b 0a 20 20 20 20 20 20 66 6f 72  er ss;.      for
16800 28 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69  (fts5NodeIterIni
16810 74 28 6e 2c 20 61 2c 20 26 73 73 29 3b 20 73 73  t(n, a, &ss); ss
16820 2e 61 44 61 74 61 3b 20 66 74 73 35 4e 6f 64 65  .aData; fts5Node
16830 49 74 65 72 4e 65 78 74 28 26 72 63 2c 20 26 73  IterNext(&rc, &s
16840 73 29 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  s)){.        if(
16850 20 73 73 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b   ss.term.n==0 ){
16860 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
16870 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
16880 66 28 26 72 63 2c 20 26 73 2c 20 22 20 6c 65 66  f(&rc, &s, " lef
16890 74 3d 25 64 22 2c 20 73 73 2e 69 43 68 69 6c 64  t=%d", ss.iChild
168a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
168b0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
168c0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
168d0 74 66 28 26 72 63 2c 26 73 2c 20 22 20 5c 22 25  tf(&rc,&s, " \"%
168e0 2e 2a 73 5c 22 22 2c 20 73 73 2e 74 65 72 6d 2e  .*s\"", ss.term.
168f0 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20  n, ss.term.p);. 
16900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16910 20 69 66 28 20 73 73 2e 6e 45 6d 70 74 79 20 29   if( ss.nEmpty )
16920 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
16930 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
16940 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 65 6d  tf(&rc, &s, " em
16950 70 74 79 3d 25 64 22 2c 20 73 73 2e 6e 45 6d 70  pty=%d", ss.nEmp
16960 74 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ty);.        }. 
16970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
16980 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 73  5NodeIterFree(&s
16990 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
169a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
169b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
169c0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
169d0 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61  pCtx, (const cha
169e0 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c  r*)s.p, s.n, SQL
169f0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
16a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
16a10 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
16a20 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29  r_code(pCtx, rc)
16a30 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  ;.  }.  fts5Buff
16a40 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f  erFree(&s);.}../
16a50 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
16a60 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 72  led as part of r
16a70 65 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 46  egistering the F
16a80 54 53 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20  TS5 module with 
16a90 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
16aa0 65 63 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65  ection db. It re
16ab0 67 69 73 74 65 72 73 20 73 65 76 65 72 61 6c 20  gisters several 
16ac0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61  user-defined sca
16ad0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73  lar functions us
16ae0 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53  eful.** with FTS
16af0 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  5..**.** If succ
16b00 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
16b10 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
16b20 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16b30 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  s, some other.**
16b40 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
16b50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
16b60 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  nstead..*/.int s
16b70 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
16b80 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nit(sqlite3 *db)
16b90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
16ba0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
16bb0 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20  tion(.      db, 
16bc0 22 66 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32  "fts5_decode", 2
16bd0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
16be0 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63  , fts5DecodeFunc
16bf0 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  tion, 0, 0.  );.
16c00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16c10 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 74 61  /*.** Set the ta
16c20 72 67 65 74 20 70 61 67 65 20 73 69 7a 65 20 66  rget page size f
16c30 6f 72 20 74 68 65 20 69 6e 64 65 78 20 6f 62 6a  or the index obj
16c40 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ect..*/.void sql
16c50 69 74 65 33 46 74 73 35 49 6e 64 65 78 50 67 73  ite3Fts5IndexPgs
16c60 7a 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  z(Fts5Index *p, 
16c70 69 6e 74 20 70 67 73 7a 29 7b 0a 20 20 70 2d 3e  int pgsz){.  p->
16c80 70 67 73 7a 20 3d 20 70 67 73 7a 3b 0a 7d 0a 0a  pgsz = pgsz;.}..