/ Hex Artifact Content
Login

Artifact 6564c103148e8b59d6b816f34d0b31f5f4025054:


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 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  of the first doc
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 62 2d 74 72 65 65 20 68 65       + b-tree he
0c80: 69 67 68 74 20 28 31 20 2d 3e 20 72 6f 6f 74 20  ight (1 -> root 
0c90: 69 73 20 6c 65 61 66 2c 20 32 20 2d 3e 20 72 6f  is leaf, 2 -> ro
0ca0: 6f 74 20 69 73 20 70 61 72 65 6e 74 20 6f 66 20  ot is parent of 
0cb0: 6c 65 61 66 20 65 74 63 2e 29 0a 2a 2a 20 20 20  leaf etc.).**   
0cc0: 20 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65        + first le
0cd0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  af page number (
0ce0: 6f 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20  often 1, always 
0cf0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a  greater than 0).
0d00: 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e  **         + fin
0d10: 61 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  al leaf page num
0d20: 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65  ber.**.** 2. The
0d30: 20 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64   Averages Record
0d40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67  :.**.**   A sing
0d50: 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e  le record within
0d60: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
0d70: 65 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61  e. The data is a
0d80: 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73   list of varints
0d90: 2e 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74  ..**   The first
0da0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
0db0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0dc0: 74 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c  the index. Then,
0dd0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
0de0: 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20  .**   from left 
0df0: 74 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f  to right, the to
0e00: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  tal number of to
0e10: 6b 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  kens in the colu
0e20: 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a 2a 20 20  mn for all .**  
0e30: 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
0e40: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67  le..**.** 3. Seg
0e50: 6d 65 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a  ment leaves:.**.
0e60: 2a 2a 20 20 20 54 45 52 4d 20 44 4f 43 4c 49 53  **   TERM DOCLIS
0e70: 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20  T FORMAT:.**.** 
0e80: 20 20 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68      Most of each
0e90: 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73   segment leaf is
0ea0: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72   taken up by ter
0eb0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20  m/doclist data. 
0ec0: 54 68 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65  The .**     gene
0ed0: 72 61 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  ral format of th
0ee0: 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64  e term/doclist d
0ef0: 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ata is:.**.**   
0f00: 20 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20 73        varint : s
0f10: 69 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65 72  ize of first ter
0f20: 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 6c 6f  m.**         blo
0f30: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
0f40: 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20   data.**        
0f50: 20 64 6f 63 6c 69 73 74 3a 20 66 69 72 73 74 20   doclist: first 
0f60: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  doclist.**      
0f70: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
0f80: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  {.**           v
0f90: 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f  arint:  number o
0fa0: 66 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d 6f  f bytes in commo
0fb0: 6e 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  n with previous 
0fc0: 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  term.**         
0fd0: 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65    varint:  numbe
0fe0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
0ff0: 77 20 74 65 72 6d 20 64 61 74 61 20 28 6e 4e 65  w term data (nNe
1000: 77 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  w).**           
1010: 62 6c 6f 62 3a 20 20 20 20 6e 4e 65 77 20 62 79  blob:    nNew by
1020: 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20  tes of new term 
1030: 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  data.**         
1040: 20 20 64 6f 63 6c 69 73 74 3a 20 6e 65 78 74 20    doclist: next 
1050: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  doclist.**      
1060: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64     }.**.**     d
1070: 6f 63 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a  oclist format:.*
1080: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72  *.**         var
1090: 69 6e 74 3a 20 20 66 69 72 73 74 20 72 6f 77 69  int:  first rowi
10a0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6f 73  d.**         pos
10b0: 6c 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c  list: first posl
10c0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
10d0: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
10e0: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
10f0: 74 3a 20 20 72 6f 77 69 64 20 64 65 6c 74 61 20  t:  rowid delta 
1100: 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20  (always > 0).** 
1110: 20 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73            poslis
1120: 74 3a 20 6e 65 78 74 20 70 6f 73 6c 69 73 74 0a  t: next poslist.
1130: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
1140: 20 20 20 20 20 20 20 20 30 78 30 30 20 62 79 74          0x00 byt
1150: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 6f 73 6c  e.**.**     posl
1160: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
1170: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
1180: 3a 20 73 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73  : size of poslis
1190: 74 20 69 6e 20 62 79 74 65 73 20 6d 75 6c 74 69  t in bytes multi
11a0: 70 6c 69 65 64 20 62 79 20 32 2c 20 6e 6f 74 20  plied by 2, not 
11b0: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20  including.**    
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
11d0: 73 20 66 69 65 6c 64 2e 20 50 6c 75 73 20 31 20  s field. Plus 1 
11e0: 69 66 20 74 68 69 73 20 65 6e 74 72 79 20 63 61  if this entry ca
11f0: 72 72 69 65 73 20 74 68 65 20 22 64 65 6c 65 74  rries the "delet
1200: 65 22 20 66 6c 61 67 2e 0a 2a 2a 20 20 20 20 20  e" flag..**     
1210: 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c      collist: col
1220: 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
1230: 30 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  0.**         zer
1240: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
1250: 20 20 20 20 20 20 20 20 20 30 78 30 31 20 62 79           0x01 by
1260: 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  te.**           
1270: 76 61 72 69 6e 74 3a 20 63 6f 6c 75 6d 6e 20 6e  varint: column n
1280: 75 6d 62 65 72 20 28 49 29 0a 2a 2a 20 20 20 20  umber (I).**    
1290: 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20         collist: 
12a0: 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75  collist for colu
12b0: 6d 6e 20 49 0a 2a 2a 20 20 20 20 20 20 20 20 20  mn I.**         
12c0: 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c  }.**.**     coll
12d0: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
12e0: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
12f0: 3a 20 66 69 72 73 74 20 6f 66 66 73 65 74 20 2b  : first offset +
1300: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65   2.**         ze
1310: 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20  ro-or-more {.** 
1320: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1330: 3a 20 6f 66 66 73 65 74 20 64 65 6c 74 61 20 2b  : offset delta +
1340: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   2.**         }.
1350: 2a 2a 0a 2a 2a 20 20 20 50 41 47 49 4e 41 54 49  **.**   PAGINATI
1360: 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65  ON.**.**     The
1370: 20 66 6f 72 6d 61 74 20 64 65 73 63 72 69 62 65   format describe
1380: 64 20 61 62 6f 76 65 20 69 73 20 6f 6e 6c 79 20  d above is only 
1390: 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20  accurate if the 
13a0: 65 6e 74 69 72 65 20 74 65 72 6d 2f 64 6f 63 6c  entire term/docl
13b0: 69 73 74 0a 2a 2a 20 20 20 20 20 64 61 74 61 20  ist.**     data 
13c0: 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  fits on a single
13d0: 20 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74   leaf page. If t
13e0: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
13f0: 61 73 65 2c 20 74 68 65 20 66 6f 72 6d 61 74 0a  ase, the format.
1400: 2a 2a 20 20 20 20 20 69 73 20 63 68 61 6e 67 65  **     is change
1410: 64 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a  d in two ways:.*
1420: 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20  *.**       + if 
1430: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
1440: 6f 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73  on a page occurs
1450: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
1460: 74 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20  t term, it.**   
1470: 20 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20        is stored 
1480: 61 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  as a literal val
1490: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ue:.**.**       
14a0: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66        varint:  f
14b0: 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a  irst rowid.**.**
14c0: 20 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72         + the fir
14d0: 73 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20  st term on each 
14e0: 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
14f0: 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
1500: 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  s the.**        
1510: 20 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d   very first term
1520: 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a   of the segment:
1530: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1540: 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65     varint : size
1550: 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a   of first term.*
1560: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c  *             bl
1570: 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72  ob:    first ter
1580: 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20  m data.**.**    
1590: 20 45 61 63 68 20 6c 65 61 66 20 70 61 67 65 20   Each leaf page 
15a0: 62 65 67 69 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a  begins with:.**.
15b0: 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74  **       + 2-byt
15c0: 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61  e unsigned conta
15d0: 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20  ining offset to 
15e0: 66 69 72 73 74 20 72 6f 77 69 64 20 28 6f 72 20  first rowid (or 
15f0: 30 29 2e 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32  0)..**       + 2
1600: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63  -byte unsigned c
1610: 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74  ontaining offset
1620: 20 74 6f 20 66 69 72 73 74 20 74 65 72 6d 20 28   to first term (
1630: 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46  or 0)..**.**   F
1640: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 72 6d 2f  ollowed by term/
1650: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 0a 2a 2a  doclist data..**
1660: 0a 2a 2a 20 34 2e 20 53 65 67 6d 65 6e 74 20 69  .** 4. Segment i
1670: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a  nterior nodes:.*
1680: 2a 0a 2a 2a 20 20 20 54 68 65 20 69 6e 74 65 72  *.**   The inter
1690: 69 6f 72 20 6e 6f 64 65 73 20 74 75 72 6e 20 74  ior nodes turn t
16a0: 68 65 20 6c 69 73 74 20 6f 66 20 6c 65 61 76 65  he list of leave
16b0: 73 20 69 6e 74 6f 20 61 20 62 2b 74 72 65 65 2e  s into a b+tree.
16c0: 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68 20 69   .**.**   Each i
16d0: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 65 67  nterior node beg
16e0: 69 6e 73 20 77 69 74 68 20 61 20 76 61 72 69 6e  ins with a varin
16f0: 74 20 2d 20 74 68 65 20 70 61 67 65 20 6e 75 6d  t - the page num
1700: 62 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 0a  ber of the left.
1710: 2a 2a 20 20 20 6d 6f 73 74 20 63 68 69 6c 64 20  **   most child 
1720: 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  node. Following 
1730: 74 68 69 73 2c 20 66 6f 72 20 65 61 63 68 20 6c  this, for each l
1740: 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20  eaf page except 
1750: 74 68 65 20 66 69 72 73 74 2c 0a 2a 2a 20 20 20  the first,.**   
1760: 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
1770: 65 73 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a  es contain:.**.*
1780: 2a 20 20 20 20 20 61 29 20 49 66 20 74 68 65 20  *     a) If the 
1790: 6c 65 61 66 20 70 61 67 65 20 63 6f 6e 74 61 69  leaf page contai
17a0: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
17b0: 74 65 72 6d 2c 20 74 68 65 6e 20 61 20 74 65 72  term, then a ter
17c0: 6d 2d 70 72 65 66 69 78 20 74 68 61 74 0a 2a 2a  m-prefix that.**
17d0: 20 20 20 20 20 20 20 20 69 73 20 67 72 65 61 74          is great
17e0: 65 72 20 74 68 61 6e 20 61 6c 6c 20 70 72 65 76  er than all prev
17f0: 69 6f 75 73 20 74 65 72 6d 73 2c 20 61 6e 64 20  ious terms, and 
1800: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1810: 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  al to the.**    
1820: 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 6f      first term o
1830: 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e  n the leaf page.
1840: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 49 66  .**.**     b) If
1850: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e   the leaf page n
1860: 6f 20 74 65 72 6d 73 2c 20 61 20 72 65 63 6f 72  o terms, a recor
1870: 64 20 69 6e 64 69 63 61 74 69 6e 67 20 68 6f 77  d indicating how
1880: 20 6d 61 6e 79 20 63 6f 6e 73 65 63 75 74 69 76   many consecutiv
1890: 65 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61 76  e.**        leav
18a0: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  es contain no te
18b0: 72 6d 73 2c 20 61 6e 64 20 77 68 65 74 68 65 72  rms, and whether
18c0: 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 69 73   or not there is
18d0: 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a   an associated.*
18e0: 2a 20 20 20 20 20 20 20 20 62 79 2d 72 6f 77 69  *        by-rowi
18f0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a  d index record..
1900: 2a 2a 0a 2a 2a 20 20 20 42 79 20 64 65 66 69 6e  **.**   By defin
1910: 69 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20  ition, there is 
1920: 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
1930: 6f 6e 65 20 74 79 70 65 20 28 62 29 20 72 65 63  one type (b) rec
1940: 6f 72 64 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a  ord in a row..**
1950: 20 20 20 54 79 70 65 20 28 62 29 20 72 65 63 6f     Type (b) reco
1960: 72 64 73 20 6f 6e 6c 79 20 65 76 65 72 20 61 70  rds only ever ap
1970: 70 65 61 72 20 6f 6e 20 68 65 69 67 68 74 3d 31  pear on height=1
1980: 20 70 61 67 65 73 20 2d 20 69 6d 6d 65 64 69 61   pages - immedia
1990: 74 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20  te parents.**   
19a0: 6f 66 20 6c 65 61 76 65 73 2e 20 4f 6e 6c 79 20  of leaves. Only 
19b0: 74 79 70 65 20 28 61 29 20 72 65 63 6f 72 64 73  type (a) records
19c0: 20 61 72 65 20 70 75 73 68 65 64 20 74 6f 20 68   are pushed to h
19d0: 69 67 68 65 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a  igher levels..**
19e0: 0a 2a 2a 20 20 20 54 65 72 6d 20 66 6f 72 6d 61  .**   Term forma
19f0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e  t:.**.**     * N
1a00: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1a10: 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72  n common with pr
1a20: 65 76 69 6f 75 73 20 74 65 72 6d 20 70 6c 75 73  evious term plus
1a30: 20 32 2c 20 61 73 20 61 20 76 61 72 69 6e 74 2e   2, as a varint.
1a40: 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72  .**     * Number
1a50: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
1a60: 20 74 65 72 6d 20 64 61 74 61 2c 20 61 73 20 61   term data, as a
1a70: 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20   varint..**     
1a80: 2a 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2e  * new term data.
1a90: 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d  .**.**   No-term
1aa0: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
1ab0: 20 20 20 2a 20 65 69 74 68 65 72 20 61 6e 20 30     * either an 0
1ac0: 78 30 30 20 6f 72 20 30 78 30 31 20 62 79 74 65  x00 or 0x01 byte
1ad0: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 30  . If the value 0
1ae0: 78 30 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  x01 is used, the
1af0: 6e 20 74 68 65 72 65 20 0a 2a 2a 20 20 20 20 20  n there .**     
1b00: 20 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74    is an associat
1b10: 65 64 20 69 6e 64 65 78 2d 62 79 2d 72 6f 77 69  ed index-by-rowi
1b20: 64 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 20 20 20  d record..**    
1b30: 20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   * the number of
1b40: 20 7a 65 72 6f 2d 74 65 72 6d 20 6c 65 61 76 65   zero-term leave
1b50: 73 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  s as a varint..*
1b60: 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d 65 6e 74 20  *.** 5. Segment 
1b70: 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 3a  doclist indexes:
1b80: 0a 2a 2a 0a 2a 2a 20 20 20 44 6f 63 6c 69 73 74  .**.**   Doclist
1b90: 20 69 6e 64 65 78 65 73 20 61 72 65 20 74 68 65   indexes are the
1ba0: 6d 73 65 6c 76 65 73 20 62 2d 74 72 65 65 73 2c  mselves b-trees,
1bb0: 20 68 6f 77 65 76 65 72 20 74 68 65 79 20 75 73   however they us
1bc0: 75 61 6c 6c 79 20 63 6f 6e 73 69 73 74 20 6f 66  ually consist of
1bd0: 0a 2a 2a 20 20 20 61 20 73 69 6e 67 6c 65 20 6c  .**   a single l
1be0: 65 61 66 20 72 65 63 6f 72 64 20 6f 6e 6c 79 2e  eaf record only.
1bf0: 20 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 65   The format of e
1c00: 61 63 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ach doclist inde
1c10: 78 20 6c 65 61 66 20 70 61 67 65 20 0a 2a 2a 20  x leaf page .** 
1c20: 20 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20    is:.**.**     
1c30: 2a 20 46 6c 61 67 73 20 62 79 74 65 2e 20 42 69  * Flags byte. Bi
1c40: 74 73 20 61 72 65 3a 0a 2a 2a 20 20 20 20 20 20  ts are:.**      
1c50: 20 20 20 30 78 30 31 3a 20 43 6c 65 61 72 20 69     0x01: Clear i
1c60: 66 20 6c 65 61 66 20 69 73 20 61 6c 73 6f 20 74  f leaf is also t
1c70: 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6f 74  he root page, ot
1c80: 68 65 72 77 69 73 65 20 73 65 74 2e 0a 2a 2a 0a  herwise set..**.
1c90: 2a 2a 20 20 20 20 20 2a 20 50 61 67 65 20 6e 75  **     * Page nu
1ca0: 6d 62 65 72 20 6f 66 20 66 74 73 20 69 6e 64 65  mber of fts inde
1cb0: 78 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73 20  x leaf page. As 
1cc0: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
1cd0: 20 20 20 20 2a 20 46 69 72 73 74 20 64 6f 63 69      * First doci
1ce0: 64 20 6f 6e 20 70 61 67 65 20 69 6e 64 69 63 61  d on page indica
1cf0: 74 65 64 20 62 79 20 70 72 65 76 69 6f 75 73 20  ted by previous 
1d00: 66 69 65 6c 64 2e 20 41 73 20 61 20 76 61 72 69  field. As a vari
1d10: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  nt..**.**     * 
1d20: 41 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74  A list of varint
1d30: 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  s, one for each 
1d40: 73 75 62 73 65 71 75 65 6e 74 20 74 65 72 6d 6c  subsequent terml
1d50: 65 73 73 20 70 61 67 65 2e 20 41 20 0a 2a 2a 20  ess page. A .** 
1d60: 20 20 20 20 20 20 70 6f 73 69 74 69 76 65 20 64        positive d
1d70: 65 6c 74 61 20 69 66 20 74 68 65 20 74 65 72 6d  elta if the term
1d80: 6c 65 73 73 20 70 61 67 65 20 63 6f 6e 74 61 69  less page contai
1d90: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
1da0: 64 6f 63 69 64 2c 20 0a 2a 2a 20 20 20 20 20 20  docid, .**      
1db0: 20 6f 72 20 61 6e 20 30 78 30 30 20 62 79 74 65   or an 0x00 byte
1dc0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
1dd0: 2a 20 20 20 49 6e 74 65 72 6e 61 6c 20 64 6f 63  *   Internal doc
1de0: 6c 69 73 74 20 69 6e 64 65 78 20 6e 6f 64 65 73  list index nodes
1df0: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   are:.**.**     
1e00: 2a 20 46 6c 61 67 73 20 62 79 74 65 2e 20 42 69  * Flags byte. Bi
1e10: 74 73 20 61 72 65 3a 0a 2a 2a 20 20 20 20 20 20  ts are:.**      
1e20: 20 20 20 30 78 30 31 3a 20 43 6c 65 61 72 20 66     0x01: Clear f
1e30: 6f 72 20 72 6f 6f 74 20 70 61 67 65 2c 20 6f 74  or root page, ot
1e40: 68 65 72 77 69 73 65 20 73 65 74 2e 0a 2a 2a 0a  herwise set..**.
1e50: 2a 2a 20 20 20 20 20 2a 20 50 61 67 65 20 6e 75  **     * Page nu
1e60: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 63 68  mber of first ch
1e70: 69 6c 64 20 70 61 67 65 2e 20 41 73 20 61 20 76  ild page. As a v
1e80: 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  arint..**.**    
1e90: 20 2a 20 43 6f 70 79 20 6f 66 20 66 69 72 73 74   * Copy of first
1ea0: 20 64 6f 63 69 64 20 6f 6e 20 70 61 67 65 20 69   docid on page i
1eb0: 6e 64 69 63 61 74 65 64 20 62 79 20 70 72 65 76  ndicated by prev
1ec0: 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73 20 61  ious field. As a
1ed0: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20   varint..**.**  
1ee0: 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66 20 64     * A list of d
1ef0: 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 76 61 72  elta-encoded var
1f00: 69 6e 74 73 20 2d 20 74 68 65 20 66 69 72 73 74  ints - the first
1f10: 20 64 6f 63 69 64 20 6f 6e 20 65 61 63 68 20 73   docid on each s
1f20: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 20 20 20  ubsequent.**    
1f30: 20 20 20 63 68 69 6c 64 20 70 61 67 65 2e 20 0a     child page. .
1f40: 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77  **.*/../*.** Row
1f50: 69 64 73 20 66 6f 72 20 74 68 65 20 61 76 65 72  ids for the aver
1f60: 61 67 65 73 20 61 6e 64 20 73 74 72 75 63 74 75  ages and structu
1f70: 72 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  re records in th
1f80: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
1f90: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
1fa0: 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 20  AVERAGES_ROWID  
1fb0: 20 20 20 31 20 20 20 20 2f 2a 20 52 6f 77 69 64     1    /* Rowid
1fc0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 61 76   used for the av
1fd0: 65 72 61 67 65 73 20 72 65 63 6f 72 64 20 2a 2f  erages record */
1fe0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
1ff0: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 20 20 20  RUCTURE_ROWID   
2000: 31 30 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  10    /* The str
2010: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f  ucture record */
2020: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 64  ../*.** Macros d
2030: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 72  etermining the r
2040: 6f 77 69 64 73 20 75 73 65 64 20 62 79 20 73 65  owids used by se
2050: 67 6d 65 6e 74 20 6e 6f 64 65 73 2e 20 41 6c 6c  gment nodes. All
2060: 20 6e 6f 64 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a   nodes in all.**
2070: 20 73 65 67 6d 65 6e 74 73 20 66 6f 72 20 61 6c   segments for al
2080: 6c 20 69 6e 64 65 78 65 73 20 28 74 68 65 20 72  l indexes (the r
2090: 65 67 75 6c 61 72 20 46 54 53 20 69 6e 64 65 78  egular FTS index
20a0: 20 61 6e 64 20 61 6e 79 20 70 72 65 66 69 78 20   and any prefix 
20b0: 69 6e 64 65 78 65 73 29 0a 2a 2a 20 61 72 65 20  indexes).** are 
20c0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f  stored in the %_
20d0: 64 61 74 61 20 74 61 62 6c 65 20 77 69 74 68 20  data table with 
20e0: 6c 61 72 67 65 20 70 6f 73 69 74 69 76 65 20 72  large positive r
20f0: 6f 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  owids..**.** The
2100: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 6d 61   %_data table ma
2110: 79 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20  y contain up to 
2120: 28 31 3c 3c 46 54 53 35 5f 53 45 47 4d 45 4e 54  (1<<FTS5_SEGMENT
2130: 5f 49 4e 44 45 58 5f 42 49 54 53 29 20 0a 2a 2a  _INDEX_BITS) .**
2140: 20 69 6e 64 65 78 65 73 20 2d 20 6f 6e 65 20 72   indexes - one r
2150: 65 67 75 6c 61 72 20 74 65 72 6d 20 69 6e 64 65  egular term inde
2160: 78 20 61 6e 64 20 7a 65 72 6f 20 6f 72 20 6d 6f  x and zero or mo
2170: 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  re prefix indexe
2180: 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 73 65  s..**.** Each se
2190: 67 6d 65 6e 74 20 69 6e 20 61 6e 20 69 6e 64 65  gment in an inde
21a0: 78 20 68 61 73 20 61 20 75 6e 69 71 75 65 20 69  x has a unique i
21b0: 64 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  d greater than z
21c0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ero..**.** Each 
21d0: 6e 6f 64 65 20 69 6e 20 61 20 73 65 67 6d 65 6e  node in a segmen
21e0: 74 20 62 2d 74 72 65 65 20 69 73 20 61 73 73 69  t b-tree is assi
21f0: 67 6e 65 64 20 61 20 22 70 61 67 65 20 6e 75 6d  gned a "page num
2200: 62 65 72 22 20 74 68 61 74 20 69 73 20 75 6e 69  ber" that is uni
2210: 71 75 65 0a 2a 2a 20 77 69 74 68 69 6e 20 6e 6f  que.** within no
2220: 64 65 73 20 6f 66 20 69 74 73 20 68 65 69 67 68  des of its heigh
2230: 74 20 77 69 74 68 69 6e 20 74 68 65 20 73 65 67  t within the seg
2240: 6d 65 6e 74 20 28 6c 65 61 66 20 6e 6f 64 65 73  ment (leaf nodes
2250: 20 68 61 76 65 20 61 20 68 65 69 67 68 74 20 0a   have a height .
2260: 2a 2a 20 6f 66 20 30 2c 20 70 61 72 65 6e 74 73  ** of 0, parents
2270: 20 31 2c 20 65 74 63 2e 29 2e 20 50 61 67 65 20   1, etc.). Page 
2280: 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 6c 6f  numbers are allo
2290: 63 61 74 65 64 20 73 65 71 75 65 6e 74 69 61 6c  cated sequential
22a0: 6c 79 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 20  ly so that.** a 
22b0: 6e 6f 64 65 73 20 70 61 67 65 20 6e 75 6d 62 65  nodes page numbe
22c0: 72 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  r is always one 
22d0: 6d 6f 72 65 20 74 68 61 6e 20 69 74 73 20 6c 65  more than its le
22e0: 66 74 20 73 69 62 6c 69 6e 67 2e 0a 2a 2a 0a 2a  ft sibling..**.*
22f0: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
2300: 61 20 6e 6f 64 65 20 69 73 20 74 68 65 6e 20 66  a node is then f
2310: 6f 75 6e 64 20 75 73 69 6e 67 20 74 68 65 20 46  ound using the F
2320: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2330: 44 28 29 20 6d 61 63 72 6f 0a 2a 2a 20 62 65 6c  D() macro.** bel
2340: 6f 77 2e 20 54 68 65 20 46 54 53 35 5f 53 45 47  ow. The FTS5_SEG
2350: 4d 45 4e 54 5f 2a 5f 42 49 54 53 20 6d 61 63 72  MENT_*_BITS macr
2360: 6f 73 20 64 65 66 69 6e 65 20 74 68 65 20 6e 75  os define the nu
2370: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 75 73 65  mber of bits use
2380: 64 0a 2a 2a 20 74 6f 20 65 6e 63 6f 64 65 20 74  d.** to encode t
2390: 68 65 20 74 68 72 65 65 20 46 54 53 35 5f 53 45  he three FTS5_SE
23a0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 61 72  GMENT_ROWID() ar
23b0: 67 75 6d 65 6e 74 73 2e 20 54 68 69 73 20 6d 6f  guments. This mo
23c0: 64 75 6c 65 20 72 65 74 75 72 6e 73 0a 2a 2a 20  dule returns.** 
23d0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
23e0: 66 61 69 6c 73 20 74 68 65 20 63 75 72 72 65 6e  fails the curren
23f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 66 20 74  t operation if t
2400: 68 65 79 20 65 76 65 72 20 70 72 6f 76 65 20 74  hey ever prove t
2410: 6f 6f 20 73 6d 61 6c 6c 2e 0a 2a 2f 0a 23 64 65  oo small..*/.#de
2420: 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 49  fine FTS5_DATA_I
2430: 44 5f 42 20 20 20 20 20 31 36 20 20 20 20 20 2f  D_B     16     /
2440: 2a 20 4d 61 78 20 73 65 67 20 69 64 20 6e 75 6d  * Max seg id num
2450: 62 65 72 20 36 35 35 33 35 20 2a 2f 0a 23 64 65  ber 65535 */.#de
2460: 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 44  fine FTS5_DATA_D
2470: 4c 49 5f 42 20 20 20 20 20 31 20 20 20 20 20 2f  LI_B     1     /
2480: 2a 20 44 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * Doclist-index 
2490: 66 6c 61 67 20 28 31 20 62 69 74 29 20 2a 2f 0a  flag (1 bit) */.
24a0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
24b0: 41 5f 48 45 49 47 48 54 5f 42 20 20 35 20 20 20  A_HEIGHT_B  5   
24c0: 20 20 2f 2a 20 4d 61 78 20 62 2d 74 72 65 65 20    /* Max b-tree 
24d0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
24e0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
24f0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2500: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2510: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2520: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2530: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2540: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2550: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2580: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2590: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
25a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
25b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
25c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
25d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
25e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
25f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2600: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2610: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2620: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2630: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2640: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2670: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
26c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
26d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
26e0: 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 66   height, pgno) f
26f0: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30  ts5_dri(segid, 0
2700: 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 0a  , height, pgno).
2710: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 4c 49  #define FTS5_DLI
2720: 44 58 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20  DX_ROWID(segid, 
2730: 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 20 20  height, pgno)   
2740: 66 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20  fts5_dri(segid, 
2750: 31 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  1, height, pgno)
2760: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
2770: 73 65 67 6d 65 6e 74 73 20 70 65 72 6d 69 74 74  segments permitt
2780: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 69  ed in a single i
2790: 6e 64 65 78 20 0a 2a 2f 0a 23 64 65 66 69 6e 65  ndex .*/.#define
27a0: 20 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e   FTS5_MAX_SEGMEN
27b0: 54 20 32 30 30 30 0a 0a 23 69 66 64 65 66 20 53  T 2000..#ifdef S
27c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
27d0: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 72 72 75  sqlite3Fts5Corru
27e0: 70 74 28 29 20 7b 20 72 65 74 75 72 6e 20 53 51  pt() { return SQ
27f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
2800: 42 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  B; }.#endif.../*
2810: 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 61 20  .** Each time a 
2820: 62 6c 6f 62 20 69 73 20 72 65 61 64 20 66 72 6f  blob is read fro
2830: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
2840: 6c 65 2c 20 69 74 20 69 73 20 70 61 64 64 65 64  le, it is padded
2850: 20 77 69 74 68 20 74 68 69 73 0a 2a 2a 20 6d 61   with this.** ma
2860: 6e 79 20 7a 65 72 6f 20 62 79 74 65 73 2e 20 54  ny zero bytes. T
2870: 68 69 73 20 6d 61 6b 65 73 20 69 74 20 65 61 73  his makes it eas
2880: 69 65 72 20 74 6f 20 64 65 63 6f 64 65 20 74 68  ier to decode th
2890: 65 20 76 61 72 69 6f 75 73 20 72 65 63 6f 72 64  e various record
28a0: 20 66 6f 72 6d 61 74 73 0a 2a 2a 20 77 69 74 68   formats.** with
28b0: 6f 75 74 20 6f 76 65 72 72 65 61 64 69 6e 67 20  out overreading 
28c0: 69 66 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  if the records a
28d0: 72 65 20 63 6f 72 72 75 70 74 2e 0a 2a 2f 0a 23  re corrupt..*/.#
28e0: 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41  define FTS5_DATA
28f0: 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 38 0a  _ZERO_PADDING 8.
2900: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2910: 46 74 73 35 42 74 72 65 65 49 74 65 72 20 46 74  Fts5BtreeIter Ft
2920: 73 35 42 74 72 65 65 49 74 65 72 3b 0a 74 79 70  s5BtreeIter;.typ
2930: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2940: 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 46  BtreeIterLevel F
2950: 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
2960: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2970: 74 20 46 74 73 35 44 61 74 61 20 46 74 73 35 44  t Fts5Data Fts5D
2980: 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ata;.typedef str
2990: 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65  uct Fts5DlidxIte
29a0: 72 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 3b  r Fts5DlidxIter;
29b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
29c0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46 74 73  Fts5DlidxLvl Fts
29d0: 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70 65 64  5DlidxLvl;.typed
29e0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44 6c  ef struct Fts5Dl
29f0: 69 64 78 57 72 69 74 65 72 20 46 74 73 35 44 6c  idxWriter Fts5Dl
2a00: 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70 65 64  idxWriter;.typed
2a10: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 4d 75  ef struct Fts5Mu
2a20: 6c 74 69 53 65 67 49 74 65 72 20 46 74 73 35 4d  ltiSegIter Fts5M
2a30: 75 6c 74 69 53 65 67 49 74 65 72 3b 0a 74 79 70  ultiSegIter;.typ
2a40: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2a50: 4e 6f 64 65 49 74 65 72 20 46 74 73 35 4e 6f 64  NodeIter Fts5Nod
2a60: 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  eIter;.typedef s
2a70: 74 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72  truct Fts5PageWr
2a80: 69 74 65 72 20 46 74 73 35 50 61 67 65 57 72 69  iter Fts5PageWri
2a90: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2aa0: 75 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20  uct Fts5SegIter 
2ab0: 46 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79 70  Fts5SegIter;.typ
2ac0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2ad0: 44 6f 63 6c 69 73 74 49 74 65 72 20 46 74 73 35  DoclistIter Fts5
2ae0: 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74 79 70  DoclistIter;.typ
2af0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2b00: 53 65 67 57 72 69 74 65 72 20 46 74 73 35 53 65  SegWriter Fts5Se
2b10: 67 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66  gWriter;.typedef
2b20: 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75   struct Fts5Stru
2b30: 63 74 75 72 65 20 46 74 73 35 53 74 72 75 63 74  cture Fts5Struct
2b40: 75 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ure;.typedef str
2b50: 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72  uct Fts5Structur
2b60: 65 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75 63  eLevel Fts5Struc
2b70: 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64  tureLevel;.typed
2b80: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
2b90: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 46  ructureSegment F
2ba0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2bb0: 65 6e 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73  ent;..struct Fts
2bc0: 35 44 61 74 61 20 7b 0a 20 20 75 38 20 2a 70 3b  5Data {.  u8 *p;
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2bf0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
2c00: 6f 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72 64  ontaining record
2c10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2c40: 20 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73   record in bytes
2c50: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2c60: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2c70: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2c80: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2c90: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2ca0: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2cb0: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2cc0: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2cd0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
2ce0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
2cf0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2d00: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
2d10: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
2d20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d30: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2d40: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2d50: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2d60: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2d70: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2d80: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2d90: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2da0: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2db0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2dc0: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2dd0: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
2de0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
2df0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e10: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
2e20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
2e30: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e  */.  int nMaxPen
2e40: 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20  dingData;       
2e50: 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64       /* Max pend
2e60: 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20  ing data before 
2e70: 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f  flush to disk */
2e80: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
2e90: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2ea0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2eb0: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2ec0: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2ed0: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2ef0: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2f00: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2f10: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2f20: 73 63 72 61 74 63 68 3b 0a 0a 20 20 2f 2a 20 45  scratch;..  /* E
2f30: 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
2f40: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f   /* Current erro
2f70: 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  r code */..  /* 
2f80: 53 74 61 74 65 20 75 73 65 64 20 62 79 20 74 68  State used by th
2f90: 65 20 66 74 73 35 44 61 74 61 58 58 58 28 29 20  e fts5DataXXX() 
2fa0: 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  functions. */.  
2fb0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52  sqlite3_blob *pR
2fc0: 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20 20  eader;          
2fd0: 2f 2a 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20  /* RO incr-blob 
2fe0: 6f 70 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74  open on %_data t
2ff0: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
3000: 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b  3_stmt *pWriter;
3010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e            /* "IN
3020: 53 45 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20  SERT ... %_data 
3030: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a  VALUES(?,?)" */.
3040: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
3050: 70 44 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20  pDeleter;       
3060: 20 20 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f    /* "DELETE FRO
3070: 4d 20 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e  M %_data ... id>
3080: 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f  =? AND id<=?" */
3090: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
30c0: 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61  er of blocks rea
30d0: 64 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  d */.};..struct 
30e0: 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
30f0: 7b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74  {.  u8 *a;.  int
3100: 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   n;.  int i;..  
3110: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
3120: 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30  les. aPoslist==0
3130: 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34   at EOF */.  i64
3140: 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61   iRowid;.  u8 *a
3150: 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  Poslist;.  int n
3160: 50 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a  Poslist;.};../*.
3170: 2a 2a 20 45 61 63 68 20 69 74 65 72 61 74 6f 72  ** Each iterator
3180: 20 75 73 65 64 20 62 79 20 65 78 74 65 72 6e 61   used by externa
3190: 6c 20 6d 6f 64 75 6c 65 73 20 69 73 20 61 6e 20  l modules is an 
31a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
31b0: 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   type..*/.struct
31c0: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b   Fts5IndexIter {
31d0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
31e0: 6e 64 65 78 3b 0a 20 20 46 74 73 35 53 74 72 75  ndex;.  Fts5Stru
31f0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
3200: 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
3210: 65 72 20 2a 70 4d 75 6c 74 69 3b 0a 20 20 46 74  er *pMulti;.  Ft
3220: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
3230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3240: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3250: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
3260: 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  st */.};../*.** 
3270: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
3280: 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20  the "structure" 
3290: 72 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20  record for each 
32a0: 69 6e 64 65 78 20 61 72 65 20 72 65 70 72 65 73  index are repres
32b0: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61  ented.** using a
32c0: 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  n Fts5Structure 
32d0: 72 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79  record in memory
32e0: 2e 20 57 68 69 63 68 20 75 73 65 73 20 69 6e 73  . Which uses ins
32f0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a  tances of the .*
3300: 2a 20 6f 74 68 65 72 20 46 74 73 35 53 74 72 75  * other Fts5Stru
3310: 63 74 75 72 65 58 58 58 20 74 79 70 65 73 20 61  ctureXXX types a
3320: 73 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f  s components..*/
3330: 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75  .struct Fts5Stru
3340: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20  ctureSegment {. 
3350: 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20   int iSegid;    
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3370: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a   /* Segment id *
3380: 2f 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b  /.  int nHeight;
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66      /* Height of
33b0: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
33c0: 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72  */.  int pgnoFir
33d0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
33e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65       /* First le
33f0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
3400: 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  n segment */.  i
3410: 6e 74 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20  nt pgnoLast;    
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3430: 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
3440: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
3450: 6e 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  nt */.};.struct 
3460: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
3470: 65 6c 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67  el {.  int nMerg
3480: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3490: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34a0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
34b0: 69 6e 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20  incr-merge */.  
34c0: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
34f0: 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  of segments on l
3500: 65 76 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74  evel */.  Fts5St
3510: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
3520: 61 53 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72  aSeg;     /* Arr
3530: 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20  ay of segments. 
3540: 61 53 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73  aSeg[0] is oldes
3550: 74 2e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  t. */.};.struct 
3560: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a  Fts5Structure {.
3570: 20 20 75 36 34 20 6e 57 72 69 74 65 43 6f 75 6e    u64 nWriteCoun
3580: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
3590: 20 20 2f 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65    /* Total leave
35a0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76  s written to lev
35b0: 65 6c 20 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  el 0 */.  int nS
35c0: 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20  egment;         
35d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
35e0: 61 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  al segments in t
35f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
3600: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20  .  int nLevel;  
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3630: 6c 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69  levels in this i
3640: 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74  ndex */.  Fts5St
3650: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65  ructureLevel aLe
3660: 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20 41 72 72  vel[0];   /* Arr
3670: 61 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76  ay of nLevel lev
3680: 65 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b  el objects */.};
3690: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63  ../*.** An objec
36a0: 74 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65  t of type Fts5Se
36b0: 67 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20  gWriter is used 
36c0: 74 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d  to write to segm
36d0: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ents..*/.struct 
36e0: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b  Fts5PageWriter {
36f0: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
3720: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3730: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3740: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
3750: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
3760: 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64  ontaining page d
3770: 61 74 61 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ata */.  Fts5Buf
3780: 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
3790: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
37a0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72  er containing pr
37b0: 65 76 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70  evious term on p
37c0: 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74  age */.};.struct
37d0: 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
37e0: 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20   {.  int pgno;  
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
3810: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
3820: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 76  e */.  int bPrev
3830: 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20  Valid;          
3840: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3850: 66 20 69 50 72 65 76 20 69 73 20 76 61 6c 69 64  f iPrev is valid
3860: 20 2a 2f 0a 20 20 69 36 34 20 69 50 72 65 76 3b   */.  i64 iPrev;
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
3890: 73 20 64 6f 63 69 64 20 76 61 6c 75 65 20 77 72  s docid value wr
38a0: 69 74 74 65 6e 20 74 6f 20 70 61 67 65 20 2a 2f  itten to page */
38b0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
38c0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
38d0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
38e0: 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74  taining page dat
38f0: 61 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  a */.};.struct F
3900: 74 73 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20  ts5SegWriter {. 
3910: 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20   int iSegid;    
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 2f 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69   /* Segid to wri
3940: 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  te to */.  int n
3950: 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  Writer;         
3960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3970: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
3980: 69 6e 20 61 57 72 69 74 65 72 20 2a 2f 0a 20 20  in aWriter */.  
3990: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
39a0: 61 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20  aWriter;        
39b0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 50 61 67 65  /* Array of Page
39c0: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a  Writer objects *
39d0: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77  /.  i64 iPrevRow
39e0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
39f0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
3a00: 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
3a10: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
3a20: 0a 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69  .  u8 bFirstRowi
3a30: 64 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  dInDoclist;     
3a40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
3a50: 78 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73  xt rowid is firs
3a60: 74 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  t in doclist */.
3a70: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
3a80: 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  InPage;         
3a90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
3aa0: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
3ab0: 20 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   in page */.  u8
3ac0: 20 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67   bFirstTermInPag
3ad0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3ae0: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 74 65   True if next te
3af0: 72 6d 20 77 69 6c 6c 20 62 65 20 66 69 72 73 74  rm will be first
3b00: 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e   in leaf */.  in
3b10: 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 20  t nLeafWritten; 
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b30: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
3b40: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f  pages written */
3b50: 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20  .  int nEmpty;  
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3b80: 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72 6d 2d  contiguous term-
3b90: 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 0a 20  less nodes */.. 
3ba0: 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20 20 20 20   int nDlidx;    
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
3bd0: 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b 5d 20 61  ze of aDlidx[] a
3be0: 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 44 6c  rray */.  Fts5Dl
3bf0: 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64  idxWriter *aDlid
3c00: 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  x;        /* Arr
3c10: 61 79 20 6f 66 20 46 74 73 35 44 6c 69 64 78 57  ay of Fts5DlidxW
3c20: 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f  riter objects */
3c30: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
3c40: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
3c50: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67  through the merg
3c60: 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e  ed results of on
3c70: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
3c80: 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20  ts,.** visiting 
3c90: 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 20  each term/docid 
3ca0: 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67  pair in the merg
3cb0: 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e  ed data..**.** n
3cc0: 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20  Seg is always a 
3cd0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65  power of two gre
3ce0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
3cf0: 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  al to the number
3d00: 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20   of.** segments 
3d10: 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74  that this object
3d20: 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61   is merging data
3d30: 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20   from. Both the 
3d40: 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46  aSeg[] and.** aF
3d50: 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72  irst[] arrays ar
3d60: 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20  e sized at nSeg 
3d70: 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65  entries. The aSe
3d80: 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64  g[] array is pad
3d90: 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f  ded.** with zero
3da0: 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65  ed objects - the
3db0: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61  se are handled a
3dc0: 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69  s if they were i
3dd0: 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a  terators opened.
3de0: 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d  ** on empty segm
3df0: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
3e00: 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
3e10: 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53  ring segments aS
3e20: 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e  eg[N] and aSeg[N
3e30: 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20  +1], where N is 
3e40: 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65  an.** even numbe
3e50: 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  r, is stored in 
3e60: 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f  aFirst[(nSeg+N)/
3e70: 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22  2]. The "result"
3e80: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70   of the .** comp
3e90: 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63  arison in this c
3ea0: 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e  ontext is the in
3eb0: 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61  dex of the itera
3ec0: 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74  tor that current
3ed0: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
3ee0: 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d  the smaller term
3ef0: 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
3f00: 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74  on. Iterators at
3f10: 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73   EOF are.** cons
3f20: 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65  idered to be gre
3f30: 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74  ater than all ot
3f40: 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  her iterators..*
3f50: 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63  *.** aFirst[1] c
3f60: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
3f70: 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74  x in aSeg[] of t
3f80: 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  he iterator that
3f90: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
3fa0: 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f  e smallest key o
3fb0: 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30  verall. aFirst[0
3fc0: 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f  ] is unused. .*/
3fd0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
3fe0: 20 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73   Fts5CResult Fts
3ff0: 35 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74  5CResult;.struct
4000: 20 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20   Fts5CResult {. 
4010: 20 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20   u16 iFirst;    
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 20 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78   /* aSeg[] index
4040: 20 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65   of firstest ite
4050: 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54  rator */.  u8 bT
4060: 65 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20  ermEq;          
4070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4080: 75 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20  ue if the terms 
4090: 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a  are equal */.};.
40a0: 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f  ./*.** Object fo
40b0: 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
40c0: 75 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67  ugh a single seg
40d0: 6d 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65  ment, visiting e
40e0: 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a  ach term/docid.*
40f0: 2a 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65  * pair in the se
4100: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65  gment..**.** pSe
4110: 67 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d  g:.**   The segm
4120: 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ent to iterate t
4130: 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c  hrough..**.** iL
4140: 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75  eafPgno:.**   Cu
4150: 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20  rrent leaf page 
4160: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65  number within se
4170: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  gment..**.** iLe
4180: 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42  afOffset:.**   B
4190: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
41a0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
41b0: 61 66 20 74 68 61 74 20 69 73 20 74 68 65 20 66  af that is the f
41c0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
41d0: 20 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20   .**   position 
41e0: 6c 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62  list data (one b
41f0: 79 74 65 20 70 61 73 73 65 64 20 74 68 65 20 70  yte passed the p
4200: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
4210: 65 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72  e field)..**   r
4220: 6f 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68  owid field of th
4230: 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
4240: 20 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73   Usually this is
4250: 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20   the size field 
4260: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69  of the.**   posi
4270: 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20  tion list data. 
4280: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
4290: 20 69 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f   if the rowid fo
42a0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
42b0: 74 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65  try .**   is the
42c0: 20 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74   last thing on t
42d0: 68 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a  he leaf page..**
42e0: 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20  .** pLeaf:.**   
42f0: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
4300: 67 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  g current leaf p
4310: 61 67 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f  age data. Set to
4320: 20 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a   NULL at EOF..**
4330: 0a 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e  .** iTermLeafPgn
4340: 6f 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  o, iTermLeafOffs
4350: 65 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61  et:.**   Leaf pa
4360: 67 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69  ge number contai
4370: 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65  ning the last te
4380: 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rm read from the
4390: 20 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a   segment. And.**
43a0: 20 20 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d     the offset im
43b0: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
43c0: 69 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61 74  ing the term dat
43d0: 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a  a..**.** flags:.
43e0: 2a 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53  **   Mask of FTS
43f0: 35 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76 61  5_SEGITER_XXX va
4400: 6c 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65  lues. Interprete
4410: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
4420: 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54  .**   FTS5_SEGIT
4430: 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20  ER_ONETERM:.**  
4440: 20 20 20 49 66 20 73 65 74 2c 20 73 65 74 20 74     If set, set t
4450: 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70  he iterator to p
4460: 6f 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65  oint to EOF afte
4470: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  r the current do
4480: 63 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61  clist .**     ha
4490: 73 20 62 65 65 6e 20 65 78 68 61 75 73 74 65 64  s been exhausted
44a0: 2e 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  . Do not proceed
44b0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72   to the next ter
44c0: 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
44d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53  ..**.**   FTS5_S
44e0: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a  EGITER_REVERSE:.
44f0: 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67  **     This flag
4500: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65   is only ever se
4510: 74 20 69 66 20 46 54 53 35 5f 53 45 47 49 54 45  t if FTS5_SEGITE
4520: 52 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73  R_ONETERM is als
4530: 6f 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20  o set. If.**    
4540: 20 69 74 20 69 73 20 73 65 74 2c 20 69 74 65 72   it is set, iter
4550: 61 74 65 20 74 68 72 6f 75 67 68 20 64 6f 63 69  ate through doci
4560: 64 73 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67  ds in descending
4570: 20 6f 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f   order instead o
4580: 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66  f the.**     def
4590: 61 75 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f  ault ascending o
45a0: 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77  rder..**.** iRow
45b0: 69 64 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f  idOffset/nRowidO
45c0: 66 66 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73  ffset/aRowidOffs
45d0: 65 74 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65  et:.**     These
45e0: 20 61 72 65 20 75 73 65 64 20 69 66 20 74 68 65   are used if the
45f0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
4600: 56 45 52 53 45 20 66 6c 61 67 20 69 73 20 73 65  VERSE flag is se
4610: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72  t..**.**     For
4620: 20 65 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74   each rowid on t
4630: 68 65 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f  he page correspo
4640: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
4650: 72 65 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a  rent term, the.*
4660: 2a 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64  *     correspond
4670: 69 6e 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74  ing aRowidOffset
4680: 5b 5d 20 65 6e 74 72 79 20 69 73 20 73 65 74 20  [] entry is set 
4690: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
46a0: 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  et of the.**    
46b0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 22 70   start of the "p
46c0: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a  osition-list-siz
46d0: 65 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20  e" field within 
46e0: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 72  the page..*/.str
46f0: 75 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20  uct Fts5SegIter 
4700: 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
4710: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
4720: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
4730: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
4740: 68 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  h */.  int flags
4750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4760: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4770: 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  f configuration 
4780: 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69  flags */.  int i
4790: 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20  LeafPgno;       
47a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
47b0: 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20  rrent leaf page 
47c0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 46 74 73 35  number */.  Fts5
47d0: 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20  Data *pLeaf;    
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
47f0: 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61  urrent leaf data
4800: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
4810: 70 4e 65 78 74 4c 65 61 66 3b 20 20 20 20 20 20  pNextLeaf;      
4820: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61        /* Leaf pa
4830: 67 65 20 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29  ge (iLeafPgno+1)
4840: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f   */.  int iLeafO
4850: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
4860: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
4870: 66 73 65 74 20 77 69 74 68 69 6e 20 63 75 72 72  fset within curr
4880: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f  ent leaf */..  /
4890: 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64 20 6f  * The page and o
48a0: 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69 63 68  ffset from which
48b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
48c0: 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68 65 20  m was read. The 
48d0: 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69 73 20  offset .  ** is 
48e0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
48f0: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  e first rowid in
4900: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
4910: 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  list.  */.  int 
4920: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20  iTermLeafPgno;. 
4930: 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66 4f 66   int iTermLeafOf
4940: 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  fset;..  /* The 
4950: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e  following are on
4960: 6c 79 20 75 73 65 64 20 69 66 20 74 68 65 20 46  ly used if the F
4970: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4980: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
4990: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
49a0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
49b0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
49c0: 20 65 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64   entry in aRowid
49d0: 4f 66 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e  Offset[] */.  in
49e0: 74 20 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t nRowidOffset; 
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4a00: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
4a10: 6f 66 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  of aRowidOffset[
4a20: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4a30: 20 2a 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20   *aRowidOffset; 
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4a50: 41 72 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20  Array of offset 
4a60: 74 6f 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20  to rowid fields 
4a70: 2a 2f 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49  */..  Fts5DlidxI
4a80: 74 65 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20  ter *pDlidx;    
4a90: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
4aa0: 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
4ab0: 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61  ndex */..  /* Va
4ac0: 72 69 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65  riables populate
4ad0: 64 20 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65  d based on curre
4ae0: 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46  nt entry. */.  F
4af0: 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b10: 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  * Current term *
4b20: 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  /.  i64 iRowid; 
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
4b50: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  owid */.  int nP
4b60: 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
4b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4b80: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4b90: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
4ba0: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62   list */.  int b
4bb0: 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Del;            
4bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4bd0: 75 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65  ue if the delete
4be0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a   flag is set */.
4bf0: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  };..#define FTS5
4c00: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
4c10: 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54   0x01.#define FT
4c20: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4c30: 53 45 20 30 78 30 32 0a 0a 0a 73 74 72 75 63 74  SE 0x02...struct
4c40: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
4c50: 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20  r {.  int nSeg; 
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
4c80: 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f   aSeg[] array */
4c90: 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74     /* True to it
4cc0: 65 72 61 74 65 20 69 6e 20 72 65 76 65 72 73 65  erate in reverse
4cd0: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20   order */.  int 
4ce0: 62 53 6b 69 70 45 6d 70 74 79 3b 20 20 20 20 20  bSkipEmpty;     
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4d00: 72 75 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65  rue to skip dele
4d10: 74 65 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20  ted entries */. 
4d20: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 2f 2a 20 54 72 75 65 20 61 74 20 45 4f 46 20   /* True at EOF 
4d50: 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74  */.  Fts5CResult
4d60: 20 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20   *aFirst;       
4d70: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4d80: 6d 65 72 67 65 20 73 74 61 74 65 20 28 73 65 65  merge state (see
4d90: 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 46 74 73   above) */.  Fts
4da0: 35 53 65 67 49 74 65 72 20 61 53 65 67 5b 31 5d  5SegIter aSeg[1]
4db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4dc0: 41 72 72 61 79 20 6f 66 20 73 65 67 6d 65 6e 74  Array of segment
4dd0: 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 7d 3b   iterators */.};
4de0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  .../*.** Object 
4df0: 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  for iterating th
4e00: 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e 74  rough the conent
4e10: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69 6e  s of a single in
4e20: 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 0a  ternal node in .
4e30: 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
4e40: 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65  ruct Fts5NodeIte
4e50: 72 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e 61  r {.  /* Interna
4e60: 6c 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61 67  l. Set and manag
4e70: 65 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49 74  ed by fts5NodeIt
4e80: 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  erXXX() function
4e90: 73 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a 2a  s. Except, .  **
4ea0: 20 74 68 65 20 45 4f 46 20 74 65 73 74 20 66 6f   the EOF test fo
4eb0: 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  r the iterator i
4ec0: 73 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72 2e  s (Fts5NodeIter.
4ed0: 61 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a 20  aData==0).  */. 
4ee0: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
4ef0: 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20  ;.  int nData;. 
4f00: 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f 2a   int iOff;..  /*
4f10: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
4f20: 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
4f30: 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 45  r term;.  int nE
4f40: 6d 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68 69  mpty;.  int iChi
4f50: 6c 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78  ld;.  int bDlidx
4f60: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ;.};../*.** An i
4f70: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
4f80: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
4f90: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
4fa0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
4fb0: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
4fc0: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
4fd0: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
4fe0: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
4ff0: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5000: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
5010: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
5020: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
5030: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
5040: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
5050: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
5060: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5070: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5080: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5090: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
50a0: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
50b0: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
50c0: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
50d0: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
50e0: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
50f0: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5110: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
5120: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
5130: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5150: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
5160: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5170: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5180: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5190: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
51a0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
51b0: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
51c0: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51e0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
51f0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5200: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
5210: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5220: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
5230: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
5240: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
5250: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
5260: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5270: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5280: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5290: 5b 31 5d 3b 0a 7d 3b 0a 0a 0a 0a 2f 2a 0a 2a 2a  [1];.};..../*.**
52a0: 20 41 6e 20 46 74 73 35 42 74 72 65 65 49 74 65   An Fts5BtreeIte
52b0: 72 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64  r object is used
52c0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
52d0: 75 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  ugh all entries 
52e0: 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65  in the.** b-tree
52f0: 20 68 69 65 72 61 72 63 68 79 20 62 65 6c 6f 6e   hierarchy belon
5300: 67 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65  ging to a single
5310: 20 66 74 73 35 20 73 65 67 6d 65 6e 74 2e 20 49   fts5 segment. I
5320: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 0a  n this case the.
5330: 2a 2a 20 22 62 2d 74 72 65 65 20 68 69 65 72 61  ** "b-tree hiera
5340: 72 63 68 79 22 20 69 73 20 61 6c 6c 20 62 2d 74  rchy" is all b-t
5350: 72 65 65 20 6e 6f 64 65 73 20 65 78 63 65 70 74  ree nodes except
5360: 20 6c 65 61 76 65 73 2e 20 45 61 63 68 20 65 6e   leaves. Each en
5370: 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d  try in the.** b-
5380: 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20 63  tree hierarchy c
5390: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 66  onsists of the f
53a0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
53b0: 20 20 69 4c 65 61 66 3a 20 20 54 68 65 20 70 61    iLeaf:  The pa
53c0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
53d0: 20 6c 65 61 66 20 70 61 67 65 20 74 68 65 20 65   leaf page the e
53e0: 6e 74 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntry points to..
53f0: 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20 20  **.**   term:   
5400: 41 20 73 70 6c 69 74 2d 6b 65 79 20 74 68 61 74  A split-key that
5410: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c 65   all terms on le
5420: 61 66 20 70 61 67 65 20 24 69 4c 65 61 66 20 6d  af page $iLeaf m
5430: 75 73 74 20 62 65 20 67 72 65 61 74 65 72 0a 2a  ust be greater.*
5440: 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 61 6e  *           than
5450: 20 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20 54 68   or equal to. Th
5460: 65 20 22 74 65 72 6d 22 20 61 73 73 6f 63 69 61  e "term" associa
5470: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
5480: 73 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20  st b-tree.**    
5490: 20 20 20 20 20 20 20 68 69 65 72 61 72 63 68 79         hierarchy
54a0: 20 65 6e 74 72 79 20 28 74 68 65 20 6f 6e 65 20   entry (the one 
54b0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c  that points to l
54c0: 65 61 66 20 70 61 67 65 20 31 29 20 69 73 20 61  eaf page 1) is a
54d0: 6c 77 61 79 73 20 0a 2a 2a 20 20 20 20 20 20 20  lways .**       
54e0: 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72      an empty str
54f0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d  ing..**.**   nEm
5500: 70 74 79 3a 20 54 68 65 20 6e 75 6d 62 65 72 20  pty: The number 
5510: 6f 66 20 65 6d 70 74 79 20 28 74 65 72 6d 6c 65  of empty (termle
5520: 73 73 29 20 6c 65 61 66 20 70 61 67 65 73 20 74  ss) leaf pages t
5530: 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  hat immediately.
5540: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c  **           fol
5550: 6c 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a  lowing iLeaf..**
5560: 0a 2a 2a 20 54 68 65 20 46 74 73 35 42 74 72 65  .** The Fts5Btre
5570: 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20  eIter object is 
5580: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
5590: 74 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69  t of the integri
55a0: 74 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a  ty-check code..*
55b0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 42 74 72  /.struct Fts5Btr
55c0: 65 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20  eeIterLevel {.  
55d0: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 3b 20  Fts5NodeIter s; 
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
5600: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
5610: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
5620: 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
5630: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
5640: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  r the current no
5650: 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  de */.};.struct 
5660: 46 74 73 35 42 74 72 65 65 49 74 65 72 20 7b 0a  Fts5BtreeIter {.
5670: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20    Fts5Index *p; 
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
56a0: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
56b0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
56c0: 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a  nt *pSeg;     /*
56d0: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
56e0: 20 74 68 69 73 20 73 65 67 6d 65 6e 74 27 73 20   this segment's 
56f0: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
5700: 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nLvl;           
5710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5720: 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20 61 72  ize of aLvl[] ar
5730: 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 42 74 72  ray */.  Fts5Btr
5740: 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 61 4c 76  eeIterLevel *aLv
5750: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65  l;       /* Leve
5760: 6c 20 66 6f 72 20 65 61 63 68 20 74 69 65 72 20  l for each tier 
5770: 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  of b-tree */..  
5780: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
5790: 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  les */.  Fts5Buf
57a0: 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
57b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
57c0: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ent term */.  in
57d0: 74 20 69 4c 65 61 66 3b 20 20 20 20 20 20 20 20  t iLeaf;        
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
57f0: 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69 6e 67   Leaf containing
5800: 20 74 65 72 6d 73 20 3e 3d 20 63 75 72 72 65 6e   terms >= curren
5810: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  t term */.  int 
5820: 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20  nEmpty;         
5830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5840: 75 6d 62 65 72 20 6f 66 20 22 65 6d 70 74 79 22  umber of "empty"
5850: 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e   leaves followin
5860: 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69 6e 74  g iLeaf */.  int
5870: 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20   bEof;          
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5890: 53 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 45  Set to true at E
58a0: 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6c 69  OF */.  int bDli
58b0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
58c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
58d0: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
58e0: 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a 0a 0a  a dlidx */.};...
58f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
5900: 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74 2c  PutU16(u8 *aOut,
5910: 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f   u16 iVal){.  aO
5920: 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38  ut[0] = (iVal>>8
5930: 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28  );.  aOut[1] = (
5940: 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73  iVal&0xFF);.}..s
5950: 74 61 74 69 63 20 75 31 36 20 66 74 73 35 47 65  tatic u16 fts5Ge
5960: 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61  tU16(const u8 *a
5970: 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  In){.  return ((
5980: 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29  u16)aIn[0] << 8)
5990: 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f   + aIn[1];.} ../
59a0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
59b0: 64 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65  d return a buffe
59c0: 72 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65  r at least nByte
59d0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
59e0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
59f0: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
5a00: 65 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ered, return NUL
5a10: 4c 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72  L and set the er
5a20: 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74  ror code in.** t
5a30: 68 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  he Fts5Index han
5a40: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
5a50: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5a70: 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28   *fts5IdxMalloc(
5a80: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
5a90: 74 20 6e 42 79 74 65 29 7b 0a 20 20 72 65 74 75  t nByte){.  retu
5aa0: 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61  rn sqlite3Fts5Ma
5ab0: 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
5ac0: 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   nByte);.}../*.*
5ad0: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  * Compare the co
5ae0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c  ntents of the pL
5af0: 65 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20  eft buffer with 
5b00: 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68  the pRight/nRigh
5b10: 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65  t blob..**.** Re
5b20: 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66  turn -ve if pLef
5b30: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
5b40: 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74  n pRight, 0 if t
5b50: 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72  hey are equal or
5b60: 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68  .** +ve if pRigh
5b70: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
5b80: 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65  n pLeft. In othe
5b90: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  r words:.**.**  
5ba0: 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20     res = *pLeft 
5bb0: 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61  - *pRight.*/.sta
5bc0: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
5bd0: 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20  erCompareBlob(. 
5be0: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65   Fts5Buffer *pLe
5bf0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
5c00: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69   /* Left hand si
5c10: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
5c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
5c30: 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67  pRight, int nRig
5c40: 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68  ht    /* Right h
5c50: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
5c60: 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  arison */.){.  i
5c70: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
5c80: 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b  eft->n, nRight);
5c90: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
5ca0: 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52  cmp(pLeft->p, pR
5cb0: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
5cc0: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
5cd0: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67  (pLeft->n - nRig
5ce0: 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a  ht) : res);.}...
5cf0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
5d00: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
5d10: 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73  e two buffers us
5d20: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
5d30: 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   one buffer.** i
5d40: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
5d50: 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63  e other, it is c
5d60: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65  onsidered the le
5d70: 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sser..**.** Retu
5d80: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
5d90: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
5da0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
5db0: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
5dc0: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
5dd0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
5de0: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
5df0: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
5e00: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
5e10: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
5e20: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
5e30: 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66  Compare(Fts5Buff
5e40: 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42  er *pLeft, Fts5B
5e50: 75 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a  uffer *pRight){.
5e60: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
5e70: 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68  (pLeft->n, pRigh
5e80: 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73  t->n);.  int res
5e90: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d   = memcmp(pLeft-
5ea0: 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e  >p, pRight->p, n
5eb0: 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmp);.  return (
5ec0: 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d  res==0 ? (pLeft-
5ed0: 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20  >n - pRight->n) 
5ee0: 3a 20 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65  : res);.}..#ifde
5ef0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
5f00: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c  tatic int fts5Bl
5f10: 6f 62 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e  obCompare(.  con
5f20: 73 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e  st u8 *pLeft, in
5f30: 74 20 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73  t nLeft, .  cons
5f40: 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e  t u8 *pRight, in
5f50: 74 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e  t nRight.){.  in
5f60: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65  t nCmp = MIN(nLe
5f70: 66 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69  ft, nRight);.  i
5f80: 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
5f90: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e  pLeft, pRight, n
5fa0: 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmp);.  return (
5fb0: 72 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20  res==0 ? (nLeft 
5fc0: 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29  - nRight) : res)
5fd0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
5fe0: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61  ** Close the rea
5ff0: 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64  d-only blob hand
6000: 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65  le, if it is ope
6010: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
6020: 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65  d fts5CloseReade
6030: 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  r(Fts5Index *p){
6040: 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65  .  if( p->pReade
6050: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
6060: 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d  _blob *pReader =
6070: 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20   p->pReader;.   
6080: 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b   p->pReader = 0;
6090: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
60a0: 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29  b_close(pReader)
60b0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
60c0: 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61  Fts5Data *fts5Da
60d0: 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 0a  taReadOrBuffer(.
60e0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
60f0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
6100: 42 75 66 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  Buf, .  i64 iRow
6110: 69 64 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61  id.){.  Fts5Data
6120: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
6130: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6140: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
6150: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
6160: 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65     if( p->pReade
6170: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  r ){.      /* Th
6180: 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75  is call may retu
6190: 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  rn SQLITE_ABORT 
61a0: 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
61b0: 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20  n a savepoint.  
61c0: 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
61d0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
61e0: 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20  t used. In this 
61f0: 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20  case a new blob 
6200: 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20  handle.      ** 
6210: 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
6220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
6230: 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e  lob *pBlob = p->
6240: 70 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70  pReader;.      p
6250: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
6260: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6270: 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42  3_blob_reopen(pB
6280: 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  lob, iRowid);.  
6290: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
62a0: 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
62b0: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
62c0: 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28  pBlob;.      if(
62d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
62e0: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c  {.        fts5Cl
62f0: 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
6300: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6310: 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  rc==SQLITE_ABORT
6320: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
6330: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
6340: 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e   If the blob han
6350: 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  dle is not yet o
6360: 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65  pen, open and se
6370: 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  ek it. Otherwise
6380: 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  , use.    ** the
6390: 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41   blob_reopen() A
63a0: 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65  PI to reseek the
63b0: 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68   existing blob h
63c0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  andle.  */.    i
63d0: 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  f( p->pReader==0
63e0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
63f0: 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  K ){.      Fts5C
6400: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
6410: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
6420: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6430: 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
6440: 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20  g->db, .        
6450: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6460: 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c  p->zDataTbl, "bl
6470: 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c  ock", iRowid, 0,
6480: 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20   &p->pReader.   
6490: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
64a0: 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66   /* If either of
64b0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
64c0: 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  b_open() or sqli
64d0: 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28  te3_blob_reopen(
64e0: 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61  ) calls.    ** a
64f0: 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53 51  bove returned SQ
6500: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74 75  LITE_ERROR, retu
6510: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6520: 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e 0a  T_VTAB instead..
6530: 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72      ** All the r
6540: 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e  easons those fun
6550: 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65 74  ctions might ret
6560: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
6570: 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a   - missing.    *
6580: 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67  * table, missing
6590: 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74   row, non-blob/t
65a0: 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c  ext in block col
65b0: 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20 0a  umn - indicate .
65c0: 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73      ** backing s
65d0: 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  tore corruption.
65e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
65f0: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20  =SQLITE_ERROR ) 
6600: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
6610: 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  T;..    if( rc==
6620: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6630: 20 20 20 75 38 20 2a 61 4f 75 74 3b 20 20 20 20     u8 *aOut;    
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6650: 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74 61  * Read blob data
6660: 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
6670: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
6680: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
6690: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65  lob_bytes(p->pRe
66a0: 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ader);.      if(
66b0: 20 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20   pBuf ){.       
66c0: 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
66d0: 70 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  pBuf);.        f
66e0: 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 72  ts5BufferGrow(&r
66f0: 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  c, pBuf, nByte);
6700: 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20  .        aOut = 
6710: 70 42 75 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20  pBuf->p;.       
6720: 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79 74 65   pBuf->n = nByte
6730: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6740: 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63         int nSpac
6750: 65 20 3d 20 6e 42 79 74 65 20 2b 20 46 54 53 35  e = nByte + FTS5
6760: 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
6770: 4e 47 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  NG;.        pRet
6780: 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71   = (Fts5Data*)sq
6790: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
67a0: 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 2b  ero(&rc, nSpace+
67b0: 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
67c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
67d0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Ret ){.         
67e0: 20 70 52 65 74 2d 3e 6e 20 3d 20 6e 42 79 74 65   pRet->n = nByte
67f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4f 75 74  ;.          aOut
6800: 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38   = pRet->p = (u8
6810: 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20  *)&pRet[1];.    
6820: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6830: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6840: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
6860: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61  lob_read(p->pRea
6870: 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65  der, aOut, nByte
6880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6890: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
68a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
68b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
68c0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  et);.        pRe
68d0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
68e0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d     }.    p->rc =
68f0: 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61   rc;.    p->nRea
6900: 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  d++;.  }..  retu
6910: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
6920: 2a 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63  * Retrieve a rec
6930: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ord from the %_d
6940: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ata table..**.**
6950: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6960: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
6970: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
6980: 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a  or left in the .
6990: 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  ** Fts5Index obj
69a0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ect..*/.static F
69b0: 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74  ts5Data *fts5Dat
69c0: 61 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  aRead(Fts5Index 
69d0: 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  *p, i64 iRowid){
69e0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65  .  Fts5Data *pRe
69f0: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
6a00: 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20 69  OrBuffer(p, 0, i
6a10: 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72 74  Rowid);.  assert
6a20: 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d  ( (pRet==0)==(p-
6a30: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  >rc!=SQLITE_OK) 
6a40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
6a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6a60: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
6a70: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
6a80: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73  nto the buffer s
6a90: 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a  upplied as the.*
6aa0: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
6ab0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
6ac0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
6ad0: 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69 6e  error is left in
6ae0: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
6af0: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
6b00: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
6b10: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
6b20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
6b30: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
6b40: 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73   .** no-op..*/.s
6b50: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
6b60: 61 74 61 42 75 66 66 65 72 28 46 74 73 35 49 6e  ataBuffer(Fts5In
6b70: 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66 66  dex *p, Fts5Buff
6b80: 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 52  er *pBuf, i64 iR
6b90: 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 66  owid){.  (void)f
6ba0: 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66  ts5DataReadOrBuf
6bb0: 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52 6f  fer(p, pBuf, iRo
6bc0: 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  wid);.}../*.** R
6bd0: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
6be0: 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72  ce to data recor
6bf0: 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  d returned by an
6c00: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
6c10: 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64  .** fts5DataRead
6c20: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
6c30: 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  id fts5DataRelea
6c40: 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61  se(Fts5Data *pDa
6c50: 74 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ta){.  sqlite3_f
6c60: 72 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  ree(pData);.}../
6c70: 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52  *.** INSERT OR R
6c80: 45 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20  EPLACE a record 
6c90: 69 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20  into the %_data 
6ca0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
6cb0: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 57 72   void fts5DataWr
6cc0: 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ite(Fts5Index *p
6cd0: 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f  , i64 iRowid, co
6ce0: 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
6cf0: 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28  nt nData){.  if(
6d00: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
6d10: 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  K ) return;..  i
6d20: 66 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30  f( p->pWriter==0
6d30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
6d40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6d50: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
6d60: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
6d70: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  ;.    char *zSql
6d80: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70   = sqlite3Fts5Mp
6d90: 72 69 6e 74 66 28 26 72 63 2c 0a 20 20 20 20 20  rintf(&rc,.     
6da0: 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
6db0: 20 27 25 71 27 2e 25 51 28 69 64 2c 20 62 6c 6f   '%q'.%Q(id, blo
6dc0: 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22  ck) VALUES(?,?)"
6dd0: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20  , pConfig->zDb, 
6de0: 70 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20  p->zDataTbl.    
6df0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20  );.    if( zSql 
6e00: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
6e10: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
6e20: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53  (pConfig->db, zS
6e30: 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 57 72 69  ql, -1, &p->pWri
6e40: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
6e50: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
6e60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6e70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6e80: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6e90: 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
6ea0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
6eb0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
6ec0: 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c  4(p->pWriter, 1,
6ed0: 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69   iRowid);.  sqli
6ee0: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d  te3_bind_blob(p-
6ef0: 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61  >pWriter, 2, pDa
6f00: 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54  ta, nData, SQLIT
6f10: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
6f20: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72  ite3_step(p->pWr
6f30: 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  iter);.  p->rc =
6f40: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
6f50: 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f  ->pWriter);.}../
6f60: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65  *.** Execute the
6f70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a   following SQL:.
6f80: 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  **.**     DELETE
6f90: 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45   FROM %_data WHE
6fa0: 52 45 20 69 64 20 42 45 54 57 45 45 4e 20 24 69  RE id BETWEEN $i
6fb0: 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74  First AND $iLast
6fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6fd0: 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 46  fts5DataDelete(F
6fe0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
6ff0: 20 69 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61   iFirst, i64 iLa
7000: 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  st){.  if( p->rc
7010: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
7020: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
7030: 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  pDeleter==0 ){. 
7040: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46     int rc;.    F
7050: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
7060: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
7070: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
7080: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
7090: 66 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  f(.        "DELE
70a0: 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 25 51 20  TE FROM '%q'.%Q 
70b0: 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20  WHERE id>=? AND 
70c0: 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66 69 67 2d  id<=?", pConfig-
70d0: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
70e0: 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
70f0: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
7100: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
7110: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
7120: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7130: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43  e3_prepare_v2(pC
7140: 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c  onfig->db, zSql,
7150: 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65   -1, &p->pDelete
7160: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
7170: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
7180: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
7190: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
71a0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
71b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
71c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
71d0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
71e0: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20  p->pDeleter, 1, 
71f0: 69 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74  iFirst);.  sqlit
7200: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
7210: 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c  >pDeleter, 2, iL
7220: 61 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ast);.  sqlite3_
7230: 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72  step(p->pDeleter
7240: 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  );.  p->rc = sql
7250: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44  ite3_reset(p->pD
7260: 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eleter);.}../*.*
7270: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63  * Remove all rec
7280: 6f 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20  ords associated 
7290: 77 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65  with segment iSe
72a0: 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  gid..*/.static v
72b0: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f  oid fts5DataRemo
72c0: 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e  veSegment(Fts5In
72d0: 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67  dex *p, int iSeg
72e0: 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73  id){.  i64 iFirs
72f0: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
7300: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30  _ROWID(iSegid, 0
7310: 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73  , 0);.  i64 iLas
7320: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
7330: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b 31 2c  _ROWID(iSegid+1,
7340: 20 30 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35   0, 0)-1;.  fts5
7350: 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46  DataDelete(p, iF
7360: 69 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a  irst, iLast);.}.
7370: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
7380: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
7390: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
73a0: 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20 62  bject returned b
73b0: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a  y an earlier .**
73c0: 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72   call to fts5Str
73d0: 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72 20  uctureRead() or 
73e0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
73f0: 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
7400: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
7410: 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35 53  ureRelease(Fts5S
7420: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7430: 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75 63  t){.  if( pStruc
7440: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
7450: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7460: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
7470: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
7480: 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74  te3_free(pStruct
7490: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67  ->aLevel[i].aSeg
74a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
74b0: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
74c0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
74d0: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64   Deserialize and
74e0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75   return the stru
74f0: 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72  cture record cur
7500: 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
7510: 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66   serialized.** f
7520: 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65  orm within buffe
7530: 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a  r pData/nData..*
7540: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
7550: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
7560: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
7570: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
7580: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
7590: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62  over-allocated b
75a0: 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73  y one slot. This
75b0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75   allows the stru
75c0: 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  cture contents.*
75d0: 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73  * to be more eas
75e0: 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a  ily edited..**.*
75f0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
7600: 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20  curs, *ppOut is 
7610: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
7620: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7630: 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
7640: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70  . Otherwise, *pp
7650: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
7660: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
7670: 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c  bject and.** SQL
7680: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
7690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
76a0: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
76b0: 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  de(.  const u8 *
76c0: 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
76d0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
76e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61  containing seria
76f0: 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20  lized structure 
7700: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7720: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7730: 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20  buffer pData in 
7740: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
7750: 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20  piCookie,       
7760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7770: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
7780: 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74  ie value */.  Ft
7790: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
77a0: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Out           /*
77b0: 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a   OUT: Deserializ
77c0: 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ed object */.){.
77d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
77e0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20  E_OK;.  int i = 
77f0: 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20  0;.  int iLvl;. 
7800: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b   int nLevel = 0;
7810: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
7820: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
7830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7840: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7850: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
7860: 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a  cate at pRet */.
7870: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7880: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
7890: 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
78a0: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
78b0: 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  */..  /* Grab th
78c0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  e cookie value *
78d0: 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65  /.  if( piCookie
78e0: 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73   ) *piCookie = s
78f0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28  qlite3Fts5Get32(
7900: 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b  pData);.  i = 4;
7910: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
7920: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7930: 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65  levels and segme
7940: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
7950: 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
7960: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
7970: 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35    */.  i += fts5
7980: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7990: 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a  ta[i], nLevel);.
79a0: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
79b0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
79c0: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e  , nSegment);.  n
79d0: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73  Byte = (.      s
79e0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
79f0: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
7a10: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7a20: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7a30: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
7a40: 2a 20 28 6e 4c 65 76 65 6c 29 20 20 20 20 20 20  * (nLevel)      
7a50: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7a60: 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74  y */.  );.  pRet
7a70: 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
7a80: 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
7a90: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
7aa0: 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65  yte);..  if( pRe
7ab0: 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  t ){.    pRet->n
7ac0: 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a  Level = nLevel;.
7ad0: 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65      pRet->nSegme
7ae0: 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20  nt = nSegment;. 
7af0: 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46     i += sqlite3F
7b00: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
7b10: 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e  ata[i], &pRet->n
7b20: 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a  WriteCounter);..
7b30: 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
7b40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7b50: 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c   iLvl<nLevel; iL
7b60: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  vl++){.      Fts
7b70: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
7b80: 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61  *pLvl = &pRet->a
7b90: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
7ba0: 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20     int nTotal;. 
7bb0: 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a       int iSeg;..
7bc0: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
7bd0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7be0: 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72  a[i], pLvl->nMer
7bf0: 67 65 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  ge);.      i += 
7c00: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7c10: 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61  &pData[i], nTota
7c20: 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
7c30: 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e  ( nTotal>=pLvl->
7c40: 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20  nMerge );.      
7c50: 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74  pLvl->aSeg = (Ft
7c60: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7c70: 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  nt*)sqlite3Fts5M
7c80: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a  allocZero(&rc, .
7c90: 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61 6c            nTotal
7ca0: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
7cb0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 0a  ructureSegment).
7cc0: 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
7cd0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7ce0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76  K ){.        pLv
7cf0: 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c  l->nSeg = nTotal
7d00: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53  ;.        for(iS
7d10: 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61  eg=0; iSeg<nTota
7d20: 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  l; iSeg++){.    
7d30: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
7d40: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7d50: 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  a[i], pLvl->aSeg
7d60: 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a  [iSeg].iSegid);.
7d70: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66            i += f
7d80: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
7d90: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
7da0: 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67  aSeg[iSeg].nHeig
7db0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ht);.          i
7dc0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7dd0: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7de0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
7df0: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20  pgnoFirst);.    
7e00: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
7e10: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7e20: 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  a[i], pLvl->aSeg
7e30: 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29  [iSeg].pgnoLast)
7e40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7e50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7e60: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7e70: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
7e80: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
7e90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7ea0: 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65  ..  *ppOut = pRe
7eb0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
7ec0: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
7ed0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
7ee0: 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e  ctureAddLevel(in
7ef0: 74 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75  t *pRc, Fts5Stru
7f00: 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
7f10: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
7f20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7f30: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7f40: 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
7f50: 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76  ct;.    int nLev
7f60: 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c  el = pStruct->nL
7f70: 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42  evel;.    int nB
7f80: 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20  yte = (.        
7f90: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7fa0: 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20  ture) +         
7fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
7fc0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7fd0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7fe0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
7ff0: 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f   * (nLevel+1)  /
8000: 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79  * aLevel[] array
8010: 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20   */.    );..    
8020: 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65  pStruct = sqlite
8030: 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63  3_realloc(pStruc
8040: 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  t, nByte);.    i
8050: 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
8060: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72      memset(&pStr
8070: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76  uct->aLevel[nLev
8080: 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  el], 0, sizeof(F
8090: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
80a0: 6c 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  l));.      pStru
80b0: 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20  ct->nLevel++;.  
80c0: 20 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20      *ppStruct = 
80d0: 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c  pStruct;.    }el
80e0: 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  se{.      *pRc =
80f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8100: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8110: 2a 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69  * Extend level i
8120: 4c 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72  Lvl so that ther
8130: 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74  e is room for at
8140: 20 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f   least nExtra mo
8150: 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a  re.** segments..
8160: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
8170: 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
8180: 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a  ndLevel(.  int *
8190: 70 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75  pRc, .  Fts5Stru
81a0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20  cture *pStruct, 
81b0: 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20  .  int iLvl, .  
81c0: 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69  int nExtra, .  i
81d0: 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20  nt bInsert.){.  
81e0: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
81f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
8200: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
8210: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
8220: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
8230: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8240: 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20  egment *aNew;.  
8250: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20    int nByte;..  
8260: 20 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d    nByte = (pLvl-
8270: 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20  >nSeg + nExtra) 
8280: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
8290: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
82a0: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
82b0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d  e3_realloc(pLvl-
82c0: 3e 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20  >aSeg, nByte);. 
82d0: 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20     if( aNew ){. 
82e0: 20 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74       if( bInsert
82f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==0 ){.        m
8300: 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c  emset(&aNew[pLvl
8310: 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65  ->nSeg], 0, size
8320: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
8330: 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72  Segment) * nExtr
8340: 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
8350: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f  .        int nMo
8360: 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20  ve = pLvl->nSeg 
8370: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
8380: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
8390: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
83a0: 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61  &aNew[nExtra], a
83b0: 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  New, nMove);.   
83c0: 20 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77       memset(aNew
83d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
83e0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
83f0: 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  ) * nExtra);.   
8400: 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d     }.      pLvl-
8410: 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20  >aSeg = aNew;.  
8420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
8430: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
8440: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
8450: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73  ./*.** Read, des
8460: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74  erialize and ret
8470: 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  urn the structur
8480: 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  e record..**.** 
8490: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
84a0: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
84b0: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
84c0: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
84d0: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
84e0: 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73  allocated as des
84f0: 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74  cribed for funct
8500: 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75 72  ion fts5Structur
8510: 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62  eDecode() .** ab
8520: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ove..**.** If an
8530: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
8540: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
8550: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
8560: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a  e left in the.**
8570: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
8580: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
8590: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
85a0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
85b0: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
85c0: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
85d0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  op..*/.static Ft
85e0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
85f0: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 46  5StructureRead(F
8600: 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
8610: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
8620: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
8630: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
8640: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
8650: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
8660: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73   return */.  Fts
8670: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20  5Data *pData;   
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8690: 25 5f 64 61 74 61 20 65 6e 74 72 79 20 63 6f 6e  %_data entry con
86a0: 74 61 69 6e 69 6e 67 20 73 74 72 75 63 74 75 72  taining structur
86b0: 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  e record */.  in
86c0: 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20  t iCookie;      
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86e0: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   Configuration c
86f0: 6f 6f 6b 69 65 20 2a 2f 0a 0a 20 20 70 44 61 74  ookie */..  pDat
8700: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
8710: 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  (p, FTS5_STRUCTU
8720: 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28  RE_ROWID);.  if(
8730: 20 21 70 44 61 74 61 20 29 20 72 65 74 75 72 6e   !pData ) return
8740: 20 30 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74   0;.  p->rc = ft
8750: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
8760: 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74  e(pData->p, pDat
8770: 61 2d 3e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20  a->n, &iCookie, 
8780: 26 70 52 65 74 29 3b 0a 0a 20 20 69 66 28 20 70  &pRet);..  if( p
8790: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
87a0: 26 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f  && pConfig->iCoo
87b0: 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a  kie!=iCookie ){.
87c0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
87d0: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61  te3Fts5ConfigLoa
87e0: 64 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b  d(pConfig, iCook
87f0: 69 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ie);.  }..  fts5
8800: 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
8810: 61 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  a);.  if( p->rc!
8820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8830: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
8840: 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20  elease(pRet);.  
8850: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
8860: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
8870: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8880: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8890: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  of segments in i
88a0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
88b0: 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20  Struct. This.** 
88c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
88d0: 20 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61   ever used as pa
88e0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63  rt of assert() c
88f0: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69  onditions..*/.#i
8900: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8910: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
8920: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8930: 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75  egments(Fts5Stru
8940: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8950: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
8960: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8970: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
8980: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
8990: 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
89a0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89c0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
89d0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
89e0: 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f  levels */.    fo
89f0: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
8a00: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8a10: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  iLvl++){.      n
8a20: 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75  Segment += pStru
8a30: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
8a40: 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nSeg;.    }.  }
8a50: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d  ..  return nSegm
8a60: 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ent;.}.#endif../
8a70: 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61  *.** Serialize a
8a80: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74  nd store the "st
8a90: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e  ructure" record.
8aa0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
8ab0: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
8ac0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
8ad0: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
8ae0: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
8af0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
8b00: 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
8b10: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
8b20: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
8b30: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8b40: 75 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64  ureWrite(Fts5Ind
8b50: 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
8b60: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
8b70: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8b80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
8b90: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
8bb0: 75 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69  uffer to seriali
8bc0: 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a  ze record into *
8bd0: 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  /.    int iLvl; 
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
8c00: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
8c10: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  evels */.    int
8c20: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
8c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8c40: 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74  okie value to st
8c50: 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ore */..    asse
8c60: 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
8c70: 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
8c80: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
8c90: 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
8ca0: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
8cb0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
8cc0: 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  fer));..    /* A
8cd0: 70 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e  ppend the curren
8ce0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
8cf0: 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43  cookie */.    iC
8d00: 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66  ookie = p->pConf
8d10: 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20  ig->iCookie;.   
8d20: 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29   if( iCookie<0 )
8d30: 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20   iCookie = 0;.  
8d40: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8d50: 6e 64 33 32 28 26 70 2d 3e 72 63 2c 20 26 62 75  nd32(&p->rc, &bu
8d60: 66 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20  f, iCookie);..  
8d70: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8d80: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8d90: 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e   &buf, pStruct->
8da0: 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 66 74 73  nLevel);.    fts
8db0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
8dc0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
8dd0: 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  , pStruct->nSegm
8de0: 65 6e 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75  ent);.    fts5Bu
8df0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8e00: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28  (&p->rc, &buf, (
8e10: 69 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72  i64)pStruct->nWr
8e20: 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  iteCounter);..  
8e30: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
8e40: 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
8e50: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
8e60: 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20     int iSeg;    
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
8e90: 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d  ate through segm
8ea0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74  ents */.      Ft
8eb0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
8ec0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
8ed0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
8ee0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
8ef0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8f00: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8f10: 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20  ->nMerge);.     
8f20: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8f30: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8f40: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67  &buf, pLvl->nSeg
8f50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8f60: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
8f70: 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
8f80: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
8f90: 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
8fa0: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
8fb0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8fc0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8fd0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
8fe0: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
8ff0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
9000: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
9010: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
9020: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e  vl->aSeg[iSeg].n
9030: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  Height);.       
9040: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
9050: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
9060: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
9070: 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74  [iSeg].pgnoFirst
9080: 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
9090: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
90a0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
90b0: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
90c0: 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20  .pgnoLast);.    
90d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
90e0: 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
90f0: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
9100: 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66  OWID, buf.p, buf
9110: 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .n);.    fts5Buf
9120: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20  ferFree(&buf);. 
9130: 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74   }.}..#if 0.stat
9140: 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
9150: 67 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c  gStructure(int*,
9160: 46 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35  Fts5Buffer*,Fts5
9170: 53 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61  Structure*);.sta
9180: 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 72 69  tic void fts5Pri
9190: 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73  ntStructure(cons
91a0: 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e  t char *zCaption
91b0: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
91c0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
91d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
91e0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
91f0: 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66  f;.  memset(&buf
9200: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  , 0, sizeof(buf)
9210: 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53 74  );.  fts5DebugSt
9220: 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 62 75  ructure(&rc, &bu
9230: 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66  f, pStruct);.  f
9240: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
9250: 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74  %s: %s\n", zCapt
9260: 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66  ion, buf.p);.  f
9270: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
9280: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
9290: 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  &buf);.}.#else.#
92a0: 20 64 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e   define fts5Prin
92b0: 74 53 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a  tStructure(x,y).
92c0: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
92d0: 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69  nt fts5SegmentSi
92e0: 7a 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65  ze(Fts5Structure
92f0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a  Segment *pSeg){.
9300: 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65    return 1 + pSe
9310: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
9320: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d  eg->pgnoFirst;.}
9330: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
9340: 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73   copy of index s
9350: 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
9360: 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74  . Except, promot
9370: 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65  e as many .** se
9380: 67 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62  gments as possib
9390: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f  le to level iPro
93a0: 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  mote. If an OOM 
93b0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
93c0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
93d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
93e0: 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
93f0: 65 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78  eTo(.  Fts5Index
9400: 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d   *p,.  int iProm
9410: 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f  ote,.  int szPro
9420: 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75  mote,.  Fts5Stru
9430: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29  cture *pStruct.)
9440: 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a  {.  int il, is;.
9450: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9460: 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53  evel *pOut = &pS
9470: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50  truct->aLevel[iP
9480: 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20  romote];..  if( 
9490: 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20  pOut->nMerge==0 
94a0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50  ){.    for(il=iP
94b0: 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74  romote+1; il<pSt
94c0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c  ruct->nLevel; il
94d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
94e0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
94f0: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
9500: 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20  aLevel[il];.    
9510: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
9520: 67 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ge ) return;.   
9530: 20 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e     for(is=pLvl->
9540: 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69  nSeg-1; is>=0; i
9550: 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  s--){.        in
9560: 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65  t sz = fts5Segme
9570: 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53  ntSize(&pLvl->aS
9580: 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20  eg[is]);.       
9590: 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74   if( sz>szPromot
95a0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
95b0: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
95c0: 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d  eExtendLevel(&p-
95d0: 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50  >rc, pStruct, iP
95e0: 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20  romote, 1, 1);. 
95f0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
9600: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
9610: 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e     memcpy(pOut->
9620: 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  aSeg, &pLvl->aSe
9630: 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74  g[is], sizeof(Ft
9640: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
9650: 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nt));.        pO
9660: 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20  ut->nSeg++;.    
9670: 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d      pLvl->nSeg--
9680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9690: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e    }.}../*.** A n
96a0: 65 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a  ew segment has j
96b0: 75 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ust been written
96c0: 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f   to level iLvl o
96d0: 66 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  f index structur
96e0: 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68  e.** pStruct. Th
96f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
9700: 72 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65  rmines if any se
9710: 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  gments should be
9720: 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20   promoted.** as 
9730: 61 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e  a result. Segmen
9740: 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20  ts are promoted 
9750: 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
9760: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20  :.**.**   a) If 
9770: 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74  the segment just
9780: 20 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c   written is smal
9790: 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20  ler than one or 
97a0: 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a  more segments.**
97b0: 20 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65        within the
97c0: 20 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61   previous popula
97d0: 74 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73  ted level, it is
97e0: 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65   promoted to the
97f0: 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20   previous.**    
9800: 20 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65    populated leve
9810: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66  l..**.**   b) If
9820: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73   the segment jus
9830: 74 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72  t written is lar
9840: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77  ger than the new
9850: 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a  est segment on.*
9860: 2a 20 20 20 20 20 20 74 68 65 20 6e 65 78 74 20  *      the next 
9870: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c  populated level,
9880: 20 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65   then that segme
9890: 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  nt, and any othe
98a0: 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20  r adjacent.**   
98b0: 20 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74     segments that
98c0: 20 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65   are also smalle
98d0: 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a  r than the one j
98e0: 75 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65  ust written, are
98f0: 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74   .**      promot
9900: 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ed. .**.** If on
9910: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
9920: 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c  ts are promoted,
9930: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f   the structure o
9940: 62 6a 65 63 74 20 69 73 20 75 70 64 61 74 65 64  bject is updated
9950: 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74  .** to reflect t
9960: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  his..*/.static v
9970: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
9980: 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35  ePromote(.  Fts5
9990: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
99b0: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
99c0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  ct */.  int iLvl
99d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
99e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
99f0: 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61   level just upda
9a00: 74 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ted */.  Fts5Str
9a10: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
9a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9a30: 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  x structure */.)
9a40: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
9a50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9a60: 69 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e  int iTst;.    in
9a70: 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b  t iPromote = -1;
9a80: 0a 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f  .    int szPromo
9a90: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
9aa0: 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e     /* Promote an
9ab0: 79 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65  ything this size
9ac0: 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20   or smaller */. 
9ad0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
9ae0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
9af0: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74   /* Segment just
9b00: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
9b10: 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20  int szSeg;      
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b30: 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74   Size of segment
9b40: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
9b50: 0a 0a 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  ...    pSeg = &p
9b60: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9b70: 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63  Lvl].aSeg[pStruc
9b80: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
9b90: 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53  nSeg-1];.    szS
9ba0: 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e  eg = (1 + pSeg->
9bb0: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
9bc0: 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20  >pgnoFirst);..  
9bd0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
9be0: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a  ondition (a) */.
9bf0: 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76      for(iTst=iLv
9c00: 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20  l-1; iTst>=0 && 
9c10: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9c20: 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69  iTst].nSeg==0; i
9c30: 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20  Tst--);.    if( 
9c40: 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iTst>=0 ){.     
9c50: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
9c60: 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20  t szMax = 0;.   
9c70: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
9c80: 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70  Level *pTst = &p
9c90: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9ca0: 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Tst];.      asse
9cb0: 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65  rt( pTst->nMerge
9cc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
9cd0: 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53  (i=0; i<pTst->nS
9ce0: 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
9cf0: 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d    int sz = pTst-
9d00: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73  >aSeg[i].pgnoLas
9d10: 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69  t - pTst->aSeg[i
9d20: 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b  ].pgnoFirst + 1;
9d30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
9d40: 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20  szMax ) szMax = 
9d50: 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
9d60: 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53    if( szMax>=szS
9d70: 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  eg ){.        /*
9d80: 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69   Condition (a) i
9d90: 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20  s true. Promote 
9da0: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
9db0: 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20  nt on level .   
9dc0: 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20       ** iLvl to 
9dd0: 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a  level iTst.  */.
9de0: 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65          iPromote
9df0: 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20   = iTst;.       
9e00: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d   szPromote = szM
9e10: 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ax;.      }.    
9e20: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e  }..    /* If con
9e30: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f  dition (a) is no
9e40: 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62  t met, assume (b
9e50: 29 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63  ) is true. Struc
9e60: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a  turePromoteTo().
9e70: 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f      ** is a no-o
9e80: 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  p if it is not. 
9e90: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f   */.    if( iPro
9ea0: 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  mote<0 ){.      
9eb0: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b  iPromote = iLvl;
9ec0: 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65  .      szPromote
9ed0: 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a   = szSeg;.    }.
9ee0: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
9ef0: 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50  ePromoteTo(p, iP
9f00: 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74  romote, szPromot
9f10: 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  e, pStruct);.  }
9f20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
9f30: 65 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 6f 66  e pIter->iOff of
9f40: 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70  fset currently p
9f50: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
9f60: 79 20 69 6e 64 69 63 61 74 69 6e 67 20 6f 6e 65  y indicating one
9f70: 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  .** or more term
9f80: 2d 6c 65 73 73 20 6e 6f 64 65 73 2c 20 61 64 76  -less nodes, adv
9f90: 61 6e 63 65 20 70 61 73 74 20 69 74 20 61 6e 64  ance past it and
9fa0: 20 73 65 74 20 70 49 74 65 72 2d 3e 6e 45 6d 70   set pIter->nEmp
9fb0: 74 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d  ty to.** the num
9fc0: 62 65 72 20 6f 66 20 65 6d 70 74 79 20 63 68 69  ber of empty chi
9fd0: 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61  ld nodes..*/.sta
9fe0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64  tic void fts5Nod
9ff0: 65 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74  eIterGobbleNEmpt
a000: 79 28 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a  y(Fts5NodeIter *
a010: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
a020: 74 65 72 2d 3e 69 4f 66 66 3c 70 49 74 65 72 2d  ter->iOff<pIter-
a030: 3e 6e 44 61 74 61 20 26 26 20 30 3d 3d 28 70 49  >nData && 0==(pI
a040: 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72  ter->aData[pIter
a050: 2d 3e 69 4f 66 66 5d 20 26 20 30 78 66 65 29 20  ->iOff] & 0xfe) 
a060: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44  ){.    pIter->bD
a070: 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 44  lidx = pIter->aD
a080: 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d  ata[pIter->iOff]
a090: 20 26 20 30 78 30 31 3b 0a 20 20 20 20 70 49 74   & 0x01;.    pIt
a0a0: 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20 20  er->iOff++;.    
a0b0: 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66  pIter->iOff += f
a0c0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
a0d0: 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74  pIter->aData[pIt
a0e0: 65 72 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72  er->iOff], pIter
a0f0: 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c  ->nEmpty);.  }el
a100: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e  se{.    pIter->n
a110: 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Empty = 0;.    p
a120: 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30  Iter->bDlidx = 0
a130: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
a140: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
a150: 78 74 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20  xt entry within 
a160: 74 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61  the node..*/.sta
a170: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64  tic void fts5Nod
a180: 65 49 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70  eIterNext(int *p
a190: 52 63 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72  Rc, Fts5NodeIter
a1a0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
a1b0: 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74  pIter->iOff>=pIt
a1c0: 65 72 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20  er->nData ){.   
a1d0: 20 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20   pIter->aData = 
a1e0: 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43  0;.    pIter->iC
a1f0: 68 69 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e  hild += pIter->n
a200: 45 6d 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Empty;.  }else{.
a210: 20 20 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e      int nPre, nN
a220: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ew;.    pIter->i
a230: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
a240: 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61  rint32(&pIter->a
a250: 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66  Data[pIter->iOff
a260: 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20 70 49  ], nPre);.    pI
a270: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  ter->iOff += fts
a280: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
a290: 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72  ter->aData[pIter
a2a0: 2d 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  ->iOff], nNew);.
a2b0: 20 20 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e      pIter->term.
a2c0: 6e 20 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20  n = nPre-2;.    
a2d0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
a2e0: 42 6c 6f 62 28 70 52 63 2c 20 26 70 49 74 65 72  Blob(pRc, &pIter
a2f0: 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49  ->term, nNew, pI
a300: 74 65 72 2d 3e 61 44 61 74 61 2b 70 49 74 65 72  ter->aData+pIter
a310: 2d 3e 69 4f 66 66 29 3b 0a 20 20 20 20 70 49 74  ->iOff);.    pIt
a320: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77  er->iOff += nNew
a330: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68  ;.    pIter->iCh
a340: 69 6c 64 20 2b 3d 20 28 31 20 2b 20 70 49 74 65  ild += (1 + pIte
a350: 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20  r->nEmpty);.    
a360: 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62  fts5NodeIterGobb
a370: 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b  leNEmpty(pIter);
a380: 0a 20 20 20 20 69 66 28 20 2a 70 52 63 20 29 20  .    if( *pRc ) 
a390: 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30  pIter->aData = 0
a3a0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
a3b0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69  Initialize the i
a3c0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
a3d0: 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20  Iter to iterate 
a3e0: 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65  through the inte
a3f0: 72 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20  rnal.** segment 
a400: 6e 6f 64 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a  node in pData..*
a410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
a420: 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 63  s5NodeIterInit(c
a430: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
a440: 69 6e 74 20 6e 44 61 74 61 2c 20 46 74 73 35 4e  int nData, Fts5N
a450: 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b  odeIter *pIter){
a460: 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
a470: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
a480: 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44  r));.  pIter->aD
a490: 61 74 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70  ata = aData;.  p
a4a0: 49 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44  Iter->nData = nD
a4b0: 61 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f  ata;.  pIter->iO
a4c0: 66 66 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  ff = fts5GetVari
a4d0: 6e 74 33 32 28 61 44 61 74 61 2c 20 70 49 74 65  nt32(aData, pIte
a4e0: 72 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 66 74  r->iChild);.  ft
a4f0: 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65  s5NodeIterGobble
a500: 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 7d  NEmpty(pIter);.}
a510: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
a520: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
a530: 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
a540: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
a550: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64  tic void fts5Nod
a560: 65 49 74 65 72 46 72 65 65 28 46 74 73 35 4e 6f  eIterFree(Fts5No
a570: 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  deIter *pIter){.
a580: 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
a590: 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
a5a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
a5b0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
a5c0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
a5d0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68   argument. If th
a5e0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a  e end of the .**
a5f0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70   doclist-index p
a600: 61 67 65 20 69 73 20 72 65 61 63 68 65 64 2c 20  age is reached, 
a610: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
a620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a630: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a640: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
a650: 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl){.  Fts5Data 
a660: 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70  *pData = pLvl->p
a670: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76  Data;..  if( pLv
a680: 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  l->iOff==0 ){.  
a690: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
a6a0: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70  bEof==0 );.    p
a6b0: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20  Lvl->iOff = 1;. 
a6c0: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d     pLvl->iOff +=
a6d0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
a6e0: 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70  (&pData->p[1], p
a6f0: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b  Lvl->iLeafPgno);
a700: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
a710: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a720: 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d  (&pData->p[pLvl-
a730: 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  >iOff], (u64*)&p
a740: 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  Lvl->iRowid);.  
a750: 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66    pLvl->iFirstOf
a760: 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a  f = pLvl->iOff;.
a770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
a780: 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28 69   iOff;.    for(i
a790: 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20  Off=pLvl->iOff; 
a7a0: 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 3b 20 69  iOff<pData->n; i
a7b0: 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Off++){.      if
a7c0: 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d  ( pData->p[iOff]
a7d0: 20 29 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d   ) break; .    }
a7e0: 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70  ..    if( iOff<p
a7f0: 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Data->n ){.     
a800: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20   i64 iVal;.     
a810: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a820: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c   += (iOff - pLvl
a830: 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20  ->iOff) + 1;.   
a840: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
a850: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
a860: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
a870: 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c  &iVal);.      pL
a880: 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56  vl->iRowid += iV
a890: 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  al;.      pLvl->
a8a0: 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20  iOff = iOff;.   
a8b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
a8c0: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
a8d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a8e0: 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a  n pLvl->bEof;.}.
a8f0: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
a900: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a910: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
a920: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a930: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
a940: 49 74 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e  IterNextR(Fts5In
a950: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
a960: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
a970: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
a980: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
a990: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
a9a0: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
a9b0: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
a9c0: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
a9d0: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20  dxLvlNext(pLvl) 
a9e0: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
a9f0: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
aa00: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
aa10: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c  lidxIterNextR(p,
aa20: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
aa30: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
aa40: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
aa50: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
aa60: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
aa70: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
aa80: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
aa90: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
aaa0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
aab0: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
aac0: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
aad0: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
aae0: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
aaf0: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
ab00: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
ab10: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
ab20: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
ab30: 61 20 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  a ) fts5DlidxLvl
ab40: 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20  Next(pLvl);.    
ab50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
ab60: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
ab70: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73  Lvl[0].bEof;.}.s
ab80: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
ab90: 69 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35  idxIterNext(Fts5
aba0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
abb0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
abc0: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c  .  return fts5Dl
abd0: 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20  idxIterNextR(p, 
abe0: 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  pIter, 0);.}../*
abf0: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
ac00: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
ac10: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61  irst argument ha
ac20: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
ac30: 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73  fields set.** as
ac40: 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66   follows. This f
ac50: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20  unction sets up 
ac60: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
ac70: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
ac80: 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f   it.** points to
ac90: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
aca0: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d   in the doclist-
acb0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70  index..**.**   p
acc0: 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69  Data:.**     poi
acd0: 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d  nter to doclist-
ace0: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a  index record, .*
acf0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
ad00: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
ad10: 64 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  d pIter->iLeafPg
ad20: 6e 6f 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  no is the page n
ad30: 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63  umber the.** doc
ad40: 6c 69 73 74 20 69 73 20 61 73 73 6f 63 69 61 74  list is associat
ad50: 65 64 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65  ed with (the one
ad60: 20 66 65 61 74 75 72 69 6e 67 20 74 68 65 20 74   featuring the t
ad70: 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erm)..*/.static 
ad80: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
ad90: 72 46 69 72 73 74 28 46 74 73 35 44 6c 69 64 78  rFirst(Fts5Dlidx
ada0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
adb0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
adc0: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
add0: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44   i++){.    fts5D
ade0: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74  lidxLvlNext(&pIt
adf0: 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20  er->aLvl[i]);.  
ae00: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  }.  return pIter
ae10: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
ae20: 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  }...static int f
ae30: 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
ae40: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ae50: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
ae60: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  er){.  return p-
ae70: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
ae80: 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  | pIter->aLvl[0]
ae90: 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63  .bEof;.}..static
aea0: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
aeb0: 74 65 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65  terLast(Fts5Inde
aec0: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
aed0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
aee0: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61  nt i;..  /* Adva
aef0: 6e 63 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74  nce each level t
af00: 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
af10: 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67   on the last pag
af20: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74  e */.  for(i=pIt
af30: 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72  er->nLvl-1; p->r
af40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
af50: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
af60: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
af70: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
af80: 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[i];.    while(
af90: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
afa0: 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20  t(pLvl)==0 );.  
afb0: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30    pLvl->bEof = 0
afc0: 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  ;..    if( i>0 )
afd0: 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
afe0: 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26  xLvl *pChild = &
aff0: 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20  pLvl[-1];.      
b000: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
b010: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a  pChild->pData);.
b020: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68        memset(pCh
b030: 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ild, 0, sizeof(F
b040: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
b050: 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61       pChild->pDa
b060: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
b070: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
b080: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
b090: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
b0a0: 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  i-1, pLvl->iLeaf
b0b0: 50 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20  Pgno).      );. 
b0c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
b0d0: 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
b0e0: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
b0f0: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
b100: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
b110: 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  entry..*/.static
b120: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76   int fts5DlidxLv
b130: 6c 50 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c  lPrev(Fts5DlidxL
b140: 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74  vl *pLvl){.  int
b150: 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f   iOff = pLvl->iO
b160: 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ff;..  assert( p
b170: 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a  Lvl->bEof==0 );.
b180: 20 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c    if( iOff<=pLvl
b190: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
b1a0: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
b1b0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b1c0: 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44  u8 *a = pLvl->pD
b1d0: 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20  ata->p;.    i64 
b1e0: 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c  iVal;.    int iL
b1f0: 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69  imit;.    int ii
b200: 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20  ;.    int nZero 
b210: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72  = 0;..    /* Cur
b220: 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e  rently iOff poin
b230: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
b240: 62 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74  byte of a varint
b250: 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20  . This block .  
b260: 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20    ** decrements 
b270: 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f  iOff until it po
b280: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
b290: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 72  t byte of the pr
b2a0: 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76  evious .    ** v
b2b0: 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61  arint. Taking ca
b2c0: 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61  re not to read a
b2d0: 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ny memory locati
b2e0: 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20  ons that occur. 
b2f0: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65     ** before the
b300: 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72   buffer in memor
b310: 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69  y.  */.    iLimi
b320: 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f  t = (iOff>9 ? iO
b330: 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66  ff-9 : 0);.    f
b340: 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e  or(iOff--; iOff>
b350: 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b  iLimit; iOff--){
b360: 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f  .      if( (a[iO
b370: 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30  ff-1] & 0x80)==0
b380: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
b390: 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69  .    fts5GetVari
b3a0: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
b3b0: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70  4*)&iVal);.    p
b3c0: 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  Lvl->iRowid -= i
b3d0: 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  Val;.    pLvl->i
b3e0: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20  LeafPgno--;..   
b3f0: 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72   /* Skip backwar
b400: 64 73 20 70 61 73 74 20 61 6e 79 20 30 78 30 30  ds past any 0x00
b410: 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20   varints. */.   
b420: 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20   for(ii=iOff-1; 
b430: 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  ii>=pLvl->iFirst
b440: 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78  Off && a[ii]==0x
b450: 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20  00; ii--){.     
b460: 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a   nZero++;.    }.
b470: 20 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c      if( ii>=pLvl
b480: 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 28  ->iFirstOff && (
b490: 61 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b  a[ii] & 0x80) ){
b4a0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79  .      /* The by
b4b0: 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  te immediately b
b4c0: 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30  efore the last 0
b4d0: 78 30 30 20 62 79 74 65 20 68 61 73 20 74 68 65  x00 byte has the
b4e0: 20 30 78 38 30 20 62 69 74 0a 20 20 20 20 20 20   0x80 bit.      
b4f0: 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c  ** set. So the l
b500: 61 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79  ast 0x00 is only
b510: 20 61 20 76 61 72 69 6e 74 20 30 20 69 66 20 74   a varint 0 if t
b520: 68 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20  here are 8 more 
b530: 30 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79  0x80.      ** by
b540: 74 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d  tes before a[ii]
b550: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  . */.      int b
b560: 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Zero = 0;       
b570: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
b580: 66 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e  f last 0x00 coun
b590: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
b5a0: 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46  (ii-8)>=pLvl->iF
b5b0: 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20  irstOff ){.     
b5c0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
b5d0: 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20    for(j=1; j<=8 
b5e0: 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78  && (a[ii-j] & 0x
b5f0: 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20  80); j++);.     
b600: 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29     bZero = (j>8)
b610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b620: 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e  if( bZero==0 ) n
b630: 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Zero--;.    }.  
b640: 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e    pLvl->iLeafPgn
b650: 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20  o -= nZero;.    
b660: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  pLvl->iOff = iOf
b670: 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a  f - nZero;.  }..
b680: 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62    return pLvl->b
b690: 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Eof;.}..static i
b6a0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
b6b0: 50 72 65 76 52 28 46 74 73 35 49 6e 64 65 78 20  PrevR(Fts5Index 
b6c0: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
b6d0: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c  r *pIter, int iL
b6e0: 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  vl){.  Fts5Dlidx
b6f0: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  Lvl *pLvl = &pIt
b700: 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a  er->aLvl[iLvl];.
b710: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
b720: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20  pIter->nLvl );. 
b730: 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76   if( fts5DlidxLv
b740: 6c 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20  lPrev(pLvl) ){. 
b750: 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20     if( (iLvl+1) 
b760: 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b  < pIter->nLvl ){
b770: 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
b780: 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74  IterPrevR(p, pIt
b790: 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20  er, iLvl+1);.   
b7a0: 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62     if( pLvl[1].b
b7b0: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
b7c0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
b7d0: 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
b7e0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
b7f0: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
b800: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
b810: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61         pLvl->pDa
b820: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
b830: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
b840: 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
b850: 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64  ID(pIter->iSegid
b860: 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e  , iLvl, pLvl[1].
b870: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
b880: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
b890: 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b  ( pLvl->pData ){
b8a0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
b8b0: 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ( fts5DlidxLvlNe
b8c0: 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20  xt(pLvl)==0 );. 
b8d0: 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62           pLvl->b
b8e0: 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Eof = 0;.       
b8f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b900: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
b910: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
b920: 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  of;.}.static int
b930: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
b940: 65 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ev(Fts5Index *p,
b950: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
b960: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
b970: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
b980: 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29  evR(p, pIter, 0)
b990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
b9a0: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
b9b0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
b9c0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73  allocated by fts
b9d0: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29  5DlidxIterInit()
b9e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b9f0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
ba00: 65 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  ee(Fts5DlidxIter
ba10: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
ba20: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
ba30: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
ba40: 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
ba50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
ba60: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
ba70: 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61  r->aLvl[i].pData
ba80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ba90: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
baa0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
bab0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66  Fts5DlidxIter *f
bac0: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
bad0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
bae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
baf0: 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b      /* Fts5 Back
bb00: 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
bb10: 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ithin */.  int b
bb20: 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
bb30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
bb40: 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20  ue for ORDER BY 
bb50: 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ASC */.  int iSe
bb60: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
bb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
bb80: 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
bb90: 69 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20  iLeafPg         
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
bbb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
bbc0: 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f  to load dlidx fo
bbd0: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c  r */.){.  Fts5Dl
bbe0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  idxIter *pIter =
bbf0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
bc00: 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20  nt bDone = 0;.. 
bc10: 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
bc20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44  =SQLITE_OK && bD
bc30: 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  one==0; i++){.  
bc40: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
bc50: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74  zeof(Fts5DlidxIt
bc60: 65 72 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66  er) + i * sizeof
bc70: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a  (Fts5DlidxLvl);.
bc80: 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
bc90: 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e  r *pNew;..    pN
bca0: 65 77 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49  ew = (Fts5DlidxI
bcb0: 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ter*)sqlite3_rea
bcc0: 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74  lloc(pIter, nByt
bcd0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
bce0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
bcf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
bd00: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
bd10: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
bd20: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
bd30: 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65  D(iSegid, i, iLe
bd40: 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73  afPg);.      Fts
bd50: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
bd60: 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d  = &pNew->aLvl[i]
bd70: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  ;.      pIter = 
bd80: 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73  pNew;.      mems
bd90: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
bda0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
bdb0: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
bdc0: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
bdd0: 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
bde0: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
bdf0: 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e  pData && (pLvl->
be00: 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78  pData->p[0] & 0x
be10: 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0001)==0 ){.    
be20: 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
be30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
be40: 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a  er->nLvl = i+1;.
be50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
be60: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
be70: 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
be80: 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
be90: 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
bea0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
beb0: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
bec0: 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
bed0: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
bee0: 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72  terLast(p, pIter
bef0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bf00: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
bf10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35  E_OK ){.    fts5
bf20: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49  DlidxIterFree(pI
bf30: 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20  ter);.    pIter 
bf40: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
bf50: 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61  rn pIter;.}..sta
bf60: 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
bf70: 78 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44  xIterRowid(Fts5D
bf80: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
bf90: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
bfa0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64  ->aLvl[0].iRowid
bfb0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
bfc0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
bfd0: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
bfe0: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
bff0: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
c000: 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 73 74  iLeafPgno;.}..st
c010: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c 65  atic void fts5Le
c020: 61 66 48 65 61 64 65 72 28 46 74 73 35 44 61 74  afHeader(Fts5Dat
c030: 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20 2a 70  a *pLeaf, int *p
c040: 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69 54  iRowid, int *piT
c050: 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77 69 64  erm){.  *piRowid
c060: 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65 74 55   = (int)fts5GetU
c070: 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29  16(&pLeaf->p[0])
c080: 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20 28 69  ;.  *piTerm = (i
c090: 6e 74 29 66 74 73 35 47 65 74 55 31 36 28 26 70  nt)fts5GetU16(&p
c0a0: 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a  Leaf->p[2]);.}..
c0b0: 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e  /*.** Load the n
c0c0: 65 78 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e  ext leaf page in
c0d0: 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69  to the segment i
c0e0: 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  terator..*/.stat
c0f0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
c100: 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46  terNextPage(.  F
c110: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c130: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
c140: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
c150: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
c160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
c170: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
c180: 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a  e to next page *
c190: 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
c1a0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
c1b0: 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b  g = pIter->pSeg;
c1c0: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
c1d0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
c1e0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
c1f0: 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49  Pgno++;.  if( pI
c200: 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29  ter->pNextLeaf )
c210: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
c220: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d  ter->iLeafPgno<=
c230: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
c240: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  ;.    pIter->pLe
c250: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78  af = pIter->pNex
c260: 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  tLeaf;.    pIter
c270: 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b  ->pNextLeaf = 0;
c280: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
c290: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70  er->iLeafPgno<=p
c2a0: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
c2b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
c2c0: 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
c2d0: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53  (p, .        FTS
c2e0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
c2f0: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c  pSeg->iSegid, 0,
c300: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
c310: 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  o).    );.  }els
c320: 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  e{.    pIter->pL
c330: 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eaf = 0;.  }.}..
c340: 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
c350: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
c360: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
c370: 20 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e   varint to be in
c380: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a  terpreted as a.*
c390: 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  * position list 
c3a0: 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64  size field. Read
c3b0: 20 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20   the varint and 
c3c0: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
c3d0: 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65  r of bytes.** re
c3e0: 61 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ad. Before retur
c3f0: 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20  ning, set *pnSz 
c400: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
c410: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f   bytes in the po
c420: 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20  sition.** list, 
c430: 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72  and *pbDel to tr
c440: 75 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65  ue if the delete
c450: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72   flag is set, or
c460: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
c470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c480: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
c490: 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20  ze(const u8 *p, 
c4a0: 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a  int *pnSz, int *
c4b0: 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53  pbDel){.  int nS
c4c0: 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 66 74 73  z;.  int n = fts
c4d0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20  5GetVarint32(p, 
c4e0: 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e  nSz);.  assert_n
c4f0: 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20 2a  c( nSz>=0 );.  *
c500: 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20  pnSz = nSz/2;.  
c510: 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20 30  *pbDel = nSz & 0
c520: 78 30 30 30 31 3b 0a 20 20 72 65 74 75 72 6e 20  x0001;.  return 
c530: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35  n;.}../*.** Fts5
c540: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
c550: 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  set currently po
c560: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
c570: 74 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20 70  t byte of a.** p
c580: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
c590: 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68  e field. Read th
c5a0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
c5b0: 69 65 6c 64 20 61 6e 64 20 73 74 6f 72 65 20 69  ield and store i
c5c0: 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c  t.** in the foll
c5d0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a  owing variables:
c5e0: 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67  .**.**   Fts5Seg
c5f0: 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46  Iter.nPos.**   F
c600: 74 73 35 53 65 67 49 74 65 72 2e 62 44 65 6c 0a  ts5SegIter.bDel.
c610: 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73 35  **.** Leave Fts5
c620: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
c630: 73 65 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  set pointing to 
c640: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
c650: 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74 69  f the .** positi
c660: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20  on list content 
c670: 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61  (if any)..*/.sta
c680: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
c690: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74 73  IterLoadNPos(Fts
c6a0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
c6b0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
c6c0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
c6d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
c6e0: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
c6f0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a  iLeafOffset;  /*
c700: 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20   Offset to read 
c710: 61 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f  at */.    if( iO
c720: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
c730: 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ->n ){.      p->
c740: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
c750: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
c760: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20      const u8 *a 
c770: 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  = &pIter->pLeaf-
c780: 3e 70 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  >p[iOff];.      
c790: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c7a0: 65 74 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73  et += fts5GetPos
c7b0: 6c 69 73 74 53 69 7a 65 28 61 2c 20 26 70 49 74  listSize(a, &pIt
c7c0: 65 72 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72  er->nPos, &pIter
c7d0: 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  ->bDel);.    }. 
c7e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35   }.}../*.** Fts5
c7f0: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
c800: 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  set currently po
c810: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
c820: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
c830: 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c  * "nSuffix" fiel
c840: 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e  d of a term. Fun
c850: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
c860: 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74  nKeep contains t
c870: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
c880: 68 65 20 22 6e 50 72 65 66 69 78 22 20 66 69 65  he "nPrefix" fie
c890: 6c 64 20 28 69 66 20 74 68 65 72 65 20 77 61 73  ld (if there was
c8a0: 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73   one - it is pas
c8b0: 73 65 64 20 30 20 69 66 20 74 68 69 73 20 69 73  sed 0 if this is
c8c0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 65  .** the first te
c8d0: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
c8e0: 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  t)..**.** This f
c8f0: 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65  unction populate
c900: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53  s:.**.**   Fts5S
c910: 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20  egIter.term.**  
c920: 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77   Fts5SegIter.row
c930: 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69  id.**.** accordi
c940: 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20  ngly and leaves 
c950: 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65  (Fts5SegIter.iLe
c960: 61 66 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f  afOffset) set to
c970: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
c980: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f 73  ** the first pos
c990: 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20  ition list. The 
c9a0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65  position list be
c9b0: 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d  longing to docum
c9c0: 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67  ent .** (Fts5Seg
c9d0: 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f  Iter.iRowid)..*/
c9e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c9f0: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
ca00: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
ca10: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
ca20: 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20  r, int nKeep){. 
ca30: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
ca40: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
ca50: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
ca60: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
ca70: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
ca80: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
ca90: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
caa0: 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20  ead at */.  int 
cab0: 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cad0: 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ytes of new data
cae0: 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66   */..  iOff += f
caf0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
cb00: 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
cb10: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
cb20: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
cb30: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
cb40: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
cb50: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
cb60: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
cb70: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
cb80: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
cb90: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
cba0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
cbb0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
cbc0: 6f 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  o;.  if( iOff>=p
cbd0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29  Iter->pLeaf->n )
cbe0: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
cbf0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
cc00: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
cc10: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  er->pLeaf==0 ){.
cc20: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
cc30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
cc40: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
cc50: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  T;.      return;
cc60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
cc70: 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74  = 4;.    a = pIt
cc80: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
cc90: 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69  }.  iOff += sqli
cca0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
ccb0: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
ccc0: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
ccd0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
cce0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d  Offset = iOff;.}
ccf0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
cd00: 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ze the iterator 
cd10: 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
cd20: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
cd30: 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a  the entries in.*
cd40: 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20  * segment pSeg. 
cd50: 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  The iterator is 
cd60: 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
cd70: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
cd80: 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   when .** this f
cd90: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
cda0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
cdb0: 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
cdc0: 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
cdd0: 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
cde0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
cdf0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73  .** an error has
ce00: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
ce10: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
ce20: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
ce30: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
ce40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
ce50: 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20  s5SegIterInit(. 
ce60: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62   /* FTS index ob
ce90: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
cea0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
ceb0: 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73  pSeg,     /* Des
cec0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d  cription of segm
ced0: 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ent */.  Fts5Seg
cee0: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
cef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
cf00: 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
cf10: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d  /.){.  if( pSeg-
cf20: 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b  >pgnoFirst==0 ){
cf30: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
cf40: 70 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d  pens if the segm
cf50: 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65  ent is being use
cf60: 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f  d as an input to
cf70: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a   an incremental.
cf80: 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64      ** merge and
cf90: 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c   all data has al
cfa0: 72 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d  ready been "trim
cfb0: 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69  med". See functi
cfc0: 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72  on.    ** fts5Tr
cfd0: 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72  imSegments() for
cfe0: 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69   details. In thi
cff0: 73 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65  s case leave the
d000: 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e   iterator empty.
d010: 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
d020: 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20  er will see the 
d030: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30  (pIter->pLeaf==0
d040: 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65  ) and assume the
d050: 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20   iterator is.   
d060: 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61   ** at EOF alrea
d070: 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  dy. */.    asser
d080: 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  t( pIter->pLeaf=
d090: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
d0a0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
d0b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d0c0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
d0d0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
d0e0: 74 65 72 29 29 3b 0a 20 20 20 20 70 49 74 65 72  ter));.    pIter
d0f0: 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20  ->pSeg = pSeg;. 
d100: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
d110: 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
d120: 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73  First-1;.    fts
d130: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
d140: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
d150: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d160: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
d170: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
d180: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65  eaf->p;.    pIte
d190: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d1a0: 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32   fts5GetU16(&a[2
d1b0: 5d 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  ]);.    fts5SegI
d1c0: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
d1d0: 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74  Iter, 0);.    ft
d1e0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
d1f0: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  s(p, pIter);.  }
d200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
d210: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
d220: 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69  ever called on i
d230: 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64  terators created
d240: 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20   by calls to.** 
d250: 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
d260: 20 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e   with the FTS5IN
d270: 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66  DEX_QUERY_DESC f
d280: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54  lag set..**.** T
d290: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69  he iterator is i
d2a0: 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61  n an unusual sta
d2b0: 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
d2c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a  ction is called:
d2d0: 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49   the.** Fts5SegI
d2e0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
d2f0: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
d300: 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  to the offset of
d310: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
d320: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
d330: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f  st size field fo
d340: 72 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65  r the first rele
d350: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
d360: 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53  e page..** Fts5S
d370: 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20  egIter.rowid is 
d380: 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e  set, but nPos an
d390: 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a  d bDel are not..
d3a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d3b0: 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65  ion advances the
d3c0: 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61   iterator so tha
d3d0: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
d3e0: 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65  he last .** rele
d3f0: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
d400: 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e  e page and, if n
d410: 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61  ecessary, initia
d420: 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52  lizes the .** aR
d430: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64  owidOffset[] and
d440: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61   iRowidOffset va
d450: 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73  riables. At this
d460: 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61   point the itera
d470: 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73  tor.** is in its
d480: 20 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d   regular state -
d490: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
d4a0: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20  afOffset points 
d4b0: 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
d4c0: 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69  byte of the posi
d4d0: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
d4e0: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
d4f0: 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f  h said rowid..*/
d500: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d510: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
d520: 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65  nitPage(Fts5Inde
d530: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
d540: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
d550: 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
d560: 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20 3d 20  f->n;.  int i = 
d570: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d580: 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  et;.  u8 *a = pI
d590: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
d5a0: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65   int iRowidOffse
d5b0: 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  t = 0;..  while(
d5c0: 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44   1 ){.    i64 iD
d5d0: 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e  elta = 0;.    in
d5e0: 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20  t nPos;.    int 
d5f0: 62 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 20 2b  bDummy;..    i +
d600: 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
d610: 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f  Size(&a[i], &nPo
d620: 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
d630: 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20   i += nPos;.    
d640: 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b  if( i>=n ) break
d650: 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47  ;.    i += fts5G
d660: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20  etVarint(&a[i], 
d670: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
d680: 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
d690: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
d6a0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
d6b0: 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28  iDelta;..    if(
d6c0: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70   iRowidOffset>=p
d6d0: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
d6e0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
d6f0: 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52  nNew = pIter->nR
d700: 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a  owidOffset + 8;.
d710: 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20        int *aNew 
d720: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
d730: 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61  realloc(pIter->a
d740: 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65  RowidOffset, nNe
d750: 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  w*sizeof(int));.
d760: 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
d770: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
d780: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
d790: 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  M;.        break
d7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d7b0: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
d7c0: 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  set = aNew;.    
d7d0: 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f    pIter->nRowidO
d7e0: 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20  ffset = nNew;.  
d7f0: 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e    }..    pIter->
d800: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f  aRowidOffset[iRo
d810: 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70  widOffset++] = p
d820: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d830: 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
d840: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  eafOffset = i;. 
d850: 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77   }.  pIter->iRow
d860: 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69  idOffset = iRowi
d870: 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53  dOffset;.  fts5S
d880: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
d890: 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
d8a0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
d8b0: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
d8c0: 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73 35  erseNewPage(Fts5
d8d0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
d8e0: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
d8f0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
d900: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
d910: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a  ITER_REVERSE );.
d920: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
d930: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
d940: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b  GITER_ONETERM );
d950: 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
d960: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
d970: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
d980: 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  f = 0;.  while( 
d990: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
d9a0: 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   && pIter->iLeaf
d9b0: 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72  Pgno>pIter->iTer
d9c0: 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  mLeafPgno ){.   
d9d0: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b   Fts5Data *pNew;
d9e0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
d9f0: 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65  fPgno--;.    pNe
da00: 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  w = fts5DataRead
da10: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
da20: 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20  _ROWID(.        
da30: 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69    pIter->pSeg->i
da40: 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d  Segid, 0, pIter-
da50: 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29  >iLeafPgno.    )
da60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
da70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
da80: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  er->iLeafPgno==p
da90: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
daa0: 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  gno ){.        i
dab0: 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
dac0: 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e  eafOffset<pNew->
dad0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
dae0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
daf0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
db00: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
db10: 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c   = pIter->iTermL
db20: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  eafOffset;.     
db30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
db40: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  {.        int iR
db50: 6f 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a  owidOff, dummy;.
db60: 20 20 20 20 20 20 20 20 66 74 73 35 4c 65 61 66          fts5Leaf
db70: 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52  Header(pNew, &iR
db80: 6f 77 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79 29  owidOff, &dummy)
db90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52  ;.        if( iR
dba0: 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
dbb0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
dbc0: 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  f = pNew;.      
dbd0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
dbe0: 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f  Offset = iRowidO
dbf0: 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ff;.        }.  
dc00: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
dc10: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
dc20: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d  .        u8 *a =
dc30: 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e   &pIter->pLeaf->
dc40: 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  p[pIter->iLeafOf
dc50: 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70  fset];.        p
dc60: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
dc70: 74 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  t += fts5GetVari
dc80: 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74  nt(a, (u64*)&pIt
dc90: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
dca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dcb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dcc0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
dcd0: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a  (pNew);.      }.
dce0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
dcf0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
dd00: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
dd10: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
dd20: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
dd30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
dd40: 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61  rue if the itera
dd50: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
dd60: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
dd70: 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
dd80: 6f 69 6e 74 73 20 74 6f 20 61 20 64 65 6c 65 74  oints to a delet
dd90: 65 20 6d 61 72 6b 65 72 2e 20 41 20 64 65 6c 65  e marker. A dele
dda0: 74 65 20 6d 61 72 6b 65 72 20 69 73 20 61 6e 20  te marker is an 
ddb0: 65 6e 74 72 79 20 77 69 74 68 20 61 20 30 20 62  entry with a 0 b
ddc0: 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d  yte.** position-
ddd0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
dde0: 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
ddf0: 72 49 73 45 6d 70 74 79 28 46 74 73 35 49 6e 64  rIsEmpty(Fts5Ind
de00: 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69  ex *p, Fts5Multi
de10: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
de20: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
de30: 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
de40: 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
de50: 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20  t[1].iFirst];.  
de60: 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
de70: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65 67  QLITE_OK && pSeg
de80: 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d  ->pLeaf && pSeg-
de90: 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  >nPos==0);.}../*
dea0: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72  .** Advance iter
deb0: 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68  ator pIter to th
dec0: 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
ded0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
dee0: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
def0: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
df00: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
df10: 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a  rror code. It .*
df20: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
df30: 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
df40: 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
df50: 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20  ches EOF. If an 
df60: 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
df70: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
df80: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
df90: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
dfa0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
dfb0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
dfc0: 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  egIterNext(.  Ft
dfd0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dff0: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
e000: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
e010: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
e020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
e030: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
e040: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77   */.  int *pbNew
e050: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
e060: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
e070: 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a  t for new term *
e080: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
e090: 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a  bNewTerm==0 || *
e0a0: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a  pbNewTerm==0 );.
e0b0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
e0c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
e0d0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
e0e0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
e0f0: 56 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20 61  VERSE ){.      a
e100: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e  ssert( pIter->pN
e110: 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  extLeaf==0 );.  
e120: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
e130: 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29 7b  RowidOffset>0 ){
e140: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d  .        u8 *a =
e150: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
e160: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
e170: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ff;.        int 
e180: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 6e  nPos;.        in
e190: 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20  t bDummy;.      
e1a0: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20    i64 iDelta;.. 
e1b0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
e1c0: 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 20 20  owidOffset--;.  
e1d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
e1e0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20  afOffset = iOff 
e1f0: 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  = pIter->aRowidO
e200: 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f  ffset[pIter->iRo
e210: 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  widOffset];.    
e220: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
e230: 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
e240: 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  a[iOff], &nPos, 
e250: 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  &bDummy);.      
e260: 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
e270: 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
e280: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
e290: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
e2a0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e2b0: 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b  Rowid -= iDelta;
e2c0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
e2d0: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
e2e0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  pIter);.      }e
e2f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
e300: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
e310: 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
e320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e330: 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 44  lse{.      Fts5D
e340: 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
e350: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
e360: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
e370: 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
e380: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  0;.      int nKe
e390: 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ep = 0;..      /
e3a0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
e3b0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69   end of the posi
e3c0: 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e  tion list within
e3d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
e3e0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  e. */.      u8 *
e3f0: 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  a = pLeaf->p;.  
e400: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65 61      int n = pLea
e410: 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f 66  f->n;..      iOf
e420: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
e430: 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e  Offset + pIter->
e440: 6e 50 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66 28  nPos;..      if(
e450: 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
e460: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65     /* The next e
e470: 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63  ntry is on the c
e480: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
e490: 20 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74         u64 iDelt
e4a0: 61 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  a;.        iOff 
e4b0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
e4c0: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
e4d0: 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  , &iDelta);.    
e4e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e4f0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
e500: 20 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74         if( iDelt
e510: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
e520: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
e530: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f            if( iO
e540: 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  ff>=n ){.       
e550: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
e560: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
e570: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
e580: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e590: 65 74 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  et = 4;.        
e5a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 4f 66 66    }else if( iOff
e5b0: 21 3d 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  !=fts5GetU16(&a[
e5c0: 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2]) ){.         
e5d0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e5e0: 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74  ffset += fts5Get
e5f0: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
e600: 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
e610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
e620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e630: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
e640: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20   iDelta;.       
e650: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
e660: 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d  f( pIter->pSeg==
e670: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
e680: 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30  st u8 *pList = 0
e690: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
e6a0: 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a 20 20 20  char *zTerm;.   
e6b0: 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a       int nList;.
e6c0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
e6d0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e6e0: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
e6f0: 45 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ERM) ){.        
e700: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
e710: 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61  hScanNext(p->pHa
e720: 73 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  sh);.          s
e730: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
e740: 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68  anEntry(p->pHash
e750: 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74  , &zTerm, &pList
e760: 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  , &nList);.     
e770: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e780: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
e790: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
e7a0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
e7b0: 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
e7c0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
e7d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e7e0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e7f0: 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38  ->pLeaf->p = (u8
e800: 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  *)pList;.       
e810: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
e820: 3e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  >n = nList;.    
e830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
e840: 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
e850: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
e860: 20 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20   strlen(zTerm), 
e870: 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20  (u8*)zTerm);.   
e880: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
e890: 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
e8a0: 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74 2c  GetVarint(pList,
e8b0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
e8c0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
e8d0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
e8e0: 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b         iOff = 0;
e8f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  .        /* Next
e900: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
e910: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
e920: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  e */.        whi
e930: 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  le( iOff==0 ){. 
e940: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
e950: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
e960: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
e970: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
e980: 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20  >pLeaf;.        
e990: 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
e9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e9b0: 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74    if( (iOff = ft
e9c0: 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
e9d0: 3e 70 5b 30 5d 29 29 20 26 26 20 69 4f 66 66 3c  >p[0])) && iOff<
e9e0: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
e9f0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
ea00: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
ea10: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
ea20: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
ea30: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
ea40: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ea50: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
ea60: 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ff;.          }.
ea70: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
ea80: 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47  f( (iOff = fts5G
ea90: 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
eaa0: 32 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  2])) ){.        
eab0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
eac0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
ead0: 20 20 20 20 20 20 20 20 20 20 20 62 4e 65 77 54             bNewT
eae0: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
eaf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
eb00: 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e  f( iOff>=pLeaf->
eb10: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
eb20: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
eb30: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
eb40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
eb50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
eb60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
eb70: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
eb80: 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20  iterator is now 
eb90: 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72  at EOF. If so, r
eba0: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a  eturn early. */.
ebb0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
ebc0: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
ebd0: 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29    if( bNewTerm )
ebe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
ebf0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
ec00: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
ec10: 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ERM ){.         
ec20: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
ec30: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
ec40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
ec50: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
ec60: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
ec70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
ec80: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
ec90: 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70  (p, pIter, nKeep
eca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
ecb0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
ecc0: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
ecd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 62            if( pb
ece0: 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77  NewTerm ) *pbNew
ecf0: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
ed00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
ed10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
ed20: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
ed30: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
ed40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ed50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65      }.  }.}..#de
ed60: 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20  fine SWAPVAL(T, 
ed70: 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74  a, b) { T tmp; t
ed80: 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70  mp=a; a=b; b=tmp
ed90: 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  ; }../*.** Itera
eda0: 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
edb0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
edc0: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  e first rowid in
edd0: 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73   a doclist. This
ede0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  .** function set
edf0: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75  s the iterator u
ee00: 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74  p so that iterat
ee10: 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
ee20: 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  der through.** t
ee30: 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73  he doclist..*/.s
ee40: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ee50: 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74  egIterReverse(Ft
ee60: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
ee70: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
ee80: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
ee90: 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72   *pDlidx = pIter
eea0: 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35  ->pDlidx;.  Fts5
eeb0: 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b  Data *pLast = 0;
eec0: 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
eed0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69  = 0;..  if( pDli
eee0: 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  dx ){.    int iS
eef0: 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
ef00: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
ef10: 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44  pgnoLast = fts5D
ef20: 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
ef30: 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20  idx);.    pLast 
ef40: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
ef50: 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
ef60: 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20  OWID(iSegid, 0, 
ef70: 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65  pgnoLast));.  }e
ef80: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  lse{.    int iOf
ef90: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
efc0: 77 69 74 68 69 6e 20 70 4c 65 61 66 20 2a 2f 0a  within pLeaf */.
efd0: 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
efe0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
eff0: 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  af;         /* C
f000: 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61  urrent leaf data
f010: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72   */..    /* Curr
f020: 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74  ently, Fts5SegIt
f030: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 28  er.iLeafOffset (
f040: 61 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e 74 73  and iOff) points
f050: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 0a 20   to the first . 
f060: 20 20 20 2a 2a 20 62 79 74 65 20 6f 66 20 70 6f     ** byte of po
f070: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74  sition-list cont
f080: 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  ent for the curr
f090: 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20  ent rowid. Back 
f0a0: 69 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 6f 20  it up.    ** so 
f0b0: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
f0c0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f0d0: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
f0e0: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a   size field. */.
f0f0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f100: 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69 74 65  Offset -= sqlite
f110: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65  3Fts5GetVarintLe
f120: 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b  n(pIter->nPos*2+
f130: 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20  pIter->bDel);.  
f140: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
f150: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
f160: 20 61 73 73 65 72 74 28 20 69 4f 66 66 3e 3d 34   assert( iOff>=4
f170: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   );..    /* Sear
f180: 63 68 20 66 6f 72 20 61 20 6e 65 77 20 74 65 72  ch for a new ter
f190: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  m within the cur
f1a0: 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20 6f 6e  rent leaf. If on
f1b0: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 0a  e can be found,.
f1c0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73      ** then this
f1d0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74   page contains t
f1e0: 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64  he largest rowid
f1f0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
f200: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 77 68   term. */.    wh
f210: 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ile( iOff<pLeaf-
f220: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >n ){.      int 
f230: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 36 34 20  nPos;.      i64 
f240: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 6e  iDelta;.      in
f250: 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 20  t bDummy;..     
f260: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 6f 73   /* Read the pos
f270: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
f280: 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 69  field */.      i
f290: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  Off += fts5GetPo
f2a0: 73 6c 69 73 74 53 69 7a 65 28 26 70 4c 65 61 66  slistSize(&pLeaf
f2b0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73  ->p[iOff], &nPos
f2c0: 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
f2d0: 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
f2e0: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
f2f0: 70 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b  pLeaf->n ) break
f300: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;..      /* Rowi
f310: 64 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20  d delta. Or, if 
f320: 30 78 30 30 2c 20 74 68 65 20 65 6e 64 20 6f 66  0x00, the end of
f330: 20 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e   doclist marker.
f340: 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d   */.      nPos =
f350: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
f360: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
f370: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
f380: 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61        if( iDelta
f390: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
f3a0: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b     iOff += nPos;
f3b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f3c0: 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  f this condition
f3d0: 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68   is true then th
f3e0: 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20  e largest rowid 
f3f0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
f400: 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20      ** term may 
f410: 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e  not be stored on
f420: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
f430: 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72  e. So search for
f440: 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73  ward to.    ** s
f450: 65 65 20 77 68 65 72 65 20 73 61 69 64 20 72 6f  ee where said ro
f460: 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20  wid really is.  
f470: 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  */.    if( iOff>
f480: 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  =pLeaf->n ){.   
f490: 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20     int pgno;.   
f4a0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
f4b0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
f4c0: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20  pIter->pSeg;..  
f4d0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20      /* The last 
f4e0: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
f4f0: 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  list may not be 
f500: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
f510: 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20  age. Search.    
f520: 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20    ** forward to 
f530: 66 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f  find the page co
f540: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73  ntaining the las
f550: 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20  t rowid.  */.   
f560: 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65     for(pgno=pIte
f570: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20  r->iLeafPgno+1; 
f580: 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d  !p->rc && pgno<=
f590: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20  pSeg->pgnoLast; 
f5a0: 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pgno++){.       
f5b0: 20 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35   i64 iAbs = FTS5
f5c0: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
f5d0: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  Seg->iSegid, 0, 
f5e0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46  pgno);.        F
f5f0: 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20  ts5Data *pNew = 
f600: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
f610: 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69  iAbs);.        i
f620: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
f630: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c       int iRowid,
f640: 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
f650: 20 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72    fts5LeafHeader
f660: 28 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 2c 20  (pNew, &iRowid, 
f670: 26 69 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20  &iTerm);.       
f680: 20 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b     if( iRowid ){
f690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 57 41  .            SWA
f6a0: 50 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20  PVAL(Fts5Data*, 
f6b0: 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20  pNew, pLast);.  
f6c0: 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61            pgnoLa
f6d0: 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  st = pgno;.     
f6e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f6f0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
f700: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
f710: 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 62 72    if( iTerm ) br
f720: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
f730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f740: 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20  ..  /* If pLast 
f750: 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20  is NULL at this 
f760: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  point, then the 
f770: 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74  last rowid for t
f780: 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a  his doclist.  **
f790: 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
f7a0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69  e currently indi
f7b0: 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
f7c0: 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  rator. In this c
f7d0: 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d  ase .  ** pIter-
f7e0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20  >iLeafOffset is 
f7f0: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 70  already set to p
f800: 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69  oint to the posi
f810: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20  tion-list size. 
f820: 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69   ** field associ
f830: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
f840: 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
f850: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
f860: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66    **.  ** Or, if
f870: 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55   pLast is non-NU
f880: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  LL, then it is t
f890: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
f8a0: 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20  tains the last. 
f8b0: 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68   ** rowid. In th
f8c0: 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72  is case configur
f8d0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  e the iterator s
f8e0: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
f8f0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   to the.  ** fir
f900: 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73  st rowid on this
f910: 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
f920: 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69  ( pLast ){.    i
f930: 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 6e  nt dummy;.    in
f940: 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35  t iOff;.    fts5
f950: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
f960: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70  r->pLeaf);.    p
f970: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c  Iter->pLeaf = pL
f980: 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ast;.    pIter->
f990: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f  iLeafPgno = pgno
f9a0: 4c 61 73 74 3b 0a 20 20 20 20 66 74 73 35 4c 65  Last;.    fts5Le
f9b0: 61 66 48 65 61 64 65 72 28 70 4c 61 73 74 2c 20  afHeader(pLast, 
f9c0: 26 69 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a  &iOff, &dummy);.
f9d0: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
f9e0: 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74  GetVarint(&pLast
f9f0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
fa00: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
fa10: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
fa20: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
fa30: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
fa40: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
fa50: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  ge(p, pIter);.}.
fa60: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
fa70: 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
fa80: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
fa90: 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64  rst rowid of a d
faa0: 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65  oclist..** There
fab0: 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
fac0: 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
fad0: 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65  ith the final te
fae0: 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  rm on the curren
faf0: 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74  t .** page. If t
fb00: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
fb10: 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  is the last term
fb20: 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f   on the page, lo
fb30: 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69  ad the .** docli
fb40: 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69  st-index from di
fb50: 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  sk and initializ
fb60: 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74  e an iterator at
fb70: 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29   (pIter->pDlidx)
fb80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fb90: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
fba0: 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20  Dlidx(Fts5Index 
fbb0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
fbc0: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
fbd0: 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  Seg = pIter->pSe
fbe0: 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  g->iSegid;.  int
fbf0: 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e   bRev = (pIter->
fc00: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
fc10: 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20  ITER_REVERSE);. 
fc20: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
fc30: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
fc40: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66   /* Current leaf
fc50: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65   data */..  asse
fc60: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
fc70: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
fc80: 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
fc90: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
fca0: 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  dx==0 );..  /* C
fcb0: 68 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72  heck if the curr
fcc0: 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73  ent doclist ends
fcd0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49   on this page. I
fce0: 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72  f it does, retur
fcf0: 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74  n.  ** early wit
fd00: 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65  hout loading the
fd10: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28   doclist-index (
fd20: 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f  as it belongs to
fd30: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a   a different.  *
fd40: 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28  * term. */.  if(
fd50: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
fd60: 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c  fPgno==pIter->iL
fd70: 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 69  eafPgno ){.    i
fd80: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
fd90: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70  >iLeafOffset + p
fda0: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  Iter->nPos;.    
fdb0: 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61  while( iOff<pLea
fdc0: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  f->n ){.      in
fdd0: 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20  t bDummy;.      
fde0: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
fdf0: 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20  i64 iDelta;..   
fe00: 20 20 20 2f 2a 20 69 4f 66 66 20 69 73 20 63 75     /* iOff is cu
fe10: 72 72 65 6e 74 6c 79 20 74 68 65 20 6f 66 66 73  rrently the offs
fe20: 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  et of the start 
fe30: 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
fe40: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69   data */.      i
fe50: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
fe60: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
fe70: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
fe80: 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lta);.      if( 
fe90: 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65 74 75  iDelta==0 ) retu
fea0: 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rn;.      assert
feb0: 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  _nc( iOff<pLeaf-
fec0: 3e 6e 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  >n );.      iOff
fed0: 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
fee0: 73 74 53 69 7a 65 28 26 70 4c 65 61 66 2d 3e 70  stSize(&pLeaf->p
fef0: 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
ff00: 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69  bDummy);.      i
ff10: 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
ff20: 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d   }.  }..  pIter-
ff30: 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c  >pDlidx = fts5Dl
ff40: 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62  idxIterInit(p, b
ff50: 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72  Rev, iSeg, pIter
ff60: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
ff70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
ff80: 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
ff90: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ffa0: 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
ffb0: 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65  erm within segme
ffc0: 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74  nt.** pSeg. If t
ffd0: 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
ffe0: 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65  term in the inde
fff0: 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  x, the iterator 
10000 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
10010 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10020 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
10030 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
10040 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
10050 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
10060 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
10070 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
10080 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
10090 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
100a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
100b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
100c0 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
100d0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
10100 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  nd */.  const u8
10110 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
10120 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm,     /* Term 
10130 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20  to seek to */.  
10140 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49  /* Mask of FTS5I
10170 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a  NDEX_XXX flags *
10180 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
10190 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
101a0 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
101b0 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
101c0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
101d0 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
101e0 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
101f0 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
10200 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20 20   int iPg = 1;.  
10210 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 62 47 65  int h;.  int bGe
10220 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35   = (flags & FTS5
10230 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
10240 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20  );.  int bDlidx 
10250 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10260 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
10270 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  there is a docli
10280 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74  st-index */.  Ft
10290 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 0a  s5Data *pLeaf;..
102a0 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30    assert( bGe==0
102b0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
102c0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
102d0 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  C)==0 );.  asser
102e0 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72  t( pTerm && nTer
102f0 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  m );.  memset(pI
10300 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
10310 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
10320 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a  ->pSeg = pSeg;..
10330 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
10340 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61  sets stack varia
10350 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c  ble iPg to the l
10360 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
10370 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f  that may.  ** co
10380 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72  ntain term (pTer
10390 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20  m/nTerm), if it 
103a0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
103b0 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  e segment. */.  
103c0 66 6f 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65 69  for(h=pSeg->nHei
103d0 67 68 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d 29  ght-1; h>0; h--)
103e0 7b 0a 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74  {.    Fts5NodeIt
103f0 65 72 20 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  er node;        
10400 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
10410 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69  rating through i
10420 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a 2f  nternal nodes */
10430 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
10440 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
10450 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
10460 64 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20 20 20  d, h, iPg);.    
10470 46 74 73 35 44 61 74 61 20 2a 70 4e 6f 64 65 20  Fts5Data *pNode 
10480 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
10490 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69  , iRowid);.    i
104a0 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72  f( pNode==0 ) br
104b0 65 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f  eak;..    fts5No
104c0 64 65 49 74 65 72 49 6e 69 74 28 70 4e 6f 64 65  deIterInit(pNode
104d0 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26  ->p, pNode->n, &
104e0 6e 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72  node);.    asser
104f0 74 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d  t( node.term.n==
10500 30 20 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20  0 );..    iPg = 
10510 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20  node.iChild;.   
10520 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62   bDlidx = node.b
10530 44 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72 28 66  Dlidx;.    for(f
10540 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
10550 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a  &p->rc, &node);.
10560 20 20 20 20 20 20 20 20 6e 6f 64 65 2e 61 44 61          node.aDa
10570 74 61 20 26 26 20 66 74 73 35 42 75 66 66 65 72  ta && fts5Buffer
10580 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64  CompareBlob(&nod
10590 65 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  e.term, pTerm, n
105a0 54 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20  Term)<=0;.      
105b0 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65    fts5NodeIterNe
105c0 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65  xt(&p->rc, &node
105d0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
105e0 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64  Pg = node.iChild
105f0 3b 0a 20 20 20 20 20 20 62 44 6c 69 64 78 20 3d  ;.      bDlidx =
10600 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20   node.bDlidx;.  
10610 20 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64 65    }.    fts5Node
10620 49 74 65 72 46 72 65 65 28 26 6e 6f 64 65 29 3b  IterFree(&node);
10630 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
10640 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d  ease(pNode);.  }
10650 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67  ..  if( iPg<pSeg
10660 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20  ->pgnoFirst ){. 
10670 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70     iPg = pSeg->p
10680 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44  gnoFirst;.    bD
10690 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lidx = 0;.  }.. 
106a0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
106b0 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66  o = iPg - 1;.  f
106c0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
106d0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  ge(p, pIter);.. 
106e0 20 69 66 28 20 28 70 4c 65 61 66 20 3d 20 70 49   if( (pLeaf = pI
106f0 74 65 72 2d 3e 70 4c 65 61 66 29 20 29 7b 0a 20  ter->pLeaf) ){. 
10700 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
10710 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10720 65 74 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  et = fts5GetU16(
10730 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20  &pLeaf->p[2]);. 
10740 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c     if( pIter->iL
10750 65 61 66 4f 66 66 73 65 74 3c 34 20 7c 7c 20 70  eafOffset<4 || p
10760 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10770 74 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  t>=pLeaf->n ){. 
10780 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
10790 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
107a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
107b0 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
107c0 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20  p, pIter, 0);.  
107d0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
107e0 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
107f0 29 3b 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  );.      do {.  
10800 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35        res = fts5
10810 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f  BufferCompareBlo
10820 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  b(&pIter->term, 
10830 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
10840 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d         if( res>=
10850 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
10860 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
10870 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  xt(p, pIter, 0);
10880 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70  .      }while( p
10890 49 74 65 72 2d 3e 70 4c 65 61 66 20 26 26 20 70  Iter->pLeaf && p
108a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
108b0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 47  );..      if( bG
108c0 65 3d 3d 30 20 26 26 20 72 65 73 20 29 7b 0a 20  e==0 && res ){. 
108d0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69 74         /* Set it
108e0 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20  erator to point 
108f0 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 20 20 20 20  to EOF */.      
10900 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
10910 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
10920 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
10930 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  pLeaf = 0;.     
10940 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10950 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10960 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29  E_OK && bGe==0 )
10970 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61  {.    pIter->fla
10980 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
10990 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20  ER_ONETERM;.    
109a0 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
109b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c   ){.      if( fl
109c0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
109d0 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
109e0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61        pIter->fla
109f0 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
10a00 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  ER_REVERSE;.    
10a10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44    }.      if( bD
10a20 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  lidx ){.        
10a30 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
10a40 6c 69 64 78 28 70 2c 20 70 49 74 65 72 29 3b 0a  lidx(p, pIter);.
10a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10a60 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
10a70 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29  DEX_QUERY_DESC )
10a80 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
10a90 67 49 74 65 72 52 65 76 65 72 73 65 28 70 2c 20  gIterReverse(p, 
10aa0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
10ab0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10ac0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
10ad0 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  e object pIter t
10ae0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20  o point to term 
10af0 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68  pTerm/nTerm with
10b00 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  in the.** in-mem
10b10 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20  ory hash table. 
10b20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
10b30 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
10b40 68 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20  hash-table, the 
10b50 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20  .** iterator is 
10b60 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a  set to EOF..**.*
10b70 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
10b80 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
10b90 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
10ba0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
10bb0 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61  r code. If .** a
10bc0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
10bd0 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
10be0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
10bf0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
10c00 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10c10 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
10c20 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20  IterHashInit(.  
10c30 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c50 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
10c60 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
10c70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
10c80 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
10c90 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  seek to */.  int
10ca0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cc0 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
10cd0 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  X_XXX flags */. 
10ce0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
10cf0 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
10d00 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
10d10 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63  pulate */.){.  c
10d20 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
10d30 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20   0;.  int nList 
10d40 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  = 0;.  const u8 
10d50 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20  *z = 0;.  int n 
10d60 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
10d70 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73  p->pHash );.  as
10d80 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
10d90 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
10da0 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c   pTerm==0 || (fl
10db0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
10dc0 51 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20  QUERY_SCAN) ){. 
10dd0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
10de0 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
10df0 69 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f  it(p->pHash, (co
10e00 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c  nst char*)pTerm,
10e10 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c   nTerm);.    sql
10e20 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
10e30 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Entry(p->pHash, 
10e40 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a  (const char**)&z
10e50 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
10e60 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20  );.    n = (z ? 
10e70 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68  strlen((const ch
10e80 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d  ar*)z) : 0);.  }
10e90 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
10ea0 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
10eb0 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
10ec0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
10ed0 61 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73  ashQuery(p->pHas
10ee0 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
10ef0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70  pTerm, nTerm, &p
10f00 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
10f10 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20     z = pTerm;.  
10f20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d    n = nTerm;.  }
10f30 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ..  if( pList ){
10f40 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
10f50 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65  Leaf;.    sqlite
10f60 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
10f70 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
10f80 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  erm, n, z);.    
10f90 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d  pLeaf = fts5IdxM
10fa0 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
10fb0 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20  Fts5Data));.    
10fc0 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72  if( pLeaf==0 ) r
10fd0 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66  eturn;.    pLeaf
10fe0 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74  ->p = (u8*)pList
10ff0 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 20 3d  ;.    pLeaf->n =
11000 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   nList;.    pIte
11010 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66  r->pLeaf = pLeaf
11020 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
11030 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
11040 65 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e  etVarint(pLeaf->
11050 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
11060 3e 69 52 6f 77 69 64 29 3b 0a 0a 20 20 20 20 69  >iRowid);..    i
11070 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
11080 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
11090 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
110a0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
110b0 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
110c0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
110d0 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
110e0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
110f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
11100 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
11110 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
11120 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65  .  }.}../*.** Ze
11130 72 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ro the iterator 
11140 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
11150 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
11160 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11170 53 65 67 49 74 65 72 43 6c 65 61 72 28 46 74 73  SegIterClear(Fts
11180 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
11190 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  {.  fts5BufferFr
111a0 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29  ee(&pIter->term)
111b0 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
111c0 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
111d0 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  );.  fts5DataRel
111e0 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78  ease(pIter->pNex
111f0 74 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c  tLeaf);.  fts5Dl
11200 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65  idxIterFree(pIte
11210 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71  r->pDlidx);.  sq
11220 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
11230 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b  ->aRowidOffset);
11240 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
11250 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
11260 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66  egIter));.}..#if
11270 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11280 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11290 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
112a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67   part of the big
112b0 20 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64   assert() proced
112c0 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ure implemented 
112d0 62 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74  by.** fts5Assert
112e0 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29  MultiIterSetup()
112f0 2e 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61  . It ensures tha
11300 74 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72  t the result cur
11310 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a  rently stored.**
11320 20 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65   in *pRes is the
11330 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20   correct result 
11340 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  of comparing the
11350 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
11360 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ns of the.** two
11370 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73   iterators..*/.s
11380 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
11390 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
113a0 65 73 75 6c 74 28 0a 20 20 46 74 73 35 4d 75 6c  esult(.  Fts5Mul
113b0 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
113c0 2c 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  , .  Fts5SegIter
113d0 20 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49   *p1,.  Fts5SegI
113e0 74 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43  ter *p2,.  Fts5C
113f0 52 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a  Result *pRes.){.
11400 20 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20    int i1 = p1 - 
11410 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69  pIter->aSeg;.  i
11420 6e 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74  nt i2 = p2 - pIt
11430 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28  er->aSeg;..  if(
11440 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32   p1->pLeaf || p2
11450 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69  ->pLeaf ){.    i
11460 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p1->pLeaf==0 
11470 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11480 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
11490 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2 );.    }else i
114a0 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p2->pLeaf==0 
114b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
114c0 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
114d0 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1 );.    }else{.
114e0 20 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d        int nMin =
114f0 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c   MIN(p1->term.n,
11500 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20   p2->term.n);.  
11510 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65      int res = me
11520 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c  mcmp(p1->term.p,
11530 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69   p2->term.p, nMi
11540 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  n);.      if( re
11550 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d  s==0 ) res = p1-
11560 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65  >term.n - p2->te
11570 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28  rm.n;..      if(
11580 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
11590 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
115a0 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20  >bTermEq==1 );. 
115b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
115c0 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69  1->iRowid!=p2->i
115d0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
115e0 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f   res = ((p1->iRo
115f0 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64  wid > p2->iRowid
11600 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20  )==pIter->bRev) 
11610 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20  ? -1 : 1;.      
11620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
11630 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
11640 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rmEq==0 );.     
11650 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65   }..      if( re
11660 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  s<0 ){.        a
11670 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
11680 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20  rst==i1 );.     
11690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
116a0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
116b0 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20  irst==i2 );.    
116c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
116d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
116e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
116f0 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45  unless SQLITE_DE
11700 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 20 77  BUG is defined w
11710 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a  hen this module.
11720 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20  ** is compiled. 
11730 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
11740 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
11750 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73  ssentially an as
11760 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
11770 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72  ment used to ver
11780 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ify that the con
11790 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74  tents of the pIt
117a0 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72  er->aFirst[] arr
117b0 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63  ay.** are correc
117c0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
117d0 64 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  d fts5AssertMult
117e0 69 49 74 65 72 53 65 74 75 70 28 46 74 73 35 49  iIterSetup(Fts5I
117f0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c  ndex *p, Fts5Mul
11800 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
11810 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
11820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11830 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73 73   int i;..    ass
11840 65 72 74 28 20 28 70 49 74 65 72 2d 3e 61 53 65  ert( (pIter->aSe
11850 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
11860 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65  [1].iFirst ].pLe
11870 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62  af==0)==pIter->b
11880 45 6f 66 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  Eof );..    for(
11890 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
118a0 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  eg; i+=2){.     
118b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
118c0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
118d0 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65  i];.      Fts5Se
118e0 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74  gIter *p2 = &pIt
118f0 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20  er->aSeg[i+1];. 
11900 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74       Fts5CResult
11910 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
11920 3e 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e  >aFirst[(pIter->
11930 6e 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a  nSeg + i) / 2];.
11940 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
11950 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
11960 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20  (pIter, p1, p2, 
11970 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pRes);.    }..  
11980 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49    for(i=1; i<(pI
11990 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20  ter->nSeg / 2); 
119a0 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73  i+=2){.      Fts
119b0 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26  5SegIter *p1 = &
119c0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
119d0 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e  er->aFirst[i*2].
119e0 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20  iFirst ];.      
119f0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20  Fts5SegIter *p2 
11a00 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
11a10 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a  pIter->aFirst[i*
11a20 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  2+1].iFirst ];. 
11a30 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74       Fts5CResult
11a40 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
11a50 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20  >aFirst[i];.    
11a60 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70    fts5AssertComp
11a70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74  arisonResult(pIt
11a80 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73  er, p1, p2, pRes
11a90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
11aa0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
11ab0 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
11ac0 72 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64  rSetup(x,y).#end
11ad0 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65  if../*.** Do the
11ae0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65   comparison nece
11af0 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74  ssary to populat
11b00 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
11b10 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  iOut]..**.** If 
11b20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
11b30 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ue is non-zero, 
11b40 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69  then it is the i
11b50 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79  ndex of an entry
11b60 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72  .** in the pIter
11b70 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74  ->aSeg[] array t
11b80 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61  hat is (a) not a
11b90 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70  t EOF, and (b) p
11ba0 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
11bb0 6b 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75  key that is a du
11bc0 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
11bd0 65 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72  er, higher prior
11be0 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  ity, .** segment
11bf0 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65  -iterator in the
11c00 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72   pSeg->aSeg[] ar
11c10 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
11c20 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
11c30 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 4d 75  DoCompare(Fts5Mu
11c40 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
11c50 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20  r, int iOut){.  
11c60 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20 20  int i1;         
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74  /* Index of left
11c90 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
11ca0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20  r */.  int i2;  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11cd0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74  of right-hand Ft
11ce0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
11cf0 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53  nt iRes;.  Fts5S
11d00 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20  egIter *p1;     
11d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
11d20 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
11d30 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ter */.  Fts5Seg
11d40 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20  Iter *p2;       
11d50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
11d60 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
11d70 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  er */.  Fts5CRes
11d80 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74  ult *pRes = &pIt
11d90 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d  er->aFirst[iOut]
11da0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75  ;..  assert( iOu
11db0 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26  t<pIter->nSeg &&
11dc0 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73   iOut>0 );.  ass
11dd0 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76  ert( pIter->bRev
11de0 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52  ==0 || pIter->bR
11df0 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ev==1 );..  if( 
11e00 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53  iOut>=(pIter->nS
11e10 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20  eg/2) ){.    i1 
11e20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d  = (iOut - pIter-
11e30 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20  >nSeg/2) * 2;.  
11e40 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20    i2 = i1 + 1;. 
11e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d   }else{.    i1 =
11e60 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
11e70 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20  Out*2].iFirst;. 
11e80 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61     i2 = pIter->a
11e90 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e  First[iOut*2+1].
11ea0 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31  iFirst;.  }.  p1
11eb0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
11ec0 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74  i1];.  p2 = &pIt
11ed0 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20  er->aSeg[i2];.. 
11ee0 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d   pRes->bTermEq =
11ef0 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c   0;.  if( p1->pL
11f00 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  eaf==0 ){       
11f10 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20      /* If p1 is 
11f20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52  at EOF */.    iR
11f30 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65  es = i2;.  }else
11f40 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d   if( p2->pLeaf==
11f50 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70  0 ){     /* If p
11f60 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  2 is at EOF */. 
11f70 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20     iRes = i1;.  
11f80 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
11f90 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43  es = fts5BufferC
11fa0 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d  ompare(&p1->term
11fb0 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20  , &p2->term);.  
11fc0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
11fd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
11fe0 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >i1 );.      ass
11ff0 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20  ert( i2!=0 );.  
12000 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45      pRes->bTermE
12010 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  q = 1;.      if(
12020 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d   p1->iRowid==p2-
12030 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
12040 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32     p1->bDel = p2
12050 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20  ->bDel;.        
12060 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20  return i2;.     
12070 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28   }.      res = (
12080 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
12090 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
120a0 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b  ->bRev) ? -1 : +
120b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
120c0 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20  ert( res!=0 );. 
120d0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
120e0 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b        iRes = i1;
120f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12100 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20    iRes = i2;.   
12110 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e   }.  }..  pRes->
12120 69 46 69 72 73 74 20 3d 20 69 52 65 73 3b 0a 20  iFirst = iRes;. 
12130 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
12140 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67  .** Move the seg
12150 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69 74  -iter so that it
12160 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
12170 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61  irst rowid on pa
12180 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a  ge iLeafPgno..**
12190 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
121a0 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e  if leaf iLeafPgn
121b0 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  o does not exist
121c0 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   or contains no 
121d0 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  rowids..*/.stati
121e0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
121f0 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74  erGotoPage(.  Ft
12200 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12220 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
12230 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
12240 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
12250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
12260 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
12270 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
12280 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  gno.){.  assert(
12290 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
122a0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
122b0 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e    if( iLeafPgno>
122c0 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e  pIter->pSeg->pgn
122d0 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  oLast ){.    p->
122e0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
122f0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
12300 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
12310 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
12320 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e  );.    pIter->pN
12330 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  extLeaf = 0;.   
12340 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
12350 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b  o = iLeafPgno-1;
12360 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
12370 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
12380 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
12390 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
123a0 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   || pIter->iLeaf
123b0 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20  Pgno==iLeafPgno 
123c0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  );..    if( p->r
123d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
123e0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
123f0 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49        u8 *a = pI
12400 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
12410 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74       int n = pIt
12420 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20  er->pLeaf->n;.. 
12430 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35       iOff = fts5
12440 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20  GetU16(&a[0]);. 
12450 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20       if( iOff<4 
12460 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20  || iOff>=n ){.  
12470 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
12480 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
12490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
124a0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
124b0 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
124c0 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
124d0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
124e0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
124f0 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
12500 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
12510 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
12520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12530 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
12540 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
12550 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
12560 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12570 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f  until it is at o
12580 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64  r .** past rowid
12590 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65   iFrom. Regardle
125a0 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
125b0 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74  of iFrom, the it
125c0 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77  erator is.** alw
125d0 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74 20  ays advanced at 
125e0 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73  least once..*/.s
125f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
12600 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a  egIterNextFrom(.
12610 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
12640 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
12650 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
12660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
12670 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
12680 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d  ance */.  i64 iM
12690 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  atch            
126a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
126b0 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61 74  ance iterator at
126c0 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72 20   least this far 
126d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76  */.){.  int bRev
126e0 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73   = (pIter->flags
126f0 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
12700 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35  REVERSE);.  Fts5
12710 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
12720 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  x = pIter->pDlid
12730 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  x;.  int iLeafPg
12740 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
12750 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f  fPgno;.  int bMo
12760 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72  ve = 1;..  asser
12770 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
12780 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
12790 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
127a0 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
127b0 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x );.  assert( p
127c0 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a  Iter->pLeaf );..
127d0 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b    if( bRev==0 ){
127e0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73  .    while( !fts
127f0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
12800 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74   pDlidx) && iMat
12810 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72  ch>fts5DlidxIter
12820 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b  Rowid(pDlidx) ){
12830 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f  .      iLeafPgno
12840 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
12850 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
12860 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
12870 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
12880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
12890 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f  rt_nc( iLeafPgno
128a0 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  >=pIter->iLeafPg
128b0 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20  no || p->rc );. 
128c0 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f     if( iLeafPgno
128d0 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
128e0 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  o ){.      fts5S
128f0 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70  egIterGotoPage(p
12900 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67  , pIter, iLeafPg
12910 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  no);.      bMove
12920 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
12930 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
12940 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
12950 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  f==0 );.    asse
12960 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72  rt( iMatch<pIter
12970 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->iRowid );.    
12980 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64  while( !fts5Dlid
12990 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
129a0 64 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74  dx) && iMatch<ft
129b0 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
129c0 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20  (pDlidx) ){.    
129d0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
129e0 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a  rev(p, pDlidx);.
129f0 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50      }.    iLeafP
12a00 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
12a10 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
12a20 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74  ..    assert( ft
12a30 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
12a40 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65  , pDlidx) || iLe
12a50 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69  afPgno<=pIter->i
12a60 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20  LeafPgno );..   
12a70 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70   if( iLeafPgno<p
12a80 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
12a90 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
12aa0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61  iLeafPgno = iLea
12ab0 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66  fPgno+1;.      f
12ac0 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
12ad0 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65  eNewPage(p, pIte
12ae0 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20  r);.      bMove 
12af0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
12b00 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
12b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12b20 20 69 66 28 20 62 4d 6f 76 65 20 29 20 66 74 73   if( bMove ) fts
12b30 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
12b40 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69  pIter, 0);.    i
12b50 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
12b60 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12b70 69 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70  if( bRev==0 && p
12b80 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d  Iter->iRowid>=iM
12b90 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
12ba0 20 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26    if( bRev!=0 &&
12bb0 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d   pIter->iRowid<=
12bc0 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
12bd0 20 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20      bMove = 1;. 
12be0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   }.}.../*.** Fre
12bf0 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
12c00 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
12c10 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12c20 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
12c30 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
12c40 72 46 72 65 65 28 46 74 73 35 49 6e 64 65 78 20  rFree(Fts5Index 
12c50 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
12c60 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
12c70 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
12c80 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
12c90 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
12ca0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
12cb0 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
12cc0 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d  (&pIter->aSeg[i]
12cd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
12ce0 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
12cf0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
12d00 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
12d10 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74  erAdvanced(.  Ft
12d20 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d40 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
12d50 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
12d60 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
12d70 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
12d80 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
12d90 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73   to update aFirs
12da0 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f  t[] array for */
12db0 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c  .  int iChanged,
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
12de0 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74  ub-iterator just
12df0 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69   advanced */.  i
12e00 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20  nt iMinset      
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e20 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20  * Minimum entry 
12e30 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73  in aFirst[] to s
12e40 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  et */.){.  int i
12e50 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72  ;.  for(i=(pIter
12e60 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29  ->nSeg+iChanged)
12e70 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26  /2; i>=iMinset &
12e80 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
12e90 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20  OK; i=i/2){.    
12ea0 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28  int iEq;.    if(
12eb0 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
12ec0 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
12ed0 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20  Iter, i)) ){.   
12ee0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
12ef0 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53  xt(p, &pIter->aS
12f00 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20  eg[iEq], 0);.   
12f10 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53     i = pIter->nS
12f20 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a  eg + iEq;.    }.
12f30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62    }.}../*.** Sub
12f40 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67  -iterator iChang
12f50 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70  ed of iterator p
12f60 49 74 65 72 20 68 61 73 20 6a 75 73 74 20 62 65  Iter has just be
12f70 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20  en advanced. It 
12f80 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20  still.** points 
12f90 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d  to the same term
12fa0 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61   though - just a
12fb0 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64   different rowid
12fc0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
12fd0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
12fe0 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  pdate the conten
12ff0 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d  ts of the pIter-
13000 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64  >aFirst[] accord
13010 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20  ingly..** If it 
13020 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73 66  does so successf
13030 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72  ully, 0 is retur
13040 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31  ned. Otherwise 1
13050 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a  ..**.** If non-z
13060 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
13070 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   the caller shou
13080 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74  ld call fts5Mult
13090 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a  iIterAdvanced().
130a0 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74  ** on the iterat
130b0 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74  or instead. That
130c0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
130d0 68 65 20 73 61 6d 65 20 61 73 20 74 68 69 73 20  he same as this 
130e0 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  one, except.** t
130f0 68 61 74 20 69 74 20 64 65 61 6c 73 20 77 69 74  hat it deals wit
13100 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74  h more complicat
13110 65 64 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c  ed cases as well
13120 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
13130 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
13140 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74  vanceRowid(.  Ft
13150 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13170 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
13180 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
13190 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
131a0 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
131b0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
131c0 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73   to update aFirs
131d0 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f  t[] array for */
131e0 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 20  .  int iChanged 
131f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13200 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
13210 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74  ub-iterator just
13220 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a   advanced */.){.
13230 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 53    int i;.  Fts5S
13240 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26  egIter *pNew = &
13250 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61  pIter->aSeg[iCha
13260 6e 67 65 64 5d 3b 0a 20 20 46 74 73 35 53 65 67  nged];.  Fts5Seg
13270 49 74 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26  Iter *pOther = &
13280 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61  pIter->aSeg[iCha
13290 6e 67 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a  nged ^ 0x0001];.
132a0 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d  .  for(i=(pIter-
132b0 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f  >nSeg+iChanged)/
132c0 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  2; 1; i=i/2){.  
132d0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
132e0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
132f0 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 61 73  irst[i];..    as
13300 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61  sert( pNew->pLea
13310 66 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f );.    assert(
13320 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d   pRes->bTermEq==
13330 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65  0 || pOther->pLe
13340 61 66 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  af );.    .    i
13350 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  f( pRes->bTermEq
13360 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   ){.      if( pN
13370 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68  ew->iRowid==pOth
13380 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  er->iRowid ){.  
13390 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
133a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
133b0 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e  (pOther->iRowid>
133c0 70 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70  pNew->iRowid)==p
133d0 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20  Iter->bRev ){.  
133e0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74        pNew = pOt
133f0 68 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  her;.      }.   
13400 20 7d 0a 20 20 20 20 70 52 65 73 2d 3e 69 46 69   }.    pRes->iFi
13410 72 73 74 20 3d 20 28 70 4e 65 77 20 2d 20 70 49  rst = (pNew - pI
13420 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20  ter->aSeg);.    
13430 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b  if( i==1 ) break
13440 3b 0a 0a 20 20 20 20 70 4f 74 68 65 72 20 3d 20  ;..    pOther = 
13450 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
13460 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20  ter->aFirst[i ^ 
13470 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d  0x0001].iFirst ]
13480 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
13490 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
134a0 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66 20  the pIter->bEof 
134b0 76 61 72 69 61 62 6c 65 20 62 61 73 65 64 20 6f  variable based o
134c0 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  n the state of t
134d0 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72 73  he sub-iterators
134e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
134f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
13500 74 45 6f 66 28 46 74 73 35 4d 75 6c 74 69 53 65  tEof(Fts5MultiSe
13510 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
13520 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 70   pIter->bEof = p
13530 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
13540 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
13550 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 3b 0a  rst ].pLeaf==0;.
13560 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
13570 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
13580 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
13590 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
135a0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
135b0 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
135c0 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
135d0 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  It is not .** co
135e0 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
135f0 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
13600 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f  r reaches EOF, o
13610 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
13620 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68  dy at .** EOF wh
13630 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
13640 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
13650 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
13660 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20  ultiIterNext(.  
13670 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
13680 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
13690 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
136a0 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
136b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
136c0 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
136d0 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
136e0 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13700 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
13710 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
13720 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
13730 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13740 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  _OK ){.    int b
13750 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
13760 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
13770 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
13780 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
13790 69 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  irst;.      int 
137a0 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
137b0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
137c0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
137d0 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
137e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
137f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
13800 20 20 20 20 20 20 69 66 28 20 62 55 73 65 46 72        if( bUseFr
13810 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69  om && pSeg->pDli
13820 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  dx ){.        ft
13830 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
13840 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d  m(p, pSeg, iFrom
13850 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13860 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
13870 74 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  terNext(p, pSeg,
13880 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
13890 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
138a0 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c  pSeg->pLeaf==0 |
138b0 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20  | bNewTerm .    
138c0 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49     || fts5MultiI
138d0 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
138e0 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
138f0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
13900 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
13910 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65  Advanced(p, pIte
13920 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20  r, iFirst, 1);. 
13930 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
13940 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65 72  IterSetEof(pIter
13950 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13960 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
13970 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74  IterSetup(p, pIt
13980 65 72 29 3b 0a 0a 20 20 20 20 20 20 62 55 73 65  er);..      bUse
13990 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 77  From = 0;.    }w
139a0 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 62 53 6b  hile( pIter->bSk
139b0 69 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d  ipEmpty && fts5M
139c0 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
139d0 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d  p, pIter) );.  }
139e0 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 4d  .}..static Fts5M
139f0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 66 74 73  ultiSegIter *fts
13a00 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
13a10 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
13a40 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
13a50 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  thin */.  int nS
13a60 65 67 0a 29 7b 0a 20 20 46 74 73 35 4d 75 6c 74  eg.){.  Fts5Mult
13a70 69 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a  iSegIter *pNew;.
13a80 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20    int nSlot;    
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77    /* Power of tw
13ab0 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20  o >= nSeg */..  
13ac0 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c  for(nSlot=2; nSl
13ad0 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e  ot<nSeg; nSlot=n
13ae0 53 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20  Slot*2);.  pNew 
13af0 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  = fts5IdxMalloc(
13b00 70 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  p, .      sizeof
13b10 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65  (Fts5MultiSegIte
13b20 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a  r) +          /*
13b30 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   pNew */.      s
13b40 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65  izeof(Fts5SegIte
13b50 72 29 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b  r) * (nSlot-1) +
13b60 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67     /* pNew->aSeg
13b70 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  [] */.      size
13b80 6f 66 28 46 74 73 35 43 52 65 73 75 6c 74 29 20  of(Fts5CResult) 
13b90 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20  * nSlot         
13ba0 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b  /* pNew->aFirst[
13bb0 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  ] */.  );.  if( 
13bc0 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77  pNew ){.    pNew
13bd0 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a  ->nSeg = nSlot;.
13be0 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
13bf0 20 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a   = (Fts5CResult*
13c00 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c  )&pNew->aSeg[nSl
13c10 6f 74 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ot];.  }.  retur
13c20 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
13c30 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
13c40 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
13c50 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
13c60 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
13c70 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
13c80 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61  erate through da
13c90 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20  ta in structure 
13ca0 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69  pStruct..** If i
13cb0 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68  Level is -ve, th
13cc0 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61  en all data in a
13cd0 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d  ll segments is m
13ce0 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c  erged. Or, if iL
13cf0 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  evel.** is zero 
13d00 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61  or greater, data
13d10 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
13d20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74  nSegment segment
13d30 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65  s on level iLeve
13d40 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a  l.** is merged..
13d50 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
13d60 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69  or initially poi
13d70 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
13d80 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72   term/rowid entr
13d90 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65  y in the .** ite
13da0 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  rated data..*/.s
13db0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
13dc0 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46  ultiIterNew(.  F
13dd0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13df0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
13e00 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
13e10 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
13e20 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20  ure *pStruct,   
13e30 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
13e40 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69  re of specific i
13e50 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53  ndex */.  int bS
13e60 6b 69 70 45 6d 70 74 79 2c 20 20 20 20 20 20 20  kipEmpty,       
13e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13e80 65 20 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65  e to ignore dele
13e90 74 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74  te-keys */.  int
13ea0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ec0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
13ed0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  XXX flags */.  c
13ee0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
13ef0 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
13f00 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
13f10 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f  o (or NULL/0) */
13f20 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69     /* Level to i
13f50 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61  terate (-1 for a
13f60 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  ll) */.  int nSe
13f70 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
13f80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13f90 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
13fa0 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e  o merge (iLevel>
13fb0 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c  =0) */.  Fts5Mul
13fc0 74 69 53 65 67 49 74 65 72 20 2a 2a 70 70 4f 75  tiSegIter **ppOu
13fd0 74 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20  t        /* New 
13fe0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
13ff0 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20 20  nt nSeg = 0;    
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14010 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
14020 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65  ent-iters in use
14030 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20   */.  int iIter 
14040 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14050 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e        /* */.  in
14060 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14080 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
14090 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
140a0 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  s */.  Fts5Struc
140b0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b  tureLevel *pLvl;
140c0 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
140d0 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73  ter *pNew;..  as
140e0 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20  sert( (pTerm==0 
140f0 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20  && nTerm==0) || 
14100 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f  iLevel<0 );..  /
14110 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
14120 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c   for the new mul
14130 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e  ti-seg-iterator.
14140 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
14150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14160 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
14170 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14180 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
14190 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65  t==fts5Structure
141a0 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
141b0 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20  truct) );.      
141c0 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
141d0 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20  nSegment;.      
141e0 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73  nSeg += (p->pHas
141f0 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  h ? 1 : 0);.    
14200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65  }else{.      nSe
14210 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d  g = MIN(pStruct-
14220 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e  >aLevel[iLevel].
14230 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  nSeg, nSegment);
14240 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
14250 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
14260 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
14270 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20  p, nSeg);.  if( 
14280 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
14290 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d  ;.  pNew->bRev =
142a0 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54   (0!=(flags & FT
142b0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
142c0 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53  SC));.  pNew->bS
142d0 6b 69 70 45 6d 70 74 79 20 3d 20 62 53 6b 69 70  kipEmpty = bSkip
142e0 45 6d 70 74 79 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Empty;..  /* Ini
142f0 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20  tialize each of 
14300 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65  the component se
14310 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e  gment iterators.
14320 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c   */.  if( iLevel
14330 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  <0 ){.    Fts5St
14340 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
14350 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
14360 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
14370 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66 28 20  Level];.    if( 
14380 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20  p->pHash ){.    
14390 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65    /* Add a segme
143a0 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20  nt iterator for 
143b0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
143c0 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68  ents of the hash
143d0 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20   table. */.     
143e0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
143f0 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  ter = &pNew->aSe
14400 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20  g[iIter++];.    
14410 20 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73    fts5SegIterHas
14420 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20  hInit(p, pTerm, 
14430 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49  nTerm, flags, pI
14440 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
14450 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75 63  for(pLvl=&pStruc
14460 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c  t->aLevel[0]; pL
14470 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29  vl<pEnd; pLvl++)
14480 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  {.      for(iSeg
14490 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pLvl->nSeg-1; i
144a0 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b  Seg>=0; iSeg--){
144b0 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72  .        Fts5Str
144c0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
144d0 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
144e0 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
144f0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
14500 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  ter = &pNew->aSe
14510 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20  g[iIter++];.    
14520 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
14530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
14540 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c  s5SegIterInit(p,
14550 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20   pSeg, pIter);. 
14560 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14570 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
14580 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 70  terSeekInit(p, p
14590 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61  Term, nTerm, fla
145a0 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  gs, pSeg, pIter)
145b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
145c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
145d0 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  e{.    pLvl = &p
145e0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
145f0 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28  Level];.    for(
14600 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65  iSeg=nSeg-1; iSe
14610 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
14620 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14630 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61  Init(p, &pLvl->a
14640 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77  Seg[iSeg], &pNew
14650 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29  ->aSeg[iIter++])
14660 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
14670 73 65 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65  sert( iIter==nSe
14680 67 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  g );..  /* If th
14690 65 20 61 62 6f 76 65 20 77 61 73 20 73 75 63 63  e above was succ
146a0 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d  essful, each com
146b0 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73  ponent iterators
146c0 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a   now points .  *
146d0 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
146e0 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d  ntry in its segm
146f0 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ent. In this cas
14700 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  e initialize the
14710 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20   .  ** aFirst[] 
14720 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e  array. Or, if an
14730 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
14740 72 65 64 2c 20 66 72 65 65 20 74 68 65 20 69 74  red, free the it
14750 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65  erator.  ** obje
14760 63 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f  ct and set the o
14770 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
14780 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
14790 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
147a0 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49  OK ){.    for(iI
147b0 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31  ter=pNew->nSeg-1
147c0 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72  ; iIter>0; iIter
147d0 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  --){.      int i
147e0 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  Eq;.      if( (i
147f0 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
14800 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77  erDoCompare(pNew
14810 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20  , iIter)) ){.   
14820 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14830 4e 65 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61  Next(p, &pNew->a
14840 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20  Seg[iEq], 0);.  
14850 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
14860 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
14870 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29  New, iEq, iIter)
14880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14890 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
148a0 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20  rSetEof(pNew);. 
148b0 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
148c0 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
148d0 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
148e0 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
148f0 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  && fts5MultiIter
14900 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29  IsEmpty(p, pNew)
14910 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75   ){.      fts5Mu
14920 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
14930 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  New, 0, 0);.    
14940 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
14950 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
14960 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 2a  (p, pNew);.    *
14970 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ppOut = 0;.  }.}
14980 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
14990 6e 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  n Fts5MultiSegIt
149a0 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65 73  er that iterates
149b0 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63   through the doc
149c0 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a  list provided.**
149d0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
149e0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
149f0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
14a00 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73  iIterNew2(.  Fts
14a10 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a30 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
14a40 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
14a50 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
14a60 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
14a70 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
14a80 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
14a90 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  h */.  int bDesc
14aa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14ab0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
14ac0 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  or descending ro
14ad0 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46  wid order */.  F
14ae0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
14af0 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f  **ppOut        /
14b00 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
14b10 29 7b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  ){.  Fts5MultiSe
14b20 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70  gIter *pNew;.  p
14b30 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  New = fts5MultiI
14b40 74 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a  terAlloc(p, 2);.
14b50 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
14b60 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14b70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
14b80 65 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 49 74 65  eg[1];..    pIte
14b90 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53 35 5f  r->flags = FTS5_
14ba0 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
14bb0 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
14bc0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74  n>0 ){.      pIt
14bd0 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44 61 74  er->pLeaf = pDat
14be0 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  a;.      pIter->
14bf0 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
14c00 73 35 47 65 74 56 61 72 69 6e 74 28 70 44 61 74  s5GetVarint(pDat
14c10 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74  a->p, (u64*)&pIt
14c20 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
14c30 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b     pNew->aFirst[
14c40 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a 20  1].iFirst = 1;. 
14c50 20 20 20 20 20 69 66 28 20 62 44 65 73 63 20 29       if( bDesc )
14c60 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
14c70 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20 20  bRev = 1;.      
14c80 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
14c90 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
14ca0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20  EVERSE;.        
14cb0 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
14cc0 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
14cd0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ter);.      }els
14ce0 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  e{.        fts5S
14cf0 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
14d00 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
14d10 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  }.      pData = 
14d20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
14d30 20 20 20 20 70 4e 65 77 2d 3e 62 45 6f 66 20 3d      pNew->bEof =
14d40 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a   1;.    }..    *
14d50 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20  ppOut = pNew;.  
14d60 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  }..  fts5DataRel
14d70 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a  ease(pData);.}..
14d80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
14d90 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  e if the iterato
14da0 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69  r is at EOF or i
14db0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
14dc0 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c  ccurred. .** Fal
14dd0 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
14de0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
14df0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73  MultiIterEof(Fts
14e00 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d  5Index *p, Fts5M
14e10 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
14e20 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
14e30 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28  ->rc .      || (
14e40 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
14e50 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
14e60 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29  irst ].pLeaf==0)
14e70 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20 0a 20  ==pIter->bEof . 
14e80 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
14e90 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45  >rc || pIter->bE
14ea0 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  of);.}../*.** Re
14eb0 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f  turn the rowid o
14ec0 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  f the entry that
14ed0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
14ee0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a  rrently points.*
14ef0 2a 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65  * to. If the ite
14f00 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
14f10 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75  EOF when this fu
14f20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
14f30 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
14f40 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  are undefined..*
14f50 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  /.static i64 fts
14f60 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
14f70 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
14f80 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
14f90 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  rt( pIter->aSeg[
14fa0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
14fb0 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
14fc0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74   );.  return pIt
14fd0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
14fe0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
14ff0 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  t ].iRowid;.}../
15000 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
15010 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
15020 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66  xt entry at or f
15030 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e  ollowing iMatch.
15040 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15050 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
15060 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
15070 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d 75  ex *p, .  Fts5Mu
15080 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
15090 72 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68  r, .  i64 iMatch
150a0 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  .){.  while( 1 )
150b0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
150c0 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
150d0 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
150e0 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  , 1, iMatch);.  
150f0 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
15100 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
15110 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52   ) break;.    iR
15120 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
15130 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
15140 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
15150 3e 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77  >bRev==0 && iRow
15160 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id>=iMatch ) bre
15170 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ak;.    if( pIte
15180 72 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52  r->bRev!=0 && iR
15190 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62  owid<=iMatch ) b
151a0 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  reak;.  }.}../*.
151b0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
151c0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
151d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
151e0 65 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77  erm associated w
151f0 69 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72  ith the .** entr
15200 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  y that the itera
15210 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tor currently po
15220 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
15230 69 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73  ic const u8 *fts
15240 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46  5MultiIterTerm(F
15250 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
15260 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
15270 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
15280 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  *p = &pIter->aSe
15290 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
152a0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
152b0 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b  *pn = p->term.n;
152c0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72  .  return p->ter
152d0 6d 2e 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  m.p;.}..static v
152e0 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65  oid fts5ChunkIte
152f0 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rate(.  Fts5Inde
15300 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
15310 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15320 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
15330 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20  5SegIter *pSeg, 
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15350 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73 20  Poslist of this 
15360 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f  iterator */.  vo
15370 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15390 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72   Context pointer
153a0 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c   for xChunk call
153b0 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28  back */.  void (
153c0 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e 64  *xChunk)(Fts5Ind
153d0 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73  ex*, void*, cons
153e0 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20  t u8*, int).){. 
153f0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65 67   int nRem = pSeg
15400 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20  ->nPos;         
15410 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
15420 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d  tes still to com
15430 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
15440 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75 38  *pData = 0;.  u8
15450 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65 67   *pChunk = &pSeg
15460 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
15470 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
15480 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49   int nChunk = MI
15490 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c  N(nRem, pSeg->pL
154a0 65 61 66 2d 3e 6e 20 2d 20 70 53 65 67 2d 3e 69  eaf->n - pSeg->i
154b0 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69  LeafOffset);.  i
154c0 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  nt pgno = pSeg->
154d0 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  iLeafPgno;.  int
154e0 20 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a   pgnoSave = 0;..
154f0 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c 61    if( (pSeg->fla
15500 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
15510 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 7b  R_REVERSE)==0 ){
15520 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d 20  .    pgnoSave = 
15530 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77  pgno+1;.  }..  w
15540 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 78  hile( 1 ){.    x
15550 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70  Chunk(p, pCtx, p
15560 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
15570 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75      nRem -= nChu
15580 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  nk;.    fts5Data
15590 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
155a0 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20      if( nRem<=0 
155b0 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
155c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155d0 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70   pgno++;.      p
155e0 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
155f0 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
15600 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
15610 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c  pSeg->iSegid, 0,
15620 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69   pgno));.      i
15630 66 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72  f( pData==0 ) br
15640 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e  eak;.      pChun
15650 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d  k = &pData->p[4]
15660 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d  ;.      nChunk =
15670 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61   MIN(nRem, pData
15680 2d 3e 6e 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  ->n - 4);.      
15690 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61  if( pgno==pgnoSa
156a0 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ve ){.        as
156b0 73 65 72 74 28 20 70 53 65 67 2d 3e 70 4e 65 78  sert( pSeg->pNex
156c0 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20  tLeaf==0 );.    
156d0 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c      pSeg->pNextL
156e0 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  eaf = pData;.   
156f0 20 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a       pData = 0;.
15700 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15710 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  }.}..../*.** All
15720 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
15730 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73  ent-id for the s
15740 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
15750 2e 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  . The new segmen
15760 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62 65 20  t.** id must be 
15770 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 36 35  between 1 and 65
15780 33 33 35 20 69 6e 63 6c 75 73 69 76 65 2c 20 61  335 inclusive, a
15790 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75  nd must not be u
157a0 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20 63  sed by .** any c
157b0 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 69 6e  urrently existin
157c0 67 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 61 20  g segment. If a 
157d0 66 72 65 65 20 73 65 67 6d 65 6e 74 20 69 64 20  free segment id 
157e0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
157f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
15800 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
15810 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
15820 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
15830 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
15840 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30  on is a no-op. 0
15850 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
15860 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
15870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
15880 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46  5AllocateSegid(F
15890 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
158a0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
158b0 75 63 74 29 7b 0a 20 20 75 33 32 20 69 53 65 67  uct){.  u32 iSeg
158c0 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  id = 0;..  if( p
158d0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
158e0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  ){.    if( pStru
158f0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46 54  ct->nSegment>=FT
15900 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29  S5_MAX_SEGMENT )
15910 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
15920 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
15930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68   }else{.      wh
15940 69 6c 65 28 20 69 53 65 67 69 64 3d 3d 30 20 29  ile( iSegid==0 )
15950 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  {.        int iL
15960 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
15970 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
15980 6e 65 73 73 28 73 69 7a 65 6f 66 28 75 33 32 29  ness(sizeof(u32)
15990 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64  , (void*)&iSegid
159a0 29 3b 0a 20 20 20 20 20 20 20 20 69 53 65 67 69  );.        iSegi
159b0 64 20 3d 20 28 69 53 65 67 69 64 20 25 20 28 28  d = (iSegid % ((
159c0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
159d0 44 5f 42 29 20 2d 20 32 29 29 20 2b 20 31 3b 0a  D_B) - 2)) + 1;.
159e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
159f0 69 53 65 67 69 64 3e 30 20 26 26 20 69 53 65 67  iSegid>0 && iSeg
15a00 69 64 3c 3d 36 35 35 33 35 20 29 3b 0a 20 20 20  id<=65535 );.   
15a10 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
15a20 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
15a30 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
15a40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 53            for(iS
15a50 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
15a60 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
15a70 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
15a80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15a90 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d  iSegid==pStruct-
15aa0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
15ab0 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20  eg[iSeg].iSegid 
15ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
15ad0 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20   iSegid = 0;.   
15ae0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15b10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   }..  return (in
15b20 74 29 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a  t)iSegid;.}../*.
15b30 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64  ** Discard all d
15b40 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ata currently ca
15b50 63 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68  ched in the hash
15b60 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  -tables..*/.stat
15b70 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
15b80 78 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73  xDiscardData(Fts
15b90 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
15ba0 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c  sert( p->pHash |
15bb0 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  | p->nPendingDat
15bc0 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  a==0 );.  if( p-
15bd0 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71  >pHash ){.    sq
15be0 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65  lite3Fts5HashCle
15bf0 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  ar(p->pHash);.  
15c00 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
15c10 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  a = 0;.  }.}../*
15c20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
15c30 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69  ize of the prefi
15c40 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61  x, in bytes, tha
15c50 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70  t buffer (nNew/p
15c60 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77  New) shares.** w
15c70 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64  ith buffer (nOld
15c80 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  /pOld)..*/.stati
15c90 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78  c int fts5Prefix
15ca0 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20  Compress(.  int 
15cb0 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
15cc0 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77  pOld,.  int nNew
15cd0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77  , const u8 *pNew
15ce0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  .){.  int i;.  a
15cf0 73 73 65 72 74 28 20 66 74 73 35 42 6c 6f 62 43  ssert( fts5BlobC
15d00 6f 6d 70 61 72 65 28 70 4f 6c 64 2c 20 6e 4f 6c  ompare(pOld, nOl
15d10 64 2c 20 70 4e 65 77 2c 20 6e 4e 65 77 29 3c 30  d, pNew, nNew)<0
15d20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
15d30 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
15d40 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e   if( pOld[i]!=pN
15d50 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ew[i] ) break;. 
15d60 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
15d70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
15d80 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61  s5WriteDlidxClea
15d90 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r(.  Fts5Index *
15da0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
15db0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
15dc0 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20 20  int bFlush      
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69 74  /* If true, writ
15df0 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20  e dlidx to disk 
15e00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
15e10 20 61 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d   assert( bFlush=
15e20 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e  =0 || (pWriter->
15e30 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69  nDlidx>0 && pWri
15e40 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
15e50 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72  uf.n>0) );.  for
15e60 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d  (i=0; i<pWriter-
15e70 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20  >nDlidx; i++){. 
15e80 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
15e90 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
15ea0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
15eb0 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ;.    if( pDlidx
15ec0 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65  ->buf.n==0 ) bre
15ed0 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75  ak;.    if( bFlu
15ee0 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
15ef0 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  rt( pDlidx->pgno
15f00 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73  !=0 );.      fts
15f10 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
15f20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
15f30 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65  IDX_ROWID(pWrite
15f40 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44  r->iSegid, i, pD
15f50 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20  lidx->pgno),.   
15f60 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62         pDlidx->b
15f70 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75  uf.p, pDlidx->bu
15f80 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  f.n.      );.   
15f90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
15fa0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44  s5BufferZero(&pD
15fb0 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20  lidx->buf);.    
15fc0 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
15fd0 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  id = 0;.  }.}../
15fe0 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57  *.** Grow the pW
15ff0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20  riter->aDlidx[] 
16000 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73  array to at leas
16010 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20  t nLvl elements 
16020 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20  in size..** Any 
16030 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e  new array elemen
16040 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65  ts are zeroed be
16050 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
16060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
16070 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
16080 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16090 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  ,.  Fts5SegWrite
160a0 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
160b0 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20  t nLvl.){.  if( 
160c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
160d0 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65   && nLvl>=pWrite
160e0 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20  r->nDlidx ){.   
160f0 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
16100 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35   *aDlidx = (Fts5
16110 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c  DlidxWriter*)sql
16120 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
16130 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61        pWriter->a
16140 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46 74  Dlidx, sizeof(Ft
16150 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
16160 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20   nLvl.    );.   
16170 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20 29   if( aDlidx==0 )
16180 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
16190 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
161a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
161b0 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
161c0 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65  f(Fts5DlidxWrite
161d0 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57 72  r) * (nLvl - pWr
161e0 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20  iter->nDlidx);. 
161f0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44 6c       memset(&aDl
16200 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44 6c  idx[pWriter->nDl
16210 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b  idx], 0, nByte);
16220 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
16230 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78 3b  aDlidx = aDlidx;
16240 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
16250 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20  nDlidx = nLvl;. 
16260 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
16270 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  n p->rc;.}../*.*
16280 2a 20 49 66 20 61 6e 20 22 6e 45 6d 70 74 79 22  * If an "nEmpty"
16290 20 72 65 63 6f 72 64 20 6d 75 73 74 20 62 65 20   record must be 
162a0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62  written to the b
162b0 2d 74 72 65 65 20 62 65 66 6f 72 65 20 74 68 65  -tree before the
162c0 20 6e 65 78 74 0a 2a 2a 20 74 65 72 6d 2c 20 77   next.** term, w
162d0 72 69 74 65 20 69 74 20 6e 6f 77 2e 20 0a 2a 2f  rite it now. .*/
162e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
162f0 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74  5WriteBtreeNEmpt
16300 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  y(Fts5Index *p, 
16310 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
16320 57 72 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70  Writer){.  if( p
16330 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29  Writer->nEmpty )
16340 7b 0a 20 20 20 20 69 6e 74 20 62 46 6c 61 67 20  {.    int bFlag 
16350 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 50 61 67  = 0;.    Fts5Pag
16360 65 57 72 69 74 65 72 20 2a 70 50 67 3b 0a 20 20  eWriter *pPg;.  
16370 20 20 70 50 67 20 3d 20 26 70 57 72 69 74 65 72    pPg = &pWriter
16380 2d 3e 61 57 72 69 74 65 72 5b 31 5d 3b 0a 0a 20  ->aWriter[1];.. 
16390 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
163a0 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ere FTS5_MIN_DLI
163b0 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20  DX_SIZE or more 
163c0 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65 73  empty leaf pages
163d0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
163e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
163f0 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20   also write the 
16400 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f  doclist-index to
16410 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 20 20 69   disk.  */.    i
16420 66 28 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  f( pWriter->aDli
16430 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26  dx[0].buf.n>0 &&
16440 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
16450 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58  >=FTS5_MIN_DLIDX
16460 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 62  _SIZE ){.      b
16470 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Flag = 1;.    }.
16480 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
16490 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74  dxClear(p, pWrit
164a0 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 20 20  er, bFlag);.    
164b0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
164c0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
164d0 70 50 67 2d 3e 62 75 66 2c 20 62 46 6c 61 67 29  pPg->buf, bFlag)
164e0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
164f0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
16500 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20  >rc, &pPg->buf, 
16510 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 29  pWriter->nEmpty)
16520 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e  ;.    pWriter->n
16530 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  Empty = 0;.  }el
16540 73 65 7b 0a 20 20 20 20 66 74 73 35 57 72 69 74  se{.    fts5Writ
16550 65 44 6c 69 64 78 43 6c 65 61 72 28 70 2c 20 70  eDlidxClear(p, p
16560 57 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  Writer, 0);.  }.
16570 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
16580 65 72 2d 3e 6e 44 6c 69 64 78 3d 3d 30 20 7c 7c  er->nDlidx==0 ||
16590 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
165a0 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a  [0].buf.n==0 );.
165b0 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
165c0 72 2d 3e 6e 44 6c 69 64 78 3d 3d 30 20 7c 7c 20  r->nDlidx==0 || 
165d0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
165e0 30 5d 2e 62 50 72 65 76 56 61 6c 69 64 3d 3d 30  0].bPrevValid==0
165f0 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   );.}..static vo
16600 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
16610 65 47 72 6f 77 28 46 74 73 35 49 6e 64 65 78 20  eGrow(Fts5Index 
16620 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
16630 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69  r *pWriter){.  i
16640 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16650 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50  _OK ){.    Fts5P
16660 61 67 65 57 72 69 74 65 72 20 2a 61 4e 65 77 3b  ageWriter *aNew;
16670 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69  .    Fts5PageWri
16680 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ter *pNew;.    i
16690 6e 74 20 6e 4e 65 77 20 3d 20 73 69 7a 65 6f 66  nt nNew = sizeof
166a0 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72 29  (Fts5PageWriter)
166b0 20 2a 20 28 70 57 72 69 74 65 72 2d 3e 6e 57 72   * (pWriter->nWr
166c0 69 74 65 72 2b 31 29 3b 0a 0a 20 20 20 20 61 4e  iter+1);..    aN
166d0 65 77 20 3d 20 28 46 74 73 35 50 61 67 65 57 72  ew = (Fts5PageWr
166e0 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65  iter*)sqlite3_re
166f0 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 61  alloc(pWriter->a
16700 57 72 69 74 65 72 2c 20 6e 4e 65 77 29 3b 0a 20  Writer, nNew);. 
16710 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
16720 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
16730 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
16740 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
16750 7d 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 61  }..    pNew = &a
16760 4e 65 77 5b 70 57 72 69 74 65 72 2d 3e 6e 57 72  New[pWriter->nWr
16770 69 74 65 72 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  iter];.    memse
16780 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
16790 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72  f(Fts5PageWriter
167a0 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 67  ));.    pNew->pg
167b0 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35  no = 1;.    fts5
167c0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
167d0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 4e 65 77  nt(&p->rc, &pNew
167e0 2d 3e 62 75 66 2c 20 31 29 3b 0a 0a 20 20 20 20  ->buf, 1);..    
167f0 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
16800 2b 2b 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  ++;.    pWriter-
16810 3e 61 57 72 69 74 65 72 20 3d 20 61 4e 65 77 3b  >aWriter = aNew;
16820 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
16830 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  is is called onc
16840 65 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20  e for each leaf 
16850 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20  page except the 
16860 66 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61  first that conta
16870 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20  ins.** at least 
16880 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65  one term. Argume
16890 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29  nt (nTerm/pTerm)
168a0 20 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65   is the split-ke
168b0 79 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a  y - a term that.
168c0 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
168d0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74  n all terms writ
168e0 74 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c  ten to earlier l
168f0 65 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c  eaves, and equal
16900 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65   to or.** smalle
16910 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74  r than the first
16920 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77   term on the new
16930 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   leaf..**.** If 
16940 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
16950 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
16960 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e  s left in Fts5In
16970 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72  dex.rc. If an er
16980 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  ror.** has alrea
16990 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
169a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
169b0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
169c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
169d0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
169e0 65 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74  eBtreeTerm(.  Ft
169f0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16a10 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
16a20 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
16a30 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
16a40 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
16a50 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
16a60 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74  int nTerm, const
16a70 20 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20   u8 *pTerm      
16a80 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e  /* First term on
16a90 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a   new page */.){.
16aa0 20 20 69 6e 74 20 69 48 65 69 67 68 74 3b 0a 20    int iHeight;. 
16ab0 20 66 6f 72 28 69 48 65 69 67 68 74 3d 31 3b 20   for(iHeight=1; 
16ac0 31 3b 20 69 48 65 69 67 68 74 2b 2b 29 7b 0a 20  1; iHeight++){. 
16ad0 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
16ae0 72 20 2a 70 50 61 67 65 3b 0a 0a 20 20 20 20 69  r *pPage;..    i
16af0 66 28 20 69 48 65 69 67 68 74 3e 3d 70 57 72 69  f( iHeight>=pWri
16b00 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 29 7b 0a  ter->nWriter ){.
16b10 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
16b20 74 72 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69  treeGrow(p, pWri
16b30 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
16b40 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
16b50 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 20      }.    pPage 
16b60 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
16b70 74 65 72 5b 69 48 65 69 67 68 74 5d 3b 0a 0a 20  ter[iHeight];.. 
16b80 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65     fts5WriteBtre
16b90 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69 74  eNEmpty(p, pWrit
16ba0 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  er);..    if( pP
16bb0 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70  age->buf.n>=p->p
16bc0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a  Config->pgsz ){.
16bd0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 77        /* pPage w
16be0 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20 74  ill be written t
16bf0 6f 20 64 69 73 6b 2e 20 54 68 65 20 74 65 72 6d  o disk. The term
16c00 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e   will be written
16c10 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
16c20 2a 2a 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  ** parent of pPa
16c30 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 36  ge.  */.      i6
16c40 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
16c50 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
16c60 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
16c70 48 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70  Height, pPage->p
16c80 67 6e 6f 29 3b 0a 20 20 20 20 20 20 66 74 73 35  gno);.      fts5
16c90 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f  DataWrite(p, iRo
16ca0 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  wid, pPage->buf.
16cb0 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->buf.n)
16cc0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
16cd0 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62  erZero(&pPage->b
16ce0 75 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  uf);.      fts5B
16cf0 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
16d00 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 20 20 66  ->term);.      f
16d10 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
16d20 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
16d30 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61 67 65  Page->buf, pPage
16d40 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20  [-1].pgno);.    
16d50 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b    pPage->pgno++;
16d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16d70 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 66 74 73    int nPre = fts
16d80 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
16d90 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70  pPage->term.n, p
16da0 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54  Page->term.p, nT
16db0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
16dc0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16dd0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
16de0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
16df0 50 72 65 2b 32 29 3b 0a 20 20 20 20 20 20 66 74  Pre+2);.      ft
16e00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
16e10 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
16e20 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2d  age->buf, nTerm-
16e30 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73  nPre);.      fts
16e40 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
16e50 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
16e60 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2d 6e 50 72  ->buf, nTerm-nPr
16e70 65 2c 20 70 54 65 72 6d 2b 6e 50 72 65 29 3b 0a  e, pTerm+nPre);.
16e80 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
16e90 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  Set(&p->rc, &pPa
16ea0 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c  ge->term, nTerm,
16eb0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62   pTerm);.      b
16ec0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
16ee0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
16ef0 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61   when flushing a
16f00 20 6c 65 61 66 20 70 61 67 65 20 74 68 61 74 20   leaf page that 
16f10 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74  contains no.** t
16f20 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64  erms at all to d
16f30 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  isk..*/.static v
16f40 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
16f50 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35  eeNoTerm(.  Fts5
16f60 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
16f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16f80 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
16f90 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
16fa0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20  riter *pWriter  
16fb0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
16fc0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
16fd0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72   /* If there wer
16fe0 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74  e no rowids on t
16ff0 68 65 20 6c 65 61 66 20 70 61 67 65 20 65 69 74  he leaf page eit
17000 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c  her and the docl
17010 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68  ist-index.  ** h
17020 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
17030 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20  started, append 
17040 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20  an 0x00 byte to 
17050 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  it.  */.  if( pW
17060 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
17070 69 64 49 6e 50 61 67 65 20 26 26 20 70 57 72 69  idInPage && pWri
17080 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
17090 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74  uf.n>0 ){.    Ft
170a0 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
170b0 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
170c0 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20  ->aDlidx[0];.   
170d0 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
170e0 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20  >bPrevValid );. 
170f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
17100 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
17110 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
17120 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ->buf, 0);.  }..
17130 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
17140 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65  he "number of se
17150 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20  quential leaves 
17160 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20  without a term" 
17170 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57  counter. */.  pW
17180 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b  riter->nEmpty++;
17190 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66  .}..static i64 f
171a0 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
171b0 69 72 73 74 52 6f 77 69 64 28 46 74 73 35 42 75  irstRowid(Fts5Bu
171c0 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69  ffer *pBuf){.  i
171d0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74  64 iRowid;.  int
171e0 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d   iOff;..  iOff =
171f0 20 31 20 2b 20 66 74 73 35 47 65 74 56 61 72 69   1 + fts5GetVari
17200 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20  nt(&pBuf->p[1], 
17210 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
17220 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
17230 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  &pBuf->p[iOff], 
17240 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
17250 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b    return iRowid;
17260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20  .}../*.** Rowid 
17270 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20  iRowid has just 
17280 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f  been appended to
17290 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
172a0 66 20 70 61 67 65 2e 20 49 74 20 69 73 20 74 68  f page. It is th
172b0 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68  e.** first on th
172c0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
172d0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e  ction appends an
172e0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
172f0 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ry to the curren
17300 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64  t.** doclist-ind
17310 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
17320 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
17330 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49  xAppend(.  Fts5I
17340 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
17350 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
17360 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  er, .  i64 iRowi
17370 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  d.){.  int i;.  
17380 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a  int bDone = 0;..
17390 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
173a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
173b0 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  Done==0; i++){. 
173c0 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
173d0 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
173e0 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
173f0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
17400 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
17410 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
17420 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
17430 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
17440 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70   doclist-index p
17450 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69  age is full. Wri
17460 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e  te it to disk an
17470 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20  d push.      ** 
17480 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64  a copy of iRowid
17490 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63   (which will bec
174a0 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20 72 6f  ome the first ro
174b0 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a  wid on the next.
174c0 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
174d0 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65  -index leaf page
174e0 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65  ) up into the ne
174f0 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  xt level of the 
17500 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a  b-tree .      **
17510 20 68 69 65 72 61 72 63 68 79 2e 20 49 66 20 74   hierarchy. If t
17520 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c  he node being fl
17530 75 73 68 65 64 20 69 73 20 63 75 72 72 65 6e 74  ushed is current
17540 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ly the root node
17550 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ,.      ** also 
17560 70 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72  push its first r
17570 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f  owid upwards. */
17580 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  .      pDlidx->b
17590 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20  uf.p[0] = 0x01; 
175a0 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f     /* Not the ro
175b0 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20  ot node */.     
175c0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
175d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53  , .          FTS
175e0 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57  5_DLIDX_ROWID(pW
175f0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
17600 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c  , pDlidx->pgno),
17610 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64  .          pDlid
17620 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78  x->buf.p, pDlidx
17630 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b  ->buf.n.      );
17640 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
17650 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72  DlidxGrow(p, pWr
17660 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20  iter, i+2);.    
17670 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69    pDlidx = &pWri
17680 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
17690 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
176a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
176b0 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[1].buf.n==0
176c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
176d0 69 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69  iFirst = fts5Dli
176e0 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
176f0 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  wid(&pDlidx->buf
17700 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
17710 68 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74  his was the root
17720 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20   node. Push its 
17730 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 20 74  first rowid up t
17740 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20  o the new root. 
17750 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  */.        pDlid
17760 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69  x[1].pgno = pDli
17770 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  dx->pgno;.      
17780 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
17790 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
177a0 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
177b0 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20  1].buf, 0);.    
177c0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
177d0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
177e0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
177f0 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78  x[1].buf, pDlidx
17800 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
17810 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
17820 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
17830 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
17840 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a  ].buf, iFirst);.
17850 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
17860 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31  ].bPrevValid = 1
17870 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  ;.        pDlidx
17880 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72  [1].iPrev = iFir
17890 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  st;.      }..   
178a0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
178b0 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
178c0 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44  ->buf);.      pD
178d0 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
178e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69   = 0;.      pDli
178f0 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20  dx->pgno++;.    
17900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f  }else{.      bDo
17910 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ne = 1;.    }.. 
17920 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62     if( pDlidx->b
17930 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20  PrevValid ){.   
17940 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
17950 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76   - pDlidx->iPrev
17960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17970 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28     i64 iPgno = (
17980 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e  i==0 ? pWriter->
17990 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20  aWriter[0].pgno 
179a0 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e  : pDlidx[-1].pgn
179b0 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  o);.      assert
179c0 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d  ( pDlidx->buf.n=
179d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
179e0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
179f0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
17a00 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
17a10 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73  !bDone);.      s
17a20 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
17a30 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
17a40 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
17a50 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20  f, iPgno);.     
17a60 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a   iVal = iRowid;.
17a70 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
17a80 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
17a90 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
17aa0 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69   &pDlidx->buf, i
17ab0 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69 64 78  Val);.    pDlidx
17ac0 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31  ->bPrevValid = 1
17ad0 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 69 50  ;.    pDlidx->iP
17ae0 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  rev = iRowid;.  
17af0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
17b00 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
17b10 65 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  eaf(Fts5Index *p
17b20 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
17b30 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74 61  *pWriter){.  sta
17b40 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
17b50 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78  o[] = { 0x00, 0x
17b60 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
17b70 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  ;.  Fts5PageWrit
17b80 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
17b90 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
17ba0 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  ;.  i64 iRowid;.
17bb0 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
17bc0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
17bd0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65   ){.    /* No te
17be0 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  rm was written t
17bf0 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a  o this page. */.
17c00 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66      assert( 0==f
17c10 74 73 35 47 65 74 55 31 36 28 26 70 50 61 67 65  ts5GetU16(&pPage
17c20 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20  ->buf.p[2]) );. 
17c30 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65     fts5WriteBtre
17c40 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74  eNoTerm(p, pWrit
17c50 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  er);.  }..  /* W
17c60 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
17c70 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 62 2e   page to the db.
17c80 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20 46   */.  iRowid = F
17c90 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
17ca0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
17cb0 64 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d, 0, pPage->pgn
17cc0 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72  o);.  fts5DataWr
17cd0 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70  ite(p, iRowid, p
17ce0 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
17cf0 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f  ge->buf.n);..  /
17d00 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
17d10 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20   next page. */. 
17d20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
17d30 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20  &pPage->buf);.  
17d40 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
17d50 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
17d60 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
17d70 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e  o);.  pPage->pgn
17d80 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  o++;..  /* Incre
17d90 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20 77  ase the leaves w
17da0 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a  ritten counter *
17db0 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  /.  pWriter->nLe
17dc0 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20  afWritten++;..  
17dd0 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20  /* The new leaf 
17de0 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f  holds no terms o
17df0 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57  r rowids */.  pW
17e00 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
17e10 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70  mInPage = 1;.  p
17e20 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
17e30 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d  widInPage = 1;.}
17e40 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
17e50 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
17e60 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
17e70 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20  eing written by 
17e80 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65  the writer passe
17e90 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f  d.** as the seco
17ea0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
17eb0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
17ec0 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
17ed0 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
17ee0 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
17ef0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
17f00 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
17f10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
17f20 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
17f30 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
17f40 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74  AppendTerm(.  Ft
17f50 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
17f60 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
17f70 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65  riter,.  int nTe
17f80 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
17f90 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  erm .){.  int nP
17fa0 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
17fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
17fc0 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
17fd0 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72  pression for ter
17fe0 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  m */.  Fts5PageW
17ff0 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
18000 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
18010 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  [0];..  assert( 
18020 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20  pPage->buf.n==0 
18030 7c 7c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  || pPage->buf.n>
18040 34 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  4 );.  if( pPage
18050 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20  ->buf.n==0 ){.  
18060 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69    /* Zero the fi
18070 72 73 74 20 74 65 72 6d 20 61 6e 64 20 66 69 72  rst term and fir
18080 73 74 20 64 6f 63 69 64 20 66 69 65 6c 64 73 20  st docid fields 
18090 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
180a0 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20  nst u8 zero[] = 
180b0 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  { 0x00, 0x00, 0x
180c0 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20 20  00, 0x00 };.    
180d0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
180e0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
180f0 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
18100 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
18110 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
18120 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 20 20 7d  ermInPage );.  }
18130 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
18140 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28 20  eturn;.  .  if( 
18150 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
18160 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  ermInPage ){.   
18170 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 22   /* Update the "
18180 66 69 72 73 74 20 74 65 72 6d 22 20 66 69 65 6c  first term" fiel
18190 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  d of the page he
181a0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ader. */.    ass
181b0 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
181c0 70 5b 32 5d 3d 3d 30 20 26 26 20 70 50 61 67 65  p[2]==0 && pPage
181d0 2d 3e 62 75 66 2e 70 5b 33 5d 3d 3d 30 20 29 3b  ->buf.p[3]==0 );
181e0 0a 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28  .    fts5PutU16(
181f0 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d  &pPage->buf.p[2]
18200 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
18210 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30  .    nPrefix = 0
18220 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
18230 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  >pgno!=1 ){.    
18240 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
18250 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61   first term on a
18260 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f   leaf that is no
18270 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c  t the leftmost l
18280 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  eaf in.      ** 
18290 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  the segment b-tr
182a0 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
182b0 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
182c0 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74   to add a term t
182d0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62  o.      ** the b
182e0 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
182f0 74 68 61 74 20 69 73 20 28 61 29 20 6c 61 72 67  that is (a) larg
18300 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
18310 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20  est term .      
18320 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  ** already writt
18330 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  en to the segmen
18340 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65  t and (b) smalle
18350 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
18360 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  to.      ** this
18370 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20   term. In other 
18380 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78 20  words, a prefix 
18390 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  of (pTerm/nTerm)
183a0 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20   that is one.   
183b0 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65     ** byte longe
183c0 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65  r than the longe
183d0 73 74 20 70 72 65 66 69 78 20 28 70 54 65 72 6d  st prefix (pTerm
183e0 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20 77  /nTerm) shares w
183f0 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ith the.      **
18400 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20   previous term. 
18410 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
18420 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  ** Usually, the 
18430 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73  previous term is
18440 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50   available in pP
18450 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65  age->term. The e
18460 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a  xception.      *
18470 2a 20 69 73 20 69 66 20 74 68 69 73 20 69 73 20  * is if this is 
18480 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 77  the first term w
18490 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63  ritten in an inc
184a0 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73  remental-merge s
184b0 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  tep..      ** In
184c0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
184d0 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20  revious term is 
184e0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73  not available, s
184f0 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20  o just write a. 
18500 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
18510 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e  (pTerm/nTerm) in
18520 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f  to the parent no
18530 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
18540 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e  htly.      ** in
18550 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73  efficient, but s
18560 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a  till correct.  *
18570 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  /.      int n = 
18580 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  nTerm;.      if(
18590 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29   pPage->term.n )
185a0 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20  {.        n = 1 
185b0 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  + fts5PrefixComp
185c0 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d  ress(pPage->term
185d0 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  .n, pPage->term.
185e0 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  p, nTerm, pTerm)
185f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18600 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65  fts5WriteBtreeTe
18610 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e  rm(p, pWriter, n
18620 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
18630 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
18640 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20  ->aWriter[0];.  
18650 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18660 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35 50   nPrefix = fts5P
18670 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
18680 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61  age->term.n, pPa
18690 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72  ge->term.p, nTer
186a0 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 66  m, pTerm);.    f
186b0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
186c0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
186d0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66  Page->buf, nPref
186e0 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ix);.  }..  /* A
186f0 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ppend the number
18700 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
18710 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20   data, then the 
18720 74 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66  term data itself
18730 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  .  ** to the pag
18740 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
18750 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
18760 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
18770 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65  uf, nTerm - nPre
18780 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66  fix);.  fts5Buff
18790 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
187a0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
187b0 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69  , nTerm - nPrefi
187c0 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69  x, &pTerm[nPrefi
187d0 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74  x]);..  /* Updat
187e0 65 20 74 68 65 20 46 74 73 35 50 61 67 65 57 72  e the Fts5PageWr
187f0 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e  iter.term field.
18800 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72   */.  fts5Buffer
18810 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  Set(&p->rc, &pPa
18820 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c  ge->term, nTerm,
18830 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74   pTerm);.  pWrit
18840 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
18850 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72  Page = 0;..  pWr
18860 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
18870 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  dInPage = 0;.  p
18880 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
18890 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31  widInDoclist = 1
188a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
188b0 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e  rc || (pWriter->
188c0 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69  nDlidx>0 && pWri
188d0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
188e0 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57  uf.n==0) );.  pW
188f0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
18900 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70  .pgno = pPage->p
18910 67 6e 6f 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  gno;..  /* If th
18920 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
18930 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75  age is full, flu
18940 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a  sh it to disk. *
18950 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62  /.  if( pPage->b
18960 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  uf.n>=p->pConfig
18970 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66 74  ->pgsz ){.    ft
18980 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
18990 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
189a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  }.}../*.** Appen
189b0 64 20 61 20 64 6f 63 69 64 20 61 6e 64 20 70 6f  d a docid and po
189c0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
189d0 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77 72   field to the wr
189e0 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a  iters output. .*
189f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18a00 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
18a10 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  id(.  Fts5Index 
18a20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
18a30 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
18a40 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20 20 69   i64 iRowid,.  i
18a50 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20 69 66 28  nt nPos.){.  if(
18a60 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18a70 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
18a80 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
18a90 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
18aa0 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  er[0];..    /* I
18ab0 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65 20  f this is to be 
18ac0 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64 20  the first docid 
18ad0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70  written to the p
18ae0 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20  age, set the .  
18af0 20 20 2a 2a 20 64 6f 63 69 64 2d 70 6f 69 6e 74    ** docid-point
18b00 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68  er in the page-h
18b10 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65  eader. Also appe
18b20 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68  nd a value to th
18b30 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62  e dlidx.    ** b
18b40 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61  uffer, in case a
18b50 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
18b60 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
18b70 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
18b80 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
18b90 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ge ){.      fts5
18ba0 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75  PutU16(pPage->bu
18bb0 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
18bc0 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72  n);.      fts5Wr
18bd0 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70  iteDlidxAppend(p
18be0 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69  , pWriter, iRowi
18bf0 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
18c00 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f 63 69  * Write the doci
18c10 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  d. */.    if( pW
18c20 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
18c30 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70  idInDoclist || p
18c40 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
18c50 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
18c60 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
18c70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
18c80 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69  , &pPage->buf, i
18c90 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Rowid);.    }els
18ca0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
18cb0 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64   p->rc || iRowid
18cc0 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52  >pWriter->iPrevR
18cd0 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74  owid );.      ft
18ce0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
18cf0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
18d00 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
18d10 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65   - pWriter->iPre
18d20 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  vRowid);.    }. 
18d30 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65     pWriter->iPre
18d40 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  vRowid = iRowid;
18d50 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46  .    pWriter->bF
18d60 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
18d70 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69  st = 0;.    pWri
18d80 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
18d90 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  InPage = 0;..   
18da0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
18db0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
18dc0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 6f  &pPage->buf, nPo
18dd0 73 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61  s);..    if( pPa
18de0 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43  ge->buf.n>=p->pC
18df0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
18e00 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
18e10 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
18e20 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  er);.    }.  }.}
18e30 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
18e40 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
18e50 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35  listData(.  Fts5
18e60 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
18e70 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
18e80 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ter, .  const u8
18e90 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20   *aData, .  int 
18ea0 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50  nData.){.  Fts5P
18eb0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
18ec0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
18ed0 69 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74  iter[0];.  const
18ee0 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a   u8 *a = aData;.
18ef0 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b    int n = nData;
18f00 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d  .  .  assert( p-
18f10 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30  >pConfig->pgsz>0
18f20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
18f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18f40 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
18f50 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d   n)>=p->pConfig-
18f60 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 6e 74  >pgsz ){.    int
18f70 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66   nReq = p->pConf
18f80 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65  ig->pgsz - pPage
18f90 2d 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69 6e 74  ->buf.n;.    int
18fa0 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20   nCopy = 0;.    
18fb0 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65  while( nCopy<nRe
18fc0 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64  q ){.      i64 d
18fd0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70  ummy;.      nCop
18fe0 79 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  y += fts5GetVari
18ff0 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75  nt(&a[nCopy], (u
19000 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20  64*)&dummy);.   
19010 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
19020 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
19030 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
19040 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20   nCopy, a);.    
19050 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  a += nCopy;.    
19060 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  n -= nCopy;.    
19070 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
19080 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
19090 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
190a0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
190b0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
190c0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
190d0 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  , a);.  }.}..sta
190e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
190f0 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65  teAppendZerobyte
19100 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
19110 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
19120 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  riter){.  fts5Bu
19130 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
19140 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
19150 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75  r->aWriter[0].bu
19160 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
19170 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63  Flush any data c
19180 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69  ached by the wri
19190 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ter object to th
191a0 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65  e database. Free
191b0 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   any.** allocati
191c0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
191d0 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a  ith the writer..
191e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
191f0 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a  ts5WriteFinish(.
19200 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
19210 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
19220 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
19230 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
19240 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ect */.  int *pn
19250 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
19260 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
19270 20 48 65 69 67 68 74 20 6f 66 20 74 68 65 20 62   Height of the b
19280 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  -tree */.  int *
19290 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20  pnLeaf          
192a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
192b0 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  T: Number of lea
192c0 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65  f pages in b-tre
192d0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
192e0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
192f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
19300 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
19310 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d  Leaf = &pWriter-
19320 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 20  >aWriter[0];.   
19330 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f   if( pLeaf->pgno
19340 3d 3d 31 20 26 26 20 70 4c 65 61 66 2d 3e 62 75  ==1 && pLeaf->bu
19350 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
19360 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  *pnLeaf = 0;.   
19370 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 30     *pnHeight = 0
19380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19390 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75     if( pLeaf->bu
193a0 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 20  f.n>4 ){.       
193b0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
193c0 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
193d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
193e0 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e  pnLeaf = pLeaf->
193f0 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 20 20 69 66  pgno-1;.      if
19400 28 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74  ( pWriter->nWrit
19410 65 72 3d 3d 31 20 26 26 20 70 57 72 69 74 65 72  er==1 && pWriter
19420 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d  ->nEmpty>=FTS5_M
19430 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b  IN_DLIDX_SIZE ){
19440 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
19450 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c 20 70  teBtreeGrow(p, p
19460 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Writer);.      }
19470 0a 20 20 20 20 20 20 69 66 28 20 70 57 72 69 74  .      if( pWrit
19480 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31 20 29 7b  er->nWriter>1 ){
19490 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
194a0 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c  teBtreeNEmpty(p,
194b0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
194c0 20 7d 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67   }.      *pnHeig
194d0 68 74 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 57  ht = pWriter->nW
194e0 72 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 66 6f  riter;..      fo
194f0 72 28 69 3d 31 3b 20 69 3c 70 57 72 69 74 65 72  r(i=1; i<pWriter
19500 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b  ->nWriter; i++){
19510 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 61 67  .        Fts5Pag
19520 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
19530 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
19540 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73  [i];.        fts
19550 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
19560 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
19570 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
19580 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
19590 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a 20  , pPg->pgno), . 
195a0 20 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e             pPg->
195b0 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e  buf.p, pPg->buf.
195c0 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
195d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
195e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
195f0 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b  ter->nWriter; i+
19600 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65  +){.    Fts5Page
19610 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70  Writer *pPg = &p
19620 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
19630 69 5d 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  i];.    fts5Buff
19640 65 72 46 72 65 65 28 26 70 50 67 2d 3e 74 65 72  erFree(&pPg->ter
19650 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  m);.    fts5Buff
19660 65 72 46 72 65 65 28 26 70 50 67 2d 3e 62 75 66  erFree(&pPg->buf
19670 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19680 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61  _free(pWriter->a
19690 57 72 69 74 65 72 29 3b 0a 0a 20 20 66 6f 72 28  Writer);..  for(
196a0 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
196b0 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  nDlidx; i++){.  
196c0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
196d0 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72  ferFree(&pWriter
196e0 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29  ->aDlidx[i].buf)
196f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
19700 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44  free(pWriter->aD
19710 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  lidx);.}..static
19720 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49   void fts5WriteI
19730 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
19740 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
19750 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
19760 0a 20 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b  .  int iSegid.){
19770 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65  .  memset(pWrite
19780 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
19790 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
197a0 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20  pWriter->iSegid 
197b0 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 70 57 72  = iSegid;..  pWr
197c0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20  iter->aWriter = 
197d0 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a  (Fts5PageWriter*
197e0 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
197f0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67  , sizeof(Fts5Pag
19800 65 57 72 69 74 65 72 29 29 3b 0a 20 20 69 66 28  eWriter));.  if(
19810 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
19820 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20  row(p, pWriter, 
19830 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
19840 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20  Writer->nWriter 
19850 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
19860 6e 44 6c 69 64 78 20 3d 20 31 3b 0a 20 20 70 57  nDlidx = 1;.  pW
19870 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
19880 5d 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57  ].pgno = 1;.  pW
19890 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
198a0 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a  mInPage = 1;.}..
198b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
198c0 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70 70 65  WriteInitForAppe
198d0 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nd(.  Fts5Index 
198e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
198f0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
19900 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
19910 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
19920 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
19930 20 20 2f 2a 20 57 72 69 74 65 72 20 74 6f 20 69    /* Writer to i
19940 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 46  nitialize */.  F
19950 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
19960 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f  ent *pSeg      /
19970 2a 20 53 65 67 6d 65 6e 74 20 6f 62 6a 65 63 74  * Segment object
19980 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f   to append to */
19990 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
199a0 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 20  = pSeg->nHeight 
199b0 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67  * sizeof(Fts5Pag
199c0 65 57 72 69 74 65 72 29 3b 0a 20 20 6d 65 6d 73  eWriter);.  mems
199d0 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73  et(pWriter, 0, s
199e0 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
199f0 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72  ter));.  pWriter
19a00 2d 3e 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  ->iSegid = pSeg-
19a10 3e 69 53 65 67 69 64 3b 0a 20 20 70 57 72 69 74  >iSegid;.  pWrit
19a20 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46  er->aWriter = (F
19a30 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29 66  ts5PageWriter*)f
19a40 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
19a50 6e 42 79 74 65 29 3b 0a 20 20 70 57 72 69 74 65  nByte);.  pWrite
19a60 72 2d 3e 61 44 6c 69 64 78 20 3d 20 28 46 74 73  r->aDlidx = (Fts
19a70 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29 66 74  5DlidxWriter*)ft
19a80 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73  s5IdxMalloc(p, s
19a90 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57  izeof(Fts5DlidxW
19aa0 72 69 74 65 72 29 29 3b 0a 0a 20 20 69 66 28 20  riter));..  if( 
19ab0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19ac0 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f   ){.    int pgno
19ad0 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 1;.    int i;
19ae0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 44  .    pWriter->nD
19af0 6c 69 64 78 20 3d 20 31 3b 0a 20 20 20 20 70 57  lidx = 1;.    pW
19b00 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d  riter->nWriter =
19b10 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b 0a   pSeg->nHeight;.
19b20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72      pWriter->aWr
19b30 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70  iter[0].pgno = p
19b40 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b  Seg->pgnoLast+1;
19b50 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 65 67 2d  .    for(i=pSeg-
19b60 3e 6e 48 65 69 67 68 74 2d 31 3b 20 69 3e 30 3b  >nHeight-1; i>0;
19b70 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 36 34   i--){.      i64
19b80 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
19b90 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72  EGMENT_ROWID(pWr
19ba0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
19bb0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 46 74   pgno);.      Ft
19bc0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
19bd0 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  g = &pWriter->aW
19be0 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  riter[i];.      
19bf0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
19c00 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
19c10 42 75 66 66 65 72 28 70 2c 20 26 70 50 67 2d 3e  Buffer(p, &pPg->
19c20 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
19c30 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
19c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c50 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72      Fts5NodeIter
19c60 20 73 73 3b 0a 20 20 20 20 20 20 20 20 66 74 73   ss;.        fts
19c70 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70 50  5NodeIterInit(pP
19c80 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62  g->buf.p, pPg->b
19c90 75 66 2e 6e 2c 20 26 73 73 29 3b 0a 20 20 20 20  uf.n, &ss);.    
19ca0 20 20 20 20 77 68 69 6c 65 28 20 73 73 2e 61 44      while( ss.aD
19cb0 61 74 61 20 29 20 66 74 73 35 4e 6f 64 65 49 74  ata ) fts5NodeIt
19cc0 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26  erNext(&p->rc, &
19cd0 73 73 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ss);.        fts
19ce0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
19cf0 63 2c 20 26 70 50 67 2d 3e 74 65 72 6d 2c 20 73  c, &pPg->term, s
19d00 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72  s.term.n, ss.ter
19d10 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 70 67  m.p);.        pg
19d20 6e 6f 20 3d 20 73 73 2e 69 43 68 69 6c 64 3b 0a  no = ss.iChild;.
19d30 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65          fts5Node
19d40 49 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20  IterFree(&ss);. 
19d50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19d60 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
19d70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 67  SQLITE_OK || (pg
19d80 6e 6f 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  no+pWriter->nEmp
19d90 74 79 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  ty)==pSeg->pgnoL
19da0 61 73 74 20 29 3b 0a 20 20 20 20 70 57 72 69 74  ast );.    pWrit
19db0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
19dc0 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 61 73  Page = 1;.    as
19dd0 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 61  sert( pWriter->a
19de0 57 72 69 74 65 72 5b 30 5d 2e 74 65 72 6d 2e 6e  Writer[0].term.n
19df0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ==0 );.  }.}../*
19e00 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
19e10 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
19e20 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
19e30 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
19e40 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
19e50 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
19e60 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
19e70 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
19e80 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
19e90 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
19ea0 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
19eb0 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
19ec0 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
19ed0 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
19ee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19ef0 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
19f00 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
19f10 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
19f20 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
19f30 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i;.  Fts5Buffer 
19f40 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
19f50 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
19f60 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f  s5Buffer));.  fo
19f70 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
19f80 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
19f90 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
19fa0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
19fb0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65  [i];.    if( pSe
19fc0 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20  g->pSeg==0 ){.  
19fd0 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
19fe0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
19ff0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  eg->pLeaf==0 ){.
1a000 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79        /* All key
1a010 73 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75  s from this inpu
1a020 74 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62  t segment have b
1a030 65 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74  een transfered t
1a040 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20  o the output..  
1a050 20 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20      ** Set both 
1a060 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61  the first and la
1a070 73 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20  st page-numbers 
1a080 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
1a090 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
1a0a0 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f  ** segment is no
1a0b0 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  w empty. */.    
1a0c0 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
1a0d0 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20  noLast = 0;.    
1a0e0 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
1a0f0 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  noFirst = 0;.   
1a100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1a110 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69  t iOff = pSeg->i
1a120 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20  TermLeafOffset; 
1a130 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e      /* Offset on
1a140 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20   new first leaf 
1a150 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  page */.      i6
1a160 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20  4 iLeafRowid;.  
1a170 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44      Fts5Data *pD
1a180 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ata;.      int i
1a190 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d  Id = pSeg->pSeg-
1a1a0 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75  >iSegid;.      u
1a1b0 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30  8 aHdr[4] = {0x0
1a1c0 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
1a1d0 78 30 34 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65  x04};..      iLe
1a1e0 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53  afRowid = FTS5_S
1a1f0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
1a200 2c 20 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d  , 0, pSeg->iTerm
1a210 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
1a220 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
1a230 61 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f  aRead(p, iLeafRo
1a240 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
1a250 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
1a260 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1a270 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  &buf);.        f
1a280 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1a290 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
1a2a0 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20  , sizeof(aHdr), 
1a2b0 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66  aHdr);.        f
1a2c0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1a2d0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
1a2e0 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
1a2f0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
1a300 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1a310 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
1a320 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67  eg->term.n, pSeg
1a330 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20  ->term.p);.     
1a340 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1a350 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1a360 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d  &buf, pData->n -
1a370 20 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70   iOff, &pData->p
1a380 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20  [iOff]);.       
1a390 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1a3a0 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  (pData);.       
1a3b0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1a3c0 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69  oFirst = pSeg->i
1a3d0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  TermLeafPgno;.  
1a3e0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65        fts5DataDe
1a3f0 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47  lete(p, FTS5_SEG
1a400 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20  MENT_ROWID(iId, 
1a410 30 2c 20 31 29 2c 69 4c 65 61 66 52 6f 77 69 64  0, 1),iLeafRowid
1a420 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1a430 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61  ataWrite(p, iLea
1a440 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62  fRowid, buf.p, b
1a450 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uf.n);.      }. 
1a460 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42     }.  }.  fts5B
1a470 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
1a480 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1a490 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61  fts5MergeChunkCa
1a4a0 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e  llback(.  Fts5In
1a4b0 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20  dex *p, .  void 
1a4c0 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20  *pCtx, .  const 
1a4d0 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20  u8 *pChunk, int 
1a4e0 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35  nChunk.){.  Fts5
1a4f0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1a500 65 72 20 3d 20 28 46 74 73 35 53 65 67 57 72 69  er = (Fts5SegWri
1a510 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73  ter*)pCtx;.  fts
1a520 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
1a530 69 73 74 44 61 74 61 28 70 2c 20 70 57 72 69 74  istData(p, pWrit
1a540 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  er, pChunk, nChu
1a550 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  nk);.}../*.**.*/
1a560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a570 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
1a580 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1a590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a5a0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1a5b0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1a5c0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
1a5d0 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  ppStruct,       
1a5e0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74  /* IN/OUT: Stuct
1a5f0 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
1a600 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20    int iLvl,     
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65    /* Level to re
1a630 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f  ad input from */
1a640 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20  .  int *pnRem   
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a660 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74     /* Write up t
1a670 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70  o this many outp
1a680 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a  ut leaves */.){.
1a690 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1a6a0 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
1a6b0 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
1a6c0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1a6d0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1a6e0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73  vel[iLvl];.  Fts
1a6f0 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1a700 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35  *pLvlOut;.  Fts5
1a710 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
1a720 74 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ter = 0;    /* I
1a730 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
1a740 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20  input data */.  
1a750 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d  int nRem = pnRem
1a760 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20   ? *pnRem : 0;  
1a770 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70  /* Output leaf p
1a780 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
1a790 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  te */.  int nInp
1a7a0 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
1a7b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a7c0 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
1a7d0 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  nts */.  Fts5Seg
1a7e0 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
1a7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1a800 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  er object */.  F
1a810 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1a820 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
1a830 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  * Output segment
1a840 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
1a850 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 52 65   term;.  int bRe
1a860 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d  quireDoclistTerm
1a870 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f 63 6c   = 0;    /* Docl
1a880 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 28  ist terminator (
1a890 30 78 30 30 29 20 72 65 71 75 69 72 65 64 20 2a  0x00) required *
1a8a0 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  /.  int bOldest;
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1a8d0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1a8e0 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
1a8f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
1a900 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1a910 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
1a920 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
1a930 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
1a940 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1a950 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1a960 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
1a970 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
1a980 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1a990 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d  ;.  if( pLvl->nM
1a9a0 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c  erge ){.    pLvl
1a9b0 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
1a9c0 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
1a9d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
1a9e0 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
1a9f0 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
1aa00 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 66 74  ->nMerge;.    ft
1aa10 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70  s5WriteInitForAp
1aa20 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c  pend(p, &writer,
1aa30 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
1aa40 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d  pLvlOut->nSeg-1]
1aa50 29 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  );.    pSeg = &p
1aa60 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76  LvlOut->aSeg[pLv
1aa70 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20  lOut->nSeg-1];. 
1aa80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1aa90 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
1aaa0 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
1aab0 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  truct);..    /* 
1aac0 45 78 74 65 6e 64 20 74 68 65 20 46 74 73 35 53  Extend the Fts5S
1aad0 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
1aae0 61 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  as required to e
1aaf0 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70 75 74  nsure the output
1ab00 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20  .    ** segment 
1ab10 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69  exists. */.    i
1ab20 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74  f( iLvl==pStruct
1ab30 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20  ->nLevel-1 ){.  
1ab40 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1ab50 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
1ab60 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , ppStruct);.   
1ab70 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70 70     pStruct = *pp
1ab80 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20  Struct;.    }.  
1ab90 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
1aba0 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
1abb0 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  c, pStruct, iLvl
1abc0 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  +1, 1, 0);.    i
1abd0 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
1abe0 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  n;.    pLvl = &p
1abf0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1ac00 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Lvl];.    pLvlOu
1ac10 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
1ac20 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20  evel[iLvl+1];.. 
1ac30 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
1ac40 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65  (p, &writer, iSe
1ac50 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  gid);..    /* Ad
1ac60 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  d the new segmen
1ac70 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  t to the output 
1ac80 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65  level */.    pSe
1ac90 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
1aca0 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
1acb0 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e  ];.    pLvlOut->
1acc0 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67  nSeg++;.    pSeg
1acd0 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
1ace0 0a 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69  .    pSeg->iSegi
1acf0 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
1ad00 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1ad10 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  t++;..    /* Rea
1ad20 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c  d input from all
1ad30 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
1ad40 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
1ad50 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
1ad60 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62  l->nSeg;.  }.  b
1ad70 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75  Oldest = (pLvlOu
1ad80 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53  t->nSeg==1 && pS
1ad90 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69  truct->nLevel==i
1ada0 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72  Lvl+2);..  asser
1adb0 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20  t( iLvl>=0 );.  
1adc0 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
1add0 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
1ade0 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76   0, 0, 0, 0, iLv
1adf0 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65  l, nInput, &pIte
1ae00 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
1ae10 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
1ae20 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
1ae30 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
1ae40 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
1ae50 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  .  ){.    Fts5Se
1ae60 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1ae70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1ae80 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1ae90 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  rst ];.    int n
1aea0 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Pos;            
1aeb0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69           /* posi
1aec0 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
1aed0 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ield value */.  
1aee0 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
1aef0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1af00 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1af10 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61  for key annihila
1af20 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
1af30 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 20 26   pSeg->nPos==0 &
1af40 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53  & (bOldest || pS
1af50 65 67 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20 63  eg->bDel==0) ) c
1af60 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 54  ontinue;..    pT
1af70 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  erm = fts5MultiI
1af80 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
1af90 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
1afa0 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c  nTerm!=term.n ||
1afb0 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74   memcmp(pTerm, t
1afc0 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b  erm.p, nTerm) ){
1afd0 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d  .      if( pnRem
1afe0 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66   && writer.nLeaf
1aff0 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a  Written>nRem ){.
1b000 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b010 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1b020 20 54 68 69 73 20 69 73 20 61 20 6e 65 77 20 74   This is a new t
1b030 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20 74 65  erm. Append a te
1b040 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  rm to the output
1b050 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20   segment. */.   
1b060 20 20 20 69 66 28 20 62 52 65 71 75 69 72 65 44     if( bRequireD
1b070 6f 63 6c 69 73 74 54 65 72 6d 20 29 7b 0a 20 20  oclistTerm ){.  
1b080 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
1b090 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2c  ppendZerobyte(p,
1b0a0 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20   &writer);.     
1b0b0 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69   }.      fts5Wri
1b0c0 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20  teAppendTerm(p, 
1b0d0 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20  &writer, nTerm, 
1b0e0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74  pTerm);.      ft
1b0f0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1b100 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d  rc, &term, nTerm
1b110 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1b120 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54  bRequireDoclistT
1b130 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  erm = 1;.    }..
1b140 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
1b150 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f  e rowid to the o
1b160 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20  utput */.    /* 
1b170 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
1b180 20 2a 2f 0a 20 20 20 20 6e 50 6f 73 20 3d 20 70   */.    nPos = p
1b190 53 65 67 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53  Seg->nPos*2 + pS
1b1a0 65 67 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 66 74  eg->bDel;.    ft
1b1b0 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
1b1c0 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66  id(p, &writer, f
1b1d0 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
1b1e0 64 28 70 49 74 65 72 29 2c 20 6e 50 6f 73 29 3b  d(pIter), nPos);
1b1f0 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
1b200 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
1b210 74 20 64 61 74 61 20 74 6f 20 74 68 65 20 6f 75  t data to the ou
1b220 74 70 75 74 20 2a 2f 0a 20 20 20 20 66 74 73 35  tput */.    fts5
1b230 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20  ChunkIterate(p, 
1b240 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 77 72  pSeg, (void*)&wr
1b250 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43  iter, fts5MergeC
1b260 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  hunkCallback);. 
1b270 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74   }..  /* Flush t
1b280 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  he last leaf pag
1b290 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74  e to disk. Set t
1b2a0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1b2b0 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a  t b-tree height.
1b2c0 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65    ** and last le
1b2d0 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  af page number a
1b2e0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
1b2f0 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65    */.  fts5Write
1b300 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65  Finish(p, &write
1b310 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68  r, &pSeg->nHeigh
1b320 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  t, &pSeg->pgnoLa
1b330 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35  st);..  if( fts5
1b340 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1b350 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e  pIter) ){.    in
1b360 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  t i;..    /* Rem
1b370 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
1b380 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
1b390 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
1b3a0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1b3b0 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b   i<nInput; i++){
1b3c0 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
1b3d0 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20  emoveSegment(p, 
1b3e0 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53  pLvl->aSeg[i].iS
1b3f0 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  egid);.    }..  
1b400 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1b410 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
1b420 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ts from the inpu
1b430 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  t level */.    i
1b440 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e  f( pLvl->nSeg!=n
1b450 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69  Input ){.      i
1b460 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c  nt nMove = (pLvl
1b470 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29  ->nSeg - nInput)
1b480 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
1b490 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
1b4a0 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  .      memmove(p
1b4b0 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c  Lvl->aSeg, &pLvl
1b4c0 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20  ->aSeg[nInput], 
1b4d0 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMove);.    }.  
1b4e0 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d    pStruct->nSegm
1b4f0 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20  ent -= nInput;. 
1b500 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d     pLvl->nSeg -=
1b510 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76   nInput;.    pLv
1b520 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20  l->nMerge = 0;. 
1b530 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e     if( pSeg->pgn
1b540 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oLast==0 ){.    
1b550 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d    pLvlOut->nSeg-
1b560 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  -;.      pStruct
1b570 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20  ->nSegment--;.  
1b580 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1b590 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 6e   assert( pSeg->n
1b5a0 48 65 69 67 68 74 3e 30 20 26 26 20 70 53 65 67  Height>0 && pSeg
1b5b0 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a  ->pgnoLast>0 );.
1b5c0 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d      fts5TrimSegm
1b5d0 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  ents(p, pIter);.
1b5e0 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
1b5f0 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a   = nInput;.  }..
1b600 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
1b610 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ree(p, pIter);. 
1b620 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1b630 26 74 65 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e  &term);.  if( pn
1b640 52 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20  Rem ) *pnRem -= 
1b650 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74  writer.nLeafWrit
1b660 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  ten;.}../*.** Do
1b670 20 75 70 20 74 6f 20 6e 50 67 20 70 61 67 65 73   up to nPg pages
1b680 20 6f 66 20 61 75 74 6f 6d 65 72 67 65 20 77 6f   of automerge wo
1b690 72 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e  rk on the index.
1b6a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b6b0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a  fts5IndexMerge(.
1b6c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1b6f0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1b700 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1b710 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1b720 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1b730 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1b740 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67  dex */.  int nPg
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1b770 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s of work to do 
1b780 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d  */.){.  int nRem
1b790 20 3d 20 6e 50 67 3b 0a 20 20 46 74 73 35 53 74   = nPg;.  Fts5St
1b7a0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
1b7b0 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
1b7c0 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26  while( nRem>0 &&
1b7d0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b7e0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76  K ){.    int iLv
1b7f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1b800 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61       /* To itera
1b810 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
1b820 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65  s */.    int iBe
1b830 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20  stLvl = 0;      
1b840 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66       /* Level of
1b850 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20  fering the most 
1b860 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
1b870 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20  /.    int nBest 
1b880 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1b890 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
1b8a0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e  nput segments on
1b8b0 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a   best level */..
1b8c0 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74      /* Set iBest
1b8d0 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c  Lvl to the level
1b8e0 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73   to read input s
1b8f0 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f  egments from. */
1b900 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1b910 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29  ruct->nLevel>0 )
1b920 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ;.    for(iLvl=0
1b930 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
1b940 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
1b950 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
1b960 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
1b970 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1b980 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
1b990 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
1b9a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b9b0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65  pLvl->nMerge>nBe
1b9c0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1b9d0 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
1b9e0 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74  .          nBest
1b9f0 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b   = pLvl->nMerge;
1ba00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ba20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  }.      if( pLvl
1ba30 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a  ->nSeg>nBest ){.
1ba40 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
1ba50 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20  pLvl->nSeg;.    
1ba60 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69      iBestLvl = i
1ba70 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Lvl;.      }.   
1ba80 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42   }..    /* If nB
1ba90 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20  est is still 0, 
1baa0 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d  then the index m
1bab0 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f  ust be empty. */
1bac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1bad0 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76  EBUG.    for(iLv
1bae0 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26  l=0; nBest==0 &&
1baf0 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1bb00 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1bb10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1bb20 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1bb30 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20  vl].nSeg==0 );. 
1bb40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1bb50 20 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43   if( nBest<p->pC
1bb60 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
1bb70 65 20 0a 20 20 20 20 20 20 20 20 26 26 20 70 53  e .        && pS
1bb80 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
1bb90 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
1bba0 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0 .      ){.    
1bbb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bbc0 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1bbd0 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75  eLevel(p, &pStru
1bbe0 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e  ct, iBestLvl, &n
1bbf0 52 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  Rem);.    if( p-
1bc00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1bc10 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
1bc20 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
1bc30 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ge==0 ){.      f
1bc40 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
1bc50 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b  ote(p, iBestLvl+
1bc60 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
1bc70 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75   }.  }.  *ppStru
1bc80 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a  ct = pStruct;.}.
1bc90 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  ./*.** A total o
1bca0 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67  f nLeaf leaf pag
1bcb0 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a  es of data has j
1bcc0 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64  ust been flushed
1bcd0 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a   to a level-0.**
1bce0 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 66   segment. This f
1bcf0 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20  unction updates 
1bd00 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65  the write-counte
1bd10 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e  r accordingly an
1bd20 64 2c 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61  d, if.** necessa
1bd30 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63  ry, performs inc
1bd40 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 77  remental merge w
1bd50 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ork..**.** If an
1bd60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
1bd70 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  et the Fts5Index
1bd80 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .rc error code. 
1bd90 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
1bda0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
1bdb0 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
1bdc0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1bdd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1bde0 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67  ts5IndexAutomerg
1bdf0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
1be00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1be10 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1be20 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1be30 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1be40 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
1be50 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
1be60 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
1be70 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1be80 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  nLeaf           
1be90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bea0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1beb0 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69 74  leaves just writ
1bec0 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ten */.){.  if( 
1bed0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1bee0 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e   && p->pConfig->
1bef0 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a  nAutomerge>0 ){.
1bf00 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1bf10 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
1bf20 53 74 72 75 63 74 3b 0a 20 20 20 20 75 36 34 20  Struct;.    u64 
1bf30 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
1bf40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
1bf50 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72  tial value of wr
1bf60 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ite-counter */. 
1bf70 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20     int nWork;   
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f   /* Number of wo
1bfa0 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72  rk-quanta to per
1bfb0 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  form */.    int 
1bfc0 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nRem;           
1bfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bfe0 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
1bff0 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20  s left to write 
1c000 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  */..    /* Updat
1c010 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e  e the write-coun
1c020 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67  ter. While doing
1c030 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20   so, set nWork. 
1c040 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20  */.    nWrite = 
1c050 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
1c060 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72  ounter;.    nWor
1c070 6b 20 3d 20 28 69 6e 74 29 28 28 28 6e 57 72 69  k = (int)(((nWri
1c080 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d  te + nLeaf) / p-
1c090 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e  >nWorkUnit) - (n
1c0a0 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b  Write / p->nWork
1c0b0 55 6e 69 74 29 29 3b 0a 20 20 20 20 70 53 74 72  Unit));.    pStr
1c0c0 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
1c0d0 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20  er += nLeaf;.   
1c0e0 20 6e 52 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d   nRem = (int)(p-
1c0f0 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f  >nWorkUnit * nWo
1c100 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c  rk * pStruct->nL
1c110 65 76 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35  evel);..    fts5
1c120 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70 70  IndexMerge(p, pp
1c130 53 74 72 75 63 74 2c 20 6e 52 65 6d 29 3b 0a 20  Struct, nRem);. 
1c140 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1c150 64 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69  d fts5IndexCrisi
1c160 73 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  smerge(.  Fts5In
1c170 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1c180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1c190 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1c1a0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1c1b0 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20  ure **ppStruct  
1c1c0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1c1d0 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
1c1e0 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29  re of index */.)
1c1f0 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43  {.  const int nC
1c200 72 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66  risis = p->pConf
1c210 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65  ig->nCrisisMerge
1c220 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
1c230 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
1c240 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c  Struct;.  int iL
1c250 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  vl = 0;..  asser
1c260 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
1c270 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e  _OK || pStruct->
1c280 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68  nLevel>0 );.  wh
1c290 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1c2a0 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74  TE_OK && pStruct
1c2b0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1c2c0 53 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a  Seg>=nCrisis ){.
1c2d0 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1c2e0 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72  geLevel(p, &pStr
1c2f0 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20  uct, iLvl, 0);. 
1c300 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1c310 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b  Promote(p, iLvl+
1c320 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
1c330 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a   iLvl++;.  }.  *
1c340 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
1c350 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ct;.}..static in
1c360 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  t fts5IndexRetur
1c370 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  n(Fts5Index *p){
1c380 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
1c390 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  c;.  p->rc = SQL
1c3a0 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
1c3b0 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
1c3c0 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
1c3d0 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78  Ctx Fts5FlushCtx
1c3e0 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  ;.struct Fts5Flu
1c3f0 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e  shCtx {.  Fts5In
1c400 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73  dex *pIdx;.  Fts
1c410 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
1c420 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75  r; .};../*.** Bu
1c430 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74  ffer aBuf[] cont
1c440 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76  ains a list of v
1c450 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c  arints, all smal
1c460 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a  l enough to fit.
1c470 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  ** in a 32-bit i
1c480 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74  nteger. Return t
1c490 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c  he size of the l
1c4a0 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66  argest prefix of
1c4b0 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e   this .** list n
1c4c0 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73  Max bytes or les
1c4d0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
1c4e0 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73  atic int fts5Pos
1c4f0 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74  listPrefix(const
1c500 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e   u8 *aBuf, int n
1c510 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b  Max){.  int ret;
1c520 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20  .  u32 dummy;.  
1c530 72 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  ret = fts5GetVar
1c540 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d  int32(aBuf, dumm
1c550 79 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  y);.  while( 1 )
1c560 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74  {.    int i = ft
1c570 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
1c580 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29  Buf[ret], dummy)
1c590 3b 0a 20 20 20 20 69 66 28 20 28 72 65 74 20 2b  ;.    if( (ret +
1c5a0 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65   i) > nMax ) bre
1c5b0 61 6b 3b 0a 20 20 20 20 72 65 74 20 2b 3d 20 69  ak;.    ret += i
1c5c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c5d0 65 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66  et;.}..#define f
1c5e0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1c5f0 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 42  endBlob(pBuf, pB
1c600 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 5c 0a  lob, nBlob) { \.
1c610 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
1c620 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 2d 3e 6e  nSpace>=(pBuf->n
1c630 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20  +nBlob) );      
1c640 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70         \.  memcp
1c650 79 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  y(&pBuf->p[pBuf-
1c660 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  >n], pBlob, nBlo
1c670 62 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  b);             
1c680 5c 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e  \.  pBuf->n += n
1c690 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a           \.}../*
1c6c0 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
1c6d0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d  ntents of in-mem
1c6e0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69  ory hash table i
1c6f0 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65  Hash to a new le
1c700 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e  vel-0 .** segmen
1c710 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20  t on disk. Also 
1c720 75 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65  update the corre
1c730 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75  sponding structu
1c740 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  re record..**.**
1c750 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c760 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
1c770 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
1c780 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
1c790 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
1c7a0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1c7b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1c7c0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1c7d0 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e  void fts5FlushOn
1c7e0 65 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20  eHash(Fts5Index 
1c7f0 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20  *p){.  Fts5Hash 
1c800 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73  *pHash = p->pHas
1c810 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  h;.  Fts5Structu
1c820 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69  re *pStruct;.  i
1c830 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  nt iSegid;.  int
1c840 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20   pgnoLast = 0;  
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c860 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
1c870 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
1c880 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  nt */..  /* Obta
1c890 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
1c8a0 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  o the index stru
1c8b0 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61  cture and alloca
1c8c0 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74  te a new segment
1c8d0 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  -id.  ** for the
1c8e0 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67   new level-0 seg
1c8f0 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72  ment.  */.  pStr
1c900 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1c910 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53  ureRead(p);.  iS
1c920 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
1c930 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
1c940 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  uct);..  if( iSe
1c950 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  gid ){.    const
1c960 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70   int pgsz = p->p
1c970 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20  Config->pgsz;.. 
1c980 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1c990 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
1c9a0 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20   /* New segment 
1c9b0 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a  within pStruct *
1c9c0 2f 0a 20 20 20 20 69 6e 74 20 6e 48 65 69 67 68  /.    int nHeigh
1c9d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1c9e0 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66      /* Height of
1c9f0 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 62 2d 74   new segment b-t
1ca00 72 65 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42  ree */.    Fts5B
1ca10 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20  uffer *pBuf;    
1ca20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
1ca30 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61  er in which to a
1ca40 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67  ssemble leaf pag
1ca50 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  e */.    const u
1ca60 38 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 0a 20  8 *zPrev = 0;.. 
1ca70 20 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72     Fts5SegWriter
1ca80 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73   writer;.    fts
1ca90 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
1caa0 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a  riter, iSegid);.
1cab0 0a 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f  .    /* Pre-allo
1cac0 63 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  cate the buffer 
1cad0 75 73 65 64 20 74 6f 20 61 73 73 65 6d 62 6c 65  used to assemble
1cae0 20 6c 65 61 66 20 70 61 67 65 73 20 74 6f 20 74   leaf pages to t
1caf0 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a  he target.    **
1cb00 20 70 61 67 65 20 73 69 7a 65 2e 20 20 2a 2f 0a   page size.  */.
1cb10 20 20 20 20 61 73 73 65 72 74 28 20 70 67 73 7a      assert( pgsz
1cb20 3e 30 20 29 3b 0a 20 20 20 20 70 42 75 66 20 3d  >0 );.    pBuf =
1cb30 20 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72   &writer.aWriter
1cb40 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 66 74 73  [0].buf;.    fts
1cb50 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1cb60 72 63 2c 20 70 42 75 66 2c 20 70 67 73 7a 20 2b  rc, pBuf, pgsz +
1cb70 20 32 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65   20);..    /* Be
1cb80 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  gin scanning thr
1cb90 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20  ough hash table 
1cba0 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f  entries. This lo
1cbb0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
1cbc0 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72   each.    ** ter
1cbd0 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e  m/doclist curren
1cbe0 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69  tly stored withi
1cbf0 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
1cc00 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1cc10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cc20 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42  .      memset(pB
1cc30 75 66 2d 3e 70 2c 20 30 2c 20 34 29 3b 0a 20 20  uf->p, 0, 4);.  
1cc40 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 34 3b      pBuf->n = 4;
1cc50 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
1cc60 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
1cc70 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c  anInit(pHash, 0,
1cc80 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   0);.    }.    w
1cc90 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1cca0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
1ccb0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1ccc0 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20  Eof(pHash) ){.  
1ccd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1cce0 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  zTerm;          
1ccf0 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
1cd00 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ning term */.   
1cd10 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20     int nTerm;   
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cd30 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20  * Size of zTerm 
1cd40 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
1cd50 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63    const u8 *pDoc
1cd60 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  list;         /*
1cd70 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
1cd80 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72  ist for this ter
1cd90 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  m */.      int n
1cda0 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
1cdb0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1cdc0 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74  f doclist in byt
1cdd0 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
1cde0 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20  nSuffix;        
1cdf0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ce00 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20 2a  of term suffix *
1ce10 2f 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  /..      sqlite3
1ce20 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
1ce30 79 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  y(pHash, &zTerm,
1ce40 20 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f   &pDoclist, &nDo
1ce50 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 6e 54  clist);.      nT
1ce60 65 72 6d 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65  erm = strlen(zTe
1ce70 72 6d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  rm);..      /* D
1ce80 65 63 69 64 65 20 69 66 20 74 68 65 20 74 65 72  ecide if the ter
1ce90 6d 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  m will fit on th
1cea0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
1ceb0 49 66 20 69 74 20 77 69 6c 6c 20 6e 6f 74 2c 20  If it will not, 
1cec0 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
1ced0 74 68 65 20 6c 65 61 66 20 74 6f 20 64 69 73 6b  the leaf to disk
1cee0 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20   here.  */.     
1cef0 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
1cf00 6e 54 65 72 6d 20 2b 20 32 29 20 3e 20 70 67 73  nTerm + 2) > pgs
1cf10 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  z ){.        fts
1cf20 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1cf30 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
1cf40 20 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69       pBuf = &wri
1cf50 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e 62  ter.aWriter[0].b
1cf60 75 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  uf;.        if( 
1cf70 28 6e 54 65 72 6d 20 2b 20 33 32 29 20 3e 20 70  (nTerm + 32) > p
1cf80 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20  Buf->nSpace ){. 
1cf90 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1cfa0 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
1cfb0 70 42 75 66 2c 20 6e 54 65 72 6d 20 2b 20 33 32  pBuf, nTerm + 32
1cfc0 20 2d 20 70 42 75 66 2d 3e 6e 29 3b 0a 20 20 20   - pBuf->n);.   
1cfd0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1cfe0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1cff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1d000 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1d010 74 65 72 6d 20 74 6f 20 74 68 65 20 6c 65 61 66  term to the leaf
1d020 2e 20 41 6e 64 20 69 66 20 69 74 20 69 73 20 74  . And if it is t
1d030 68 65 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20  he first on the 
1d040 6c 65 61 66 2c 20 61 6e 64 0a 20 20 20 20 20 20  leaf, and.      
1d050 2a 2a 20 74 68 65 20 6c 65 61 66 20 69 73 20 6e  ** the leaf is n
1d060 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 31  ot page number 1
1d070 2c 20 70 75 73 68 20 69 74 20 75 70 20 69 6e 74  , push it up int
1d080 6f 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  o the b-tree hie
1d090 72 61 72 63 68 79 20 0a 20 20 20 20 20 20 2a 2a  rarchy .      **
1d0a0 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
1d0b0 20 20 20 20 69 66 28 20 77 72 69 74 65 72 2e 62      if( writer.b
1d0c0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 3d  FirstTermInPage=
1d0d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
1d0e0 74 20 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65  t nPre = fts5Pre
1d0f0 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 54 65 72  fixCompress(nTer
1d100 6d 2c 20 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c  m, zPrev, nTerm,
1d110 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72   (const u8*)zTer
1d120 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66  m);.        pBuf
1d130 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
1d140 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
1d150 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e  f->p[pBuf->n], n
1d160 50 72 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 53  Pre);.        nS
1d170 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d 20  uffix = nTerm - 
1d180 6e 50 72 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nPre;.      }els
1d190 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 50  e{.        fts5P
1d1a0 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 32  utU16(&pBuf->p[2
1d1b0 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 0a 20 20 20  ], pBuf->n);.   
1d1c0 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72       writer.bFir
1d1d0 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30  stTermInPage = 0
1d1e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 72  ;.        if( wr
1d1f0 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e  iter.aWriter[0].
1d200 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20  pgno!=1 ){.     
1d210 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d 20       int nPre = 
1d220 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
1d230 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72 65 76 2c  ss(nTerm, zPrev,
1d240 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75   nTerm, (const u
1d250 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
1d260 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
1d270 72 65 65 54 65 72 6d 28 70 2c 20 26 77 72 69 74  reeTerm(p, &writ
1d280 65 72 2c 20 6e 50 72 65 2b 31 2c 20 28 63 6f 6e  er, nPre+1, (con
1d290 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20  st u8*)zTerm);. 
1d2a0 20 20 20 20 20 20 20 20 20 70 42 75 66 20 3d 20           pBuf = 
1d2b0 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b  &writer.aWriter[
1d2c0 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20  0].buf;.        
1d2d0 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 3c 6e    assert( nPre<n
1d2e0 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Term );.        
1d2f0 7d 0a 20 20 20 20 20 20 20 20 6e 53 75 66 66 69  }.        nSuffi
1d300 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  x = nTerm;.     
1d310 20 7d 0a 20 20 20 20 20 20 70 42 75 66 2d 3e 6e   }.      pBuf->n
1d320 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50   += sqlite3Fts5P
1d330 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  utVarint(&pBuf->
1d340 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e 53 75 66  p[pBuf->n], nSuf
1d350 66 69 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35  fix);.      fts5
1d360 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1d370 42 6c 6f 62 28 70 42 75 66 2c 20 28 63 6f 6e 73  Blob(pBuf, (cons
1d380 74 20 75 38 2a 29 26 7a 54 65 72 6d 5b 6e 54 65  t u8*)&zTerm[nTe
1d390 72 6d 2d 6e 53 75 66 66 69 78 5d 2c 20 6e 53 75  rm-nSuffix], nSu
1d3a0 66 66 69 78 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ffix);..      /*
1d3b0 20 57 65 20 6a 75 73 74 20 77 72 6f 74 65 20 61   We just wrote a
1d3c0 20 74 65 72 6d 20 69 6e 74 6f 20 70 61 67 65 20   term into page 
1d3d0 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30  writer.aWriter[0
1d3e0 5d 2e 70 67 6e 6f 2e 20 49 66 20 61 20 0a 20 20  ].pgno. If a .  
1d3f0 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69      ** doclist-i
1d400 6e 64 65 78 20 69 73 20 74 6f 20 62 65 20 67 65  ndex is to be ge
1d410 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1d420 20 64 6f 63 6c 69 73 74 2c 20 69 74 20 77 69 6c   doclist, it wil
1d430 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  l be.      ** as
1d440 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1d450 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  is page. */.    
1d460 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65 72    assert( writer
1d470 2e 6e 44 6c 69 64 78 3e 30 20 26 26 20 77 72 69  .nDlidx>0 && wri
1d480 74 65 72 2e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  ter.aDlidx[0].bu
1d490 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  f.n==0 );.      
1d4a0 77 72 69 74 65 72 2e 61 44 6c 69 64 78 5b 30 5d  writer.aDlidx[0]
1d4b0 2e 70 67 6e 6f 20 3d 20 77 72 69 74 65 72 2e 61  .pgno = writer.a
1d4c0 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 3b 0a  Writer[0].pgno;.
1d4d0 0a 20 20 20 20 20 20 69 66 28 20 70 67 73 7a 3e  .      if( pgsz>
1d4e0 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 44 6f 63  =(pBuf->n + nDoc
1d4f0 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20 20 20  list + 1) ){.   
1d500 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
1d510 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20  re doclist will 
1d520 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
1d530 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20  nt leaf. */.    
1d540 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1d550 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
1d560 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  f, pDoclist, nDo
1d570 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  clist);.      }e
1d580 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
1d590 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20   iRowid = 0;.   
1d5a0 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20       i64 iDelta 
1d5b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
1d5c0 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20   iOff = 0;..    
1d5d0 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72 73      writer.bFirs
1d5e0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
1d5f0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
1d600 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
1d610 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
1d620 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20   this leaf. The 
1d630 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20  following .     
1d640 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61     ** loop itera
1d650 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  tes through the 
1d660 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61  poslists that ma
1d670 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e  ke up the curren
1d680 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  t .        ** do
1d690 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  clist.  */.     
1d6a0 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1d6b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f  =SQLITE_OK && iO
1d6c0 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ff<nDoclist ){. 
1d6d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f           int nPo
1d6e0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  s;.          int
1d6f0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   nCopy;.        
1d700 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
1d710 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
1d720 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
1d730 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28  Doclist[iOff], (
1d740 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
1d750 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d           nCopy =
1d760 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
1d770 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  ize(&pDoclist[iO
1d780 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  ff], &nPos, &bDu
1d790 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mmy);.          
1d7a0 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20  nCopy += nPos;. 
1d7b0 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20           iRowid 
1d7c0 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
1d7d0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
1d7e0 69 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73  if( writer.bFirs
1d7f0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
1d800 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1d810 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b  PutU16(&pBuf->p[
1d820 30 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 20 20 20  0], pBuf->n);   
1d830 2f 2a 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f  /* first docid o
1d840 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  n page */.      
1d850 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
1d860 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
1d870 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1d880 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29  Buf->n], iRowid)
1d890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72  ;.            wr
1d8a0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
1d8b0 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  InPage = 0;.    
1d8c0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
1d8d0 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
1d8e0 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  &writer, iRowid)
1d8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1d900 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
1d910 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
1d920 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
1d930 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
1d940 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  , iDelta);.     
1d950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d960 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
1d970 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
1d980 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
1d990 20 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 43 6f 70   (pBuf->n + nCop
1d9a0 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20  y) <= pgsz ){.  
1d9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d9c0 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20   entire poslist 
1d9d0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
1d9e0 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f  current leaf. So
1d9f0 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20   copy.          
1da00 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67    ** it in one g
1da10 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  o. */.          
1da20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1da30 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
1da40 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d   &pDoclist[iOff]
1da50 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1da60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1da70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
1da80 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c  tire poslist wil
1da90 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69  l not fit on thi
1daa0 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65  s leaf. So it ne
1dab0 65 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  eds.            
1dac0 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20  ** to be broken 
1dad0 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54  into sections. T
1dae0 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63  he only qualific
1daf0 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20  ation being.    
1db00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1db10 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74  each varint must
1db20 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69   be stored conti
1db30 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20  guously.  */.   
1db40 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75           const u
1db50 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70  8 *pPoslist = &p
1db60 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20  Doclist[iOff];. 
1db70 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1db80 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
1db90 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
1dba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1dbc0 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20  t nSpace = pgsz 
1dbd0 2d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20  - pBuf->n;.     
1dbe0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
1dbf0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1dc00 20 20 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69    if( (nCopy - i
1dc10 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a  Pos)<=nSpace ){.
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73  n = nCopy - iPos
1dc40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dc50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1dc60 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50         n = fts5P
1dc70 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50  oslistPrefix(&pP
1dc80 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53  oslist[iPos], nS
1dc90 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  pace);.         
1dca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1dcb0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30       assert( n>0
1dcc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1dcd0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1dce0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
1dcf0 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d   &pPoslist[iPos]
1dd00 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
1dd10 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20      iPos += n;. 
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1dd30 20 70 42 75 66 2d 3e 6e 3e 3d 70 67 73 7a 20 29   pBuf->n>=pgsz )
1dd40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1dd50 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1dd60 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29  Leaf(p, &writer)
1dd70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dd80 20 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72    pBuf = &writer
1dd90 2e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b  .aWriter[0].buf;
1dda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1ddb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1ddc0 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29  f( iPos>=nCopy )
1ddd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1dde0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ddf0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  }.          iOff
1de00 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   += nCopy;.     
1de10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1de20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66      pBuf->p[pBuf
1de30 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  ->n++] = '\0';. 
1de40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
1de50 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
1de60 63 65 20 29 3b 0a 20 20 20 20 20 20 7a 50 72 65  ce );.      zPre
1de70 76 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a  v = (const u8*)z
1de80 54 65 72 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  Term;.      sqli
1de90 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e  te3Fts5HashScanN
1dea0 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20  ext(pHash);.    
1deb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
1dec0 35 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68  5HashClear(pHash
1ded0 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  );.    fts5Write
1dee0 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65  Finish(p, &write
1def0 72 2c 20 26 6e 48 65 69 67 68 74 2c 20 26 70 67  r, &nHeight, &pg
1df00 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  noLast);..    /*
1df10 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
1df20 53 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  Structure. It is
1df30 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1df40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79   the database by
1df50 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73 35   the.    ** fts5
1df60 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
1df70 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20  () call below.  
1df80 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  */.    if( pStru
1df90 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b  ct->nLevel==0 ){
1dfa0 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1dfb0 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d  tureAddLevel(&p-
1dfc0 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b 0a  >rc, &pStruct);.
1dfd0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
1dfe0 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
1dff0 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
1e000 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  ct, 0, 1, 0);.  
1e010 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1e020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e030 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d  pSeg = &pStruct-
1e040 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b  >aLevel[0].aSeg[
1e050 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1e060 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20  [0].nSeg++ ];.  
1e070 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
1e080 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 20   = iSegid;.     
1e090 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 20 3d   pSeg->nHeight =
1e0a0 20 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 20 20   nHeight;.      
1e0b0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1e0c0 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  = 1;.      pSeg-
1e0d0 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f  >pgnoLast = pgno
1e0e0 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53 74 72  Last;.      pStr
1e0f0 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  uct->nSegment++;
1e100 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
1e110 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
1e120 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29 3b 0a  p, 0, pStruct);.
1e130 20 20 7d 0a 0a 0a 20 20 66 74 73 35 49 6e 64 65    }...  fts5Inde
1e140 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26 70  xAutomerge(p, &p
1e150 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74  Struct, pgnoLast
1e160 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43 72  );.  fts5IndexCr
1e170 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70 53  isismerge(p, &pS
1e180 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74  truct);.  fts5St
1e190 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
1e1a0 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
1e1b0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
1e1c0 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a  (pStruct);.}../*
1e1d0 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61  .** Flush any da
1e1e0 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
1e1f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
1e200 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64 61  tables to the da
1e210 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1e220 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1e230 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78 20  Flush(Fts5Index 
1e240 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p){.  /* Unless
1e250 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66 6c   it is empty, fl
1e260 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62  ush the hash tab
1e270 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  le to disk */.  
1e280 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  if( p->nPendingD
1e290 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ata ){.    asser
1e2a0 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20  t( p->pHash );. 
1e2b0 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
1e2c0 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35  ta = 0;.    fts5
1e2d0 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29 3b  FlushOneHash(p);
1e2e0 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c  .  }.}...int sql
1e2f0 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74  ite3Fts5IndexOpt
1e300 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20  imize(Fts5Index 
1e310 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
1e320 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
1e330 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1e340 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pNew = 0;.  int 
1e350 6e 53 65 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nSeg = 0;..  ass
1e360 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
1e370 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49  TE_OK );.  fts5I
1e380 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
1e390 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1e3a0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
1e3b0 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
1e3c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1e3d0 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
1e3e0 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f  =fts5StructureCo
1e3f0 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72  untSegments(pStr
1e400 75 63 74 29 20 29 3b 0a 20 20 20 20 6e 53 65 67  uct) );.    nSeg
1e410 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67   = pStruct->nSeg
1e420 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e 53  ment;.    if( nS
1e430 65 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  eg>1 ){.      in
1e440 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
1e450 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 3b  (Fts5Structure);
1e460 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
1e470 28 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  (pStruct->nLevel
1e480 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  +1) * sizeof(Fts
1e490 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
1e4a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  ;.      pNew = (
1e4b0 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73  Fts5Structure*)s
1e4c0 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
1e4d0 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79  Zero(&p->rc, nBy
1e4e0 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  te);.    }.  }. 
1e4f0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1e500 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
1e510 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 69  vel *pLvl;.    i
1e520 6e 74 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20  nt nByte = nSeg 
1e530 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1e540 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
1e550 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c      pNew->nLevel
1e560 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
1e570 65 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  el+1;.    pNew->
1e580 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d 20  nWriteCounter = 
1e590 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
1e5a0 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c  ounter;.    pLvl
1e5b0 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c   = &pNew->aLevel
1e5c0 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
1e5d0 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65  ];.    pLvl->aSe
1e5e0 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
1e5f0 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74  reSegment*)sqlit
1e600 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1e610 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
1e620 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61  .    if( pLvl->a
1e630 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
1e640 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
1e650 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d     int iSegOut =
1e660 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c   0;.      for(iL
1e670 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
1e680 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1e690 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
1e6a0 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
1e6b0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1e6c0 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
1e6d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  ){.          pLv
1e6e0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d  l->aSeg[iSegOut]
1e6f0 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
1e700 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
1e710 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
1e720 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  SegOut++;.      
1e730 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e740 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74    pNew->nSegment
1e750 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20   = pLvl->nSeg = 
1e760 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nSeg;.    }else{
1e770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1e780 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
1e790 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d   pNew = 0;.    }
1e7a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77  .  }..  if( pNew
1e7b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
1e7c0 20 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d   = pNew->nLevel-
1e7d0 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  1;.    while( p-
1e7e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1e7f0 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  & pNew->aLevel[i
1e800 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20  Lvl].nSeg>0 ){. 
1e810 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20       int nRem = 
1e820 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e  FTS5_OPT_WORK_UN
1e830 49 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e  IT;.      fts5In
1e840 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
1e850 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e   &pNew, iLvl, &n
1e860 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Rem);.    }..   
1e870 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1e880 69 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ite(p, pNew);.  
1e890 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1e8a0 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
1e8b0 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
1e8c0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1e8d0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
1e8e0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
1e8f0 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
1e900 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46  Fts5IndexMerge(F
1e910 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
1e920 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35   nMerge){.  Fts5
1e930 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1e940 63 74 3b 0a 0a 20 20 70 53 74 72 75 63 74 20 3d  ct;..  pStruct =
1e950 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1e960 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74  ad(p);.  if( pSt
1e970 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74 2d  ruct && pStruct-
1e980 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 66  >nLevel ){.    f
1e990 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
1e9a0 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67   &pStruct, nMerg
1e9b0 65 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75  e);.    fts5Stru
1e9c0 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53  ctureWrite(p, pS
1e9d0 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74  truct);.  }.  ft
1e9e0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1e9f0 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  se(pStruct);..  
1ea00 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
1ea10 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74  Return(p);.}..st
1ea20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
1ea30 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20  slistCallback(. 
1ea40 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1ea50 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
1ea60 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e   const u8 *pChun
1ea70 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b  k, int nChunk.){
1ea80 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
1ea90 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1eaa0 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43 74  (Fts5Buffer*)pCt
1eab0 78 2c 20 6e 43 68 75 6e 6b 2c 20 70 43 68 75 6e  x, nChunk, pChun
1eac0 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  k);.}../*.** Ite
1ead0 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
1eae0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
1eaf0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e  a valid entry (n
1eb00 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a  ot EOF). This.**
1eb10 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
1eb20 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
1eb30 69 73 74 20 64 61 74 61 20 66 6f 72 20 74 68 65  ist data for the
1eb40 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 74   current entry t
1eb50 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
1eb60 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  . It does not ma
1eb70 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
1eb80 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
1eb90 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f  ize.** field..*/
1eba0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1ebb0 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
1ebc0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1ebd0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
1ebe0 70 53 65 67 2c 0a 20 20 46 74 73 35 42 75 66 66  pSeg,.  Fts5Buff
1ebf0 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 66 74  er *pBuf.){.  ft
1ec00 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
1ec10 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70  , pSeg, (void*)p
1ec20 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74  Buf, fts5Poslist
1ec30 43 61 6c 6c 62 61 63 6b 29 3b 0a 7d 0a 0a 2f 2a  Callback);.}../*
1ec40 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 4d 75  .** Iterator pMu
1ec50 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  lti currently po
1ec60 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
1ec70 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e  entry (not EOF).
1ec80 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
1ec90 6e 20 61 70 70 65 6e 64 73 20 61 20 63 6f 70 79  n appends a copy
1eca0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
1ecb0 2d 6c 69 73 74 20 6f 66 20 74 68 65 20 65 6e 74  -list of the ent
1ecc0 72 79 20 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75  ry pMulti .** cu
1ecd0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1ece0 6f 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  o to buffer pBuf
1ecf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1ed00 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1ed10 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
1ed20 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69  t in p->rc. It i
1ed30 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20  s assumed.** no 
1ed40 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
1ed50 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
1ed60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ed70 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1ed80 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
1ed90 69 49 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20  iIterPoslist(.  
1eda0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
1edb0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
1edc0 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20   *pMulti,.  int 
1edd0 62 53 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20  bSz,            
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1edf0 70 70 65 6e 64 20 61 20 73 69 7a 65 20 66 69 65  ppend a size fie
1ee00 6c 64 20 62 65 66 6f 72 65 20 74 68 65 20 64 61  ld before the da
1ee10 74 61 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ta */.  Fts5Buff
1ee20 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
1ee30 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ee40 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  OK ){.    Fts5Se
1ee50 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1ee60 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75  Multi->aSeg[ pMu
1ee70 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  lti->aFirst[1].i
1ee80 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 61 73 73  First ];.    ass
1ee90 65 72 74 28 20 66 74 73 35 4d 75 6c 74 69 49 74  ert( fts5MultiIt
1eea0 65 72 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29  erEof(p, pMulti)
1eeb0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
1eec0 62 53 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  bSz ){.      /* 
1eed0 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
1eee0 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 42 75   */.      fts5Bu
1eef0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1ef00 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70  (&p->rc, pBuf, p
1ef10 53 65 67 2d 3e 6e 50 6f 73 2a 32 29 3b 0a 20 20  Seg->nPos*2);.  
1ef20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67 69    }.    fts5Segi
1ef30 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 53  terPoslist(p, pS
1ef40 65 67 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d  eg, pBuf);.  }.}
1ef50 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1ef60 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1ef70 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t(Fts5DoclistIte
1ef80 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
1ef90 20 70 49 74 65 72 2d 3e 69 3c 70 49 74 65 72 2d   pIter->i<pIter-
1efa0 3e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 44  >n ){.    int bD
1efb0 75 6d 6d 79 3b 0a 20 20 20 20 69 66 28 20 70 49  ummy;.    if( pI
1efc0 74 65 72 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20  ter->i ){.      
1efd0 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  i64 iDelta;.    
1efe0 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74    pIter->i += ft
1eff0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 49 74  s5GetVarint(&pIt
1f000 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c  er->a[pIter->i],
1f010 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
1f020 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52  .      pIter->iR
1f030 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
1f040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f050 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73   pIter->i += fts
1f060 35 47 65 74 56 61 72 69 6e 74 28 26 70 49 74 65  5GetVarint(&pIte
1f070 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20  r->a[pIter->i], 
1f080 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
1f090 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
1f0a0 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73   pIter->i += fts
1f0b0 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
1f0c0 0a 20 20 20 20 20 20 20 20 26 70 49 74 65 72 2d  .        &pIter-
1f0d0 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 26 70  >a[pIter->i], &p
1f0e0 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 2c 20  Iter->nPoslist, 
1f0f0 26 62 44 75 6d 6d 79 0a 20 20 20 20 29 3b 0a 20  &bDummy.    );. 
1f100 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69     pIter->aPosli
1f110 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70  st = &pIter->a[p
1f120 49 74 65 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49  Iter->i];.    pI
1f130 74 65 72 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d  ter->i += pIter-
1f140 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c  >nPoslist;.  }el
1f150 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  se{.    pIter->a
1f160 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d  Poslist = 0;.  }
1f170 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1f180 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
1f190 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65  nit(.  Fts5Buffe
1f1a0 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35  r *pBuf, .  Fts5
1f1b0 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
1f1c0 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  er.){.  memset(p
1f1d0 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
1f1e0 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
1f1f0 72 2d 3e 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a  r->a = pBuf->p;.
1f200 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 70 42 75    pIter->n = pBu
1f210 66 2d 3e 6e 3b 0a 20 20 66 74 73 35 44 6f 63 6c  f->n;.  fts5Docl
1f220 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74 65  istIterNext(pIte
1f230 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  r);.}../*.** App
1f240 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74 6f  end a doclist to
1f250 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2f   buffer pBuf..*/
1f260 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1f270 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
1f280 64 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  d(.  int *pRc,  
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1f2b0 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
1f2c0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1f2d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f2e0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69  /* Buffer to wri
1f2f0 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a  te to */.  i64 *
1f300 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20  piLastRowid,    
1f310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
1f320 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72  /OUT: Previous r
1f330 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66  owid written (if
1f340 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69   any) */.  i64 i
1f350 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
1f360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1f370 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  wid to append */
1f380 0a 29 7b 0a 20 20 69 66 28 20 70 42 75 66 2d 3e  .){.  if( pBuf->
1f390 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
1f3a0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1f3b0 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52  nt(pRc, pBuf, iR
1f3c0 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
1f3d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f3e0 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20  pendVarint(pRc, 
1f3f0 70 42 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a  pBuf, iRowid - *
1f400 70 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20  piLastRowid);.  
1f410 7d 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  }.  *piLastRowid
1f420 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a   = iRowid;.}../*
1f430 0a 2a 2a 20 42 75 66 66 65 72 73 20 70 31 20 61  .** Buffers p1 a
1f440 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f  nd p2 contain do
1f450 63 6c 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e  clists. This fun
1f460 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65  ction merges the
1f470 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74   content.** of t
1f480 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20  he two doclists 
1f490 74 6f 67 65 74 68 65 72 20 61 6e 64 20 73 65 74  together and set
1f4a0 73 20 62 75 66 66 65 72 20 70 31 20 74 6f 20 74  s buffer p1 to t
1f4b0 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65  he result before
1f4c0 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  .** returning..*
1f4d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1f4e0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
1f4f0 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
1f500 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65  n p->rc. If an e
1f510 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65  rror has.** alre
1f520 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1f530 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1f540 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1f550 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
1f560 50 72 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46  PrefixLists(.  F
1f570 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f590 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1f5a0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42  bject */.  Fts5B
1f5b0 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20  uffer *p1,      
1f5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1f5d0 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  rst list to merg
1f5e0 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
1f5f0 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20  r *p2           
1f600 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
1f610 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
1f620 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e  /.){.  if( p2->n
1f630 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   ){.    i64 iLas
1f640 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  tRowid = 0;.    
1f650 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
1f660 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c  i1;.    Fts5Docl
1f670 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20  istIter i2;.    
1f680 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a  Fts5Buffer out;.
1f690 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
1f6a0 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  mp;.    memset(&
1f6b0 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f  out, 0, sizeof(o
1f6c0 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ut));.    memset
1f6d0 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66  (&tmp, 0, sizeof
1f6e0 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66 74 73  (tmp));..    fts
1f6f0 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
1f700 28 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 66  (p1, &i1);.    f
1f710 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
1f720 69 74 28 70 32 2c 20 26 69 32 29 3b 0a 20 20 20  it(p2, &i2);.   
1f730 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1f740 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e  QLITE_OK && (i1.
1f750 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69  aPoslist!=0 || i
1f760 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 29 20 29  2.aPoslist!=0) )
1f770 7b 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61  {.      if( i2.a
1f780 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69  Poslist==0 || (i
1f790 31 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 69 31  1.aPoslist && i1
1f7a0 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69  .iRowid<i2.iRowi
1f7b0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  d) ){.        /*
1f7c0 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
1f7d0 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i1 */.        f
1f7e0 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
1f7f0 63 69 64 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  cid(&p->rc, &out
1f800 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  , &iLastRowid, i
1f810 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  1.iRowid);.     
1f820 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
1f830 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20  STSIZE */.      
1f840 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1f850 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1f860 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69   &out, i1.nPosli
1f870 73 74 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20  st * 2);.       
1f880 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1f890 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f  dBlob(&p->rc, &o
1f8a0 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  ut, i1.nPoslist,
1f8b0 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20   i1.aPoslist);. 
1f8c0 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69         fts5Docli
1f8d0 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b  stIterNext(&i1);
1f8e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
1f8f0 6c 73 65 20 69 66 28 20 69 31 2e 61 50 6f 73 6c  lse if( i1.aPosl
1f900 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f  ist==0 || i2.iRo
1f910 77 69 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29  wid!=i1.iRowid )
1f920 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  {.        /* Cop
1f930 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20  y entry from i2 
1f940 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  */.        fts5M
1f950 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
1f960 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 26 69  &p->rc, &out, &i
1f970 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
1f980 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 2f  owid);.        /
1f990 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
1f9a0 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  ZE */.        ft
1f9b0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1f9c0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75  rint(&p->rc, &ou
1f9d0 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 20 2a  t, i2.nPoslist *
1f9e0 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   2);.        fts
1f9f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1fa00 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  b(&p->rc, &out, 
1fa10 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.nPoslist, i2.
1fa20 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  aPoslist);.     
1fa30 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1fa40 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20  erNext(&i2);.   
1fa50 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b     }.      else{
1fa60 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
1fa70 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b 0a 20  listReader r1;. 
1fa80 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69         Fts5Posli
1fa90 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20 20 20  stReader r2;.   
1faa0 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
1fab0 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 0a  Writer writer;..
1fac0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
1fad0 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  writer, 0, sizeo
1fae0 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20  f(writer));..   
1faf0 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68       /* Merge th
1fb00 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  e two position l
1fb10 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ists. */ .      
1fb20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
1fb30 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 26  dDocid(&p->rc, &
1fb40 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64  out, &iLastRowid
1fb50 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
1fb60 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fb70 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20  Zero(&tmp);.    
1fb80 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
1fb90 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
1fba0 28 2d 31 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74  (-1, i1.aPoslist
1fbb0 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i1.nPoslist, &
1fbc0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
1fbd0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
1fbe0 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 32  eaderInit(-1, i2
1fbf0 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50  .aPoslist, i2.nP
1fc00 6f 73 6c 69 73 74 2c 20 26 72 32 29 3b 0a 20 20  oslist, &r2);.  
1fc10 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
1fc20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1fc30 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 7c 7c 20   (r1.bEof==0 || 
1fc40 72 32 2e 62 45 6f 66 3d 3d 30 29 20 29 7b 0a 20  r2.bEof==0) ){. 
1fc50 20 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65           i64 iNe
1fc60 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  w;.          if(
1fc70 20 72 32 2e 62 45 6f 66 20 7c 7c 20 28 72 31 2e   r2.bEof || (r1.
1fc80 62 45 6f 66 3d 3d 30 20 26 26 20 72 31 2e 69 50  bEof==0 && r1.iP
1fc90 6f 73 3c 72 32 2e 69 50 6f 73 29 20 29 7b 0a 20  os<r2.iPos) ){. 
1fca0 20 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20             iNew 
1fcb0 3d 20 72 31 2e 69 50 6f 73 3b 0a 20 20 20 20 20  = r1.iPos;.     
1fcc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1fcd0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e  s5PoslistReaderN
1fce0 65 78 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20  ext(&r1);.      
1fcf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fd00 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 72 32         iNew = r2
1fd10 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20  .iPos;.         
1fd20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
1fd30 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
1fd40 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &r2);.          
1fd50 20 20 69 66 28 20 72 31 2e 69 50 6f 73 3d 3d 72    if( r1.iPos==r
1fd60 32 2e 69 50 6f 73 20 29 20 73 71 6c 69 74 65 33  2.iPos ) sqlite3
1fd70 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1fd80 72 4e 65 78 74 28 26 72 31 29 3b 0a 20 20 20 20  rNext(&r1);.    
1fd90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fda0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1fdb0 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74  3Fts5PoslistWrit
1fdc0 65 72 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  erAppend(&tmp, &
1fdd0 77 72 69 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20  writer, iNew);. 
1fde0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1fdf0 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
1fe00 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20  TSIZE */.       
1fe10 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1fe20 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1fe30 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29  &out, tmp.n * 2)
1fe40 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1fe50 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1fe60 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70  p->rc, &out, tmp
1fe70 2e 6e 2c 20 74 6d 70 2e 70 29 3b 0a 20 20 20 20  .n, tmp.p);.    
1fe80 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1fe90 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
1fea0 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
1feb0 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
1fec0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1fed0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
1fee0 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74  (&p->rc, p1, out
1fef0 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20  .n, out.p);.    
1ff00 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1ff10 74 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75  tmp);.    fts5Bu
1ff20 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a  fferFree(&out);.
1ff30 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1ff40 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61  id fts5BufferSwa
1ff50 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31  p(Fts5Buffer *p1
1ff60 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32  , Fts5Buffer *p2
1ff70 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ){.  Fts5Buffer 
1ff80 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31  tmp = *p1;.  *p1
1ff90 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20   = *p2;.  *p2 = 
1ffa0 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  tmp;.}..static v
1ffb0 6f 69 64 20 66 74 73 35 53 65 74 75 70 50 72 65  oid fts5SetupPre
1ffc0 66 69 78 49 74 65 72 28 0a 20 20 46 74 73 35 49  fixIter(.  Fts5I
1ffd0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1ffe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1fff0 64 65 78 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  dex to read from
20000 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c   */.  int bDesc,
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
20030 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69  r "ORDER BY rowi
20040 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e  d DESC" */.  con
20050 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20  st u8 *pToken,  
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20070 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
20080 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61 74 63  g prefix to matc
20090 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65  h */.  int nToke
200a0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
200b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
200c0 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65 6e 20  f buffer pToken 
200d0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74  in bytes */.  Ft
200e0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
200f0 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er            /*
20100 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f   Populate this o
20110 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74  bject */.){.  Ft
20120 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
20130 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66  ruct;.  Fts5Buff
20140 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73  er *aBuf;.  cons
20150 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b  t int nBuf = 32;
20160 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35  ..  aBuf = (Fts5
20170 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d  Buffer*)fts5IdxM
20180 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
20190 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66  Fts5Buffer)*nBuf
201a0 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  );.  pStruct = f
201b0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
201c0 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66  (p);..  if( aBuf
201d0 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20   && pStruct ){. 
201e0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
201f0 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51  gs = FTS5INDEX_Q
20200 55 45 52 59 5f 53 43 41 4e 3b 0a 20 20 20 20 69  UERY_SCAN;.    i
20210 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c  nt i;.    i64 iL
20220 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
20230 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
20240 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20  er *p1 = 0;     
20250 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
20260 20 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20   to gather data 
20270 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20  from index */.  
20280 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
20290 61 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  a;.    Fts5Buffe
202a0 72 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20  r doclist;..    
202b0 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c  memset(&doclist,
202c0 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69   0, sizeof(docli
202d0 73 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74  st));.    for(ft
202e0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
202f0 2c 20 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c  , pStruct, 1, fl
20300 61 67 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  ags, pToken, nTo
20310 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29  ken, -1, 0, &p1)
20320 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
20330 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31  ltiIterEof(p, p1
20340 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74  )==0;.        ft
20350 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
20360 70 2c 20 70 31 2c 20 30 2c 20 30 29 0a 20 20 20  p, p1, 0, 0).   
20370 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
20380 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
20390 49 74 65 72 52 6f 77 69 64 28 70 31 29 3b 0a 20  IterRowid(p1);. 
203a0 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a       int nTerm;.
203b0 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
203c0 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74  pTerm = fts5Mult
203d0 69 49 74 65 72 54 65 72 6d 28 70 31 2c 20 26 6e  iIterTerm(p1, &n
203e0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 61 73 73  Term);.      ass
203f0 65 72 74 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b  ert( memcmp(pTok
20400 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e  en, pTerm, MIN(n
20410 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d  Token, nTerm))<=
20420 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
20430 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d  Term<nToken || m
20440 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
20450 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62  erm, nToken) ) b
20460 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28  reak;..      if(
20470 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 26 26 20   doclist.n>0 && 
20480 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77  iRowid<=iLastRow
20490 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  id ){.        fo
204a0 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
204b0 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69  LITE_OK && docli
204c0 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  st.n; i++){.    
204d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
204e0 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20  nBuf );.        
204f0 20 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d    if( aBuf[i].n=
20500 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
20510 20 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70    fts5BufferSwap
20520 28 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66  (&doclist, &aBuf
20530 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
20540 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
20550 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  (&doclist);.    
20560 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20570 20 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72           fts5Mer
20580 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c  gePrefixLists(p,
20590 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66   &doclist, &aBuf
205a0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
205b0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
205c0 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20  (&aBuf[i]);.    
205d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
205e0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
205f0 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
20600 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 26 64  Docid(&p->rc, &d
20610 6f 63 6c 69 73 74 2c 20 26 69 4c 61 73 74 52 6f  oclist, &iLastRo
20620 77 69 64 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  wid, iRowid);.  
20630 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20640 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 31 2c 20  rPoslist(p, p1, 
20650 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  1, &doclist);.  
20660 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
20670 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a  ; i<nBuf; i++){.
20680 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50        fts5MergeP
20690 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20 26 64  refixLists(p, &d
206a0 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
206b0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
206c0 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d  ferFree(&aBuf[i]
206d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
206e0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
206f0 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44 61 74  , p1);..    pDat
20700 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f  a = fts5IdxMallo
20710 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
20720 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73 74 2e  Data) + doclist.
20730 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74  n);.    if( pDat
20740 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61  a ){.      pData
20750 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61 74  ->p = (u8*)&pDat
20760 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61 74  a[1];.      pDat
20770 61 2d 3e 6e 20 3d 20 64 6f 63 6c 69 73 74 2e 6e  a->n = doclist.n
20780 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
20790 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73 74  Data->p, doclist
207a0 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a  .p, doclist.n);.
207b0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
207c0 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61 74 61  terNew2(p, pData
207d0 2c 20 62 44 65 73 63 2c 20 26 70 49 74 65 72 2d  , bDesc, &pIter-
207e0 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 0a  >pMulti);.    }.
207f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
20800 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  ee(&doclist);.  
20810 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
20820 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
20830 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
20840 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a  ee(aBuf);.}.../*
20850 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
20860 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
20870 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
20880 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
20890 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20  ) pertain.** to 
208a0 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
208b0 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a  h rowid iRowid..
208c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
208d0 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74  s5IndexBeginWrit
208e0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
208f0 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61  i64 iRowid){.  a
20900 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
20910 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a  LITE_OK );..  /*
20920 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 68 61   Allocate the ha
20930 73 68 20 74 61 62 6c 65 20 69 66 20 69 74 20 68  sh table if it h
20940 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
20950 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
20960 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 3d  .  if( p->pHash=
20970 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  =0 ){.    p->rc 
20980 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
20990 68 4e 65 77 28 26 70 2d 3e 70 48 61 73 68 2c 20  hNew(&p->pHash, 
209a0 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  &p->nPendingData
209b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75  );.  }..  /* Flu
209c0 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  sh the hash tabl
209d0 65 20 74 6f 20 64 69 73 6b 20 69 66 20 72 65 71  e to disk if req
209e0 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 69  uired */.  if( i
209f0 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65  Rowid<=p->iWrite
20a00 52 6f 77 69 64 20 7c 7c 20 28 70 2d 3e 6e 50 65  Rowid || (p->nPe
20a10 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e  ndingData > p->n
20a20 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 29 20  MaxPendingData) 
20a30 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
20a40 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20  Flush(p);.  }.  
20a50 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
20a60 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72   iRowid;.  retur
20a70 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
20a80 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n(p);.}../*.** C
20a90 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69  ommit data to di
20aa0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
20ab0 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28  e3Fts5IndexSync(
20ac0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
20ad0 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73  t bCommit){.  as
20ae0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
20af0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
20b00 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20  IndexFlush(p);. 
20b10 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29 20 66   if( bCommit ) f
20b20 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
20b30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
20b40 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
20b50 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
20b60 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
20b70 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
20b80 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44  y hash tables. D
20b90 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a  o not write it.*
20ba0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
20bb0 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
20bc0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
20bd0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
20be0 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65   %_data.** table
20bf0 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
20c00 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e  d on disk. So an
20c10 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  y in-memory cach
20c20 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a  es of %_data .**
20c30 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65   records must be
20c40 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
20c50 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
20c60 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74  IndexRollback(Ft
20c70 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66  s5Index *p){.  f
20c80 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
20c90 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69  );.  fts5IndexDi
20ca0 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20  scardData(p);.  
20cb0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
20cc0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
20cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  }../*.** The %_d
20cf0 61 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  ata table is com
20d00 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68  pletely empty wh
20d10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
20d20 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73   is called. This
20d30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  .** function pop
20d40 75 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74  ulates it with t
20d50 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63  he initial struc
20d60 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72  ture objects for
20d70 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20   each index,.** 
20d80 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  and the initial 
20d90 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22  version of the "
20da0 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
20db0 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c   (a zero-byte bl
20dc0 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ob)..*/.int sqli
20dd0 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e  te3Fts5IndexRein
20de0 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  it(Fts5Index *p)
20df0 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
20e00 65 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  e s;..  assert( 
20e10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
20e20 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71   );.  p->rc = sq
20e30 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
20e40 74 41 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f  tAverages(p, (co
20e50 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a  nst u8*)"", 0);.
20e60 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c  .  memset(&s, 0,
20e70 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
20e80 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35 53  cture));.  fts5S
20e90 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
20ea0 20 26 73 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20   &s);..  return 
20eb0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
20ec0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  p);.}../*.** Ope
20ed0 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65  n a new Fts5Inde
20ee0 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65  x handle. If the
20ef0 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e   bCreate argumen
20f00 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61 74  t is true, creat
20f10 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
20f20 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
20f30 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  ng %_data table.
20f40 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
20f50 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f  sful, set *pp to
20f60 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
20f70 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  w object and ret
20f80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
20f90 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
20fa0 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   *pp to NULL and
20fb0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
20fc0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
20fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
20fe0 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73  IndexOpen(.  Fts
20ff0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
21000 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65  , .  int bCreate
21010 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  , .  Fts5Index *
21020 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  *pp,.  char **pz
21030 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Err.){.  int rc 
21040 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
21050 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20  ts5Index *p;    
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21070 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
21080 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74  .  *pp = p = (Ft
21090 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33  s5Index*)sqlite3
210a0 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
210b0 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49  rc, sizeof(Fts5I
210c0 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63  ndex));.  if( rc
210d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
210e0 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20     p->pConfig = 
210f0 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e  pConfig;.    p->
21100 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35  nWorkUnit = FTS5
21110 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20  _WORK_UNIT;.    
21120 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
21130 74 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a  ta = 1024*1024;.
21140 20 20 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20      p->zDataTbl 
21150 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72  = sqlite3Fts5Mpr
21160 69 6e 74 66 28 26 72 63 2c 20 22 25 73 5f 64 61  intf(&rc, "%s_da
21170 74 61 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  ta", pConfig->zN
21180 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ame);.    if( p-
21190 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 62 43 72  >zDataTbl && bCr
211a0 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63  eate ){.      rc
211b0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72   = sqlite3Fts5Cr
211c0 65 61 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20  eateTable(.     
211d0 20 20 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64       pConfig, "d
211e0 61 74 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45  ata", "id INTEGE
211f0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
21200 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70  lock BLOB", 0, p
21210 7a 45 72 72 0a 20 20 20 20 20 20 29 3b 0a 20 20  zErr.      );.  
21220 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21240 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
21250 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b  5IndexReinit(p);
21260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21270 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63   }..  assert( rc
21280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
21290 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
212a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
212b0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e     sqlite3Fts5In
212c0 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20  dexClose(p);.   
212d0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
212e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
212f0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64  .** Close a hand
21300 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  le opened by an 
21310 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
21320 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
21330 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Open()..*/.int s
21340 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
21350 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lose(Fts5Index *
21360 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
21370 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
21380 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
21390 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
213a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
213b0 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65  nalize(p->pWrite
213c0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
213d0 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c  finalize(p->pDel
213e0 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  eter);.    sqlit
213f0 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70  e3Fts5HashFree(p
21400 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71  ->pHash);.    sq
21410 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
21420 72 65 65 28 26 70 2d 3e 73 63 72 61 74 63 68 29  ree(&p->scratch)
21430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21440 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
21450 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
21460 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
21470 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21480 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
21490 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
214a0 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
214b0 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
214c0 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
214d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
214e0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
214f0 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
21500 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
21510 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
21520 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
21530 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
21540 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
21550 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
21560 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
21570 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f 6e 73 74  nToBytelen(const
21580 20 63 68 61 72 20 2a 70 2c 20 69 6e 74 20 6e 42   char *p, int nB
21590 79 74 65 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b  yte, int nChar){
215a0 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
215b0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
215c0 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b  ; i<nChar; i++){
215d0 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74  .    if( n>=nByt
215e0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
215f0 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74     /* Input cont
21600 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
21610 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20  nChar chars */. 
21620 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
21630 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78   char)p[n++]>=0x
21640 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
21650 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29  e( (p[n] & 0xc0)
21660 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20  ==0x80 ) n++;.  
21670 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21680 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e   n;.}../*.** pIn
21690 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
216a0 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20  ded string, nIn 
216b0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52  bytes in size. R
216c0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
216d0 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63   of.** unicode c
216e0 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
216f0 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
21700 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
21710 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  Charlen(const ch
21720 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *pIn, int nIn
21730 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d  ){.  int nChar =
21740 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a   0;            .
21750 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77    int i = 0;.  w
21760 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20  hile( i<nIn ){. 
21770 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
21780 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d   char)pIn[i++]>=
21790 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
217a0 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70  ile( i<nIn && (p
217b0 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30  In[i] & 0xc0)==0
217c0 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d  x80 ) i++;.    }
217d0 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20  .    nChar++;.  
217e0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72  }.  return nChar
217f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
21800 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61  t or remove data
21810 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
21820 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65  index. Each time
21830 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a   a document is .
21840 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72  ** added to or r
21850 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
21860 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63  index, this func
21870 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
21880 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69  ne or more.** ti
21890 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  mes..**.** For a
218a0 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73  n insert, it mus
218b0 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  t be called once
218c0 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
218d0 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d  in the new docum
218e0 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ent..** If the o
218f0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65  peration is a de
21900 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65  lete, it must be
21910 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73   called (at leas
21920 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  t) once for each
21930 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e  .** unique token
21940 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
21950 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61   with an iCol va
21960 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65  lue less than ze
21970 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20  ro. The iPos.** 
21980 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f  argument is igno
21990 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65  red for a delete
219a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
219b0 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a  Fts5IndexWrite(.
219c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219e0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
219f0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
21a00 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
21a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
21a20 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65  olumn token appe
21a30 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64  ars in (-ve -> d
21a40 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20  elete) */.  int 
21a50 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
21a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
21a70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
21a80 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a   within column *
21a90 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
21aa0 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
21ab0 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20  en  /* Token to 
21ac0 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f  add or remove to
21ad0 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a   or from index *
21ae0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b00 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
21b10 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
21b20 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  h indexes */.  i
21b30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21b40 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
21b50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
21b60 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
21b70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
21b80 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fig;..  assert( 
21b90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
21ba0 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   );..  /* Add th
21bb0 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 6d  e entry to the m
21bc0 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65 78 2e  ain terms index.
21bd0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
21be0 65 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28  e3Fts5HashWrite(
21bf0 0a 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68 2c  .      p->pHash,
21c00 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c   p->iWriteRowid,
21c10 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53   iCol, iPos, FTS
21c20 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c 20 70  5_MAIN_PREFIX, p
21c30 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20  Token, nToken.  
21c40 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
21c50 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  <pConfig->nPrefi
21c60 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  x && rc==SQLITE_
21c70 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  OK; i++){.    in
21c80 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e  t nByte = fts5In
21c90 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
21ca0 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  len(pToken, nTok
21cb0 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  en, pConfig->aPr
21cc0 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 69 66  efix[i]);.    if
21cd0 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
21ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
21cf0 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48  5HashWrite(p->pH
21d00 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
21d10 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20  p->iWriteRowid, 
21d20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35  iCol, iPos, FTS5
21d30 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31  _MAIN_PREFIX+i+1
21d40 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 79 74 65 0a  , pToken, nByte.
21d50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
21d60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
21d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
21d80 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f   new iterator to
21d90 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20   iterate though 
21da0 61 6c 6c 20 64 6f 63 69 64 73 20 74 68 61 74 20  all docids that 
21db0 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70  match the .** sp
21dc0 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72  ecified token or
21dd0 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a   token prefix..*
21de0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
21df0 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46  5IndexQuery(.  F
21e00 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e20 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71  * FTS index to q
21e30 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  uery */.  const 
21e40 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
21e50 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b  t nToken, /* Tok
21e60 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74  en (or prefix) t
21e70 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
21e80 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ea0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
21eb0 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c  INDEX_QUERY_X fl
21ec0 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  ags */.  Fts5Ind
21ed0 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20  exIter **ppIter 
21ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
21ef0 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62   New iterator ob
21f00 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ject */.){.  Fts
21f10 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
21f20 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
21f30 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
21f40 70 52 65 74 3b 0a 20 20 69 6e 74 20 69 49 64 78  pRet;.  int iIdx
21f50 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
21f60 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20  er buf = {0, 0, 
21f70 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0};..  /* If the
21f80 20 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67   QUERY_SCAN flag
21f90 20 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68   is set, all oth
21fa0 65 72 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  er flags must be
21fb0 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73   clear. */.  ass
21fc0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 46 54  ert( (flags & FT
21fd0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
21fe0 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  AN)==0.       ||
21ff0 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
22000 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d  DEX_QUERY_SCAN)=
22010 3d 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  =FTS5INDEX_QUERY
22020 5f 53 43 41 4e 0a 20 20 29 3b 0a 0a 20 20 69 66  _SCAN.  );..  if
22030 28 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  ( sqlite3Fts5Buf
22040 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
22050 26 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d  &buf, nToken+1)=
22060 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  =0 ){.    memcpy
22070 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b  (&buf.p[1], pTok
22080 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 7d  en, nToken);.  }
22090 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
220a0 44 45 42 55 47 0a 20 20 69 66 28 20 66 6c 61 67  DEBUG.  if( flag
220b0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
220c0 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 29  ERY_TEST_NOIDX )
220d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 6c  {.    assert( fl
220e0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
220f0 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b 0a  QUERY_PREFIX );.
22100 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f      iIdx = 1+pCo
22110 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20  nfig->nPrefix;. 
22120 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
22130 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
22140 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
22150 49 58 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43  IX ){.    int nC
22160 68 61 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43  har = fts5IndexC
22170 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e  harlen(pToken, n
22180 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 66 6f 72 28  Token);.    for(
22190 69 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43  iIdx=1; iIdx<=pC
221a0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
221b0 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iIdx++){.      i
221c0 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  f( pConfig->aPre
221d0 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68  fix[iIdx-1]==nCh
221e0 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ar ) break;.    
221f0 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20  }.  }..  pRet = 
22200 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29  (Fts5IndexIter*)
22210 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
22220 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 73 69  cZero(&p->rc, si
22230 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74  zeof(Fts5IndexIt
22240 65 72 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74  er));.  if( pRet
22250 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 70 49   ){.    pRet->pI
22260 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 69 66  ndex = p;.    if
22270 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ( iIdx<=pConfig-
22280 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20  >nPrefix ){.    
22290 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53    buf.p[0] = FTS
222a0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20  5_MAIN_PREFIX + 
222b0 69 49 64 78 3b 0a 20 20 20 20 20 20 70 52 65 74  iIdx;.      pRet
222c0 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73 35  ->pStruct = fts5
222d0 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
222e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
222f0 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ->pStruct ){.   
22300 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
22310 65 72 4e 65 77 28 0a 20 20 20 20 20 20 20 20 20  erNew(.         
22320 20 20 20 70 2c 20 70 52 65 74 2d 3e 70 53 74 72     p, pRet->pStr
22330 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c 20 62  uct, 1, flags, b
22340 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
22350 2d 31 2c 20 30 2c 20 26 70 52 65 74 2d 3e 70 4d  -1, 0, &pRet->pM
22360 75 6c 74 69 0a 20 20 20 20 20 20 20 20 29 3b 0a  ulti.        );.
22370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
22380 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65  e{.      int bDe
22390 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  sc = (flags & FT
223a0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
223b0 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75  SC)!=0;.      bu
223c0 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41  f.p[0] = FTS5_MA
223d0 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20  IN_PREFIX;.     
223e0 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
223f0 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62  Iter(p, bDesc, b
22400 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
22410 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRet);.    }.  }
22420 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  ..  if( p->rc ){
22430 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
22440 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74 29 3b  IterClose(pRet);
22450 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
22460 20 7d 0a 20 20 2a 70 70 49 74 65 72 20 3d 20 70   }.  *ppIter = p
22470 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  Ret;.  sqlite3Ft
22480 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
22490 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  f);.  return fts
224a0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
224b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
224c0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
224d0 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
224e0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
224f0 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a  t is at EOF..*/.
22500 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
22510 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
22520 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
22530 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
22540 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
22550 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
22560 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2d 3e   pIter->pMulti->
22570 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  bEof;.}../*.** M
22580 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
22590 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20  matching rowid. 
225a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
225b0 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
225c0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
225d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
225e0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
225f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
22600 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
22610 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
22620 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30  pIter->pMulti, 0
22630 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  , 0);.  return f
22640 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
22650 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
22660 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
22670 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
22680 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73  g term/rowid. Us
22690 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f  ed by the fts5vo
226a0 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69  cab module..*/.i
226b0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
226c0 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49  erNextScan(Fts5I
226d0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
226e0 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
226f0 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
22700 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  ;.  Fts5MultiSeg
22710 49 74 65 72 20 2a 70 4d 75 6c 74 69 20 3d 20 70  Iter *pMulti = p
22720 49 74 65 72 2d 3e 70 4d 75 6c 74 69 3b 0a 0a 20  Iter->pMulti;.. 
22730 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
22740 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49  pIndex->rc==SQLI
22750 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
22760 74 28 20 70 4d 75 6c 74 69 20 29 3b 0a 0a 20 20  t( pMulti );..  
22770 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
22780 74 28 70 2c 20 70 4d 75 6c 74 69 2c 20 30 2c 20  t(p, pMulti, 0, 
22790 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0);.  if( p->rc=
227a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
227b0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
227c0 53 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61  Seg = &pMulti->a
227d0 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69  Seg[ pMulti->aFi
227e0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
227f0 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
22800 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65  Leaf && pSeg->te
22810 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41  rm.p[0]!=FTS5_MA
22820 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  IN_PREFIX ){.   
22830 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
22840 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b  se(pSeg->pLeaf);
22850 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65  .      pSeg->pLe
22860 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d  af = 0;.      pM
22870 75 6c 74 69 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  ulti->bEof = 1;.
22880 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
22890 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
228a0 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
228b0 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
228c0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
228d0 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61  tching rowid tha
228e0 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61  t occurs at or a
228f0 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65  fter iMatch. The
22900 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  .** definition o
22910 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20  f "at or after" 
22920 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
22930 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  er this iterator
22940 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20   iterates.** in 
22950 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73  ascending or des
22960 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
22970 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  der..*/.int sqli
22980 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
22990 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  rom(Fts5IndexIte
229a0 72 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d  r *pIter, i64 iM
229b0 61 74 63 68 29 7b 0a 20 20 66 74 73 35 4d 75 6c  atch){.  fts5Mul
229c0 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  tiIterNextFrom(p
229d0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
229e0 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61  ter->pMulti, iMa
229f0 74 63 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  tch);.  return f
22a00 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
22a10 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
22a20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22a30 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64  he current rowid
22a40 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
22a50 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 46 74  Fts5IterRowid(Ft
22a60 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
22a70 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  er){.  return ft
22a80 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
22a90 28 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b  (pIter->pMulti);
22aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22ab0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
22ac0 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  m..*/.const char
22ad0 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65   *sqlite3Fts5Ite
22ae0 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49  rTerm(Fts5IndexI
22af0 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
22b00 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  *pn){.  int n;. 
22b10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
22b20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74   (const char*)ft
22b30 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
22b40 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 26  pIter->pMulti, &
22b50 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b  n);.  *pn = n-1;
22b60 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b  .  return &z[1];
22b70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
22b80 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
22b90 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
22ba0 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ng a copy of the
22bb0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
22bc0 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  or.** the curren
22bd0 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20  t entry. Output 
22be0 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20  variable *pn is 
22bf0 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
22c00 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  of the buffer .*
22c10 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72  * in bytes befor
22c20 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
22c30 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
22c40 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f  position list do
22c50 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
22c60 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 62 79  he "number of by
22c70 74 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66  tes" varint.** f
22c80 69 65 6c 64 20 74 68 61 74 20 73 74 61 72 74 73  ield that starts
22c90 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
22ca0 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69  st on disk..*/.i
22cb0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
22cc0 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
22cd0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
22ce0 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  r, .  const u8 *
22cf0 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
22d00 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
22d10 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f  inter to positio
22d20 6e 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20  n-list data */. 
22d30 20 69 6e 74 20 2a 70 6e 2c 20 20 20 20 20 20 20   int *pn,       
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
22d60 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69   position-list i
22d70 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 36 34  n bytes */.  i64
22d80 20 2a 70 69 52 6f 77 69 64 20 20 20 20 20 20 20   *piRowid       
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22da0 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 72 6f 77  OUT: Current row
22db0 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 4d  id */.){.  Fts5M
22dc0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75  ultiSegIter *pMu
22dd0 6c 74 69 20 3d 20 70 49 74 65 72 2d 3e 70 4d 75  lti = pIter->pMu
22de0 6c 74 69 3b 0a 20 20 46 74 73 35 53 65 67 49 74  lti;.  Fts5SegIt
22df0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c  er *pSeg = &pMul
22e00 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69  ti->aSeg[ pMulti
22e10 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
22e20 73 74 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  st ];.  assert( 
22e30 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
22e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
22e50 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 70 53 65    *piRowid = pSe
22e60 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 2a 70 6e  g->iRowid;.  *pn
22e70 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20   = pSeg->nPos;. 
22e80 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66   if( pSeg->iLeaf
22e90 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f  Offset+pSeg->nPo
22ea0 73 20 3c 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66  s <= pSeg->pLeaf
22eb0 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d  ->n ){.    *pp =
22ec0 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70   &pSeg->pLeaf->p
22ed0 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73  [pSeg->iLeafOffs
22ee0 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et];.  }else{.  
22ef0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
22f00 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
22f10 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74  );.    fts5Segit
22f20 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
22f30 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 26  >pIndex, pSeg, &
22f40 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
22f50 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72  .    *pp = pIter
22f60 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d  ->poslist.p;.  }
22f70 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
22f80 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d  dexReturn(pIter-
22f90 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  >pIndex);.}../*.
22fa0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22fb0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
22fc0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
22fd0 73 6c 69 73 74 28 29 2c 20 65 78 63 65 70 74 20  slist(), except 
22fe0 74 68 61 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65  that it.** copie
22ff0 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
23000 69 73 74 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ist into the buf
23010 66 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20  fer supplied as 
23020 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
23030 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
23040 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
23050 6f 73 6c 69 73 74 42 75 66 66 65 72 28 46 74 73  oslistBuffer(Fts
23060 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
23070 72 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  r, Fts5Buffer *p
23080 42 75 66 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  Buf){.  Fts5Inde
23090 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49  x *p = pIter->pI
230a0 6e 64 65 78 3b 0a 20 20 46 74 73 35 4d 75 6c 74  ndex;.  Fts5Mult
230b0 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69  iSegIter *pMulti
230c0 20 3d 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69   = pIter->pMulti
230d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
230e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
230f0 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
23100 6f 28 70 42 75 66 29 3b 0a 20 20 66 74 73 35 4d  o(pBuf);.  fts5M
23110 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
23120 70 2c 20 70 4d 75 6c 74 69 2c 20 30 2c 20 70 42  p, pMulti, 0, pB
23130 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  uf);.  return ft
23140 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
23150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
23160 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65   an iterator ope
23170 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
23180 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
23190 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
231a0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
231b0 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
231c0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
231d0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
231e0 65 72 20 29 7b 0a 20 20 20 20 66 74 73 35 4d 75  er ){.    fts5Mu
231f0 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65  ltiIterFree(pIte
23200 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
23210 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 66  ->pMulti);.    f
23220 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
23230 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75  ase(pIter->pStru
23240 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ct);.    fts5Buf
23250 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
23260 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74  poslist);.    ft
23270 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49  s5CloseReader(pI
23280 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20  ter->pIndex);.  
23290 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
232a0 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Iter);.  }.}../*
232b0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 22 61 76  .** Read the "av
232c0 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 69  erages" record i
232d0 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73  nto the buffer s
232e0 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73  upplied as the s
232f0 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65  econd .** argume
23300 6e 74 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  nt. Return SQLIT
23310 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
23320 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
23330 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
23340 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23350 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
23360 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65  3Fts5IndexGetAve
23370 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
23380 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  *p, Fts5Buffer *
23390 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
233a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
233b0 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52  K );.  fts5DataR
233c0 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 70  eadOrBuffer(p, p
233d0 42 75 66 2c 20 46 54 53 35 5f 41 56 45 52 41 47  Buf, FTS5_AVERAG
233e0 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20 72 65 74  ES_ROWID);.  ret
233f0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
23400 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
23410 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75 72   Replace the cur
23420 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22 20  rent "averages" 
23430 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65 20  record with the 
23440 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
23450 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c  buffer .** suppl
23460 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ied as the secon
23470 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  d argument..*/.i
23480 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
23490 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28 46  dexSetAverages(F
234a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e  ts5Index *p, con
234b0 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
234c0 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65  t nData){.  asse
234d0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
234e0 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61  E_OK );.  fts5Da
234f0 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
23500 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20  AVERAGES_ROWID, 
23510 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
23520 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
23530 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
23540 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23550 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
23560 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75  blocks this modu
23570 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d  le has read from
23580 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74   the %_data.** t
23590 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61  able since it wa
235a0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e  s created..*/.in
235b0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
235c0 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65  exReads(Fts5Inde
235d0 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  x *p){.  return 
235e0 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  p->nRead;.}../*.
235f0 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62 69  ** Set the 32-bi
23600 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73  t cookie value s
23610 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
23620 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74  rt of all struct
23630 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ure .** records 
23640 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
23650 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
23660 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
23670 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
23680 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
23690 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
236a0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
236b0 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
236c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
236d0 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69  ts5IndexSetCooki
236e0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
236f0 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74  int iNew){.  int
23700 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23720 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
23730 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
23740 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
23750 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f  Config;    /* Co
23760 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
23770 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b  ct */.  u8 aCook
23780 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20  ie[4];          
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
237a0 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74  Binary represent
237b0 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f  ation of iNew */
237c0 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
237d0 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61  *pBlob = 0;..  a
237e0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
237f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
23800 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61 43  ite3Fts5Put32(aC
23810 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20  ookie, iNew);.. 
23820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
23830 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d  ob_open(pConfig-
23840 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  >db, pConfig->zD
23850 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
23860 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20  .      "block", 
23870 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
23880 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a  OWID, 1, &pBlob.
23890 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
238a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
238b0 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
238c0 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69  te(pBlob, aCooki
238d0 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72 63  e, 4, 0);.    rc
238e0 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
238f0 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20  close(pBlob);.  
23900 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
23910 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
23920 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69  s5IndexLoadConfi
23930 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  g(Fts5Index *p){
23940 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
23950 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53 74   *pStruct;.  pSt
23960 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
23970 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66  tureRead(p);.  f
23980 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
23990 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
239a0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
239b0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f  Return(p);.}.../
239c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
239d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
239e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
239f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
23a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a50 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
23a60 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
23a70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
23a80 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  f the integrity-
23a90 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69  check .** functi
23aa0 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a  onality..*/../*.
23ab0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70  ** Return a simp
23ac0 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  le checksum valu
23ad0 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61  e based on the a
23ae0 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  rguments..*/.sta
23af0 74 69 63 20 75 36 34 20 66 74 73 35 49 6e 64 65  tic u64 fts5Inde
23b00 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69  xEntryCksum(.  i
23b10 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e  64 iRowid, .  in
23b20 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69  t iCol, .  int i
23b30 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64 78  Pos, .  int iIdx
23b40 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
23b50 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65  pTerm,.  int nTe
23b60 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rm.){.  int i;. 
23b70 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69   u64 ret = iRowi
23b80 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  d;.  ret += (ret
23b90 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72  <<3) + iCol;.  r
23ba0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
23bb0 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49 64   iPos;.  if( iId
23bc0 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28 72  x>=0 ) ret += (r
23bd0 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d  et<<3) + (FTS5_M
23be0 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64  AIN_PREFIX + iId
23bf0 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  x);.  for(i=0; i
23c00 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74  <nTerm; i++) ret
23c10 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70   += (ret<<3) + p
23c20 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72  Term[i];.  retur
23c30 6e 20 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  n ret;.}..static
23c40 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49   void fts5BtreeI
23c50 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
23c60 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
23c70 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
23c80 20 2a 70 53 65 67 2c 20 0a 20 20 46 74 73 35 42   *pSeg, .  Fts5B
23c90 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 0a  treeIter *pIter.
23ca0 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
23cb0 20 20 69 6e 74 20 69 3b 0a 20 20 6e 42 79 74 65    int i;.  nByte
23cc0 20 3d 20 73 69 7a 65 6f 66 28 70 49 74 65 72 2d   = sizeof(pIter-
23cd0 3e 61 4c 76 6c 5b 30 5d 29 20 2a 20 28 70 53 65  >aLvl[0]) * (pSe
23ce0 67 2d 3e 6e 48 65 69 67 68 74 2d 31 29 3b 0a 20  g->nHeight-1);. 
23cf0 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
23d00 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
23d10 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 29  );.  if( nByte )
23d20 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 4c 76  {.    pIter->aLv
23d30 6c 20 3d 20 28 46 74 73 35 42 74 72 65 65 49 74  l = (Fts5BtreeIt
23d40 65 72 4c 65 76 65 6c 2a 29 66 74 73 35 49 64 78  erLevel*)fts5Idx
23d50 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
23d60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72  ;.  }.  if( p->r
23d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23d80 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20      pIter->nLvl 
23d90 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d  = pSeg->nHeight-
23da0 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 20  1;.    pIter->p 
23db0 3d 20 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  = p;.    pIter->
23dc0 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 7d  pSeg = pSeg;.  }
23dd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
23de0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23df0 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
23e00 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  ++){.    i64 iRo
23e10 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
23e20 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
23e30 53 65 67 69 64 2c 20 69 2b 31 2c 20 31 29 3b 0a  Segid, i+1, 1);.
23e40 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44      Fts5Data *pD
23e50 61 74 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ata;.    pIter->
23e60 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 20 3d 20  aLvl[i].pData = 
23e70 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
23e80 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b  Read(p, iRowid);
23e90 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29  .    if( pData )
23ea0 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65  {.      fts5Node
23eb0 49 74 65 72 49 6e 69 74 28 70 44 61 74 61 2d 3e  IterInit(pData->
23ec0 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26 70 49  p, pData->n, &pI
23ed0 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73 29 3b  ter->aLvl[i].s);
23ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
23ef0 28 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d 3d 30  ( pIter->nLvl==0
23f00 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20   || p->rc ){.   
23f10 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
23f20 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
23f30 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  af = pSeg->pgnoL
23f40 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
23f50 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20    pIter->nEmpty 
23f60 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  = pIter->aLvl[0]
23f70 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 20 20 70  .s.nEmpty;.    p
23f80 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49  Iter->iLeaf = pI
23f90 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69  ter->aLvl[0].s.i
23fa0 43 68 69 6c 64 3b 0a 20 20 20 20 70 49 74 65 72  Child;.    pIter
23fb0 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72  ->bDlidx = pIter
23fc0 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69  ->aLvl[0].s.bDli
23fd0 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  dx;.  }.}..stati
23fe0 63 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65  c void fts5Btree
23ff0 49 74 65 72 4e 65 78 74 28 46 74 73 35 42 74 72  IterNext(Fts5Btr
24000 65 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  eeIter *pIter){.
24010 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d    Fts5Index *p =
24020 20 70 49 74 65 72 2d 3e 70 3b 0a 20 20 69 6e 74   pIter->p;.  int
24030 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
24040 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 26 26  Iter->bEof==0 &&
24050 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
24060 73 2e 61 44 61 74 61 20 29 3b 0a 20 20 66 6f 72  s.aData );.  for
24070 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
24080 4c 76 6c 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  Lvl && p->rc==SQ
24090 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
240a0 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72     Fts5BtreeIter
240b0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
240c0 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20  Iter->aLvl[i];. 
240d0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e     fts5NodeIterN
240e0 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 70 4c 76  ext(&p->rc, &pLv
240f0 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70  l->s);.    if( p
24100 4c 76 6c 2d 3e 73 2e 61 44 61 74 61 20 29 7b 0a  Lvl->s.aData ){.
24110 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
24120 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
24130 65 72 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c 2d 3e  er->term, pLvl->
24140 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c 2d 3e  s.term.n, pLvl->
24150 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20  s.term.p);.     
24160 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
24170 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64  e{.      fts5Nod
24180 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d  eIterFree(&pLvl-
24190 3e 73 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  >s);.      fts5D
241a0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
241b0 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70  >pData);.      p
241c0 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a  Lvl->pData = 0;.
241d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
241e0 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 7c  i==pIter->nLvl |
241f0 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70  | p->rc ){.    p
24200 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
24210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
24220 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d   iSegid = pIter-
24230 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
24240 20 20 20 66 6f 72 28 69 2d 2d 3b 20 69 3e 3d 30     for(i--; i>=0
24250 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 46 74  ; i--){.      Ft
24260 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
24270 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
24280 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  >aLvl[i];.      
24290 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
242a0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
242b0 69 53 65 67 69 64 2c 20 69 2b 31 2c 20 70 4c 76  iSegid, i+1, pLv
242c0 6c 5b 31 5d 2e 73 2e 69 43 68 69 6c 64 29 3b 0a  l[1].s.iChild);.
242d0 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
242e0 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
242f0 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  (p, iRowid);.   
24300 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61     if( pLvl->pDa
24310 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ta ){.        ft
24320 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
24330 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 2c 20 70  Lvl->pData->p, p
24340 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 6e 2c 20 26  Lvl->pData->n, &
24350 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20  pLvl->s);.      
24360 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
24370 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70  Iter->nEmpty = p
24380 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
24390 6e 45 6d 70 74 79 3b 0a 20 20 70 49 74 65 72 2d  nEmpty;.  pIter-
243a0 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
243b0 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64  >aLvl[0].s.bDlid
243c0 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  x;.  pIter->iLea
243d0 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
243e0 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 7d 0a 0a  0].s.iChild;.}..
243f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24400 42 74 72 65 65 49 74 65 72 46 72 65 65 28 46 74  BtreeIterFree(Ft
24410 73 35 42 74 72 65 65 49 74 65 72 20 2a 70 49 74  s5BtreeIter *pIt
24420 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
24430 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
24440 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nLvl; i++){.  
24450 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c    Fts5BtreeIterL
24460 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49  evel *pLvl = &pI
24470 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20  ter->aLvl[i];.  
24480 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72    fts5NodeIterFr
24490 65 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20  ee(&pLvl->s);.  
244a0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
244b0 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  a ){.      fts5D
244c0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
244d0 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70  >pData);.      p
244e0 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a  Lvl->pData = 0;.
244f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
24500 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e  te3_free(pIter->
24510 61 4c 76 6c 29 3b 0a 20 20 66 74 73 35 42 75 66  aLvl);.  fts5Buf
24520 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
24530 74 65 72 6d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  term);.}..#ifdef
24540 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
24550 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24560 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20 69  n is purely an i
24570 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74  nternal test. It
24580 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
24590 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20  bute to .** FTS 
245a0 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f  functionality, o
245b0 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67  r even the integ
245c0 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61  rity-check, in a
245d0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ny way..**.** In
245e0 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73 20  stead, it tests 
245f0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 65  that the same se
24600 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20  t of pgno/rowid 
24610 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
24620 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65 67   .** visited reg
24630 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
24640 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  er the doclist-i
24650 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64 20  ndex identified 
24660 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a  by parameters.**
24670 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73   iSegid/iLeaf is
24680 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72   iterated in for
24690 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73 65  wards or reverse
246a0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
246b0 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 44  c void fts5TestD
246c0 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20 46  lidxReverse(.  F
246d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
246e0 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20  int iSegid,     
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24700 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f  /* Segment id to
24710 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   load from */.  
24720 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20  int iLeaf       
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24740 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d  /* Load doclist-
24750 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c  index for this l
24760 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  eaf */.){.  Fts5
24770 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
24780 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b 73  x = 0;.  u64 cks
24790 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34 20  um1 = 13;.  u64 
247a0 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20  cksum2 = 13;..  
247b0 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
247c0 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
247d0 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  0, iSegid, iLeaf
247e0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
247f0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
24800 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  idx)==0;.      f
24810 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
24820 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b  (p, pDlidx).  ){
24830 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
24840 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  = fts5DlidxIterR
24850 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20  owid(pDlidx);.  
24860 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73    int pgno = fts
24870 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
24880 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65  Dlidx);.    asse
24890 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29  rt( pgno>iLeaf )
248a0 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20  ;.    cksum1 += 
248b0 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70  iRowid + ((i64)p
248c0 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20  gno<<32);.  }.  
248d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
248e0 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c  e(pDlidx);.  pDl
248f0 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  idx = 0;..  for(
24900 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
24910 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69  IterInit(p, 1, i
24920 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20  Segid, iLeaf);. 
24930 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
24940 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
24950 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ==0;.      fts5D
24960 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20  lidxIterPrev(p, 
24970 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20  pDlidx).  ){.   
24980 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
24990 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
249a0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e  (pDlidx);.    in
249b0 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  t pgno = fts5Dli
249c0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
249d0 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  x);.    assert( 
249e0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
249f0 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66 20  o(pDlidx)>iLeaf 
24a00 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d  );.    cksum2 +=
24a10 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
24a20 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
24a30 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
24a40 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
24a50 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28  lidx = 0;..  if(
24a60 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
24a70 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73  K && cksum1!=cks
24a80 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  um2 ) p->rc = FT
24a90 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73  S5_CORRUPT;.}..s
24aa0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51 75  tatic int fts5Qu
24ab0 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73 35  eryCksum(.  Fts5
24ac0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24ae0 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ts5 index object
24af0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a   */.  int iIdx,.
24b00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20 74    /* Index key t
24b30 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
24b40 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64 65   /* Size of inde
24b70 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20 2a  x key in bytes *
24b80 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
24bb0 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 20   Fts5IndexQuery 
24bc0 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d  */.  u64 *pCksum
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24be0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
24bf0 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a  Checksum value *
24c00 2f 0a 29 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d  /.){.  u64 cksum
24c10 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74   = *pCksum;.  Ft
24c20 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 64  s5IndexIter *pId
24c30 78 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  xIter = 0;.  int
24c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
24c50 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20 7a  5IndexQuery(p, z
24c60 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 26 70 49 64  , n, flags, &pId
24c70 78 49 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65  xIter);..  while
24c80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24c90 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
24ca0 35 49 74 65 72 45 6f 66 28 70 49 64 78 49 74 65  5IterEof(pIdxIte
24cb0 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20 64 75  r) ){.    i64 du
24cc0 6d 6d 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  mmy;.    const u
24cd0 38 20 2a 70 50 6f 73 3b 0a 20 20 20 20 69 6e 74  8 *pPos;.    int
24ce0 20 6e 50 6f 73 3b 0a 20 20 20 20 69 36 34 20 72   nPos;.    i64 r
24cf0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74  owid = sqlite3Ft
24d00 73 35 49 74 65 72 52 6f 77 69 64 28 70 49 64 78  s5IterRowid(pIdx
24d10 49 74 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  Iter);.    rc = 
24d20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
24d30 6f 73 6c 69 73 74 28 70 49 64 78 49 74 65 72 2c  oslist(pIdxIter,
24d40 20 26 70 50 6f 73 2c 20 26 6e 50 6f 73 2c 20 26   &pPos, &nPos, &
24d50 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
24d60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24d70 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69  .      Fts5Posli
24d80 73 74 52 65 61 64 65 72 20 73 52 65 61 64 65 72  stReader sReader
24d90 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69  ;.      for(sqli
24da0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
24db0 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 70 50 6f  aderInit(-1, pPo
24dc0 73 2c 20 6e 50 6f 73 2c 20 26 73 52 65 61 64 65  s, nPos, &sReade
24dd0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 52  r);.          sR
24de0 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20  eader.bEof==0;. 
24df0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24e00 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
24e10 72 4e 65 78 74 28 26 73 52 65 61 64 65 72 29 0a  rNext(&sReader).
24e20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
24e30 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
24e40 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61  _POS2COLUMN(sRea
24e50 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20  der.iPos);.     
24e60 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54     int iOff = FT
24e70 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52  S5_POS2OFFSET(sR
24e80 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20  eader.iPos);.   
24e90 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 66 74       cksum ^= ft
24ea0 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
24eb0 6d 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  m(rowid, iCol, i
24ec0 4f 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29  Off, iIdx, z, n)
24ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
24ef0 49 74 65 72 4e 65 78 74 28 70 49 64 78 49 74 65  IterNext(pIdxIte
24f00 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
24f10 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
24f20 6c 6f 73 65 28 70 49 64 78 49 74 65 72 29 3b 0a  lose(pIdxIter);.
24f30 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73  .  *pCksum = cks
24f40 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  um;.  return rc;
24f50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
24f60 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f  function is also
24f70 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72   purely an inter
24f80 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65  nal test. It doe
24f90 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
24fa0 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63   to .** FTS func
24fb0 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76  tionality, or ev
24fc0 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  en the integrity
24fd0 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77  -check, in any w
24fe0 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
24ff0 69 64 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  id fts5TestTerm(
25000 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
25010 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a   .  Fts5Buffer *
25020 70 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  pPrev,          
25030 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
25040 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
25050 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
25060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
25070 73 69 62 6c 79 20 6e 65 77 20 74 65 72 6d 20 74  sibly new term t
25080 6f 20 74 65 73 74 20 2a 2f 0a 20 20 75 36 34 20  o test */.  u64 
25090 65 78 70 65 63 74 65 64 2c 0a 20 20 75 36 34 20  expected,.  u64 
250a0 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74  *pCksum.){.  int
250b0 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69   rc = p->rc;.  i
250c0 66 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29  f( pPrev->n==0 )
250d0 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
250e0 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20  Set(&rc, pPrev, 
250f0 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29  n, (const u8*)z)
25100 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
25110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25120 20 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c   (pPrev->n!=n ||
25130 20 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70   memcmp(pPrev->p
25140 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20  , z, n)) ){.    
25150 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43  u64 cksum3 = *pC
25160 6b 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ksum;.    const 
25170 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63  char *zTerm = (c
25180 6f 6e 73 74 20 63 68 61 72 2a 29 26 70 50 72 65  onst char*)&pPre
25190 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72  v->p[1];  /* ter
251a0 6d 20 73 61 6e 73 20 70 72 65 66 69 78 2d 62 79  m sans prefix-by
251b0 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54  te */.    int nT
251c0 65 72 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31  erm = pPrev->n-1
251d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
251e0 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e  Size of zTerm in
251f0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e   bytes */.    in
25200 74 20 69 49 64 78 20 3d 20 28 70 50 72 65 76 2d  t iIdx = (pPrev-
25210 3e 70 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49  >p[0] - FTS5_MAI
25220 4e 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 69  N_PREFIX);.    i
25230 6e 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78  nt flags = (iIdx
25240 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e  ==0 ? 0 : FTS5IN
25250 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
25260 29 3b 0a 20 20 20 20 75 36 34 20 63 6b 31 20 3d  );.    u64 ck1 =
25270 20 30 3b 0a 20 20 20 20 75 36 34 20 63 6b 32 20   0;.    u64 ck2 
25280 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  = 0;..    /* Che
25290 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ck that the resu
252a0 6c 74 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72  lts returned for
252b0 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 71 75   ASC and DESC qu
252c0 65 72 69 65 73 20 61 72 65 0a 20 20 20 20 2a 2a  eries are.    **
252d0 20 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f   the same. If no
252e0 74 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f 72  t, call this cor
252f0 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
25300 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
25310 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54  ksum(p, iIdx, zT
25320 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
25330 73 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20 69 66  s, &ck1);.    if
25340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25350 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d  ){.      int f =
25360 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58   flags|FTS5INDEX
25370 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20  _QUERY_DESC;.   
25380 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
25390 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
253a0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
253b0 20 26 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20   &ck2);.    }.  
253c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
253d0 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
253e0 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
253f0 55 50 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  UPT;..    /* If 
25400 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69 78  this is a prefix
25410 20 71 75 65 72 79 2c 20 63 68 65 63 6b 20 74 68   query, check th
25420 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72  at the results r
25430 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 0a 20  eturned if the. 
25440 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
25450 69 73 20 64 69 73 61 62 6c 65 64 20 61 72 65 20  is disabled are 
25460 74 68 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74  the same. In bot
25470 68 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 6f  h ASC and DESC o
25480 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rder. */.    if(
25490 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
254a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
254b0 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
254c0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
254d0 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20  TEST_NOIDX;.    
254e0 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
254f0 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
25500 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54  ksum(p, iIdx, zT
25510 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26  erm, nTerm, f, &
25520 63 6b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck2);.      if( 
25530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25540 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
25550 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
25560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 49 64     }.    if( iId
25570 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
25580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
25590 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
255a0 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
255b0 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58  _NOIDX|FTS5INDEX
255c0 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20  _QUERY_DESC;.   
255d0 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20     ck2 = 0;.    
255e0 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79    rc = fts5Query
255f0 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a  Cksum(p, iIdx, z
25600 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20  Term, nTerm, f, 
25610 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 69 66 28  &ck2);.      if(
25620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25630 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
25640 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
25650 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d      }..    cksum
25660 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74  3 ^= ck1;.    ft
25670 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
25680 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73   pPrev, n, (cons
25690 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69  t u8*)z);..    i
256a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
256b0 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65   && cksum3!=expe
256c0 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  cted ){.      rc
256d0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
256e0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73  .    }.    *pCks
256f0 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d  um = cksum3;.  }
25700 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d  .  p->rc = rc;.}
25710 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  . .#else.# defin
25720 65 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52  e fts5TestDlidxR
25730 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20  everse(x,y,z).# 
25740 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54  define fts5TestT
25750 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29  erm(u,v,w,x,y,z)
25760 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
25770 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e  void fts5IndexIn
25780 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
25790 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ent(.  Fts5Index
257a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
257b0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
257c0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
257d0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
257e0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20  Segment *pSeg   
257f0 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
25800 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20   check internal 
25810 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29  consistency */.)
25820 7b 0a 20 20 46 74 73 35 42 74 72 65 65 49 74 65  {.  Fts5BtreeIte
25830 72 20 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  r iter;         
25840 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
25850 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 62  terate through b
25860 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
25870 2a 2f 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  */..  if( pSeg->
25880 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20 72  pgnoFirst==0 ) r
25890 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 74 65  eturn;..  /* Ite
258a0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
258b0 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
258c0 79 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73  y.  */.  for(fts
258d0 35 42 74 72 65 65 49 74 65 72 49 6e 69 74 28 70  5BtreeIterInit(p
258e0 2c 20 70 53 65 67 2c 20 26 69 74 65 72 29 3b 0a  , pSeg, &iter);.
258f0 20 20 20 20 20 20 70 2d 3e 72 63 3d 3d 53 51 4c        p->rc==SQL
25900 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 62  ITE_OK && iter.b
25910 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  Eof==0;.      ft
25920 73 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28  s5BtreeIterNext(
25930 26 69 74 65 72 29 0a 20 20 29 7b 0a 20 20 20 20  &iter).  ){.    
25940 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20  i64 iRow;       
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25960 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   Rowid for this 
25970 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35  leaf */.    Fts5
25980 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20  Data *pLeaf;    
25990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
259a0 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20  a for this leaf 
259b0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  */.    int iOff;
259c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259d0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
259e0 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  f first term on 
259f0 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20  leaf */.    int 
25a00 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
25a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
25a20 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
25a30 6f 75 67 68 20 65 6d 70 74 79 20 6c 65 61 76 65  ough empty leave
25a40 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  s */..    /* If 
25a50 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73  the leaf in ques
25a60 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
25a70 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72   been trimmed fr
25a80 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20  om the segment, 
25a90 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74  .    ** ignore t
25aa0 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79  his b-tree entry
25ab0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61  . Otherwise, loa
25ac0 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  d it into memory
25ad0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65  . */.    if( ite
25ae0 72 2e 69 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67  r.iLeaf<pSeg->pg
25af0 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e  noFirst ) contin
25b00 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46  ue;.    iRow = F
25b10 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
25b20 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  D(pSeg->iSegid, 
25b30 30 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a  0, iter.iLeaf);.
25b40 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
25b50 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
25b60 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
25b70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
25b80 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
25b90 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e  the leaf contain
25ba0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
25bb0 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74  erm, and that it
25bc0 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a   is equal.    **
25bd0 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68   to or larger th
25be0 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  an the split-key
25bf0 20 69 6e 20 69 74 65 72 2e 74 65 72 6d 2e 20 20   in iter.term.  
25c00 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20  Also check that 
25c10 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  if there.    ** 
25c20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69 64 20  is also a rowid 
25c30 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e 20 74  pointer within t
25c40 68 65 20 6c 65 61 66 20 70 61 67 65 20 68 65 61  he leaf page hea
25c50 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  der, it points t
25c60 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61 74  o a.    ** locat
25c70 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20 74  ion before the t
25c80 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 4f 66  erm.  */.    iOf
25c90 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
25ca0 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20  pLeaf->p[2]);.  
25cb0 20 20 69 66 28 20 69 4f 66 66 3d 3d 30 20 29 7b    if( iOff==0 ){
25cc0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
25cd0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
25ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
25cf0 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  t iRowidOff;.   
25d00 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20     int nTerm;   
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d20 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f  * Size of term o
25d30 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20  n leaf in bytes 
25d40 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  */.      int res
25d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25d60 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
25d70 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73  on of term and s
25d80 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20  plit-key */..   
25d90 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
25da0 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
25db0 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  ->p[0]);.      i
25dc0 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69 4f  f( iRowidOff>=iO
25dd0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ff ){.        p-
25de0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
25df0 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
25e00 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
25e10 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
25e20 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
25e30 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , nTerm);.      
25e40 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26    res = memcmp(&
25e50 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
25e60 69 74 65 72 2e 74 65 72 6d 2e 70 2c 20 4d 49 4e  iter.term.p, MIN
25e70 28 6e 54 65 72 6d 2c 20 69 74 65 72 2e 74 65 72  (nTerm, iter.ter
25e80 6d 2e 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 69  m.n));.        i
25e90 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
25ea0 3d 20 6e 54 65 72 6d 20 2d 20 69 74 65 72 2e 74  = nTerm - iter.t
25eb0 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 20 20 69  erm.n;.        i
25ec0 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63  f( res<0 ) p->rc
25ed0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
25ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25ef0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
25f00 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69  se(pLeaf);.    i
25f10 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b  f( p->rc ) break
25f20 3b 0a 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63  ;...    /* Now c
25f30 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 74  heck that the it
25f40 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73  er.nEmpty leaves
25f50 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
25f60 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 20 20  urrent leaf.    
25f70 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e 64  ** (a) exist and
25f80 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20   (b) contain no 
25f90 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 6f  terms. */.    fo
25fa0 72 28 69 3d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=1; p->rc==SQ
25fb0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 74  LITE_OK && i<=it
25fc0 65 72 2e 6e 45 6d 70 74 79 3b 20 69 2b 2b 29 7b  er.nEmpty; i++){
25fd0 0a 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66  .      pLeaf = f
25fe0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
25ff0 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20 69 66  Row+i);.      if
26000 28 20 70 4c 65 61 66 20 26 26 20 30 21 3d 66 74  ( pLeaf && 0!=ft
26010 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
26020 3e 70 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20  >p[2]) ){.      
26030 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
26040 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
26050 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
26060 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
26070 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
26080 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
26090 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74  t-index, check t
260a0 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67  hat it looks rig
260b0 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ht. */.    if( i
260c0 74 65 72 2e 62 44 6c 69 64 78 20 29 7b 0a 20 20  ter.bDlidx ){.  
260d0 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
260e0 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20  r *pDlidx = 0;  
260f0 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
26100 20 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74   through doclist
26110 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
26120 69 6e 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20  int iPrevLeaf = 
26130 69 74 65 72 2e 69 4c 65 61 66 3b 0a 20 20 20 20  iter.iLeaf;.    
26140 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70    int iSegid = p
26150 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
26160 20 20 20 69 6e 74 20 69 50 67 3b 0a 20 20 20 20     int iPg;.    
26170 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20    i64 iKey;..   
26180 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74     for(pDlidx=ft
26190 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
261a0 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 74  p, 0, iSegid, it
261b0 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 20  er.iLeaf);.     
261c0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
261d0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
261e0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ==0;.          f
261f0 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
26200 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20  (p, pDlidx).    
26210 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    ){..        /*
26220 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64   Check any rowid
26230 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74  -less pages that
26240 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
26250 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
26260 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
26270 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20  Pg=iPrevLeaf+1; 
26280 69 50 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65  iPg<fts5DlidxIte
26290 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69  rPgno(pDlidx); i
262a0 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pg++){.         
262b0 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
262c0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
262d0 64 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20  d, 0, iPg);.    
262e0 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
262f0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
26300 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
26310 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
26320 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
26330 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
26340 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20  [0])!=0 ) p->rc 
26350 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
26360 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
26370 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
26380 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  f);.          }.
26390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
263a0 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74    iPrevLeaf = ft
263b0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
263c0 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  pDlidx);..      
263d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
263e0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e  the leaf page in
263f0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
26400 74 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64  terator really d
26410 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  oes.        ** c
26420 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64  ontain the rowid
26430 20 73 75 67 67 65 73 74 65 64 20 62 79 20 74 68   suggested by th
26440 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  e same. */.     
26450 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53     iKey = FTS5_S
26460 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
26470 67 69 64 2c 20 30 2c 20 69 50 72 65 76 4c 65 61  gid, 0, iPrevLea
26480 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 61  f);.        pLea
26490 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
264a0 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20  (p, iKey);.     
264b0 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a     if( pLeaf ){.
264c0 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69 52            i64 iR
264d0 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
264e0 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20  int iRowidOff = 
264f0 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
26500 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20 20 20 20  f->p[0]);.      
26510 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
26520 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  f>=pLeaf->n ){. 
26530 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
26540 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
26550 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
26560 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
26570 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  s5GetVarint(&pLe
26580 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d  af->p[iRowidOff]
26590 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29  , (u64*)&iRowid)
265a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
265b0 28 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c  ( iRowid!=fts5Dl
265c0 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
265d0 69 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  idx) ) p->rc = F
265e0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
265f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26600 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
26610 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
26620 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
26630 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65      for(iPg=iPre
26640 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69  vLeaf+1; iPg<=(i
26650 74 65 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72  ter.iLeaf + iter
26660 2e 6e 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29  .nEmpty); iPg++)
26670 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  {.        iKey =
26680 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
26690 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20 69  WID(iSegid, 0, i
266a0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  Pg);.        pLe
266b0 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
266c0 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
266d0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
266e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
266f0 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
26700 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e  ->p[0])!=0 ) p->
26710 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
26720 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  T;.          fts
26730 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
26740 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  af);.        }. 
26750 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
26760 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
26770 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
26780 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
26790 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69  rse(p, iSegid, i
267a0 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
267b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65  }.  }..  /* Page
267c0 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74   iter.iLeaf must
267d0 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67 68   now be the righ
267e0 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20  tmost leaf-page 
267f0 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a  in the segment *
26800 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  /.  if( p->rc==S
26810 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72  QLITE_OK && iter
26820 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67  .iLeaf!=pSeg->pg
26830 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  noLast ){.    p-
26840 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
26850 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42  PT;.  }..  fts5B
26860 74 72 65 65 49 74 65 72 46 72 65 65 28 26 69 74  treeIterFree(&it
26870 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  er);.}.../*.** R
26880 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  un internal chec
26890 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ks to ensure tha
268a0 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  t the FTS index 
268b0 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  (a) is internall
268c0 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74  y .** consistent
268d0 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
268e0 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68  s entries for wh
268f0 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74  ich the XOR of t
26900 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  he checksums.** 
26910 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79  as calculated by
26920 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
26930 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e  ksum() is cksum.
26940 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
26950 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
26960 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72  any of the inter
26970 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c  nal checks fail,
26980 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68   or if the.** ch
26990 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20  ecksum does not 
269a0 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51  match. Return SQ
269b0 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63  LITE_OK if all c
269c0 68 65 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f  hecks pass witho
269d0 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20  ut.** error, or 
269e0 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74  some other SQLit
269f0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
26a00 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65  another error (e
26a10 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75  .g. OOM).** occu
26a20 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
26a30 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67  e3Fts5IndexInteg
26a40 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e  rityCheck(Fts5In
26a50 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75  dex *p, u64 cksu
26a60 6d 29 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32  m){.  u64 cksum2
26a70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26a80 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
26a90 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65  m based on conte
26aa0 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a  nts of indexes *
26ab0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70  /.  Fts5Buffer p
26ac0 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d  oslist = {0,0,0}
26ad0 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73  ;   /* Buffer us
26ae0 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73  ed to hold a pos
26af0 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 4d 75  list */.  Fts5Mu
26b00 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
26b10 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
26b20 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
26b30 6f 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65  ough entire inde
26b40 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
26b50 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20  ture *pStruct;  
26b60 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26b70 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20  structure */..  
26b80 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72 61  /* Used by extra
26b90 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20   internal tests 
26ba0 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42  only run if NDEB
26bb0 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
26bc0 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d  d */.  u64 cksum
26bd0 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  3 = 0;          
26be0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
26bf0 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
26c00 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
26c10 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
26c20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  term = {0,0,0}; 
26c30 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
26c40 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74  sed to hold most
26c50 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a   recent term */.
26c60 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65    .  /* Load the
26c70 20 46 54 53 20 69 6e 64 65 78 20 73 74 72 75 63   FTS index struc
26c80 74 75 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63  ture */.  pStruc
26c90 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
26ca0 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20  eRead(p);..  /* 
26cb0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  Check that the i
26cc0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66  nternal nodes of
26cd0 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61   each segment ma
26ce0 74 63 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a  tch the leaves *
26cf0 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
26d00 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c  ){.    int iLvl,
26d10 20 69 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69   iSeg;.    for(i
26d20 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
26d30 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
26d40 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  l++){.      for(
26d50 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
26d60 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
26d70 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
26d80 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74  {.        Fts5St
26d90 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
26da0 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d  pSeg = &pStruct-
26db0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
26dc0 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
26dd0 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67    fts5IndexInteg
26de0 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74  rityCheckSegment
26df0 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  (p, pSeg);.     
26e00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
26e10 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67  /* The cksum arg
26e20 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
26e30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
26e40 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63   a checksum calc
26e50 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65  ulated.  ** base
26e60 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65  d on all expecte
26e70 64 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  d entries in the
26e80 20 46 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c   FTS index (incl
26e90 75 64 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64  uding prefix ind
26ea0 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29  ex.  ** entries)
26eb0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65  . This block che
26ec0 63 6b 73 20 74 68 61 74 20 61 20 63 68 65 63 6b  cks that a check
26ed0 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62  sum calculated b
26ee0 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  ased on the.  **
26ef0 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73   actual contents
26f00 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 69 73   of FTS index is
26f10 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a   identical..  **
26f20 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f  .  ** Two versio
26f30 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63  ns of the same c
26f40 68 65 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63  hecksum are calc
26f50 75 6c 61 74 65 64 2e 20 54 68 65 20 66 69 72 73  ulated. The firs
26f60 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61  t (stack.  ** va
26f70 72 69 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62  riable cksum2) b
26f80 61 73 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20  ased on entries 
26f90 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
26fa0 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
26fb0 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f  ex.  ** while do
26fc0 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61  ing a linear sca
26fd0 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69  n of each indivi
26fe0 64 75 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75  dual index in tu
26ff0 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  rn. .  **.  ** A
27000 73 20 65 61 63 68 20 74 65 72 6d 20 76 69 73 69  s each term visi
27010 74 65 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61  ted by the linea
27020 72 20 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72  r scans, a separ
27030 61 74 65 20 71 75 65 72 79 20 66 6f 72 20 74 68  ate query for th
27040 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d  e.  ** same term
27050 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63   is performed. c
27060 6b 73 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61  ksum3 is calcula
27070 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
27080 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78   entries.  ** ex
27090 74 72 61 63 74 65 64 20 62 79 20 74 68 65 73 65  tracted by these
270a0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
270b0 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
270c0 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
270d0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  , 0, 0, 0, 0, -1
270e0 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  , 0, &pIter);.  
270f0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
27100 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d  rEof(p, pIter)==
27110 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  0;.      fts5Mul
27120 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
27130 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a  ter, 0, 0).  ){.
27140 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27160 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
27170 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
27180 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20 20  i64 iPos = 0;   
27190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
271a0 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f  osition read fro
271b0 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20  m poslist */.   
271c0 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20   int iOff = 0;  
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
271e0 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f  Offset within po
271f0 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36 34  slist */.    i64
27200 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
27210 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
27220 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  er);.    char *z
27230 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75   = (char*)fts5Mu
27240 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
27250 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  r, &n);..    /* 
27260 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65 77  If this is a new
27270 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72   term, query for
27280 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75   it. Update cksu
27290 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73 75  m3 with the resu
272a0 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  lts. */.    fts5
272b0 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72  TestTerm(p, &ter
272c0 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c  m, z, n, cksum2,
272d0 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20   &cksum3);..    
272e0 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20  poslist.n = 0;. 
272f0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
27300 50 6f 73 6c 69 73 74 28 70 2c 20 70 49 74 65 72  Poslist(p, pIter
27310 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a  , 0, &poslist);.
27320 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71      while( 0==sq
27330 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
27340 4e 65 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70  Next64(poslist.p
27350 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f  , poslist.n, &iO
27360 66 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20  ff, &iPos) ){.  
27370 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46      int iCol = F
27380 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69  TS5_POS2COLUMN(i
27390 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Pos);.      int 
273a0 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50  iTokOff = FTS5_P
273b0 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b  OS2OFFSET(iPos);
273c0 0a 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d  .      cksum2 ^=
273d0 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
273e0 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f  ksum(iRowid, iCo
273f0 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20  l, iTokOff, -1, 
27400 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  z, n);.    }.  }
27410 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  .  fts5TestTerm(
27420 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20  p, &term, 0, 0, 
27430 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29  cksum2, &cksum3)
27440 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ;..  fts5MultiIt
27450 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29  erFree(p, pIter)
27460 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
27470 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
27480 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  m!=cksum2 ) p->r
27490 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
274a0 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  ;..  fts5Structu
274b0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
274c0 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  t);.  fts5Buffer
274d0 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 66  Free(&term);.  f
274e0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
274f0 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  oslist);.  retur
27500 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
27510 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n(p);.}.../*.** 
27520 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20 72 65  Calculate and re
27530 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
27540 74 68 61 74 20 69 73 20 74 68 65 20 58 4f 52 20  that is the XOR 
27550 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
27560 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f  ry.** checksum o
27570 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 74 68  f all entries th
27580 61 74 20 77 6f 75 6c 64 20 62 65 20 67 65 6e 65  at would be gene
27590 72 61 74 65 64 20 62 79 20 74 68 65 20 74 6f 6b  rated by the tok
275a0 65 6e 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  en specified.** 
275b0 62 79 20 74 68 65 20 66 69 6e 61 6c 20 35 20 61  by the final 5 a
275c0 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34  rguments..*/.u64
275d0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
275e0 78 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 43 6f  xCksum(.  Fts5Co
275f0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20  nfig *pConfig,  
27600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
27610 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63  figuration objec
27620 74 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  t */.  i64 iRowi
27630 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
27640 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65         /* Docume
27650 6e 74 20 74 65 72 6d 20 61 70 70 65 61 72 73 20  nt term appears 
27660 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  in */.  int iCol
27670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27680 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
27690 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69  n term appears i
276a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c  n */.  int iPos,
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
276d0 6f 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73 20  on term appears 
276e0 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  in */.  const ch
276f0 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  ar *pTerm, int n
27700 54 65 72 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20  Term    /* Term 
27710 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20  at iPos */.){.  
27720 75 36 34 20 72 65 74 20 3d 20 30 3b 20 20 20 20  u64 ret = 0;    
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27740 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
27750 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20  */.  int iIdx;  
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72       /* For iter
27780 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e  ating through in
27790 64 65 78 65 73 20 2a 2f 0a 0a 20 20 72 65 74 20  dexes */..  ret 
277a0 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  = fts5IndexEntry
277b0 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43  Cksum(iRowid, iC
277c0 6f 6c 2c 20 69 50 6f 73 2c 20 30 2c 20 70 54 65  ol, iPos, 0, pTe
277d0 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 66  rm, nTerm);..  f
277e0 6f 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c  or(iIdx=0; iIdx<
277f0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
27800 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69  ; iIdx++){.    i
27810 6e 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49  nt nByte = fts5I
27820 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
27830 65 6c 65 6e 28 70 54 65 72 6d 2c 20 6e 54 65 72  elen(pTerm, nTer
27840 6d 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  m, pConfig->aPre
27850 66 69 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20  fix[iIdx]);.    
27860 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
27870 20 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e     ret ^= fts5In
27880 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52  dexEntryCksum(iR
27890 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
278a0 2c 20 69 49 64 78 2b 31 2c 20 70 54 65 72 6d 2c  , iIdx+1, pTerm,
278b0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
278c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74   }..  return ret
278d0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
278e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
278f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
27920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
27970 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69  low this point i
27980 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
27990 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35  tion of the fts5
279a0 5f 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72  _decode() scalar
279b0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  .** function onl
279c0 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  y..*/../*.** Dec
279d0 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61  ode a segment-da
279e0 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68  ta rowid from th
279f0 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20  e %_data table. 
27a00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
27a10 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65  .** the opposite
27a20 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53   of macro FTS5_S
27a30 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a  EGMENT_ROWID()..
27a40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
27a50 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a  ts5DecodeRowid(.
27a60 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20    /* Rowid from 
27a90 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27aa0 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20    int *piSegid, 
27ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ac0 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e    /* OUT: Segmen
27ad0 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  t id */.  int *p
27ae0 62 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20  bDlidx,         
27af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
27b00 3a 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a  : Dlidx flag */.
27b10 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c    int *piHeight,
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b30 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74    /* OUT: Height
27b40 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e   */.  int *piPgn
27b50 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
27b60 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61        /* OUT: Pa
27b70 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
27b80 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74    *piPgno = (int
27b90 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
27ba0 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
27bb0 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a  _PAGE_B) - 1));.
27bc0 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
27bd0 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a  5_DATA_PAGE_B;..
27be0 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69    *piHeight = (i
27bf0 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
27c00 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
27c10 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31  TA_HEIGHT_B) - 1
27c20 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
27c30 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
27c40 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78  T_B;..  *pbDlidx
27c50 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
27c60 26 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f  & 0x0001);.  iRo
27c70 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
27c80 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53  A_DLI_B;..  *piS
27c90 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f  egid = (int)(iRo
27ca0 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
27cb0 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  < FTS5_DATA_ID_B
27cc0 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74  ) - 1));.}..stat
27cd0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
27ce0 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c  gRowid(int *pRc,
27cf0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
27d00 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20  f, i64 iKey){.  
27d10 69 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65 69  int iSegid, iHei
27d20 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69  ght, iPgno, bDli
27d30 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  dx;       /* Row
27d40 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f  id compenents */
27d50 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
27d60 69 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64  id(iKey, &iSegid
27d70 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69  , &bDlidx, &iHei
27d80 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
27d90 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
27da0 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d  {.    if( iKey==
27db0 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
27dc0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  WID ){.      sql
27dd0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
27de0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
27df0 70 42 75 66 2c 20 22 28 61 76 65 72 61 67 65 73  pBuf, "(averages
27e00 29 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ) ");.    }else{
27e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
27e20 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
27e30 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
27e40 22 28 73 74 72 75 63 74 75 72 65 29 22 29 3b 0a  "(structure)");.
27e50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65      }.  }.  else
27e60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
27e70 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
27e80 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
27e90 28 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64  (%ssegid=%d h=%d
27ea0 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20 20   pgno=%d)",.    
27eb0 20 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c      bDlidx ? "dl
27ec0 69 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67  idx " : "", iSeg
27ed0 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67  id, iHeight, iPg
27ee0 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  no.    );.  }.}.
27ef0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
27f00 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
27f10 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
27f40 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
27f50 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
27f60 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
27f70 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c  *p.){.  int iLvl
27f80 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  , iSeg;         
27f90 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
27fa0 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
27fb0 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a  s, segments */..
27fc0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
27fd0 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  vl<p->nLevel; iL
27fe0 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53  vl++){.    Fts5S
27ff0 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
28000 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c  Lvl = &p->aLevel
28010 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69  [iLvl];.    sqli
28020 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
28030 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
28040 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20  Buf, .        " 
28050 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25  {lvl=%d nMerge=%
28060 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e  d", iLvl, pLvl->
28070 6e 4d 65 72 67 65 0a 20 20 20 20 29 3b 0a 20 20  nMerge.    );.  
28080 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
28090 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
280a0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Seg++){.      Ft
280b0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
280c0 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
280d0 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
280e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
280f0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
28100 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20  f(pRc, pBuf, .  
28110 20 20 20 20 20 20 20 20 22 20 7b 69 64 3d 25 64          " {id=%d
28120 20 68 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e   h=%d leaves=%d.
28130 2e 25 64 7d 22 2c 20 70 53 65 67 2d 3e 69 53 65  .%d}", pSeg->iSe
28140 67 69 64 2c 20 70 53 65 67 2d 3e 6e 48 65 69 67  gid, pSeg->nHeig
28150 68 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  ht, .          p
28160 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20  Seg->pgnoFirst, 
28170 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20  pSeg->pgnoLast. 
28180 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
28190 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
281a0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
281b0 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b  pRc, pBuf, "}");
281c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
281d0 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
281e0 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
281f0 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
28200 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
28210 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
28220 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20  in a serialized 
28230 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
28240 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ject. This.** fu
28250 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
28260 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
28270 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
28280 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  f the same objec
28290 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66  t.** to the buff
282a0 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
282b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
282c0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
282d0 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75  d fts5DecodeStru
282e0 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
282f0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
28300 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
28310 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
28320 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
28330 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
28340 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
28350 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ob.){.  int rc; 
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28370 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28380 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
28390 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30  Structure *p = 0
283a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
283b0 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65  ecoded structure
283c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63   object */..  rc
283d0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
283e0 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42  Decode(pBlob, nB
283f0 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69  lob, 0, &p);.  i
28400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28410 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
28420 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
28430 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53   }..  fts5DebugS
28440 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42  tructure(pRc, pB
28450 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74  uf, p);.  fts5St
28460 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
28470 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  );.}../*.** Buff
28480 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75  er (a/n) is assu
28490 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
284a0 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69   list of seriali
284b0 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61  zed varints. Rea
284c0 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74  d.** each varint
284d0 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20   and append its 
284e0 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
284f0 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20  ation to buffer 
28500 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  pBuf. Return.** 
28510 61 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65  after either the
28520 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73   input buffer is
28530 20 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20   exhausted or a 
28540 30 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e  0 value is read.
28550 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
28560 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
28570 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
28580 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
28590 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
285a0 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
285b0 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a  odePoslist(int *
285c0 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
285d0 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
285e0 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *a, int n){.  in
285f0 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68  t iOff = 0;.  wh
28600 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
28610 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
28620 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
28630 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
28640 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  ], iVal);.    sq
28650 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
28660 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
28670 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56   pBuf, " %d", iV
28680 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  al);.  }.  retur
28690 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
286a0 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75   The start of bu
286b0 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61  ffer (a/n) conta
286c0 69 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66  ins the start of
286d0 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20   a doclist. The 
286e0 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f  doclist.** may o
286f0 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68  r may not finish
28700 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
28710 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
28720 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74  n appends a text
28730 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69  .** representati
28740 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f  on of the part o
28750 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68  f the doclist th
28760 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f  at is present to
28770 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e   buffer.** pBuf.
28780 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75   .**.** The retu
28790 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
287a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
287b0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
287c0 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73  put buffer..*/.s
287d0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65  tatic int fts5De
287e0 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20  codeDoclist(int 
287f0 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
28800 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38   *pBuf, const u8
28810 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *a, int n){.  i
28820 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74  64 iDocid;.  int
28830 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 4f   iOff = 0;..  iO
28840 66 66 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  ff = sqlite3Fts5
28850 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
28860 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69  f], (u64*)&iDoci
28870 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  d);.  sqlite3Fts
28880 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
28890 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
288a0 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44   rowid=%lld", iD
288b0 6f 63 69 64 29 3b 0a 20 20 77 68 69 6c 65 28 20  ocid);.  while( 
288c0 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e  iOff<n ){.    in
288d0 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20  t nPos;.    int 
288e0 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69 4f 66 66  bDummy;.    iOff
288f0 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
28900 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c  stSize(&a[iOff],
28910 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
28920 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
28930 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
28940 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f  pRc, pBuf, &a[iO
28950 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c  ff], MIN(n-iOff,
28960 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66 28   nPos));.    if(
28970 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
28980 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   i64 iDelta;.   
28990 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
289a0 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
289b0 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
289c0 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
289d0 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20  if( iDelta==0 ) 
289e0 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20  return iOff;.   
289f0 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65     iDocid += iDe
28a00 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lta;.      sqlit
28a10 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
28a20 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
28a30 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64  uf, " rowid=%lld
28a40 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  ", iDocid);.    
28a50 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
28a60 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
28a70 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
28a80 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
28a90 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
28aa0 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e  n fts5_decode().
28ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28ac0 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
28ad0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
28ae0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
28af0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
28b00 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
28b10 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28b40 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
28b50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
28b60 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
28b70 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
28b80 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
28b90 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  {.  i64 iRowid; 
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
28bc0 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
28bd0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
28be0 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50  Segid,iHeight,iP
28bf0 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f  gno,bDlidx;/* Ro
28c00 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a  wid components *
28c10 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42  /.  const u8 *aB
28c20 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20  lob; int n;     
28c30 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f      /* Record to
28c40 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20   decode */.  u8 
28c50 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75  *a = 0;.  Fts5Bu
28c60 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20 20  ffer s;         
28c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69            /* Bui
28c80 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72 65  ld up text to re
28c90 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  turn here */.  i
28ca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28cb0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
28cc0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
28cd0 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20  .  int nSpace = 
28ce0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41  0;..  assert( nA
28cf0 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65  rg==2 );.  memse
28d00 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&s, 0, sizeof(
28d10 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
28d20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
28d30 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56  _value_int64(apV
28d40 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71  al[0]);.  n = sq
28d50 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
28d60 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61  s(apVal[1]);.  a
28d70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
28d80 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b  alue_blob(apVal[
28d90 31 5d 29 3b 0a 0a 20 20 6e 53 70 61 63 65 20 3d  1]);..  nSpace =
28da0 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a   n + FTS5_DATA_Z
28db0 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61  ERO_PADDING;.  a
28dc0 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46   = (u8*)sqlite3F
28dd0 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
28de0 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66  c, nSpace);.  if
28df0 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65  ( a==0 ) goto de
28e00 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63  code_out;.  memc
28e10 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b  py(a, aBlob, n);
28e20 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
28e30 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67  id(iRowid, &iSeg
28e40 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48  id, &bDlidx, &iH
28e50 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a  eight, &iPgno);.
28e60 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  .  fts5DebugRowi
28e70 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69  d(&rc, &s, iRowi
28e80 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78  d);.  if( bDlidx
28e90 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
28ea0 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35   dlidx;.    Fts5
28eb0 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20  DlidxLvl lvl;.. 
28ec0 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a     dlidx.p = a;.
28ed0 20 20 20 20 64 6c 69 64 78 2e 6e 20 3d 20 6e 3b      dlidx.n = n;
28ee0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76  ..    memset(&lv
28ef0 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
28f00 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
28f10 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c   lvl.pData = &dl
28f20 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65  idx;.    lvl.iLe
28f30 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a  afPgno = iPgno;.
28f40 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69  .    for(fts5Dli
28f50 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b  dxLvlNext(&lvl);
28f60 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74   lvl.bEof==0; ft
28f70 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
28f80 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c  lvl)){.      sql
28f90 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
28fa0 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20  pendPrintf(&rc, 
28fb0 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  &s, .          "
28fc0 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e   %d(%lld)", lvl.
28fd0 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69  iLeafPgno, lvl.i
28fe0 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20  Rowid.      );. 
28ff0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29000 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
29010 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54    if( iRowid==FT
29020 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
29030 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f  D ){.      /* to
29040 64 6f 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  do */.    }else{
29050 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
29060 65 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  eStructure(&rc, 
29070 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d  &s, a, n);.    }
29080 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 46  .  }else{..    F
29090 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a  ts5Buffer term;.
290a0 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d      memset(&term
290b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
290c0 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69  Buffer));..    i
290d0 66 28 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b  f( iHeight==0 ){
290e0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d  .      int iTerm
290f0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Off = 0;.      i
29100 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30  nt iRowidOff = 0
29110 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  ;.      int iOff
29120 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65  ;.      int nKee
29130 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  p = 0;..      if
29140 28 20 6e 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20  ( n>=4 ){.      
29150 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
29160 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b  s5GetU16(&a[0]);
29170 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66  .        iTermOf
29180 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
29190 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[2]);.      }el
291a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
291b0 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
291c0 28 26 72 63 2c 20 26 73 2c 20 38 2c 20 28 63 6f  (&rc, &s, 8, (co
291d0 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74  nst u8*)"corrupt
291e0 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ");.        goto
291f0 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
29200 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
29210 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20  iRowidOff ){.   
29220 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77       iOff = iRow
29230 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  idOff;.      }el
29240 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 20  se if( iTermOff 
29250 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
29260 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  = iTermOff;.    
29270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29280 20 69 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20 20   iOff = n;.     
29290 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44 65 63   }.      fts5Dec
292a0 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20  odePoslist(&rc, 
292b0 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d  &s, &a[4], iOff-
292c0 34 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  4);..      asser
292d0 74 28 20 69 52 6f 77 69 64 4f 66 66 3d 3d 30 20  t( iRowidOff==0 
292e0 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77 69 64 4f  || iOff==iRowidO
292f0 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ff );.      if( 
29300 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20  iRowidOff ){.   
29310 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
29320 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
29330 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
29340 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20  , n-iOff);.     
29350 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
29360 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30 20 7c 7c  ( iTermOff==0 ||
29370 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f 66 66 20   iOff==iTermOff 
29380 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
29390 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  iOff<n ){.      
293a0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
293b0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
293c0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
293d0 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
293e0 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e         term.n= n
293f0 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74  Keep;.        ft
29400 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
29410 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
29420 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  Byte, &a[iOff]);
29430 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
29440 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 20   nByte;..       
29450 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
29460 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a  erAppendPrintf(.
29470 20 20 20 20 20 20 20 20 20 20 20 20 26 72 63 2c              &rc,
29480 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73   &s, " term=%.*s
29490 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73  ", term.n, (cons
294a0 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20  t char*)term.p. 
294b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
294c0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65    iOff += fts5De
294d0 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c  codeDoclist(&rc,
294e0 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e   &s, &a[iOff], n
294f0 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20  -iOff);.        
29500 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
29510 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
29520 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
29530 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  &a[iOff], nKeep)
29540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29550 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75    }.      fts5Bu
29560 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
29570 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29580 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73    Fts5NodeIter s
29590 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73  s;.      for(fts
295a0 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 61 2c  5NodeIterInit(a,
295b0 20 6e 2c 20 26 73 73 29 3b 20 73 73 2e 61 44 61   n, &ss); ss.aDa
295c0 74 61 3b 20 66 74 73 35 4e 6f 64 65 49 74 65 72  ta; fts5NodeIter
295d0 4e 65 78 74 28 26 72 63 2c 20 26 73 73 29 29 7b  Next(&rc, &ss)){
295e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 73 2e  .        if( ss.
295f0 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  term.n==0 ){.   
29600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
29610 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
29620 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20  intf(&rc, &s, " 
29630 6c 65 66 74 3d 25 64 22 2c 20 73 73 2e 69 43 68  left=%d", ss.iCh
29640 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ild);.        }e
29650 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
29660 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
29670 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
29680 2c 26 73 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22  ,&s, " \"%.*s\""
29690 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
296a0 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74   ss.term.n, ss.t
296b0 65 72 6d 2e 70 0a 20 20 20 20 20 20 20 20 20 20  erm.p.          
296c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
296d0 20 20 20 20 20 69 66 28 20 73 73 2e 6e 45 6d 70       if( ss.nEmp
296e0 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
296f0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
29700 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
29710 63 2c 20 26 73 2c 20 22 20 65 6d 70 74 79 3d 25  c, &s, " empty=%
29720 64 25 73 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c  d%s", ss.nEmpty,
29730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
29740 73 2e 62 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a  s.bDlidx ? "*" :
29750 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b   "".          );
29760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29770 20 7d 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64   }.      fts5Nod
29780 65 49 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a  eIterFree(&ss);.
29790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 64 65      }.  }.  . de
297a0 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  code_out:.  sqli
297b0 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69  te3_free(a);.  i
297c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
297d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
297e0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
297f0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
29800 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f  .p, s.n, SQLITE_
29810 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
29820 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
29830 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
29840 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
29850 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
29860 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(&s);.}../*.**
29870 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
29880 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69  ion of user-defi
29890 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
298a0 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29  ion fts5_rowid()
298b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
298c0 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
298d0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
298e0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
298f0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
29900 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
29910 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
29920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29930 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29940 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
29950 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
29960 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
29970 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
29980 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
29990 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
299a0 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67  zArg;.  if( nArg
299b0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
299c0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
299d0 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65  pCtx, "should be
299e0 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62  : fts5_rowid(sub
299f0 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31  ject, ....)", -1
29a00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29a10 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  zArg = (const ch
29a20 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
29a30 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
29a40 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
29a50 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
29a60 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b  g, "segment") ){
29a70 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
29a80 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67  d;.      int seg
29a90 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f  id, height, pgno
29aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
29ab0 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=4 ){.        s
29ac0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
29ad0 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
29ae0 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62         "should b
29af0 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73  e: fts5_rowid('s
29b00 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c 20  egment', segid, 
29b10 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 29 22 2c  height, pgno))",
29b20 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   -1.        );. 
29b30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29b40 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69      segid = sqli
29b50 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
29b60 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Val[1]);.       
29b70 20 68 65 69 67 68 74 20 3d 20 73 71 6c 69 74 65   height = sqlite
29b80 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
29b90 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  l[2]);.        p
29ba0 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gno = sqlite3_va
29bb0 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 33 5d  lue_int(apVal[3]
29bc0 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69  );.        iRowi
29bd0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
29be0 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20 68 65  _ROWID(segid, he
29bf0 69 67 68 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ight, pgno);.   
29c00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
29c10 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
29c20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d  iRowid);.      }
29c30 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20  .    }else {.   
29c40 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
29c50 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20  t_error(pCtx, . 
29c60 20 20 20 20 20 20 20 22 66 69 72 73 74 20 61 72         "first ar
29c70 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69 64 28  g to fts5_rowid(
29c80 29 20 6d 75 73 74 20 62 65 20 27 73 65 67 6d 65  ) must be 'segme
29c90 6e 74 27 20 22 0a 20 20 20 20 20 20 20 20 22 6f  nt' ".        "o
29ca0 72 20 27 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65  r 'start-of-inde
29cb0 78 27 22 0a 20 20 20 20 20 20 20 20 2c 20 2d 31  x'".        , -1
29cc0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
29cd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
29ce0 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  s is called as p
29cf0 61 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69  art of registeri
29d00 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75  ng the FTS5 modu
29d10 6c 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65  le with database
29d20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  .** connection d
29d30 62 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20  b. It registers 
29d40 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66  several user-def
29d50 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
29d60 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20  tions useful.** 
29d70 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a  with FTS5..**.**
29d80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
29d90 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29da0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
29db0 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20  or occurs, some 
29dc0 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20  other.** SQLite 
29dd0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29de0 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
29df0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
29e00 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69  s5IndexInit(sqli
29e10 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
29e20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
29e30 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
29e40 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65      db, "fts5_de
29e50 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45  code", 2, SQLITE
29e60 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65  _UTF8, 0, fts5De
29e70 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  codeFunction, 0,
29e80 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63   0.  );.  if( rc
29e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29ea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
29eb0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
29ec0 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74  .        db, "ft
29ed0 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53  s5_rowid", -1, S
29ee0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
29ef0 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e  ts5RowidFunction
29f00 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
29f10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29f20 0a 0a                                            ..